@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,116 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { calculateActiveExecutionTime, extractUserInputLines } from '../services/output-capture-service.js';
|
|
5
|
+
import { DateFormats } from '../utils/date-formatter.js';
|
|
6
|
+
import { formatDuration, getGitInfo } from '../utils/git-info.js';
|
|
7
|
+
import { sanitizeObject } from '../utils/security.js';
|
|
8
|
+
import { HistoryManager } from './history-manager.js';
|
|
9
|
+
export class EnhancedHistoryManager extends HistoryManager {
|
|
10
|
+
enhancedHistoryDir;
|
|
11
|
+
constructor(enhancedHistoryDir) {
|
|
12
|
+
super(enhancedHistoryDir);
|
|
13
|
+
this.enhancedHistoryDir = enhancedHistoryDir;
|
|
14
|
+
}
|
|
15
|
+
async listHistory(limit) {
|
|
16
|
+
const entries = await super.listHistory(limit);
|
|
17
|
+
// The parent method returns HistoryEntry[], but they may actually contain enhanced fields
|
|
18
|
+
// TypeScript just doesn't know about them, so we cast
|
|
19
|
+
return entries;
|
|
20
|
+
}
|
|
21
|
+
async getHistoryEntry(index) {
|
|
22
|
+
const entry = await super.getHistoryEntry(index);
|
|
23
|
+
return entry;
|
|
24
|
+
}
|
|
25
|
+
async savePrompt(options) {
|
|
26
|
+
// Don't save empty prompts
|
|
27
|
+
if (!options.finalPrompt || !options.finalPrompt.trim()) {
|
|
28
|
+
return '';
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
await fs.ensureDir(this.enhancedHistoryDir);
|
|
32
|
+
const now = options.timestamp || new Date();
|
|
33
|
+
const timestamp = DateFormats.UTC_DATETIME(now);
|
|
34
|
+
// Generate filename using local time: YYYYMMDD-HHMMSS-<random>.json
|
|
35
|
+
const dateStr = DateFormats.YYYYMMDD(now);
|
|
36
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
37
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
38
|
+
const seconds = String(now.getSeconds()).padStart(2, '0');
|
|
39
|
+
const timeStr = `${hours}${minutes}${seconds}`;
|
|
40
|
+
const random = crypto.randomBytes(4).toString('hex');
|
|
41
|
+
const filename = `${dateStr}-${timeStr}-${random}.json`;
|
|
42
|
+
// Gather environment info
|
|
43
|
+
const gitInfo = await getGitInfo();
|
|
44
|
+
const environment = {
|
|
45
|
+
working_directory: process.cwd(),
|
|
46
|
+
node_version: process.version,
|
|
47
|
+
os: process.platform,
|
|
48
|
+
...(gitInfo.gitDir && { git_dir: gitInfo.gitDir }),
|
|
49
|
+
...(gitInfo.branch && { git_branch: gitInfo.branch }),
|
|
50
|
+
...(gitInfo.commit && { git_commit: gitInfo.commit }),
|
|
51
|
+
...(gitInfo.isDirty !== undefined && { git_dirty: gitInfo.isDirty }),
|
|
52
|
+
...(process.env.SHELL && { shell: process.env.SHELL })
|
|
53
|
+
};
|
|
54
|
+
// Build execution info if provided
|
|
55
|
+
let execution;
|
|
56
|
+
if (options.startTime) {
|
|
57
|
+
const endTime = options.endTime || new Date();
|
|
58
|
+
let duration = formatDuration(options.startTime, endTime);
|
|
59
|
+
let activeTime;
|
|
60
|
+
let userInputCount;
|
|
61
|
+
// If we have a JSON output file, calculate active execution time
|
|
62
|
+
if (options.outputFile && options.outputFile.endsWith('.json')) {
|
|
63
|
+
try {
|
|
64
|
+
const activeNanos = await calculateActiveExecutionTime(options.outputFile);
|
|
65
|
+
const activeMs = Number(activeNanos / 1000000n);
|
|
66
|
+
activeTime = `${activeMs}ms`;
|
|
67
|
+
// Also get user input count
|
|
68
|
+
const userInputs = await extractUserInputLines(options.outputFile);
|
|
69
|
+
userInputCount = userInputs.length;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// If calculation fails, just use the provided execution time
|
|
73
|
+
if (options.executionTime) {
|
|
74
|
+
activeTime = `${options.executionTime}ms`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (options.executionTime) {
|
|
79
|
+
// Use the execution time from run.ts if no JSON file
|
|
80
|
+
duration = `${options.executionTime}ms`;
|
|
81
|
+
}
|
|
82
|
+
execution = {
|
|
83
|
+
start_time: options.startTime.toISOString(),
|
|
84
|
+
end_time: endTime.toISOString(),
|
|
85
|
+
duration,
|
|
86
|
+
exit_code: options.exitCode ?? null,
|
|
87
|
+
command: options.command || 'unknown',
|
|
88
|
+
...(options.outputFile && { output_file: options.outputFile }),
|
|
89
|
+
...(options.outputSize !== undefined && { output_size: options.outputSize }),
|
|
90
|
+
...(activeTime && { active_time: activeTime }),
|
|
91
|
+
...(userInputCount !== undefined && { user_input_count: userInputCount })
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Create enhanced history entry
|
|
95
|
+
const entry = {
|
|
96
|
+
timestamp,
|
|
97
|
+
templatePath: options.templatePath,
|
|
98
|
+
templateContent: options.templateContent,
|
|
99
|
+
variables: sanitizeObject(Object.fromEntries(options.variables)),
|
|
100
|
+
finalPrompt: options.finalPrompt,
|
|
101
|
+
title: options.title,
|
|
102
|
+
summary: options.summary,
|
|
103
|
+
environment,
|
|
104
|
+
...(execution && { execution })
|
|
105
|
+
};
|
|
106
|
+
// Save to history
|
|
107
|
+
const filePath = path.join(this.enhancedHistoryDir, filename);
|
|
108
|
+
await fs.writeJson(filePath, entry, { spaces: 2 });
|
|
109
|
+
return filename;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw new Error(`Failed to save prompt to history: ${error instanceof Error ? error.message : String(error)}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=enhanced-history-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-history-manager.js","sourceRoot":"","sources":["../../src/history/enhanced-history-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AnnotationMetadata } from '../types/annotations.js';
|
|
2
|
+
import { EnhancedHistoryEntry, HistoryEntry } from '../types/history.js';
|
|
3
|
+
interface HistorySaveOptions {
|
|
4
|
+
templatePath: string;
|
|
5
|
+
templateContent: string;
|
|
6
|
+
variables: Map<string, unknown>;
|
|
7
|
+
finalPrompt: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
summary?: string;
|
|
10
|
+
timestamp?: Date;
|
|
11
|
+
outputFile?: string;
|
|
12
|
+
outputSize?: number;
|
|
13
|
+
executionTime?: number;
|
|
14
|
+
exitCode?: number | null;
|
|
15
|
+
filenameComponents?: {
|
|
16
|
+
dateStr: string;
|
|
17
|
+
timeStr: string;
|
|
18
|
+
randomSuffix: string;
|
|
19
|
+
};
|
|
20
|
+
rerunFrom?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare class HistoryManager {
|
|
23
|
+
private historyDir;
|
|
24
|
+
private annotationDir?;
|
|
25
|
+
constructor(historyDir: string, annotationDir?: string | undefined);
|
|
26
|
+
savePrompt(options: HistorySaveOptions): Promise<string>;
|
|
27
|
+
listHistory(limit?: number, filterOptions?: {
|
|
28
|
+
gitDir?: string;
|
|
29
|
+
workingDir?: string;
|
|
30
|
+
includeLegacy?: boolean;
|
|
31
|
+
}): Promise<HistoryEntry[]>;
|
|
32
|
+
getTotalCount(filterOptions?: {
|
|
33
|
+
gitDir?: string;
|
|
34
|
+
workingDir?: string;
|
|
35
|
+
includeLegacy?: boolean;
|
|
36
|
+
}): Promise<number>;
|
|
37
|
+
getHistoryEntry(index: number): Promise<HistoryEntry | null>;
|
|
38
|
+
getAnnotationsForHistoryEntry(historyEntry: HistoryEntry): Promise<string[]>;
|
|
39
|
+
private maskSensitiveVariables;
|
|
40
|
+
saveAnnotation(historyEntry: HistoryEntry | EnhancedHistoryEntry, metadata: AnnotationMetadata, notes?: string): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=history-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-manager.d.ts","sourceRoot":"","sources":["../../src/history/history-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAC,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxE,UAAU,kBAAkB;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;IAEjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,kBAAkB,CAAC,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAGD,qBAAa,cAAc;IAEvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa,CAAC;gBADd,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,YAAA;IAG1B,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAiExD,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsEvI,aAAa,CAAC,aAAa,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBjH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA2B5D,6BAA6B,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkClF,OAAO,CAAC,sBAAsB;IAKxB,cAAc,CAClB,YAAY,EAAE,YAAY,GAAG,oBAAoB,EACjD,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;CA8BjB"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
+
import { DateFormats } from '../utils/date-formatter.js';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
import { sanitizeObject } from '../utils/security.js';
|
|
8
|
+
export class HistoryManager {
|
|
9
|
+
historyDir;
|
|
10
|
+
annotationDir;
|
|
11
|
+
constructor(historyDir, annotationDir) {
|
|
12
|
+
this.historyDir = historyDir;
|
|
13
|
+
this.annotationDir = annotationDir;
|
|
14
|
+
}
|
|
15
|
+
async savePrompt(options) {
|
|
16
|
+
// Don't save empty prompts
|
|
17
|
+
if (!options.finalPrompt || !options.finalPrompt.trim()) {
|
|
18
|
+
return '';
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
await fs.ensureDir(this.historyDir);
|
|
22
|
+
const now = options.timestamp || new Date();
|
|
23
|
+
const timestamp = DateFormats.UTC_DATETIME(now);
|
|
24
|
+
// Use provided filename components or generate new ones
|
|
25
|
+
let dateStr;
|
|
26
|
+
let timeStr;
|
|
27
|
+
let randomSuffix;
|
|
28
|
+
if (options.filenameComponents) {
|
|
29
|
+
// Use provided components for synchronized naming
|
|
30
|
+
({ dateStr, timeStr, randomSuffix } = options.filenameComponents);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Generate filename using local time: YYYYMMDD-HHMMSS-<random>.json
|
|
34
|
+
dateStr = DateFormats.YYYYMMDD(now);
|
|
35
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
36
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
37
|
+
const seconds = String(now.getSeconds()).padStart(2, '0');
|
|
38
|
+
timeStr = `${hours}${minutes}${seconds}`;
|
|
39
|
+
randomSuffix = crypto.randomBytes(4).toString('hex');
|
|
40
|
+
}
|
|
41
|
+
const filename = `${dateStr}-${timeStr}-${randomSuffix}.json`;
|
|
42
|
+
// Create history entry
|
|
43
|
+
const entry = {
|
|
44
|
+
timestamp,
|
|
45
|
+
templatePath: options.templatePath,
|
|
46
|
+
templateContent: options.templateContent,
|
|
47
|
+
variables: this.maskSensitiveVariables(options.variables),
|
|
48
|
+
finalPrompt: options.finalPrompt,
|
|
49
|
+
title: options.title,
|
|
50
|
+
summary: options.summary,
|
|
51
|
+
...(options.rerunFrom && { rerun: options.rerunFrom })
|
|
52
|
+
};
|
|
53
|
+
// Add execution metadata if provided (for output capture)
|
|
54
|
+
if (options.outputFile || options.executionTime || options.exitCode !== undefined) {
|
|
55
|
+
entry.execution = {
|
|
56
|
+
...(options.outputFile && { output_file: path.relative(this.historyDir, options.outputFile).split(path.sep).join('/') }),
|
|
57
|
+
...(options.outputSize !== undefined && { output_size: options.outputSize }),
|
|
58
|
+
...(options.executionTime !== undefined && { duration_ms: options.executionTime }),
|
|
59
|
+
...(options.exitCode !== undefined && { exit_code: options.exitCode })
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Save to history
|
|
63
|
+
const filePath = path.join(this.historyDir, filename);
|
|
64
|
+
await fs.writeJson(filePath, entry, { spaces: 2 });
|
|
65
|
+
return filename;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`Failed to save prompt to history: ${error instanceof Error ? error.message : String(error)}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async listHistory(limit, filterOptions) {
|
|
72
|
+
try {
|
|
73
|
+
await fs.ensureDir(this.historyDir);
|
|
74
|
+
const files = await fs.readdir(this.historyDir);
|
|
75
|
+
// Filter for JSON files with expected format
|
|
76
|
+
const historyFiles = files.filter(f => f.match(/^\d{8}-\d{6}-[a-f0-9]{8}\.json$/));
|
|
77
|
+
// Sort by date (oldest first)
|
|
78
|
+
historyFiles.sort();
|
|
79
|
+
// Load entries (we need to load all to filter)
|
|
80
|
+
let entries = [];
|
|
81
|
+
for (const filename of historyFiles) {
|
|
82
|
+
try {
|
|
83
|
+
const filePath = path.join(this.historyDir, filename);
|
|
84
|
+
const entry = await fs.readJson(filePath);
|
|
85
|
+
entries.push({ ...entry, filename });
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Skip invalid files silently in tests
|
|
89
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
90
|
+
logger.warn(`Skipping invalid history file: ${filename}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Apply directory filtering if specified
|
|
95
|
+
if (filterOptions?.gitDir || filterOptions?.workingDir) {
|
|
96
|
+
entries = entries.filter(entry => {
|
|
97
|
+
const enhancedEntry = entry;
|
|
98
|
+
const env = enhancedEntry.environment;
|
|
99
|
+
// Backwards compatibility: entries without environment info or without git_dir
|
|
100
|
+
// are treated as belonging to the current directory when includeLegacy is true
|
|
101
|
+
if (!env || !env.git_dir) {
|
|
102
|
+
return filterOptions.includeLegacy === true;
|
|
103
|
+
}
|
|
104
|
+
// If gitDir filter is specified, match against git_dir
|
|
105
|
+
if (filterOptions.gitDir) {
|
|
106
|
+
if (env.git_dir === filterOptions.gitDir) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// If workingDir filter is specified, match against working_directory
|
|
111
|
+
if (filterOptions.workingDir) {
|
|
112
|
+
if (env.working_directory === filterOptions.workingDir) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Apply limit if specified (get most recent entries)
|
|
120
|
+
const limitedEntries = limit ? entries.slice(-limit) : entries;
|
|
121
|
+
return limitedEntries;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error?.code === 'ENOENT') {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async getTotalCount(filterOptions) {
|
|
131
|
+
try {
|
|
132
|
+
// If filtering is requested, we need to load and count matching entries
|
|
133
|
+
if (filterOptions?.gitDir || filterOptions?.workingDir) {
|
|
134
|
+
const entries = await this.listHistory(undefined, filterOptions);
|
|
135
|
+
return entries.length;
|
|
136
|
+
}
|
|
137
|
+
await fs.ensureDir(this.historyDir);
|
|
138
|
+
const files = await fs.readdir(this.historyDir);
|
|
139
|
+
// Count JSON files with expected format
|
|
140
|
+
const historyFiles = files.filter(f => f.match(/^\d{8}-\d{6}-[a-f0-9]{8}\.json$/));
|
|
141
|
+
return historyFiles.length;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
if (error?.code === 'ENOENT') {
|
|
145
|
+
return 0;
|
|
146
|
+
}
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async getHistoryEntry(index) {
|
|
151
|
+
try {
|
|
152
|
+
// Get all history files sorted by date (oldest first)
|
|
153
|
+
const files = await fs.readdir(this.historyDir);
|
|
154
|
+
const historyFiles = files
|
|
155
|
+
.filter(f => f.match(/^\d{8}-\d{6}-[a-f0-9]{8}\.json$/))
|
|
156
|
+
.sort();
|
|
157
|
+
// Check if index is valid (1-based)
|
|
158
|
+
if (index < 1 || index > historyFiles.length) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
// Load the entry (convert 1-based to 0-based index)
|
|
162
|
+
const filename = historyFiles[index - 1];
|
|
163
|
+
const filePath = path.join(this.historyDir, filename);
|
|
164
|
+
const entry = await fs.readJson(filePath);
|
|
165
|
+
return { ...entry, filename };
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
169
|
+
logger.error(`Failed to get history entry ${index}: ${error instanceof Error ? error.message : String(error)}`);
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async getAnnotationsForHistoryEntry(historyEntry) {
|
|
175
|
+
if (!this.annotationDir) {
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
await fs.ensureDir(this.annotationDir);
|
|
180
|
+
const files = await fs.readdir(this.annotationDir);
|
|
181
|
+
// Extract basename from history entry
|
|
182
|
+
const historyBasename = path.basename(historyEntry.filename, '.json');
|
|
183
|
+
// Find annotation files that match this history entry (both .md and .json)
|
|
184
|
+
const annotationFiles = files.filter(file => file.startsWith(`${historyBasename}-annotation-`) && (file.endsWith('.md') || file.endsWith('.json')));
|
|
185
|
+
// Read and return the content of each annotation
|
|
186
|
+
const annotations = [];
|
|
187
|
+
for (const file of annotationFiles) {
|
|
188
|
+
const content = await fs.readFile(path.join(this.annotationDir, file), 'utf-8');
|
|
189
|
+
annotations.push(content);
|
|
190
|
+
}
|
|
191
|
+
return annotations;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
195
|
+
logger.error(`Failed to get annotations: ${error instanceof Error ? error.message : String(error)}`);
|
|
196
|
+
}
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
maskSensitiveVariables(variables) {
|
|
201
|
+
const obj = Object.fromEntries(variables);
|
|
202
|
+
return sanitizeObject(obj);
|
|
203
|
+
}
|
|
204
|
+
async saveAnnotation(historyEntry, metadata, notes) {
|
|
205
|
+
if (!this.annotationDir) {
|
|
206
|
+
logger.warn('Annotation directory not configured, skipping annotation save');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
await fs.ensureDir(this.annotationDir);
|
|
210
|
+
// Create JSON content with all metadata and notes
|
|
211
|
+
const annotationData = {
|
|
212
|
+
...metadata,
|
|
213
|
+
notes: notes || (metadata.auto_detected ? 'Auto-generated annotation' : '')
|
|
214
|
+
};
|
|
215
|
+
// Create filename based on history entry
|
|
216
|
+
const historyBasename = path.basename(historyEntry.filename || `${historyEntry.timestamp}.json`, '.json');
|
|
217
|
+
const filename = `${historyBasename}-annotation-${uuidv4()}.json`;
|
|
218
|
+
const filepath = path.join(this.annotationDir, filename);
|
|
219
|
+
try {
|
|
220
|
+
await fs.writeJson(filepath, annotationData, { spaces: 2 });
|
|
221
|
+
logger.debug(`Auto-annotation saved to ${filepath}`);
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
logger.error(`Failed to save annotation: ${error instanceof Error ? error.message : String(error)}`);
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=history-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-manager.js","sourceRoot":"","sources":["../../src/history/history-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Theme } from '@inquirer/core';
|
|
2
|
+
import type { PartialDeep } from '@inquirer/type';
|
|
3
|
+
export interface FileSearchConfig {
|
|
4
|
+
message: string;
|
|
5
|
+
basePath?: string;
|
|
6
|
+
filter?: string;
|
|
7
|
+
default?: string;
|
|
8
|
+
theme?: PartialDeep<Theme>;
|
|
9
|
+
}
|
|
10
|
+
export declare function fileSearchPrompt(config: FileSearchConfig): Promise<string>;
|
|
11
|
+
//# sourceMappingURL=file-search-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-search-prompt.d.ts","sourceRoot":"","sources":["../../../src/prompts/input-types/file-search-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;CAC5B;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDhF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { search } from '@inquirer/prompts';
|
|
2
|
+
import { FileSearchEngine } from '@pupt/lib';
|
|
3
|
+
export async function fileSearchPrompt(config) {
|
|
4
|
+
const searchEngine = await FileSearchEngine.create({ basePath: config.basePath || '.', filter: config.filter });
|
|
5
|
+
return await search({
|
|
6
|
+
message: config.message,
|
|
7
|
+
source: async (input, { signal }) => {
|
|
8
|
+
// CRITICAL: This function is called on EVERY keystroke
|
|
9
|
+
// ensuring real-time updates as the user types
|
|
10
|
+
// If no input, show contents of current directory
|
|
11
|
+
if (!input) {
|
|
12
|
+
const currentDirFiles = await searchEngine.listDirectory(config.basePath || '.');
|
|
13
|
+
return currentDirFiles.map(file => {
|
|
14
|
+
const formatted = searchEngine.formatFileInfo(file);
|
|
15
|
+
return {
|
|
16
|
+
name: formatted.display,
|
|
17
|
+
value: formatted.value,
|
|
18
|
+
description: formatted.description,
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
// Always return results, even for partial input
|
|
23
|
+
// Example: "des" should immediately return ["design/", "desktop.ini", etc.]
|
|
24
|
+
const results = await searchEngine.search(input, signal);
|
|
25
|
+
const choices = results.map(file => {
|
|
26
|
+
const formatted = searchEngine.formatFileInfo(file);
|
|
27
|
+
return {
|
|
28
|
+
name: formatted.display,
|
|
29
|
+
value: formatted.value,
|
|
30
|
+
description: formatted.description,
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
// Add option to use the manually typed path if it doesn't exist in results
|
|
34
|
+
// Only add this option if the input looks like a valid path
|
|
35
|
+
if (input && input.trim() !== '') {
|
|
36
|
+
const normalizedInput = searchEngine.normalizePathInput(input);
|
|
37
|
+
const absolutePath = searchEngine.resolveToAbsolutePath(normalizedInput);
|
|
38
|
+
// Check if this exact path is already in the results
|
|
39
|
+
const pathAlreadyInResults = choices.some(choice => choice.value === absolutePath);
|
|
40
|
+
if (!pathAlreadyInResults) {
|
|
41
|
+
// Add the manual input option at the end
|
|
42
|
+
choices.push({
|
|
43
|
+
name: `📝 Use typed path: ${input}`,
|
|
44
|
+
value: absolutePath,
|
|
45
|
+
description: 'Create or use non-existent file',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return choices;
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=file-search-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-search-prompt.js","sourceRoot":"","sources":["../../../src/prompts/input-types/file-search-prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAU7C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAwB;IAC7D,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhH,OAAO,MAAM,MAAM,CAAS;QAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,KAAK,EAAE,KAAyB,EAAE,EAAE,MAAM,EAA2B,EAAE,EAAE;YAC/E,uDAAuD;YACvD,+CAA+C;YAE/C,kDAAkD;YAClD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;gBACjF,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAChC,MAAM,SAAS,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;oBACpD,OAAO;wBACL,IAAI,EAAE,SAAS,CAAC,OAAO;wBACvB,KAAK,EAAE,SAAS,CAAC,KAAK;wBACtB,WAAW,EAAE,SAAS,CAAC,WAAW;qBACnC,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;YAED,gDAAgD;YAChD,4EAA4E;YAC5E,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEzD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACjC,MAAM,SAAS,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACpD,OAAO;oBACL,IAAI,EAAE,SAAS,CAAC,OAAO;oBACvB,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,WAAW,EAAE,SAAS,CAAC,WAAW;iBACnC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,2EAA2E;YAC3E,4DAA4D;YAC5D,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACjC,MAAM,eAAe,GAAG,YAAY,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/D,MAAM,YAAY,GAAG,YAAY,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;gBAEzE,qDAAqD;gBACrD,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC;gBAEnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,yCAAyC;oBACzC,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,sBAAsB,KAAK,EAAE;wBACnC,KAAK,EAAE,YAAY;wBACnB,WAAW,EAAE,iCAAiC;qBAC/C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-file-prompt.d.ts","sourceRoot":"","sources":["../../../src/prompts/input-types/review-file-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAmB,MAAM,yBAAyB,CAAC;AAEjF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { fileSearchPrompt } from './file-search-prompt.js';
|
|
2
|
+
export async function reviewFilePrompt(config) {
|
|
3
|
+
// For now, reviewFile behaves exactly like file input
|
|
4
|
+
// The review will happen after the run command completes
|
|
5
|
+
const selectedFile = await fileSearchPrompt(config);
|
|
6
|
+
// Return the selected file path
|
|
7
|
+
return selectedFile;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=review-file-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-file-prompt.js","sourceRoot":"","sources":["../../../src/prompts/input-types/review-file-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAwB;IAC7D,sDAAsD;IACtD,yDAAyD;IACzD,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEpD,gCAAgC;IAChC,OAAO,YAAY,CAAC;AACtB,CAAC"}
|