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.
Files changed (240) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +517 -0
  3. package/dist/annotations/annotation-analyzer.d.ts +17 -0
  4. package/dist/annotations/annotation-analyzer.d.ts.map +1 -0
  5. package/dist/annotations/annotation-analyzer.js +145 -0
  6. package/dist/annotations/annotation-analyzer.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +375 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/add.d.ts +2 -0
  12. package/dist/commands/add.d.ts.map +1 -0
  13. package/dist/commands/add.js +149 -0
  14. package/dist/commands/add.js.map +1 -0
  15. package/dist/commands/annotate.d.ts +2 -0
  16. package/dist/commands/annotate.d.ts.map +1 -0
  17. package/dist/commands/annotate.js +223 -0
  18. package/dist/commands/annotate.js.map +1 -0
  19. package/dist/commands/base-command.d.ts +23 -0
  20. package/dist/commands/base-command.d.ts.map +1 -0
  21. package/dist/commands/base-command.js +41 -0
  22. package/dist/commands/base-command.js.map +1 -0
  23. package/dist/commands/edit.d.ts +2 -0
  24. package/dist/commands/edit.d.ts.map +1 -0
  25. package/dist/commands/edit.js +31 -0
  26. package/dist/commands/edit.js.map +1 -0
  27. package/dist/commands/help.d.ts +2 -0
  28. package/dist/commands/help.d.ts.map +1 -0
  29. package/dist/commands/help.js +25 -0
  30. package/dist/commands/help.js.map +1 -0
  31. package/dist/commands/history.d.ts +9 -0
  32. package/dist/commands/history.d.ts.map +1 -0
  33. package/dist/commands/history.js +232 -0
  34. package/dist/commands/history.js.map +1 -0
  35. package/dist/commands/init-refactored.d.ts +19 -0
  36. package/dist/commands/init-refactored.d.ts.map +1 -0
  37. package/dist/commands/init-refactored.js +141 -0
  38. package/dist/commands/init-refactored.js.map +1 -0
  39. package/dist/commands/init.d.ts +2 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +124 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/install.d.ts +10 -0
  44. package/dist/commands/install.d.ts.map +1 -0
  45. package/dist/commands/install.js +224 -0
  46. package/dist/commands/install.js.map +1 -0
  47. package/dist/commands/review.d.ts +3 -0
  48. package/dist/commands/review.d.ts.map +1 -0
  49. package/dist/commands/review.js +158 -0
  50. package/dist/commands/review.js.map +1 -0
  51. package/dist/commands/run.d.ts +28 -0
  52. package/dist/commands/run.d.ts.map +1 -0
  53. package/dist/commands/run.js +340 -0
  54. package/dist/commands/run.js.map +1 -0
  55. package/dist/config/config-manager.d.ts +19 -0
  56. package/dist/config/config-manager.d.ts.map +1 -0
  57. package/dist/config/config-manager.js +386 -0
  58. package/dist/config/config-manager.js.map +1 -0
  59. package/dist/config/migration.d.ts +11 -0
  60. package/dist/config/migration.d.ts.map +1 -0
  61. package/dist/config/migration.js +153 -0
  62. package/dist/config/migration.js.map +1 -0
  63. package/dist/history/enhanced-history-manager.d.ts +25 -0
  64. package/dist/history/enhanced-history-manager.d.ts.map +1 -0
  65. package/dist/history/enhanced-history-manager.js +88 -0
  66. package/dist/history/enhanced-history-manager.js.map +1 -0
  67. package/dist/history/history-manager.d.ts +33 -0
  68. package/dist/history/history-manager.d.ts.map +1 -0
  69. package/dist/history/history-manager.js +176 -0
  70. package/dist/history/history-manager.js.map +1 -0
  71. package/dist/index.d.ts +6 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +6 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/prompts/input-types/file-prompt.d.ts +12 -0
  76. package/dist/prompts/input-types/file-prompt.d.ts.map +1 -0
  77. package/dist/prompts/input-types/file-prompt.js +166 -0
  78. package/dist/prompts/input-types/file-prompt.js.map +1 -0
  79. package/dist/prompts/input-types/file-search-prompt.d.ts +12 -0
  80. package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
  81. package/dist/prompts/input-types/file-search-prompt.js +54 -0
  82. package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
  83. package/dist/prompts/input-types/review-file-prompt.d.ts +4 -0
  84. package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
  85. package/dist/prompts/input-types/review-file-prompt.js +10 -0
  86. package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
  87. package/dist/prompts/prompt-manager.d.ts +12 -0
  88. package/dist/prompts/prompt-manager.d.ts.map +1 -0
  89. package/dist/prompts/prompt-manager.js +102 -0
  90. package/dist/prompts/prompt-manager.js.map +1 -0
  91. package/dist/pupt-1.2.0.tgz +0 -0
  92. package/dist/schemas/config-schema.d.ts +1268 -0
  93. package/dist/schemas/config-schema.d.ts.map +1 -0
  94. package/dist/schemas/config-schema.js +100 -0
  95. package/dist/schemas/config-schema.js.map +1 -0
  96. package/dist/schemas/prompt-schema.d.ts +927 -0
  97. package/dist/schemas/prompt-schema.d.ts.map +1 -0
  98. package/dist/schemas/prompt-schema.js +110 -0
  99. package/dist/schemas/prompt-schema.js.map +1 -0
  100. package/dist/search/file-search-engine.d.ts +36 -0
  101. package/dist/search/file-search-engine.d.ts.map +1 -0
  102. package/dist/search/file-search-engine.js +184 -0
  103. package/dist/search/file-search-engine.js.map +1 -0
  104. package/dist/search/search-engine.d.ts +8 -0
  105. package/dist/search/search-engine.d.ts.map +1 -0
  106. package/dist/search/search-engine.js +52 -0
  107. package/dist/search/search-engine.js.map +1 -0
  108. package/dist/services/auto-annotation-service.d.ts +39 -0
  109. package/dist/services/auto-annotation-service.d.ts.map +1 -0
  110. package/dist/services/auto-annotation-service.js +203 -0
  111. package/dist/services/auto-annotation-service.js.map +1 -0
  112. package/dist/services/file-system-service.d.ts +42 -0
  113. package/dist/services/file-system-service.d.ts.map +1 -0
  114. package/dist/services/file-system-service.js +269 -0
  115. package/dist/services/file-system-service.js.map +1 -0
  116. package/dist/services/git-service.d.ts +27 -0
  117. package/dist/services/git-service.d.ts.map +1 -0
  118. package/dist/services/git-service.js +157 -0
  119. package/dist/services/git-service.js.map +1 -0
  120. package/dist/services/logging-service.d.ts +50 -0
  121. package/dist/services/logging-service.d.ts.map +1 -0
  122. package/dist/services/logging-service.js +203 -0
  123. package/dist/services/logging-service.js.map +1 -0
  124. package/dist/services/output-capture-service.d.ts +25 -0
  125. package/dist/services/output-capture-service.d.ts.map +1 -0
  126. package/dist/services/output-capture-service.js +277 -0
  127. package/dist/services/output-capture-service.js.map +1 -0
  128. package/dist/services/pattern-detector.d.ts +15 -0
  129. package/dist/services/pattern-detector.d.ts.map +1 -0
  130. package/dist/services/pattern-detector.js +219 -0
  131. package/dist/services/pattern-detector.js.map +1 -0
  132. package/dist/services/prompt-service.d.ts +30 -0
  133. package/dist/services/prompt-service.d.ts.map +1 -0
  134. package/dist/services/prompt-service.js +278 -0
  135. package/dist/services/prompt-service.js.map +1 -0
  136. package/dist/services/review-data-builder.d.ts +22 -0
  137. package/dist/services/review-data-builder.d.ts.map +1 -0
  138. package/dist/services/review-data-builder.js +263 -0
  139. package/dist/services/review-data-builder.js.map +1 -0
  140. package/dist/services/suggestion-generator.d.ts +11 -0
  141. package/dist/services/suggestion-generator.d.ts.map +1 -0
  142. package/dist/services/suggestion-generator.js +146 -0
  143. package/dist/services/suggestion-generator.js.map +1 -0
  144. package/dist/services/ui-service.d.ts +49 -0
  145. package/dist/services/ui-service.d.ts.map +1 -0
  146. package/dist/services/ui-service.js +183 -0
  147. package/dist/services/ui-service.js.map +1 -0
  148. package/dist/template/helpers/index.d.ts +4 -0
  149. package/dist/template/helpers/index.d.ts.map +1 -0
  150. package/dist/template/helpers/index.js +132 -0
  151. package/dist/template/helpers/index.js.map +1 -0
  152. package/dist/template/template-context.d.ts +26 -0
  153. package/dist/template/template-context.d.ts.map +1 -0
  154. package/dist/template/template-context.js +65 -0
  155. package/dist/template/template-context.js.map +1 -0
  156. package/dist/template/template-engine.d.ts +13 -0
  157. package/dist/template/template-engine.d.ts.map +1 -0
  158. package/dist/template/template-engine.js +83 -0
  159. package/dist/template/template-engine.js.map +1 -0
  160. package/dist/types/annotations.d.ts +49 -0
  161. package/dist/types/annotations.d.ts.map +1 -0
  162. package/dist/types/annotations.js +2 -0
  163. package/dist/types/annotations.js.map +1 -0
  164. package/dist/types/config.d.ts +49 -0
  165. package/dist/types/config.d.ts.map +1 -0
  166. package/dist/types/config.js +8 -0
  167. package/dist/types/config.js.map +1 -0
  168. package/dist/types/history.d.ts +32 -0
  169. package/dist/types/history.d.ts.map +1 -0
  170. package/dist/types/history.js +2 -0
  171. package/dist/types/history.js.map +1 -0
  172. package/dist/types/patterns.d.ts +24 -0
  173. package/dist/types/patterns.d.ts.map +1 -0
  174. package/dist/types/patterns.js +2 -0
  175. package/dist/types/patterns.js.map +1 -0
  176. package/dist/types/prompt.d.ts +23 -0
  177. package/dist/types/prompt.d.ts.map +1 -0
  178. package/dist/types/prompt.js +2 -0
  179. package/dist/types/prompt.js.map +1 -0
  180. package/dist/types/review.d.ts +76 -0
  181. package/dist/types/review.d.ts.map +1 -0
  182. package/dist/types/review.js +2 -0
  183. package/dist/types/review.js.map +1 -0
  184. package/dist/ui/console-ui.d.ts +35 -0
  185. package/dist/ui/console-ui.d.ts.map +1 -0
  186. package/dist/ui/console-ui.js +83 -0
  187. package/dist/ui/console-ui.js.map +1 -0
  188. package/dist/ui/interactive-search.d.ts +8 -0
  189. package/dist/ui/interactive-search.d.ts.map +1 -0
  190. package/dist/ui/interactive-search.js +29 -0
  191. package/dist/ui/interactive-search.js.map +1 -0
  192. package/dist/utils/date-formatter.d.ts +10 -0
  193. package/dist/utils/date-formatter.d.ts.map +1 -0
  194. package/dist/utils/date-formatter.js +43 -0
  195. package/dist/utils/date-formatter.js.map +1 -0
  196. package/dist/utils/editor.d.ts +13 -0
  197. package/dist/utils/editor.d.ts.map +1 -0
  198. package/dist/utils/editor.js +62 -0
  199. package/dist/utils/editor.js.map +1 -0
  200. package/dist/utils/errors.d.ts +55 -0
  201. package/dist/utils/errors.d.ts.map +1 -0
  202. package/dist/utils/errors.js +248 -0
  203. package/dist/utils/errors.js.map +1 -0
  204. package/dist/utils/file-utils.d.ts +18 -0
  205. package/dist/utils/file-utils.d.ts.map +1 -0
  206. package/dist/utils/file-utils.js +88 -0
  207. package/dist/utils/file-utils.js.map +1 -0
  208. package/dist/utils/git-info.d.ts +8 -0
  209. package/dist/utils/git-info.d.ts.map +1 -0
  210. package/dist/utils/git-info.js +41 -0
  211. package/dist/utils/git-info.js.map +1 -0
  212. package/dist/utils/gitignore.d.ts +10 -0
  213. package/dist/utils/gitignore.d.ts.map +1 -0
  214. package/dist/utils/gitignore.js +72 -0
  215. package/dist/utils/gitignore.js.map +1 -0
  216. package/dist/utils/handlebars-extensions.d.ts +4 -0
  217. package/dist/utils/handlebars-extensions.d.ts.map +1 -0
  218. package/dist/utils/handlebars-extensions.js +87 -0
  219. package/dist/utils/handlebars-extensions.js.map +1 -0
  220. package/dist/utils/logger.d.ts +39 -0
  221. package/dist/utils/logger.d.ts.map +1 -0
  222. package/dist/utils/logger.js +143 -0
  223. package/dist/utils/logger.js.map +1 -0
  224. package/dist/utils/platform.d.ts +9 -0
  225. package/dist/utils/platform.d.ts.map +1 -0
  226. package/dist/utils/platform.js +44 -0
  227. package/dist/utils/platform.js.map +1 -0
  228. package/dist/utils/security.d.ts +5 -0
  229. package/dist/utils/security.d.ts.map +1 -0
  230. package/dist/utils/security.js +57 -0
  231. package/dist/utils/security.js.map +1 -0
  232. package/dist/utils/tool-detection.d.ts +11 -0
  233. package/dist/utils/tool-detection.d.ts.map +1 -0
  234. package/dist/utils/tool-detection.js +32 -0
  235. package/dist/utils/tool-detection.js.map +1 -0
  236. package/dist/utils/trie.d.ts +18 -0
  237. package/dist/utils/trie.d.ts.map +1 -0
  238. package/dist/utils/trie.js +84 -0
  239. package/dist/utils/trie.js.map +1 -0
  240. 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":"AAEA,MAAM,OAAO,mBAAmB;IAC9B,mBAAmB,CAAC,QAAmB;QACrC,4EAA4E;QAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAE3D,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC;IAEO,kBAAkB,CAAC,OAAgB;QACzC,MAAM,SAAS,GAAG;YAChB,YAAY,EAAE,OAAO,CAAC,IAAI;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACnE,gBAAgB,EAAE,OAAO,CAAC,eAAe;YACzC,YAAY,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAChD,oBAAoB,EAAE,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC;SACjE,CAAC;QAEF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,kBAAkB;gBACrB,OAAO;oBACL,GAAG,SAAS;oBACZ,WAAW,EAAE,wFAAwF;oBACrG,gBAAgB,EAAE;wBAChB,0FAA0F;wBAC1F,iEAAiE;wBACjE,oFAAoF;qBACrF;oBACD,qBAAqB,EAAE,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,cAAc,CAAC;oBAChF,sBAAsB,EAAE;;;;;+CAKa;iBACtC,CAAC;YAEJ,KAAK,iBAAiB;gBACpB,OAAO;oBACL,GAAG,SAAS;oBACZ,WAAW,EAAE,yEAAyE;oBACtF,gBAAgB,EAAE;wBAChB,iEAAiE;wBACjE,+EAA+E;wBAC/E,8CAA8C;qBAC/C;oBACD,qBAAqB,EAAE,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,YAAY,CAAC;oBAC9E,sBAAsB,EAAE;;;;;;iCAMD;iBACxB,CAAC;YAEJ,KAAK,sBAAsB;gBACzB,OAAO;oBACL,GAAG,SAAS;oBACZ,WAAW,EAAE,sEAAsE;oBACnF,gBAAgB,EAAE;wBAChB,0EAA0E;wBAC1E,mEAAmE;wBACnE,yFAAyF;qBAC1F;oBACD,qBAAqB,EAAE,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,aAAa,CAAC;oBAC/E,sBAAsB,EAAE;;;;qDAImB;iBAC5C,CAAC;YAEJ,KAAK,qBAAqB;gBACxB,OAAO;oBACL,GAAG,SAAS;oBACZ,WAAW,EAAE,mEAAmE;oBAChF,gBAAgB,EAAE;wBAChB,oCAAoC;wBACpC,2DAA2D;wBAC3D,+BAA+B;wBAC/B,uCAAuC;qBACxC;oBACD,qBAAqB,EAAE,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,SAAS,CAAC;oBAC3E,sBAAsB,EAAE;;;;;iGAK+D;iBACxF,CAAC;YAEJ;gBACE,OAAO;oBACL,GAAG,SAAS;oBACZ,WAAW,EAAE,mCAAmC;oBAChD,gBAAgB,EAAE,CAAC,+BAA+B,EAAE,4BAA4B,CAAC;iBAClF,CAAC;QACN,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,QAAmB;QAC9C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,oBAAoB,CAAC,OAAgB;QAC3C,MAAM,eAAe,GAA6B;YAChD,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,CAAC;SACP,CAAC;QAEF,OAAO,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAC9F,CAAC;IAEO,4BAA4B,CAAC,OAAgB;QACnD,kEAAkE;QAClE,MAAM,eAAe,GAAG,OAAO,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAC3D,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACnC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAEpE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,kBAAkB,CAAC,CAAC;QACrE,OAAO,GAAG,WAAW,kBAAkB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC;IAClF,CAAC;IAEO,2BAA2B,CACjC,OAAgB,EAChB,OAAkE;QAElE,MAAM,KAAK,GAA2B,EAAE,CAAC;QAEzC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YAC3C,QAAQ,OAAO,EAAE,CAAC;gBAChB,KAAK,cAAc;oBACjB,KAAK,CAAC,UAAU,CAAC,GAAG,UAAU,UAAU,6EAA6E,CAAC;oBACtH,MAAM;gBACR,KAAK,YAAY;oBACf,KAAK,CAAC,UAAU,CAAC,GAAG,UAAU,UAAU,kFAAkF,CAAC;oBAC3H,MAAM;gBACR,KAAK,aAAa;oBAChB,KAAK,CAAC,UAAU,CAAC,GAAG,WAAW,UAAU,mDAAmD,CAAC;oBAC7F,MAAM;gBACR,KAAK,SAAS;oBACZ,KAAK,CAAC,UAAU,CAAC,GAAG,WAAW,UAAU,uEAAuE,CAAC;oBACjH,MAAM;YACV,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB,CAAC,IAAY,EAAE,YAAoB,GAAG;QAC5D,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAClD,CAAC;CACF"}
@@ -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,4 @@
1
+ import Handlebars from 'handlebars';
2
+ import { TemplateContext } from '../template-context.js';
3
+ export declare function registerHelpers(handlebars: typeof Handlebars, context: TemplateContext): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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":"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"}
@@ -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