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,223 @@
|
|
|
1
|
+
import { select, input, editor, confirm } from '@inquirer/prompts';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import yaml from 'js-yaml';
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import { ConfigManager } from '../config/config-manager.js';
|
|
7
|
+
import { HistoryManager } from '../history/history-manager.js';
|
|
8
|
+
import { errors } from '../utils/errors.js';
|
|
9
|
+
import { DateFormats } from '../utils/date-formatter.js';
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
export async function annotateCommand(historyNumber) {
|
|
12
|
+
const config = await ConfigManager.load();
|
|
13
|
+
if (!config.annotationDir) {
|
|
14
|
+
throw errors.featureNotEnabled('Annotations', [
|
|
15
|
+
'Track prompt success/failure',
|
|
16
|
+
'Add tags for organization',
|
|
17
|
+
'Record detailed notes'
|
|
18
|
+
]);
|
|
19
|
+
}
|
|
20
|
+
if (!config.historyDir) {
|
|
21
|
+
throw errors.featureNotEnabled('History tracking', [
|
|
22
|
+
'Track all your prompts',
|
|
23
|
+
'Re-run previous prompts',
|
|
24
|
+
'Add annotations'
|
|
25
|
+
]);
|
|
26
|
+
}
|
|
27
|
+
const historyManager = new HistoryManager(config.historyDir, config.annotationDir);
|
|
28
|
+
let entry;
|
|
29
|
+
if (historyNumber !== undefined) {
|
|
30
|
+
entry = await historyManager.getHistoryEntry(historyNumber);
|
|
31
|
+
if (!entry) {
|
|
32
|
+
const entries = await historyManager.listHistory();
|
|
33
|
+
throw errors.historyNotFound(historyNumber, entries.length);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const historyList = await historyManager.listHistory();
|
|
38
|
+
if (historyList.length === 0) {
|
|
39
|
+
throw new Error('No history entries found. Run some prompts first to build history.');
|
|
40
|
+
}
|
|
41
|
+
const selectedIndex = await select({
|
|
42
|
+
message: 'Select history entry to annotate:',
|
|
43
|
+
choices: historyList.map((item, index) => ({
|
|
44
|
+
name: formatHistoryChoice(item, index + 1),
|
|
45
|
+
value: index
|
|
46
|
+
}))
|
|
47
|
+
});
|
|
48
|
+
entry = historyList[selectedIndex];
|
|
49
|
+
}
|
|
50
|
+
const status = await select({
|
|
51
|
+
message: 'How did this prompt work?',
|
|
52
|
+
choices: [
|
|
53
|
+
{ value: 'success', name: '✓ Success' },
|
|
54
|
+
{ value: 'failure', name: '✗ Failure' },
|
|
55
|
+
{ value: 'partial', name: '~ Partial success' }
|
|
56
|
+
]
|
|
57
|
+
});
|
|
58
|
+
const tagsInput = await input({
|
|
59
|
+
message: 'Tags (comma-separated, optional):'
|
|
60
|
+
});
|
|
61
|
+
const notes = await editor({
|
|
62
|
+
message: 'Add notes (press enter to open editor):'
|
|
63
|
+
});
|
|
64
|
+
const metadata = {
|
|
65
|
+
historyFile: path.basename(entry.filename),
|
|
66
|
+
timestamp: DateFormats.UTC_DATETIME(new Date()),
|
|
67
|
+
status,
|
|
68
|
+
tags: tagsInput ? tagsInput.split(',').map(t => t.trim()).filter(t => t) : []
|
|
69
|
+
};
|
|
70
|
+
// Enhanced annotation features for non-success statuses
|
|
71
|
+
if (status !== 'success') {
|
|
72
|
+
const addStructuredData = await select({
|
|
73
|
+
message: 'Add structured outcome data?',
|
|
74
|
+
choices: [
|
|
75
|
+
{ value: true, name: 'Yes - Add task/test metrics' },
|
|
76
|
+
{ value: false, name: 'No - Skip structured data' }
|
|
77
|
+
]
|
|
78
|
+
});
|
|
79
|
+
if (addStructuredData) {
|
|
80
|
+
metadata.structured_outcome = await collectStructuredOutcome();
|
|
81
|
+
}
|
|
82
|
+
const addIssues = await select({
|
|
83
|
+
message: 'Identify specific issues?',
|
|
84
|
+
choices: [
|
|
85
|
+
{ value: true, name: 'Yes - Categorize issues found' },
|
|
86
|
+
{ value: false, name: 'No - Skip issue identification' }
|
|
87
|
+
]
|
|
88
|
+
});
|
|
89
|
+
if (addIssues) {
|
|
90
|
+
metadata.issues_identified = await collectIssues();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const content = `---
|
|
94
|
+
${yaml.dump(metadata)}---
|
|
95
|
+
|
|
96
|
+
## Notes
|
|
97
|
+
|
|
98
|
+
${notes}
|
|
99
|
+
`;
|
|
100
|
+
const historyBasename = path.basename(entry.filename, '.json');
|
|
101
|
+
const filename = `${historyBasename}-annotation-${uuidv4()}.md`;
|
|
102
|
+
const filepath = path.join(config.annotationDir, filename);
|
|
103
|
+
try {
|
|
104
|
+
await fs.writeFile(filepath, content);
|
|
105
|
+
logger.log(`✅ Annotation saved to ${filepath}`);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const err = error;
|
|
109
|
+
if (err.code === 'EACCES') {
|
|
110
|
+
throw errors.permissionDenied(config.annotationDir);
|
|
111
|
+
}
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function formatHistoryChoice(entry, index) {
|
|
116
|
+
const date = new Date(entry.timestamp);
|
|
117
|
+
const dateStr = `[${DateFormats.LOCAL_DATETIME(date)}]`;
|
|
118
|
+
const title = entry.title || 'Untitled';
|
|
119
|
+
const firstLine = entry.finalPrompt.split('\n')[0];
|
|
120
|
+
const truncated = firstLine.length > 50
|
|
121
|
+
? firstLine.substring(0, 47) + '...'
|
|
122
|
+
: firstLine;
|
|
123
|
+
return `${index}. ${dateStr} ${title} - ${truncated}`;
|
|
124
|
+
}
|
|
125
|
+
async function collectStructuredOutcome() {
|
|
126
|
+
const tasksCompleted = await input({
|
|
127
|
+
message: 'Tasks completed:',
|
|
128
|
+
validate: (value) => {
|
|
129
|
+
const num = parseInt(value);
|
|
130
|
+
return !isNaN(num) && num >= 0 ? true : 'Please enter a valid number';
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
const tasksTotal = await input({
|
|
134
|
+
message: 'Total tasks:',
|
|
135
|
+
validate: (value) => {
|
|
136
|
+
const num = parseInt(value);
|
|
137
|
+
return !isNaN(num) && num >= parseInt(tasksCompleted) ? true : 'Total must be >= completed';
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
const testsRun = await input({
|
|
141
|
+
message: 'Tests run:',
|
|
142
|
+
validate: (value) => {
|
|
143
|
+
const num = parseInt(value);
|
|
144
|
+
return !isNaN(num) && num >= 0 ? true : 'Please enter a valid number';
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
const testsPassed = await input({
|
|
148
|
+
message: 'Tests passed:',
|
|
149
|
+
validate: (value) => {
|
|
150
|
+
const num = parseInt(value);
|
|
151
|
+
return !isNaN(num) && num >= 0 && num <= parseInt(testsRun) ? true : 'Must be <= tests run';
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
const testsFailed = await input({
|
|
155
|
+
message: 'Tests failed:',
|
|
156
|
+
validate: (value) => {
|
|
157
|
+
const num = parseInt(value);
|
|
158
|
+
const passed = parseInt(testsPassed);
|
|
159
|
+
const run = parseInt(testsRun);
|
|
160
|
+
return !isNaN(num) && num >= 0 && (passed + num) <= run ? true : 'Invalid test count';
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
const executionTime = await input({
|
|
164
|
+
message: 'Execution time (e.g., 2m30s):',
|
|
165
|
+
default: '0s'
|
|
166
|
+
});
|
|
167
|
+
const verificationPassed = await confirm({
|
|
168
|
+
message: 'Did verification pass?',
|
|
169
|
+
default: false
|
|
170
|
+
});
|
|
171
|
+
return {
|
|
172
|
+
tasks_completed: parseInt(tasksCompleted),
|
|
173
|
+
tasks_total: parseInt(tasksTotal),
|
|
174
|
+
tests_run: parseInt(testsRun),
|
|
175
|
+
tests_passed: parseInt(testsPassed),
|
|
176
|
+
tests_failed: parseInt(testsFailed),
|
|
177
|
+
verification_passed: verificationPassed,
|
|
178
|
+
execution_time: executionTime
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
async function collectIssues() {
|
|
182
|
+
const issues = [];
|
|
183
|
+
let addMore = true;
|
|
184
|
+
while (addMore) {
|
|
185
|
+
const category = await select({
|
|
186
|
+
message: 'Issue category:',
|
|
187
|
+
choices: [
|
|
188
|
+
{ value: 'verification_gap', name: 'Verification Gap - AI claimed success but verification failed' },
|
|
189
|
+
{ value: 'incomplete_task', name: 'Incomplete Task - Stopped before completing all work' },
|
|
190
|
+
{ value: 'ambiguous_instruction', name: 'Ambiguous Instruction - Unclear requirements' },
|
|
191
|
+
{ value: 'missing_constraint', name: 'Missing Constraint - Important requirement not specified' }
|
|
192
|
+
]
|
|
193
|
+
});
|
|
194
|
+
const severity = await select({
|
|
195
|
+
message: 'Issue severity:',
|
|
196
|
+
choices: [
|
|
197
|
+
{ value: 'low', name: 'Low - Minor inconvenience' },
|
|
198
|
+
{ value: 'medium', name: 'Medium - Noticeable impact' },
|
|
199
|
+
{ value: 'high', name: 'High - Significant problem' },
|
|
200
|
+
{ value: 'critical', name: 'Critical - Complete failure' }
|
|
201
|
+
]
|
|
202
|
+
});
|
|
203
|
+
const description = await input({
|
|
204
|
+
message: 'Brief description:',
|
|
205
|
+
validate: (value) => value.trim().length > 0 ? true : 'Description required'
|
|
206
|
+
});
|
|
207
|
+
const evidence = await editor({
|
|
208
|
+
message: 'Evidence/details (press enter to open editor):'
|
|
209
|
+
});
|
|
210
|
+
issues.push({
|
|
211
|
+
category,
|
|
212
|
+
severity,
|
|
213
|
+
description: description.trim(),
|
|
214
|
+
evidence: evidence.trim()
|
|
215
|
+
});
|
|
216
|
+
addMore = await confirm({
|
|
217
|
+
message: 'Add another issue?',
|
|
218
|
+
default: false
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return issues;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=annotate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotate.js","sourceRoot":"","sources":["../../src/commands/annotate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Config } from '../types/config.js';
|
|
2
|
+
import { ConsoleUI } from '../ui/console-ui.js';
|
|
3
|
+
import pino from 'pino';
|
|
4
|
+
export interface CommandContext {
|
|
5
|
+
config: Config;
|
|
6
|
+
ui: ConsoleUI;
|
|
7
|
+
logger: pino.Logger;
|
|
8
|
+
}
|
|
9
|
+
export interface CommandOptions {
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
quiet?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare abstract class BaseCommand<TInput, TOutput = void> {
|
|
14
|
+
protected context: CommandContext;
|
|
15
|
+
protected options: CommandOptions;
|
|
16
|
+
constructor(context: CommandContext, options?: CommandOptions);
|
|
17
|
+
execute(): Promise<TOutput>;
|
|
18
|
+
protected abstract get name(): string;
|
|
19
|
+
protected abstract validatePreconditions(): Promise<void>;
|
|
20
|
+
protected abstract collectInput(): Promise<TInput>;
|
|
21
|
+
protected abstract performAction(input: TInput): Promise<TOutput>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=base-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAY,MAAM,qBAAqB,CAAC;AAE1D,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,8BAAsB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IACtD,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC;gBAEtB,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE,cAAmB;IAY3D,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IA2BjC,SAAS,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IACzD,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAClD,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAClE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { LogLevel } from '../ui/console-ui.js';
|
|
2
|
+
import { PromptToolError } from '../utils/errors.js';
|
|
3
|
+
export class BaseCommand {
|
|
4
|
+
context;
|
|
5
|
+
options;
|
|
6
|
+
constructor(context, options = {}) {
|
|
7
|
+
this.context = context;
|
|
8
|
+
this.options = options;
|
|
9
|
+
if (options.verbose) {
|
|
10
|
+
context.ui.setLogLevel(LogLevel.DEBUG);
|
|
11
|
+
}
|
|
12
|
+
if (options.quiet) {
|
|
13
|
+
context.ui.setSilent(true);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async execute() {
|
|
17
|
+
try {
|
|
18
|
+
this.context.logger.info({ command: this.name }, 'Executing command');
|
|
19
|
+
await this.validatePreconditions();
|
|
20
|
+
const input = await this.collectInput();
|
|
21
|
+
const result = await this.performAction(input);
|
|
22
|
+
this.context.logger.info({ command: this.name }, 'Command completed');
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
this.context.logger.error({ command: this.name, error }, 'Command failed');
|
|
27
|
+
if (error instanceof PromptToolError) {
|
|
28
|
+
this.context.ui.error(error);
|
|
29
|
+
if (error.suggestions && error.suggestions.length > 0) {
|
|
30
|
+
this.context.ui.info('Suggestions:');
|
|
31
|
+
error.suggestions.forEach(s => this.context.ui.info(` - ${s.text}`));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
this.context.ui.error(error);
|
|
36
|
+
}
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=base-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAcrD,MAAM,OAAgB,WAAW;IACrB,OAAO,CAAiB;IACxB,OAAO,CAAiB;IAElC,YAAY,OAAuB,EAAE,UAA0B,EAAE;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,mBAAmB,CAAC,CAAC;YAEtE,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAE/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,mBAAmB,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAE3E,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACrC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CAMF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA4BjD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ConfigManager } from '../config/config-manager.js';
|
|
2
|
+
import { PromptManager } from '../prompts/prompt-manager.js';
|
|
3
|
+
import { InteractiveSearch } from '../ui/interactive-search.js';
|
|
4
|
+
import { editorLauncher } from '../utils/editor.js';
|
|
5
|
+
import { errors } from '../utils/errors.js';
|
|
6
|
+
export async function editCommand() {
|
|
7
|
+
// Load configuration
|
|
8
|
+
const config = await ConfigManager.load();
|
|
9
|
+
// Discover prompts
|
|
10
|
+
const promptManager = new PromptManager(config.promptDirs);
|
|
11
|
+
const prompts = await promptManager.discoverPrompts();
|
|
12
|
+
if (prompts.length === 0) {
|
|
13
|
+
throw errors.noPromptsFound(config.promptDirs);
|
|
14
|
+
}
|
|
15
|
+
// Interactive search
|
|
16
|
+
const search = new InteractiveSearch();
|
|
17
|
+
const selected = await search.selectPrompt(prompts);
|
|
18
|
+
// Find an editor
|
|
19
|
+
const editor = await editorLauncher.findEditor();
|
|
20
|
+
if (!editor) {
|
|
21
|
+
throw errors.noEditor();
|
|
22
|
+
}
|
|
23
|
+
// Open in editor
|
|
24
|
+
try {
|
|
25
|
+
await editorLauncher.openInEditor(editor, selected.path);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
throw new Error(`Failed to open editor: ${error instanceof Error ? error.message : String(error)}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAE1C,mBAAmB;IACnB,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC;IAEtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAEpD,iBAAiB;IACjB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBrE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { program } from 'commander';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
|
+
export async function helpCommand(commandName) {
|
|
4
|
+
if (!commandName) {
|
|
5
|
+
// Show general help (same as pt --help)
|
|
6
|
+
program.outputHelp();
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
// Find the specific command
|
|
10
|
+
const command = program.commands.find(cmd => cmd.name() === commandName);
|
|
11
|
+
if (command) {
|
|
12
|
+
// Show help for specific command (same as pt <command> --help)
|
|
13
|
+
command.outputHelp();
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
logger.error(`Unknown command: ${commandName}`);
|
|
17
|
+
logger.log('\nAvailable commands:');
|
|
18
|
+
program.commands.forEach(cmd => {
|
|
19
|
+
logger.log(` ${cmd.name()}${cmd.description() ? ` - ${cmd.description()}` : ''}`);
|
|
20
|
+
});
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAoB;IACpD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,wCAAwC;QACxC,OAAO,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,4BAA4B;QAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,CAAC;QAEzE,IAAI,OAAO,EAAE,CAAC;YACZ,+DAA+D;YAC/D,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAUA,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAuJ3E"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { ConfigManager } from '../config/config-manager.js';
|
|
3
|
+
import { HistoryManager } from '../history/history-manager.js';
|
|
4
|
+
import { errors } from '../utils/errors.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import Handlebars from 'handlebars';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
export async function historyCommand(options) {
|
|
10
|
+
// Load config
|
|
11
|
+
const config = await ConfigManager.load();
|
|
12
|
+
// Check if history is enabled
|
|
13
|
+
if (!config.historyDir) {
|
|
14
|
+
throw errors.featureNotEnabled('History tracking', [
|
|
15
|
+
'Track all your prompts',
|
|
16
|
+
'Re-run previous prompts',
|
|
17
|
+
'Add annotations'
|
|
18
|
+
]);
|
|
19
|
+
}
|
|
20
|
+
// Create history manager
|
|
21
|
+
const historyManager = new HistoryManager(config.historyDir, config.annotationDir);
|
|
22
|
+
// If --result is specified, show entry with its output
|
|
23
|
+
if (options.result !== undefined) {
|
|
24
|
+
const entry = await historyManager.getHistoryEntry(options.result);
|
|
25
|
+
if (!entry) {
|
|
26
|
+
logger.log(chalk.red(`History entry ${options.result} not found`));
|
|
27
|
+
const totalCount = await historyManager.getTotalCount();
|
|
28
|
+
if (totalCount > 0) {
|
|
29
|
+
logger.log(chalk.dim(`Available entries: 1-${totalCount}`));
|
|
30
|
+
}
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Display full entry details
|
|
34
|
+
logger.log(chalk.bold(`\nHistory Entry #${options.result}:`));
|
|
35
|
+
logger.log(chalk.gray('─'.repeat(80)));
|
|
36
|
+
logger.log(chalk.cyan('Timestamp:') + ` ${formatDate(entry.timestamp)}`);
|
|
37
|
+
logger.log(chalk.cyan('Title:') + ` ${entry.title || 'Untitled'}`);
|
|
38
|
+
logger.log(chalk.cyan('Template:') + ` ${entry.templatePath}`);
|
|
39
|
+
if (Object.keys(entry.variables).length > 0) {
|
|
40
|
+
logger.log(chalk.cyan('\nVariables:'));
|
|
41
|
+
for (const [key, value] of Object.entries(entry.variables)) {
|
|
42
|
+
logger.log(` ${chalk.green(key)}: ${JSON.stringify(value)}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
logger.log(chalk.cyan('\nFinal Prompt:'));
|
|
46
|
+
logger.log(chalk.gray('─'.repeat(80)));
|
|
47
|
+
logger.log(entry.finalPrompt);
|
|
48
|
+
logger.log(chalk.gray('─'.repeat(80)));
|
|
49
|
+
// Check if output file exists and display it
|
|
50
|
+
if (entry.execution?.output_file) {
|
|
51
|
+
const outputPath = path.join(config.historyDir, entry.execution.output_file);
|
|
52
|
+
try {
|
|
53
|
+
const outputContent = await fs.readFile(outputPath, 'utf-8');
|
|
54
|
+
logger.log(chalk.cyan('\nCommand Output:'));
|
|
55
|
+
logger.log(chalk.gray('─'.repeat(80)));
|
|
56
|
+
logger.log(outputContent);
|
|
57
|
+
logger.log(chalk.gray('─'.repeat(80)));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
logger.log(chalk.yellow('\nOutput file not found or inaccessible'));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
logger.log(chalk.dim('\nNo output file associated with this entry'));
|
|
65
|
+
}
|
|
66
|
+
logger.log(chalk.dim(`\nHistory file: ${entry.filename}`));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// If a specific entry is requested, show its full content
|
|
70
|
+
if (options.entry !== undefined) {
|
|
71
|
+
const entry = await historyManager.getHistoryEntry(options.entry);
|
|
72
|
+
if (!entry) {
|
|
73
|
+
logger.log(chalk.red(`History entry ${options.entry} not found`));
|
|
74
|
+
const totalCount = await historyManager.getTotalCount();
|
|
75
|
+
if (totalCount > 0) {
|
|
76
|
+
logger.log(chalk.dim(`Available entries: 1-${totalCount}`));
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Display full entry details
|
|
81
|
+
logger.log(chalk.bold(`\nHistory Entry #${options.entry}:`));
|
|
82
|
+
logger.log(chalk.gray('─'.repeat(80)));
|
|
83
|
+
logger.log(chalk.cyan('Timestamp:') + ` ${formatDate(entry.timestamp)}`);
|
|
84
|
+
logger.log(chalk.cyan('Title:') + ` ${entry.title || 'Untitled'}`);
|
|
85
|
+
logger.log(chalk.cyan('Template:') + ` ${entry.templatePath}`);
|
|
86
|
+
if (Object.keys(entry.variables).length > 0) {
|
|
87
|
+
logger.log(chalk.cyan('\nVariables:'));
|
|
88
|
+
for (const [key, value] of Object.entries(entry.variables)) {
|
|
89
|
+
logger.log(` ${chalk.green(key)}: ${JSON.stringify(value)}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
logger.log(chalk.cyan('\nFinal Prompt:'));
|
|
93
|
+
logger.log(chalk.gray('─'.repeat(80)));
|
|
94
|
+
logger.log(entry.finalPrompt);
|
|
95
|
+
logger.log(chalk.gray('─'.repeat(80)));
|
|
96
|
+
logger.log(chalk.dim(`\nHistory file: ${entry.filename}`));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Determine limit
|
|
100
|
+
let limit;
|
|
101
|
+
if (options.all) {
|
|
102
|
+
limit = undefined;
|
|
103
|
+
}
|
|
104
|
+
else if (options.limit) {
|
|
105
|
+
limit = options.limit;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
limit = 20; // Default limit
|
|
109
|
+
}
|
|
110
|
+
// Get total count of entries for proper numbering
|
|
111
|
+
const totalCount = await historyManager.getTotalCount();
|
|
112
|
+
// Get history entries
|
|
113
|
+
const entries = await historyManager.listHistory(limit);
|
|
114
|
+
// Handle empty history
|
|
115
|
+
if (entries.length === 0) {
|
|
116
|
+
logger.log(chalk.yellow('📋 No history found'));
|
|
117
|
+
logger.log(chalk.dim('\nRun some prompts to build your history:'));
|
|
118
|
+
logger.log(chalk.dim(' • pt - Interactive prompt selection'));
|
|
119
|
+
logger.log(chalk.dim(' • pt run <tool> - Run with specific tool'));
|
|
120
|
+
logger.log(chalk.dim(' • pt run - Run with default tool'));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Display header
|
|
124
|
+
logger.log(chalk.bold('\nPrompt History:'));
|
|
125
|
+
logger.log(chalk.gray('─'.repeat(80)));
|
|
126
|
+
// Calculate starting number based on total count and entries shown
|
|
127
|
+
const startNum = totalCount - entries.length + 1;
|
|
128
|
+
// Display entries
|
|
129
|
+
entries.forEach((entry, index) => {
|
|
130
|
+
const num = startNum + index;
|
|
131
|
+
const date = formatDate(entry.timestamp);
|
|
132
|
+
const title = entry.title || 'Untitled';
|
|
133
|
+
const summary = createAutoSummary(entry);
|
|
134
|
+
logger.log(chalk.cyan(`${num}.`) + chalk.gray(` [${date}] `) + chalk.white(title));
|
|
135
|
+
logger.log(' ' + chalk.gray(summary));
|
|
136
|
+
logger.log('');
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
function formatDate(timestamp) {
|
|
140
|
+
const date = new Date(timestamp);
|
|
141
|
+
// Use local time methods to display in user's timezone
|
|
142
|
+
const year = date.getFullYear();
|
|
143
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
144
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
145
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
146
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
147
|
+
return `${year}-${month}-${day} ${hours}:${minutes}`;
|
|
148
|
+
}
|
|
149
|
+
function processSummaryTemplate(summary, variables) {
|
|
150
|
+
try {
|
|
151
|
+
const template = Handlebars.compile(summary);
|
|
152
|
+
return template(variables);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// If template processing fails, return the raw summary
|
|
156
|
+
return summary;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function formatVariables(variables) {
|
|
160
|
+
const formatted = [];
|
|
161
|
+
// Skip masked values and empty objects
|
|
162
|
+
const entries = Object.entries(variables).filter(([_, value]) => value !== '***' && value !== undefined && value !== null && value !== '');
|
|
163
|
+
// Format each variable based on its type
|
|
164
|
+
for (const [key, value] of entries) {
|
|
165
|
+
if (typeof value === 'string') {
|
|
166
|
+
// First, normalize the string by collapsing multiple spaces/newlines but preserving structure
|
|
167
|
+
// Replace multiple newlines with a space, but keep single spaces
|
|
168
|
+
const normalized = value
|
|
169
|
+
.replace(/\n+/g, ' ') // Replace newlines with spaces
|
|
170
|
+
.replace(/\s{2,}/g, ' ') // Replace multiple spaces with single space
|
|
171
|
+
.trim();
|
|
172
|
+
// Check if this variable is a file-related input based on its name
|
|
173
|
+
const isFileVariable = key.toLowerCase().includes('file') ||
|
|
174
|
+
key.toLowerCase().includes('path') ||
|
|
175
|
+
key.toLowerCase().includes('dir');
|
|
176
|
+
if (isFileVariable && (normalized.includes('/') || normalized.includes('\\'))) {
|
|
177
|
+
// For file variables, show just the filename
|
|
178
|
+
const filename = normalized.split(/[/\\]/).pop() || normalized;
|
|
179
|
+
formatted.push(`${key}: "${filename}"`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
// Escape any quotes in the string to prevent display issues
|
|
183
|
+
const escaped = normalized.replace(/"/g, '\\"');
|
|
184
|
+
// Don't truncate individual variables here - let createAutoSummary handle it
|
|
185
|
+
formatted.push(`${key}: "${escaped}"`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else if (typeof value === 'boolean') {
|
|
189
|
+
formatted.push(`${key}: ${value}`);
|
|
190
|
+
}
|
|
191
|
+
else if (typeof value === 'number') {
|
|
192
|
+
formatted.push(`${key}: ${value}`);
|
|
193
|
+
}
|
|
194
|
+
else if (Array.isArray(value)) {
|
|
195
|
+
formatted.push(`${key}: [${value.length} items]`);
|
|
196
|
+
}
|
|
197
|
+
else if (typeof value === 'object') {
|
|
198
|
+
formatted.push(`${key}: {...}`);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
formatted.push(`${key}: ${String(value)}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return formatted;
|
|
205
|
+
}
|
|
206
|
+
function createAutoSummary(entry) {
|
|
207
|
+
// Account for 3 spaces of indentation in the display
|
|
208
|
+
const maxSummaryLength = 77; // 80 - 3 spaces
|
|
209
|
+
let summary;
|
|
210
|
+
// If there's a summary field, use it
|
|
211
|
+
if (entry.summary) {
|
|
212
|
+
summary = processSummaryTemplate(entry.summary, entry.variables);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// Otherwise, show the most relevant user inputs
|
|
216
|
+
const varDisplay = formatVariables(entry.variables);
|
|
217
|
+
if (varDisplay.length > 0) {
|
|
218
|
+
// Show up to 2 variables in a concise format
|
|
219
|
+
summary = varDisplay.slice(0, 2).join(', ');
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
// Fall back to showing a truncated version of the prompt
|
|
223
|
+
summary = entry.finalPrompt.split('\n')[0].trim();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Ensure consistent truncation for alignment
|
|
227
|
+
if (summary.length > maxSummaryLength) {
|
|
228
|
+
return summary.substring(0, maxSummaryLength - 3) + '...';
|
|
229
|
+
}
|
|
230
|
+
return summary;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=history.js.map
|