@pupt/cli 0.0.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -29
  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 +435 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/add.d.ts +5 -0
  12. package/dist/commands/add.d.ts.map +1 -0
  13. package/dist/commands/add.js +164 -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 +99 -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/cache.d.ts +9 -0
  24. package/dist/commands/cache.d.ts.map +1 -0
  25. package/dist/commands/cache.js +31 -0
  26. package/dist/commands/cache.js.map +1 -0
  27. package/dist/commands/config.d.ts +8 -0
  28. package/dist/commands/config.d.ts.map +1 -0
  29. package/dist/commands/config.js +93 -0
  30. package/dist/commands/config.js.map +1 -0
  31. package/dist/commands/edit.d.ts +2 -0
  32. package/dist/commands/edit.d.ts.map +1 -0
  33. package/dist/commands/edit.js +35 -0
  34. package/dist/commands/edit.js.map +1 -0
  35. package/dist/commands/help.d.ts +2 -0
  36. package/dist/commands/help.d.ts.map +1 -0
  37. package/dist/commands/help.js +26 -0
  38. package/dist/commands/help.js.map +1 -0
  39. package/dist/commands/history.d.ts +12 -0
  40. package/dist/commands/history.d.ts.map +1 -0
  41. package/dist/commands/history.js +317 -0
  42. package/dist/commands/history.js.map +1 -0
  43. package/dist/commands/init.d.ts +2 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +137 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/install.d.ts +16 -0
  48. package/dist/commands/install.d.ts.map +1 -0
  49. package/dist/commands/install.js +263 -0
  50. package/dist/commands/install.js.map +1 -0
  51. package/dist/commands/review.d.ts +3 -0
  52. package/dist/commands/review.d.ts.map +1 -0
  53. package/dist/commands/review.js +160 -0
  54. package/dist/commands/review.js.map +1 -0
  55. package/dist/commands/run.d.ts +32 -0
  56. package/dist/commands/run.d.ts.map +1 -0
  57. package/dist/commands/run.js +367 -0
  58. package/dist/commands/run.js.map +1 -0
  59. package/dist/commands/uninstall.d.ts +2 -0
  60. package/dist/commands/uninstall.d.ts.map +1 -0
  61. package/dist/commands/uninstall.js +45 -0
  62. package/dist/commands/uninstall.js.map +1 -0
  63. package/dist/commands/update.d.ts +2 -0
  64. package/dist/commands/update.d.ts.map +1 -0
  65. package/dist/commands/update.js +113 -0
  66. package/dist/commands/update.js.map +1 -0
  67. package/dist/config/config-manager.d.ts +19 -0
  68. package/dist/config/config-manager.d.ts.map +1 -0
  69. package/dist/config/config-manager.js +221 -0
  70. package/dist/config/config-manager.js.map +1 -0
  71. package/dist/config/global-paths.d.ts +5 -0
  72. package/dist/config/global-paths.d.ts.map +1 -0
  73. package/dist/config/global-paths.js +16 -0
  74. package/dist/config/global-paths.js.map +1 -0
  75. package/dist/config/migration.d.ts +12 -0
  76. package/dist/config/migration.d.ts.map +1 -0
  77. package/dist/config/migration.js +270 -0
  78. package/dist/config/migration.js.map +1 -0
  79. package/dist/history/enhanced-history-manager.d.ts +27 -0
  80. package/dist/history/enhanced-history-manager.d.ts.map +1 -0
  81. package/dist/history/enhanced-history-manager.js +116 -0
  82. package/dist/history/enhanced-history-manager.js.map +1 -0
  83. package/dist/history/history-manager.d.ts +43 -0
  84. package/dist/history/history-manager.d.ts.map +1 -0
  85. package/dist/history/history-manager.js +229 -0
  86. package/dist/history/history-manager.js.map +1 -0
  87. package/dist/index.d.ts +6 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +6 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/prompts/input-types/file-search-prompt.d.ts +11 -0
  92. package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
  93. package/dist/prompts/input-types/file-search-prompt.js +53 -0
  94. package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
  95. package/dist/prompts/input-types/review-file-prompt.d.ts +3 -0
  96. package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
  97. package/dist/prompts/input-types/review-file-prompt.js +9 -0
  98. package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
  99. package/dist/schemas/config-schema.d.ts +1637 -0
  100. package/dist/schemas/config-schema.d.ts.map +1 -0
  101. package/dist/schemas/config-schema.js +136 -0
  102. package/dist/schemas/config-schema.js.map +1 -0
  103. package/dist/search/search-engine.d.ts +8 -0
  104. package/dist/search/search-engine.d.ts.map +1 -0
  105. package/dist/search/search-engine.js +53 -0
  106. package/dist/search/search-engine.js.map +1 -0
  107. package/dist/services/git-service.d.ts +28 -0
  108. package/dist/services/git-service.d.ts.map +1 -0
  109. package/dist/services/git-service.js +157 -0
  110. package/dist/services/git-service.js.map +1 -0
  111. package/dist/services/input-collector.d.ts +9 -0
  112. package/dist/services/input-collector.d.ts.map +1 -0
  113. package/dist/services/input-collector.js +162 -0
  114. package/dist/services/input-collector.js.map +1 -0
  115. package/dist/services/logging-service.d.ts +49 -0
  116. package/dist/services/logging-service.d.ts.map +1 -0
  117. package/dist/services/logging-service.js +203 -0
  118. package/dist/services/logging-service.js.map +1 -0
  119. package/dist/services/module-cache.d.ts +42 -0
  120. package/dist/services/module-cache.d.ts.map +1 -0
  121. package/dist/services/module-cache.js +205 -0
  122. package/dist/services/module-cache.js.map +1 -0
  123. package/dist/services/module-entry-builder.d.ts +20 -0
  124. package/dist/services/module-entry-builder.d.ts.map +1 -0
  125. package/dist/services/module-entry-builder.js +71 -0
  126. package/dist/services/module-entry-builder.js.map +1 -0
  127. package/dist/services/output-capture-service.d.ts +28 -0
  128. package/dist/services/output-capture-service.d.ts.map +1 -0
  129. package/dist/services/output-capture-service.js +348 -0
  130. package/dist/services/output-capture-service.js.map +1 -0
  131. package/dist/services/package-manager.d.ts +18 -0
  132. package/dist/services/package-manager.d.ts.map +1 -0
  133. package/dist/services/package-manager.js +141 -0
  134. package/dist/services/package-manager.js.map +1 -0
  135. package/dist/services/pattern-detector.d.ts +15 -0
  136. package/dist/services/pattern-detector.d.ts.map +1 -0
  137. package/dist/services/pattern-detector.js +228 -0
  138. package/dist/services/pattern-detector.js.map +1 -0
  139. package/dist/services/prompt-resolver.d.ts +32 -0
  140. package/dist/services/prompt-resolver.d.ts.map +1 -0
  141. package/dist/services/prompt-resolver.js +73 -0
  142. package/dist/services/prompt-resolver.js.map +1 -0
  143. package/dist/services/pupt-prompt-source.d.ts +16 -0
  144. package/dist/services/pupt-prompt-source.d.ts.map +1 -0
  145. package/dist/services/pupt-prompt-source.js +74 -0
  146. package/dist/services/pupt-prompt-source.js.map +1 -0
  147. package/dist/services/pupt-service.d.ts +33 -0
  148. package/dist/services/pupt-service.d.ts.map +1 -0
  149. package/dist/services/pupt-service.js +119 -0
  150. package/dist/services/pupt-service.js.map +1 -0
  151. package/dist/services/review-data-builder.d.ts +25 -0
  152. package/dist/services/review-data-builder.d.ts.map +1 -0
  153. package/dist/services/review-data-builder.js +333 -0
  154. package/dist/services/review-data-builder.js.map +1 -0
  155. package/dist/services/suggestion-generator.d.ts +11 -0
  156. package/dist/services/suggestion-generator.d.ts.map +1 -0
  157. package/dist/services/suggestion-generator.js +158 -0
  158. package/dist/services/suggestion-generator.js.map +1 -0
  159. package/dist/services/ui-service.d.ts +49 -0
  160. package/dist/services/ui-service.d.ts.map +1 -0
  161. package/dist/services/ui-service.js +196 -0
  162. package/dist/services/ui-service.js.map +1 -0
  163. package/dist/types/annotations.d.ts +50 -0
  164. package/dist/types/annotations.d.ts.map +1 -0
  165. package/dist/types/annotations.js +2 -0
  166. package/dist/types/annotations.js.map +1 -0
  167. package/dist/types/config.d.ts +110 -0
  168. package/dist/types/config.d.ts.map +1 -0
  169. package/dist/types/config.js +12 -0
  170. package/dist/types/config.js.map +1 -0
  171. package/dist/types/history.d.ts +36 -0
  172. package/dist/types/history.d.ts.map +1 -0
  173. package/dist/types/history.js +2 -0
  174. package/dist/types/history.js.map +1 -0
  175. package/dist/types/patterns.d.ts +25 -0
  176. package/dist/types/patterns.d.ts.map +1 -0
  177. package/dist/types/patterns.js +2 -0
  178. package/dist/types/patterns.js.map +1 -0
  179. package/dist/types/prompt.d.ts +29 -0
  180. package/dist/types/prompt.d.ts.map +1 -0
  181. package/dist/types/prompt.js +24 -0
  182. package/dist/types/prompt.js.map +1 -0
  183. package/dist/types/review.d.ts +81 -0
  184. package/dist/types/review.d.ts.map +1 -0
  185. package/dist/types/review.js +2 -0
  186. package/dist/types/review.js.map +1 -0
  187. package/dist/ui/console-ui.d.ts +30 -0
  188. package/dist/ui/console-ui.d.ts.map +1 -0
  189. package/dist/ui/console-ui.js +88 -0
  190. package/dist/ui/console-ui.js.map +1 -0
  191. package/dist/ui/interactive-search.d.ts +8 -0
  192. package/dist/ui/interactive-search.d.ts.map +1 -0
  193. package/dist/ui/interactive-search.js +29 -0
  194. package/dist/ui/interactive-search.js.map +1 -0
  195. package/dist/utils/annotation-migration.d.ts +12 -0
  196. package/dist/utils/annotation-migration.d.ts.map +1 -0
  197. package/dist/utils/annotation-migration.js +88 -0
  198. package/dist/utils/annotation-migration.js.map +1 -0
  199. package/dist/utils/date-formatter.d.ts +10 -0
  200. package/dist/utils/date-formatter.d.ts.map +1 -0
  201. package/dist/utils/date-formatter.js +46 -0
  202. package/dist/utils/date-formatter.js.map +1 -0
  203. package/dist/utils/editor.d.ts +14 -0
  204. package/dist/utils/editor.d.ts.map +1 -0
  205. package/dist/utils/editor.js +52 -0
  206. package/dist/utils/editor.js.map +1 -0
  207. package/dist/utils/errors.d.ts +58 -0
  208. package/dist/utils/errors.d.ts.map +1 -0
  209. package/dist/utils/errors.js +275 -0
  210. package/dist/utils/errors.js.map +1 -0
  211. package/dist/utils/git-info.d.ts +10 -0
  212. package/dist/utils/git-info.d.ts.map +1 -0
  213. package/dist/utils/git-info.js +44 -0
  214. package/dist/utils/git-info.js.map +1 -0
  215. package/dist/utils/gitignore.d.ts +10 -0
  216. package/dist/utils/gitignore.d.ts.map +1 -0
  217. package/dist/utils/gitignore.js +72 -0
  218. package/dist/utils/gitignore.js.map +1 -0
  219. package/dist/utils/logger.d.ts +39 -0
  220. package/dist/utils/logger.d.ts.map +1 -0
  221. package/dist/utils/logger.js +143 -0
  222. package/dist/utils/logger.js.map +1 -0
  223. package/dist/utils/platform.d.ts +9 -0
  224. package/dist/utils/platform.d.ts.map +1 -0
  225. package/dist/utils/platform.js +45 -0
  226. package/dist/utils/platform.js.map +1 -0
  227. package/dist/utils/project-root.d.ts +22 -0
  228. package/dist/utils/project-root.d.ts.map +1 -0
  229. package/dist/utils/project-root.js +226 -0
  230. package/dist/utils/project-root.js.map +1 -0
  231. package/dist/utils/prompt-dir-resolver.d.ts +5 -0
  232. package/dist/utils/prompt-dir-resolver.d.ts.map +1 -0
  233. package/dist/utils/prompt-dir-resolver.js +25 -0
  234. package/dist/utils/prompt-dir-resolver.js.map +1 -0
  235. package/dist/utils/security.d.ts +5 -0
  236. package/dist/utils/security.d.ts.map +1 -0
  237. package/dist/utils/security.js +57 -0
  238. package/dist/utils/security.js.map +1 -0
  239. package/dist/utils/tool-detection.d.ts +14 -0
  240. package/dist/utils/tool-detection.d.ts.map +1 -0
  241. package/dist/utils/tool-detection.js +43 -0
  242. package/dist/utils/tool-detection.js.map +1 -0
  243. package/package.json +79 -7
  244. package/prompts/prompts/ad-hoc-long.prompt +60 -0
  245. package/prompts/prompts/ad-hoc.prompt +29 -0
  246. package/prompts/prompts/code-review.prompt +99 -0
  247. package/prompts/prompts/debugging-error-message.prompt +81 -0
  248. package/prompts/prompts/fix-github-actions.prompt +62 -0
  249. package/prompts/prompts/fix-test-errors.prompt +73 -0
  250. package/prompts/prompts/git-commit-comment.prompt +61 -0
  251. package/prompts/prompts/implementation-phase.prompt +53 -0
  252. package/prompts/prompts/implementation-plan.prompt +101 -0
  253. package/prompts/prompts/new-feature.prompt +89 -0
  254. package/prompts/prompts/new-project.prompt +9 -0
  255. package/prompts/prompts/one-shot-change.prompt +79 -0
  256. package/prompts/prompts/pupt-prompt-improvement.prompt +270 -0
  257. package/prompts/prompts/simple-test.prompt +8 -0
  258. package/prompts/prompts/update-design.prompt +71 -0
  259. package/prompts/prompts/update-documentation.prompt +6 -0
