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.
- package/CHANGELOG.md +65 -0
- package/README.md +2 -0
- package/dist/cli/args.d.ts +117 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +221 -52
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts +58 -2
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +130 -12
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts +70 -2
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +240 -15
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/list-models.d.ts +63 -3
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +202 -27
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/login-handler.d.ts +82 -8
- package/dist/cli/login-handler.d.ts.map +1 -1
- package/dist/cli/login-handler.js +410 -77
- package/dist/cli/login-handler.js.map +1 -1
- package/dist/cli/session-picker.d.ts +74 -2
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +236 -12
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/core/agent-session.d.ts +214 -9
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +214 -9
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts +302 -12
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +302 -12
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/diagnostics.d.ts +191 -0
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js +142 -0
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/event-bus.d.ts +146 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +93 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts +4 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js +4 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts +128 -0
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +128 -0
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts +4 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +4 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/keybindings.d.ts +142 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +142 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +98 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +98 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +99 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +99 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/session-manager.d.ts +127 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +125 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/subagents.js.map +1 -1
- package/dist/core/tools/bash.d.ts +391 -11
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +269 -2
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +284 -6
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +238 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +169 -5
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +136 -0
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +285 -5
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +247 -0
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts +6 -0
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +6 -0
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +308 -7
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +231 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/webfetch.d.ts +118 -3
- package/dist/core/tools/webfetch.d.ts.map +1 -1
- package/dist/core/tools/webfetch.js +118 -3
- package/dist/core/tools/webfetch.js.map +1 -1
- package/dist/core/tools/websearch.d.ts +130 -3
- package/dist/core/tools/websearch.d.ts.map +1 -1
- package/dist/core/tools/websearch.js +130 -3
- package/dist/core/tools/websearch.js.map +1 -1
- package/dist/core/tools/write.d.ts +251 -5
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +210 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +164 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +164 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +297 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +297 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +251 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +186 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +186 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1567 -13
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1567 -13
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +422 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +422 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +538 -5
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +538 -5
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +921 -8
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +921 -8
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +802 -9
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +802 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +356 -3
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +356 -3
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/shared.d.ts +386 -0
- package/dist/modes/shared.d.ts.map +1 -0
- package/dist/modes/shared.js +543 -0
- package/dist/modes/shared.js.map +1 -0
- package/dist/utils/array.d.ts +389 -0
- package/dist/utils/array.d.ts.map +1 -0
- package/dist/utils/array.js +585 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/color-formatter.d.ts +318 -0
- package/dist/utils/color-formatter.d.ts.map +1 -0
- package/dist/utils/color-formatter.js +442 -0
- package/dist/utils/color-formatter.js.map +1 -0
- package/dist/utils/data-transformer.d.ts +326 -0
- package/dist/utils/data-transformer.d.ts.map +1 -0
- package/dist/utils/data-transformer.js +512 -0
- package/dist/utils/data-transformer.js.map +1 -0
- package/dist/utils/date-formatter.d.ts +281 -0
- package/dist/utils/date-formatter.d.ts.map +1 -0
- package/dist/utils/date-formatter.js +503 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/error-handler.d.ts +541 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +726 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/file-operations.d.ts +297 -0
- package/dist/utils/file-operations.d.ts.map +1 -0
- package/dist/utils/file-operations.js +505 -0
- package/dist/utils/file-operations.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +268 -6
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +500 -21
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/json-formatter.d.ts +259 -0
- package/dist/utils/json-formatter.d.ts.map +1 -0
- package/dist/utils/json-formatter.js +517 -0
- package/dist/utils/json-formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +176 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +346 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown-formatter.d.ts +211 -0
- package/dist/utils/markdown-formatter.d.ts.map +1 -0
- package/dist/utils/markdown-formatter.js +482 -0
- package/dist/utils/markdown-formatter.js.map +1 -0
- package/dist/utils/path-validator.d.ts +603 -0
- package/dist/utils/path-validator.d.ts.map +1 -0
- package/dist/utils/path-validator.js +870 -0
- package/dist/utils/path-validator.js.map +1 -0
- package/dist/utils/string-formatter.d.ts +609 -0
- package/dist/utils/string-formatter.d.ts.map +1 -0
- package/dist/utils/string-formatter.js +806 -0
- package/dist/utils/string-formatter.js.map +1 -0
- package/dist/utils/type-guards.d.ts +629 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +662 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/docs/COMPLETE-GUIDE.md +300 -0
- package/docs/MODES-ARCHITECTURE.md +565 -0
- package/docs/PRINT-MODE-GUIDE.md +456 -0
- package/docs/RPC-GUIDE.md +705 -0
- package/docs/UTILS-IMPLEMENTATION-SUMMARY.md +647 -0
- package/docs/UTILS-MODULE-OVERVIEW.md +1480 -0
- package/docs/UTILS-QA-CHECKLIST.md +1061 -0
- package/docs/UTILS-USAGE-GUIDE.md +1419 -0
- 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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"}
|