claude-flow-novice 2.0.3 ā 2.0.4
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/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rollback Manager - Handles rollback operations and backup management
|
|
3
|
+
*/ function _define_property(obj, key, value) {
|
|
4
|
+
if (key in obj) {
|
|
5
|
+
Object.defineProperty(obj, key, {
|
|
6
|
+
value: value,
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true
|
|
10
|
+
});
|
|
11
|
+
} else {
|
|
12
|
+
obj[key] = value;
|
|
13
|
+
}
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
import * as fs from "fs-extra";
|
|
17
|
+
import * as path from "path";
|
|
18
|
+
import * as crypto from "crypto";
|
|
19
|
+
import { logger } from "./logger.js";
|
|
20
|
+
import * as chalk from "chalk";
|
|
21
|
+
import * as inquirer from "inquirer";
|
|
22
|
+
export class RollbackManager {
|
|
23
|
+
async createBackup(metadata = {}) {
|
|
24
|
+
const timestamp = new Date();
|
|
25
|
+
const backupId = timestamp.toISOString().replace(/[:.]/g, '-');
|
|
26
|
+
const backupPath = path.join(this.backupDir, backupId);
|
|
27
|
+
logger.info(`Creating backup at ${backupPath}...`);
|
|
28
|
+
await fs.ensureDir(backupPath);
|
|
29
|
+
const backup = {
|
|
30
|
+
timestamp,
|
|
31
|
+
version: '1.0.0',
|
|
32
|
+
files: [],
|
|
33
|
+
metadata: {
|
|
34
|
+
projectPath: this.projectPath,
|
|
35
|
+
backupId,
|
|
36
|
+
...metadata
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
// Backup critical files and directories
|
|
40
|
+
const backupTargets = [
|
|
41
|
+
'.claude',
|
|
42
|
+
'CLAUDE.md',
|
|
43
|
+
'.roomodes',
|
|
44
|
+
'package.json',
|
|
45
|
+
'memory/memory-store.json',
|
|
46
|
+
'coordination/config.json'
|
|
47
|
+
];
|
|
48
|
+
for (const target of backupTargets){
|
|
49
|
+
const sourcePath = path.join(this.projectPath, target);
|
|
50
|
+
const targetPath = path.join(backupPath, target);
|
|
51
|
+
if (await fs.pathExists(sourcePath)) {
|
|
52
|
+
const stats = await fs.stat(sourcePath);
|
|
53
|
+
if (stats.isDirectory()) {
|
|
54
|
+
await this.backupDirectory(sourcePath, targetPath, backup);
|
|
55
|
+
} else {
|
|
56
|
+
await this.backupFile(sourcePath, targetPath, backup, target);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Save backup manifest
|
|
61
|
+
const manifestPath = path.join(backupPath, 'backup-manifest.json');
|
|
62
|
+
await fs.writeJson(manifestPath, backup, {
|
|
63
|
+
spaces: 2
|
|
64
|
+
});
|
|
65
|
+
// Update backup index
|
|
66
|
+
await this.updateBackupIndex(backup);
|
|
67
|
+
logger.success(`Backup created with ${backup.files.length} files`);
|
|
68
|
+
return backup;
|
|
69
|
+
}
|
|
70
|
+
async backupDirectory(sourcePath, targetPath, backup) {
|
|
71
|
+
await fs.ensureDir(targetPath);
|
|
72
|
+
const entries = await fs.readdir(sourcePath);
|
|
73
|
+
for (const entry of entries){
|
|
74
|
+
const entrySource = path.join(sourcePath, entry);
|
|
75
|
+
const entryTarget = path.join(targetPath, entry);
|
|
76
|
+
const stats = await fs.stat(entrySource);
|
|
77
|
+
if (stats.isDirectory()) {
|
|
78
|
+
await this.backupDirectory(entrySource, entryTarget, backup);
|
|
79
|
+
} else {
|
|
80
|
+
const relativePath = path.relative(this.projectPath, entrySource);
|
|
81
|
+
await this.backupFile(entrySource, entryTarget, backup, relativePath);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async backupFile(sourcePath, targetPath, backup, relativePath) {
|
|
86
|
+
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
87
|
+
const checksum = crypto.createHash('sha256').update(content).digest('hex');
|
|
88
|
+
await fs.ensureDir(path.dirname(targetPath));
|
|
89
|
+
await fs.writeFile(targetPath, content);
|
|
90
|
+
const backupFile = {
|
|
91
|
+
path: relativePath,
|
|
92
|
+
content,
|
|
93
|
+
checksum,
|
|
94
|
+
permissions: (await fs.stat(sourcePath)).mode.toString(8)
|
|
95
|
+
};
|
|
96
|
+
backup.files.push(backupFile);
|
|
97
|
+
}
|
|
98
|
+
async listBackups() {
|
|
99
|
+
if (!await fs.pathExists(this.backupDir)) {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
const backupFolders = await fs.readdir(this.backupDir);
|
|
103
|
+
const backups = [];
|
|
104
|
+
for (const folder of backupFolders.sort().reverse()){
|
|
105
|
+
const manifestPath = path.join(this.backupDir, folder, 'backup-manifest.json');
|
|
106
|
+
if (await fs.pathExists(manifestPath)) {
|
|
107
|
+
try {
|
|
108
|
+
const backup = await fs.readJson(manifestPath);
|
|
109
|
+
backups.push(backup);
|
|
110
|
+
} catch (error) {
|
|
111
|
+
logger.warn(`Invalid backup manifest in ${folder}: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return backups;
|
|
116
|
+
}
|
|
117
|
+
async rollback(backupId, interactive = true) {
|
|
118
|
+
const backups = await this.listBackups();
|
|
119
|
+
if (backups.length === 0) {
|
|
120
|
+
throw new Error('No backups found');
|
|
121
|
+
}
|
|
122
|
+
let selectedBackup;
|
|
123
|
+
if (backupId) {
|
|
124
|
+
selectedBackup = backups.find((b)=>b.metadata.backupId === backupId);
|
|
125
|
+
if (!selectedBackup) {
|
|
126
|
+
throw new Error(`Backup not found: ${backupId}`);
|
|
127
|
+
}
|
|
128
|
+
} else if (interactive) {
|
|
129
|
+
selectedBackup = await this.selectBackupInteractively(backups);
|
|
130
|
+
} else {
|
|
131
|
+
selectedBackup = backups[0]; // Most recent
|
|
132
|
+
}
|
|
133
|
+
logger.info(`Rolling back to backup from ${selectedBackup.timestamp.toISOString()}...`);
|
|
134
|
+
// Confirm rollback
|
|
135
|
+
if (interactive) {
|
|
136
|
+
const confirm = await inquirer.prompt([
|
|
137
|
+
{
|
|
138
|
+
type: 'confirm',
|
|
139
|
+
name: 'proceed',
|
|
140
|
+
message: `Are you sure you want to rollback? This will overwrite current files.`,
|
|
141
|
+
default: false
|
|
142
|
+
}
|
|
143
|
+
]);
|
|
144
|
+
if (!confirm.proceed) {
|
|
145
|
+
logger.info('Rollback cancelled');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Create pre-rollback backup
|
|
150
|
+
const preRollbackBackup = await this.createBackup({
|
|
151
|
+
type: 'pre-rollback',
|
|
152
|
+
rollingBackTo: selectedBackup.metadata.backupId
|
|
153
|
+
});
|
|
154
|
+
try {
|
|
155
|
+
// Restore files
|
|
156
|
+
await this.restoreFiles(selectedBackup);
|
|
157
|
+
// Validate restoration
|
|
158
|
+
await this.validateRestore(selectedBackup);
|
|
159
|
+
logger.success('Rollback completed successfully');
|
|
160
|
+
} catch (error) {
|
|
161
|
+
logger.error('Rollback failed, attempting to restore pre-rollback state...');
|
|
162
|
+
try {
|
|
163
|
+
await this.restoreFiles(preRollbackBackup);
|
|
164
|
+
logger.success('Pre-rollback state restored');
|
|
165
|
+
} catch (restoreError) {
|
|
166
|
+
logger.error('Failed to restore pre-rollback state:', restoreError);
|
|
167
|
+
throw new Error('Rollback failed and unable to restore previous state');
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async selectBackupInteractively(backups) {
|
|
173
|
+
const choices = backups.map((backup)=>({
|
|
174
|
+
name: `${backup.timestamp.toLocaleString()} - ${backup.files.length} files (${backup.metadata.type || 'migration'})`,
|
|
175
|
+
value: backup,
|
|
176
|
+
short: backup.metadata.backupId
|
|
177
|
+
}));
|
|
178
|
+
const answer = await inquirer.prompt([
|
|
179
|
+
{
|
|
180
|
+
type: 'list',
|
|
181
|
+
name: 'backup',
|
|
182
|
+
message: 'Select backup to rollback to:',
|
|
183
|
+
choices,
|
|
184
|
+
pageSize: 10
|
|
185
|
+
}
|
|
186
|
+
]);
|
|
187
|
+
return answer.backup;
|
|
188
|
+
}
|
|
189
|
+
async restoreFiles(backup) {
|
|
190
|
+
logger.info(`Restoring ${backup.files.length} files...`);
|
|
191
|
+
for (const file of backup.files){
|
|
192
|
+
const targetPath = path.join(this.projectPath, file.path);
|
|
193
|
+
logger.debug(`Restoring ${file.path}`);
|
|
194
|
+
await fs.ensureDir(path.dirname(targetPath));
|
|
195
|
+
await fs.writeFile(targetPath, file.content);
|
|
196
|
+
// Restore permissions if available
|
|
197
|
+
if (file.permissions) {
|
|
198
|
+
try {
|
|
199
|
+
await fs.chmod(targetPath, parseInt(file.permissions, 8));
|
|
200
|
+
} catch (error) {
|
|
201
|
+
logger.warn(`Could not restore permissions for ${file.path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async validateRestore(backup) {
|
|
207
|
+
logger.info('Validating restored files...');
|
|
208
|
+
const errors = [];
|
|
209
|
+
for (const file of backup.files){
|
|
210
|
+
const filePath = path.join(this.projectPath, file.path);
|
|
211
|
+
if (!await fs.pathExists(filePath)) {
|
|
212
|
+
errors.push(`Missing file: ${file.path}`);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
216
|
+
const checksum = crypto.createHash('sha256').update(content).digest('hex');
|
|
217
|
+
if (checksum !== file.checksum) {
|
|
218
|
+
errors.push(`Checksum mismatch: ${file.path}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (errors.length > 0) {
|
|
222
|
+
throw new Error(`Validation failed:\n${errors.join('\n')}`);
|
|
223
|
+
}
|
|
224
|
+
logger.success('Validation passed');
|
|
225
|
+
}
|
|
226
|
+
async cleanupOldBackups(retentionDays = 30, maxBackups = 10) {
|
|
227
|
+
const backups = await this.listBackups();
|
|
228
|
+
if (backups.length <= maxBackups) {
|
|
229
|
+
return; // No cleanup needed
|
|
230
|
+
}
|
|
231
|
+
const cutoffDate = new Date();
|
|
232
|
+
cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
|
|
233
|
+
const backupsToDelete = backups.filter((backup, index)=>{
|
|
234
|
+
// Keep the most recent maxBackups
|
|
235
|
+
if (index < maxBackups) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
// Delete old backups
|
|
239
|
+
return backup.timestamp < cutoffDate;
|
|
240
|
+
});
|
|
241
|
+
if (backupsToDelete.length === 0) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
logger.info(`Cleaning up ${backupsToDelete.length} old backups...`);
|
|
245
|
+
for (const backup of backupsToDelete){
|
|
246
|
+
const backupPath = path.join(this.backupDir, backup.metadata.backupId);
|
|
247
|
+
await fs.remove(backupPath);
|
|
248
|
+
logger.debug(`Removed backup: ${backup.metadata.backupId}`);
|
|
249
|
+
}
|
|
250
|
+
logger.success(`Cleanup completed, removed ${backupsToDelete.length} backups`);
|
|
251
|
+
}
|
|
252
|
+
async getBackupInfo(backupId) {
|
|
253
|
+
const backups = await this.listBackups();
|
|
254
|
+
return backups.find((b)=>b.metadata.backupId === backupId) || null;
|
|
255
|
+
}
|
|
256
|
+
async exportBackup(backupId, exportPath) {
|
|
257
|
+
const backup = await this.getBackupInfo(backupId);
|
|
258
|
+
if (!backup) {
|
|
259
|
+
throw new Error(`Backup not found: ${backupId}`);
|
|
260
|
+
}
|
|
261
|
+
const backupPath = path.join(this.backupDir, backup.metadata.backupId);
|
|
262
|
+
await fs.copy(backupPath, exportPath);
|
|
263
|
+
logger.success(`Backup exported to ${exportPath}`);
|
|
264
|
+
}
|
|
265
|
+
async importBackup(importPath) {
|
|
266
|
+
const manifestPath = path.join(importPath, 'backup-manifest.json');
|
|
267
|
+
if (!await fs.pathExists(manifestPath)) {
|
|
268
|
+
throw new Error('Invalid backup: missing manifest');
|
|
269
|
+
}
|
|
270
|
+
const backup = await fs.readJson(manifestPath);
|
|
271
|
+
const backupPath = path.join(this.backupDir, backup.metadata.backupId);
|
|
272
|
+
await fs.copy(importPath, backupPath);
|
|
273
|
+
await this.updateBackupIndex(backup);
|
|
274
|
+
logger.success(`Backup imported: ${backup.metadata.backupId}`);
|
|
275
|
+
return backup;
|
|
276
|
+
}
|
|
277
|
+
async updateBackupIndex(backup) {
|
|
278
|
+
const indexPath = path.join(this.backupDir, 'backup-index.json');
|
|
279
|
+
let index = {};
|
|
280
|
+
if (await fs.pathExists(indexPath)) {
|
|
281
|
+
index = await fs.readJson(indexPath);
|
|
282
|
+
}
|
|
283
|
+
index[backup.metadata.backupId] = {
|
|
284
|
+
timestamp: backup.timestamp,
|
|
285
|
+
version: backup.version,
|
|
286
|
+
fileCount: backup.files.length,
|
|
287
|
+
metadata: backup.metadata
|
|
288
|
+
};
|
|
289
|
+
await fs.writeJson(indexPath, index, {
|
|
290
|
+
spaces: 2
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
printBackupSummary(backups) {
|
|
294
|
+
if (backups.length === 0) {
|
|
295
|
+
console.log(chalk.yellow('No backups found'));
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
console.log(chalk.bold('\nš¾ Available Backups'));
|
|
299
|
+
console.log(chalk.gray('ā'.repeat(70)));
|
|
300
|
+
backups.forEach((backup, index)=>{
|
|
301
|
+
const isRecent = index === 0;
|
|
302
|
+
const date = backup.timestamp.toLocaleString();
|
|
303
|
+
const type = backup.metadata.type || 'migration';
|
|
304
|
+
const fileCount = backup.files.length;
|
|
305
|
+
console.log(`\n${isRecent ? chalk.green('ā') : chalk.gray('ā')} ${chalk.bold(backup.metadata.backupId)}`);
|
|
306
|
+
console.log(` ${chalk.gray('Date:')} ${date}`);
|
|
307
|
+
console.log(` ${chalk.gray('Type:')} ${type}`);
|
|
308
|
+
console.log(` ${chalk.gray('Files:')} ${fileCount}`);
|
|
309
|
+
if (backup.metadata.strategy) {
|
|
310
|
+
console.log(` ${chalk.gray('Strategy:')} ${backup.metadata.strategy}`);
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
console.log(chalk.gray('\n' + 'ā'.repeat(70)));
|
|
314
|
+
}
|
|
315
|
+
constructor(projectPath, backupDir = '.claude-backup'){
|
|
316
|
+
_define_property(this, "projectPath", void 0);
|
|
317
|
+
_define_property(this, "backupDir", void 0);
|
|
318
|
+
this.projectPath = projectPath;
|
|
319
|
+
this.backupDir = path.join(projectPath, backupDir);
|
|
320
|
+
}
|
|
321
|
+
}
|