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.
Files changed (305) hide show
  1. package/.claude-flow-novice/preferences/generation.json +147 -0
  2. package/.claude-flow-novice/preferences/language-configs/javascript.json +51 -0
  3. package/.claude-flow-novice/preferences/language-configs/python.json +50 -0
  4. package/.claude-flow-novice/preferences/language-configs/rust.json +237 -0
  5. package/.claude-flow-novice/preferences/language-configs/typescript.json +54 -0
  6. package/.claude-flow-novice/preferences/project-local.json +91 -0
  7. package/.claude-flow-novice/preferences/resource-delegation.json +120 -0
  8. package/.claude-flow-novice/preferences/team-shared.json +195 -0
  9. package/.claude-flow-novice/preferences/user-global.json +247 -0
  10. package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-JAVASCRIPT.md +769 -0
  11. package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-PYTHON.md +1214 -0
  12. package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-RUST.md +475 -0
  13. package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-TYPESCRIPT.md +851 -0
  14. package/.claude-flow-novice/templates/claude-md-templates/README.md +263 -0
  15. package/CLAUDE.md +81 -0
  16. package/README-NPM.md +0 -0
  17. package/package.json +11 -7
  18. package/scripts/build/README.md +167 -0
  19. package/scripts/build/build-config.js +27 -0
  20. package/scripts/build/build-prompt-copier.sh +30 -0
  21. package/scripts/build/performance-monitor.js +869 -0
  22. package/scripts/build/prepare-publish.js +150 -0
  23. package/scripts/build/typescript-fixer.js +621 -0
  24. package/scripts/build/unified-builder.sh +428 -0
  25. package/scripts/build/update-bin-version.js +32 -0
  26. package/scripts/dev/README.md +264 -0
  27. package/scripts/dev/claude-flow-wrapper.sh +35 -0
  28. package/scripts/dev/claude-monitor.py +419 -0
  29. package/scripts/dev/claude-sparc.sh +562 -0
  30. package/scripts/dev/claude-wrapper.sh +17 -0
  31. package/scripts/dev/demo-phase3-compliance.js +172 -0
  32. package/scripts/dev/demo-task-system.ts +224 -0
  33. package/scripts/dev/deployment-validator.js +315 -0
  34. package/scripts/dev/spawn-claude-terminal.sh +32 -0
  35. package/scripts/dev/start-portal.sh +506 -0
  36. package/scripts/dev/start-web-ui.js +15 -0
  37. package/scripts/dev/stop-portal.sh +311 -0
  38. package/scripts/dev/validate-examples.ts +288 -0
  39. package/scripts/dev/validate-phase2.cjs +451 -0
  40. package/scripts/dev/validate-phase2.js +785 -0
  41. package/scripts/dev/validate-phase3.cjs +208 -0
  42. package/scripts/dev/validate-security-remediation.js +1 -0
  43. package/scripts/legacy/README.md +272 -0
  44. package/scripts/legacy/batch-fix-ts.sh +54 -0
  45. package/scripts/legacy/build-migration.sh +105 -0
  46. package/scripts/legacy/build-monitor.js +209 -0
  47. package/scripts/legacy/build-with-filter.sh +84 -0
  48. package/scripts/legacy/build-workaround.sh +71 -0
  49. package/scripts/legacy/fix-ts-advanced.js +358 -0
  50. package/scripts/legacy/fix-ts-final.sh +50 -0
  51. package/scripts/legacy/fix-ts-targeted.sh +49 -0
  52. package/scripts/legacy/fix-typescript-errors.js +305 -0
  53. package/scripts/legacy/force-build.sh +63 -0
  54. package/scripts/legacy/optimize-performance.js +400 -0
  55. package/scripts/legacy/performance-monitor.js +263 -0
  56. package/scripts/legacy/performance-monitoring.js +532 -0
  57. package/scripts/legacy/performance-test-runner.js +645 -0
  58. package/scripts/legacy/quick-fix-ts.js +281 -0
  59. package/scripts/legacy/safe-build.sh +63 -0
  60. package/scripts/migration/README.md +434 -0
  61. package/scripts/migration/install-arm64.js +78 -0
  62. package/scripts/migration/install.js +83 -0
  63. package/scripts/migration/migrate-hooks.js +173 -0
  64. package/scripts/migration/migration-examples.ts +318 -0
  65. package/scripts/optimization/build-optimizer.js +438 -0
  66. package/scripts/optimization/config-validator.js +761 -0
  67. package/scripts/optimization/test-optimization.js +432 -0
  68. package/scripts/optimization/unified-activation.js +839 -0
  69. package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
  70. package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
  71. package/scripts/performance/test-enhanced-backend.sh +504 -0
  72. package/scripts/performance-test-runner.js +698 -0
  73. package/scripts/security/README.md +339 -0
  74. package/scripts/security/install-git-hooks.sh +132 -0
  75. package/scripts/security/ruv-swarm-safe.js +74 -0
  76. package/scripts/test/README.md +236 -0
  77. package/scripts/test/check-links.ts +274 -0
  78. package/scripts/test/check-performance-regression.ts +168 -0
  79. package/scripts/test/coverage-report.ts +692 -0
  80. package/scripts/test/generate-swarm-tests.js +633 -0
  81. package/scripts/test/integration-test-validation.cjs +253 -0
  82. package/scripts/test/load-test-swarm.js +576 -0
  83. package/scripts/test/run-phase3-compliance-tests.js +427 -0
  84. package/scripts/test/test-batch-tasks.ts +29 -0
  85. package/scripts/test/test-byzantine-resolution.js +246 -0
  86. package/scripts/test/test-claude-spawn-options.sh +63 -0
  87. package/scripts/test/test-cli-wizard.js +331 -0
  88. package/scripts/test/test-comprehensive.js +401 -0
  89. package/scripts/test/test-coordination-features.ts +238 -0
  90. package/scripts/test/test-fallback-systems.js +276 -0
  91. package/scripts/test/test-init-command.ts +302 -0
  92. package/scripts/test/test-mcp.ts +251 -0
  93. package/scripts/test/test-runner.ts +568 -0
  94. package/scripts/test/test-swarm-integration.sh +92 -0
  95. package/scripts/test/test-swarm.ts +142 -0
  96. package/scripts/test/validation-summary.ts +408 -0
  97. package/scripts/utils/README.md +261 -0
  98. package/scripts/utils/clean-build-artifacts.sh +94 -0
  99. package/scripts/utils/cleanup-root.sh +69 -0
  100. package/scripts/utils/fix-cliffy-imports.js +307 -0
  101. package/scripts/utils/fix-duplicate-imports.js +114 -0
  102. package/scripts/utils/fix-error-handling.cjs +70 -0
  103. package/scripts/utils/fix-import-paths.js +104 -0
  104. package/scripts/utils/fix-imports.js +116 -0
  105. package/scripts/utils/fix-shebang.js +78 -0
  106. package/scripts/utils/fix-test-modules.js +27 -0
  107. package/scripts/utils/fix-timezone-issue-246.js +200 -0
  108. package/scripts/utils/fix-ts-comprehensive.py +182 -0
  109. package/scripts/utils/fix-ts-targeted-batch.js +250 -0
  110. package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
  111. package/scripts/utils/simple-test-fixer.js +190 -0
  112. package/scripts/utils/validate-metrics-structure.cjs +144 -0
  113. package/scripts/verify-mcp-server.js +86 -0
  114. package/src/cli/simple-commands/__tests__/agent.test.js +291 -0
  115. package/src/cli/simple-commands/__tests__/memory.test.js +8 -0
  116. package/src/cli/simple-commands/__tests__/swarm.test.js +371 -0
  117. package/src/cli/simple-commands/__tests__/task.test.js +8 -0
  118. package/src/cli/simple-commands/agent.js +216 -0
  119. package/src/cli/simple-commands/analysis.js +570 -0
  120. package/src/cli/simple-commands/automation-executor.js +1603 -0
  121. package/src/cli/simple-commands/automation.js +627 -0
  122. package/src/cli/simple-commands/batch-manager.js +338 -0
  123. package/src/cli/simple-commands/claude-telemetry.js +311 -0
  124. package/src/cli/simple-commands/claude-track.js +102 -0
  125. package/src/cli/simple-commands/concurrent-display.js +348 -0
  126. package/src/cli/simple-commands/config.js +319 -0
  127. package/src/cli/simple-commands/coordination.js +307 -0
  128. package/src/cli/simple-commands/enhanced-ui-views.js +654 -0
  129. package/src/cli/simple-commands/enhanced-webui-complete.js +1038 -0
  130. package/src/cli/simple-commands/fix-hook-variables.js +363 -0
  131. package/src/cli/simple-commands/github/gh-coordinator.js +605 -0
  132. package/src/cli/simple-commands/github/github-api.js +624 -0
  133. package/src/cli/simple-commands/github/init.js +543 -0
  134. package/src/cli/simple-commands/github.js +377 -0
  135. package/src/cli/simple-commands/goal.js +145 -0
  136. package/src/cli/simple-commands/hive-mind/auto-save-middleware.js +311 -0
  137. package/src/cli/simple-commands/hive-mind/communication.js +740 -0
  138. package/src/cli/simple-commands/hive-mind/core.js +1031 -0
  139. package/src/cli/simple-commands/hive-mind/db-optimizer.js +872 -0
  140. package/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1364 -0
  141. package/src/cli/simple-commands/hive-mind/memory.js +1292 -0
  142. package/src/cli/simple-commands/hive-mind/performance-optimizer.js +618 -0
  143. package/src/cli/simple-commands/hive-mind/performance-test.js +373 -0
  144. package/src/cli/simple-commands/hive-mind/queen.js +809 -0
  145. package/src/cli/simple-commands/hive-mind/session-manager.js +1223 -0
  146. package/src/cli/simple-commands/hive-mind-optimize.js +361 -0
  147. package/src/cli/simple-commands/hive-mind-wizard.js +281 -0
  148. package/src/cli/simple-commands/hive-mind.js +3112 -0
  149. package/src/cli/simple-commands/hive.js +140 -0
  150. package/src/cli/simple-commands/hook-safety.js +671 -0
  151. package/src/cli/simple-commands/hooks.js +1268 -0
  152. package/src/cli/simple-commands/init/.claude/checkpoints/1756224542.json +7 -0
  153. package/src/cli/simple-commands/init/.claude/checkpoints/1756224544.json +8 -0
  154. package/src/cli/simple-commands/init/README.md +106 -0
  155. package/src/cli/simple-commands/init/VALIDATION_ROLLBACK.md +488 -0
  156. package/src/cli/simple-commands/init/agent-copier.js +347 -0
  157. package/src/cli/simple-commands/init/batch-init.js +663 -0
  158. package/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +438 -0
  159. package/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +876 -0
  160. package/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +356 -0
  161. package/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +501 -0
  162. package/src/cli/simple-commands/init/claude-commands/slash-commands.js +57 -0
  163. package/src/cli/simple-commands/init/claude-commands/sparc-commands.js +296 -0
  164. package/src/cli/simple-commands/init/copy-revised-templates.js +175 -0
  165. package/src/cli/simple-commands/init/executable-wrapper.js +122 -0
  166. package/src/cli/simple-commands/init/gitignore-updater.js +137 -0
  167. package/src/cli/simple-commands/init/help.js +110 -0
  168. package/src/cli/simple-commands/init/hive-mind-init.js +749 -0
  169. package/src/cli/simple-commands/init/index.js +1953 -0
  170. package/src/cli/simple-commands/init/performance-monitor.js +344 -0
  171. package/src/cli/simple-commands/init/rollback/backup-manager.js +542 -0
  172. package/src/cli/simple-commands/init/rollback/index.js +399 -0
  173. package/src/cli/simple-commands/init/rollback/recovery-manager.js +778 -0
  174. package/src/cli/simple-commands/init/rollback/rollback-executor.js +521 -0
  175. package/src/cli/simple-commands/init/rollback/state-tracker.js +486 -0
  176. package/src/cli/simple-commands/init/sparc/roo-readme.js +61 -0
  177. package/src/cli/simple-commands/init/sparc/roomodes-config.js +102 -0
  178. package/src/cli/simple-commands/init/sparc/workflows.js +40 -0
  179. package/src/cli/simple-commands/init/sparc-structure.js +68 -0
  180. package/src/cli/simple-commands/init/template-copier.js +640 -0
  181. package/src/cli/simple-commands/init/templates/CLAUDE.md +1185 -0
  182. package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +265 -0
  183. package/src/cli/simple-commands/init/templates/claude-flow-universal +81 -0
  184. package/src/cli/simple-commands/init/templates/claude-flow.bat +18 -0
  185. package/src/cli/simple-commands/init/templates/claude-flow.ps1 +24 -0
  186. package/src/cli/simple-commands/init/templates/claude-md.js +1101 -0
  187. package/src/cli/simple-commands/init/templates/commands/analysis/bottleneck-detect.md +162 -0
  188. package/src/cli/simple-commands/init/templates/commands/automation/auto-agent.md +122 -0
  189. package/src/cli/simple-commands/init/templates/commands/coordination/swarm-init.md +85 -0
  190. package/src/cli/simple-commands/init/templates/commands/github/github-swarm.md +121 -0
  191. package/src/cli/simple-commands/init/templates/commands/helpers/standard-checkpoint-hooks.sh +179 -0
  192. package/src/cli/simple-commands/init/templates/commands/hooks/notification.md +113 -0
  193. package/src/cli/simple-commands/init/templates/commands/hooks/post-command.md +116 -0
  194. package/src/cli/simple-commands/init/templates/commands/hooks/post-edit.md +117 -0
  195. package/src/cli/simple-commands/init/templates/commands/hooks/post-task.md +112 -0
  196. package/src/cli/simple-commands/init/templates/commands/hooks/pre-command.md +113 -0
  197. package/src/cli/simple-commands/init/templates/commands/hooks/pre-edit.md +113 -0
  198. package/src/cli/simple-commands/init/templates/commands/hooks/pre-search.md +112 -0
  199. package/src/cli/simple-commands/init/templates/commands/hooks/pre-task.md +111 -0
  200. package/src/cli/simple-commands/init/templates/commands/hooks/session-end.md +118 -0
  201. package/src/cli/simple-commands/init/templates/commands/hooks/session-restore.md +118 -0
  202. package/src/cli/simple-commands/init/templates/commands/hooks/session-start.md +117 -0
  203. package/src/cli/simple-commands/init/templates/coordination-md.js +340 -0
  204. package/src/cli/simple-commands/init/templates/coordination.md +16 -0
  205. package/src/cli/simple-commands/init/templates/enhanced-templates.js +2347 -0
  206. package/src/cli/simple-commands/init/templates/github-safe-enhanced.js +331 -0
  207. package/src/cli/simple-commands/init/templates/github-safe.js +106 -0
  208. package/src/cli/simple-commands/init/templates/memory-bank-md.js +259 -0
  209. package/src/cli/simple-commands/init/templates/memory-bank.md +16 -0
  210. package/src/cli/simple-commands/init/templates/readme-files.js +72 -0
  211. package/src/cli/simple-commands/init/templates/safe-hook-patterns.js +430 -0
  212. package/src/cli/simple-commands/init/templates/settings.json +109 -0
  213. package/src/cli/simple-commands/init/templates/settings.json.enhanced +35 -0
  214. package/src/cli/simple-commands/init/templates/sparc-modes.js +1401 -0
  215. package/src/cli/simple-commands/init/templates/verification-claude-md.js +432 -0
  216. package/src/cli/simple-commands/init/validation/config-validator.js +354 -0
  217. package/src/cli/simple-commands/init/validation/health-checker.js +599 -0
  218. package/src/cli/simple-commands/init/validation/index.js +388 -0
  219. package/src/cli/simple-commands/init/validation/mode-validator.js +387 -0
  220. package/src/cli/simple-commands/init/validation/post-init-validator.js +390 -0
  221. package/src/cli/simple-commands/init/validation/pre-init-validator.js +290 -0
  222. package/src/cli/simple-commands/init/validation/test-runner.js +488 -0
  223. package/src/cli/simple-commands/init.js +4 -0
  224. package/src/cli/simple-commands/mcp-health.js +163 -0
  225. package/src/cli/simple-commands/mcp-integration-layer.js +689 -0
  226. package/src/cli/simple-commands/mcp.js +420 -0
  227. package/src/cli/simple-commands/memory-consolidation.js +631 -0
  228. package/src/cli/simple-commands/memory.js +345 -0
  229. package/src/cli/simple-commands/migrate-hooks.js +63 -0
  230. package/src/cli/simple-commands/monitor.js +417 -0
  231. package/src/cli/simple-commands/neural.js +148 -0
  232. package/src/cli/simple-commands/pair-autofix-only.js +755 -0
  233. package/src/cli/simple-commands/pair-basic.js +751 -0
  234. package/src/cli/simple-commands/pair-old.js +623 -0
  235. package/src/cli/simple-commands/pair-working.js +849 -0
  236. package/src/cli/simple-commands/pair.js +849 -0
  237. package/src/cli/simple-commands/performance-hooks.js +149 -0
  238. package/src/cli/simple-commands/performance-metrics.js +601 -0
  239. package/src/cli/simple-commands/process-ui-enhanced.js +821 -0
  240. package/src/cli/simple-commands/process-ui.js +274 -0
  241. package/src/cli/simple-commands/realtime-update-system.js +659 -0
  242. package/src/cli/simple-commands/sparc/architecture.js +1750 -0
  243. package/src/cli/simple-commands/sparc/commands.js +575 -0
  244. package/src/cli/simple-commands/sparc/completion.js +1831 -0
  245. package/src/cli/simple-commands/sparc/coordinator.js +1045 -0
  246. package/src/cli/simple-commands/sparc/index.js +321 -0
  247. package/src/cli/simple-commands/sparc/phase-base.js +430 -0
  248. package/src/cli/simple-commands/sparc/pseudocode.js +984 -0
  249. package/src/cli/simple-commands/sparc/refinement.js +1856 -0
  250. package/src/cli/simple-commands/sparc/specification.js +736 -0
  251. package/src/cli/simple-commands/sparc-modes/architect.js +125 -0
  252. package/src/cli/simple-commands/sparc-modes/ask.js +126 -0
  253. package/src/cli/simple-commands/sparc-modes/code.js +148 -0
  254. package/src/cli/simple-commands/sparc-modes/debug.js +112 -0
  255. package/src/cli/simple-commands/sparc-modes/devops.js +137 -0
  256. package/src/cli/simple-commands/sparc-modes/docs-writer.js +38 -0
  257. package/src/cli/simple-commands/sparc-modes/generic.js +34 -0
  258. package/src/cli/simple-commands/sparc-modes/index.js +201 -0
  259. package/src/cli/simple-commands/sparc-modes/integration.js +55 -0
  260. package/src/cli/simple-commands/sparc-modes/mcp.js +38 -0
  261. package/src/cli/simple-commands/sparc-modes/monitoring.js +38 -0
  262. package/src/cli/simple-commands/sparc-modes/optimization.js +38 -0
  263. package/src/cli/simple-commands/sparc-modes/security-review.js +130 -0
  264. package/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +167 -0
  265. package/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +38 -0
  266. package/src/cli/simple-commands/sparc-modes/supabase-admin.js +149 -0
  267. package/src/cli/simple-commands/sparc-modes/swarm.js +436 -0
  268. package/src/cli/simple-commands/sparc-modes/tdd.js +112 -0
  269. package/src/cli/simple-commands/sparc-modes/tutorial.js +277 -0
  270. package/src/cli/simple-commands/sparc.js +530 -0
  271. package/src/cli/simple-commands/start-ui.js +147 -0
  272. package/src/cli/simple-commands/start-wrapper.js +285 -0
  273. package/src/cli/simple-commands/start.js +2 -0
  274. package/src/cli/simple-commands/status.js +303 -0
  275. package/src/cli/simple-commands/stream-chain-clean.js +221 -0
  276. package/src/cli/simple-commands/stream-chain-fixed.js +89 -0
  277. package/src/cli/simple-commands/stream-chain-real.js +408 -0
  278. package/src/cli/simple-commands/stream-chain-working.js +323 -0
  279. package/src/cli/simple-commands/stream-chain.js +491 -0
  280. package/src/cli/simple-commands/stream-processor.js +340 -0
  281. package/src/cli/simple-commands/swarm-executor.js +253 -0
  282. package/src/cli/simple-commands/swarm-metrics-integration.js +371 -0
  283. package/src/cli/simple-commands/swarm-ui.js +741 -0
  284. package/src/cli/simple-commands/swarm-webui-integration.js +311 -0
  285. package/src/cli/simple-commands/swarm.js +2277 -0
  286. package/src/cli/simple-commands/task.js +228 -0
  287. package/src/cli/simple-commands/templates/mle-star-workflow.json +294 -0
  288. package/src/cli/simple-commands/timestamp-fix.js +104 -0
  289. package/src/cli/simple-commands/token-tracker.js +372 -0
  290. package/src/cli/simple-commands/tool-execution-framework.js +555 -0
  291. package/src/cli/simple-commands/train-and-stream.js +354 -0
  292. package/src/cli/simple-commands/training-pipeline.js +874 -0
  293. package/src/cli/simple-commands/training.js +288 -0
  294. package/src/cli/simple-commands/verification-hooks.js +336 -0
  295. package/src/cli/simple-commands/verification-integration.js +464 -0
  296. package/src/cli/simple-commands/verification-training-integration.js +646 -0
  297. package/src/cli/simple-commands/verification.js +551 -0
  298. package/src/cli/simple-commands/web-server.js +929 -0
  299. package/src/cli/simple-commands/webui-validator.js +136 -0
  300. package/src/language/README.md +503 -0
  301. package/src/language/claude-md-generator.js +618 -0
  302. package/src/language/cli.js +422 -0
  303. package/src/language/example.js +347 -0
  304. package/src/language/integration-system.js +619 -0
  305. 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
+ }