pupt 2.2.0 → 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 (151) hide show
  1. package/dist/cli.js +94 -58
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/add.d.ts +4 -1
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +60 -11
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/cache.d.ts +9 -0
  8. package/dist/commands/cache.d.ts.map +1 -0
  9. package/dist/commands/cache.js +31 -0
  10. package/dist/commands/cache.js.map +1 -0
  11. package/dist/commands/config.d.ts +1 -2
  12. package/dist/commands/config.d.ts.map +1 -1
  13. package/dist/commands/config.js +30 -57
  14. package/dist/commands/config.js.map +1 -1
  15. package/dist/commands/edit.d.ts.map +1 -1
  16. package/dist/commands/edit.js +5 -2
  17. package/dist/commands/edit.js.map +1 -1
  18. package/dist/commands/init-refactored.d.ts.map +1 -1
  19. package/dist/commands/init-refactored.js +0 -3
  20. package/dist/commands/init-refactored.js.map +1 -1
  21. package/dist/commands/init.d.ts.map +1 -1
  22. package/dist/commands/init.js +59 -68
  23. package/dist/commands/init.js.map +1 -1
  24. package/dist/commands/install.d.ts +9 -9
  25. package/dist/commands/install.d.ts.map +1 -1
  26. package/dist/commands/install.js +76 -178
  27. package/dist/commands/install.js.map +1 -1
  28. package/dist/commands/review.d.ts.map +1 -1
  29. package/dist/commands/review.js +3 -1
  30. package/dist/commands/review.js.map +1 -1
  31. package/dist/commands/run.d.ts +2 -0
  32. package/dist/commands/run.d.ts.map +1 -1
  33. package/dist/commands/run.js +13 -9
  34. package/dist/commands/run.js.map +1 -1
  35. package/dist/commands/uninstall.d.ts +2 -0
  36. package/dist/commands/uninstall.d.ts.map +1 -0
  37. package/dist/commands/uninstall.js +45 -0
  38. package/dist/commands/uninstall.js.map +1 -0
  39. package/dist/commands/update.d.ts +2 -0
  40. package/dist/commands/update.d.ts.map +1 -0
  41. package/dist/commands/update.js +113 -0
  42. package/dist/commands/update.js.map +1 -0
  43. package/dist/config/config-manager.d.ts +3 -10
  44. package/dist/config/config-manager.d.ts.map +1 -1
  45. package/dist/config/config-manager.js +23 -140
  46. package/dist/config/config-manager.js.map +1 -1
  47. package/dist/config/global-paths.d.ts +5 -0
  48. package/dist/config/global-paths.d.ts.map +1 -0
  49. package/dist/config/global-paths.js +16 -0
  50. package/dist/config/global-paths.js.map +1 -0
  51. package/dist/config/migration.d.ts.map +1 -1
  52. package/dist/config/migration.js +69 -1
  53. package/dist/config/migration.js.map +1 -1
  54. package/dist/prompts/input-types/file-search-prompt.js +2 -2
  55. package/dist/prompts/input-types/file-search-prompt.js.map +1 -1
  56. package/dist/schemas/config-schema.d.ts +863 -196
  57. package/dist/schemas/config-schema.d.ts.map +1 -1
  58. package/dist/schemas/config-schema.js +51 -27
  59. package/dist/schemas/config-schema.js.map +1 -1
  60. package/dist/services/input-collector.d.ts.map +1 -1
  61. package/dist/services/input-collector.js +7 -1
  62. package/dist/services/input-collector.js.map +1 -1
  63. package/dist/services/module-cache.d.ts +42 -0
  64. package/dist/services/module-cache.d.ts.map +1 -0
  65. package/dist/services/module-cache.js +205 -0
  66. package/dist/services/module-cache.js.map +1 -0
  67. package/dist/services/module-entry-builder.d.ts +20 -0
  68. package/dist/services/module-entry-builder.d.ts.map +1 -0
  69. package/dist/services/module-entry-builder.js +67 -0
  70. package/dist/services/module-entry-builder.js.map +1 -0
  71. package/dist/services/output-capture-service.d.ts.map +1 -1
  72. package/dist/services/output-capture-service.js +2 -1
  73. package/dist/services/output-capture-service.js.map +1 -1
  74. package/dist/services/package-manager.d.ts +18 -0
  75. package/dist/services/package-manager.d.ts.map +1 -0
  76. package/dist/services/package-manager.js +141 -0
  77. package/dist/services/package-manager.js.map +1 -0
  78. package/dist/services/prompt-resolver.d.ts +2 -2
  79. package/dist/services/prompt-resolver.d.ts.map +1 -1
  80. package/dist/services/prompt-resolver.js +9 -10
  81. package/dist/services/prompt-resolver.js.map +1 -1
  82. package/dist/services/pupt-prompt-source.d.ts +16 -0
  83. package/dist/services/pupt-prompt-source.d.ts.map +1 -0
  84. package/dist/services/pupt-prompt-source.js +73 -0
  85. package/dist/services/pupt-prompt-source.js.map +1 -0
  86. package/dist/services/pupt-service.d.ts +11 -25
  87. package/dist/services/pupt-service.d.ts.map +1 -1
  88. package/dist/services/pupt-service.js +31 -179
  89. package/dist/services/pupt-service.js.map +1 -1
  90. package/dist/services/review-data-builder.d.ts +4 -1
  91. package/dist/services/review-data-builder.d.ts.map +1 -1
  92. package/dist/services/review-data-builder.js +4 -2
  93. package/dist/services/review-data-builder.js.map +1 -1
  94. package/dist/types/config.d.ts +35 -19
  95. package/dist/types/config.d.ts.map +1 -1
  96. package/dist/types/config.js +3 -4
  97. package/dist/types/config.js.map +1 -1
  98. package/dist/utils/prompt-dir-resolver.d.ts +5 -0
  99. package/dist/utils/prompt-dir-resolver.d.ts.map +1 -0
  100. package/dist/utils/prompt-dir-resolver.js +24 -0
  101. package/dist/utils/prompt-dir-resolver.js.map +1 -0
  102. package/package.json +3 -3
  103. package/dist/prompts/input-types/file-prompt.d.ts +0 -12
  104. package/dist/prompts/input-types/file-prompt.d.ts.map +0 -1
  105. package/dist/prompts/input-types/file-prompt.js +0 -165
  106. package/dist/prompts/input-types/file-prompt.js.map +0 -1
  107. package/dist/schemas/prompt-schema.d.ts +0 -920
  108. package/dist/schemas/prompt-schema.d.ts.map +0 -1
  109. package/dist/schemas/prompt-schema.js +0 -110
  110. package/dist/schemas/prompt-schema.js.map +0 -1
  111. package/dist/search/file-search-engine.d.ts +0 -37
  112. package/dist/search/file-search-engine.d.ts.map +0 -1
  113. package/dist/search/file-search-engine.js +0 -184
  114. package/dist/search/file-search-engine.js.map +0 -1
  115. package/dist/services/file-system-service.d.ts +0 -43
  116. package/dist/services/file-system-service.d.ts.map +0 -1
  117. package/dist/services/file-system-service.js +0 -269
  118. package/dist/services/file-system-service.js.map +0 -1
  119. package/dist/utils/file-utils.d.ts +0 -17
  120. package/dist/utils/file-utils.d.ts.map +0 -1
  121. package/dist/utils/file-utils.js +0 -88
  122. package/dist/utils/file-utils.js.map +0 -1
  123. package/dist/utils/path-utils.d.ts +0 -42
  124. package/dist/utils/path-utils.d.ts.map +0 -1
  125. package/dist/utils/path-utils.js +0 -139
  126. package/dist/utils/path-utils.js.map +0 -1
  127. package/dist/utils/prompt-format.d.ts +0 -27
  128. package/dist/utils/prompt-format.d.ts.map +0 -1
  129. package/dist/utils/prompt-format.js +0 -28
  130. package/dist/utils/prompt-format.js.map +0 -1
  131. package/dist/utils/trie.d.ts +0 -19
  132. package/dist/utils/trie.d.ts.map +0 -1
  133. package/dist/utils/trie.js +0 -84
  134. package/dist/utils/trie.js.map +0 -1
  135. package/prompts/ad-hoc-long.prompt +0 -60
  136. package/prompts/ad-hoc.prompt +0 -29
  137. package/prompts/add-summary.prompt +0 -54
  138. package/prompts/code-review.prompt +0 -99
  139. package/prompts/debugging-error-message.prompt +0 -81
  140. package/prompts/fix-github-actions.prompt +0 -62
  141. package/prompts/fix-test-errors.prompt +0 -73
  142. package/prompts/git-commit-comment.prompt +0 -61
  143. package/prompts/implementation-phase.prompt +0 -53
  144. package/prompts/implementation-plan.prompt +0 -101
  145. package/prompts/new-feature.prompt +0 -89
  146. package/prompts/new-project.prompt +0 -9
  147. package/prompts/one-shot-change.prompt +0 -79
  148. package/prompts/pupt-prompt-improvement.prompt +0 -270
  149. package/prompts/simple-test.prompt +0 -8
  150. package/prompts/update-design.prompt +0 -71
  151. package/prompts/update-documentation.prompt +0 -6
