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,10 @@
|
|
|
1
|
+
export declare const DateFormats: {
|
|
2
|
+
YYYYMMDD: (date: Date) => string;
|
|
3
|
+
UTC_DATETIME: (date: Date) => string;
|
|
4
|
+
LOCAL_DATE: (date: Date) => string;
|
|
5
|
+
LOCAL_TIME: (date: Date) => string;
|
|
6
|
+
LOCAL_DATETIME: (date: Date) => string;
|
|
7
|
+
RELATIVE: (date: Date) => string;
|
|
8
|
+
};
|
|
9
|
+
export declare function formatDate(date: Date, format: keyof typeof DateFormats): string;
|
|
10
|
+
//# sourceMappingURL=date-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/date-formatter.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;qBACL,IAAI,KAAG,MAAM;yBAOT,IAAI,KAAG,MAAM;uBAIf,IAAI,KAAG,MAAM;uBAIb,IAAI,KAAG,MAAM;2BAIT,IAAI,KAAG,MAAM;qBAInB,IAAI,KAAG,MAAM;CAa/B,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,OAAO,WAAW,GAAG,MAAM,CAM/E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const DateFormats = {
|
|
2
|
+
YYYYMMDD: (date) => {
|
|
3
|
+
const year = date.getFullYear();
|
|
4
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
5
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
6
|
+
return `${year}${month}${day}`;
|
|
7
|
+
},
|
|
8
|
+
UTC_DATETIME: (date) => {
|
|
9
|
+
return date.toISOString();
|
|
10
|
+
},
|
|
11
|
+
LOCAL_DATE: (date) => {
|
|
12
|
+
return date.toLocaleDateString();
|
|
13
|
+
},
|
|
14
|
+
LOCAL_TIME: (date) => {
|
|
15
|
+
return date.toLocaleTimeString();
|
|
16
|
+
},
|
|
17
|
+
LOCAL_DATETIME: (date) => {
|
|
18
|
+
return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
19
|
+
},
|
|
20
|
+
RELATIVE: (date) => {
|
|
21
|
+
const now = new Date();
|
|
22
|
+
const diff = now.getTime() - date.getTime();
|
|
23
|
+
const seconds = Math.floor(diff / 1000);
|
|
24
|
+
const minutes = Math.floor(seconds / 60);
|
|
25
|
+
const hours = Math.floor(minutes / 60);
|
|
26
|
+
const days = Math.floor(hours / 24);
|
|
27
|
+
if (days > 0)
|
|
28
|
+
return `${days} day${days > 1 ? 's' : ''} ago`;
|
|
29
|
+
if (hours > 0)
|
|
30
|
+
return `${hours} hour${hours > 1 ? 's' : ''} ago`;
|
|
31
|
+
if (minutes > 0)
|
|
32
|
+
return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;
|
|
33
|
+
return 'just now';
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
export function formatDate(date, format) {
|
|
37
|
+
const formatter = DateFormats[format];
|
|
38
|
+
if (!formatter) {
|
|
39
|
+
throw new Error(`Unknown date format: ${format}`);
|
|
40
|
+
}
|
|
41
|
+
return formatter(date);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=date-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-formatter.js","sourceRoot":"","sources":["../../src/utils/date-formatter.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ,EAAE,CAAC,IAAU,EAAU,EAAE;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpD,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC;IACjC,CAAC;IAED,YAAY,EAAE,CAAC,IAAU,EAAU,EAAE;QACnC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,UAAU,EAAE,CAAC,IAAU,EAAU,EAAE;QACjC,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACnC,CAAC;IAED,UAAU,EAAE,CAAC,IAAU,EAAU,EAAE;QACjC,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACnC,CAAC;IAED,cAAc,EAAE,CAAC,IAAU,EAAU,EAAE;QACrC,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;IACrE,CAAC;IAED,QAAQ,EAAE,CAAC,IAAU,EAAU,EAAE;QAC/B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAEpC,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAC7D,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,GAAG,KAAK,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QACjE,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,GAAG,OAAO,UAAU,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QACzE,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,MAAgC;IACrE,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface EditorLauncher {
|
|
2
|
+
findEditor(): Promise<string | null>;
|
|
3
|
+
isEditorAvailable(editor: string): Promise<boolean>;
|
|
4
|
+
openInEditor(editor: string, filepath: string): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare class DefaultEditorLauncher implements EditorLauncher {
|
|
7
|
+
private static readonly COMMON_EDITORS;
|
|
8
|
+
findEditor(): Promise<string | null>;
|
|
9
|
+
isEditorAvailable(editor: string): Promise<boolean>;
|
|
10
|
+
openInEditor(editor: string, filepath: string): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare const editorLauncher: DefaultEditorLauncher;
|
|
13
|
+
//# sourceMappingURL=editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/utils/editor.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CASpC;IAEI,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiBpC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAanD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBpE;AAED,eAAO,MAAM,cAAc,uBAA8B,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { execFile } from 'node:child_process';
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
export class DefaultEditorLauncher {
|
|
6
|
+
static COMMON_EDITORS = [
|
|
7
|
+
'code',
|
|
8
|
+
'vim',
|
|
9
|
+
'nano',
|
|
10
|
+
'emacs',
|
|
11
|
+
'subl',
|
|
12
|
+
'atom',
|
|
13
|
+
'gedit',
|
|
14
|
+
'notepad'
|
|
15
|
+
];
|
|
16
|
+
async findEditor() {
|
|
17
|
+
// Check environment variables first
|
|
18
|
+
const envEditor = process.env.VISUAL || process.env.EDITOR;
|
|
19
|
+
if (envEditor && await this.isEditorAvailable(envEditor)) {
|
|
20
|
+
return envEditor;
|
|
21
|
+
}
|
|
22
|
+
// Try common editors
|
|
23
|
+
for (const editor of DefaultEditorLauncher.COMMON_EDITORS) {
|
|
24
|
+
if (await this.isEditorAvailable(editor)) {
|
|
25
|
+
return editor;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
async isEditorAvailable(editor) {
|
|
31
|
+
try {
|
|
32
|
+
if (process.platform === 'win32') {
|
|
33
|
+
await execFileAsync('where', [editor]);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
await execFileAsync('which', [editor]);
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async openInEditor(editor, filepath) {
|
|
45
|
+
return new Promise((resolve, reject) => {
|
|
46
|
+
const child = spawn(editor, [filepath], {
|
|
47
|
+
stdio: 'inherit'
|
|
48
|
+
});
|
|
49
|
+
child.on('error', reject);
|
|
50
|
+
child.on('exit', (code) => {
|
|
51
|
+
if (code === 0) {
|
|
52
|
+
resolve();
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
reject(new Error(`Editor exited with code ${code}`));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export const editorLauncher = new DefaultEditorLauncher();
|
|
62
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/utils/editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAU,cAAc,GAAG;QACvC,MAAM;QACN,KAAK;QACL,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM;QACN,OAAO;QACP,SAAS;KACV,CAAC;IAEF,KAAK,CAAC,UAAU;QACd,oCAAoC;QACpC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAC3D,IAAI,SAAS,IAAI,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,MAAM,IAAI,qBAAqB,CAAC,cAAc,EAAE,CAAC;YAC1D,IAAI,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc;QACpC,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,QAAgB;QACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;gBACtC,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;;AAGH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export declare enum ErrorCategory {
|
|
2
|
+
USER_ERROR = "USER_ERROR",
|
|
3
|
+
CONFIG_ERROR = "CONFIG_ERROR",
|
|
4
|
+
FILE_SYSTEM_ERROR = "FILE_SYSTEM_ERROR",
|
|
5
|
+
NETWORK_ERROR = "NETWORK_ERROR",
|
|
6
|
+
EXTERNAL_TOOL_ERROR = "EXTERNAL_TOOL_ERROR",
|
|
7
|
+
SYSTEM_ERROR = "SYSTEM_ERROR",
|
|
8
|
+
UNKNOWN = "UNKNOWN"
|
|
9
|
+
}
|
|
10
|
+
export declare enum ErrorSeverity {
|
|
11
|
+
WARNING = "WARNING",
|
|
12
|
+
ERROR = "ERROR",
|
|
13
|
+
FATAL = "FATAL"
|
|
14
|
+
}
|
|
15
|
+
export interface ErrorSuggestion {
|
|
16
|
+
text: string;
|
|
17
|
+
command?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class PromptToolError extends Error {
|
|
20
|
+
code: string;
|
|
21
|
+
category: ErrorCategory;
|
|
22
|
+
severity: ErrorSeverity;
|
|
23
|
+
suggestions: ErrorSuggestion[];
|
|
24
|
+
icon: string;
|
|
25
|
+
constructor(message: string, code: string, category?: ErrorCategory, severity?: ErrorSeverity, suggestions?: ErrorSuggestion[], icon?: string);
|
|
26
|
+
}
|
|
27
|
+
export interface ErrorOptions {
|
|
28
|
+
message: string;
|
|
29
|
+
code: string;
|
|
30
|
+
category?: ErrorCategory;
|
|
31
|
+
severity?: ErrorSeverity;
|
|
32
|
+
suggestions?: ErrorSuggestion[];
|
|
33
|
+
icon?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function createError(options: ErrorOptions): PromptToolError;
|
|
36
|
+
export declare function isRecoverableError(error: unknown): boolean;
|
|
37
|
+
export declare function getErrorCategory(error: unknown): ErrorCategory;
|
|
38
|
+
export declare function displayError(error: PromptToolError | Error): void;
|
|
39
|
+
export declare const errors: {
|
|
40
|
+
fileNotFound: (path: string) => PromptToolError;
|
|
41
|
+
permissionDenied: (path: string) => PromptToolError;
|
|
42
|
+
noPromptsFound: (dirs: string[]) => PromptToolError;
|
|
43
|
+
validationError: (field: string, format: string, example: string) => PromptToolError;
|
|
44
|
+
templateError: (template: string, details: string) => PromptToolError;
|
|
45
|
+
configMissing: () => PromptToolError;
|
|
46
|
+
invalidConfig: (field: string, expected: string, actual: unknown) => PromptToolError;
|
|
47
|
+
featureNotEnabled: (feature: string, benefits: string[]) => PromptToolError;
|
|
48
|
+
toolNotFound: (tool: string, suggestions?: string[]) => PromptToolError;
|
|
49
|
+
noEditor: () => PromptToolError;
|
|
50
|
+
gitError: (details: string) => PromptToolError;
|
|
51
|
+
gitNotInstalled: () => PromptToolError;
|
|
52
|
+
networkError: (url: string, details: string) => PromptToolError;
|
|
53
|
+
historyNotFound: (index: number, total: number) => PromptToolError;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAGA,oBAAY,aAAa;IACvB,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,iBAAiB,sBAAsB;IACvC,aAAa,kBAAkB;IAC/B,mBAAmB,wBAAwB;IAC3C,YAAY,iBAAiB;IAC7B,OAAO,YAAY;CACpB;AAED,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAG/B,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,aAAa;IACvB,WAAW,EAAE,eAAe,EAAE;IAC9B,IAAI,EAAE,MAAM;gBALnB,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,aAAqC,EAC/C,QAAQ,GAAE,aAAmC,EAC7C,WAAW,GAAE,eAAe,EAAO,EACnC,IAAI,GAAE,MAAY;CAK5B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,CASlE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAiB1D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAK9D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,GAAG,IAAI,CA6BjE;AAGD,eAAO,MAAM,MAAM;yBAEI,MAAM;6BAYF,MAAM;2BAaR,MAAM,EAAE;6BAYN,MAAM,UAAU,MAAM,WAAW,MAAM;8BAYtC,MAAM,WAAW,MAAM;;2BAuB1B,MAAM,YAAY,MAAM,UAAU,OAAO;iCAWnC,MAAM,YAAY,MAAM,EAAE;yBAalC,MAAM,gBAAe,MAAM,EAAE;;wBAwB9B,MAAM;;wBA0BN,MAAM,WAAW,MAAM;6BAclB,MAAM,SAAS,MAAM;CAW/C,CAAC"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { logger } from './logger.js';
|
|
3
|
+
export var ErrorCategory;
|
|
4
|
+
(function (ErrorCategory) {
|
|
5
|
+
ErrorCategory["USER_ERROR"] = "USER_ERROR";
|
|
6
|
+
ErrorCategory["CONFIG_ERROR"] = "CONFIG_ERROR";
|
|
7
|
+
ErrorCategory["FILE_SYSTEM_ERROR"] = "FILE_SYSTEM_ERROR";
|
|
8
|
+
ErrorCategory["NETWORK_ERROR"] = "NETWORK_ERROR";
|
|
9
|
+
ErrorCategory["EXTERNAL_TOOL_ERROR"] = "EXTERNAL_TOOL_ERROR";
|
|
10
|
+
ErrorCategory["SYSTEM_ERROR"] = "SYSTEM_ERROR";
|
|
11
|
+
ErrorCategory["UNKNOWN"] = "UNKNOWN";
|
|
12
|
+
})(ErrorCategory || (ErrorCategory = {}));
|
|
13
|
+
export var ErrorSeverity;
|
|
14
|
+
(function (ErrorSeverity) {
|
|
15
|
+
ErrorSeverity["WARNING"] = "WARNING";
|
|
16
|
+
ErrorSeverity["ERROR"] = "ERROR";
|
|
17
|
+
ErrorSeverity["FATAL"] = "FATAL";
|
|
18
|
+
})(ErrorSeverity || (ErrorSeverity = {}));
|
|
19
|
+
export class PromptToolError extends Error {
|
|
20
|
+
code;
|
|
21
|
+
category;
|
|
22
|
+
severity;
|
|
23
|
+
suggestions;
|
|
24
|
+
icon;
|
|
25
|
+
constructor(message, code, category = ErrorCategory.UNKNOWN, severity = ErrorSeverity.ERROR, suggestions = [], icon = '❌') {
|
|
26
|
+
super(message);
|
|
27
|
+
this.code = code;
|
|
28
|
+
this.category = category;
|
|
29
|
+
this.severity = severity;
|
|
30
|
+
this.suggestions = suggestions;
|
|
31
|
+
this.icon = icon;
|
|
32
|
+
this.name = 'PromptToolError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function createError(options) {
|
|
36
|
+
return new PromptToolError(options.message, options.code, options.category ?? ErrorCategory.UNKNOWN, options.severity ?? ErrorSeverity.ERROR, options.suggestions ?? [], options.icon ?? '❌');
|
|
37
|
+
}
|
|
38
|
+
export function isRecoverableError(error) {
|
|
39
|
+
if (!(error instanceof PromptToolError)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
if (error.severity === ErrorSeverity.FATAL) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const recoverableCategories = [
|
|
46
|
+
ErrorCategory.USER_ERROR,
|
|
47
|
+
ErrorCategory.CONFIG_ERROR,
|
|
48
|
+
ErrorCategory.NETWORK_ERROR,
|
|
49
|
+
ErrorCategory.EXTERNAL_TOOL_ERROR
|
|
50
|
+
];
|
|
51
|
+
return recoverableCategories.includes(error.category);
|
|
52
|
+
}
|
|
53
|
+
export function getErrorCategory(error) {
|
|
54
|
+
if (error instanceof PromptToolError) {
|
|
55
|
+
return error.category;
|
|
56
|
+
}
|
|
57
|
+
return ErrorCategory.UNKNOWN;
|
|
58
|
+
}
|
|
59
|
+
export function displayError(error) {
|
|
60
|
+
if (error instanceof PromptToolError) {
|
|
61
|
+
const prefix = error.severity === ErrorSeverity.FATAL
|
|
62
|
+
? chalk.bgRed.white(' FATAL ERROR: ')
|
|
63
|
+
: error.severity === ErrorSeverity.WARNING
|
|
64
|
+
? chalk.yellow('Warning:')
|
|
65
|
+
: chalk.red('Error:');
|
|
66
|
+
const displayFn = error.severity === ErrorSeverity.WARNING ? logger.warn.bind(logger) : logger.error.bind(logger);
|
|
67
|
+
displayFn(`${error.icon} ${prefix} ${error.message}`);
|
|
68
|
+
if (error.suggestions.length > 0) {
|
|
69
|
+
displayFn(chalk.yellow('\n💡 Suggestions:'));
|
|
70
|
+
error.suggestions.forEach(suggestion => {
|
|
71
|
+
displayFn(chalk.dim(` • ${suggestion.text}`));
|
|
72
|
+
if (suggestion.command) {
|
|
73
|
+
displayFn(chalk.green(` ▶️ ${suggestion.command}`));
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
logger.error(chalk.red('Error:'), error.message);
|
|
80
|
+
}
|
|
81
|
+
if (process.env.DEBUG === 'true') {
|
|
82
|
+
logger.error(chalk.dim('\nStack trace:'));
|
|
83
|
+
logger.error(chalk.dim(error.stack || 'No stack trace available'));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Common error creators
|
|
87
|
+
export const errors = {
|
|
88
|
+
// File System Errors
|
|
89
|
+
fileNotFound: (path) => createError({
|
|
90
|
+
message: `File not found: ${path}`,
|
|
91
|
+
code: 'FILE_NOT_FOUND',
|
|
92
|
+
category: ErrorCategory.FILE_SYSTEM_ERROR,
|
|
93
|
+
suggestions: [
|
|
94
|
+
{ text: 'Check if the file exists', command: `ls -la "${path}"` },
|
|
95
|
+
{ text: 'Verify the path is correct' },
|
|
96
|
+
{ text: 'Use absolute paths to avoid confusion' }
|
|
97
|
+
],
|
|
98
|
+
icon: '📄'
|
|
99
|
+
}),
|
|
100
|
+
permissionDenied: (path) => createError({
|
|
101
|
+
message: `Permission denied: ${path}`,
|
|
102
|
+
code: 'PERMISSION_DENIED',
|
|
103
|
+
category: ErrorCategory.FILE_SYSTEM_ERROR,
|
|
104
|
+
suggestions: [
|
|
105
|
+
{ text: 'Check directory permissions', command: `ls -la "${path}"` },
|
|
106
|
+
{ text: 'Fix permissions', command: `chmod 755 "${path}"` },
|
|
107
|
+
{ text: 'Ensure directory exists', command: `mkdir -p "${path}"` }
|
|
108
|
+
],
|
|
109
|
+
icon: '🔒'
|
|
110
|
+
}),
|
|
111
|
+
// User Errors
|
|
112
|
+
noPromptsFound: (dirs) => createError({
|
|
113
|
+
message: `No prompts found in: ${dirs.join(', ')}`,
|
|
114
|
+
code: 'NO_PROMPTS',
|
|
115
|
+
category: ErrorCategory.USER_ERROR,
|
|
116
|
+
suggestions: [
|
|
117
|
+
{ text: 'Create a new prompt interactively', command: 'pt add' },
|
|
118
|
+
{ text: 'Generate a sample prompt', command: 'pt example' },
|
|
119
|
+
{ text: `Create a .md file in one of the directories` }
|
|
120
|
+
],
|
|
121
|
+
icon: '🔍'
|
|
122
|
+
}),
|
|
123
|
+
validationError: (field, format, example) => createError({
|
|
124
|
+
message: `Invalid ${field}`,
|
|
125
|
+
code: 'VALIDATION_ERROR',
|
|
126
|
+
category: ErrorCategory.USER_ERROR,
|
|
127
|
+
severity: ErrorSeverity.WARNING,
|
|
128
|
+
suggestions: [
|
|
129
|
+
{ text: `Expected format: ${format}` },
|
|
130
|
+
{ text: `Example: ${example}` }
|
|
131
|
+
],
|
|
132
|
+
icon: '✏️'
|
|
133
|
+
}),
|
|
134
|
+
templateError: (template, details) => createError({
|
|
135
|
+
message: `Template error in "${template}": ${details}`,
|
|
136
|
+
code: 'TEMPLATE_ERROR',
|
|
137
|
+
category: ErrorCategory.USER_ERROR,
|
|
138
|
+
suggestions: [
|
|
139
|
+
{ text: 'Check template syntax' },
|
|
140
|
+
{ text: 'Ensure all helpers are closed properly' },
|
|
141
|
+
{ text: 'Verify variable names are correct' }
|
|
142
|
+
],
|
|
143
|
+
icon: '📝'
|
|
144
|
+
}),
|
|
145
|
+
// Configuration Errors
|
|
146
|
+
configMissing: () => createError({
|
|
147
|
+
message: 'No configuration found',
|
|
148
|
+
code: 'NO_CONFIG',
|
|
149
|
+
category: ErrorCategory.CONFIG_ERROR,
|
|
150
|
+
suggestions: [
|
|
151
|
+
{ text: 'Initialize configuration', command: 'pt init' }
|
|
152
|
+
],
|
|
153
|
+
icon: '⚙️'
|
|
154
|
+
}),
|
|
155
|
+
invalidConfig: (field, expected, actual) => createError({
|
|
156
|
+
message: `Configuration error: '${field}' must be ${expected} (found: ${typeof actual})`,
|
|
157
|
+
code: 'INVALID_CONFIG',
|
|
158
|
+
category: ErrorCategory.CONFIG_ERROR,
|
|
159
|
+
suggestions: [
|
|
160
|
+
{ text: `Edit .pt-config.json and fix the '${field}' value` },
|
|
161
|
+
{ text: `Expected format: ${expected}` }
|
|
162
|
+
],
|
|
163
|
+
icon: '⚙️'
|
|
164
|
+
}),
|
|
165
|
+
featureNotEnabled: (feature, benefits) => createError({
|
|
166
|
+
message: `${feature} is not enabled`,
|
|
167
|
+
code: 'FEATURE_DISABLED',
|
|
168
|
+
category: ErrorCategory.CONFIG_ERROR,
|
|
169
|
+
severity: ErrorSeverity.WARNING,
|
|
170
|
+
suggestions: [
|
|
171
|
+
{ text: 'Enable it by running:', command: 'pt init' },
|
|
172
|
+
{ text: `Benefits: ${benefits.join(', ')}` }
|
|
173
|
+
],
|
|
174
|
+
icon: '🎯'
|
|
175
|
+
}),
|
|
176
|
+
// External Tool Errors
|
|
177
|
+
toolNotFound: (tool, suggestions = []) => createError({
|
|
178
|
+
message: `Tool '${tool}' not found`,
|
|
179
|
+
code: 'TOOL_NOT_FOUND',
|
|
180
|
+
category: ErrorCategory.EXTERNAL_TOOL_ERROR,
|
|
181
|
+
suggestions: [
|
|
182
|
+
...suggestions.map(s => ({ text: `Did you mean '${s}'?` })),
|
|
183
|
+
{ text: 'Check if installed', command: `which ${tool}` },
|
|
184
|
+
{ text: 'Install if needed', command: `npm install -g ${tool}` }
|
|
185
|
+
],
|
|
186
|
+
icon: '🔧'
|
|
187
|
+
}),
|
|
188
|
+
noEditor: () => createError({
|
|
189
|
+
message: 'No editor configured',
|
|
190
|
+
code: 'NO_EDITOR',
|
|
191
|
+
category: ErrorCategory.EXTERNAL_TOOL_ERROR,
|
|
192
|
+
suggestions: [
|
|
193
|
+
{ text: 'Set your editor:', command: 'export EDITOR=vim' },
|
|
194
|
+
{ text: 'For VS Code:', command: 'export EDITOR="code --wait"' },
|
|
195
|
+
{ text: 'Add to your shell profile to make permanent' }
|
|
196
|
+
],
|
|
197
|
+
icon: '✏️'
|
|
198
|
+
}),
|
|
199
|
+
gitError: (details) => createError({
|
|
200
|
+
message: `Git error: ${details}`,
|
|
201
|
+
code: 'GIT_ERROR',
|
|
202
|
+
category: ErrorCategory.EXTERNAL_TOOL_ERROR,
|
|
203
|
+
suggestions: [
|
|
204
|
+
{ text: 'Check git status', command: 'git status' },
|
|
205
|
+
{ text: 'View git log', command: 'git log --oneline -5' },
|
|
206
|
+
{ text: 'Ensure you\'re in a git repository' }
|
|
207
|
+
],
|
|
208
|
+
icon: '🔗'
|
|
209
|
+
}),
|
|
210
|
+
gitNotInstalled: () => createError({
|
|
211
|
+
message: 'Git is not installed',
|
|
212
|
+
code: 'GIT_NOT_INSTALLED',
|
|
213
|
+
category: ErrorCategory.EXTERNAL_TOOL_ERROR,
|
|
214
|
+
suggestions: [
|
|
215
|
+
{ text: 'Install git for your platform' },
|
|
216
|
+
{ text: 'macOS:', command: 'brew install git' },
|
|
217
|
+
{ text: 'Ubuntu/Debian:', command: 'sudo apt-get install git' },
|
|
218
|
+
{ text: 'Visit https://git-scm.com/downloads for more options' }
|
|
219
|
+
],
|
|
220
|
+
icon: '🔗'
|
|
221
|
+
}),
|
|
222
|
+
// Network Errors
|
|
223
|
+
networkError: (url, details) => createError({
|
|
224
|
+
message: `Network error accessing ${url}: ${details}`,
|
|
225
|
+
code: 'NETWORK_ERROR',
|
|
226
|
+
category: ErrorCategory.NETWORK_ERROR,
|
|
227
|
+
suggestions: [
|
|
228
|
+
{ text: 'Check your internet connection' },
|
|
229
|
+
{ text: 'Verify the URL is correct' },
|
|
230
|
+
{ text: 'Try again in a few moments' },
|
|
231
|
+
{ text: 'Check if you need to configure a proxy' }
|
|
232
|
+
],
|
|
233
|
+
icon: '🌐'
|
|
234
|
+
}),
|
|
235
|
+
// History Errors
|
|
236
|
+
historyNotFound: (index, total) => createError({
|
|
237
|
+
message: `History entry #${index} not found`,
|
|
238
|
+
code: 'HISTORY_NOT_FOUND',
|
|
239
|
+
category: ErrorCategory.USER_ERROR,
|
|
240
|
+
severity: ErrorSeverity.WARNING,
|
|
241
|
+
suggestions: [
|
|
242
|
+
{ text: `Available entries: 1-${total}` },
|
|
243
|
+
{ text: 'View all entries', command: 'pt history' }
|
|
244
|
+
],
|
|
245
|
+
icon: '📋'
|
|
246
|
+
})
|
|
247
|
+
};
|
|
248
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface FileInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
path: string;
|
|
4
|
+
isDirectory: boolean;
|
|
5
|
+
mtime: Date;
|
|
6
|
+
}
|
|
7
|
+
export interface ListFilesOptions {
|
|
8
|
+
includeHidden?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function listFiles(dirPath: string, options?: ListFilesOptions): FileInfo[];
|
|
11
|
+
export declare function sortFilesByModTime(files: FileInfo[]): FileInfo[];
|
|
12
|
+
export declare function filterFilesByPattern(files: FileInfo[], pattern: string): FileInfo[];
|
|
13
|
+
export declare function listFilesWithCache(dirPath: string, options?: ListFilesOptions): FileInfo[];
|
|
14
|
+
export declare function clearFileCache(): void;
|
|
15
|
+
export declare function resolveFilePath(input: string, basePath: string): string;
|
|
16
|
+
export declare function getParentDirectory(filePath: string): string;
|
|
17
|
+
export declare function expandPath(inputPath: string): string;
|
|
18
|
+
//# sourceMappingURL=file-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,QAAQ,EAAE,CA+BrF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAShE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAcnF;AAKD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,QAAQ,EAAE,CAY9F;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQpD"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { minimatch } from 'minimatch';
|
|
4
|
+
export function listFiles(dirPath, options = {}) {
|
|
5
|
+
const { includeHidden = false } = options;
|
|
6
|
+
try {
|
|
7
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
8
|
+
const files = [];
|
|
9
|
+
for (const entry of entries) {
|
|
10
|
+
// Skip hidden files unless explicitly included
|
|
11
|
+
if (!includeHidden && entry.name.startsWith('.')) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
15
|
+
const stats = fs.statSync(fullPath);
|
|
16
|
+
files.push({
|
|
17
|
+
name: entry.name,
|
|
18
|
+
path: fullPath,
|
|
19
|
+
isDirectory: entry.isDirectory(),
|
|
20
|
+
mtime: stats.mtime,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return files;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
27
|
+
throw new Error(`Directory not found: ${dirPath}`);
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function sortFilesByModTime(files) {
|
|
33
|
+
return [...files].sort((a, b) => {
|
|
34
|
+
// Directories always come first
|
|
35
|
+
if (a.isDirectory && !b.isDirectory)
|
|
36
|
+
return -1;
|
|
37
|
+
if (!a.isDirectory && b.isDirectory)
|
|
38
|
+
return 1;
|
|
39
|
+
// Then sort by modification time (newest first)
|
|
40
|
+
return b.mtime.getTime() - a.mtime.getTime();
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export function filterFilesByPattern(files, pattern) {
|
|
44
|
+
if (!pattern || pattern === '') {
|
|
45
|
+
return files;
|
|
46
|
+
}
|
|
47
|
+
return files.filter(file => {
|
|
48
|
+
// Always include directories for navigation
|
|
49
|
+
if (file.isDirectory) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
// Match files against the pattern
|
|
53
|
+
return minimatch(file.name, pattern);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const fileCache = new Map();
|
|
57
|
+
const CACHE_TTL = 5000; // 5 seconds
|
|
58
|
+
export function listFilesWithCache(dirPath, options = {}) {
|
|
59
|
+
const cacheKey = `${dirPath}:${JSON.stringify(options)}`;
|
|
60
|
+
const cached = fileCache.get(cacheKey);
|
|
61
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
|
|
62
|
+
return cached.files;
|
|
63
|
+
}
|
|
64
|
+
const files = listFiles(dirPath, options);
|
|
65
|
+
fileCache.set(cacheKey, { files, timestamp: Date.now() });
|
|
66
|
+
return files;
|
|
67
|
+
}
|
|
68
|
+
export function clearFileCache() {
|
|
69
|
+
fileCache.clear();
|
|
70
|
+
}
|
|
71
|
+
export function resolveFilePath(input, basePath) {
|
|
72
|
+
if (path.isAbsolute(input)) {
|
|
73
|
+
return input;
|
|
74
|
+
}
|
|
75
|
+
return path.resolve(basePath, input);
|
|
76
|
+
}
|
|
77
|
+
export function getParentDirectory(filePath) {
|
|
78
|
+
return path.dirname(filePath);
|
|
79
|
+
}
|
|
80
|
+
export function expandPath(inputPath) {
|
|
81
|
+
// Handle home directory expansion
|
|
82
|
+
if (inputPath.startsWith('~/')) {
|
|
83
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
84
|
+
return path.join(homeDir, inputPath.slice(2));
|
|
85
|
+
}
|
|
86
|
+
return inputPath;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface GitInfo {
|
|
2
|
+
branch?: string;
|
|
3
|
+
commit?: string;
|
|
4
|
+
isDirty?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function getGitInfo(): Promise<GitInfo>;
|
|
7
|
+
export declare function formatDuration(startTime: Date, endTime: Date): string;
|
|
8
|
+
//# sourceMappingURL=git-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-info.d.ts","sourceRoot":"","sources":["../../src/utils/git-info.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAqBnD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,MAAM,CAuBrE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
export async function getGitInfo() {
|
|
5
|
+
const info = {};
|
|
6
|
+
try {
|
|
7
|
+
// Get current branch
|
|
8
|
+
const branchResult = await execAsync('git rev-parse --abbrev-ref HEAD');
|
|
9
|
+
info.branch = branchResult.stdout.trim();
|
|
10
|
+
// Get current commit hash
|
|
11
|
+
const commitResult = await execAsync('git rev-parse HEAD');
|
|
12
|
+
info.commit = commitResult.stdout.trim();
|
|
13
|
+
// Check if working directory is dirty
|
|
14
|
+
const statusResult = await execAsync('git status --porcelain');
|
|
15
|
+
info.isDirty = statusResult.stdout.trim().length > 0;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Not a git repository or git not available
|
|
19
|
+
// Return partial info - don't throw
|
|
20
|
+
}
|
|
21
|
+
return info;
|
|
22
|
+
}
|
|
23
|
+
export function formatDuration(startTime, endTime) {
|
|
24
|
+
const durationMs = endTime.getTime() - startTime.getTime();
|
|
25
|
+
const seconds = Math.floor(durationMs / 1000);
|
|
26
|
+
if (seconds < 60) {
|
|
27
|
+
return `${seconds}s`;
|
|
28
|
+
}
|
|
29
|
+
const minutes = Math.floor(seconds / 60);
|
|
30
|
+
const remainingSeconds = seconds % 60;
|
|
31
|
+
if (minutes < 60) {
|
|
32
|
+
return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;
|
|
33
|
+
}
|
|
34
|
+
const hours = Math.floor(minutes / 60);
|
|
35
|
+
const remainingMinutes = minutes % 60;
|
|
36
|
+
if (remainingMinutes > 0) {
|
|
37
|
+
return `${hours}h ${remainingMinutes}m`;
|
|
38
|
+
}
|
|
39
|
+
return `${hours}h`;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=git-info.js.map
|