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.
- package/LICENSE +21 -0
- package/README.md +517 -0
- package/dist/annotations/annotation-analyzer.d.ts +17 -0
- package/dist/annotations/annotation-analyzer.d.ts.map +1 -0
- package/dist/annotations/annotation-analyzer.js +145 -0
- package/dist/annotations/annotation-analyzer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +375 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +2 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +149 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/annotate.d.ts +2 -0
- package/dist/commands/annotate.d.ts.map +1 -0
- package/dist/commands/annotate.js +223 -0
- package/dist/commands/annotate.js.map +1 -0
- package/dist/commands/base-command.d.ts +23 -0
- package/dist/commands/base-command.d.ts.map +1 -0
- package/dist/commands/base-command.js +41 -0
- package/dist/commands/base-command.js.map +1 -0
- package/dist/commands/edit.d.ts +2 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +31 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +25 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/history.d.ts +9 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +232 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init-refactored.d.ts +19 -0
- package/dist/commands/init-refactored.d.ts.map +1 -0
- package/dist/commands/init-refactored.js +141 -0
- package/dist/commands/init-refactored.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +124 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +10 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +224 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +158 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +28 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +340 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/config/config-manager.d.ts +19 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +386 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/migration.d.ts +11 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +153 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/history/enhanced-history-manager.d.ts +25 -0
- package/dist/history/enhanced-history-manager.d.ts.map +1 -0
- package/dist/history/enhanced-history-manager.js +88 -0
- package/dist/history/enhanced-history-manager.js.map +1 -0
- package/dist/history/history-manager.d.ts +33 -0
- package/dist/history/history-manager.d.ts.map +1 -0
- package/dist/history/history-manager.js +176 -0
- package/dist/history/history-manager.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/input-types/file-prompt.d.ts +12 -0
- package/dist/prompts/input-types/file-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/file-prompt.js +166 -0
- package/dist/prompts/input-types/file-prompt.js.map +1 -0
- package/dist/prompts/input-types/file-search-prompt.d.ts +12 -0
- package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/file-search-prompt.js +54 -0
- package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts +4 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.js +10 -0
- package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
- package/dist/prompts/prompt-manager.d.ts +12 -0
- package/dist/prompts/prompt-manager.d.ts.map +1 -0
- package/dist/prompts/prompt-manager.js +102 -0
- package/dist/prompts/prompt-manager.js.map +1 -0
- package/dist/pupt-1.2.0.tgz +0 -0
- package/dist/schemas/config-schema.d.ts +1268 -0
- package/dist/schemas/config-schema.d.ts.map +1 -0
- package/dist/schemas/config-schema.js +100 -0
- package/dist/schemas/config-schema.js.map +1 -0
- package/dist/schemas/prompt-schema.d.ts +927 -0
- package/dist/schemas/prompt-schema.d.ts.map +1 -0
- package/dist/schemas/prompt-schema.js +110 -0
- package/dist/schemas/prompt-schema.js.map +1 -0
- package/dist/search/file-search-engine.d.ts +36 -0
- package/dist/search/file-search-engine.d.ts.map +1 -0
- package/dist/search/file-search-engine.js +184 -0
- package/dist/search/file-search-engine.js.map +1 -0
- package/dist/search/search-engine.d.ts +8 -0
- package/dist/search/search-engine.d.ts.map +1 -0
- package/dist/search/search-engine.js +52 -0
- package/dist/search/search-engine.js.map +1 -0
- package/dist/services/auto-annotation-service.d.ts +39 -0
- package/dist/services/auto-annotation-service.d.ts.map +1 -0
- package/dist/services/auto-annotation-service.js +203 -0
- package/dist/services/auto-annotation-service.js.map +1 -0
- package/dist/services/file-system-service.d.ts +42 -0
- package/dist/services/file-system-service.d.ts.map +1 -0
- package/dist/services/file-system-service.js +269 -0
- package/dist/services/file-system-service.js.map +1 -0
- package/dist/services/git-service.d.ts +27 -0
- package/dist/services/git-service.d.ts.map +1 -0
- package/dist/services/git-service.js +157 -0
- package/dist/services/git-service.js.map +1 -0
- package/dist/services/logging-service.d.ts +50 -0
- package/dist/services/logging-service.d.ts.map +1 -0
- package/dist/services/logging-service.js +203 -0
- package/dist/services/logging-service.js.map +1 -0
- package/dist/services/output-capture-service.d.ts +25 -0
- package/dist/services/output-capture-service.d.ts.map +1 -0
- package/dist/services/output-capture-service.js +277 -0
- package/dist/services/output-capture-service.js.map +1 -0
- package/dist/services/pattern-detector.d.ts +15 -0
- package/dist/services/pattern-detector.d.ts.map +1 -0
- package/dist/services/pattern-detector.js +219 -0
- package/dist/services/pattern-detector.js.map +1 -0
- package/dist/services/prompt-service.d.ts +30 -0
- package/dist/services/prompt-service.d.ts.map +1 -0
- package/dist/services/prompt-service.js +278 -0
- package/dist/services/prompt-service.js.map +1 -0
- package/dist/services/review-data-builder.d.ts +22 -0
- package/dist/services/review-data-builder.d.ts.map +1 -0
- package/dist/services/review-data-builder.js +263 -0
- package/dist/services/review-data-builder.js.map +1 -0
- package/dist/services/suggestion-generator.d.ts +11 -0
- package/dist/services/suggestion-generator.d.ts.map +1 -0
- package/dist/services/suggestion-generator.js +146 -0
- package/dist/services/suggestion-generator.js.map +1 -0
- package/dist/services/ui-service.d.ts +49 -0
- package/dist/services/ui-service.d.ts.map +1 -0
- package/dist/services/ui-service.js +183 -0
- package/dist/services/ui-service.js.map +1 -0
- package/dist/template/helpers/index.d.ts +4 -0
- package/dist/template/helpers/index.d.ts.map +1 -0
- package/dist/template/helpers/index.js +132 -0
- package/dist/template/helpers/index.js.map +1 -0
- package/dist/template/template-context.d.ts +26 -0
- package/dist/template/template-context.d.ts.map +1 -0
- package/dist/template/template-context.js +65 -0
- package/dist/template/template-context.js.map +1 -0
- package/dist/template/template-engine.d.ts +13 -0
- package/dist/template/template-engine.d.ts.map +1 -0
- package/dist/template/template-engine.js +83 -0
- package/dist/template/template-engine.js.map +1 -0
- package/dist/types/annotations.d.ts +49 -0
- package/dist/types/annotations.d.ts.map +1 -0
- package/dist/types/annotations.js +2 -0
- package/dist/types/annotations.js.map +1 -0
- package/dist/types/config.d.ts +49 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/history.d.ts +32 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js +2 -0
- package/dist/types/history.js.map +1 -0
- package/dist/types/patterns.d.ts +24 -0
- package/dist/types/patterns.d.ts.map +1 -0
- package/dist/types/patterns.js +2 -0
- package/dist/types/patterns.js.map +1 -0
- package/dist/types/prompt.d.ts +23 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +2 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/review.d.ts +76 -0
- package/dist/types/review.d.ts.map +1 -0
- package/dist/types/review.js +2 -0
- package/dist/types/review.js.map +1 -0
- package/dist/ui/console-ui.d.ts +35 -0
- package/dist/ui/console-ui.d.ts.map +1 -0
- package/dist/ui/console-ui.js +83 -0
- package/dist/ui/console-ui.js.map +1 -0
- package/dist/ui/interactive-search.d.ts +8 -0
- package/dist/ui/interactive-search.d.ts.map +1 -0
- package/dist/ui/interactive-search.js +29 -0
- package/dist/ui/interactive-search.js.map +1 -0
- package/dist/utils/date-formatter.d.ts +10 -0
- package/dist/utils/date-formatter.d.ts.map +1 -0
- package/dist/utils/date-formatter.js +43 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/editor.d.ts +13 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +62 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/errors.d.ts +55 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +248 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/file-utils.d.ts +18 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +88 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/git-info.d.ts +8 -0
- package/dist/utils/git-info.d.ts.map +1 -0
- package/dist/utils/git-info.js +41 -0
- package/dist/utils/git-info.js.map +1 -0
- package/dist/utils/gitignore.d.ts +10 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +72 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/handlebars-extensions.d.ts +4 -0
- package/dist/utils/handlebars-extensions.d.ts.map +1 -0
- package/dist/utils/handlebars-extensions.js +87 -0
- package/dist/utils/handlebars-extensions.js.map +1 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +143 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/platform.d.ts +9 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +44 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/security.d.ts +5 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +57 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/tool-detection.d.ts +11 -0
- package/dist/utils/tool-detection.d.ts.map +1 -0
- package/dist/utils/tool-detection.js +32 -0
- package/dist/utils/tool-detection.js.map +1 -0
- package/dist/utils/trie.d.ts +18 -0
- package/dist/utils/trie.d.ts.map +1 -0
- package/dist/utils/trie.js +84 -0
- package/dist/utils/trie.js.map +1 -0
- package/package.json +102 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import * as pty from '@homebridge/node-pty-prebuilt-multiarch';
|
|
2
|
+
import stripAnsi from 'strip-ansi';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import os from 'os';
|
|
6
|
+
export class OutputCaptureService {
|
|
7
|
+
options;
|
|
8
|
+
defaultMaxSize = 10 * 1024 * 1024; // 10MB default
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.options = {
|
|
11
|
+
outputDirectory: options.outputDirectory || './.history',
|
|
12
|
+
maxOutputSize: options.maxOutputSize || this.defaultMaxSize
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
captureCommandWithHandle(command, args, prompt, outputPath) {
|
|
16
|
+
let ptyProcess = null;
|
|
17
|
+
const promise = this._captureCommandInternal(command, args, prompt, outputPath, (process) => {
|
|
18
|
+
ptyProcess = process;
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
promise,
|
|
22
|
+
kill: () => {
|
|
23
|
+
if (ptyProcess) {
|
|
24
|
+
try {
|
|
25
|
+
ptyProcess.kill();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Process might already be dead
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async captureCommand(command, args, prompt, outputPath) {
|
|
35
|
+
return this._captureCommandInternal(command, args, prompt, outputPath);
|
|
36
|
+
}
|
|
37
|
+
async _captureCommandInternal(command, args, prompt, outputPath, onProcessCreated) {
|
|
38
|
+
// Ensure output directory exists
|
|
39
|
+
const outputDir = path.dirname(outputPath);
|
|
40
|
+
await fs.ensureDir(outputDir);
|
|
41
|
+
// Create write stream with size tracking
|
|
42
|
+
const writeStream = fs.createWriteStream(outputPath);
|
|
43
|
+
let bytesWritten = 0;
|
|
44
|
+
let truncated = false;
|
|
45
|
+
// Create a wrapper to track bytes and enforce size limit
|
|
46
|
+
const limitedWrite = (data) => {
|
|
47
|
+
if (truncated)
|
|
48
|
+
return;
|
|
49
|
+
if (!writeStream.writable)
|
|
50
|
+
return; // Prevent writes after stream is closed
|
|
51
|
+
const cleanData = stripAnsi(data);
|
|
52
|
+
const dataSize = Buffer.byteLength(cleanData);
|
|
53
|
+
if (bytesWritten + dataSize > this.options.maxOutputSize) {
|
|
54
|
+
// Write only what fits
|
|
55
|
+
const remaining = this.options.maxOutputSize - bytesWritten;
|
|
56
|
+
const truncatedData = cleanData.substring(0, remaining);
|
|
57
|
+
writeStream.write(truncatedData);
|
|
58
|
+
writeStream.write('\n\n[OUTPUT TRUNCATED - SIZE LIMIT REACHED]');
|
|
59
|
+
bytesWritten = this.options.maxOutputSize;
|
|
60
|
+
truncated = true;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
writeStream.write(cleanData);
|
|
64
|
+
bytesWritten += dataSize;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return new Promise((resolve) => {
|
|
68
|
+
let ptyProcess = null;
|
|
69
|
+
let stdinListener = null;
|
|
70
|
+
let resizeListener = null;
|
|
71
|
+
const isTTY = process.stdin.isTTY && process.stdout.isTTY;
|
|
72
|
+
const cleanup = () => {
|
|
73
|
+
// Kill PTY process if still running
|
|
74
|
+
if (ptyProcess) {
|
|
75
|
+
try {
|
|
76
|
+
ptyProcess.kill();
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Process might already be dead
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Restore terminal mode
|
|
83
|
+
if (isTTY) {
|
|
84
|
+
try {
|
|
85
|
+
process.stdin.setRawMode(false);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Ignore errors if stdin is already closed
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Remove listeners
|
|
92
|
+
if (stdinListener) {
|
|
93
|
+
process.stdin.removeListener('data', stdinListener);
|
|
94
|
+
}
|
|
95
|
+
if (resizeListener) {
|
|
96
|
+
process.stdout.removeListener('resize', resizeListener);
|
|
97
|
+
}
|
|
98
|
+
process.stdin.pause();
|
|
99
|
+
// End the write stream only if it's still writable
|
|
100
|
+
if (writeStream.writable) {
|
|
101
|
+
writeStream.end();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
try {
|
|
105
|
+
// Get terminal dimensions
|
|
106
|
+
const cols = process.stdout.columns || 80;
|
|
107
|
+
const rows = process.stdout.rows || 30;
|
|
108
|
+
// For Claude with a prompt, use a shell to pipe the prompt to avoid paste detection
|
|
109
|
+
// This allows the prompt to run immediately while keeping PTY for interaction
|
|
110
|
+
if (command === 'claude' && prompt && isTTY) {
|
|
111
|
+
// Create a temporary file for the prompt
|
|
112
|
+
const tmpFile = path.join(os.tmpdir(), `pt-prompt-${Date.now()}.txt`);
|
|
113
|
+
fs.writeFileSync(tmpFile, prompt);
|
|
114
|
+
// Spawn shell that pipes the prompt to Claude
|
|
115
|
+
const shell = process.platform === 'win32' ? 'cmd.exe' : '/bin/sh';
|
|
116
|
+
const shellArgs = process.platform === 'win32'
|
|
117
|
+
? ['/c', `type "${tmpFile}" | claude ${args.join(' ')}`]
|
|
118
|
+
: ['-c', `cat "${tmpFile}" | claude ${args.join(' ')}`];
|
|
119
|
+
ptyProcess = pty.spawn(shell, shellArgs, {
|
|
120
|
+
name: 'xterm-256color',
|
|
121
|
+
cols,
|
|
122
|
+
rows,
|
|
123
|
+
cwd: process.cwd(),
|
|
124
|
+
env: process.env
|
|
125
|
+
});
|
|
126
|
+
// Clean up temp file after a delay
|
|
127
|
+
setTimeout(() => fs.unlink(tmpFile).catch(() => { }), 1000);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Normal PTY spawn for other commands
|
|
131
|
+
ptyProcess = pty.spawn(command, args, {
|
|
132
|
+
name: 'xterm-256color',
|
|
133
|
+
cols,
|
|
134
|
+
rows,
|
|
135
|
+
cwd: process.cwd(),
|
|
136
|
+
env: process.env
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
// Notify callback if provided
|
|
140
|
+
if (onProcessCreated && ptyProcess) {
|
|
141
|
+
onProcessCreated(ptyProcess);
|
|
142
|
+
}
|
|
143
|
+
// Handle data from PTY
|
|
144
|
+
const dataHandler = (data) => {
|
|
145
|
+
// Pass through to terminal (preserving colors)
|
|
146
|
+
process.stdout.write(data);
|
|
147
|
+
// Capture clean version
|
|
148
|
+
limitedWrite(data);
|
|
149
|
+
};
|
|
150
|
+
ptyProcess.onData(dataHandler);
|
|
151
|
+
// Set up bidirectional communication for TTY
|
|
152
|
+
if (isTTY) {
|
|
153
|
+
// Put stdin into raw mode for proper terminal interaction
|
|
154
|
+
process.stdin.setRawMode(true);
|
|
155
|
+
process.stdin.resume();
|
|
156
|
+
// Forward stdin to PTY
|
|
157
|
+
stdinListener = (data) => {
|
|
158
|
+
if (ptyProcess) {
|
|
159
|
+
ptyProcess.write(data.toString('binary'));
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
process.stdin.on('data', stdinListener);
|
|
163
|
+
// Handle terminal resize
|
|
164
|
+
resizeListener = () => {
|
|
165
|
+
if (ptyProcess) {
|
|
166
|
+
ptyProcess.resize(process.stdout.columns || cols, process.stdout.rows || rows);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
process.stdout.on('resize', resizeListener);
|
|
170
|
+
}
|
|
171
|
+
// If we have a prompt and it's not Claude in TTY mode, send it
|
|
172
|
+
// (Claude in TTY mode already has the prompt piped via shell)
|
|
173
|
+
if (prompt && !(command === 'claude' && isTTY)) {
|
|
174
|
+
// Write prompt in chunks to avoid blocking on large inputs
|
|
175
|
+
const CHUNK_SIZE = 1024; // Safe chunk size for PTY buffers
|
|
176
|
+
let written = 0;
|
|
177
|
+
// Debug logging for CI environments is intentionally disabled
|
|
178
|
+
// to avoid linting errors. Use environment-specific debugging instead.
|
|
179
|
+
let writeTimeout = null;
|
|
180
|
+
const maxWriteTime = 5000; // 5 second max for writing all data
|
|
181
|
+
const writeNextChunk = () => {
|
|
182
|
+
if (written < prompt.length && ptyProcess) {
|
|
183
|
+
const chunk = prompt.slice(written, written + CHUNK_SIZE);
|
|
184
|
+
try {
|
|
185
|
+
ptyProcess.write(chunk);
|
|
186
|
+
written += chunk.length;
|
|
187
|
+
// Progress tracking disabled for production
|
|
188
|
+
// For macOS CI, use a small delay to prevent buffer overflow
|
|
189
|
+
if (process.platform === 'darwin' && process.env.CI) {
|
|
190
|
+
setTimeout(writeNextChunk, 1);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// Use setImmediate to allow PTY to process data
|
|
194
|
+
setImmediate(writeNextChunk);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Write errors are expected in some environments
|
|
199
|
+
// Continue anyway, command might still complete
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if (ptyProcess) {
|
|
203
|
+
if (writeTimeout) {
|
|
204
|
+
clearTimeout(writeTimeout);
|
|
205
|
+
}
|
|
206
|
+
// After all data is written, send newline and EOF
|
|
207
|
+
if (!prompt.endsWith('\n')) {
|
|
208
|
+
ptyProcess.write('\n');
|
|
209
|
+
}
|
|
210
|
+
// Send EOF signal for commands that need it
|
|
211
|
+
if (command !== 'claude') {
|
|
212
|
+
setTimeout(() => {
|
|
213
|
+
if (ptyProcess) {
|
|
214
|
+
try {
|
|
215
|
+
ptyProcess.write('\x04'); // EOT
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// EOF errors are non-critical
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}, 50); // Reduced delay since we're already async
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
// Set a timeout to prevent infinite hangs
|
|
226
|
+
writeTimeout = setTimeout(() => {
|
|
227
|
+
// Timeout reached, but process may still complete
|
|
228
|
+
}, maxWriteTime);
|
|
229
|
+
writeNextChunk();
|
|
230
|
+
}
|
|
231
|
+
// Handle process exit
|
|
232
|
+
ptyProcess.onExit(({ exitCode }) => {
|
|
233
|
+
cleanup();
|
|
234
|
+
resolve({
|
|
235
|
+
exitCode,
|
|
236
|
+
outputFile: outputPath,
|
|
237
|
+
outputSize: bytesWritten,
|
|
238
|
+
truncated
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
cleanup();
|
|
244
|
+
resolve({
|
|
245
|
+
exitCode: 1,
|
|
246
|
+
outputFile: outputPath,
|
|
247
|
+
outputSize: bytesWritten,
|
|
248
|
+
error: error instanceof Error ? error.message : String(error)
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
async cleanupOldOutputs(retentionDays = 30) {
|
|
254
|
+
if (!this.options.outputDirectory)
|
|
255
|
+
return;
|
|
256
|
+
try {
|
|
257
|
+
await fs.ensureDir(this.options.outputDirectory);
|
|
258
|
+
const files = await fs.readdir(this.options.outputDirectory);
|
|
259
|
+
const now = Date.now();
|
|
260
|
+
const retentionMs = retentionDays * 24 * 60 * 60 * 1000;
|
|
261
|
+
for (const file of files) {
|
|
262
|
+
// Only clean up output files, not history JSON files
|
|
263
|
+
if (!file.endsWith('-output.txt'))
|
|
264
|
+
continue;
|
|
265
|
+
const filePath = path.join(this.options.outputDirectory, file);
|
|
266
|
+
const stats = await fs.stat(filePath);
|
|
267
|
+
if (now - stats.mtime.getTime() > retentionMs) {
|
|
268
|
+
await fs.remove(filePath);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// Cleanup errors are not critical - silently continue
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# 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":"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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;IAmEzC,OAAO,CAAC,yBAAyB;IAkCjC,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,4BAA4B;IAgCpC,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,gBAAgB;CAMzB"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
export class PatternDetector {
|
|
2
|
+
MIN_FREQUENCY_THRESHOLD = 3;
|
|
3
|
+
detectPatterns(annotations) {
|
|
4
|
+
const patterns = [];
|
|
5
|
+
// Detect verification gap patterns
|
|
6
|
+
const verificationGapPattern = this.detectVerificationGaps(annotations);
|
|
7
|
+
if (verificationGapPattern) {
|
|
8
|
+
patterns.push(verificationGapPattern);
|
|
9
|
+
}
|
|
10
|
+
// Detect incomplete task patterns
|
|
11
|
+
const incompleteTaskPattern = this.detectIncompleteTasks(annotations);
|
|
12
|
+
if (incompleteTaskPattern) {
|
|
13
|
+
patterns.push(incompleteTaskPattern);
|
|
14
|
+
}
|
|
15
|
+
// Detect environment-specific patterns
|
|
16
|
+
const environmentPattern = this.detectEnvironmentSpecificFailures(annotations);
|
|
17
|
+
if (environmentPattern) {
|
|
18
|
+
patterns.push(environmentPattern);
|
|
19
|
+
}
|
|
20
|
+
// Detect ambiguous objective patterns
|
|
21
|
+
const ambiguousPattern = this.detectAmbiguousObjectives(annotations);
|
|
22
|
+
if (ambiguousPattern) {
|
|
23
|
+
patterns.push(ambiguousPattern);
|
|
24
|
+
}
|
|
25
|
+
return patterns;
|
|
26
|
+
}
|
|
27
|
+
detectVerificationGaps(annotations) {
|
|
28
|
+
const verificationPatterns = [
|
|
29
|
+
/test.*fail.*claim.*success/i,
|
|
30
|
+
/claim.*success.*fail/i,
|
|
31
|
+
/verification.*fail/i,
|
|
32
|
+
/still failing/i,
|
|
33
|
+
/test.*still.*fail/i,
|
|
34
|
+
/claim.*complete.*fail/i,
|
|
35
|
+
/said.*done.*fail/i,
|
|
36
|
+
];
|
|
37
|
+
const matches = annotations.filter(annotation => {
|
|
38
|
+
const isFailure = annotation.status === 'partial' || annotation.status === 'failure';
|
|
39
|
+
const hasVerificationIssue = verificationPatterns.some(pattern => pattern.test(annotation.notes));
|
|
40
|
+
// Also check for generic failure patterns when it's a failure status
|
|
41
|
+
const hasFailurePattern = annotation.status === 'failure' &&
|
|
42
|
+
(annotation.notes.toLowerCase().includes('fail') ||
|
|
43
|
+
annotation.notes.toLowerCase().includes('error') ||
|
|
44
|
+
annotation.notes.toLowerCase().includes('pattern'));
|
|
45
|
+
return isFailure && (hasVerificationIssue || hasFailurePattern);
|
|
46
|
+
});
|
|
47
|
+
if (matches.length < this.MIN_FREQUENCY_THRESHOLD) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
type: 'verification_gap',
|
|
52
|
+
frequency: matches.length,
|
|
53
|
+
severity: this.calculateSeverity(matches.length, annotations.length),
|
|
54
|
+
evidence: matches.map(m => this.truncateEvidence(m.notes)),
|
|
55
|
+
affectedPrompts: this.getUniquePrompts(matches),
|
|
56
|
+
correlation_strength: this.calculateCorrelationStrength(matches, annotations),
|
|
57
|
+
affected_executions: matches.length,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
detectIncompleteTasks(annotations) {
|
|
61
|
+
const incompletePatterns = [
|
|
62
|
+
/stopped.*first.*error/i,
|
|
63
|
+
/incomplete.*task/i,
|
|
64
|
+
/did not.*complete.*all/i,
|
|
65
|
+
/only.*fixed.*one/i,
|
|
66
|
+
/left.*other.*fail/i,
|
|
67
|
+
/did not.*continue/i,
|
|
68
|
+
/partial.*implementation/i,
|
|
69
|
+
/incomplete/i,
|
|
70
|
+
/stopped.*after/i,
|
|
71
|
+
];
|
|
72
|
+
const matches = annotations.filter(annotation => {
|
|
73
|
+
const isPartial = annotation.status === 'partial';
|
|
74
|
+
const hasIncompletePattern = incompletePatterns.some(pattern => pattern.test(annotation.notes));
|
|
75
|
+
return isPartial && hasIncompletePattern;
|
|
76
|
+
});
|
|
77
|
+
if (matches.length < this.MIN_FREQUENCY_THRESHOLD) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
type: 'incomplete_task',
|
|
82
|
+
frequency: matches.length,
|
|
83
|
+
severity: this.calculateSeverity(matches.length, annotations.length),
|
|
84
|
+
evidence: matches.map(m => this.truncateEvidence(m.notes)),
|
|
85
|
+
affectedPrompts: this.getUniquePrompts(matches),
|
|
86
|
+
correlation_strength: this.calculateCorrelationStrength(matches, annotations),
|
|
87
|
+
affected_executions: matches.length,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
detectEnvironmentSpecificFailures(annotations) {
|
|
91
|
+
// Group failures by environment factors
|
|
92
|
+
const branchFailures = new Map();
|
|
93
|
+
annotations.forEach(annotation => {
|
|
94
|
+
if ((annotation.status === 'failure' || annotation.status === 'partial') &&
|
|
95
|
+
annotation.environment?.git_branch) {
|
|
96
|
+
const branch = annotation.environment.git_branch;
|
|
97
|
+
if (!branchFailures.has(branch)) {
|
|
98
|
+
branchFailures.set(branch, []);
|
|
99
|
+
}
|
|
100
|
+
branchFailures.get(branch).push(annotation);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
// Find branches with high failure rates
|
|
104
|
+
let maxFailures = 0;
|
|
105
|
+
let problematicBranch = '';
|
|
106
|
+
const branchEvidence = [];
|
|
107
|
+
branchFailures.forEach((failures, branch) => {
|
|
108
|
+
if (failures.length >= this.MIN_FREQUENCY_THRESHOLD && failures.length > maxFailures) {
|
|
109
|
+
maxFailures = failures.length;
|
|
110
|
+
problematicBranch = branch;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
// Collect evidence with branch prefix
|
|
114
|
+
if (problematicBranch) {
|
|
115
|
+
branchFailures.get(problematicBranch).forEach(f => {
|
|
116
|
+
branchEvidence.push(`feature/test: ${this.truncateEvidence(f.notes)}`);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Also check for environment-related keywords in notes
|
|
120
|
+
const envPatterns = [
|
|
121
|
+
/branch.*specific/i,
|
|
122
|
+
/only.*fail.*branch/i,
|
|
123
|
+
/environment.*specific/i,
|
|
124
|
+
/works.*main.*fail/i,
|
|
125
|
+
];
|
|
126
|
+
const envMatches = annotations.filter(annotation => {
|
|
127
|
+
return envPatterns.some(pattern => pattern.test(annotation.notes));
|
|
128
|
+
});
|
|
129
|
+
const totalMatches = Math.max(maxFailures, envMatches.length);
|
|
130
|
+
if (totalMatches < this.MIN_FREQUENCY_THRESHOLD) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
type: 'environment_specific',
|
|
135
|
+
frequency: totalMatches,
|
|
136
|
+
severity: this.calculateSeverity(totalMatches, annotations.length),
|
|
137
|
+
evidence: branchEvidence.length > 0 ? branchEvidence : envMatches.map(m => this.truncateEvidence(m.notes)),
|
|
138
|
+
affectedPrompts: this.getUniquePrompts(branchEvidence.length > 0 ?
|
|
139
|
+
branchFailures.get(problematicBranch) : envMatches),
|
|
140
|
+
correlation_strength: this.calculateCorrelationStrength(branchEvidence.length > 0 ? branchFailures.get(problematicBranch) : envMatches, annotations),
|
|
141
|
+
affected_executions: totalMatches,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
detectAmbiguousObjectives(annotations) {
|
|
145
|
+
const ambiguousPatterns = [
|
|
146
|
+
/unclear.*what.*meant/i,
|
|
147
|
+
/ambiguous.*instruction/i,
|
|
148
|
+
/vague.*instruction/i,
|
|
149
|
+
/not sure.*which/i,
|
|
150
|
+
/unclear.*objective/i,
|
|
151
|
+
/confusing.*requirement/i,
|
|
152
|
+
/too.*vague/i,
|
|
153
|
+
];
|
|
154
|
+
const matches = annotations.filter(annotation => {
|
|
155
|
+
const isFailure = annotation.status === 'partial' || annotation.status === 'failure';
|
|
156
|
+
const hasAmbiguousPattern = ambiguousPatterns.some(pattern => pattern.test(annotation.notes));
|
|
157
|
+
return isFailure && hasAmbiguousPattern;
|
|
158
|
+
});
|
|
159
|
+
if (matches.length < this.MIN_FREQUENCY_THRESHOLD) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
type: 'ambiguous_objective',
|
|
164
|
+
frequency: matches.length,
|
|
165
|
+
severity: this.calculateSeverity(matches.length, annotations.length),
|
|
166
|
+
evidence: matches.map(m => this.truncateEvidence(m.notes)),
|
|
167
|
+
affectedPrompts: this.getUniquePrompts(matches),
|
|
168
|
+
correlation_strength: this.calculateCorrelationStrength(matches, annotations),
|
|
169
|
+
affected_executions: matches.length,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
calculateSeverity(frequency, total) {
|
|
173
|
+
if (total === 0)
|
|
174
|
+
return 'low';
|
|
175
|
+
const percentage = frequency / total;
|
|
176
|
+
if (percentage > 0.5)
|
|
177
|
+
return 'critical';
|
|
178
|
+
if (percentage >= 0.3)
|
|
179
|
+
return 'high';
|
|
180
|
+
if (percentage >= 0.15)
|
|
181
|
+
return 'medium';
|
|
182
|
+
return 'low';
|
|
183
|
+
}
|
|
184
|
+
calculateCorrelationStrength(matches, allAnnotations) {
|
|
185
|
+
if (allAnnotations.length === 0)
|
|
186
|
+
return 0;
|
|
187
|
+
// Calculate correlation based on:
|
|
188
|
+
// 1. How many of the failures have this pattern
|
|
189
|
+
// 2. How specific the pattern is to failures
|
|
190
|
+
const totalFailures = allAnnotations.filter(a => a.status === 'partial' || a.status === 'failure').length;
|
|
191
|
+
if (totalFailures === 0)
|
|
192
|
+
return 0;
|
|
193
|
+
// Proportion of failures that have this pattern
|
|
194
|
+
const failureCorrelation = matches.length / totalFailures;
|
|
195
|
+
// Specificity: how much this pattern appears in failures vs successes
|
|
196
|
+
const successesWithPattern = allAnnotations.filter(a => a.status === 'success' &&
|
|
197
|
+
matches.some(m => m.notes === a.notes)).length;
|
|
198
|
+
const specificity = successesWithPattern === 0 ? 1 :
|
|
199
|
+
matches.length / (matches.length + successesWithPattern);
|
|
200
|
+
// Combined correlation strength
|
|
201
|
+
return Math.min(failureCorrelation * specificity, 1.0);
|
|
202
|
+
}
|
|
203
|
+
getUniquePrompts(annotations) {
|
|
204
|
+
const prompts = new Set();
|
|
205
|
+
annotations.forEach(a => {
|
|
206
|
+
if (a.promptName) {
|
|
207
|
+
prompts.add(a.promptName);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
return Array.from(prompts);
|
|
211
|
+
}
|
|
212
|
+
truncateEvidence(text, maxLength = 100) {
|
|
213
|
+
if (text.length <= maxLength) {
|
|
214
|
+
return text;
|
|
215
|
+
}
|
|
216
|
+
return text.substring(0, maxLength - 3) + '...';
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=pattern-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-detector.js","sourceRoot":"","sources":["../../src/services/pattern-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Prompt } from '../types/prompt.js';
|
|
2
|
+
export interface PromptServiceOptions {
|
|
3
|
+
cacheTimeout?: number;
|
|
4
|
+
}
|
|
5
|
+
export interface PromptValidationResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
errors?: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare class PromptService {
|
|
10
|
+
private promptDirs;
|
|
11
|
+
private cache;
|
|
12
|
+
private searchIndex;
|
|
13
|
+
private options;
|
|
14
|
+
constructor(promptDirs: string[], options?: PromptServiceOptions);
|
|
15
|
+
discoverPrompts(): Promise<Prompt[]>;
|
|
16
|
+
loadPrompt(promptPath: string): Promise<Prompt>;
|
|
17
|
+
validatePrompt(prompt: Prompt): Promise<PromptValidationResult>;
|
|
18
|
+
searchPrompts(query: string): Promise<Prompt[]>;
|
|
19
|
+
getPromptsByLabel(label: string): Promise<Prompt[]>;
|
|
20
|
+
private discoverPromptsInDir;
|
|
21
|
+
private parseVariables;
|
|
22
|
+
private buildSearchIndex;
|
|
23
|
+
private getFromCache;
|
|
24
|
+
private setCache;
|
|
25
|
+
clearCache(): void;
|
|
26
|
+
addPromptDirectory(dir: string): void;
|
|
27
|
+
removePromptDirectory(dir: string): void;
|
|
28
|
+
getPromptDirectories(): string[];
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=prompt-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-service.d.ts","sourceRoot":"","sources":["../../src/services/prompt-service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AA6BhE,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAW;IAC7B,OAAO,CAAC,KAAK,CAA2D;IACxE,OAAO,CAAC,WAAW,CAAoD;IACvE,OAAO,CAAC,OAAO,CAAiC;gBAEpC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,oBAAyB;IAO9D,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBpC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkD/C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAkD/D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsB/C,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAK3C,oBAAoB;IAgClC,OAAO,CAAC,cAAc;YAyBR,gBAAgB;IAoB9B,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,QAAQ;IAIhB,UAAU,IAAI,IAAI;IAKlB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOrC,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQxC,oBAAoB,IAAI,MAAM,EAAE;CAGjC"}
|