agentshield 0.0.2-beta.0 โ 0.0.2-beta.2
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/backup.d.ts +55 -0
- package/dist/backup.js +216 -0
- package/dist/backup.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +236 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -652
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +102 -0
- package/dist/utils.js.map +1 -0
- package/dist/watcher.d.ts +14 -0
- package/dist/watcher.js +62 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +12 -13
package/dist/backup.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ShieldConfig } from "./config";
|
|
2
|
+
export interface BackupEntry {
|
|
3
|
+
originalPath: string;
|
|
4
|
+
backupPath: string;
|
|
5
|
+
timestamp: number;
|
|
6
|
+
size: number;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
}
|
|
9
|
+
export interface BackupIndex {
|
|
10
|
+
entries: BackupEntry[];
|
|
11
|
+
sessions: {
|
|
12
|
+
[sessionId: string]: {
|
|
13
|
+
startTime: number;
|
|
14
|
+
endTime?: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare class BackupManager {
|
|
19
|
+
private config;
|
|
20
|
+
private snapshotsDir;
|
|
21
|
+
private indexPath;
|
|
22
|
+
private index;
|
|
23
|
+
private currentSessionId;
|
|
24
|
+
private protectedInSession;
|
|
25
|
+
constructor(config: ShieldConfig);
|
|
26
|
+
private ensureVaultExists;
|
|
27
|
+
private loadIndex;
|
|
28
|
+
private saveIndex;
|
|
29
|
+
shouldExclude(filePath: string): boolean;
|
|
30
|
+
backupFile(relativePath: string, forceFullCopy?: boolean): BackupEntry | null;
|
|
31
|
+
snapshotWorkspace(): {
|
|
32
|
+
total: number;
|
|
33
|
+
backed: number;
|
|
34
|
+
skipped: number;
|
|
35
|
+
};
|
|
36
|
+
resetSession(): void;
|
|
37
|
+
getBackupsForFile(relativePath: string): BackupEntry[];
|
|
38
|
+
getAllBackups(): BackupEntry[];
|
|
39
|
+
restoreFile(entry: BackupEntry): boolean;
|
|
40
|
+
restoreLatest(relativePath: string): boolean;
|
|
41
|
+
restoreSession(sessionId: string): {
|
|
42
|
+
restored: number;
|
|
43
|
+
failed: number;
|
|
44
|
+
};
|
|
45
|
+
cleanOldBackups(maxAgeDays: number): {
|
|
46
|
+
removed: number;
|
|
47
|
+
freedBytes: number;
|
|
48
|
+
};
|
|
49
|
+
getStats(): {
|
|
50
|
+
totalBackups: number;
|
|
51
|
+
totalSize: number;
|
|
52
|
+
uniqueFiles: number;
|
|
53
|
+
sessions: number;
|
|
54
|
+
};
|
|
55
|
+
}
|
package/dist/backup.js
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, linkSync, copyFileSync, statSync, readFileSync, writeFileSync, unlinkSync } from "fs";
|
|
2
|
+
import { join, dirname } from "path";
|
|
3
|
+
import { getSnapshotsDir, getIndexPath } from "./config";
|
|
4
|
+
import { matchesPattern, getAllFiles, removeEmptyDirs } from "./utils";
|
|
5
|
+
export class BackupManager {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.protectedInSession = new Set();
|
|
8
|
+
this.config = config;
|
|
9
|
+
this.snapshotsDir = getSnapshotsDir(config);
|
|
10
|
+
this.indexPath = getIndexPath(config);
|
|
11
|
+
this.currentSessionId = `session_${Date.now()}`;
|
|
12
|
+
this.ensureVaultExists();
|
|
13
|
+
this.index = this.loadIndex();
|
|
14
|
+
}
|
|
15
|
+
ensureVaultExists() {
|
|
16
|
+
if (!existsSync(this.config.vaultDir)) {
|
|
17
|
+
mkdirSync(this.config.vaultDir, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
if (!existsSync(this.snapshotsDir)) {
|
|
20
|
+
mkdirSync(this.snapshotsDir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
loadIndex() {
|
|
24
|
+
if (existsSync(this.indexPath)) {
|
|
25
|
+
try {
|
|
26
|
+
const data = readFileSync(this.indexPath, "utf-8");
|
|
27
|
+
return JSON.parse(data);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return { entries: [], sessions: {} };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { entries: [], sessions: {} };
|
|
34
|
+
}
|
|
35
|
+
saveIndex() {
|
|
36
|
+
writeFileSync(this.indexPath, JSON.stringify(this.index, null, 2));
|
|
37
|
+
}
|
|
38
|
+
shouldExclude(filePath) {
|
|
39
|
+
return matchesPattern(filePath, this.config.excludePatterns);
|
|
40
|
+
}
|
|
41
|
+
backupFile(relativePath, forceFullCopy = false) {
|
|
42
|
+
const fullPath = join(this.config.workspace, relativePath);
|
|
43
|
+
if (this.shouldExclude(relativePath)) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
if (this.protectedInSession.has(fullPath)) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
if (!existsSync(fullPath)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const stats = statSync(fullPath);
|
|
54
|
+
if (!stats.isFile()) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const timestamp = Date.now();
|
|
58
|
+
const safeFilename = relativePath.replace(/[/\\]/g, "__");
|
|
59
|
+
const backupFilename = `${timestamp}_${safeFilename}`;
|
|
60
|
+
const backupPath = join(this.snapshotsDir, backupFilename);
|
|
61
|
+
mkdirSync(dirname(backupPath), { recursive: true });
|
|
62
|
+
if (forceFullCopy) {
|
|
63
|
+
copyFileSync(fullPath, backupPath);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
try {
|
|
67
|
+
linkSync(fullPath, backupPath);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
copyFileSync(fullPath, backupPath);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const entry = {
|
|
74
|
+
originalPath: relativePath,
|
|
75
|
+
backupPath: backupFilename,
|
|
76
|
+
timestamp,
|
|
77
|
+
size: stats.size,
|
|
78
|
+
sessionId: this.currentSessionId,
|
|
79
|
+
};
|
|
80
|
+
this.index.entries.push(entry);
|
|
81
|
+
this.protectedInSession.add(fullPath);
|
|
82
|
+
this.saveIndex();
|
|
83
|
+
return entry;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.error(`Failed to backup ${relativePath}:`, err);
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
snapshotWorkspace() {
|
|
91
|
+
const files = getAllFiles(this.config.workspace);
|
|
92
|
+
let backed = 0;
|
|
93
|
+
let skipped = 0;
|
|
94
|
+
for (const file of files) {
|
|
95
|
+
if (this.shouldExclude(file)) {
|
|
96
|
+
skipped++;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const entry = this.backupFile(file, true);
|
|
100
|
+
if (entry) {
|
|
101
|
+
backed++;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
skipped++;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { total: files.length, backed, skipped };
|
|
108
|
+
}
|
|
109
|
+
resetSession() {
|
|
110
|
+
if (this.index.sessions[this.currentSessionId]) {
|
|
111
|
+
this.index.sessions[this.currentSessionId].endTime = Date.now();
|
|
112
|
+
}
|
|
113
|
+
this.currentSessionId = `session_${Date.now()}`;
|
|
114
|
+
this.index.sessions[this.currentSessionId] = { startTime: Date.now() };
|
|
115
|
+
this.protectedInSession.clear();
|
|
116
|
+
this.saveIndex();
|
|
117
|
+
}
|
|
118
|
+
getBackupsForFile(relativePath) {
|
|
119
|
+
return this.index.entries
|
|
120
|
+
.filter(e => e.originalPath === relativePath)
|
|
121
|
+
.sort((a, b) => b.timestamp - a.timestamp);
|
|
122
|
+
}
|
|
123
|
+
getAllBackups() {
|
|
124
|
+
return [...this.index.entries].sort((a, b) => b.timestamp - a.timestamp);
|
|
125
|
+
}
|
|
126
|
+
restoreFile(entry) {
|
|
127
|
+
const backupFullPath = join(this.snapshotsDir, entry.backupPath);
|
|
128
|
+
const targetPath = join(this.config.workspace, entry.originalPath);
|
|
129
|
+
if (!existsSync(backupFullPath)) {
|
|
130
|
+
console.error(`Backup file not found: ${entry.backupPath}`);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
mkdirSync(dirname(targetPath), { recursive: true });
|
|
135
|
+
copyFileSync(backupFullPath, targetPath);
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
console.error(`Failed to restore ${entry.originalPath}:`, err);
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
restoreLatest(relativePath) {
|
|
144
|
+
const backups = this.getBackupsForFile(relativePath);
|
|
145
|
+
if (backups.length === 0) {
|
|
146
|
+
console.error(`No backups found for: ${relativePath}`);
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return this.restoreFile(backups[0]);
|
|
150
|
+
}
|
|
151
|
+
restoreSession(sessionId) {
|
|
152
|
+
const sessionEntries = this.index.entries.filter(e => e.sessionId === sessionId);
|
|
153
|
+
let restored = 0;
|
|
154
|
+
let failed = 0;
|
|
155
|
+
const latestByFile = new Map();
|
|
156
|
+
for (const entry of sessionEntries) {
|
|
157
|
+
const existing = latestByFile.get(entry.originalPath);
|
|
158
|
+
if (!existing || entry.timestamp < existing.timestamp) {
|
|
159
|
+
latestByFile.set(entry.originalPath, entry);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
for (const entry of latestByFile.values()) {
|
|
163
|
+
if (this.restoreFile(entry)) {
|
|
164
|
+
restored++;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
failed++;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return { restored, failed };
|
|
171
|
+
}
|
|
172
|
+
cleanOldBackups(maxAgeDays) {
|
|
173
|
+
const cutoff = Date.now() - (maxAgeDays * 24 * 60 * 60 * 1000);
|
|
174
|
+
let removed = 0;
|
|
175
|
+
let freedBytes = 0;
|
|
176
|
+
const toRemove = [];
|
|
177
|
+
const toKeep = [];
|
|
178
|
+
for (const entry of this.index.entries) {
|
|
179
|
+
if (entry.timestamp < cutoff) {
|
|
180
|
+
toRemove.push(entry);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
toKeep.push(entry);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
for (const entry of toRemove) {
|
|
187
|
+
const backupPath = join(this.snapshotsDir, entry.backupPath);
|
|
188
|
+
try {
|
|
189
|
+
if (existsSync(backupPath)) {
|
|
190
|
+
const stats = statSync(backupPath);
|
|
191
|
+
unlinkSync(backupPath);
|
|
192
|
+
freedBytes += stats.size;
|
|
193
|
+
removed++;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
// Ignore removal errors
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
this.index.entries = toKeep;
|
|
201
|
+
this.saveIndex();
|
|
202
|
+
removeEmptyDirs(this.snapshotsDir);
|
|
203
|
+
return { removed, freedBytes };
|
|
204
|
+
}
|
|
205
|
+
getStats() {
|
|
206
|
+
const uniqueFiles = new Set(this.index.entries.map(e => e.originalPath));
|
|
207
|
+
const totalSize = this.index.entries.reduce((sum, e) => sum + e.size, 0);
|
|
208
|
+
return {
|
|
209
|
+
totalBackups: this.index.entries.length,
|
|
210
|
+
totalSize,
|
|
211
|
+
uniqueFiles: uniqueFiles.size,
|
|
212
|
+
sessions: Object.keys(this.index.sessions).length,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../src/backup.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runCli(argv: string[]): Promise<void>;
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { resolve } from "path";
|
|
2
|
+
import { existsSync } from "fs";
|
|
3
|
+
import { spawn } from "child_process";
|
|
4
|
+
import { getDefaultConfig } from "./config";
|
|
5
|
+
import { BackupManager } from "./backup";
|
|
6
|
+
import { ShieldWatcher } from "./watcher";
|
|
7
|
+
import { formatBytes, formatTimeAgo } from "./utils";
|
|
8
|
+
function parseArgs(args) {
|
|
9
|
+
const result = {
|
|
10
|
+
command: args[0] || "help",
|
|
11
|
+
args: [],
|
|
12
|
+
flags: {},
|
|
13
|
+
};
|
|
14
|
+
for (let i = 1; i < args.length; i++) {
|
|
15
|
+
const arg = args[i];
|
|
16
|
+
if (arg.startsWith("--")) {
|
|
17
|
+
const [key, value] = arg.slice(2).split("=");
|
|
18
|
+
result.flags[key] = value ?? true;
|
|
19
|
+
}
|
|
20
|
+
else if (arg.startsWith("-")) {
|
|
21
|
+
result.flags[arg.slice(1)] = true;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
result.args.push(arg);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
function printHelp() {
|
|
30
|
+
console.log(`
|
|
31
|
+
๐ก๏ธ Shield - File Protection for AI Agents
|
|
32
|
+
|
|
33
|
+
Usage:
|
|
34
|
+
shield <command> [options]
|
|
35
|
+
|
|
36
|
+
Commands:
|
|
37
|
+
watch [path] Start watching a directory (default: current dir)
|
|
38
|
+
exec <command> Snapshot workspace, run command, then allow restore
|
|
39
|
+
snapshot [path] Take a one-time snapshot of all files
|
|
40
|
+
restore [file] Restore a file to its backed-up version
|
|
41
|
+
list List all backups
|
|
42
|
+
clean [--days=N] Remove backups older than N days (default: 7)
|
|
43
|
+
status Show backup statistics
|
|
44
|
+
help Show this help message
|
|
45
|
+
|
|
46
|
+
Options:
|
|
47
|
+
--path=<dir> Specify workspace directory
|
|
48
|
+
--days=<N> For clean command: max age in days
|
|
49
|
+
|
|
50
|
+
Examples:
|
|
51
|
+
shield watch ./my-project
|
|
52
|
+
shield exec -- npm run agent-task
|
|
53
|
+
shield restore src/index.ts
|
|
54
|
+
shield clean --days=3
|
|
55
|
+
shield status
|
|
56
|
+
`);
|
|
57
|
+
}
|
|
58
|
+
export async function runCli(argv) {
|
|
59
|
+
const options = parseArgs(argv.slice(2));
|
|
60
|
+
switch (options.command) {
|
|
61
|
+
case "watch":
|
|
62
|
+
await cmdWatch(options);
|
|
63
|
+
break;
|
|
64
|
+
case "exec":
|
|
65
|
+
await cmdExec(options, argv);
|
|
66
|
+
break;
|
|
67
|
+
case "snapshot":
|
|
68
|
+
await cmdSnapshot(options);
|
|
69
|
+
break;
|
|
70
|
+
case "restore":
|
|
71
|
+
await cmdRestore(options);
|
|
72
|
+
break;
|
|
73
|
+
case "list":
|
|
74
|
+
await cmdList(options);
|
|
75
|
+
break;
|
|
76
|
+
case "clean":
|
|
77
|
+
await cmdClean(options);
|
|
78
|
+
break;
|
|
79
|
+
case "status":
|
|
80
|
+
await cmdStatus(options);
|
|
81
|
+
break;
|
|
82
|
+
case "help":
|
|
83
|
+
default:
|
|
84
|
+
printHelp();
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function getConfig(options) {
|
|
89
|
+
const pathArg = options.flags["path"] || options.args[0] || ".";
|
|
90
|
+
const workspace = resolve(pathArg);
|
|
91
|
+
if (!existsSync(workspace)) {
|
|
92
|
+
console.error(`Error: Directory not found: ${workspace}`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
return getDefaultConfig(workspace);
|
|
96
|
+
}
|
|
97
|
+
async function cmdWatch(options) {
|
|
98
|
+
const config = await getConfig(options);
|
|
99
|
+
const backupManager = new BackupManager(config);
|
|
100
|
+
const watcher = new ShieldWatcher(config, backupManager);
|
|
101
|
+
watcher.start();
|
|
102
|
+
process.on("SIGINT", () => {
|
|
103
|
+
console.log("\n");
|
|
104
|
+
watcher.stop();
|
|
105
|
+
const stats = backupManager.getStats();
|
|
106
|
+
console.log(`\n๐ Session summary: ${stats.totalBackups} backups, ${stats.uniqueFiles} unique files`);
|
|
107
|
+
process.exit(0);
|
|
108
|
+
});
|
|
109
|
+
await new Promise(() => { });
|
|
110
|
+
}
|
|
111
|
+
async function cmdExec(options, rawArgv) {
|
|
112
|
+
const dashDashIndex = rawArgv.indexOf("--");
|
|
113
|
+
if (dashDashIndex === -1 || dashDashIndex === rawArgv.length - 1) {
|
|
114
|
+
console.error("Usage: shield exec -- <command>");
|
|
115
|
+
console.error("Example: shield exec -- npm run agent-task");
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
const commandArgs = rawArgv.slice(dashDashIndex + 1);
|
|
119
|
+
const pathArg = options.flags["path"] || ".";
|
|
120
|
+
const workspace = resolve(pathArg);
|
|
121
|
+
const config = getDefaultConfig(workspace);
|
|
122
|
+
const backupManager = new BackupManager(config);
|
|
123
|
+
console.log("๐ก๏ธ Shield Exec Mode");
|
|
124
|
+
console.log("โ".repeat(50));
|
|
125
|
+
console.log("๐ธ Taking pre-execution snapshot...");
|
|
126
|
+
const snapshot = backupManager.snapshotWorkspace();
|
|
127
|
+
console.log(`โ Snapshot complete: ${snapshot.backed} files backed up, ${snapshot.skipped} skipped`);
|
|
128
|
+
console.log("โ".repeat(50));
|
|
129
|
+
console.log(`๐ Running: ${commandArgs.join(" ")}`);
|
|
130
|
+
console.log("โ".repeat(50));
|
|
131
|
+
const child = spawn(commandArgs[0], commandArgs.slice(1), {
|
|
132
|
+
stdio: "inherit",
|
|
133
|
+
shell: true,
|
|
134
|
+
cwd: workspace,
|
|
135
|
+
});
|
|
136
|
+
await new Promise((resolve, reject) => {
|
|
137
|
+
child.on("close", (code) => {
|
|
138
|
+
console.log("โ".repeat(50));
|
|
139
|
+
if (code === 0) {
|
|
140
|
+
console.log("โ Command completed successfully");
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.log(`โ Command exited with code ${code}`);
|
|
144
|
+
}
|
|
145
|
+
console.log("\n๐ก To restore files, run: shield restore <file>");
|
|
146
|
+
console.log(" To list all backups: shield list");
|
|
147
|
+
resolve();
|
|
148
|
+
});
|
|
149
|
+
child.on("error", reject);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
async function cmdSnapshot(options) {
|
|
153
|
+
const config = await getConfig(options);
|
|
154
|
+
const backupManager = new BackupManager(config);
|
|
155
|
+
console.log("๐ธ Taking snapshot...");
|
|
156
|
+
const result = backupManager.snapshotWorkspace();
|
|
157
|
+
console.log(`โ Complete: ${result.backed} files backed up, ${result.skipped} skipped`);
|
|
158
|
+
}
|
|
159
|
+
async function cmdRestore(options) {
|
|
160
|
+
const pathArg = options.flags["path"] || ".";
|
|
161
|
+
const workspace = resolve(pathArg);
|
|
162
|
+
if (!existsSync(workspace)) {
|
|
163
|
+
console.error(`Error: Directory not found: ${workspace}`);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
const config = getDefaultConfig(workspace);
|
|
167
|
+
const backupManager = new BackupManager(config);
|
|
168
|
+
const fileArg = options.args[0];
|
|
169
|
+
if (!fileArg) {
|
|
170
|
+
const backups = backupManager.getAllBackups();
|
|
171
|
+
if (backups.length === 0) {
|
|
172
|
+
console.log("No backups available");
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
console.log("Available backups (use 'shield restore <file>' to restore):\n");
|
|
176
|
+
const uniqueFiles = new Map();
|
|
177
|
+
for (const backup of backups) {
|
|
178
|
+
if (!uniqueFiles.has(backup.originalPath)) {
|
|
179
|
+
uniqueFiles.set(backup.originalPath, backup);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
for (const [path, backup] of uniqueFiles) {
|
|
183
|
+
console.log(` ${path} (${formatTimeAgo(backup.timestamp)})`);
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
console.log(`๐ Restoring: ${fileArg}`);
|
|
188
|
+
const success = backupManager.restoreLatest(fileArg);
|
|
189
|
+
if (success) {
|
|
190
|
+
console.log(`โ Restored: ${fileArg}`);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
console.log(`โ Failed to restore: ${fileArg}`);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function cmdList(options) {
|
|
198
|
+
const config = await getConfig(options);
|
|
199
|
+
const backupManager = new BackupManager(config);
|
|
200
|
+
const backups = backupManager.getAllBackups();
|
|
201
|
+
if (backups.length === 0) {
|
|
202
|
+
console.log("No backups found");
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
console.log(`๐ All Backups (${backups.length} total)\n`);
|
|
206
|
+
for (const backup of backups.slice(0, 50)) {
|
|
207
|
+
const timeStr = formatTimeAgo(backup.timestamp);
|
|
208
|
+
const sizeStr = formatBytes(backup.size);
|
|
209
|
+
console.log(` ${backup.originalPath}`);
|
|
210
|
+
console.log(` โโ ${timeStr} | ${sizeStr}`);
|
|
211
|
+
}
|
|
212
|
+
if (backups.length > 50) {
|
|
213
|
+
console.log(`\n ... and ${backups.length - 50} more`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function cmdClean(options) {
|
|
217
|
+
const config = await getConfig(options);
|
|
218
|
+
const backupManager = new BackupManager(config);
|
|
219
|
+
const days = parseInt(options.flags["days"]) || 7;
|
|
220
|
+
console.log(`๐งน Cleaning backups older than ${days} days...`);
|
|
221
|
+
const result = backupManager.cleanOldBackups(days);
|
|
222
|
+
console.log(`โ Removed ${result.removed} backups, freed ${formatBytes(result.freedBytes)}`);
|
|
223
|
+
}
|
|
224
|
+
async function cmdStatus(options) {
|
|
225
|
+
const config = await getConfig(options);
|
|
226
|
+
const backupManager = new BackupManager(config);
|
|
227
|
+
const stats = backupManager.getStats();
|
|
228
|
+
console.log("๐ Shield Status\n");
|
|
229
|
+
console.log(` Workspace: ${config.workspace}`);
|
|
230
|
+
console.log(` Vault: ${config.vaultDir}`);
|
|
231
|
+
console.log(` Total Backups: ${stats.totalBackups}`);
|
|
232
|
+
console.log(` Unique Files: ${stats.uniqueFiles}`);
|
|
233
|
+
console.log(` Total Size: ${formatBytes(stats.totalSize)}`);
|
|
234
|
+
console.log(` Sessions: ${stats.sessions}`);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ShieldConfig {
|
|
2
|
+
workspace: string;
|
|
3
|
+
vaultDir: string;
|
|
4
|
+
excludePatterns: string[];
|
|
5
|
+
maxBackupAgeDays: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const DEFAULT_VAULT_NAME = ".shield";
|
|
8
|
+
export declare const SNAPSHOTS_DIR = "snapshots";
|
|
9
|
+
export declare const INDEX_FILE = "index.json";
|
|
10
|
+
export declare const DEFAULT_EXCLUDE_PATTERNS: string[];
|
|
11
|
+
export declare function getDefaultConfig(workspace: string): ShieldConfig;
|
|
12
|
+
export declare function getSnapshotsDir(config: ShieldConfig): string;
|
|
13
|
+
export declare function getIndexPath(config: ShieldConfig): string;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { join } from "path";
|
|
2
|
+
export const DEFAULT_VAULT_NAME = ".shield";
|
|
3
|
+
export const SNAPSHOTS_DIR = "snapshots";
|
|
4
|
+
export const INDEX_FILE = "index.json";
|
|
5
|
+
export const DEFAULT_EXCLUDE_PATTERNS = [
|
|
6
|
+
".git",
|
|
7
|
+
".git/**",
|
|
8
|
+
"node_modules",
|
|
9
|
+
"node_modules/**",
|
|
10
|
+
".shield",
|
|
11
|
+
".shield/**",
|
|
12
|
+
"**/*.log",
|
|
13
|
+
"**/*.tmp",
|
|
14
|
+
"**/*.swp",
|
|
15
|
+
"**/*.swo",
|
|
16
|
+
"**/~*",
|
|
17
|
+
"**/.DS_Store",
|
|
18
|
+
"**/Thumbs.db",
|
|
19
|
+
"**/__pycache__",
|
|
20
|
+
"**/__pycache__/**",
|
|
21
|
+
"**/*.pyc",
|
|
22
|
+
"**/dist",
|
|
23
|
+
"**/dist/**",
|
|
24
|
+
"**/build",
|
|
25
|
+
"**/build/**",
|
|
26
|
+
"**/.next",
|
|
27
|
+
"**/.next/**",
|
|
28
|
+
"**/.nuxt",
|
|
29
|
+
"**/.nuxt/**",
|
|
30
|
+
"**/coverage",
|
|
31
|
+
"**/coverage/**",
|
|
32
|
+
"**/.cache",
|
|
33
|
+
"**/.cache/**",
|
|
34
|
+
];
|
|
35
|
+
export function getDefaultConfig(workspace) {
|
|
36
|
+
return {
|
|
37
|
+
workspace: workspace,
|
|
38
|
+
vaultDir: join(workspace, DEFAULT_VAULT_NAME),
|
|
39
|
+
excludePatterns: DEFAULT_EXCLUDE_PATTERNS,
|
|
40
|
+
maxBackupAgeDays: 7,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function getSnapshotsDir(config) {
|
|
44
|
+
return join(config.vaultDir, SNAPSHOTS_DIR);
|
|
45
|
+
}
|
|
46
|
+
export function getIndexPath(config) {
|
|
47
|
+
return join(config.vaultDir, INDEX_FILE);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAS5B,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAEvC,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,MAAM;IACN,SAAS;IACT,cAAc;IACd,iBAAiB;IACjB,SAAS;IACT,YAAY;IACZ,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,OAAO;IACP,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,mBAAmB;IACnB,UAAU;IACV,SAAS;IACT,YAAY;IACZ,UAAU;IACV,aAAa;IACb,UAAU;IACV,aAAa;IACb,UAAU;IACV,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,WAAW;IACX,cAAc;CACf,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO;QACL,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC;QAC7C,eAAe,EAAE,wBAAwB;QACzC,gBAAgB,EAAE,CAAC;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC"}
|
package/dist/index.d.ts
ADDED