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,146 @@
|
|
|
1
|
+
export class SuggestionGenerator {
|
|
2
|
+
generateSuggestions(patterns) {
|
|
3
|
+
// Sort patterns by impact score (frequency * severity weight * correlation)
|
|
4
|
+
const sortedPatterns = this.sortPatternsByImpact(patterns);
|
|
5
|
+
return sortedPatterns.map(pattern => this.generateSuggestion(pattern));
|
|
6
|
+
}
|
|
7
|
+
generateSuggestion(pattern) {
|
|
8
|
+
const baseProps = {
|
|
9
|
+
pattern_type: pattern.type,
|
|
10
|
+
priority: pattern.severity,
|
|
11
|
+
evidence_cited: pattern.evidence.map(e => this.truncateEvidence(e)),
|
|
12
|
+
affected_prompts: pattern.affectedPrompts,
|
|
13
|
+
impact_score: this.calculateImpactScore(pattern),
|
|
14
|
+
expected_improvement: this.calculateExpectedImprovement(pattern),
|
|
15
|
+
};
|
|
16
|
+
switch (pattern.type) {
|
|
17
|
+
case 'verification_gap':
|
|
18
|
+
return {
|
|
19
|
+
...baseProps,
|
|
20
|
+
improvement: 'Add explicit verification steps to ensure all tests pass before marking tasks complete',
|
|
21
|
+
specific_changes: [
|
|
22
|
+
'Add explicit verification step: "Run \'npm test\' and verify ALL tests pass (0 failing)"',
|
|
23
|
+
'Include requirement: "Do not proceed until all tests are green"',
|
|
24
|
+
'Add checkpoint: "After implementation, verify the solution works by running tests"',
|
|
25
|
+
],
|
|
26
|
+
prompt_specific_fixes: this.generatePromptSpecificFixes(pattern, 'verification'),
|
|
27
|
+
implementation_example: `# Verification Requirements
|
|
28
|
+
After completing the implementation:
|
|
29
|
+
1. Run \`npm test\` and ensure output shows "0 failing"
|
|
30
|
+
2. If any tests fail, debug and fix ALL failures
|
|
31
|
+
3. Run tests again to confirm all pass
|
|
32
|
+
4. Only mark complete when ALL tests are green`,
|
|
33
|
+
};
|
|
34
|
+
case 'incomplete_task':
|
|
35
|
+
return {
|
|
36
|
+
...baseProps,
|
|
37
|
+
improvement: 'Ensure all errors are fixed completely before considering the task done',
|
|
38
|
+
specific_changes: [
|
|
39
|
+
'Replace "fix the error" with "fix ALL errors until none remain"',
|
|
40
|
+
'Add instruction: "Continue debugging until all tests pass and build succeeds"',
|
|
41
|
+
'Continue fixing ALL errors until none remain',
|
|
42
|
+
],
|
|
43
|
+
prompt_specific_fixes: this.generatePromptSpecificFixes(pattern, 'completion'),
|
|
44
|
+
implementation_example: `# Task Completion Requirements
|
|
45
|
+
- Fix ALL errors, not just the first one encountered
|
|
46
|
+
- Continue iterating until:
|
|
47
|
+
- All tests pass (0 failures)
|
|
48
|
+
- Build completes successfully
|
|
49
|
+
- No linting errors remain
|
|
50
|
+
- Do not stop at partial success`,
|
|
51
|
+
};
|
|
52
|
+
case 'environment_specific':
|
|
53
|
+
return {
|
|
54
|
+
...baseProps,
|
|
55
|
+
improvement: 'Add environment awareness and branch-specific handling to the prompt',
|
|
56
|
+
specific_changes: [
|
|
57
|
+
'Add environment check: "Note the current git branch with \'git branch\'"',
|
|
58
|
+
'Include branch context: "Consider branch-specific configurations"',
|
|
59
|
+
'Add fallback: "If issues occur on feature branches, check for branch-specific settings"',
|
|
60
|
+
],
|
|
61
|
+
prompt_specific_fixes: this.generatePromptSpecificFixes(pattern, 'environment'),
|
|
62
|
+
implementation_example: `# Environment Awareness
|
|
63
|
+
1. Check current branch: \`git branch --show-current\`
|
|
64
|
+
2. Note any branch-specific configurations
|
|
65
|
+
3. If on a feature branch, ensure compatibility with main branch
|
|
66
|
+
4. Test changes work on both current branch and main`,
|
|
67
|
+
};
|
|
68
|
+
case 'ambiguous_objective':
|
|
69
|
+
return {
|
|
70
|
+
...baseProps,
|
|
71
|
+
improvement: 'Replace ambiguous instructions with specific, measurable criteria',
|
|
72
|
+
specific_changes: [
|
|
73
|
+
'Define specific error types to fix',
|
|
74
|
+
'Specify exact success criteria (e.g., "all 5 tests pass")',
|
|
75
|
+
'Define clear success criteria',
|
|
76
|
+
'List specific tasks in priority order',
|
|
77
|
+
],
|
|
78
|
+
prompt_specific_fixes: this.generatePromptSpecificFixes(pattern, 'clarity'),
|
|
79
|
+
implementation_example: `# Clear Objectives
|
|
80
|
+
Instead of: "Fix the errors"
|
|
81
|
+
Use: "Fix all TypeScript compilation errors (npm run build should succeed with 0 errors)"
|
|
82
|
+
|
|
83
|
+
Instead of: "Make it work"
|
|
84
|
+
Use: "Ensure all unit tests pass (npm test shows 0 failures) and the feature works as specified"`,
|
|
85
|
+
};
|
|
86
|
+
default:
|
|
87
|
+
return {
|
|
88
|
+
...baseProps,
|
|
89
|
+
improvement: 'Review and improve prompt clarity',
|
|
90
|
+
specific_changes: ['Add specific success criteria', 'Include verification steps'],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
sortPatternsByImpact(patterns) {
|
|
95
|
+
return patterns.sort((a, b) => {
|
|
96
|
+
const scoreA = this.calculateImpactScore(a);
|
|
97
|
+
const scoreB = this.calculateImpactScore(b);
|
|
98
|
+
return scoreB - scoreA;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
calculateImpactScore(pattern) {
|
|
102
|
+
const severityWeights = {
|
|
103
|
+
critical: 4,
|
|
104
|
+
high: 3,
|
|
105
|
+
medium: 2,
|
|
106
|
+
low: 1,
|
|
107
|
+
};
|
|
108
|
+
return pattern.frequency * severityWeights[pattern.severity] * pattern.correlation_strength;
|
|
109
|
+
}
|
|
110
|
+
calculateExpectedImprovement(pattern) {
|
|
111
|
+
// Estimate improvement based on correlation strength and severity
|
|
112
|
+
const baseImprovement = pattern.correlation_strength * 100;
|
|
113
|
+
const severityMultiplier = pattern.severity === 'critical' ? 0.9 :
|
|
114
|
+
pattern.severity === 'high' ? 0.7 :
|
|
115
|
+
pattern.severity === 'medium' ? 0.5 : 0.3;
|
|
116
|
+
const improvement = Math.round(baseImprovement * severityMultiplier);
|
|
117
|
+
return `${improvement}% reduction in ${pattern.type.replace(/_/g, ' ')} issues`;
|
|
118
|
+
}
|
|
119
|
+
generatePromptSpecificFixes(pattern, fixType) {
|
|
120
|
+
const fixes = {};
|
|
121
|
+
pattern.affectedPrompts.forEach(promptName => {
|
|
122
|
+
switch (fixType) {
|
|
123
|
+
case 'verification':
|
|
124
|
+
fixes[promptName] = `Add to ${promptName}: "After implementation, run tests and verify 0 failures before proceeding"`;
|
|
125
|
+
break;
|
|
126
|
+
case 'completion':
|
|
127
|
+
fixes[promptName] = `Update ${promptName}: Replace partial fix instructions with "Continue until ALL errors are resolved"`;
|
|
128
|
+
break;
|
|
129
|
+
case 'environment':
|
|
130
|
+
fixes[promptName] = `Enhance ${promptName}: Add git branch awareness and environment checks`;
|
|
131
|
+
break;
|
|
132
|
+
case 'clarity':
|
|
133
|
+
fixes[promptName] = `Clarify ${promptName}: Replace vague objectives with specific, measurable success criteria`;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
return fixes;
|
|
138
|
+
}
|
|
139
|
+
truncateEvidence(text, maxLength = 100) {
|
|
140
|
+
if (text.length <= maxLength) {
|
|
141
|
+
return text;
|
|
142
|
+
}
|
|
143
|
+
return text.substring(0, maxLength - 3) + '...';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=suggestion-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestion-generator.js","sourceRoot":"","sources":["../../src/services/suggestion-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Ora } from 'ora';
|
|
2
|
+
export declare enum LogLevel {
|
|
3
|
+
ERROR = 0,
|
|
4
|
+
WARN = 1,
|
|
5
|
+
INFO = 2,
|
|
6
|
+
DEBUG = 3
|
|
7
|
+
}
|
|
8
|
+
export interface UIOptions {
|
|
9
|
+
logLevel?: LogLevel;
|
|
10
|
+
useColor?: boolean;
|
|
11
|
+
silent?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ListOptions {
|
|
14
|
+
numbered?: boolean;
|
|
15
|
+
indent?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class ConsoleUI {
|
|
18
|
+
private logLevel;
|
|
19
|
+
private useColor;
|
|
20
|
+
private silent;
|
|
21
|
+
constructor(options?: UIOptions);
|
|
22
|
+
success(message: string): void;
|
|
23
|
+
error(error: Error | string): void;
|
|
24
|
+
warn(message: string): void;
|
|
25
|
+
info(message: string): void;
|
|
26
|
+
debug(message: string): void;
|
|
27
|
+
prompt(title: string, description?: string): void;
|
|
28
|
+
progress(message: string, current: number, total: number): void;
|
|
29
|
+
spinner(text: string): Ora;
|
|
30
|
+
table(data: unknown[]): void;
|
|
31
|
+
json(data: unknown, pretty?: boolean): void;
|
|
32
|
+
list(items: string[], options?: ListOptions): void;
|
|
33
|
+
header(text: string): void;
|
|
34
|
+
box(content: string, title?: string): void;
|
|
35
|
+
divider(): void;
|
|
36
|
+
formatCommand(command: string): string;
|
|
37
|
+
formatPath(path: string): string;
|
|
38
|
+
formatUrl(url: string): string;
|
|
39
|
+
formatHighlight(text: string): string;
|
|
40
|
+
formatDim(text: string): string;
|
|
41
|
+
formatBold(text: string): string;
|
|
42
|
+
setLogLevel(level: LogLevel): void;
|
|
43
|
+
setSilent(silent: boolean): void;
|
|
44
|
+
setUseColor(useColor: boolean): void;
|
|
45
|
+
clear(): void;
|
|
46
|
+
newline(): void;
|
|
47
|
+
}
|
|
48
|
+
export declare const ui: ConsoleUI;
|
|
49
|
+
//# sourceMappingURL=ui-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-service.d.ts","sourceRoot":"","sources":["../../src/services/ui-service.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,MAAM,CAAU;gBAEZ,OAAO,GAAE,SAAc;IAWnC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM9B,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI;IAOlC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAQjD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAU/D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAiB1B,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAK5B,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,UAAO,GAAG,IAAI;IAMxC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,IAAI;IActD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO1B,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAa1C,OAAO,IAAI,IAAI;IAOf,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAItC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIhC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI9B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIrC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI/B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKhC,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAIlC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAIhC,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAMpC,KAAK,IAAI,IAAI;IAMb,OAAO,IAAI,IAAI;CAKhB;AAGD,eAAO,MAAM,EAAE,WAAkB,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import boxen from 'boxen';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
export var LogLevel;
|
|
6
|
+
(function (LogLevel) {
|
|
7
|
+
LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
|
|
8
|
+
LogLevel[LogLevel["WARN"] = 1] = "WARN";
|
|
9
|
+
LogLevel[LogLevel["INFO"] = 2] = "INFO";
|
|
10
|
+
LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
|
|
11
|
+
})(LogLevel || (LogLevel = {}));
|
|
12
|
+
export class ConsoleUI {
|
|
13
|
+
logLevel;
|
|
14
|
+
useColor;
|
|
15
|
+
silent;
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.logLevel = options.logLevel ?? LogLevel.INFO;
|
|
18
|
+
this.useColor = options.useColor ?? chalk.level > 0;
|
|
19
|
+
this.silent = options.silent ?? false;
|
|
20
|
+
// Disable chalk if colors are disabled
|
|
21
|
+
if (!this.useColor) {
|
|
22
|
+
chalk.level = 0;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
success(message) {
|
|
26
|
+
if (this.silent || this.logLevel < LogLevel.INFO)
|
|
27
|
+
return;
|
|
28
|
+
const formatted = this.useColor ? chalk.green('✅ ' + message) : '✅ ' + message;
|
|
29
|
+
logger.log(formatted);
|
|
30
|
+
}
|
|
31
|
+
error(error) {
|
|
32
|
+
if (this.silent || this.logLevel < LogLevel.ERROR)
|
|
33
|
+
return;
|
|
34
|
+
const message = error instanceof Error ? error.message : error;
|
|
35
|
+
const formatted = this.useColor ? chalk.red('❌ ' + message) : '❌ ' + message;
|
|
36
|
+
logger.error(formatted);
|
|
37
|
+
}
|
|
38
|
+
warn(message) {
|
|
39
|
+
if (this.silent || this.logLevel < LogLevel.WARN)
|
|
40
|
+
return;
|
|
41
|
+
const formatted = this.useColor ? chalk.yellow('⚠️ ' + message) : '⚠️ ' + message;
|
|
42
|
+
logger.warn(formatted);
|
|
43
|
+
}
|
|
44
|
+
info(message) {
|
|
45
|
+
if (this.silent || this.logLevel < LogLevel.INFO)
|
|
46
|
+
return;
|
|
47
|
+
const formatted = this.useColor ? chalk.blue('ℹ️ ' + message) : 'ℹ️ ' + message;
|
|
48
|
+
logger.log(formatted);
|
|
49
|
+
}
|
|
50
|
+
debug(message) {
|
|
51
|
+
if (this.silent || this.logLevel < LogLevel.DEBUG)
|
|
52
|
+
return;
|
|
53
|
+
const formatted = this.useColor ? chalk.gray('🐛 ' + message) : '🐛 ' + message;
|
|
54
|
+
logger.log(formatted);
|
|
55
|
+
}
|
|
56
|
+
prompt(title, description) {
|
|
57
|
+
if (this.silent)
|
|
58
|
+
return;
|
|
59
|
+
logger.log(this.useColor ? chalk.bold.blue(`\n📝 ${title}`) : `\n📝 ${title}`);
|
|
60
|
+
if (description) {
|
|
61
|
+
logger.log(this.useColor ? chalk.dim(description) : description);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
progress(message, current, total) {
|
|
65
|
+
if (this.silent || this.logLevel < LogLevel.INFO)
|
|
66
|
+
return;
|
|
67
|
+
const percentage = Math.round((current / total) * 100);
|
|
68
|
+
const progress = `[${current}/${total}] ${percentage}%`;
|
|
69
|
+
const formatted = this.useColor
|
|
70
|
+
? `${chalk.cyan(progress)} ${message}`
|
|
71
|
+
: `${progress} ${message}`;
|
|
72
|
+
logger.log(formatted);
|
|
73
|
+
}
|
|
74
|
+
spinner(text) {
|
|
75
|
+
if (this.silent) {
|
|
76
|
+
// Return a no-op spinner
|
|
77
|
+
return {
|
|
78
|
+
start: () => ({ succeed: () => { }, fail: () => { }, stop: () => { } }),
|
|
79
|
+
succeed: () => { },
|
|
80
|
+
fail: () => { },
|
|
81
|
+
stop: () => { },
|
|
82
|
+
text: ''
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return ora({
|
|
86
|
+
text,
|
|
87
|
+
color: this.useColor ? 'cyan' : undefined
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
table(data) {
|
|
91
|
+
if (this.silent || this.logLevel < LogLevel.INFO)
|
|
92
|
+
return;
|
|
93
|
+
console.table(data);
|
|
94
|
+
}
|
|
95
|
+
json(data, pretty = true) {
|
|
96
|
+
if (this.silent || this.logLevel < LogLevel.INFO)
|
|
97
|
+
return;
|
|
98
|
+
const output = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
|
|
99
|
+
logger.log(output);
|
|
100
|
+
}
|
|
101
|
+
list(items, options = {}) {
|
|
102
|
+
if (this.silent || this.logLevel < LogLevel.INFO)
|
|
103
|
+
return;
|
|
104
|
+
const { numbered = false, indent = 2 } = options;
|
|
105
|
+
const indentation = ' '.repeat(indent);
|
|
106
|
+
items.forEach((item, index) => {
|
|
107
|
+
const prefix = numbered ? `${index + 1}.` : '•';
|
|
108
|
+
const formatted = this.useColor
|
|
109
|
+
? chalk.dim(`${indentation}${prefix} ${item}`)
|
|
110
|
+
: `${indentation}${prefix} ${item}`;
|
|
111
|
+
logger.log(formatted);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
header(text) {
|
|
115
|
+
if (this.silent)
|
|
116
|
+
return;
|
|
117
|
+
const divider = '─'.repeat(text.length + 4);
|
|
118
|
+
logger.log(this.useColor ? chalk.bold(`\n${text}`) : `\n${text}`);
|
|
119
|
+
logger.log(this.useColor ? chalk.dim(divider) : divider);
|
|
120
|
+
}
|
|
121
|
+
box(content, title) {
|
|
122
|
+
if (this.silent)
|
|
123
|
+
return;
|
|
124
|
+
const boxOptions = {
|
|
125
|
+
padding: 1,
|
|
126
|
+
margin: 1,
|
|
127
|
+
borderStyle: 'round',
|
|
128
|
+
borderColor: this.useColor ? 'cyan' : undefined,
|
|
129
|
+
...(title ? { title, titleAlignment: 'center' } : {})
|
|
130
|
+
};
|
|
131
|
+
logger.log(boxen(content, boxOptions));
|
|
132
|
+
}
|
|
133
|
+
divider() {
|
|
134
|
+
if (this.silent)
|
|
135
|
+
return;
|
|
136
|
+
const line = '─'.repeat(50);
|
|
137
|
+
logger.log(this.useColor ? chalk.dim(line) : line);
|
|
138
|
+
}
|
|
139
|
+
// Formatting helpers
|
|
140
|
+
formatCommand(command) {
|
|
141
|
+
return this.useColor ? chalk.green(`▶️ ${command}`) : `▶️ ${command}`;
|
|
142
|
+
}
|
|
143
|
+
formatPath(path) {
|
|
144
|
+
return this.useColor ? chalk.cyan(path) : path;
|
|
145
|
+
}
|
|
146
|
+
formatUrl(url) {
|
|
147
|
+
return this.useColor ? chalk.underline.blue(url) : url;
|
|
148
|
+
}
|
|
149
|
+
formatHighlight(text) {
|
|
150
|
+
return this.useColor ? chalk.yellow(text) : text;
|
|
151
|
+
}
|
|
152
|
+
formatDim(text) {
|
|
153
|
+
return this.useColor ? chalk.dim(text) : text;
|
|
154
|
+
}
|
|
155
|
+
formatBold(text) {
|
|
156
|
+
return this.useColor ? chalk.bold(text) : text;
|
|
157
|
+
}
|
|
158
|
+
// State management
|
|
159
|
+
setLogLevel(level) {
|
|
160
|
+
this.logLevel = level;
|
|
161
|
+
}
|
|
162
|
+
setSilent(silent) {
|
|
163
|
+
this.silent = silent;
|
|
164
|
+
}
|
|
165
|
+
setUseColor(useColor) {
|
|
166
|
+
this.useColor = useColor;
|
|
167
|
+
chalk.level = useColor ? 3 : 0;
|
|
168
|
+
}
|
|
169
|
+
// Utility methods
|
|
170
|
+
clear() {
|
|
171
|
+
if (!this.silent) {
|
|
172
|
+
console.clear();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
newline() {
|
|
176
|
+
if (!this.silent) {
|
|
177
|
+
logger.log();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Export a singleton instance for convenience
|
|
182
|
+
export const ui = new ConsoleUI();
|
|
183
|
+
//# sourceMappingURL=ui-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-service.js","sourceRoot":"","sources":["../../src/services/ui-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/template/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAOzD,wBAAgB,eAAe,CAAC,UAAU,EAAE,OAAO,UAAU,EAAE,OAAO,EAAE,eAAe,QAqHtF"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { input, select, confirm, editor, checkbox, password } from '@inquirer/prompts';
|
|
2
|
+
import crypto from 'node:crypto';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import { fileSearchPrompt } from '../../prompts/input-types/file-search-prompt.js';
|
|
5
|
+
import { reviewFilePrompt } from '../../prompts/input-types/review-file-prompt.js';
|
|
6
|
+
import { DateFormats } from '../../utils/date-formatter.js';
|
|
7
|
+
export function registerHelpers(handlebars, context) {
|
|
8
|
+
// Static helpers
|
|
9
|
+
handlebars.registerHelper('date', () => {
|
|
10
|
+
return DateFormats.LOCAL_DATE(new Date());
|
|
11
|
+
});
|
|
12
|
+
handlebars.registerHelper('time', () => {
|
|
13
|
+
return DateFormats.LOCAL_TIME(new Date());
|
|
14
|
+
});
|
|
15
|
+
handlebars.registerHelper('datetime', () => {
|
|
16
|
+
return DateFormats.LOCAL_DATETIME(new Date());
|
|
17
|
+
});
|
|
18
|
+
handlebars.registerHelper('timestamp', () => {
|
|
19
|
+
return Date.now();
|
|
20
|
+
});
|
|
21
|
+
handlebars.registerHelper('uuid', () => {
|
|
22
|
+
return crypto.randomUUID();
|
|
23
|
+
});
|
|
24
|
+
handlebars.registerHelper('cwd', () => {
|
|
25
|
+
return process.cwd();
|
|
26
|
+
});
|
|
27
|
+
handlebars.registerHelper('hostname', () => {
|
|
28
|
+
return os.hostname();
|
|
29
|
+
});
|
|
30
|
+
handlebars.registerHelper('username', () => {
|
|
31
|
+
return os.userInfo().username;
|
|
32
|
+
});
|
|
33
|
+
// Input helpers
|
|
34
|
+
const createInputHelper = (type, promptFn) => {
|
|
35
|
+
handlebars.registerHelper(type, function (...args) {
|
|
36
|
+
const options = args[args.length - 1];
|
|
37
|
+
// Parse arguments
|
|
38
|
+
let name;
|
|
39
|
+
let message;
|
|
40
|
+
if (typeof args[0] === 'string') {
|
|
41
|
+
name = args[0];
|
|
42
|
+
message = typeof args[1] === 'string' ? args[1] : undefined;
|
|
43
|
+
}
|
|
44
|
+
else if (options.hash && options.hash.name) {
|
|
45
|
+
name = options.hash.name;
|
|
46
|
+
message = options.hash.message;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
throw new Error(`${type} helper requires a name`);
|
|
50
|
+
}
|
|
51
|
+
// Get cached value
|
|
52
|
+
const cached = context.get(name);
|
|
53
|
+
if (cached !== undefined) {
|
|
54
|
+
return cached;
|
|
55
|
+
}
|
|
56
|
+
// Find variable definition
|
|
57
|
+
const varDef = context.getVariableDefinition(name);
|
|
58
|
+
// Build prompt config
|
|
59
|
+
const promptConfig = {
|
|
60
|
+
message: message || varDef?.message || generateDefaultMessage(name, type),
|
|
61
|
+
};
|
|
62
|
+
if (varDef) {
|
|
63
|
+
if (varDef.default !== undefined)
|
|
64
|
+
promptConfig.default = varDef.default;
|
|
65
|
+
if (varDef.choices)
|
|
66
|
+
promptConfig.choices = varDef.choices;
|
|
67
|
+
if (varDef.validate) {
|
|
68
|
+
// Convert string regex to function
|
|
69
|
+
if (typeof varDef.validate === 'string') {
|
|
70
|
+
const regex = new RegExp(varDef.validate);
|
|
71
|
+
promptConfig.validate = (input) => {
|
|
72
|
+
return regex.test(input) || 'Invalid format';
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Add file-specific properties
|
|
77
|
+
if (type === 'file' || type === 'reviewFile') {
|
|
78
|
+
if (varDef.basePath)
|
|
79
|
+
promptConfig.basePath = varDef.basePath;
|
|
80
|
+
if (varDef.filter)
|
|
81
|
+
promptConfig.filter = varDef.filter;
|
|
82
|
+
if (varDef.autoReview !== undefined)
|
|
83
|
+
promptConfig.autoReview = varDef.autoReview;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Handle choices from helper arguments
|
|
87
|
+
if (options.hash && options.hash.choices) {
|
|
88
|
+
promptConfig.choices = options.hash.choices;
|
|
89
|
+
}
|
|
90
|
+
// Create async placeholder
|
|
91
|
+
const placeholder = `__ASYNC_${type}_${name}__`;
|
|
92
|
+
// Queue the async operation
|
|
93
|
+
context.queueAsyncOperation(async () => {
|
|
94
|
+
const value = await promptFn(promptConfig);
|
|
95
|
+
context.set(name, value);
|
|
96
|
+
context.setType(name, type);
|
|
97
|
+
return { placeholder, value: String(value) };
|
|
98
|
+
});
|
|
99
|
+
return placeholder;
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
// Register all input helpers
|
|
103
|
+
createInputHelper('input', input);
|
|
104
|
+
createInputHelper('select', select);
|
|
105
|
+
createInputHelper('multiselect', checkbox);
|
|
106
|
+
createInputHelper('confirm', confirm);
|
|
107
|
+
createInputHelper('editor', editor);
|
|
108
|
+
createInputHelper('password', password);
|
|
109
|
+
createInputHelper('file', fileSearchPrompt);
|
|
110
|
+
createInputHelper('reviewFile', reviewFilePrompt);
|
|
111
|
+
}
|
|
112
|
+
function generateDefaultMessage(name, type) {
|
|
113
|
+
// Convert camelCase/snake_case to human readable
|
|
114
|
+
const humanized = name
|
|
115
|
+
.replace(/([A-Z])/g, ' $1')
|
|
116
|
+
.replace(/_/g, ' ')
|
|
117
|
+
.trim()
|
|
118
|
+
.toLowerCase();
|
|
119
|
+
const capitalized = humanized.charAt(0).toUpperCase() + humanized.slice(1);
|
|
120
|
+
const suffix = {
|
|
121
|
+
input: ':',
|
|
122
|
+
select: ':',
|
|
123
|
+
multiselect: ' (select multiple):',
|
|
124
|
+
confirm: '?',
|
|
125
|
+
editor: ' (press enter to open editor):',
|
|
126
|
+
password: ':',
|
|
127
|
+
file: ':',
|
|
128
|
+
reviewFile: ':',
|
|
129
|
+
}[type] || ':';
|
|
130
|
+
return `${capitalized}${suffix}`;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/template/helpers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5D,MAAM,UAAU,eAAe,CAAC,UAA6B,EAAE,OAAwB;IACrF,iBAAiB;IACjB,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE;QACrC,OAAO,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE;QACrC,OAAO,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE;QACzC,OAAO,WAAW,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,EAAE;QAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE;QACrC,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE;QACpC,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE;QACzC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE;QACzC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,gBAAgB;IAChB,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,QAAiB,EAAE,EAAE;QAC5D,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,UAAyB,GAAG,IAAe;YACzE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAsE,CAAC;YAE3G,kBAAkB;YAClB,IAAI,IAAY,CAAC;YACjB,IAAI,OAA2B,CAAC;YAGhC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAChC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACf,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9D,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC7C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBACzB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,yBAAyB,CAAC,CAAC;YACpD,CAAC;YAED,mBAAmB;YACnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,2BAA2B;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAEnD,sBAAsB;YACtB,MAAM,YAAY,GAA4B;gBAC5C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,OAAO,IAAI,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC;aAC1E,CAAC;YAEF,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;oBAAE,YAAY,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxE,IAAI,MAAM,CAAC,OAAO;oBAAE,YAAY,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBAC1D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACpB,mCAAmC;oBACnC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBACxC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC1C,YAAY,CAAC,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE;4BACxC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC;wBAC/C,CAAC,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,+BAA+B;gBAC/B,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC7C,IAAI,MAAM,CAAC,QAAQ;wBAAE,YAAY,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;oBAC7D,IAAI,MAAM,CAAC,MAAM;wBAAE,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBACvD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;wBAAE,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;gBACnF,CAAC;YACH,CAAC;YAED,uCAAuC;YACvC,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACzC,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9C,CAAC;YAED,2BAA2B;YAC3B,MAAM,WAAW,GAAG,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC;YAEhD,4BAA4B;YAC5B,OAAO,CAAC,mBAAmB,CAAC,KAAK,IAAI,EAAE;gBACrC,MAAM,KAAK,GAAG,MAAO,QAAkD,CAAC,YAAY,CAAC,CAAC;gBACtF,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACzB,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC5B,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,6BAA6B;IAC7B,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC3C,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxC,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC5C,iBAAiB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,IAAY;IACxD,iDAAiD;IACjD,MAAM,SAAS,GAAG,IAAI;SACnB,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;SAC1B,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IAEjB,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,MAAM,GACV;QACE,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,qBAAqB;QAClC,OAAO,EAAE,GAAG;QACZ,MAAM,EAAE,gCAAgC;QACxC,QAAQ,EAAE,GAAG;QACb,IAAI,EAAE,GAAG;QACT,UAAU,EAAE,GAAG;KAChB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;IAEjB,OAAO,GAAG,WAAW,GAAG,MAAM,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { VariableDefinition } from '../types/prompt.js';
|
|
2
|
+
export declare class TemplateContext {
|
|
3
|
+
private values;
|
|
4
|
+
private asyncOperations;
|
|
5
|
+
private variableDefinitions;
|
|
6
|
+
private variableTypes;
|
|
7
|
+
constructor(variables?: VariableDefinition[]);
|
|
8
|
+
get(name: string): unknown;
|
|
9
|
+
set(name: string, value: unknown): void;
|
|
10
|
+
setType(name: string, type: string): void;
|
|
11
|
+
getType(name: string): string | undefined;
|
|
12
|
+
getVariablesByType(type: string): Array<{
|
|
13
|
+
name: string;
|
|
14
|
+
value: unknown;
|
|
15
|
+
}>;
|
|
16
|
+
getMasked(name: string): unknown;
|
|
17
|
+
getVariableDefinition(name: string): VariableDefinition | undefined;
|
|
18
|
+
queueAsyncOperation(operation: () => Promise<{
|
|
19
|
+
placeholder: string;
|
|
20
|
+
value: unknown;
|
|
21
|
+
}>): void;
|
|
22
|
+
processAsyncOperations(template: string): Promise<string>;
|
|
23
|
+
getAllValues(): Map<string, unknown>;
|
|
24
|
+
getMaskedValues(): Map<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=template-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-context.d.ts","sourceRoot":"","sources":["../../src/template/template-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,eAAe,CAAqE;IAC5F,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,aAAa,CAA6B;gBAEtC,SAAS,CAAC,EAAE,kBAAkB,EAAE;IAI5C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIvC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAUzE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKhC,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAInE,mBAAmB,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI;IAItF,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB/D,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAIpC,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;CASxC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { maskSensitiveValue } from '../utils/security.js';
|
|
2
|
+
export class TemplateContext {
|
|
3
|
+
values = new Map();
|
|
4
|
+
asyncOperations = [];
|
|
5
|
+
variableDefinitions = [];
|
|
6
|
+
variableTypes = new Map();
|
|
7
|
+
constructor(variables) {
|
|
8
|
+
this.variableDefinitions = variables || [];
|
|
9
|
+
}
|
|
10
|
+
get(name) {
|
|
11
|
+
return this.values.get(name);
|
|
12
|
+
}
|
|
13
|
+
set(name, value) {
|
|
14
|
+
this.values.set(name, value);
|
|
15
|
+
}
|
|
16
|
+
setType(name, type) {
|
|
17
|
+
this.variableTypes.set(name, type);
|
|
18
|
+
}
|
|
19
|
+
getType(name) {
|
|
20
|
+
return this.variableTypes.get(name);
|
|
21
|
+
}
|
|
22
|
+
getVariablesByType(type) {
|
|
23
|
+
const result = [];
|
|
24
|
+
for (const [name, varType] of this.variableTypes) {
|
|
25
|
+
if (varType === type) {
|
|
26
|
+
result.push({ name, value: this.values.get(name) });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
getMasked(name) {
|
|
32
|
+
const value = this.get(name);
|
|
33
|
+
return maskSensitiveValue(name, value);
|
|
34
|
+
}
|
|
35
|
+
getVariableDefinition(name) {
|
|
36
|
+
return this.variableDefinitions.find(v => v.name === name);
|
|
37
|
+
}
|
|
38
|
+
queueAsyncOperation(operation) {
|
|
39
|
+
this.asyncOperations.push(operation);
|
|
40
|
+
}
|
|
41
|
+
async processAsyncOperations(template) {
|
|
42
|
+
let result = template;
|
|
43
|
+
// Process async operations sequentially
|
|
44
|
+
for (const operation of this.asyncOperations) {
|
|
45
|
+
const { placeholder, value } = await operation();
|
|
46
|
+
// Escape any Handlebars syntax in user input by replacing {{ with a placeholder
|
|
47
|
+
const escapedValue = String(value).replace(/{{/g, '__ESCAPED_OPEN__').replace(/}}/g, '__ESCAPED_CLOSE__');
|
|
48
|
+
result = result.replace(new RegExp(placeholder, 'g'), escapedValue);
|
|
49
|
+
}
|
|
50
|
+
// Clear operations for next run
|
|
51
|
+
this.asyncOperations = [];
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
getAllValues() {
|
|
55
|
+
return new Map(this.values);
|
|
56
|
+
}
|
|
57
|
+
getMaskedValues() {
|
|
58
|
+
const masked = new Map();
|
|
59
|
+
for (const [key] of this.values) {
|
|
60
|
+
masked.set(key, this.getMasked(key));
|
|
61
|
+
}
|
|
62
|
+
return masked;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=template-context.js.map
|