@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,275 @@
|
|
|
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
|
+
let prefix;
|
|
62
|
+
if (error.severity === ErrorSeverity.FATAL) {
|
|
63
|
+
prefix = chalk.bgRed.white(' FATAL ERROR: ');
|
|
64
|
+
}
|
|
65
|
+
else if (error.severity === ErrorSeverity.WARNING) {
|
|
66
|
+
prefix = chalk.yellow('Warning:');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
prefix = chalk.red('Error:');
|
|
70
|
+
}
|
|
71
|
+
const displayFn = error.severity === ErrorSeverity.WARNING ? logger.warn.bind(logger) : logger.error.bind(logger);
|
|
72
|
+
displayFn(`${error.icon} ${prefix} ${error.message}`);
|
|
73
|
+
if (error.suggestions.length > 0) {
|
|
74
|
+
displayFn(chalk.yellow('\n💡 Suggestions:'));
|
|
75
|
+
error.suggestions.forEach(suggestion => {
|
|
76
|
+
displayFn(chalk.dim(` • ${suggestion.text}`));
|
|
77
|
+
if (suggestion.command) {
|
|
78
|
+
displayFn(chalk.green(` ▶️ ${suggestion.command}`));
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
logger.error(chalk.red('Error:'), error.message);
|
|
85
|
+
}
|
|
86
|
+
if (process.env.DEBUG === 'true') {
|
|
87
|
+
logger.error(chalk.dim('\nStack trace:'));
|
|
88
|
+
logger.error(chalk.dim(error.stack || 'No stack trace available'));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Common error creators
|
|
92
|
+
export const errors = {
|
|
93
|
+
// File System Errors
|
|
94
|
+
fileNotFound: (path) => createError({
|
|
95
|
+
message: `File not found: ${path}`,
|
|
96
|
+
code: 'FILE_NOT_FOUND',
|
|
97
|
+
category: ErrorCategory.FILE_SYSTEM_ERROR,
|
|
98
|
+
suggestions: [
|
|
99
|
+
{ text: 'Check if the file exists', command: `ls -la "${path}"` },
|
|
100
|
+
{ text: 'Verify the path is correct' },
|
|
101
|
+
{ text: 'Use absolute paths to avoid confusion' }
|
|
102
|
+
],
|
|
103
|
+
icon: '📄'
|
|
104
|
+
}),
|
|
105
|
+
permissionDenied: (path) => createError({
|
|
106
|
+
message: `Permission denied: ${path}`,
|
|
107
|
+
code: 'PERMISSION_DENIED',
|
|
108
|
+
category: ErrorCategory.FILE_SYSTEM_ERROR,
|
|
109
|
+
suggestions: [
|
|
110
|
+
{ text: 'Check directory permissions', command: `ls -la "${path}"` },
|
|
111
|
+
{ text: 'Fix permissions', command: `chmod 755 "${path}"` },
|
|
112
|
+
{ text: 'Ensure directory exists', command: `mkdir -p "${path}"` }
|
|
113
|
+
],
|
|
114
|
+
icon: '🔒'
|
|
115
|
+
}),
|
|
116
|
+
// User Errors
|
|
117
|
+
noPromptsFound: (dirs) => createError({
|
|
118
|
+
message: `No prompts found in: ${dirs.join(', ')}`,
|
|
119
|
+
code: 'NO_PROMPTS',
|
|
120
|
+
category: ErrorCategory.USER_ERROR,
|
|
121
|
+
suggestions: [
|
|
122
|
+
{ text: 'Create a new prompt interactively', command: 'pt add' },
|
|
123
|
+
{ text: `Create a .prompt file in one of the directories` }
|
|
124
|
+
],
|
|
125
|
+
icon: '🔍'
|
|
126
|
+
}),
|
|
127
|
+
validationError: (field, format, example) => createError({
|
|
128
|
+
message: `Invalid ${field}`,
|
|
129
|
+
code: 'VALIDATION_ERROR',
|
|
130
|
+
category: ErrorCategory.USER_ERROR,
|
|
131
|
+
severity: ErrorSeverity.WARNING,
|
|
132
|
+
suggestions: [
|
|
133
|
+
{ text: `Expected format: ${format}` },
|
|
134
|
+
{ text: `Example: ${example}` }
|
|
135
|
+
],
|
|
136
|
+
icon: '✏️'
|
|
137
|
+
}),
|
|
138
|
+
templateError: (template, details) => createError({
|
|
139
|
+
message: `Template error in "${template}": ${details}`,
|
|
140
|
+
code: 'TEMPLATE_ERROR',
|
|
141
|
+
category: ErrorCategory.USER_ERROR,
|
|
142
|
+
suggestions: [
|
|
143
|
+
{ text: 'Check template syntax' },
|
|
144
|
+
{ text: 'Ensure all helpers are closed properly' },
|
|
145
|
+
{ text: 'Verify variable names are correct' }
|
|
146
|
+
],
|
|
147
|
+
icon: '📝'
|
|
148
|
+
}),
|
|
149
|
+
// Configuration Errors
|
|
150
|
+
configMissing: () => createError({
|
|
151
|
+
message: 'No configuration found',
|
|
152
|
+
code: 'NO_CONFIG',
|
|
153
|
+
category: ErrorCategory.CONFIG_ERROR,
|
|
154
|
+
suggestions: [
|
|
155
|
+
{ text: 'Initialize configuration', command: 'pt init' }
|
|
156
|
+
],
|
|
157
|
+
icon: '⚙️'
|
|
158
|
+
}),
|
|
159
|
+
invalidConfig: (field, expected, actual) => createError({
|
|
160
|
+
message: `Configuration error: '${field}' must be ${expected} (found: ${typeof actual})`,
|
|
161
|
+
code: 'INVALID_CONFIG',
|
|
162
|
+
category: ErrorCategory.CONFIG_ERROR,
|
|
163
|
+
suggestions: [
|
|
164
|
+
{ text: `Edit .pt-config.json and fix the '${field}' value` },
|
|
165
|
+
{ text: `Expected format: ${expected}` }
|
|
166
|
+
],
|
|
167
|
+
icon: '⚙️'
|
|
168
|
+
}),
|
|
169
|
+
featureNotEnabled: (feature, benefits) => createError({
|
|
170
|
+
message: `${feature} is not enabled`,
|
|
171
|
+
code: 'FEATURE_DISABLED',
|
|
172
|
+
category: ErrorCategory.CONFIG_ERROR,
|
|
173
|
+
severity: ErrorSeverity.WARNING,
|
|
174
|
+
suggestions: [
|
|
175
|
+
{ text: 'Enable it by running:', command: 'pt init' },
|
|
176
|
+
{ text: `Benefits: ${benefits.join(', ')}` }
|
|
177
|
+
],
|
|
178
|
+
icon: '🎯'
|
|
179
|
+
}),
|
|
180
|
+
// External Tool Errors
|
|
181
|
+
toolNotFound: (tool, suggestions = []) => createError({
|
|
182
|
+
message: `Tool '${tool}' not found`,
|
|
183
|
+
code: 'TOOL_NOT_FOUND',
|
|
184
|
+
category: ErrorCategory.EXTERNAL_TOOL_ERROR,
|
|
185
|
+
suggestions: [
|
|
186
|
+
...suggestions.map(s => ({ text: `Did you mean '${s}'?` })),
|
|
187
|
+
{ text: 'Check if installed', command: `which ${tool}` },
|
|
188
|
+
{ text: 'Install if needed', command: `npm install -g ${tool}` }
|
|
189
|
+
],
|
|
190
|
+
icon: '🔧'
|
|
191
|
+
}),
|
|
192
|
+
noEditor: () => createError({
|
|
193
|
+
message: 'No editor configured',
|
|
194
|
+
code: 'NO_EDITOR',
|
|
195
|
+
category: ErrorCategory.EXTERNAL_TOOL_ERROR,
|
|
196
|
+
suggestions: [
|
|
197
|
+
{ text: 'Set your editor:', command: 'export EDITOR=vim' },
|
|
198
|
+
{ text: 'For VS Code:', command: 'export EDITOR="code --wait"' },
|
|
199
|
+
{ text: 'Add to your shell profile to make permanent' }
|
|
200
|
+
],
|
|
201
|
+
icon: '✏️'
|
|
202
|
+
}),
|
|
203
|
+
gitError: (details) => createError({
|
|
204
|
+
message: `Git error: ${details}`,
|
|
205
|
+
code: 'GIT_ERROR',
|
|
206
|
+
category: ErrorCategory.EXTERNAL_TOOL_ERROR,
|
|
207
|
+
suggestions: [
|
|
208
|
+
{ text: 'Check git status', command: 'git status' },
|
|
209
|
+
{ text: 'View git log', command: 'git log --oneline -5' },
|
|
210
|
+
{ text: 'Ensure you\'re in a git repository' }
|
|
211
|
+
],
|
|
212
|
+
icon: '🔗'
|
|
213
|
+
}),
|
|
214
|
+
gitNotInstalled: () => createError({
|
|
215
|
+
message: 'Git is not installed',
|
|
216
|
+
code: 'GIT_NOT_INSTALLED',
|
|
217
|
+
category: ErrorCategory.EXTERNAL_TOOL_ERROR,
|
|
218
|
+
suggestions: [
|
|
219
|
+
{ text: 'Install git for your platform' },
|
|
220
|
+
{ text: 'macOS:', command: 'brew install git' },
|
|
221
|
+
{ text: 'Ubuntu/Debian:', command: 'sudo apt-get install git' },
|
|
222
|
+
{ text: 'Visit https://git-scm.com/downloads for more options' }
|
|
223
|
+
],
|
|
224
|
+
icon: '🔗'
|
|
225
|
+
}),
|
|
226
|
+
// Network Errors
|
|
227
|
+
networkError: (url, details) => createError({
|
|
228
|
+
message: `Network error accessing ${url}: ${details}`,
|
|
229
|
+
code: 'NETWORK_ERROR',
|
|
230
|
+
category: ErrorCategory.NETWORK_ERROR,
|
|
231
|
+
suggestions: [
|
|
232
|
+
{ text: 'Check your internet connection' },
|
|
233
|
+
{ text: 'Verify the URL is correct' },
|
|
234
|
+
{ text: 'Try again in a few moments' },
|
|
235
|
+
{ text: 'Check if you need to configure a proxy' }
|
|
236
|
+
],
|
|
237
|
+
icon: '🌐'
|
|
238
|
+
}),
|
|
239
|
+
// History Errors
|
|
240
|
+
historyNotFound: (index, total) => createError({
|
|
241
|
+
message: `History entry #${index} not found`,
|
|
242
|
+
code: 'HISTORY_NOT_FOUND',
|
|
243
|
+
category: ErrorCategory.USER_ERROR,
|
|
244
|
+
severity: ErrorSeverity.WARNING,
|
|
245
|
+
suggestions: [
|
|
246
|
+
{ text: `Available entries: 1-${total}` },
|
|
247
|
+
{ text: 'View all entries', command: 'pt history' }
|
|
248
|
+
],
|
|
249
|
+
icon: '📋'
|
|
250
|
+
}),
|
|
251
|
+
// Prompt Errors
|
|
252
|
+
promptNotFound: (name) => createError({
|
|
253
|
+
message: `Prompt '${name}' not found`,
|
|
254
|
+
code: 'PROMPT_NOT_FOUND',
|
|
255
|
+
category: ErrorCategory.USER_ERROR,
|
|
256
|
+
suggestions: [
|
|
257
|
+
{ text: 'List available prompts', command: 'pt' },
|
|
258
|
+
{ text: 'Check prompt name or filename' },
|
|
259
|
+
{ text: 'Create a new prompt', command: 'pt add' }
|
|
260
|
+
],
|
|
261
|
+
icon: '🔍'
|
|
262
|
+
}),
|
|
263
|
+
commandNotFound: (command, suggestions = [], availableCommands = []) => createError({
|
|
264
|
+
message: `Unknown command: '${command}'`,
|
|
265
|
+
code: 'COMMAND_NOT_FOUND',
|
|
266
|
+
category: ErrorCategory.USER_ERROR,
|
|
267
|
+
suggestions: [
|
|
268
|
+
...suggestions.map(s => ({ text: `Did you mean '${s}'?`, command: `pt ${s}` })),
|
|
269
|
+
...(availableCommands.length > 0 ? [{ text: `Available commands: ${availableCommands.join(', ')}` }] : []),
|
|
270
|
+
{ text: 'Show help', command: 'pt help' }
|
|
271
|
+
],
|
|
272
|
+
icon: '❓'
|
|
273
|
+
})
|
|
274
|
+
};
|
|
275
|
+
//# 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,10 @@
|
|
|
1
|
+
interface GitInfo {
|
|
2
|
+
branch?: string;
|
|
3
|
+
commit?: string;
|
|
4
|
+
isDirty?: boolean;
|
|
5
|
+
gitDir?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getGitInfo(): Promise<GitInfo>;
|
|
8
|
+
export declare function formatDuration(startTime: Date, endTime: Date): string;
|
|
9
|
+
export {};
|
|
10
|
+
//# 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,UAAU,OAAO;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAyBnD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,MAAM,CAuBrE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
// Get the git directory (important for worktrees)
|
|
17
|
+
const gitDirResult = await execAsync('git rev-parse --absolute-git-dir');
|
|
18
|
+
info.gitDir = gitDirResult.stdout.trim();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// Not a git repository or git not available
|
|
22
|
+
// Return partial info - don't throw
|
|
23
|
+
}
|
|
24
|
+
return info;
|
|
25
|
+
}
|
|
26
|
+
export function formatDuration(startTime, endTime) {
|
|
27
|
+
const durationMs = endTime.getTime() - startTime.getTime();
|
|
28
|
+
const seconds = Math.floor(durationMs / 1000);
|
|
29
|
+
if (seconds < 60) {
|
|
30
|
+
return `${seconds}s`;
|
|
31
|
+
}
|
|
32
|
+
const minutes = Math.floor(seconds / 60);
|
|
33
|
+
const remainingSeconds = seconds % 60;
|
|
34
|
+
if (minutes < 60) {
|
|
35
|
+
return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;
|
|
36
|
+
}
|
|
37
|
+
const hours = Math.floor(minutes / 60);
|
|
38
|
+
const remainingMinutes = minutes % 60;
|
|
39
|
+
if (remainingMinutes > 0) {
|
|
40
|
+
return `${hours}h ${remainingMinutes}m`;
|
|
41
|
+
}
|
|
42
|
+
return `${hours}h`;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=git-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-info.js","sourceRoot":"","sources":["../../src/utils/git-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AASlC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,IAAI,GAAY,EAAE,CAAC;IAEzB,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEzC,0BAA0B;QAC1B,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEzC,sCAAsC;QACtC,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAErD,kDAAkD;QAClD,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,kCAAkC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,oCAAoC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAe,EAAE,OAAa;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAE9C,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,GAAG,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IAEtC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,gBAAgB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;IACnF,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IAEtC,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,KAAK,KAAK,gBAAgB,GAAG,CAAC;IAC1C,CAAC;IAED,OAAO,GAAG,KAAK,GAAG,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SimpleGit } from 'simple-git';
|
|
2
|
+
/**
|
|
3
|
+
* Check if current directory is a git repository
|
|
4
|
+
*/
|
|
5
|
+
export declare function isGitRepository(git?: SimpleGit): Promise<boolean>;
|
|
6
|
+
/**
|
|
7
|
+
* Add entry to .gitignore file
|
|
8
|
+
*/
|
|
9
|
+
export declare function addToGitignore(entry: string): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=gitignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/utils/gitignore.ts"],"names":[],"mappings":"AAGA,OAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,GAAE,SAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAMpF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DjE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import simpleGit from 'simple-git';
|
|
4
|
+
/**
|
|
5
|
+
* Check if current directory is a git repository
|
|
6
|
+
*/
|
|
7
|
+
export async function isGitRepository(git = simpleGit()) {
|
|
8
|
+
try {
|
|
9
|
+
return await git.checkIsRepo();
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Add entry to .gitignore file
|
|
17
|
+
*/
|
|
18
|
+
export async function addToGitignore(entry) {
|
|
19
|
+
const gitignorePath = path.join(process.cwd(), '.gitignore');
|
|
20
|
+
let gitignoreContent = '';
|
|
21
|
+
let exists = false;
|
|
22
|
+
try {
|
|
23
|
+
gitignoreContent = await fs.readFile(gitignorePath, 'utf-8');
|
|
24
|
+
exists = true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// File doesn't exist, will create it
|
|
28
|
+
gitignoreContent = '';
|
|
29
|
+
}
|
|
30
|
+
// Check if entry already exists
|
|
31
|
+
const lines = gitignoreContent.split('\n');
|
|
32
|
+
const entryExists = lines.some(line => line.trim() === entry);
|
|
33
|
+
if (entryExists) {
|
|
34
|
+
return; // Entry already exists, nothing to do
|
|
35
|
+
}
|
|
36
|
+
// Check if PUPT section exists
|
|
37
|
+
const promptToolSectionIndex = lines.findIndex(line => line.trim() === '# PUPT');
|
|
38
|
+
if (promptToolSectionIndex !== -1) {
|
|
39
|
+
// Add to existing PUPT section
|
|
40
|
+
// Find the end of the section (next comment or end of file)
|
|
41
|
+
let insertIndex = promptToolSectionIndex + 1;
|
|
42
|
+
while (insertIndex < lines.length &&
|
|
43
|
+
lines[insertIndex].trim() !== '' &&
|
|
44
|
+
!lines[insertIndex].trim().startsWith('#')) {
|
|
45
|
+
insertIndex++;
|
|
46
|
+
}
|
|
47
|
+
// Insert the new entry
|
|
48
|
+
lines.splice(insertIndex, 0, entry);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Add new PUPT section
|
|
52
|
+
// Ensure there's a newline before the section if file has content
|
|
53
|
+
if (exists && gitignoreContent.trim() !== '') {
|
|
54
|
+
if (!gitignoreContent.endsWith('\n')) {
|
|
55
|
+
lines.push(''); // Add empty line
|
|
56
|
+
}
|
|
57
|
+
lines.push(''); // Add separator line
|
|
58
|
+
}
|
|
59
|
+
else if (!exists || gitignoreContent === '') {
|
|
60
|
+
// For new files, remove the initial empty line
|
|
61
|
+
if (lines.length === 1 && lines[0] === '') {
|
|
62
|
+
lines.pop();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
lines.push('# PUPT');
|
|
66
|
+
lines.push(entry);
|
|
67
|
+
}
|
|
68
|
+
// Write back to file
|
|
69
|
+
const newContent = lines.join('\n');
|
|
70
|
+
await fs.writeFile(gitignorePath, newContent.endsWith('\n') ? newContent : `${newContent}\n`, 'utf-8');
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/utils/gitignore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform-aware logger that ensures consistent line endings
|
|
3
|
+
* and prevents null characters in output
|
|
4
|
+
*/
|
|
5
|
+
export declare class Logger {
|
|
6
|
+
private static instance;
|
|
7
|
+
private readonly lineEnding;
|
|
8
|
+
private constructor();
|
|
9
|
+
static getInstance(): Logger;
|
|
10
|
+
/**
|
|
11
|
+
* Sanitizes a string for output:
|
|
12
|
+
* - Removes null characters
|
|
13
|
+
* - Normalizes line endings to platform-specific format
|
|
14
|
+
* - Removes trailing newlines to prevent double spacing
|
|
15
|
+
*/
|
|
16
|
+
private sanitize;
|
|
17
|
+
/**
|
|
18
|
+
* Logs a message to stdout with proper line endings
|
|
19
|
+
*/
|
|
20
|
+
log(...args: unknown[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Logs an error message to stderr with proper line endings
|
|
23
|
+
*/
|
|
24
|
+
error(...args: unknown[]): void;
|
|
25
|
+
/**
|
|
26
|
+
* Logs a message without adding a newline at the end
|
|
27
|
+
*/
|
|
28
|
+
write(message: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Logs a warning message to stderr
|
|
31
|
+
*/
|
|
32
|
+
warn(...args: unknown[]): void;
|
|
33
|
+
/**
|
|
34
|
+
* Logs a debug message (only in development/test environments)
|
|
35
|
+
*/
|
|
36
|
+
debug(...args: unknown[]): void;
|
|
37
|
+
}
|
|
38
|
+
export declare const logger: Logger;
|
|
39
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO;IAqBP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAkB7B;;OAEG;IACH,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAkB/B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAe5B;;OAEG;IACH,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAkB9B;;OAEG;IACH,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;CAmBhC;AAGD,eAAO,MAAM,MAAM,QAAuB,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import os from 'os';
|
|
2
|
+
/**
|
|
3
|
+
* Platform-aware logger that ensures consistent line endings
|
|
4
|
+
* and prevents null characters in output
|
|
5
|
+
*/
|
|
6
|
+
export class Logger {
|
|
7
|
+
static instance;
|
|
8
|
+
lineEnding;
|
|
9
|
+
constructor() {
|
|
10
|
+
// Use platform-specific line endings
|
|
11
|
+
this.lineEnding = os.platform() === 'win32' ? '\r\n' : '\n';
|
|
12
|
+
// Handle EPIPE errors gracefully when output is piped
|
|
13
|
+
// Increase max listeners to avoid warnings in tests
|
|
14
|
+
process.stdout.setMaxListeners(process.stdout.getMaxListeners() + 1);
|
|
15
|
+
process.stderr.setMaxListeners(process.stderr.getMaxListeners() + 1);
|
|
16
|
+
const handlePipeError = (error) => {
|
|
17
|
+
if (error.code === 'EPIPE') {
|
|
18
|
+
// Silently ignore EPIPE errors - this is normal when piping to less/head/etc
|
|
19
|
+
// Don't exit, just stop writing
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
process.stdout.on('error', handlePipeError);
|
|
24
|
+
process.stderr.on('error', handlePipeError);
|
|
25
|
+
}
|
|
26
|
+
static getInstance() {
|
|
27
|
+
if (!Logger.instance) {
|
|
28
|
+
Logger.instance = new Logger();
|
|
29
|
+
}
|
|
30
|
+
return Logger.instance;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sanitizes a string for output:
|
|
34
|
+
* - Removes null characters
|
|
35
|
+
* - Normalizes line endings to platform-specific format
|
|
36
|
+
* - Removes trailing newlines to prevent double spacing
|
|
37
|
+
*/
|
|
38
|
+
sanitize(text) {
|
|
39
|
+
return text
|
|
40
|
+
.replace(/\0/g, '') // Remove null characters
|
|
41
|
+
.replace(/\r\n|\r|\n/g, this.lineEnding) // Normalize line endings
|
|
42
|
+
.replace(/[\r\n]+$/, ''); // Remove trailing newlines
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Logs a message to stdout with proper line endings
|
|
46
|
+
*/
|
|
47
|
+
log(...args) {
|
|
48
|
+
const message = args.map(arg => typeof arg === 'string' ? arg : String(arg)).join(' ');
|
|
49
|
+
const sanitized = this.sanitize(message);
|
|
50
|
+
try {
|
|
51
|
+
process.stdout.write(sanitized + this.lineEnding);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
// Handle EPIPE errors gracefully when output is piped
|
|
55
|
+
if (error.code === 'EPIPE') {
|
|
56
|
+
// Silently ignore - this is normal when piping to less/head/etc
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Re-throw other errors
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Logs an error message to stderr with proper line endings
|
|
65
|
+
*/
|
|
66
|
+
error(...args) {
|
|
67
|
+
const message = args.map(arg => typeof arg === 'string' ? arg : String(arg)).join(' ');
|
|
68
|
+
const sanitized = this.sanitize(message);
|
|
69
|
+
try {
|
|
70
|
+
process.stderr.write(sanitized + this.lineEnding);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
// Handle EPIPE errors gracefully when output is piped
|
|
74
|
+
if (error.code === 'EPIPE') {
|
|
75
|
+
// Silently ignore - this is normal when piping to less/head/etc
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Re-throw other errors
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Logs a message without adding a newline at the end
|
|
84
|
+
*/
|
|
85
|
+
write(message) {
|
|
86
|
+
const sanitized = this.sanitize(message);
|
|
87
|
+
try {
|
|
88
|
+
process.stdout.write(sanitized);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// Handle EPIPE errors gracefully when output is piped
|
|
92
|
+
if (error.code === 'EPIPE') {
|
|
93
|
+
// Silently ignore - this is normal when piping to less/head/etc
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Re-throw other errors
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Logs a warning message to stderr
|
|
102
|
+
*/
|
|
103
|
+
warn(...args) {
|
|
104
|
+
const message = args.map(arg => typeof arg === 'string' ? arg : String(arg)).join(' ');
|
|
105
|
+
const sanitized = this.sanitize(message);
|
|
106
|
+
try {
|
|
107
|
+
process.stderr.write(sanitized + this.lineEnding);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
// Handle EPIPE errors gracefully when output is piped
|
|
111
|
+
if (error.code === 'EPIPE') {
|
|
112
|
+
// Silently ignore - this is normal when piping to less/head/etc
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Re-throw other errors
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Logs a debug message (only in development/test environments)
|
|
121
|
+
*/
|
|
122
|
+
debug(...args) {
|
|
123
|
+
if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test' || process.env.DEBUG) {
|
|
124
|
+
const message = args.map(arg => typeof arg === 'string' ? arg : String(arg)).join(' ');
|
|
125
|
+
const sanitized = this.sanitize(`[DEBUG] ${message}`);
|
|
126
|
+
try {
|
|
127
|
+
process.stderr.write(sanitized + this.lineEnding);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
// Handle EPIPE errors gracefully when output is piped
|
|
131
|
+
if (error.code === 'EPIPE') {
|
|
132
|
+
// Exit gracefully when pipe is closed
|
|
133
|
+
process.exit(0);
|
|
134
|
+
}
|
|
135
|
+
// Re-throw other errors
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Export singleton instance
|
|
142
|
+
export const logger = Logger.getInstance();
|
|
143
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function getHomePath(): string;
|
|
2
|
+
export declare function getConfigPaths(): string[];
|
|
3
|
+
export declare function getPlatform(): NodeJS.Platform;
|
|
4
|
+
export declare function isWindows(): boolean;
|
|
5
|
+
export declare function isMacOS(): boolean;
|
|
6
|
+
export declare function isLinux(): boolean;
|
|
7
|
+
export declare function normalizeLineEndings(text: string): string;
|
|
8
|
+
export declare function getUsername(): string;
|
|
9
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAyBzC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,QAAQ,CAE7C;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
|