indusagi-coding-agent 0.1.23 → 0.1.24

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 (213) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +2 -0
  3. package/dist/cli/args.d.ts +117 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +221 -52
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts +58 -2
  8. package/dist/cli/config-selector.d.ts.map +1 -1
  9. package/dist/cli/config-selector.js +130 -12
  10. package/dist/cli/config-selector.js.map +1 -1
  11. package/dist/cli/file-processor.d.ts +70 -2
  12. package/dist/cli/file-processor.d.ts.map +1 -1
  13. package/dist/cli/file-processor.js +240 -15
  14. package/dist/cli/file-processor.js.map +1 -1
  15. package/dist/cli/list-models.d.ts +63 -3
  16. package/dist/cli/list-models.d.ts.map +1 -1
  17. package/dist/cli/list-models.js +202 -27
  18. package/dist/cli/list-models.js.map +1 -1
  19. package/dist/cli/login-handler.d.ts +82 -8
  20. package/dist/cli/login-handler.d.ts.map +1 -1
  21. package/dist/cli/login-handler.js +410 -77
  22. package/dist/cli/login-handler.js.map +1 -1
  23. package/dist/cli/session-picker.d.ts +74 -2
  24. package/dist/cli/session-picker.d.ts.map +1 -1
  25. package/dist/cli/session-picker.js +236 -12
  26. package/dist/cli/session-picker.js.map +1 -1
  27. package/dist/core/agent-session.d.ts +214 -9
  28. package/dist/core/agent-session.d.ts.map +1 -1
  29. package/dist/core/agent-session.js +214 -9
  30. package/dist/core/agent-session.js.map +1 -1
  31. package/dist/core/bash-executor.d.ts +302 -12
  32. package/dist/core/bash-executor.d.ts.map +1 -1
  33. package/dist/core/bash-executor.js +302 -12
  34. package/dist/core/bash-executor.js.map +1 -1
  35. package/dist/core/diagnostics.d.ts +191 -0
  36. package/dist/core/diagnostics.d.ts.map +1 -1
  37. package/dist/core/diagnostics.js +142 -0
  38. package/dist/core/diagnostics.js.map +1 -1
  39. package/dist/core/event-bus.d.ts +146 -0
  40. package/dist/core/event-bus.d.ts.map +1 -1
  41. package/dist/core/event-bus.js +93 -0
  42. package/dist/core/event-bus.js.map +1 -1
  43. package/dist/core/export-html/ansi-to-html.d.ts +4 -0
  44. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  45. package/dist/core/export-html/ansi-to-html.js +4 -0
  46. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  47. package/dist/core/export-html/index.d.ts +128 -0
  48. package/dist/core/export-html/index.d.ts.map +1 -1
  49. package/dist/core/export-html/index.js +128 -0
  50. package/dist/core/export-html/index.js.map +1 -1
  51. package/dist/core/export-html/tool-renderer.d.ts +4 -0
  52. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  53. package/dist/core/export-html/tool-renderer.js +4 -0
  54. package/dist/core/export-html/tool-renderer.js.map +1 -1
  55. package/dist/core/keybindings.d.ts +142 -0
  56. package/dist/core/keybindings.d.ts.map +1 -1
  57. package/dist/core/keybindings.js +142 -0
  58. package/dist/core/keybindings.js.map +1 -1
  59. package/dist/core/model-registry.d.ts +98 -1
  60. package/dist/core/model-registry.d.ts.map +1 -1
  61. package/dist/core/model-registry.js +98 -1
  62. package/dist/core/model-registry.js.map +1 -1
  63. package/dist/core/model-resolver.d.ts +99 -1
  64. package/dist/core/model-resolver.d.ts.map +1 -1
  65. package/dist/core/model-resolver.js +99 -1
  66. package/dist/core/model-resolver.js.map +1 -1
  67. package/dist/core/prompt-templates.js.map +1 -1
  68. package/dist/core/session-manager.d.ts +127 -0
  69. package/dist/core/session-manager.d.ts.map +1 -1
  70. package/dist/core/session-manager.js +125 -0
  71. package/dist/core/session-manager.js.map +1 -1
  72. package/dist/core/skills.js.map +1 -1
  73. package/dist/core/subagents.js.map +1 -1
  74. package/dist/core/tools/bash.d.ts +391 -11
  75. package/dist/core/tools/bash.d.ts.map +1 -1
  76. package/dist/core/tools/bash.js +269 -2
  77. package/dist/core/tools/bash.js.map +1 -1
  78. package/dist/core/tools/edit.d.ts +284 -6
  79. package/dist/core/tools/edit.d.ts.map +1 -1
  80. package/dist/core/tools/edit.js +238 -0
  81. package/dist/core/tools/edit.js.map +1 -1
  82. package/dist/core/tools/find.d.ts +169 -5
  83. package/dist/core/tools/find.d.ts.map +1 -1
  84. package/dist/core/tools/find.js +136 -0
  85. package/dist/core/tools/find.js.map +1 -1
  86. package/dist/core/tools/grep.d.ts +285 -5
  87. package/dist/core/tools/grep.d.ts.map +1 -1
  88. package/dist/core/tools/grep.js +247 -0
  89. package/dist/core/tools/grep.js.map +1 -1
  90. package/dist/core/tools/ls.d.ts +6 -0
  91. package/dist/core/tools/ls.d.ts.map +1 -1
  92. package/dist/core/tools/ls.js +6 -0
  93. package/dist/core/tools/ls.js.map +1 -1
  94. package/dist/core/tools/read.d.ts +308 -7
  95. package/dist/core/tools/read.d.ts.map +1 -1
  96. package/dist/core/tools/read.js +231 -0
  97. package/dist/core/tools/read.js.map +1 -1
  98. package/dist/core/tools/webfetch.d.ts +118 -3
  99. package/dist/core/tools/webfetch.d.ts.map +1 -1
  100. package/dist/core/tools/webfetch.js +118 -3
  101. package/dist/core/tools/webfetch.js.map +1 -1
  102. package/dist/core/tools/websearch.d.ts +130 -3
  103. package/dist/core/tools/websearch.d.ts.map +1 -1
  104. package/dist/core/tools/websearch.js +130 -3
  105. package/dist/core/tools/websearch.js.map +1 -1
  106. package/dist/core/tools/write.d.ts +251 -5
  107. package/dist/core/tools/write.d.ts.map +1 -1
  108. package/dist/core/tools/write.js +210 -0
  109. package/dist/core/tools/write.js.map +1 -1
  110. package/dist/modes/interactive/components/assistant-message.d.ts +164 -1
  111. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  112. package/dist/modes/interactive/components/assistant-message.js +164 -1
  113. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  114. package/dist/modes/interactive/components/bash-execution.d.ts +297 -1
  115. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  116. package/dist/modes/interactive/components/bash-execution.js +297 -1
  117. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  118. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  119. package/dist/modes/interactive/components/tool-execution.js +251 -1
  120. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  121. package/dist/modes/interactive/components/user-message.d.ts +186 -1
  122. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  123. package/dist/modes/interactive/components/user-message.js +186 -1
  124. package/dist/modes/interactive/components/user-message.js.map +1 -1
  125. package/dist/modes/interactive/interactive-mode.d.ts +1567 -13
  126. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  127. package/dist/modes/interactive/interactive-mode.js +1567 -13
  128. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  129. package/dist/modes/interactive/theme/theme.d.ts +422 -0
  130. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  131. package/dist/modes/interactive/theme/theme.js +422 -0
  132. package/dist/modes/interactive/theme/theme.js.map +1 -1
  133. package/dist/modes/print-mode.d.ts +538 -5
  134. package/dist/modes/print-mode.d.ts.map +1 -1
  135. package/dist/modes/print-mode.js +538 -5
  136. package/dist/modes/print-mode.js.map +1 -1
  137. package/dist/modes/rpc/rpc-client.d.ts +921 -8
  138. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  139. package/dist/modes/rpc/rpc-client.js +921 -8
  140. package/dist/modes/rpc/rpc-client.js.map +1 -1
  141. package/dist/modes/rpc/rpc-mode.d.ts +802 -9
  142. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  143. package/dist/modes/rpc/rpc-mode.js +802 -9
  144. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  145. package/dist/modes/rpc/rpc-types.d.ts +356 -3
  146. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  147. package/dist/modes/rpc/rpc-types.js +356 -3
  148. package/dist/modes/rpc/rpc-types.js.map +1 -1
  149. package/dist/modes/shared.d.ts +386 -0
  150. package/dist/modes/shared.d.ts.map +1 -0
  151. package/dist/modes/shared.js +543 -0
  152. package/dist/modes/shared.js.map +1 -0
  153. package/dist/utils/array.d.ts +389 -0
  154. package/dist/utils/array.d.ts.map +1 -0
  155. package/dist/utils/array.js +585 -0
  156. package/dist/utils/array.js.map +1 -0
  157. package/dist/utils/color-formatter.d.ts +318 -0
  158. package/dist/utils/color-formatter.d.ts.map +1 -0
  159. package/dist/utils/color-formatter.js +442 -0
  160. package/dist/utils/color-formatter.js.map +1 -0
  161. package/dist/utils/data-transformer.d.ts +326 -0
  162. package/dist/utils/data-transformer.d.ts.map +1 -0
  163. package/dist/utils/data-transformer.js +512 -0
  164. package/dist/utils/data-transformer.js.map +1 -0
  165. package/dist/utils/date-formatter.d.ts +281 -0
  166. package/dist/utils/date-formatter.d.ts.map +1 -0
  167. package/dist/utils/date-formatter.js +503 -0
  168. package/dist/utils/date-formatter.js.map +1 -0
  169. package/dist/utils/error-handler.d.ts +541 -0
  170. package/dist/utils/error-handler.d.ts.map +1 -0
  171. package/dist/utils/error-handler.js +726 -0
  172. package/dist/utils/error-handler.js.map +1 -0
  173. package/dist/utils/file-operations.d.ts +297 -0
  174. package/dist/utils/file-operations.d.ts.map +1 -0
  175. package/dist/utils/file-operations.js +505 -0
  176. package/dist/utils/file-operations.js.map +1 -0
  177. package/dist/utils/frontmatter.d.ts +268 -6
  178. package/dist/utils/frontmatter.d.ts.map +1 -1
  179. package/dist/utils/frontmatter.js +500 -21
  180. package/dist/utils/frontmatter.js.map +1 -1
  181. package/dist/utils/json-formatter.d.ts +259 -0
  182. package/dist/utils/json-formatter.d.ts.map +1 -0
  183. package/dist/utils/json-formatter.js +517 -0
  184. package/dist/utils/json-formatter.js.map +1 -0
  185. package/dist/utils/logger.d.ts +176 -0
  186. package/dist/utils/logger.d.ts.map +1 -0
  187. package/dist/utils/logger.js +346 -0
  188. package/dist/utils/logger.js.map +1 -0
  189. package/dist/utils/markdown-formatter.d.ts +211 -0
  190. package/dist/utils/markdown-formatter.d.ts.map +1 -0
  191. package/dist/utils/markdown-formatter.js +482 -0
  192. package/dist/utils/markdown-formatter.js.map +1 -0
  193. package/dist/utils/path-validator.d.ts +603 -0
  194. package/dist/utils/path-validator.d.ts.map +1 -0
  195. package/dist/utils/path-validator.js +870 -0
  196. package/dist/utils/path-validator.js.map +1 -0
  197. package/dist/utils/string-formatter.d.ts +609 -0
  198. package/dist/utils/string-formatter.d.ts.map +1 -0
  199. package/dist/utils/string-formatter.js +806 -0
  200. package/dist/utils/string-formatter.js.map +1 -0
  201. package/dist/utils/type-guards.d.ts +629 -0
  202. package/dist/utils/type-guards.d.ts.map +1 -0
  203. package/dist/utils/type-guards.js +662 -0
  204. package/dist/utils/type-guards.js.map +1 -0
  205. package/docs/COMPLETE-GUIDE.md +300 -0
  206. package/docs/MODES-ARCHITECTURE.md +565 -0
  207. package/docs/PRINT-MODE-GUIDE.md +456 -0
  208. package/docs/RPC-GUIDE.md +705 -0
  209. package/docs/UTILS-IMPLEMENTATION-SUMMARY.md +647 -0
  210. package/docs/UTILS-MODULE-OVERVIEW.md +1480 -0
  211. package/docs/UTILS-QA-CHECKLIST.md +1061 -0
  212. package/docs/UTILS-USAGE-GUIDE.md +1419 -0
  213. package/package.json +1 -1