@@ -0,0 +1,263 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import { cosmiconfig } from 'cosmiconfig';
4
+ import simpleGit from 'simple-git';
5
+ import { ConfigManager } from '../config/config-manager.js';
6
+ import { getDataDir } from '../config/global-paths.js';
7
+ import { GlobalPackageManager } from '../services/package-manager.js';
8
+ import { logger } from '../utils/logger.js';
9
+ export async function loadConfigFromDirectory(dir) {
10
+ // Look for config files only in the specific directory (no traversal)
11
+ const explorer = cosmiconfig('pt', {
12
+ searchPlaces: [
13
+ '.pt-config',
14
+ '.pt-config.json',
15
+ '.pt-config.yaml',
16
+ '.pt-config.yml',
17
+ '.pt-config.js',
18
+ '.pt-config.cjs',
19
+ 'pt.config.js',
20
+ ],
21
+ stopDir: dir, // Don't search beyond this directory
22
+ });
23
+ try {
24
+ const result = await explorer.load(path.join(dir, '.pt-config.json'));
25
+ if (!result) {
26
+ // Try other config file names
27
+ for (const configName of ['.pt-config.yaml', '.pt-config.yml', '.pt-config.js', '.pt-config.cjs', 'pt.config.js', '.pt-config']) {
28
+ const configPath = path.join(dir, configName);
29
+ try {
30
+ const result = await explorer.load(configPath);
31
+ if (result && result.config && result.config.promptDirs) {
32
+ return result.config.promptDirs;
33
+ }
34
+ }
35
+ catch {
36
+ // Continue to next file
37
+ }
38
+ }
39
+ }
40
+ else if (result.config && result.config.promptDirs) {
41
+ return result.config.promptDirs;
42
+ }
43
+ }
44
+ catch {
45
+ // No config found
46
+ }
47
+ return undefined;
48
+ }
49
+ export function validateGitUrl(url) {
50
+ if (!url || typeof url !== 'string' || url.trim() === '') {
51
+ throw new Error('Invalid URL: URL cannot be empty');
52
+ }
53
+ // Support common git URL formats
54
+ const gitUrlPatterns = [
55
+ // HTTPS URLs
56
+ /^https:\/\/[a-zA-Z0-9.-]+\/[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+(?:\.git)?$/,
57
+ // SSH URLs (git@)
58
+ /^git@[a-zA-Z0-9.-]+:[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+(?:\.git)?$/,
59
+ // SSH URLs (ssh://)
60
+ /^ssh:\/\/git@[a-zA-Z0-9.-]+\/[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+(?:\.git)?$/,
61
+ // Git protocol
62
+ /^git:\/\/[a-zA-Z0-9.-]+\/[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+(?:\.git)?$/,
63
+ // File protocol (for testing and local repos)
64
+ /^file:\/\/\/.+$/
65
+ ];
66
+ const isValidGitUrl = gitUrlPatterns.some(pattern => pattern.test(url));
67
+ if (!isValidGitUrl) {
68
+ throw new Error(`Invalid git URL format: ${url}`);
69
+ }
70
+ }
71
+ export function extractRepoName(url) {
72
+ // Remove .git suffix if present
73
+ const cleanUrl = url.replace(/\.git$/, '');
74
+ // Extract repo name from different URL formats
75
+ let repoName;
76
+ if (url.includes('://')) {
77
+ // HTTPS, git://, or file:// URLs
78
+ const parts = cleanUrl.split('/');
79
+ repoName = parts[parts.length - 1];
80
+ // For file:// URLs that might end with a slash
81
+ if (!repoName && parts.length > 1) {
82
+ repoName = parts[parts.length - 2];
83
+ }
84
+ }
85
+ else if (url.startsWith('git@')) {
86
+ // SSH URLs (git@host:user/repo)
87
+ const parts = cleanUrl.split(':')[1].split('/');
88
+ repoName = parts[parts.length - 1];
89
+ }
90
+ else {
91
+ throw new Error(`Cannot extract repository name from URL: ${url}`);
92
+ }
93
+ if (!repoName) {
94
+ throw new Error(`Cannot extract repository name from URL: ${url}`);
95
+ }
96
+ return repoName;
97
+ }
98
+ async function getGitInstallPath(repoName) {
99
+ const dataDir = getDataDir();
100
+ const librariesDir = path.join(dataDir, 'libraries');
101
+ const installPath = path.join(librariesDir, repoName);
102
+ // Ensure parent directory exists
103
+ await fs.mkdir(librariesDir, { recursive: true });
104
+ return installPath;
105
+ }
106
+ export async function installFromGit(url, options = {}) {
107
+ const git = options.git ?? simpleGit();
108
+ // Validate URL
109
+ validateGitUrl(url);
110
+ // Determine library name
111
+ const libraryName = options.name ?? extractRepoName(url);
112
+ // Load our current config and check for duplicates
113
+ const config = await ConfigManager.load();
114
+ const existingLibrary = config.libraries?.find(lib => lib.name === libraryName);
115
+ if (existingLibrary) {
116
+ throw new Error(`Library "${libraryName}" is already installed. Use "pt update ${libraryName}" to update it.`);
117
+ }
118
+ // Get installation path
119
+ const installPath = await getGitInstallPath(libraryName);
120
+ logger.log(`Installing prompts from ${url}...`);
121
+ // Clone repository with depth 1
122
+ try {
123
+ await git.clone(url, installPath, ['--depth', '1']);
124
+ }
125
+ catch (error) {
126
+ const errorMessage = error instanceof Error ? error.message : String(error);
127
+ throw new Error(`Failed to clone repository: ${errorMessage}`);
128
+ }
129
+ // Try to load the installed package's config to get its promptDirs
130
+ const installedPromptDirs = await loadConfigFromDirectory(installPath);
131
+ // Determine promptDirs for this library
132
+ const promptDirs = installedPromptDirs && installedPromptDirs.length > 0
133
+ ? installedPromptDirs
134
+ : ['prompts'];
135
+ // Get the current commit hash as version
136
+ let version;
137
+ try {
138
+ const libGit = simpleGit(installPath);
139
+ const log = await libGit.log({ maxCount: 1 });
140
+ version = log.latest?.hash?.substring(0, 8);
141
+ }
142
+ catch {
143
+ // Version is optional, continue without it
144
+ }
145
+ // Create the library entry
146
+ const libraryEntry = {
147
+ name: libraryName,
148
+ type: 'git',
149
+ source: url,
150
+ promptDirs,
151
+ installedAt: new Date().toISOString(),
152
+ ...(version && { version }),
153
+ };
154
+ // Add library entry to config
155
+ if (!config.libraries) {
156
+ config.libraries = [];
157
+ }
158
+ config.libraries.push(libraryEntry);
159
+ await ConfigManager.save(config);
160
+ logger.log(`Successfully installed library "${libraryName}" from ${url}`);
161
+ promptDirs.forEach(dir => { logger.log(` Prompt directory: ${dir}`); });
162
+ }
163
+ // NPM Package Detection
164
+ export function isNpmPackage(source) {
165
+ if (!source || typeof source !== 'string' || source.trim() === '') {
166
+ return false;
167
+ }
168
+ // Reject obvious non-package patterns
169
+ if (source.includes('://') || // URLs
170
+ source.includes(':') && source.includes('@') || // SSH URLs
171
+ source.startsWith('./') || source.startsWith('../') || // Relative paths
172
+ source.startsWith('/') || // Absolute paths
173
+ source.includes('\\') || // Windows paths
174
+ source.includes(' ') || // Spaces
175
+ source.startsWith('-') || source.startsWith('.') || source.startsWith('_')) { // Invalid starts
176
+ return false;
177
+ }
178
+ // Check for valid npm package name patterns
179
+ // Regular packages: alphanumeric, dash, underscore, dot
180
+ // Scoped packages: @scope/package
181
+ const npmPackagePattern = /^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/i;
182
+ // Additional validation for scoped packages
183
+ if (source.startsWith('@')) {
184
+ const parts = source.split('/');
185
+ if (parts.length !== 2 || parts[0] === '@' || parts[1] === '') {
186
+ return false;
187
+ }
188
+ }
189
+ return npmPackagePattern.test(source);
190
+ }
191
+ export function validateNpmPackage(packageName) {
192
+ if (!packageName || packageName.trim() === '') {
193
+ throw new Error('Package name cannot be empty');
194
+ }
195
+ if (!isNpmPackage(packageName)) {
196
+ throw new Error(`Invalid npm package name: ${packageName}`);
197
+ }
198
+ }
199
+ // Install from NPM
200
+ export async function installFromNpm(packageName) {
201
+ // Validate package name
202
+ validateNpmPackage(packageName);
203
+ const dataDir = getDataDir();
204
+ const packageManager = new GlobalPackageManager(dataDir);
205
+ // Check for duplicate library entries
206
+ const config = await ConfigManager.load();
207
+ const existingLibrary = config.libraries?.find(lib => lib.name === packageName);
208
+ if (existingLibrary) {
209
+ throw new Error(`Package "${packageName}" is already installed. Use "pt update ${packageName}" to update it.`);
210
+ }
211
+ // Install the package
212
+ const info = await packageManager.install(packageName);
213
+ // If prompts were found, add an NpmLibraryEntry to config
214
+ if (info.promptDirs.length > 0) {
215
+ const libraryEntry = {
216
+ name: packageName,
217
+ type: 'npm',
218
+ source: packageName,
219
+ promptDirs: info.promptDirs,
220
+ installedAt: new Date().toISOString(),
221
+ version: info.version,
222
+ };
223
+ if (!config.libraries) {
224
+ config.libraries = [];
225
+ }
226
+ config.libraries.push(libraryEntry);
227
+ await ConfigManager.save(config);
228
+ logger.log(`Successfully installed prompts from ${packageName}`);
229
+ info.promptDirs.forEach(dir => { logger.log(` Prompt directory: ${dir}`); });
230
+ }
231
+ else {
232
+ logger.log(`Package ${packageName} installed (no prompt directories found - pure component package)`);
233
+ }
234
+ }
235
+ export async function installCommand(source, options) {
236
+ if (!source) {
237
+ throw new Error('Please provide a git URL or npm package name to install from');
238
+ }
239
+ // Try npm first (since it's simpler to detect)
240
+ if (isNpmPackage(source)) {
241
+ await installFromNpm(source);
242
+ return;
243
+ }
244
+ // Try git URL
245
+ try {
246
+ validateGitUrl(source);
247
+ await installFromGit(source, { name: options?.name });
248
+ }
249
+ catch (error) {
250
+ const errorMessage = error instanceof Error ? error.message : String(error);
251
+ if (errorMessage.includes('Invalid git URL')) {
252
+ logger.error(`Error: "${source}" is neither a valid git URL nor an npm package name`);
253
+ logger.error('\nExamples of valid sources:');
254
+ logger.error(' Git: https://github.com/user/repo');
255
+ logger.error(' NPM: @org/package or package-name');
256
+ throw new Error(`Invalid installation source: ${source}`);
257
+ }
258
+ else {
259
+ throw error;
260
+ }
261
+ }
262
+ }
263
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ReviewOptions } from '../types/review.js';
2
+ export declare function reviewCommand(promptName?: string, options?: ReviewOptions): Promise<void>;
3
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnE,wBAAsB,aAAa,CACjC,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
@@ -0,0 +1,160 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'fs-extra';
3
+ import { ConfigManager } from '../config/config-manager.js';
4
+ import { buildModuleEntries } from '../services/module-entry-builder.js';
5
+ import { ReviewDataBuilder } from '../services/review-data-builder.js';
6
+ import { logger } from '../utils/logger.js';
7
+ export async function reviewCommand(promptName, options = {}) {
8
+ try {
9
+ const config = await ConfigManager.load();
10
+ const modules = await buildModuleEntries({ config });
11
+ const builder = new ReviewDataBuilder({ ...config, modules });
12
+ // Build review data
13
+ const reviewData = await builder.buildReviewData({
14
+ promptName,
15
+ since: options.since,
16
+ });
17
+ // Format and output based on options
18
+ if (options.format === 'json') {
19
+ const output = JSON.stringify(reviewData, null, 2);
20
+ if (options.output) {
21
+ await fs.writeFile(options.output, output);
22
+ logger.log(chalk.green(`✓ Review data written to ${options.output}`));
23
+ }
24
+ else {
25
+ logger.log(output);
26
+ }
27
+ }
28
+ else {
29
+ // Default to markdown format
30
+ const report = formatMarkdownReport(reviewData);
31
+ if (options.output) {
32
+ await fs.writeFile(options.output, report);
33
+ logger.log(chalk.green(`✓ Review report written to ${options.output}`));
34
+ }
35
+ else {
36
+ logger.log(report);
37
+ }
38
+ }
39
+ }
40
+ catch (error) {
41
+ logger.error(chalk.red(`Error generating review: ${error instanceof Error ? error.message : String(error)}`));
42
+ if (options.since) {
43
+ logger.error(chalk.yellow('\nHint: Check that the time filter format is correct (e.g., 7d, 24h, 2w)'));
44
+ }
45
+ if (promptName) {
46
+ logger.error(chalk.yellow('\nHint: Verify that the prompt name exists'));
47
+ }
48
+ process.exit(1);
49
+ }
50
+ }
51
+ function formatMarkdownReport(data) {
52
+ const lines = [];
53
+ // Header
54
+ lines.push('# Prompt Review Report');
55
+ lines.push(`*Generated: ${new Date().toISOString()}*`);
56
+ lines.push(`*Analysis Period: ${data.metadata.analysis_period}*`);
57
+ lines.push('');
58
+ // Summary
59
+ lines.push('## Summary');
60
+ lines.push(`- Total Prompts: ${data.metadata.total_prompts}`);
61
+ lines.push(`- Total Executions: ${data.metadata.total_executions}`);
62
+ lines.push('');
63
+ // Data Completeness
64
+ lines.push('## Data Completeness');
65
+ lines.push(`- With Annotations: ${data.metadata.data_completeness.with_annotations}%`);
66
+ lines.push(`- With Output Capture: ${data.metadata.data_completeness.with_output_capture}%`);
67
+ lines.push(`- With Environment Data: ${data.metadata.data_completeness.with_environment_data}%`);
68
+ lines.push('');
69
+ // Prompt Details
70
+ lines.push('## Prompt Analysis');
71
+ lines.push('');
72
+ // Sort prompts by success rate (ascending) to highlight problematic ones first
73
+ const sortedPrompts = [...data.prompts].sort((a, b) => a.usage_statistics.success_rate - b.usage_statistics.success_rate);
74
+ for (const prompt of sortedPrompts) {
75
+ lines.push(`### ${prompt.name}`);
76
+ lines.push(`- **Path**: ${prompt.path}`);
77
+ lines.push(`- **Last Modified**: ${formatDate(prompt.last_modified)}`);
78
+ lines.push(`- **Last Used**: ${formatDate(prompt.usage_statistics.last_used)}`);
79
+ lines.push('');
80
+ // Usage Statistics
81
+ lines.push('#### Usage Statistics');
82
+ lines.push(`- Total Runs: ${prompt.usage_statistics.total_runs}`);
83
+ lines.push(`- Annotated Runs: ${prompt.usage_statistics.annotated_runs}`);
84
+ lines.push(`- **Success Rate: ${(prompt.usage_statistics.success_rate * 100).toFixed(1)}%**`);
85
+ lines.push(`- Average Duration: ${prompt.usage_statistics.avg_duration}`);
86
+ lines.push('');
87
+ // Execution Outcomes
88
+ if (prompt.usage_statistics.annotated_runs > 0) {
89
+ lines.push('#### Execution Outcomes');
90
+ lines.push(`- ${chalk.green('✓ Success')}: ${prompt.execution_outcomes.success}`);
91
+ lines.push(`- ${chalk.yellow('⚠ Partial')}: ${prompt.execution_outcomes.partial}`);
92
+ lines.push(`- ${chalk.red('✗ Failure')}: ${prompt.execution_outcomes.failure}`);
93
+ lines.push('');
94
+ }
95
+ else {
96
+ lines.push('*No annotations available for this prompt*');
97
+ lines.push('');
98
+ }
99
+ // Recent Annotations
100
+ if (prompt.user_annotations.length > 0) {
101
+ lines.push('#### Recent Annotations');
102
+ const recentAnnotations = prompt.user_annotations
103
+ .sort((a, b) => b.timestamp.localeCompare(a.timestamp))
104
+ .slice(0, 3);
105
+ for (const annotation of recentAnnotations) {
106
+ const statusIcon = getStatusIcon(annotation.status);
107
+ lines.push(`- ${formatDate(annotation.timestamp)} - ${statusIcon} ${annotation.status}`);
108
+ if (annotation.notes) {
109
+ const truncatedNotes = annotation.notes.substring(0, 100);
110
+ const notes = annotation.notes.length > 100 ? `${truncatedNotes}...` : truncatedNotes;
111
+ lines.push(` *"${notes}"*`);
112
+ }
113
+ }
114
+ lines.push('');
115
+ }
116
+ // Detected Patterns (will be populated in Phase 5)
117
+ if (prompt.detected_patterns.length > 0) {
118
+ lines.push('#### Detected Patterns');
119
+ for (const pattern of prompt.detected_patterns) {
120
+ lines.push(`- **${pattern.pattern_type}** (${pattern.severity}): ${pattern.frequency} occurrences`);
121
+ }
122
+ lines.push('');
123
+ }
124
+ lines.push('---');
125
+ lines.push('');
126
+ }
127
+ // Cross-Prompt Patterns (will be populated in Phase 5)
128
+ if (data.cross_prompt_patterns.length > 0) {
129
+ lines.push('## Cross-Prompt Patterns');
130
+ for (const pattern of data.cross_prompt_patterns) {
131
+ lines.push(`- **${pattern.pattern}**: Affects ${pattern.affected_prompts.length} prompts`);
132
+ lines.push(` - Total Occurrences: ${pattern.total_occurrences}`);
133
+ lines.push(` - Impact: ${pattern.impact_assessment}`);
134
+ }
135
+ lines.push('');
136
+ }
137
+ return lines.join('\n');
138
+ }
139
+ function formatDate(isoDate) {
140
+ try {
141
+ const date = new Date(isoDate);
142
+ return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
143
+ }
144
+ catch {
145
+ return isoDate;
146
+ }
147
+ }
148
+ function getStatusIcon(status) {
149
+ switch (status) {
150
+ case 'success':
151
+ return chalk.green('✓');
152
+ case 'partial':
153
+ return chalk.yellow('⚠');
154
+ case 'failure':
155
+ return chalk.red('✗');
156
+ default:
157
+ return '•';
158
+ }
159
+ }
160
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface RunOptions {
2
+ historyIndex?: number;
3
+ prompt?: string;
4
+ promptDirOverrides?: string[];
5
+ skipPromptSelection?: boolean;
6
+ templateInfo?: {
7
+ templatePath: string;
8
+ templateContent: string;
9
+ variables: Map<string, unknown>;
10
+ finalPrompt: string;
11
+ title?: string;
12
+ summary?: string;
13
+ reviewFiles?: Array<{
14
+ name: string;
15
+ value: unknown;
16
+ }>;
17
+ timestamp?: Date;
18
+ };
19
+ isAutoRun?: boolean;
20
+ promptName?: string;
21
+ noInteractive?: boolean;
22
+ noCache?: boolean;
23
+ }
24
+ interface ParsedArgs {
25
+ tool: string | undefined;
26
+ toolArgs: string[];
27
+ extraArgs: string[];
28
+ }
29
+ export declare function parseRunArgs(args: string[]): ParsedArgs;
30
+ export declare function runCommand(args: string[], options: RunOptions): Promise<void>;
31
+ export {};
32
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QACtD,SAAS,CAAC,EAAE,IAAI,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAqBvD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAoMnF"}