nexusforge-cli 1.1.1 → 1.2.1
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/dist/components/App.d.ts.map +1 -1
- package/dist/components/App.js +183 -17
- package/dist/components/App.js.map +1 -1
- package/dist/index.js +462 -10
- package/dist/index.js.map +1 -1
- package/dist/modules/commandEngine.d.ts +70 -0
- package/dist/modules/commandEngine.d.ts.map +1 -0
- package/dist/modules/commandEngine.js +672 -0
- package/dist/modules/commandEngine.js.map +1 -0
- package/dist/modules/contextBuilder.d.ts +51 -0
- package/dist/modules/contextBuilder.d.ts.map +1 -0
- package/dist/modules/contextBuilder.js +725 -0
- package/dist/modules/contextBuilder.js.map +1 -0
- package/dist/modules/domainDetector.d.ts +64 -0
- package/dist/modules/domainDetector.d.ts.map +1 -0
- package/dist/modules/domainDetector.js +722 -0
- package/dist/modules/domainDetector.js.map +1 -0
- package/dist/modules/fileOperations.d.ts +99 -0
- package/dist/modules/fileOperations.d.ts.map +1 -0
- package/dist/modules/fileOperations.js +543 -0
- package/dist/modules/fileOperations.js.map +1 -0
- package/dist/modules/forgeEngine.d.ts +153 -0
- package/dist/modules/forgeEngine.d.ts.map +1 -0
- package/dist/modules/forgeEngine.js +652 -0
- package/dist/modules/forgeEngine.js.map +1 -0
- package/dist/modules/gitManager.d.ts +151 -0
- package/dist/modules/gitManager.d.ts.map +1 -0
- package/dist/modules/gitManager.js +539 -0
- package/dist/modules/gitManager.js.map +1 -0
- package/dist/modules/index.d.ts +25 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +25 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/prdProcessor.d.ts +125 -0
- package/dist/modules/prdProcessor.d.ts.map +1 -0
- package/dist/modules/prdProcessor.js +466 -0
- package/dist/modules/prdProcessor.js.map +1 -0
- package/dist/modules/projectScanner.d.ts +105 -0
- package/dist/modules/projectScanner.d.ts.map +1 -0
- package/dist/modules/projectScanner.js +859 -0
- package/dist/modules/projectScanner.js.map +1 -0
- package/dist/modules/safetyGuard.d.ts +83 -0
- package/dist/modules/safetyGuard.d.ts.map +1 -0
- package/dist/modules/safetyGuard.js +492 -0
- package/dist/modules/safetyGuard.js.map +1 -0
- package/dist/modules/templateManager.d.ts +78 -0
- package/dist/modules/templateManager.d.ts.map +1 -0
- package/dist/modules/templateManager.js +556 -0
- package/dist/modules/templateManager.js.map +1 -0
- package/dist/native/index.d.ts +125 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +164 -0
- package/dist/native/index.js.map +1 -0
- package/dist/services/executor.d.ts +24 -0
- package/dist/services/executor.d.ts.map +1 -1
- package/dist/services/executor.js +149 -6
- package/dist/services/executor.js.map +1 -1
- package/dist/services/fileManager.d.ts +134 -0
- package/dist/services/fileManager.d.ts.map +1 -0
- package/dist/services/fileManager.js +489 -0
- package/dist/services/fileManager.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NexusForge CLI File Manager
|
|
3
|
+
*
|
|
4
|
+
* Enterprise-grade file operations with safety checks, atomic writes, and backups.
|
|
5
|
+
* Ported from Python nexusforge.modules.fileops.operations
|
|
6
|
+
*/
|
|
7
|
+
export interface OperationLog {
|
|
8
|
+
timestamp: Date;
|
|
9
|
+
operation: string;
|
|
10
|
+
path: string;
|
|
11
|
+
details: Record<string, unknown>;
|
|
12
|
+
success: boolean;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface FileInfo {
|
|
16
|
+
path: string;
|
|
17
|
+
name: string;
|
|
18
|
+
size: number;
|
|
19
|
+
sizeHuman: string;
|
|
20
|
+
created: string;
|
|
21
|
+
modified: string;
|
|
22
|
+
isFile: boolean;
|
|
23
|
+
isDirectory: boolean;
|
|
24
|
+
isSymlink: boolean;
|
|
25
|
+
permissions: string;
|
|
26
|
+
hash?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface WriteOptions {
|
|
29
|
+
encoding?: BufferEncoding;
|
|
30
|
+
createDirs?: boolean;
|
|
31
|
+
atomic?: boolean;
|
|
32
|
+
backup?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface ReplaceResult {
|
|
35
|
+
replacements: number;
|
|
36
|
+
path: string;
|
|
37
|
+
}
|
|
38
|
+
export declare class FileOperations {
|
|
39
|
+
private safeMode;
|
|
40
|
+
private backupEnabled;
|
|
41
|
+
private backupDir;
|
|
42
|
+
private operationLog;
|
|
43
|
+
private maxFileSize;
|
|
44
|
+
private maxLogEntries;
|
|
45
|
+
constructor(safeMode?: boolean, backupEnabled?: boolean);
|
|
46
|
+
/**
|
|
47
|
+
* Read file with safety checks
|
|
48
|
+
*/
|
|
49
|
+
readFile(filePath: string, encoding?: BufferEncoding, maxSize?: number): Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* Write file atomically with backup
|
|
52
|
+
*/
|
|
53
|
+
writeFile(filePath: string, content: string, options?: WriteOptions): Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Append to file safely
|
|
56
|
+
*/
|
|
57
|
+
appendFile(filePath: string, content: string, encoding?: BufferEncoding, addNewline?: boolean): Promise<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Copy file with safety checks
|
|
60
|
+
*/
|
|
61
|
+
copyFile(src: string, dst: string, overwrite?: boolean): Promise<string>;
|
|
62
|
+
/**
|
|
63
|
+
* Move file
|
|
64
|
+
*/
|
|
65
|
+
moveFile(src: string, dst: string, overwrite?: boolean): Promise<string>;
|
|
66
|
+
/**
|
|
67
|
+
* Delete file with safety checks
|
|
68
|
+
*/
|
|
69
|
+
deleteFile(filePath: string): Promise<boolean>;
|
|
70
|
+
/**
|
|
71
|
+
* Create directory
|
|
72
|
+
*/
|
|
73
|
+
createDirectory(dirPath: string): Promise<string>;
|
|
74
|
+
/**
|
|
75
|
+
* Replace text in file atomically
|
|
76
|
+
*/
|
|
77
|
+
replaceInFile(filePath: string, oldText: string, newText: string, options?: {
|
|
78
|
+
count?: number;
|
|
79
|
+
regex?: boolean;
|
|
80
|
+
}): Promise<ReplaceResult>;
|
|
81
|
+
/**
|
|
82
|
+
* Insert text at specific line
|
|
83
|
+
*/
|
|
84
|
+
insertAtLine(filePath: string, lineNumber: number, text: string): Promise<string>;
|
|
85
|
+
/**
|
|
86
|
+
* Delete lines from file
|
|
87
|
+
*/
|
|
88
|
+
deleteLines(filePath: string, startLine: number, endLine?: number): Promise<string>;
|
|
89
|
+
/**
|
|
90
|
+
* Get detailed file information
|
|
91
|
+
*/
|
|
92
|
+
getFileInfo(filePath: string): Promise<FileInfo>;
|
|
93
|
+
/**
|
|
94
|
+
* Check if path exists
|
|
95
|
+
*/
|
|
96
|
+
exists(filePath: string): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Check if path is file
|
|
99
|
+
*/
|
|
100
|
+
isFile(filePath: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Check if path is directory
|
|
103
|
+
*/
|
|
104
|
+
isDirectory(filePath: string): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Get operation log
|
|
107
|
+
*/
|
|
108
|
+
getOperationLog(limit?: number): OperationLog[];
|
|
109
|
+
/**
|
|
110
|
+
* Clear operation log
|
|
111
|
+
*/
|
|
112
|
+
clearOperationLog(): void;
|
|
113
|
+
private createBackup;
|
|
114
|
+
private copyDirectory;
|
|
115
|
+
private cleanupOldBackups;
|
|
116
|
+
private logOperation;
|
|
117
|
+
private calculateHash;
|
|
118
|
+
private formatSize;
|
|
119
|
+
private escapeRegex;
|
|
120
|
+
}
|
|
121
|
+
export declare const fileOps: FileOperations;
|
|
122
|
+
export declare const read: (path: string) => Promise<string>;
|
|
123
|
+
export declare const write: (path: string, content: string) => Promise<string>;
|
|
124
|
+
export declare const append: (path: string, content: string) => Promise<string>;
|
|
125
|
+
export declare const copy: (src: string, dst: string) => Promise<string>;
|
|
126
|
+
export declare const move: (src: string, dst: string) => Promise<string>;
|
|
127
|
+
export declare const remove: (path: string) => Promise<boolean>;
|
|
128
|
+
export declare const mkdir: (path: string) => Promise<string>;
|
|
129
|
+
export declare const exists: (path: string) => boolean;
|
|
130
|
+
export declare const isFile: (path: string) => boolean;
|
|
131
|
+
export declare const isDir: (path: string) => boolean;
|
|
132
|
+
export declare const info: (path: string) => Promise<FileInfo>;
|
|
133
|
+
export declare const replace: (path: string, old: string, newText: string) => Promise<ReplaceResult>;
|
|
134
|
+
//# sourceMappingURL=fileManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileManager.d.ts","sourceRoot":"","sources":["../../src/services/fileManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NexusForge CLI File Manager
|
|
3
|
+
*
|
|
4
|
+
* Enterprise-grade file operations with safety checks, atomic writes, and backups.
|
|
5
|
+
* Ported from Python nexusforge.modules.fileops.operations
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as fsPromises from 'fs/promises';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import * as os from 'os';
|
|
11
|
+
import * as crypto from 'crypto';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// FILE OPERATIONS CLASS
|
|
14
|
+
// ============================================================================
|
|
15
|
+
export class FileOperations {
|
|
16
|
+
safeMode;
|
|
17
|
+
backupEnabled;
|
|
18
|
+
backupDir;
|
|
19
|
+
operationLog = [];
|
|
20
|
+
maxFileSize = 100 * 1024 * 1024; // 100MB
|
|
21
|
+
maxLogEntries = 1000;
|
|
22
|
+
constructor(safeMode = true, backupEnabled = true) {
|
|
23
|
+
this.safeMode = safeMode;
|
|
24
|
+
this.backupEnabled = backupEnabled;
|
|
25
|
+
this.backupDir = path.join(os.homedir(), '.nexusforge', 'file_backups');
|
|
26
|
+
// Create backup directory
|
|
27
|
+
if (!fs.existsSync(this.backupDir)) {
|
|
28
|
+
fs.mkdirSync(this.backupDir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// ==========================================================================
|
|
32
|
+
// CORE READ/WRITE OPERATIONS
|
|
33
|
+
// ==========================================================================
|
|
34
|
+
/**
|
|
35
|
+
* Read file with safety checks
|
|
36
|
+
*/
|
|
37
|
+
async readFile(filePath, encoding = 'utf-8', maxSize) {
|
|
38
|
+
const resolvedPath = path.resolve(filePath);
|
|
39
|
+
const limit = maxSize || this.maxFileSize;
|
|
40
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
41
|
+
throw new Error(`File not found: ${resolvedPath}`);
|
|
42
|
+
}
|
|
43
|
+
const stats = fs.statSync(resolvedPath);
|
|
44
|
+
if (stats.size > limit) {
|
|
45
|
+
throw new Error(`File too large: ${stats.size} bytes (max: ${limit})`);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const content = await fsPromises.readFile(resolvedPath, encoding);
|
|
49
|
+
this.logOperation('read', resolvedPath, true, { size: stats.size });
|
|
50
|
+
return content;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
54
|
+
this.logOperation('read', resolvedPath, false, {}, errorMsg);
|
|
55
|
+
throw new Error(`Failed to read ${resolvedPath}: ${errorMsg}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Write file atomically with backup
|
|
60
|
+
*/
|
|
61
|
+
async writeFile(filePath, content, options = {}) {
|
|
62
|
+
const { encoding = 'utf-8', createDirs = true, atomic = true, backup = this.backupEnabled, } = options;
|
|
63
|
+
const resolvedPath = path.resolve(filePath);
|
|
64
|
+
const dir = path.dirname(resolvedPath);
|
|
65
|
+
// Create parent directories if needed
|
|
66
|
+
if (createDirs && !fs.existsSync(dir)) {
|
|
67
|
+
await fsPromises.mkdir(dir, { recursive: true });
|
|
68
|
+
}
|
|
69
|
+
// Backup existing file
|
|
70
|
+
if (backup && fs.existsSync(resolvedPath)) {
|
|
71
|
+
await this.createBackup(resolvedPath);
|
|
72
|
+
}
|
|
73
|
+
if (atomic) {
|
|
74
|
+
// Write atomically using temporary file
|
|
75
|
+
const tempPath = path.join(dir, `.${path.basename(resolvedPath)}.tmp.${process.pid}`);
|
|
76
|
+
try {
|
|
77
|
+
await fsPromises.writeFile(tempPath, content, encoding);
|
|
78
|
+
await fsPromises.rename(tempPath, resolvedPath);
|
|
79
|
+
this.logOperation('write', resolvedPath, true, { size: content.length, atomic: true });
|
|
80
|
+
return resolvedPath;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
// Clean up temp file
|
|
84
|
+
if (fs.existsSync(tempPath)) {
|
|
85
|
+
await fsPromises.unlink(tempPath);
|
|
86
|
+
}
|
|
87
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
88
|
+
this.logOperation('write', resolvedPath, false, {}, errorMsg);
|
|
89
|
+
throw new Error(`Failed to write ${resolvedPath}: ${errorMsg}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
try {
|
|
94
|
+
await fsPromises.writeFile(resolvedPath, content, encoding);
|
|
95
|
+
this.logOperation('write', resolvedPath, true, { size: content.length, atomic: false });
|
|
96
|
+
return resolvedPath;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
100
|
+
this.logOperation('write', resolvedPath, false, {}, errorMsg);
|
|
101
|
+
throw new Error(`Failed to write ${resolvedPath}: ${errorMsg}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Append to file safely
|
|
107
|
+
*/
|
|
108
|
+
async appendFile(filePath, content, encoding = 'utf-8', addNewline = true) {
|
|
109
|
+
const resolvedPath = path.resolve(filePath);
|
|
110
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
111
|
+
return this.writeFile(resolvedPath, content, { encoding });
|
|
112
|
+
}
|
|
113
|
+
// Backup before appending
|
|
114
|
+
if (this.backupEnabled) {
|
|
115
|
+
await this.createBackup(resolvedPath);
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const stats = fs.statSync(resolvedPath);
|
|
119
|
+
const prefix = addNewline && stats.size > 0 ? '\n' : '';
|
|
120
|
+
await fsPromises.appendFile(resolvedPath, prefix + content, encoding);
|
|
121
|
+
this.logOperation('append', resolvedPath, true, { size: content.length });
|
|
122
|
+
return resolvedPath;
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
126
|
+
this.logOperation('append', resolvedPath, false, {}, errorMsg);
|
|
127
|
+
throw new Error(`Failed to append to ${resolvedPath}: ${errorMsg}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// ==========================================================================
|
|
131
|
+
// FILE MANIPULATION OPERATIONS
|
|
132
|
+
// ==========================================================================
|
|
133
|
+
/**
|
|
134
|
+
* Copy file with safety checks
|
|
135
|
+
*/
|
|
136
|
+
async copyFile(src, dst, overwrite = false) {
|
|
137
|
+
const srcPath = path.resolve(src);
|
|
138
|
+
const dstPath = path.resolve(dst);
|
|
139
|
+
if (!fs.existsSync(srcPath)) {
|
|
140
|
+
throw new Error(`Source file not found: ${srcPath}`);
|
|
141
|
+
}
|
|
142
|
+
if (fs.existsSync(dstPath) && !overwrite) {
|
|
143
|
+
throw new Error(`Destination already exists: ${dstPath}. Use overwrite=true to replace.`);
|
|
144
|
+
}
|
|
145
|
+
// Create parent directories
|
|
146
|
+
const dstDir = path.dirname(dstPath);
|
|
147
|
+
if (!fs.existsSync(dstDir)) {
|
|
148
|
+
await fsPromises.mkdir(dstDir, { recursive: true });
|
|
149
|
+
}
|
|
150
|
+
// Backup destination if it exists
|
|
151
|
+
if (this.backupEnabled && fs.existsSync(dstPath)) {
|
|
152
|
+
await this.createBackup(dstPath);
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
await fsPromises.copyFile(srcPath, dstPath);
|
|
156
|
+
this.logOperation('copy', srcPath, true, { destination: dstPath });
|
|
157
|
+
return dstPath;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
161
|
+
this.logOperation('copy', srcPath, false, {}, errorMsg);
|
|
162
|
+
throw new Error(`Failed to copy ${srcPath} to ${dstPath}: ${errorMsg}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Move file
|
|
167
|
+
*/
|
|
168
|
+
async moveFile(src, dst, overwrite = false) {
|
|
169
|
+
const srcPath = path.resolve(src);
|
|
170
|
+
const dstPath = path.resolve(dst);
|
|
171
|
+
if (!fs.existsSync(srcPath)) {
|
|
172
|
+
throw new Error(`Source file not found: ${srcPath}`);
|
|
173
|
+
}
|
|
174
|
+
if (fs.existsSync(dstPath) && !overwrite) {
|
|
175
|
+
throw new Error(`Destination already exists: ${dstPath}. Use overwrite=true to replace.`);
|
|
176
|
+
}
|
|
177
|
+
// Create parent directories
|
|
178
|
+
const dstDir = path.dirname(dstPath);
|
|
179
|
+
if (!fs.existsSync(dstDir)) {
|
|
180
|
+
await fsPromises.mkdir(dstDir, { recursive: true });
|
|
181
|
+
}
|
|
182
|
+
// Backup destination if it exists
|
|
183
|
+
if (this.backupEnabled && fs.existsSync(dstPath)) {
|
|
184
|
+
await this.createBackup(dstPath);
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
await fsPromises.rename(srcPath, dstPath);
|
|
188
|
+
this.logOperation('move', srcPath, true, { destination: dstPath });
|
|
189
|
+
return dstPath;
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
193
|
+
this.logOperation('move', srcPath, false, {}, errorMsg);
|
|
194
|
+
throw new Error(`Failed to move ${srcPath} to ${dstPath}: ${errorMsg}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Delete file with safety checks
|
|
199
|
+
*/
|
|
200
|
+
async deleteFile(filePath) {
|
|
201
|
+
const resolvedPath = path.resolve(filePath);
|
|
202
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
// Backup before deletion
|
|
206
|
+
if (this.backupEnabled) {
|
|
207
|
+
await this.createBackup(resolvedPath);
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const stats = fs.statSync(resolvedPath);
|
|
211
|
+
if (stats.isDirectory()) {
|
|
212
|
+
await fsPromises.rm(resolvedPath, { recursive: true });
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
await fsPromises.unlink(resolvedPath);
|
|
216
|
+
}
|
|
217
|
+
this.logOperation('delete', resolvedPath, true);
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
222
|
+
this.logOperation('delete', resolvedPath, false, {}, errorMsg);
|
|
223
|
+
throw new Error(`Failed to delete ${resolvedPath}: ${errorMsg}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Create directory
|
|
228
|
+
*/
|
|
229
|
+
async createDirectory(dirPath) {
|
|
230
|
+
const resolvedPath = path.resolve(dirPath);
|
|
231
|
+
try {
|
|
232
|
+
await fsPromises.mkdir(resolvedPath, { recursive: true });
|
|
233
|
+
this.logOperation('mkdir', resolvedPath, true);
|
|
234
|
+
return resolvedPath;
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
238
|
+
this.logOperation('mkdir', resolvedPath, false, {}, errorMsg);
|
|
239
|
+
throw new Error(`Failed to create directory ${resolvedPath}: ${errorMsg}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// ==========================================================================
|
|
243
|
+
// ADVANCED OPERATIONS
|
|
244
|
+
// ==========================================================================
|
|
245
|
+
/**
|
|
246
|
+
* Replace text in file atomically
|
|
247
|
+
*/
|
|
248
|
+
async replaceInFile(filePath, oldText, newText, options = {}) {
|
|
249
|
+
const { count = -1, regex = false } = options;
|
|
250
|
+
const resolvedPath = path.resolve(filePath);
|
|
251
|
+
const content = await this.readFile(resolvedPath);
|
|
252
|
+
let newContent;
|
|
253
|
+
let replacements;
|
|
254
|
+
if (regex) {
|
|
255
|
+
const pattern = new RegExp(oldText, 'g');
|
|
256
|
+
let matches = 0;
|
|
257
|
+
newContent = content.replace(pattern, (match) => {
|
|
258
|
+
if (count >= 0 && matches >= count) {
|
|
259
|
+
return match;
|
|
260
|
+
}
|
|
261
|
+
matches++;
|
|
262
|
+
return newText;
|
|
263
|
+
});
|
|
264
|
+
replacements = matches;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
if (count < 0) {
|
|
268
|
+
// Replace all
|
|
269
|
+
replacements = content.split(oldText).length - 1;
|
|
270
|
+
newContent = content.split(oldText).join(newText);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
// Replace limited count
|
|
274
|
+
let remaining = count;
|
|
275
|
+
replacements = 0;
|
|
276
|
+
newContent = content.replace(new RegExp(this.escapeRegex(oldText), 'g'), (match) => {
|
|
277
|
+
if (remaining <= 0)
|
|
278
|
+
return match;
|
|
279
|
+
remaining--;
|
|
280
|
+
replacements++;
|
|
281
|
+
return newText;
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (newContent !== content) {
|
|
286
|
+
await this.writeFile(resolvedPath, newContent);
|
|
287
|
+
}
|
|
288
|
+
return { replacements, path: resolvedPath };
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Insert text at specific line
|
|
292
|
+
*/
|
|
293
|
+
async insertAtLine(filePath, lineNumber, text) {
|
|
294
|
+
const content = await this.readFile(filePath);
|
|
295
|
+
const lines = content.split('\n');
|
|
296
|
+
// Insert at the specified line (1-indexed)
|
|
297
|
+
const index = Math.max(0, Math.min(lineNumber - 1, lines.length));
|
|
298
|
+
lines.splice(index, 0, text);
|
|
299
|
+
const newContent = lines.join('\n');
|
|
300
|
+
return this.writeFile(filePath, newContent);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Delete lines from file
|
|
304
|
+
*/
|
|
305
|
+
async deleteLines(filePath, startLine, endLine) {
|
|
306
|
+
const content = await this.readFile(filePath);
|
|
307
|
+
const lines = content.split('\n');
|
|
308
|
+
const start = Math.max(0, startLine - 1);
|
|
309
|
+
const end = endLine ? Math.min(endLine, lines.length) : start + 1;
|
|
310
|
+
lines.splice(start, end - start);
|
|
311
|
+
const newContent = lines.join('\n');
|
|
312
|
+
return this.writeFile(filePath, newContent);
|
|
313
|
+
}
|
|
314
|
+
// ==========================================================================
|
|
315
|
+
// UTILITY METHODS
|
|
316
|
+
// ==========================================================================
|
|
317
|
+
/**
|
|
318
|
+
* Get detailed file information
|
|
319
|
+
*/
|
|
320
|
+
async getFileInfo(filePath) {
|
|
321
|
+
const resolvedPath = path.resolve(filePath);
|
|
322
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
323
|
+
throw new Error(`File not found: ${resolvedPath}`);
|
|
324
|
+
}
|
|
325
|
+
const stats = fs.statSync(resolvedPath);
|
|
326
|
+
const lstat = fs.lstatSync(resolvedPath);
|
|
327
|
+
const info = {
|
|
328
|
+
path: resolvedPath,
|
|
329
|
+
name: path.basename(resolvedPath),
|
|
330
|
+
size: stats.size,
|
|
331
|
+
sizeHuman: this.formatSize(stats.size),
|
|
332
|
+
created: stats.birthtime.toISOString(),
|
|
333
|
+
modified: stats.mtime.toISOString(),
|
|
334
|
+
isFile: stats.isFile(),
|
|
335
|
+
isDirectory: stats.isDirectory(),
|
|
336
|
+
isSymlink: lstat.isSymbolicLink(),
|
|
337
|
+
permissions: (stats.mode & 0o777).toString(8),
|
|
338
|
+
};
|
|
339
|
+
// Add hash for files under 100MB
|
|
340
|
+
if (stats.isFile() && stats.size < 100 * 1024 * 1024) {
|
|
341
|
+
info.hash = await this.calculateHash(resolvedPath);
|
|
342
|
+
}
|
|
343
|
+
return info;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Check if path exists
|
|
347
|
+
*/
|
|
348
|
+
exists(filePath) {
|
|
349
|
+
return fs.existsSync(path.resolve(filePath));
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Check if path is file
|
|
353
|
+
*/
|
|
354
|
+
isFile(filePath) {
|
|
355
|
+
const resolvedPath = path.resolve(filePath);
|
|
356
|
+
return fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isFile();
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Check if path is directory
|
|
360
|
+
*/
|
|
361
|
+
isDirectory(filePath) {
|
|
362
|
+
const resolvedPath = path.resolve(filePath);
|
|
363
|
+
return fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isDirectory();
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get operation log
|
|
367
|
+
*/
|
|
368
|
+
getOperationLog(limit = 100) {
|
|
369
|
+
return this.operationLog.slice(-limit);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Clear operation log
|
|
373
|
+
*/
|
|
374
|
+
clearOperationLog() {
|
|
375
|
+
this.operationLog = [];
|
|
376
|
+
}
|
|
377
|
+
// ==========================================================================
|
|
378
|
+
// INTERNAL HELPER METHODS
|
|
379
|
+
// ==========================================================================
|
|
380
|
+
async createBackup(filePath) {
|
|
381
|
+
if (!fs.existsSync(filePath))
|
|
382
|
+
return;
|
|
383
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
384
|
+
const backupName = `${path.basename(filePath)}.${timestamp}.backup`;
|
|
385
|
+
const backupPath = path.join(this.backupDir, backupName);
|
|
386
|
+
try {
|
|
387
|
+
const stats = fs.statSync(filePath);
|
|
388
|
+
if (stats.isDirectory()) {
|
|
389
|
+
await this.copyDirectory(filePath, backupPath);
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
await fsPromises.copyFile(filePath, backupPath);
|
|
393
|
+
}
|
|
394
|
+
// Keep only last 10 backups per file
|
|
395
|
+
await this.cleanupOldBackups(path.basename(filePath));
|
|
396
|
+
}
|
|
397
|
+
catch (error) {
|
|
398
|
+
console.warn(`Failed to create backup: ${error}`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
async copyDirectory(src, dst) {
|
|
402
|
+
await fsPromises.mkdir(dst, { recursive: true });
|
|
403
|
+
const entries = await fsPromises.readdir(src, { withFileTypes: true });
|
|
404
|
+
for (const entry of entries) {
|
|
405
|
+
const srcPath = path.join(src, entry.name);
|
|
406
|
+
const dstPath = path.join(dst, entry.name);
|
|
407
|
+
if (entry.isDirectory()) {
|
|
408
|
+
await this.copyDirectory(srcPath, dstPath);
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
await fsPromises.copyFile(srcPath, dstPath);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
async cleanupOldBackups(filename, keep = 10) {
|
|
416
|
+
try {
|
|
417
|
+
const entries = await fsPromises.readdir(this.backupDir);
|
|
418
|
+
const backups = entries
|
|
419
|
+
.filter(f => f.startsWith(filename) && f.endsWith('.backup'))
|
|
420
|
+
.map(f => ({
|
|
421
|
+
name: f,
|
|
422
|
+
path: path.join(this.backupDir, f),
|
|
423
|
+
mtime: fs.statSync(path.join(this.backupDir, f)).mtime,
|
|
424
|
+
}))
|
|
425
|
+
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
426
|
+
// Remove old backups
|
|
427
|
+
for (const backup of backups.slice(keep)) {
|
|
428
|
+
await fsPromises.unlink(backup.path);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
// Ignore cleanup errors
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
logOperation(operation, filePath, success, details = {}, error) {
|
|
436
|
+
const entry = {
|
|
437
|
+
timestamp: new Date(),
|
|
438
|
+
operation,
|
|
439
|
+
path: filePath,
|
|
440
|
+
details,
|
|
441
|
+
success,
|
|
442
|
+
error,
|
|
443
|
+
};
|
|
444
|
+
this.operationLog.push(entry);
|
|
445
|
+
// Limit log size
|
|
446
|
+
if (this.operationLog.length > this.maxLogEntries) {
|
|
447
|
+
this.operationLog = this.operationLog.slice(-this.maxLogEntries);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
async calculateHash(filePath, algorithm = 'sha256') {
|
|
451
|
+
try {
|
|
452
|
+
const content = await fsPromises.readFile(filePath);
|
|
453
|
+
return crypto.createHash(algorithm).update(content).digest('hex');
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
return '';
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
formatSize(bytes) {
|
|
460
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
461
|
+
let size = bytes;
|
|
462
|
+
let unitIndex = 0;
|
|
463
|
+
while (size >= 1024 && unitIndex < units.length - 1) {
|
|
464
|
+
size /= 1024;
|
|
465
|
+
unitIndex++;
|
|
466
|
+
}
|
|
467
|
+
return `${size.toFixed(2)} ${units[unitIndex]}`;
|
|
468
|
+
}
|
|
469
|
+
escapeRegex(str) {
|
|
470
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
// ============================================================================
|
|
474
|
+
// GLOBAL INSTANCE AND CONVENIENCE FUNCTIONS
|
|
475
|
+
// ============================================================================
|
|
476
|
+
export const fileOps = new FileOperations();
|
|
477
|
+
export const read = (path) => fileOps.readFile(path);
|
|
478
|
+
export const write = (path, content) => fileOps.writeFile(path, content);
|
|
479
|
+
export const append = (path, content) => fileOps.appendFile(path, content);
|
|
480
|
+
export const copy = (src, dst) => fileOps.copyFile(src, dst);
|
|
481
|
+
export const move = (src, dst) => fileOps.moveFile(src, dst);
|
|
482
|
+
export const remove = (path) => fileOps.deleteFile(path);
|
|
483
|
+
export const mkdir = (path) => fileOps.createDirectory(path);
|
|
484
|
+
export const exists = (path) => fileOps.exists(path);
|
|
485
|
+
export const isFile = (path) => fileOps.isFile(path);
|
|
486
|
+
export const isDir = (path) => fileOps.isDirectory(path);
|
|
487
|
+
export const info = (path) => fileOps.getFileInfo(path);
|
|
488
|
+
export const replace = (path, old, newText) => fileOps.replaceInFile(path, old, newText);
|
|
489
|
+
//# sourceMappingURL=fileManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileManager.js","sourceRoot":"","sources":["../../src/services/fileManager.ts"],"names":[],"mappings":"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"}
|