@@ -0,0 +1,505 @@
1
+ /**
2
+ * @fileoverview Safe file and directory operations with comprehensive error handling
3
+ *
4
+ * This module provides:
5
+ * - Safe file read/write/append operations
6
+ * - Directory listing and management
7
+ * - File metadata operations (size, modification time, permissions)
8
+ * - Cross-platform path handling
9
+ * - Error recovery and fallback mechanisms
10
+ * - Atomic file operations
11
+ * - Batch operations on multiple files
12
+ * - Safe deletion with backup support
13
+ *
14
+ * @example
15
+ * import { readFile, writeFile, exists, listFiles } from './file-operations';
16
+ *
17
+ * const content = await readFile('./data.json');
18
+ * await writeFile('./backup.json', content);
19
+ * const files = await listFiles('./src');
20
+ *
21
+ * @author indusagi
22
+ * @version 1.0.0
23
+ */
24
+ import { promises as fs } from 'fs';
25
+ import * as path from 'path';
26
+ import { createHash } from 'crypto';
27
+ /** File operation error with context */
28
+ export class FileOperationError extends Error {
29
+ constructor(operation, filePath, originalError) {
30
+ super(`File operation '${operation}' failed on '${filePath}': ${originalError.message}`);
31
+ this.operation = operation;
32
+ this.filePath = filePath;
33
+ this.originalError = originalError;
34
+ this.name = 'FileOperationError';
35
+ }
36
+ }
37
+ /**
38
+ * Safely read file contents
39
+ * @param filePath - Path to file
40
+ * @param options - Read options
41
+ * @returns File contents
42
+ * @throws FileOperationError if read fails
43
+ *
44
+ * @example
45
+ * const content = await readFile('./config.json');
46
+ *
47
+ * @example
48
+ * const content = await readFile('./data.txt', { encoding: 'utf-8', maxSize: 10000 });
49
+ *
50
+ * @example
51
+ * try {
52
+ * const content = await readFile('./missing.txt');
53
+ * } catch (error) {
54
+ * if (error instanceof FileOperationError) {
55
+ * console.error(`Failed to read: ${error.operation}`);
56
+ * }
57
+ * }
58
+ */
59
+ export async function readFile(filePath, options) {
60
+ try {
61
+ const absolutePath = path.resolve(filePath);
62
+ const encoding = options?.encoding || 'utf-8';
63
+ // Check max size if specified
64
+ if (options?.maxSize) {
65
+ const stats = await fs.stat(absolutePath);
66
+ if (stats.size > options.maxSize) {
67
+ throw new Error(`File size ${stats.size} exceeds max size ${options.maxSize}`);
68
+ }
69
+ }
70
+ return await fs.readFile(absolutePath, encoding);
71
+ }
72
+ catch (error) {
73
+ throw new FileOperationError('readFile', filePath, error);
74
+ }
75
+ }
76
+ /**
77
+ * Safely read file as buffer
78
+ * @param filePath - Path to file
79
+ * @param options - Read options
80
+ * @returns File buffer
81
+ *
82
+ * @example
83
+ * const buffer = await readFileBuffer('./image.png');
84
+ * const base64 = buffer.toString('base64');
85
+ */
86
+ export async function readFileBuffer(filePath, options) {
87
+ try {
88
+ const absolutePath = path.resolve(filePath);
89
+ if (options?.maxSize) {
90
+ const stats = await fs.stat(absolutePath);
91
+ if (stats.size > options.maxSize) {
92
+ throw new Error(`File size ${stats.size} exceeds max size ${options.maxSize}`);
93
+ }
94
+ }
95
+ return await fs.readFile(absolutePath);
96
+ }
97
+ catch (error) {
98
+ throw new FileOperationError('readFileBuffer', filePath, error);
99
+ }
100
+ }
101
+ /**
102
+ * Safely write file contents
103
+ * @param filePath - Path to file
104
+ * @param content - Content to write
105
+ * @param options - Write options
106
+ *
107
+ * @example
108
+ * await writeFile('./config.json', JSON.stringify(config, null, 2));
109
+ *
110
+ * @example
111
+ * await writeFile('./output.txt', 'Hello World', { createDirs: true });
112
+ *
113
+ * @example
114
+ * await writeFile('./exclusive.txt', 'Data', { exclusive: true });
115
+ * // Throws if file already exists
116
+ */
117
+ export async function writeFile(filePath, content, options) {
118
+ try {
119
+ const absolutePath = path.resolve(filePath);
120
+ const dir = path.dirname(absolutePath);
121
+ const encoding = options?.encoding || 'utf-8';
122
+ // Create directories if needed
123
+ if (options?.createDirs) {
124
+ await fs.mkdir(dir, { recursive: true });
125
+ }
126
+ const writeOptions = { encoding };
127
+ if (options?.exclusive) {
128
+ writeOptions.flag = 'wx';
129
+ }
130
+ if (options?.mode) {
131
+ writeOptions.mode = options.mode;
132
+ }
133
+ await fs.writeFile(absolutePath, content, writeOptions);
134
+ }
135
+ catch (error) {
136
+ throw new FileOperationError('writeFile', filePath, error);
137
+ }
138
+ }
139
+ /**
140
+ * Safely append to file
141
+ * @param filePath - Path to file
142
+ * @param content - Content to append
143
+ * @param options - Append options
144
+ *
145
+ * @example
146
+ * await appendFile('./log.txt', 'New log entry\n');
147
+ *
148
+ * @example
149
+ * await appendFile('./data.jsonl', JSON.stringify(record) + '\n', { createDirs: true });
150
+ */
151
+ export async function appendFile(filePath, content, options) {
152
+ try {
153
+ const absolutePath = path.resolve(filePath);
154
+ const dir = path.dirname(absolutePath);
155
+ const encoding = options?.encoding || 'utf-8';
156
+ if (options?.createDirs) {
157
+ await fs.mkdir(dir, { recursive: true });
158
+ }
159
+ await fs.appendFile(absolutePath, content, encoding);
160
+ }
161
+ catch (error) {
162
+ throw new FileOperationError('appendFile', filePath, error);
163
+ }
164
+ }
165
+ /**
166
+ * Check if file or directory exists
167
+ * @param filePath - Path to check
168
+ * @returns True if exists, false otherwise
169
+ *
170
+ * @example
171
+ * if (await exists('./config.json')) {
172
+ * const config = await readFile('./config.json');
173
+ * }
174
+ *
175
+ * @example
176
+ * const fileExists = await exists('./data.txt');
177
+ * const dirExists = await exists('./src/');
178
+ */
179
+ export async function exists(filePath) {
180
+ try {
181
+ const absolutePath = path.resolve(filePath);
182
+ await fs.access(absolutePath);
183
+ return true;
184
+ }
185
+ catch {
186
+ return false;
187
+ }
188
+ }
189
+ /**
190
+ * Delete file or directory
191
+ * @param filePath - Path to delete
192
+ * @param createBackup - Create backup before deleting
193
+ * @returns Backup path if created
194
+ *
195
+ * @example
196
+ * await deleteFile('./temp.txt');
197
+ *
198
+ * @example
199
+ * const backup = await deleteFile('./important.txt', true);
200
+ * console.log(`Backup created at: ${backup}`);
201
+ */
202
+ export async function deleteFile(filePath, createBackup = false) {
203
+ try {
204
+ const absolutePath = path.resolve(filePath);
205
+ let backupPath;
206
+ if (createBackup && await exists(absolutePath)) {
207
+ const timestamp = Date.now();
208
+ backupPath = `${absolutePath}.backup.${timestamp}`;
209
+ await fs.copyFile(absolutePath, backupPath);
210
+ }
211
+ const stats = await fs.stat(absolutePath);
212
+ if (stats.isDirectory()) {
213
+ await fs.rm(absolutePath, { recursive: true, force: true });
214
+ }
215
+ else {
216
+ await fs.unlink(absolutePath);
217
+ }
218
+ return backupPath;
219
+ }
220
+ catch (error) {
221
+ throw new FileOperationError('deleteFile', filePath, error);
222
+ }
223
+ }
224
+ /**
225
+ * Get file size in bytes
226
+ * @param filePath - Path to file
227
+ * @returns File size in bytes
228
+ *
229
+ * @example
230
+ * const size = await getSize('./data.txt');
231
+ * console.log(`File size: ${(size / 1024).toFixed(2)} KB`);
232
+ *
233
+ * @example
234
+ * const size = await getSize('./large-file.bin');
235
+ * const sizeInMB = size / (1024 * 1024);
236
+ */
237
+ export async function getSize(filePath) {
238
+ try {
239
+ const absolutePath = path.resolve(filePath);
240
+ const stats = await fs.stat(absolutePath);
241
+ return stats.size;
242
+ }
243
+ catch (error) {
244
+ throw new FileOperationError('getSize', filePath, error);
245
+ }
246
+ }
247
+ /**
248
+ * Get file modification time
249
+ * @param filePath - Path to file
250
+ * @returns Modification date
251
+ *
252
+ * @example
253
+ * const modTime = await getModTime('./config.json');
254
+ * console.log(`Last modified: ${modTime.toISOString()}`);
255
+ */
256
+ export async function getModTime(filePath) {
257
+ try {
258
+ const absolutePath = path.resolve(filePath);
259
+ const stats = await fs.stat(absolutePath);
260
+ return stats.mtime;
261
+ }
262
+ catch (error) {
263
+ throw new FileOperationError('getModTime', filePath, error);
264
+ }
265
+ }
266
+ /**
267
+ * Check if path is a directory
268
+ * @param filePath - Path to check
269
+ * @returns True if directory
270
+ *
271
+ * @example
272
+ * if (await isDirectory('./src')) {
273
+ * const files = await listFiles('./src');
274
+ * }
275
+ */
276
+ export async function isDirectory(filePath) {
277
+ try {
278
+ const absolutePath = path.resolve(filePath);
279
+ const stats = await fs.stat(absolutePath);
280
+ return stats.isDirectory();
281
+ }
282
+ catch {
283
+ return false;
284
+ }
285
+ }
286
+ /**
287
+ * Check if path is a file
288
+ * @param filePath - Path to check
289
+ * @returns True if file
290
+ *
291
+ * @example
292
+ * if (await isFile('./data.json')) {
293
+ * const data = await readFile('./data.json');
294
+ * }
295
+ */
296
+ export async function isFile(filePath) {
297
+ try {
298
+ const absolutePath = path.resolve(filePath);
299
+ const stats = await fs.stat(absolutePath);
300
+ return stats.isFile();
301
+ }
302
+ catch {
303
+ return false;
304
+ }
305
+ }
306
+ /**
307
+ * List files in directory
308
+ * @param dirPath - Directory path
309
+ * @param options - List options
310
+ * @returns Array of file paths
311
+ *
312
+ * @example
313
+ * const files = await listFiles('./src');
314
+ *
315
+ * @example
316
+ * const tsFiles = await listFiles('./src', { extension: '.ts', recursive: true });
317
+ *
318
+ * @example
319
+ * const allFiles = await listFiles('./src', { recursive: true, filesOnly: true });
320
+ */
321
+ export async function listFiles(dirPath, options) {
322
+ try {
323
+ const absolutePath = path.resolve(dirPath);
324
+ const results = [];
325
+ async function traverseDirectory(dir) {
326
+ const entries = await fs.readdir(dir, { withFileTypes: true });
327
+ for (const entry of entries) {
328
+ const fullPath = path.join(dir, entry.name);
329
+ // Skip hidden files unless included
330
+ if (!options?.includeHidden && entry.name.startsWith('.')) {
331
+ continue;
332
+ }
333
+ if (entry.isDirectory()) {
334
+ if (options?.recursive) {
335
+ await traverseDirectory(fullPath);
336
+ }
337
+ if (!options?.filesOnly) {
338
+ results.push(fullPath);
339
+ }
340
+ }
341
+ else if (entry.isFile()) {
342
+ // Filter by extension if specified
343
+ if (options?.extension && !entry.name.endsWith(options.extension)) {
344
+ continue;
345
+ }
346
+ results.push(fullPath);
347
+ }
348
+ }
349
+ }
350
+ await traverseDirectory(absolutePath);
351
+ return results;
352
+ }
353
+ catch (error) {
354
+ throw new FileOperationError('listFiles', dirPath, error);
355
+ }
356
+ }
357
+ /**
358
+ * Get comprehensive file metadata
359
+ * @param filePath - Path to file
360
+ * @param includeHash - Include file hash (slower)
361
+ * @returns File metadata
362
+ *
363
+ * @example
364
+ * const meta = await getMetadata('./data.json');
365
+ * console.log(`Size: ${meta.size} bytes, Modified: ${meta.modTime}`);
366
+ *
367
+ * @example
368
+ * const meta = await getMetadata('./config.json', true);
369
+ * console.log(`Hash: ${meta.hash}`);
370
+ */
371
+ export async function getMetadata(filePath, includeHash = false) {
372
+ try {
373
+ const absolutePath = path.resolve(filePath);
374
+ const stats = await fs.stat(absolutePath);
375
+ let hash;
376
+ if (includeHash) {
377
+ const content = await readFileBuffer(filePath);
378
+ hash = createHash('sha256').update(content).digest('hex');
379
+ }
380
+ return {
381
+ size: stats.size,
382
+ modTime: stats.mtime,
383
+ mode: stats.mode,
384
+ isDirectory: stats.isDirectory(),
385
+ isFile: stats.isFile(),
386
+ absolutePath,
387
+ hash,
388
+ };
389
+ }
390
+ catch (error) {
391
+ throw new FileOperationError('getMetadata', filePath, error);
392
+ }
393
+ }
394
+ /**
395
+ * Read file line by line
396
+ * @param filePath - Path to file
397
+ * @param callback - Callback for each line
398
+ *
399
+ * @example
400
+ * await readLinesSync('./data.txt', (line, index) => {
401
+ * console.log(`Line ${index}: ${line}`);
402
+ * });
403
+ */
404
+ export async function readLinesSync(filePath, callback) {
405
+ const content = await readFile(filePath);
406
+ const lines = content.split('\n');
407
+ lines.forEach((line, index) => {
408
+ if (line || index < lines.length - 1) {
409
+ callback(line, index);
410
+ }
411
+ });
412
+ }
413
+ /**
414
+ * Copy file with optional verification
415
+ * @param sourcePath - Source file path
416
+ * @param destPath - Destination path
417
+ * @param verify - Verify copy with hash comparison
418
+ *
419
+ * @example
420
+ * await copyFile('./original.txt', './backup.txt');
421
+ *
422
+ * @example
423
+ * await copyFile('./data.bin', './data.backup', true);
424
+ * // Verifies file integrity after copy
425
+ */
426
+ export async function copyFile(sourcePath, destPath, verify = false) {
427
+ try {
428
+ const sourceAbs = path.resolve(sourcePath);
429
+ const destAbs = path.resolve(destPath);
430
+ // Create destination directory if needed
431
+ const destDir = path.dirname(destAbs);
432
+ await fs.mkdir(destDir, { recursive: true });
433
+ await fs.copyFile(sourceAbs, destAbs);
434
+ if (verify) {
435
+ const sourceMeta = await getMetadata(sourcePath, true);
436
+ const destMeta = await getMetadata(destPath, true);
437
+ if (sourceMeta.hash !== destMeta.hash) {
438
+ throw new Error('File hash mismatch after copy');
439
+ }
440
+ }
441
+ }
442
+ catch (error) {
443
+ throw new FileOperationError('copyFile', sourcePath, error);
444
+ }
445
+ }
446
+ /**
447
+ * Batch process files
448
+ * @param pattern - Glob pattern or directory
449
+ * @param processor - Processor function
450
+ * @param options - List options
451
+ *
452
+ * @example
453
+ * await batchProcessFiles('./src', async (filePath) => {
454
+ * const content = await readFile(filePath);
455
+ * console.log(`Processing ${filePath}: ${content.length} bytes`);
456
+ * }, { extension: '.ts', recursive: true });
457
+ */
458
+ export async function batchProcessFiles(pattern, processor, options) {
459
+ const files = await listFiles(pattern, options);
460
+ let count = 0;
461
+ for (const file of files) {
462
+ try {
463
+ await processor(file);
464
+ count++;
465
+ }
466
+ catch (error) {
467
+ console.error(`Error processing ${file}:`, error);
468
+ }
469
+ }
470
+ return count;
471
+ }
472
+ /**
473
+ * Ensure directory exists
474
+ * @param dirPath - Directory path
475
+ *
476
+ * @example
477
+ * await ensureDir('./output/data');
478
+ */
479
+ export async function ensureDir(dirPath) {
480
+ try {
481
+ const absolutePath = path.resolve(dirPath);
482
+ await fs.mkdir(absolutePath, { recursive: true });
483
+ }
484
+ catch (error) {
485
+ throw new FileOperationError('ensureDir', dirPath, error);
486
+ }
487
+ }
488
+ /**
489
+ * Resolve glob patterns (simple implementation)
490
+ * @param pattern - File path or directory
491
+ * @returns Array of matching files
492
+ *
493
+ * @example
494
+ * const files = await glob('./src/**\/*.ts');
495
+ */
496
+ export async function glob(pattern) {
497
+ const dirPath = path.dirname(pattern);
498
+ const basePath = path.basename(pattern);
499
+ const isRecursive = pattern.includes('**');
500
+ if (!pattern.includes('*')) {
501
+ return await listFiles(pattern, { recursive: true });
502
+ }
503
+ return await listFiles(dirPath, { recursive: isRecursive, filesOnly: true });
504
+ }
505
+ //# sourceMappingURL=file-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-operations.js","sourceRoot":"","sources":["../../src/utils/file-operations.ts"],"names":[],"mappings":"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"}