claude-flow-novice 1.3.0 → 1.3.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/.claude-flow-novice/preferences/generation.json +147 -0
- package/.claude-flow-novice/preferences/language-configs/javascript.json +51 -0
- package/.claude-flow-novice/preferences/language-configs/python.json +50 -0
- package/.claude-flow-novice/preferences/language-configs/rust.json +237 -0
- package/.claude-flow-novice/preferences/language-configs/typescript.json +54 -0
- package/.claude-flow-novice/preferences/project-local.json +91 -0
- package/.claude-flow-novice/preferences/resource-delegation.json +120 -0
- package/.claude-flow-novice/preferences/team-shared.json +195 -0
- package/.claude-flow-novice/preferences/user-global.json +247 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-JAVASCRIPT.md +769 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-PYTHON.md +1214 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-RUST.md +475 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-TYPESCRIPT.md +851 -0
- package/.claude-flow-novice/templates/claude-md-templates/README.md +263 -0
- package/CLAUDE.md +81 -0
- package/README-NPM.md +0 -0
- package/package.json +11 -7
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/migration/README.md +434 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/src/cli/simple-commands/__tests__/agent.test.js +291 -0
- package/src/cli/simple-commands/__tests__/memory.test.js +8 -0
- package/src/cli/simple-commands/__tests__/swarm.test.js +371 -0
- package/src/cli/simple-commands/__tests__/task.test.js +8 -0
- package/src/cli/simple-commands/agent.js +216 -0
- package/src/cli/simple-commands/analysis.js +570 -0
- package/src/cli/simple-commands/automation-executor.js +1603 -0
- package/src/cli/simple-commands/automation.js +627 -0
- package/src/cli/simple-commands/batch-manager.js +338 -0
- package/src/cli/simple-commands/claude-telemetry.js +311 -0
- package/src/cli/simple-commands/claude-track.js +102 -0
- package/src/cli/simple-commands/concurrent-display.js +348 -0
- package/src/cli/simple-commands/config.js +319 -0
- package/src/cli/simple-commands/coordination.js +307 -0
- package/src/cli/simple-commands/enhanced-ui-views.js +654 -0
- package/src/cli/simple-commands/enhanced-webui-complete.js +1038 -0
- package/src/cli/simple-commands/fix-hook-variables.js +363 -0
- package/src/cli/simple-commands/github/gh-coordinator.js +605 -0
- package/src/cli/simple-commands/github/github-api.js +624 -0
- package/src/cli/simple-commands/github/init.js +543 -0
- package/src/cli/simple-commands/github.js +377 -0
- package/src/cli/simple-commands/goal.js +145 -0
- package/src/cli/simple-commands/hive-mind/auto-save-middleware.js +311 -0
- package/src/cli/simple-commands/hive-mind/communication.js +740 -0
- package/src/cli/simple-commands/hive-mind/core.js +1031 -0
- package/src/cli/simple-commands/hive-mind/db-optimizer.js +872 -0
- package/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1364 -0
- package/src/cli/simple-commands/hive-mind/memory.js +1292 -0
- package/src/cli/simple-commands/hive-mind/performance-optimizer.js +618 -0
- package/src/cli/simple-commands/hive-mind/performance-test.js +373 -0
- package/src/cli/simple-commands/hive-mind/queen.js +809 -0
- package/src/cli/simple-commands/hive-mind/session-manager.js +1223 -0
- package/src/cli/simple-commands/hive-mind-optimize.js +361 -0
- package/src/cli/simple-commands/hive-mind-wizard.js +281 -0
- package/src/cli/simple-commands/hive-mind.js +3112 -0
- package/src/cli/simple-commands/hive.js +140 -0
- package/src/cli/simple-commands/hook-safety.js +671 -0
- package/src/cli/simple-commands/hooks.js +1268 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224542.json +7 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224544.json +8 -0
- package/src/cli/simple-commands/init/README.md +106 -0
- package/src/cli/simple-commands/init/VALIDATION_ROLLBACK.md +488 -0
- package/src/cli/simple-commands/init/agent-copier.js +347 -0
- package/src/cli/simple-commands/init/batch-init.js +663 -0
- package/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +438 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +876 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +356 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +501 -0
- package/src/cli/simple-commands/init/claude-commands/slash-commands.js +57 -0
- package/src/cli/simple-commands/init/claude-commands/sparc-commands.js +296 -0
- package/src/cli/simple-commands/init/copy-revised-templates.js +175 -0
- package/src/cli/simple-commands/init/executable-wrapper.js +122 -0
- package/src/cli/simple-commands/init/gitignore-updater.js +137 -0
- package/src/cli/simple-commands/init/help.js +110 -0
- package/src/cli/simple-commands/init/hive-mind-init.js +749 -0
- package/src/cli/simple-commands/init/index.js +1953 -0
- package/src/cli/simple-commands/init/performance-monitor.js +344 -0
- package/src/cli/simple-commands/init/rollback/backup-manager.js +542 -0
- package/src/cli/simple-commands/init/rollback/index.js +399 -0
- package/src/cli/simple-commands/init/rollback/recovery-manager.js +778 -0
- package/src/cli/simple-commands/init/rollback/rollback-executor.js +521 -0
- package/src/cli/simple-commands/init/rollback/state-tracker.js +486 -0
- package/src/cli/simple-commands/init/sparc/roo-readme.js +61 -0
- package/src/cli/simple-commands/init/sparc/roomodes-config.js +102 -0
- package/src/cli/simple-commands/init/sparc/workflows.js +40 -0
- package/src/cli/simple-commands/init/sparc-structure.js +68 -0
- package/src/cli/simple-commands/init/template-copier.js +640 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +1185 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +265 -0
- package/src/cli/simple-commands/init/templates/claude-flow-universal +81 -0
- package/src/cli/simple-commands/init/templates/claude-flow.bat +18 -0
- package/src/cli/simple-commands/init/templates/claude-flow.ps1 +24 -0
- package/src/cli/simple-commands/init/templates/claude-md.js +1101 -0
- package/src/cli/simple-commands/init/templates/commands/analysis/bottleneck-detect.md +162 -0
- package/src/cli/simple-commands/init/templates/commands/automation/auto-agent.md +122 -0
- package/src/cli/simple-commands/init/templates/commands/coordination/swarm-init.md +85 -0
- package/src/cli/simple-commands/init/templates/commands/github/github-swarm.md +121 -0
- package/src/cli/simple-commands/init/templates/commands/helpers/standard-checkpoint-hooks.sh +179 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/notification.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-command.md +116 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-edit.md +117 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-task.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-command.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-edit.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-search.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-task.md +111 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-end.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-restore.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-start.md +117 -0
- package/src/cli/simple-commands/init/templates/coordination-md.js +340 -0
- package/src/cli/simple-commands/init/templates/coordination.md +16 -0
- package/src/cli/simple-commands/init/templates/enhanced-templates.js +2347 -0
- package/src/cli/simple-commands/init/templates/github-safe-enhanced.js +331 -0
- package/src/cli/simple-commands/init/templates/github-safe.js +106 -0
- package/src/cli/simple-commands/init/templates/memory-bank-md.js +259 -0
- package/src/cli/simple-commands/init/templates/memory-bank.md +16 -0
- package/src/cli/simple-commands/init/templates/readme-files.js +72 -0
- package/src/cli/simple-commands/init/templates/safe-hook-patterns.js +430 -0
- package/src/cli/simple-commands/init/templates/settings.json +109 -0
- package/src/cli/simple-commands/init/templates/settings.json.enhanced +35 -0
- package/src/cli/simple-commands/init/templates/sparc-modes.js +1401 -0
- package/src/cli/simple-commands/init/templates/verification-claude-md.js +432 -0
- package/src/cli/simple-commands/init/validation/config-validator.js +354 -0
- package/src/cli/simple-commands/init/validation/health-checker.js +599 -0
- package/src/cli/simple-commands/init/validation/index.js +388 -0
- package/src/cli/simple-commands/init/validation/mode-validator.js +387 -0
- package/src/cli/simple-commands/init/validation/post-init-validator.js +390 -0
- package/src/cli/simple-commands/init/validation/pre-init-validator.js +290 -0
- package/src/cli/simple-commands/init/validation/test-runner.js +488 -0
- package/src/cli/simple-commands/init.js +4 -0
- package/src/cli/simple-commands/mcp-health.js +163 -0
- package/src/cli/simple-commands/mcp-integration-layer.js +689 -0
- package/src/cli/simple-commands/mcp.js +420 -0
- package/src/cli/simple-commands/memory-consolidation.js +631 -0
- package/src/cli/simple-commands/memory.js +345 -0
- package/src/cli/simple-commands/migrate-hooks.js +63 -0
- package/src/cli/simple-commands/monitor.js +417 -0
- package/src/cli/simple-commands/neural.js +148 -0
- package/src/cli/simple-commands/pair-autofix-only.js +755 -0
- package/src/cli/simple-commands/pair-basic.js +751 -0
- package/src/cli/simple-commands/pair-old.js +623 -0
- package/src/cli/simple-commands/pair-working.js +849 -0
- package/src/cli/simple-commands/pair.js +849 -0
- package/src/cli/simple-commands/performance-hooks.js +149 -0
- package/src/cli/simple-commands/performance-metrics.js +601 -0
- package/src/cli/simple-commands/process-ui-enhanced.js +821 -0
- package/src/cli/simple-commands/process-ui.js +274 -0
- package/src/cli/simple-commands/realtime-update-system.js +659 -0
- package/src/cli/simple-commands/sparc/architecture.js +1750 -0
- package/src/cli/simple-commands/sparc/commands.js +575 -0
- package/src/cli/simple-commands/sparc/completion.js +1831 -0
- package/src/cli/simple-commands/sparc/coordinator.js +1045 -0
- package/src/cli/simple-commands/sparc/index.js +321 -0
- package/src/cli/simple-commands/sparc/phase-base.js +430 -0
- package/src/cli/simple-commands/sparc/pseudocode.js +984 -0
- package/src/cli/simple-commands/sparc/refinement.js +1856 -0
- package/src/cli/simple-commands/sparc/specification.js +736 -0
- package/src/cli/simple-commands/sparc-modes/architect.js +125 -0
- package/src/cli/simple-commands/sparc-modes/ask.js +126 -0
- package/src/cli/simple-commands/sparc-modes/code.js +148 -0
- package/src/cli/simple-commands/sparc-modes/debug.js +112 -0
- package/src/cli/simple-commands/sparc-modes/devops.js +137 -0
- package/src/cli/simple-commands/sparc-modes/docs-writer.js +38 -0
- package/src/cli/simple-commands/sparc-modes/generic.js +34 -0
- package/src/cli/simple-commands/sparc-modes/index.js +201 -0
- package/src/cli/simple-commands/sparc-modes/integration.js +55 -0
- package/src/cli/simple-commands/sparc-modes/mcp.js +38 -0
- package/src/cli/simple-commands/sparc-modes/monitoring.js +38 -0
- package/src/cli/simple-commands/sparc-modes/optimization.js +38 -0
- package/src/cli/simple-commands/sparc-modes/security-review.js +130 -0
- package/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +167 -0
- package/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +38 -0
- package/src/cli/simple-commands/sparc-modes/supabase-admin.js +149 -0
- package/src/cli/simple-commands/sparc-modes/swarm.js +436 -0
- package/src/cli/simple-commands/sparc-modes/tdd.js +112 -0
- package/src/cli/simple-commands/sparc-modes/tutorial.js +277 -0
- package/src/cli/simple-commands/sparc.js +530 -0
- package/src/cli/simple-commands/start-ui.js +147 -0
- package/src/cli/simple-commands/start-wrapper.js +285 -0
- package/src/cli/simple-commands/start.js +2 -0
- package/src/cli/simple-commands/status.js +303 -0
- package/src/cli/simple-commands/stream-chain-clean.js +221 -0
- package/src/cli/simple-commands/stream-chain-fixed.js +89 -0
- package/src/cli/simple-commands/stream-chain-real.js +408 -0
- package/src/cli/simple-commands/stream-chain-working.js +323 -0
- package/src/cli/simple-commands/stream-chain.js +491 -0
- package/src/cli/simple-commands/stream-processor.js +340 -0
- package/src/cli/simple-commands/swarm-executor.js +253 -0
- package/src/cli/simple-commands/swarm-metrics-integration.js +371 -0
- package/src/cli/simple-commands/swarm-ui.js +741 -0
- package/src/cli/simple-commands/swarm-webui-integration.js +311 -0
- package/src/cli/simple-commands/swarm.js +2277 -0
- package/src/cli/simple-commands/task.js +228 -0
- package/src/cli/simple-commands/templates/mle-star-workflow.json +294 -0
- package/src/cli/simple-commands/timestamp-fix.js +104 -0
- package/src/cli/simple-commands/token-tracker.js +372 -0
- package/src/cli/simple-commands/tool-execution-framework.js +555 -0
- package/src/cli/simple-commands/train-and-stream.js +354 -0
- package/src/cli/simple-commands/training-pipeline.js +874 -0
- package/src/cli/simple-commands/training.js +288 -0
- package/src/cli/simple-commands/verification-hooks.js +336 -0
- package/src/cli/simple-commands/verification-integration.js +464 -0
- package/src/cli/simple-commands/verification-training-integration.js +646 -0
- package/src/cli/simple-commands/verification.js +551 -0
- package/src/cli/simple-commands/web-server.js +929 -0
- package/src/cli/simple-commands/webui-validator.js +136 -0
- package/src/language/README.md +503 -0
- package/src/language/claude-md-generator.js +618 -0
- package/src/language/cli.js +422 -0
- package/src/language/example.js +347 -0
- package/src/language/integration-system.js +619 -0
- package/src/language/language-detector.js +581 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
// backup-manager.js - Backup creation and management
|
|
2
|
+
|
|
3
|
+
// Node.js compatible import
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { errors } from '../../../node-compat.js';
|
|
6
|
+
|
|
7
|
+
// Polyfill for Deno's ensureDirSync
|
|
8
|
+
function ensureDirSync(dirPath) {
|
|
9
|
+
try {
|
|
10
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
11
|
+
} catch (error) {
|
|
12
|
+
if (error.code !== 'EEXIST') throw error;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class BackupManager {
|
|
17
|
+
constructor(workingDir) {
|
|
18
|
+
this.workingDir = workingDir;
|
|
19
|
+
this.backupDir = `${workingDir}/.claude-flow-backups`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Create a backup of the current state
|
|
24
|
+
*/
|
|
25
|
+
async createBackup(type = 'manual', description = '') {
|
|
26
|
+
const result = {
|
|
27
|
+
success: true,
|
|
28
|
+
id: null,
|
|
29
|
+
location: null,
|
|
30
|
+
errors: [],
|
|
31
|
+
warnings: [],
|
|
32
|
+
files: [],
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
// Generate backup ID
|
|
37
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
38
|
+
const backupId = `${type}-${timestamp}`;
|
|
39
|
+
result.id = backupId;
|
|
40
|
+
|
|
41
|
+
// Create backup directory
|
|
42
|
+
const backupPath = `${this.backupDir}/${backupId}`;
|
|
43
|
+
result.location = backupPath;
|
|
44
|
+
|
|
45
|
+
await this.ensureBackupDir();
|
|
46
|
+
await Deno.mkdir(backupPath, { recursive: true });
|
|
47
|
+
|
|
48
|
+
// Create backup manifest
|
|
49
|
+
const manifest = {
|
|
50
|
+
id: backupId,
|
|
51
|
+
type,
|
|
52
|
+
description,
|
|
53
|
+
timestamp: Date.now(),
|
|
54
|
+
workingDir: this.workingDir,
|
|
55
|
+
files: [],
|
|
56
|
+
directories: [],
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Backup critical files
|
|
60
|
+
const criticalFiles = await this.getCriticalFiles();
|
|
61
|
+
for (const file of criticalFiles) {
|
|
62
|
+
const backupResult = await this.backupFile(file, backupPath);
|
|
63
|
+
if (backupResult.success) {
|
|
64
|
+
manifest.files.push(backupResult.fileInfo);
|
|
65
|
+
result.files.push(file);
|
|
66
|
+
} else {
|
|
67
|
+
result.warnings.push(`Failed to backup file: ${file}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Backup critical directories
|
|
72
|
+
const criticalDirs = await this.getCriticalDirectories();
|
|
73
|
+
for (const dir of criticalDirs) {
|
|
74
|
+
const backupResult = await this.backupDirectory(dir, backupPath);
|
|
75
|
+
if (backupResult.success) {
|
|
76
|
+
manifest.directories.push(backupResult.dirInfo);
|
|
77
|
+
} else {
|
|
78
|
+
result.warnings.push(`Failed to backup directory: ${dir}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Save manifest
|
|
83
|
+
await Deno.writeTextFile(`${backupPath}/manifest.json`, JSON.stringify(manifest, null, 2));
|
|
84
|
+
|
|
85
|
+
// Create backup metadata
|
|
86
|
+
const metadata = {
|
|
87
|
+
created: Date.now(),
|
|
88
|
+
size: await this.calculateBackupSize(backupPath),
|
|
89
|
+
fileCount: manifest.files.length,
|
|
90
|
+
dirCount: manifest.directories.length,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
await Deno.writeTextFile(`${backupPath}/metadata.json`, JSON.stringify(metadata, null, 2));
|
|
94
|
+
|
|
95
|
+
console.log(` ✓ Backup created: ${backupId}`);
|
|
96
|
+
console.log(` 📁 Files backed up: ${result.files.length}`);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
result.success = false;
|
|
99
|
+
result.errors.push(`Backup creation failed: ${error.message}`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Restore from backup
|
|
107
|
+
*/
|
|
108
|
+
async restoreBackup(backupId) {
|
|
109
|
+
const result = {
|
|
110
|
+
success: true,
|
|
111
|
+
errors: [],
|
|
112
|
+
warnings: [],
|
|
113
|
+
restored: [],
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
const backupPath = `${this.backupDir}/${backupId}`;
|
|
118
|
+
|
|
119
|
+
// Check if backup exists
|
|
120
|
+
try {
|
|
121
|
+
await Deno.stat(backupPath);
|
|
122
|
+
} catch {
|
|
123
|
+
result.success = false;
|
|
124
|
+
result.errors.push(`Backup not found: ${backupId}`);
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Read manifest
|
|
129
|
+
const manifestPath = `${backupPath}/manifest.json`;
|
|
130
|
+
const manifestContent = await fs.readFile(manifestPath, 'utf8');
|
|
131
|
+
const manifest = JSON.parse(manifestContent);
|
|
132
|
+
|
|
133
|
+
// Restore files
|
|
134
|
+
for (const fileInfo of manifest.files) {
|
|
135
|
+
const restoreResult = await this.restoreFile(fileInfo, backupPath);
|
|
136
|
+
if (restoreResult.success) {
|
|
137
|
+
result.restored.push(fileInfo.originalPath);
|
|
138
|
+
} else {
|
|
139
|
+
result.warnings.push(`Failed to restore file: ${fileInfo.originalPath}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Restore directories
|
|
144
|
+
for (const dirInfo of manifest.directories) {
|
|
145
|
+
const restoreResult = await this.restoreDirectory(dirInfo, backupPath);
|
|
146
|
+
if (restoreResult.success) {
|
|
147
|
+
result.restored.push(dirInfo.originalPath);
|
|
148
|
+
} else {
|
|
149
|
+
result.warnings.push(`Failed to restore directory: ${dirInfo.originalPath}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
console.log(` ✓ Backup restored: ${backupId}`);
|
|
154
|
+
console.log(` 📁 Items restored: ${result.restored.length}`);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
result.success = false;
|
|
157
|
+
result.errors.push(`Backup restoration failed: ${error.message}`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* List available backups
|
|
165
|
+
*/
|
|
166
|
+
async listBackups() {
|
|
167
|
+
const backups = [];
|
|
168
|
+
|
|
169
|
+
try {
|
|
170
|
+
await this.ensureBackupDir();
|
|
171
|
+
|
|
172
|
+
for await (const entry of Deno.readDir(this.backupDir)) {
|
|
173
|
+
if (entry.isDirectory) {
|
|
174
|
+
try {
|
|
175
|
+
const metadataPath = `${this.backupDir}/${entry.name}/metadata.json`;
|
|
176
|
+
const manifestPath = `${this.backupDir}/${entry.name}/manifest.json`;
|
|
177
|
+
|
|
178
|
+
const metadata = JSON.parse(await fs.readFile(metadataPath, 'utf8'));
|
|
179
|
+
const manifest = JSON.parse(await fs.readFile(manifestPath, 'utf8'));
|
|
180
|
+
|
|
181
|
+
backups.push({
|
|
182
|
+
id: entry.name,
|
|
183
|
+
type: manifest.type,
|
|
184
|
+
description: manifest.description,
|
|
185
|
+
created: metadata.created,
|
|
186
|
+
size: metadata.size,
|
|
187
|
+
fileCount: metadata.fileCount,
|
|
188
|
+
dirCount: metadata.dirCount,
|
|
189
|
+
});
|
|
190
|
+
} catch {
|
|
191
|
+
// Skip invalid backup directories
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} catch {
|
|
196
|
+
// Backup directory doesn't exist or can't be read
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return backups.sort((a, b) => b.created - a.created);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Delete a backup
|
|
204
|
+
*/
|
|
205
|
+
async deleteBackup(backupId) {
|
|
206
|
+
const result = {
|
|
207
|
+
success: true,
|
|
208
|
+
errors: [],
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
try {
|
|
212
|
+
const backupPath = `${this.backupDir}/${backupId}`;
|
|
213
|
+
await Deno.remove(backupPath, { recursive: true });
|
|
214
|
+
console.log(` 🗑️ Deleted backup: ${backupId}`);
|
|
215
|
+
} catch (error) {
|
|
216
|
+
result.success = false;
|
|
217
|
+
result.errors.push(`Failed to delete backup: ${error.message}`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Clean up old backups
|
|
225
|
+
*/
|
|
226
|
+
async cleanupOldBackups(keepCount = 5) {
|
|
227
|
+
const result = {
|
|
228
|
+
success: true,
|
|
229
|
+
cleaned: [],
|
|
230
|
+
errors: [],
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
try {
|
|
234
|
+
const backups = await this.listBackups();
|
|
235
|
+
|
|
236
|
+
if (backups.length > keepCount) {
|
|
237
|
+
const toDelete = backups.slice(keepCount);
|
|
238
|
+
|
|
239
|
+
for (const backup of toDelete) {
|
|
240
|
+
const deleteResult = await this.deleteBackup(backup.id);
|
|
241
|
+
if (deleteResult.success) {
|
|
242
|
+
result.cleaned.push(backup.id);
|
|
243
|
+
} else {
|
|
244
|
+
result.errors.push(...deleteResult.errors);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
} catch (error) {
|
|
249
|
+
result.success = false;
|
|
250
|
+
result.errors.push(`Cleanup failed: ${error.message}`);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return result;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Validate backup system
|
|
258
|
+
*/
|
|
259
|
+
async validateBackupSystem() {
|
|
260
|
+
const result = {
|
|
261
|
+
success: true,
|
|
262
|
+
errors: [],
|
|
263
|
+
warnings: [],
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
try {
|
|
267
|
+
// Check backup directory
|
|
268
|
+
await this.ensureBackupDir();
|
|
269
|
+
|
|
270
|
+
// Test backup creation
|
|
271
|
+
const testBackup = await this.createTestBackup();
|
|
272
|
+
if (!testBackup.success) {
|
|
273
|
+
result.success = false;
|
|
274
|
+
result.errors.push('Cannot create test backup');
|
|
275
|
+
} else {
|
|
276
|
+
// Clean up test backup
|
|
277
|
+
await this.deleteBackup(testBackup.id);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Check disk space
|
|
281
|
+
const spaceCheck = await this.checkBackupDiskSpace();
|
|
282
|
+
if (!spaceCheck.adequate) {
|
|
283
|
+
result.warnings.push('Low disk space for backups');
|
|
284
|
+
}
|
|
285
|
+
} catch (error) {
|
|
286
|
+
result.success = false;
|
|
287
|
+
result.errors.push(`Backup system validation failed: ${error.message}`);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Helper methods
|
|
294
|
+
|
|
295
|
+
async ensureBackupDir() {
|
|
296
|
+
try {
|
|
297
|
+
await Deno.mkdir(this.backupDir, { recursive: true });
|
|
298
|
+
} catch (error) {
|
|
299
|
+
if (!(error instanceof errors.AlreadyExists)) {
|
|
300
|
+
throw error;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
async getCriticalFiles() {
|
|
306
|
+
const files = [];
|
|
307
|
+
const potentialFiles = [
|
|
308
|
+
'CLAUDE.md',
|
|
309
|
+
'memory-bank.md',
|
|
310
|
+
'coordination.md',
|
|
311
|
+
'package.json',
|
|
312
|
+
'package-lock.json',
|
|
313
|
+
'.roomodes',
|
|
314
|
+
'claude-flow',
|
|
315
|
+
'memory/claude-flow-data.json',
|
|
316
|
+
];
|
|
317
|
+
|
|
318
|
+
for (const file of potentialFiles) {
|
|
319
|
+
try {
|
|
320
|
+
const stat = await Deno.stat(`${this.workingDir}/${file}`);
|
|
321
|
+
if (stat.isFile) {
|
|
322
|
+
files.push(file);
|
|
323
|
+
}
|
|
324
|
+
} catch {
|
|
325
|
+
// File doesn't exist
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return files;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
async getCriticalDirectories() {
|
|
333
|
+
const dirs = [];
|
|
334
|
+
const potentialDirs = ['.claude', '.roo', 'memory/agents', 'memory/sessions', 'coordination'];
|
|
335
|
+
|
|
336
|
+
for (const dir of potentialDirs) {
|
|
337
|
+
try {
|
|
338
|
+
const stat = await Deno.stat(`${this.workingDir}/${dir}`);
|
|
339
|
+
if (stat.isDirectory) {
|
|
340
|
+
dirs.push(dir);
|
|
341
|
+
}
|
|
342
|
+
} catch {
|
|
343
|
+
// Directory doesn't exist
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return dirs;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
async backupFile(relativePath, backupPath) {
|
|
351
|
+
const result = {
|
|
352
|
+
success: true,
|
|
353
|
+
fileInfo: null,
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
try {
|
|
357
|
+
const sourcePath = `${this.workingDir}/${relativePath}`;
|
|
358
|
+
const destPath = `${backupPath}/${relativePath}`;
|
|
359
|
+
|
|
360
|
+
// Ensure destination directory exists
|
|
361
|
+
const destDir = destPath.split('/').slice(0, -1).join('/');
|
|
362
|
+
await Deno.mkdir(destDir, { recursive: true });
|
|
363
|
+
|
|
364
|
+
// Copy file
|
|
365
|
+
await Deno.copyFile(sourcePath, destPath);
|
|
366
|
+
|
|
367
|
+
// Get file info
|
|
368
|
+
const stat = await Deno.stat(sourcePath);
|
|
369
|
+
result.fileInfo = {
|
|
370
|
+
originalPath: relativePath,
|
|
371
|
+
backupPath: destPath,
|
|
372
|
+
size: stat.size,
|
|
373
|
+
modified: stat.mtime?.getTime() || 0,
|
|
374
|
+
};
|
|
375
|
+
} catch (error) {
|
|
376
|
+
result.success = false;
|
|
377
|
+
result.error = error.message;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
return result;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
async backupDirectory(relativePath, backupPath) {
|
|
384
|
+
const result = {
|
|
385
|
+
success: true,
|
|
386
|
+
dirInfo: null,
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
try {
|
|
390
|
+
const sourcePath = `${this.workingDir}/${relativePath}`;
|
|
391
|
+
const destPath = `${backupPath}/${relativePath}`;
|
|
392
|
+
|
|
393
|
+
// Create destination directory
|
|
394
|
+
await Deno.mkdir(destPath, { recursive: true });
|
|
395
|
+
|
|
396
|
+
// Copy directory contents recursively
|
|
397
|
+
await this.copyDirectoryRecursive(sourcePath, destPath);
|
|
398
|
+
|
|
399
|
+
result.dirInfo = {
|
|
400
|
+
originalPath: relativePath,
|
|
401
|
+
backupPath: destPath,
|
|
402
|
+
};
|
|
403
|
+
} catch (error) {
|
|
404
|
+
result.success = false;
|
|
405
|
+
result.error = error.message;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
return result;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
async copyDirectoryRecursive(source, dest) {
|
|
412
|
+
for await (const entry of Deno.readDir(source)) {
|
|
413
|
+
const sourcePath = `${source}/${entry.name}`;
|
|
414
|
+
const destPath = `${dest}/${entry.name}`;
|
|
415
|
+
|
|
416
|
+
if (entry.isFile) {
|
|
417
|
+
await Deno.copyFile(sourcePath, destPath);
|
|
418
|
+
} else if (entry.isDirectory) {
|
|
419
|
+
await Deno.mkdir(destPath, { recursive: true });
|
|
420
|
+
await this.copyDirectoryRecursive(sourcePath, destPath);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
async restoreFile(fileInfo, backupPath) {
|
|
426
|
+
const result = {
|
|
427
|
+
success: true,
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
try {
|
|
431
|
+
const sourcePath = fileInfo.backupPath;
|
|
432
|
+
const destPath = `${this.workingDir}/${fileInfo.originalPath}`;
|
|
433
|
+
|
|
434
|
+
// Ensure destination directory exists
|
|
435
|
+
const destDir = destPath.split('/').slice(0, -1).join('/');
|
|
436
|
+
await Deno.mkdir(destDir, { recursive: true });
|
|
437
|
+
|
|
438
|
+
// Copy file back
|
|
439
|
+
await Deno.copyFile(sourcePath, destPath);
|
|
440
|
+
} catch (error) {
|
|
441
|
+
result.success = false;
|
|
442
|
+
result.error = error.message;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
return result;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
async restoreDirectory(dirInfo, backupPath) {
|
|
449
|
+
const result = {
|
|
450
|
+
success: true,
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
try {
|
|
454
|
+
const sourcePath = dirInfo.backupPath;
|
|
455
|
+
const destPath = `${this.workingDir}/${dirInfo.originalPath}`;
|
|
456
|
+
|
|
457
|
+
// Remove existing directory if it exists
|
|
458
|
+
try {
|
|
459
|
+
await Deno.remove(destPath, { recursive: true });
|
|
460
|
+
} catch {
|
|
461
|
+
// Directory might not exist
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// Create destination directory
|
|
465
|
+
await Deno.mkdir(destPath, { recursive: true });
|
|
466
|
+
|
|
467
|
+
// Copy directory contents back
|
|
468
|
+
await this.copyDirectoryRecursive(sourcePath, destPath);
|
|
469
|
+
} catch (error) {
|
|
470
|
+
result.success = false;
|
|
471
|
+
result.error = error.message;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
return result;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
async calculateBackupSize(backupPath) {
|
|
478
|
+
let totalSize = 0;
|
|
479
|
+
|
|
480
|
+
try {
|
|
481
|
+
for await (const entry of Deno.readDir(backupPath)) {
|
|
482
|
+
const entryPath = `${backupPath}/${entry.name}`;
|
|
483
|
+
const stat = await Deno.stat(entryPath);
|
|
484
|
+
|
|
485
|
+
if (stat.isFile) {
|
|
486
|
+
totalSize += stat.size;
|
|
487
|
+
} else if (stat.isDirectory) {
|
|
488
|
+
totalSize += await this.calculateBackupSize(entryPath);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
} catch {
|
|
492
|
+
// Error calculating size
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
return totalSize;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
async createTestBackup() {
|
|
499
|
+
try {
|
|
500
|
+
return await this.createBackup('test', 'System validation test');
|
|
501
|
+
} catch (error) {
|
|
502
|
+
return {
|
|
503
|
+
success: false,
|
|
504
|
+
error: error.message,
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
async checkBackupDiskSpace() {
|
|
510
|
+
const result = {
|
|
511
|
+
adequate: true,
|
|
512
|
+
available: 0,
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
try {
|
|
516
|
+
const command = new Deno.Command('df', {
|
|
517
|
+
args: ['-k', this.backupDir],
|
|
518
|
+
stdout: 'piped',
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
const { stdout, success } = await command.output();
|
|
522
|
+
|
|
523
|
+
if (success) {
|
|
524
|
+
const output = new TextDecoder().decode(stdout);
|
|
525
|
+
const lines = output.trim().split('\n');
|
|
526
|
+
|
|
527
|
+
if (lines.length >= 2) {
|
|
528
|
+
const parts = lines[1].split(/\s+/);
|
|
529
|
+
if (parts.length >= 4) {
|
|
530
|
+
result.available = parseInt(parts[3]) / 1024; // MB
|
|
531
|
+
result.adequate = result.available > 500; // At least 500MB for backups
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
} catch {
|
|
536
|
+
// Can't check - assume adequate
|
|
537
|
+
result.adequate = true;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
return result;
|
|
541
|
+
}
|
|
542
|
+
}
|