@@ -1,269 +0,0 @@
1
- import fs from 'fs-extra';
2
- import path from 'node:path';
3
- import os from 'node:os';
4
- import { glob } from 'glob';
5
- import { minimatch } from 'minimatch';
6
- import MiniSearch from 'minisearch';
7
- export class FileSystemService {
8
- cache = new Map();
9
- searchIndex = null;
10
- searchIndexPath = null;
11
- options;
12
- constructor(options = {}) {
13
- this.options = {
14
- cacheTimeout: options.cacheTimeout ?? 5000,
15
- excludePatterns: options.excludePatterns ?? [
16
- 'node_modules/**',
17
- '.git/**',
18
- 'dist/**',
19
- 'coverage/**'
20
- ]
21
- };
22
- }
23
- expandPath(inputPath) {
24
- if (!inputPath)
25
- return '';
26
- // Handle home directory expansion
27
- if (inputPath.startsWith('~/')) {
28
- return path.join(os.homedir(), inputPath.slice(2));
29
- }
30
- // Resolve relative paths
31
- return path.resolve(inputPath);
32
- }
33
- normalizePath(input) {
34
- if (!input)
35
- return '';
36
- // Expand home directory first
37
- let normalized = input;
38
- if (normalized.startsWith('~')) {
39
- normalized = normalized.replace(/^~/, os.homedir());
40
- }
41
- // Normalize separators for the current platform
42
- if (process.platform === 'win32') {
43
- // On Windows, convert forward slashes to backslashes
44
- normalized = normalized.replace(/\//g, path.sep);
45
- }
46
- else {
47
- // On Unix, convert backslashes to forward slashes
48
- normalized = normalized.replace(/\\/g, path.sep);
49
- }
50
- // Use path.normalize to clean up the path
51
- return path.normalize(normalized);
52
- }
53
- resolveSearchPath(query) {
54
- // Handle empty query
55
- if (!query) {
56
- return { searchPath: '.', searchTerm: '' };
57
- }
58
- // Find the last separator position
59
- let lastSepIndex = -1;
60
- for (let i = query.length - 1; i >= 0; i--) {
61
- if (query[i] === '/' || query[i] === '\\') {
62
- lastSepIndex = i;
63
- break;
64
- }
65
- }
66
- if (lastSepIndex === -1) {
67
- // No separator - searching in current directory
68
- return { searchPath: '.', searchTerm: query };
69
- }
70
- // Split at the last separator
71
- const searchPath = query.substring(0, lastSepIndex) || '.';
72
- const searchTerm = query.substring(lastSepIndex + 1);
73
- return { searchPath, searchTerm };
74
- }
75
- async listFiles(directory, options = {}) {
76
- const cacheKey = `list:${directory}:${JSON.stringify(options)}`;
77
- const cached = this.getFromCache(cacheKey);
78
- if (cached)
79
- return cached;
80
- const expandedDir = this.expandPath(directory);
81
- try {
82
- const entries = await fs.readdir(expandedDir, { withFileTypes: true });
83
- const files = [];
84
- for (const entry of entries) {
85
- // Skip hidden files unless explicitly included
86
- if (!options.includeHidden && entry.name.startsWith('.')) {
87
- continue;
88
- }
89
- const fullPath = path.join(expandedDir, entry.name);
90
- const stats = await fs.stat(fullPath);
91
- const fileInfo = {
92
- name: entry.name,
93
- path: fullPath,
94
- relativePath: path.relative(process.cwd(), fullPath),
95
- isDirectory: entry.isDirectory(),
96
- size: stats.size,
97
- modified: stats.mtime,
98
- };
99
- // Apply pattern filter if provided
100
- if (options.pattern) {
101
- if (fileInfo.isDirectory || minimatch(fileInfo.name, options.pattern)) {
102
- files.push(fileInfo);
103
- }
104
- }
105
- else {
106
- files.push(fileInfo);
107
- }
108
- }
109
- // Sort files: directories first, then by modification time
110
- files.sort((a, b) => {
111
- if (a.isDirectory && !b.isDirectory)
112
- return -1;
113
- if (!a.isDirectory && b.isDirectory)
114
- return 1;
115
- return b.modified.getTime() - a.modified.getTime();
116
- });
117
- this.setCache(cacheKey, files);
118
- return files;
119
- }
120
- catch (error) {
121
- if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
122
- throw new Error(`Directory not found: ${directory}`);
123
- }
124
- throw error;
125
- }
126
- }
127
- async searchFiles(directory, query) {
128
- // Build or update search index if needed
129
- if (!this.searchIndex || this.searchIndexPath !== directory) {
130
- await this.buildSearchIndex(directory);
131
- }
132
- if (!this.searchIndex) {
133
- return [];
134
- }
135
- const results = this.searchIndex.search(query, {
136
- fuzzy: 0.2,
137
- prefix: true,
138
- boost: { name: 2 }
139
- });
140
- return results.map(result => {
141
- const fileInfo = this.searchIndex.getStoredFields(result.id);
142
- return fileInfo;
143
- });
144
- }
145
- async glob(directory, pattern, options = {}) {
146
- const cacheKey = `glob:${directory}:${pattern}:${JSON.stringify(options)}`;
147
- const cached = this.getFromCache(cacheKey);
148
- if (cached)
149
- return cached;
150
- const expandedDir = this.expandPath(directory);
151
- const globOptions = {
152
- cwd: expandedDir,
153
- ignore: options.ignore || this.options.excludePatterns,
154
- follow: options.followSymlinks ?? false,
155
- absolute: false
156
- };
157
- const matches = await glob(pattern, globOptions);
158
- const files = [];
159
- for (const match of matches) {
160
- const fullPath = path.join(expandedDir, match);
161
- try {
162
- const stats = await fs.stat(fullPath);
163
- files.push({
164
- name: path.basename(match),
165
- path: fullPath,
166
- relativePath: match,
167
- isDirectory: stats.isDirectory(),
168
- size: stats.size,
169
- modified: stats.mtime
170
- });
171
- }
172
- catch {
173
- // Skip files that can't be accessed
174
- }
175
- }
176
- this.setCache(cacheKey, files);
177
- return files;
178
- }
179
- async buildSearchIndex(directory) {
180
- const files = await this.listFilesRecursive(directory);
181
- this.searchIndex = new MiniSearch({
182
- fields: ['name', 'relativePath'],
183
- storeFields: ['name', 'path', 'relativePath', 'isDirectory', 'size', 'modified'],
184
- searchOptions: {
185
- boost: { name: 2 },
186
- fuzzy: 0.2
187
- }
188
- });
189
- // Add numeric IDs to files
190
- const filesWithIds = files.map((file, index) => ({
191
- ...file,
192
- id: index.toString()
193
- }));
194
- this.searchIndex.addAll(filesWithIds);
195
- this.searchIndexPath = directory;
196
- }
197
- async listFilesRecursive(directory) {
198
- const allFiles = [];
199
- const expandedDir = this.expandPath(directory);
200
- const walk = async (dir) => {
201
- try {
202
- const entries = await fs.readdir(dir, { withFileTypes: true });
203
- for (const entry of entries) {
204
- // Skip hidden files and excluded patterns
205
- if (entry.name.startsWith('.'))
206
- continue;
207
- const fullPath = path.join(dir, entry.name);
208
- const relativePath = path.relative(expandedDir, fullPath);
209
- // Skip excluded patterns
210
- let skip = false;
211
- for (const pattern of this.options.excludePatterns) {
212
- if (minimatch(relativePath, pattern)) {
213
- skip = true;
214
- break;
215
- }
216
- }
217
- if (skip)
218
- continue;
219
- const stats = await fs.stat(fullPath);
220
- allFiles.push({
221
- name: entry.name,
222
- path: fullPath,
223
- relativePath,
224
- isDirectory: entry.isDirectory(),
225
- size: stats.size,
226
- modified: stats.mtime
227
- });
228
- if (entry.isDirectory()) {
229
- await walk(fullPath);
230
- }
231
- }
232
- }
233
- catch {
234
- // Skip directories that can't be accessed
235
- }
236
- };
237
- await walk(expandedDir);
238
- return allFiles;
239
- }
240
- getFromCache(key) {
241
- const cached = this.cache.get(key);
242
- if (!cached)
243
- return null;
244
- const age = Date.now() - cached.timestamp;
245
- if (age > this.options.cacheTimeout) {
246
- this.cache.delete(key);
247
- return null;
248
- }
249
- return cached.data;
250
- }
251
- setCache(key, data) {
252
- this.cache.set(key, { data, timestamp: Date.now() });
253
- // Clean up old cache entries if too many
254
- if (this.cache.size > 100) {
255
- const entries = Array.from(this.cache.entries());
256
- entries.sort((a, b) => a[1].timestamp - b[1].timestamp);
257
- // Remove oldest 20 entries
258
- for (let i = 0; i < 20; i++) {
259
- this.cache.delete(entries[i][0]);
260
- }
261
- }
262
- }
263
- clearCache() {
264
- this.cache.clear();
265
- this.searchIndex = null;
266
- this.searchIndexPath = null;
267
- }
268
- }
269
- //# sourceMappingURL=file-system-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-system-service.js","sourceRoot":"","sources":["../../src/services/file-system-service.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- interface FileInfo {
2
- name: string;
3
- path: string;
4
- isDirectory: boolean;
5
- mtime: Date;
6
- }
7
- interface ListFilesOptions {
8
- includeHidden?: boolean;
9
- }
10
- export declare function listFiles(dirPath: string, options?: ListFilesOptions): FileInfo[];
11
- export declare function sortFilesByModTime(files: FileInfo[]): FileInfo[];
12
- export declare function filterFilesByPattern(files: FileInfo[], pattern: string): FileInfo[];
13
- export declare function listFilesWithCache(dirPath: string, options?: ListFilesOptions): FileInfo[];
14
- export declare function resolveFilePath(input: string, basePath: string): string;
15
- export declare function expandPath(inputPath: string): string;
16
- export {};
17
- //# sourceMappingURL=file-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAIA,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,IAAI,CAAC;CACb;AAED,UAAU,gBAAgB;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,QAAQ,EAAE,CA+BrF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAShE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAcnF;AAKD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,QAAQ,EAAE,CAY9F;AAMD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvE;AAMD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQpD"}
@@ -1,88 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { minimatch } from 'minimatch';
4
- export function listFiles(dirPath, options = {}) {
5
- const { includeHidden = false } = options;
6
- try {
7
- const entries = fs.readdirSync(dirPath, { withFileTypes: true });
8
- const files = [];
9
- for (const entry of entries) {
10
- // Skip hidden files unless explicitly included
11
- if (!includeHidden && entry.name.startsWith('.')) {
12
- continue;
13
- }
14
- const fullPath = path.join(dirPath, entry.name);
15
- const stats = fs.statSync(fullPath);
16
- files.push({
17
- name: entry.name,
18
- path: fullPath,
19
- isDirectory: entry.isDirectory(),
20
- mtime: stats.mtime,
21
- });
22
- }
23
- return files;
24
- }
25
- catch (error) {
26
- if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
27
- throw new Error(`Directory not found: ${dirPath}`);
28
- }
29
- throw error;
30
- }
31
- }
32
- export function sortFilesByModTime(files) {
33
- return [...files].sort((a, b) => {
34
- // Directories always come first
35
- if (a.isDirectory && !b.isDirectory)
36
- return -1;
37
- if (!a.isDirectory && b.isDirectory)
38
- return 1;
39
- // Then sort by modification time (newest first)
40
- return b.mtime.getTime() - a.mtime.getTime();
41
- });
42
- }
43
- export function filterFilesByPattern(files, pattern) {
44
- if (!pattern || pattern === '') {
45
- return files;
46
- }
47
- return files.filter(file => {
48
- // Always include directories for navigation
49
- if (file.isDirectory) {
50
- return true;
51
- }
52
- // Match files against the pattern
53
- return minimatch(file.name, pattern);
54
- });
55
- }
56
- const fileCache = new Map();
57
- const CACHE_TTL = 5000; // 5 seconds
58
- export function listFilesWithCache(dirPath, options = {}) {
59
- const cacheKey = `${dirPath}:${JSON.stringify(options)}`;
60
- const cached = fileCache.get(cacheKey);
61
- if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
62
- return cached.files;
63
- }
64
- const files = listFiles(dirPath, options);
65
- fileCache.set(cacheKey, { files, timestamp: Date.now() });
66
- return files;
67
- }
68
- function _clearFileCache() {
69
- fileCache.clear();
70
- }
71
- export function resolveFilePath(input, basePath) {
72
- if (path.isAbsolute(input)) {
73
- return input;
74
- }
75
- return path.resolve(basePath, input);
76
- }
77
- function _getParentDirectory(filePath) {
78
- return path.dirname(filePath);
79
- }
80
- export function expandPath(inputPath) {
81
- // Handle home directory expansion
82
- if (inputPath.startsWith('~/')) {
83
- const homeDir = process.env.HOME || process.env.USERPROFILE || '';
84
- return path.join(homeDir, inputPath.slice(2));
85
- }
86
- return inputPath;
87
- }
88
- //# sourceMappingURL=file-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- /**
2
- * Utilities for converting paths to portable format for config files.
3
- *
4
- * When saving configs, absolute paths should be converted to portable formats:
5
- * - Paths under project root → ${projectRoot}/...
6
- * - Paths under home directory → ~/...
7
- * - Already relative paths → kept as-is
8
- * - Other absolute paths → kept as-is with warning
9
- */
10
- export interface ContractPathsOptions {
11
- /** Directory to resolve relative paths from (typically config file location) */
12
- configDir?: string;
13
- /** Whether to warn about non-portable absolute paths */
14
- warnOnAbsolute?: boolean;
15
- }
16
- export interface ContractPathsResult {
17
- /** The contracted path */
18
- path: string;
19
- /** Whether a warning was issued */
20
- warned: boolean;
21
- }
22
- /**
23
- * Contract a single path to a portable format.
24
- *
25
- * Priority:
26
- * 1. Already relative paths → keep as-is
27
- * 2. Paths under project root → ${projectRoot}/...
28
- * 3. Paths under home directory → ~/...
29
- * 4. Other absolute paths → keep as-is (with optional warning)
30
- */
31
- export declare function contractPath(filepath: string, options?: ContractPathsOptions): ContractPathsResult;
32
- /**
33
- * Check if a path is absolute and could be made portable.
34
- * Used for warning users on config load.
35
- */
36
- export declare function isNonPortableAbsolutePath(filepath: string, configDir?: string): boolean;
37
- /**
38
- * Warn about non-portable paths in a config.
39
- * Call this when loading a config to alert users.
40
- */
41
- export declare function warnAboutNonPortablePaths(paths: (string | undefined)[], configFilePath?: string): void;
42
- //# sourceMappingURL=path-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4BH,MAAM,WAAW,oBAAoB;IACnC,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAuDrB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CA8BvF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EAC7B,cAAc,CAAC,EAAE,MAAM,GACtB,IAAI,CAkBN"}
@@ -1,139 +0,0 @@
1
- /**
2
- * Utilities for converting paths to portable format for config files.
3
- *
4
- * When saving configs, absolute paths should be converted to portable formats:
5
- * - Paths under project root → ${projectRoot}/...
6
- * - Paths under home directory → ~/...
7
- * - Already relative paths → kept as-is
8
- * - Other absolute paths → kept as-is with warning
9
- */
10
- import path from 'node:path';
11
- import fs from 'node:fs';
12
- import os from 'node:os';
13
- import { findProjectRoot } from './project-root.js';
14
- import { logger } from './logger.js';
15
- /**
16
- * Resolve symlinks in a path, even if the leaf segments don't exist.
17
- * Walks up to the nearest existing ancestor, resolves it, then re-appends
18
- * the non-existent tail. This handles macOS /var -> /private/var symlink
19
- * differences when the target path (e.g. a prompt directory) hasn't been
20
- * created yet.
21
- */
22
- function safeRealpath(p) {
23
- try {
24
- return fs.realpathSync(p);
25
- }
26
- catch {
27
- const parent = path.dirname(p);
28
- if (parent === p) {
29
- // Reached filesystem root — nothing more to resolve
30
- return p;
31
- }
32
- return path.join(safeRealpath(parent), path.basename(p));
33
- }
34
- }
35
- /**
36
- * Contract a single path to a portable format.
37
- *
38
- * Priority:
39
- * 1. Already relative paths → keep as-is
40
- * 2. Paths under project root → ${projectRoot}/...
41
- * 3. Paths under home directory → ~/...
42
- * 4. Other absolute paths → keep as-is (with optional warning)
43
- */
44
- export function contractPath(filepath, options = {}) {
45
- const { configDir = process.cwd(), warnOnAbsolute = true } = options;
46
- // Already relative path - keep as-is
47
- if (!path.isAbsolute(filepath)) {
48
- return { path: filepath, warned: false };
49
- }
50
- // Already uses ${projectRoot} or ~ - keep as-is
51
- if (filepath.includes('${projectRoot}') || filepath.startsWith('~/')) {
52
- return { path: filepath, warned: false };
53
- }
54
- const homeDir = os.homedir();
55
- const projectRoot = findProjectRoot(configDir);
56
- // Resolve symlinks for comparison (handles macOS /var -> /private/var)
57
- const resolvedPath = safeRealpath(filepath);
58
- // Check if path is under project root (prefer this over home)
59
- if (projectRoot) {
60
- const resolvedProjectRoot = safeRealpath(projectRoot);
61
- if (resolvedPath.startsWith(resolvedProjectRoot + path.sep) || resolvedPath === resolvedProjectRoot) {
62
- const relativePath = path.relative(resolvedProjectRoot, resolvedPath);
63
- // Use forward slashes for cross-platform compatibility in config
64
- const portablePath = relativePath.split(path.sep).join('/');
65
- return {
66
- path: portablePath ? `\${projectRoot}/${portablePath}` : '${projectRoot}',
67
- warned: false
68
- };
69
- }
70
- }
71
- // Check if path is under home directory
72
- const resolvedHomeDir = safeRealpath(homeDir);
73
- if (resolvedPath.startsWith(resolvedHomeDir + path.sep) || resolvedPath === resolvedHomeDir) {
74
- const relativePath = path.relative(resolvedHomeDir, resolvedPath);
75
- // Use forward slashes for cross-platform compatibility
76
- const portablePath = relativePath.split(path.sep).join('/');
77
- return {
78
- path: portablePath ? `~/${portablePath}` : '~',
79
- warned: false
80
- };
81
- }
82
- // Absolute path outside project and home - keep as-is but warn
83
- if (warnOnAbsolute) {
84
- logger.warn(`Path "${filepath}" is absolute and outside the project root. ` +
85
- `This path will not be portable across machines. ` +
86
- `Consider using a relative path, ~/..., or \${projectRoot}/...`);
87
- }
88
- return { path: filepath, warned: true };
89
- }
90
- /**
91
- * Check if a path is absolute and could be made portable.
92
- * Used for warning users on config load.
93
- */
94
- export function isNonPortableAbsolutePath(filepath, configDir) {
95
- // Not absolute - it's fine
96
- if (!path.isAbsolute(filepath)) {
97
- return false;
98
- }
99
- // Uses portable variables - it's fine
100
- if (filepath.includes('${projectRoot}') || filepath.startsWith('~/')) {
101
- return false;
102
- }
103
- const homeDir = os.homedir();
104
- const projectRoot = findProjectRoot(configDir || process.cwd());
105
- const resolvedPath = safeRealpath(filepath);
106
- // Check if it could be made portable
107
- if (projectRoot) {
108
- const resolvedProjectRoot = safeRealpath(projectRoot);
109
- if (resolvedPath.startsWith(resolvedProjectRoot + path.sep)) {
110
- return true; // Could use ${projectRoot}
111
- }
112
- }
113
- const resolvedHomeDir = safeRealpath(homeDir);
114
- if (resolvedPath.startsWith(resolvedHomeDir + path.sep)) {
115
- return true; // Could use ~/
116
- }
117
- // Absolute but can't be made portable - still flag it
118
- return true;
119
- }
120
- /**
121
- * Warn about non-portable paths in a config.
122
- * Call this when loading a config to alert users.
123
- */
124
- export function warnAboutNonPortablePaths(paths, configFilePath) {
125
- const configDir = configFilePath ? path.dirname(configFilePath) : process.cwd();
126
- const nonPortable = [];
127
- for (const p of paths) {
128
- if (p && isNonPortableAbsolutePath(p, configDir)) {
129
- nonPortable.push(p);
130
- }
131
- }
132
- if (nonPortable.length > 0) {
133
- logger.warn(`Your config contains absolute paths that may not be portable:\n` +
134
- nonPortable.map(p => ` - ${p}`).join('\n') + '\n' +
135
- `These will be converted to portable format next time the config is saved.\n` +
136
- `To fix manually, use relative paths, ~/..., or \${projectRoot}/...`);
137
- }
138
- }
139
- //# sourceMappingURL=path-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- /**
2
- * Prompt format types supported by pupt.
3
- *
4
- * - `jsx`: Build-time JSX, imported as ES modules (.tsx/.jsx files)
5
- * - `jsx-runtime`: Runtime-parsed JSX via createPromptFromSource (.prompt files)
6
- */
7
- export type PromptFormat = 'jsx' | 'jsx-runtime';
8
- /**
9
- * File extensions recognized as pupt-lib JSX prompt formats.
10
- */
11
- export declare const PUPT_LIB_EXTENSIONS: string[];
12
- /**
13
- * All file extensions recognized as prompt files.
14
- */
15
- export declare const ALL_PROMPT_EXTENSIONS: string[];
16
- /**
17
- * Detect the prompt format based on file extension.
18
- *
19
- * @param filePath - Path or filename to check
20
- * @returns The detected prompt format
21
- */
22
- export declare function detectPromptFormat(filePath: string): PromptFormat;
23
- /**
24
- * Check if a file is a pupt-lib prompt format.
25
- */
26
- export declare function isPuptLibFormat(filePath: string): boolean;
27
- //# sourceMappingURL=prompt-format.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-format.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,aAAa,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAA8B,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,qBAAqB,UAA2B,CAAC;AAE9D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAKjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGzD"}
@@ -1,28 +0,0 @@
1
- /**
2
- * File extensions recognized as pupt-lib JSX prompt formats.
3
- */
4
- export const PUPT_LIB_EXTENSIONS = ['.tsx', '.jsx', '.prompt'];
5
- /**
6
- * All file extensions recognized as prompt files.
7
- */
8
- export const ALL_PROMPT_EXTENSIONS = [...PUPT_LIB_EXTENSIONS];
9
- /**
10
- * Detect the prompt format based on file extension.
11
- *
12
- * @param filePath - Path or filename to check
13
- * @returns The detected prompt format
14
- */
15
- export function detectPromptFormat(filePath) {
16
- if (filePath.endsWith('.tsx') || filePath.endsWith('.jsx')) {
17
- return 'jsx';
18
- }
19
- return 'jsx-runtime';
20
- }
21
- /**
22
- * Check if a file is a pupt-lib prompt format.
23
- */
24
- export function isPuptLibFormat(filePath) {
25
- const format = detectPromptFormat(filePath);
26
- return format === 'jsx' || format === 'jsx-runtime';
27
- }
28
- //# sourceMappingURL=prompt-format.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-format.js","sourceRoot":"","sources":["../../src/utils/prompt-format.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,aAAa,CAAC;AACtD,CAAC"}