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 @@
|
|
|
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;AAQlC,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;IACvD,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":"AAEA,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 fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
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 Prompt Tool section exists
|
|
37
|
+
const promptToolSectionIndex = lines.findIndex(line => line.trim() === '# Prompt Tool');
|
|
38
|
+
if (promptToolSectionIndex !== -1) {
|
|
39
|
+
// Add to existing Prompt Tool 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 Prompt Tool 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('# Prompt Tool');
|
|
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,4 @@
|
|
|
1
|
+
import type { HandlebarsExtensionConfig } from '../types/config.js';
|
|
2
|
+
import type Handlebars from 'handlebars';
|
|
3
|
+
export declare function loadHandlebarsExtensions(handlebars: typeof Handlebars, extensions: HandlebarsExtensionConfig[], configDir?: string): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=handlebars-extensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlebars-extensions.d.ts","sourceRoot":"","sources":["../../src/utils/handlebars-extensions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzC,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,OAAO,UAAU,EAC7B,UAAU,EAAE,yBAAyB,EAAE,EACvC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as vm from 'node:vm';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { promises as fs } from 'node:fs';
|
|
4
|
+
export async function loadHandlebarsExtensions(handlebars, extensions, configDir) {
|
|
5
|
+
for (const extension of extensions) {
|
|
6
|
+
await loadSingleExtension(handlebars, extension, configDir);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
async function loadSingleExtension(handlebars, config, configDir) {
|
|
10
|
+
if (config.type === 'inline') {
|
|
11
|
+
await loadInlineExtension(handlebars, config);
|
|
12
|
+
}
|
|
13
|
+
else if (config.type === 'file') {
|
|
14
|
+
await loadFileExtension(handlebars, config, configDir);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
throw new Error(`Invalid extension type: ${config.type || 'unknown'}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function loadInlineExtension(handlebars, config) {
|
|
21
|
+
if (!config.value) {
|
|
22
|
+
throw new Error('Inline extension value is required');
|
|
23
|
+
}
|
|
24
|
+
// Create a sandboxed context for executing the inline code
|
|
25
|
+
const sandbox = {
|
|
26
|
+
Handlebars: handlebars,
|
|
27
|
+
console: console, // Allow console for debugging
|
|
28
|
+
require: createSafeRequire()
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
// Create a new context for the sandbox
|
|
32
|
+
const context = vm.createContext(sandbox);
|
|
33
|
+
// Run the code with a timeout
|
|
34
|
+
vm.runInContext(config.value, context, {
|
|
35
|
+
timeout: 5000, // 5 second timeout
|
|
36
|
+
displayErrors: true
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
41
|
+
throw new Error(`Failed to load inline Handlebars extension: ${message}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Create a safe require function that blocks dangerous modules
|
|
45
|
+
function createSafeRequire() {
|
|
46
|
+
return (id) => {
|
|
47
|
+
const blockedModules = ['fs', 'child_process', 'net', 'http', 'https', 'os', 'path', 'crypto'];
|
|
48
|
+
if (blockedModules.includes(id)) {
|
|
49
|
+
throw new Error(`Module '${id}' is not allowed in inline extensions`);
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`require() is not available in inline extensions`);
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function loadFileExtension(handlebars, config, configDir) {
|
|
55
|
+
if (!config.path) {
|
|
56
|
+
throw new Error('File extension path is required');
|
|
57
|
+
}
|
|
58
|
+
// Resolve path relative to config directory if provided
|
|
59
|
+
const extensionPath = configDir
|
|
60
|
+
? path.resolve(configDir, config.path)
|
|
61
|
+
: path.resolve(config.path);
|
|
62
|
+
try {
|
|
63
|
+
// Check if file exists
|
|
64
|
+
await fs.access(extensionPath);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
throw new Error(`Extension file not found: ${extensionPath}`);
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
// Use dynamic import for ESM compatibility
|
|
71
|
+
const extensionModule = await import(extensionPath);
|
|
72
|
+
const extension = extensionModule.default || extensionModule;
|
|
73
|
+
if (typeof extension !== 'function') {
|
|
74
|
+
throw new Error(`Extension file must export a function, got ${typeof extension}`);
|
|
75
|
+
}
|
|
76
|
+
// Call the extension function with Handlebars instance
|
|
77
|
+
await extension(handlebars);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof Error && error.message.includes('Extension file must export')) {
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
84
|
+
throw new Error(`Failed to load file Handlebars extension: ${message}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=handlebars-extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlebars-extensions.js","sourceRoot":"","sources":["../../src/utils/handlebars-extensions.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":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;;GAGG;AACH,MAAM,OAAO,MAAM;IACT,MAAM,CAAC,QAAQ,CAAS;IACf,UAAU,CAAS;IAEpC;QACE,qCAAqC;QACrC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAE5D,sDAAsD;QACtD,oDAAoD;QACpD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC;QAErE,MAAM,eAAe,GAAG,CAAC,KAA4B,EAAE,EAAE;YACvD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,6EAA6E;gBAC7E,gCAAgC;gBAChC,OAAO;YACT,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACK,QAAQ,CAAC,IAAY;QAC3B,OAAO,IAAI;aACR,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,yBAAyB;aAC5C,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,yBAAyB;aACjE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,2BAA2B;IACzD,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAG,IAAe;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAC7B,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAC5C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtD,gEAAgE;gBAChE,OAAO;YACT,CAAC;YACD,wBAAwB;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,IAAe;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAC7B,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAC5C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtD,gEAAgE;gBAChE,OAAO;YACT,CAAC;YACD,wBAAwB;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtD,gEAAgE;gBAChE,OAAO;YACT,CAAC;YACD,wBAAwB;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,GAAG,IAAe;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAC7B,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAC5C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtD,gEAAgE;gBAChE,OAAO;YACT,CAAC;YACD,wBAAwB;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,IAAe;QACtB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACnG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAC7B,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAC5C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC;gBACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,sDAAsD;gBACtD,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACtD,sCAAsC;oBACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,wBAAwB;gBACxB,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC"}
|
|
@@ -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,CAwBzC;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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export function getHomePath() {
|
|
4
|
+
return os.homedir();
|
|
5
|
+
}
|
|
6
|
+
export function getConfigPaths() {
|
|
7
|
+
const platform = getPlatform();
|
|
8
|
+
const paths = [process.cwd()];
|
|
9
|
+
switch (platform) {
|
|
10
|
+
case 'win32':
|
|
11
|
+
if (process.env.APPDATA) {
|
|
12
|
+
paths.push(path.join(process.env.APPDATA, 'prompt-tool'));
|
|
13
|
+
}
|
|
14
|
+
break;
|
|
15
|
+
case 'darwin':
|
|
16
|
+
paths.push(path.join(getHomePath(), 'Library', 'Application Support', 'prompt-tool'), path.join(getHomePath(), '.config', 'prompt-tool'));
|
|
17
|
+
break;
|
|
18
|
+
case 'linux':
|
|
19
|
+
default:
|
|
20
|
+
const configHome = process.env.XDG_CONFIG_HOME || path.join(getHomePath(), '.config');
|
|
21
|
+
paths.push(path.join(configHome, 'prompt-tool'));
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
return paths;
|
|
25
|
+
}
|
|
26
|
+
export function getPlatform() {
|
|
27
|
+
return process.platform;
|
|
28
|
+
}
|
|
29
|
+
export function isWindows() {
|
|
30
|
+
return getPlatform() === 'win32';
|
|
31
|
+
}
|
|
32
|
+
export function isMacOS() {
|
|
33
|
+
return getPlatform() === 'darwin';
|
|
34
|
+
}
|
|
35
|
+
export function isLinux() {
|
|
36
|
+
return getPlatform() === 'linux';
|
|
37
|
+
}
|
|
38
|
+
export function normalizeLineEndings(text) {
|
|
39
|
+
return text.replace(/\r\n|\r|\n/g, '\n');
|
|
40
|
+
}
|
|
41
|
+
export function getUsername() {
|
|
42
|
+
return os.userInfo().username;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE9B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM;QACR,KAAK,QAAQ;YACX,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,aAAa,CAAC,EACzE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CACnD,CAAC;YACF,MAAM;QACR,KAAK,OAAO,CAAC;QACb;YACE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;YACtF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;YACjD,MAAM;IACV,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,WAAW,EAAE,KAAK,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,WAAW,EAAE,KAAK,QAAQ,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,WAAW,EAAE,KAAK,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const SENSITIVE_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
2
|
+
export declare function isSensitiveKey(key: string): boolean;
|
|
3
|
+
export declare function maskSensitiveValue(key: string, value: unknown): unknown;
|
|
4
|
+
export declare function sanitizeObject<T extends Record<string, unknown>>(obj: T): T;
|
|
5
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,2EASrB,CAAC;AAEX,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAqBvE;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,GAAG,EAAE,CAAC,GACL,CAAC,CAqBH"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export const SENSITIVE_PATTERNS = [
|
|
2
|
+
/api[_-]?key/i,
|
|
3
|
+
/password/i,
|
|
4
|
+
/secret/i,
|
|
5
|
+
/token/i,
|
|
6
|
+
/credential/i,
|
|
7
|
+
/private[_-]?key/i,
|
|
8
|
+
/auth/i,
|
|
9
|
+
/bearer/i
|
|
10
|
+
];
|
|
11
|
+
export function isSensitiveKey(key) {
|
|
12
|
+
return SENSITIVE_PATTERNS.some(pattern => pattern.test(key));
|
|
13
|
+
}
|
|
14
|
+
export function maskSensitiveValue(key, value) {
|
|
15
|
+
if (!isSensitiveKey(key)) {
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === 'string') {
|
|
19
|
+
return '***';
|
|
20
|
+
}
|
|
21
|
+
if (Array.isArray(value)) {
|
|
22
|
+
return value.map(() => '***');
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === 'object' && value !== null) {
|
|
25
|
+
return Object.keys(value).reduce((masked, k) => ({
|
|
26
|
+
...masked,
|
|
27
|
+
[k]: maskSensitiveValue(k, value[k])
|
|
28
|
+
}), {});
|
|
29
|
+
}
|
|
30
|
+
return '***';
|
|
31
|
+
}
|
|
32
|
+
export function sanitizeObject(obj) {
|
|
33
|
+
return Object.entries(obj).reduce((sanitized, [key, value]) => {
|
|
34
|
+
// Always check if the key itself is sensitive first
|
|
35
|
+
if (isSensitiveKey(key)) {
|
|
36
|
+
sanitized[key] = maskSensitiveValue(key, value);
|
|
37
|
+
}
|
|
38
|
+
else if (Array.isArray(value)) {
|
|
39
|
+
// Handle arrays - check if it's an array of objects
|
|
40
|
+
sanitized[key] = value.map(item => {
|
|
41
|
+
if (typeof item === 'object' && item !== null) {
|
|
42
|
+
return sanitizeObject(item);
|
|
43
|
+
}
|
|
44
|
+
return item;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else if (typeof value === 'object' && value !== null) {
|
|
48
|
+
// Recursively sanitize nested objects
|
|
49
|
+
sanitized[key] = sanitizeObject(value);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
sanitized[key] = value;
|
|
53
|
+
}
|
|
54
|
+
return sanitized;
|
|
55
|
+
}, {});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,cAAc;IACd,WAAW;IACX,SAAS;IACT,QAAQ;IACR,aAAa;IACb,kBAAkB;IAClB,OAAO;IACP,SAAS;CACD,CAAC;AAEX,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAc;IAC5D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,GAAG,MAAM;YACT,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAG,KAAiC,CAAC,CAAC,CAAC,CAAC;SAClE,CAAC,EAAE,EAAE,CAAC,CAAC;IACV,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,GAAM;IAEN,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5D,oDAAoD;QACpD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,SAAS,CAAC,GAAc,CAAC,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAe,CAAC;QAC3E,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,oDAAoD;YACpD,SAAS,CAAC,GAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAC9C,OAAO,cAAc,CAAC,IAA+B,CAAC,CAAC;gBACzD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAe,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,sCAAsC;YACtC,SAAS,CAAC,GAAc,CAAC,GAAG,cAAc,CAAC,KAAgC,CAAe,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAc,CAAC,GAAG,KAAmB,CAAC;QAClD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,EAAO,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ToolConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
command: string;
|
|
5
|
+
defaultArgs: string[];
|
|
6
|
+
defaultOptions: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export declare const SUPPORTED_TOOLS: ToolConfig[];
|
|
9
|
+
export declare function detectInstalledTools(): ToolConfig[];
|
|
10
|
+
export declare function getToolByName(name: string): ToolConfig | undefined;
|
|
11
|
+
//# sourceMappingURL=tool-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-detection.d.ts","sourceRoot":"","sources":["../../src/utils/tool-detection.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,eAAe,EAAE,UAAU,EAiBvC,CAAC;AAEF,wBAAgB,oBAAoB,IAAI,UAAU,EAAE,CAUnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAElE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { sync as commandExistsSync } from 'command-exists';
|
|
2
|
+
export const SUPPORTED_TOOLS = [
|
|
3
|
+
{
|
|
4
|
+
name: 'claude',
|
|
5
|
+
displayName: 'Claude',
|
|
6
|
+
command: 'claude',
|
|
7
|
+
defaultArgs: ['--permission-mode', 'acceptEdits'],
|
|
8
|
+
defaultOptions: {
|
|
9
|
+
'Continue with last context?': '--continue'
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'q',
|
|
14
|
+
displayName: 'Amazon Q',
|
|
15
|
+
command: 'q',
|
|
16
|
+
defaultArgs: [],
|
|
17
|
+
defaultOptions: {}
|
|
18
|
+
}
|
|
19
|
+
];
|
|
20
|
+
export function detectInstalledTools() {
|
|
21
|
+
const installedTools = [];
|
|
22
|
+
for (const tool of SUPPORTED_TOOLS) {
|
|
23
|
+
if (commandExistsSync(tool.command)) {
|
|
24
|
+
installedTools.push(tool);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return installedTools;
|
|
28
|
+
}
|
|
29
|
+
export function getToolByName(name) {
|
|
30
|
+
return SUPPORTED_TOOLS.find(tool => tool.name === name);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=tool-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-detection.js","sourceRoot":"","sources":["../../src/utils/tool-detection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAU3D,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,CAAC,mBAAmB,EAAE,aAAa,CAAC;QACjD,cAAc,EAAE;YACd,6BAA6B,EAAE,YAAY;SAC5C;KACF;IACD;QACE,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,GAAG;QACZ,WAAW,EAAE,EAAE;QACf,cAAc,EAAE,EAAE;KACnB;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB;IAClC,MAAM,cAAc,GAAiB,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class TrieNode {
|
|
2
|
+
children: Map<string, TrieNode>;
|
|
3
|
+
isEndOfPath: boolean;
|
|
4
|
+
fullPath: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class Trie {
|
|
7
|
+
private root;
|
|
8
|
+
insert(path: string): void;
|
|
9
|
+
findCompletions(prefix: string): string[];
|
|
10
|
+
private collectPaths;
|
|
11
|
+
}
|
|
12
|
+
export declare function findCommonPrefix(strings: string[]): string;
|
|
13
|
+
export interface CompletionResult {
|
|
14
|
+
completed: string;
|
|
15
|
+
suggestions: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function completeFilePath(input: string, availablePaths: string[]): CompletionResult;
|
|
18
|
+
//# sourceMappingURL=trie.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trie.d.ts","sourceRoot":"","sources":["../../src/utils/trie.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IACnB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAa;IAC5C,WAAW,EAAE,OAAO,CAAS;IAC7B,QAAQ,EAAE,MAAM,CAAM;CACvB;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,IAAI,CAA4B;IAExC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAc1B,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAkBzC,OAAO,CAAC,YAAY;CASrB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAoB1D;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA2B1F"}
|