@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.
- package/LICENSE +21 -0
- package/README.md +54 -29
- 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 +435 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +164 -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 +99 -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/cache.d.ts +9 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +31 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +93 -0
- package/dist/commands/config.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 +35 -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 +26 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/history.d.ts +12 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +317 -0
- package/dist/commands/history.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 +137 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +263 -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 +160 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +32 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +367 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +45 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +113 -0
- package/dist/commands/update.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 +221 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/global-paths.d.ts +5 -0
- package/dist/config/global-paths.d.ts.map +1 -0
- package/dist/config/global-paths.js +16 -0
- package/dist/config/global-paths.js.map +1 -0
- package/dist/config/migration.d.ts +12 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +270 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/history/enhanced-history-manager.d.ts +27 -0
- package/dist/history/enhanced-history-manager.d.ts.map +1 -0
- package/dist/history/enhanced-history-manager.js +116 -0
- package/dist/history/enhanced-history-manager.js.map +1 -0
- package/dist/history/history-manager.d.ts +43 -0
- package/dist/history/history-manager.d.ts.map +1 -0
- package/dist/history/history-manager.js +229 -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-search-prompt.d.ts +11 -0
- package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/file-search-prompt.js +53 -0
- package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts +3 -0
- package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
- package/dist/prompts/input-types/review-file-prompt.js +9 -0
- package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
- package/dist/schemas/config-schema.d.ts +1637 -0
- package/dist/schemas/config-schema.d.ts.map +1 -0
- package/dist/schemas/config-schema.js +136 -0
- package/dist/schemas/config-schema.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 +53 -0
- package/dist/search/search-engine.js.map +1 -0
- package/dist/services/git-service.d.ts +28 -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/input-collector.d.ts +9 -0
- package/dist/services/input-collector.d.ts.map +1 -0
- package/dist/services/input-collector.js +162 -0
- package/dist/services/input-collector.js.map +1 -0
- package/dist/services/logging-service.d.ts +49 -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/module-cache.d.ts +42 -0
- package/dist/services/module-cache.d.ts.map +1 -0
- package/dist/services/module-cache.js +205 -0
- package/dist/services/module-cache.js.map +1 -0
- package/dist/services/module-entry-builder.d.ts +20 -0
- package/dist/services/module-entry-builder.d.ts.map +1 -0
- package/dist/services/module-entry-builder.js +71 -0
- package/dist/services/module-entry-builder.js.map +1 -0
- package/dist/services/output-capture-service.d.ts +28 -0
- package/dist/services/output-capture-service.d.ts.map +1 -0
- package/dist/services/output-capture-service.js +348 -0
- package/dist/services/output-capture-service.js.map +1 -0
- package/dist/services/package-manager.d.ts +18 -0
- package/dist/services/package-manager.d.ts.map +1 -0
- package/dist/services/package-manager.js +141 -0
- package/dist/services/package-manager.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 +228 -0
- package/dist/services/pattern-detector.js.map +1 -0
- package/dist/services/prompt-resolver.d.ts +32 -0
- package/dist/services/prompt-resolver.d.ts.map +1 -0
- package/dist/services/prompt-resolver.js +73 -0
- package/dist/services/prompt-resolver.js.map +1 -0
- package/dist/services/pupt-prompt-source.d.ts +16 -0
- package/dist/services/pupt-prompt-source.d.ts.map +1 -0
- package/dist/services/pupt-prompt-source.js +74 -0
- package/dist/services/pupt-prompt-source.js.map +1 -0
- package/dist/services/pupt-service.d.ts +33 -0
- package/dist/services/pupt-service.d.ts.map +1 -0
- package/dist/services/pupt-service.js +119 -0
- package/dist/services/pupt-service.js.map +1 -0
- package/dist/services/review-data-builder.d.ts +25 -0
- package/dist/services/review-data-builder.d.ts.map +1 -0
- package/dist/services/review-data-builder.js +333 -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 +158 -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 +196 -0
- package/dist/services/ui-service.js.map +1 -0
- package/dist/types/annotations.d.ts +50 -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 +110 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +12 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/history.d.ts +36 -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 +25 -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 +29 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +24 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/review.d.ts +81 -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 +30 -0
- package/dist/ui/console-ui.d.ts.map +1 -0
- package/dist/ui/console-ui.js +88 -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/annotation-migration.d.ts +12 -0
- package/dist/utils/annotation-migration.d.ts.map +1 -0
- package/dist/utils/annotation-migration.js +88 -0
- package/dist/utils/annotation-migration.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 +46 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/editor.d.ts +14 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +52 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/errors.d.ts +58 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +275 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/git-info.d.ts +10 -0
- package/dist/utils/git-info.d.ts.map +1 -0
- package/dist/utils/git-info.js +44 -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/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 +45 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/project-root.d.ts +22 -0
- package/dist/utils/project-root.d.ts.map +1 -0
- package/dist/utils/project-root.js +226 -0
- package/dist/utils/project-root.js.map +1 -0
- package/dist/utils/prompt-dir-resolver.d.ts +5 -0
- package/dist/utils/prompt-dir-resolver.d.ts.map +1 -0
- package/dist/utils/prompt-dir-resolver.js +25 -0
- package/dist/utils/prompt-dir-resolver.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 +14 -0
- package/dist/utils/tool-detection.d.ts.map +1 -0
- package/dist/utils/tool-detection.js +43 -0
- package/dist/utils/tool-detection.js.map +1 -0
- package/package.json +79 -7
- package/prompts/prompts/ad-hoc-long.prompt +60 -0
- package/prompts/prompts/ad-hoc.prompt +29 -0
- package/prompts/prompts/code-review.prompt +99 -0
- package/prompts/prompts/debugging-error-message.prompt +81 -0
- package/prompts/prompts/fix-github-actions.prompt +62 -0
- package/prompts/prompts/fix-test-errors.prompt +73 -0
- package/prompts/prompts/git-commit-comment.prompt +61 -0
- package/prompts/prompts/implementation-phase.prompt +53 -0
- package/prompts/prompts/implementation-plan.prompt +101 -0
- package/prompts/prompts/new-feature.prompt +89 -0
- package/prompts/prompts/new-project.prompt +9 -0
- package/prompts/prompts/one-shot-change.prompt +79 -0
- package/prompts/prompts/pupt-prompt-improvement.prompt +270 -0
- package/prompts/prompts/simple-test.prompt +8 -0
- package/prompts/prompts/update-design.prompt +71 -0
- 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":"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"}
|
|
@@ -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"}
|