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
|
@@ -1,778 +1,702 @@
|
|
|
1
1
|
// recovery-manager.js - Automated recovery procedures for common failures
|
|
2
|
-
|
|
3
2
|
export class RecoveryManager {
|
|
4
|
-
|
|
5
|
-
this.workingDir = workingDir;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
/**
|
|
3
|
+
/**
|
|
9
4
|
* Perform automated recovery based on failure type
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
recoveryResult = await this.performGenericRecovery(failureType, context);
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
result.success = recoveryResult.success;
|
|
63
|
-
result.errors.push(...recoveryResult.errors);
|
|
64
|
-
result.warnings.push(...recoveryResult.warnings);
|
|
65
|
-
result.actions.push(...recoveryResult.actions);
|
|
66
|
-
} catch (error) {
|
|
67
|
-
result.success = false;
|
|
68
|
-
result.errors.push(`Recovery failed: ${error.message}`);
|
|
5
|
+
*/ async performRecovery(failureType, context = {}) {
|
|
6
|
+
const result = {
|
|
7
|
+
success: true,
|
|
8
|
+
errors: [],
|
|
9
|
+
warnings: [],
|
|
10
|
+
actions: []
|
|
11
|
+
};
|
|
12
|
+
try {
|
|
13
|
+
console.log(`🔧 Attempting recovery for: ${failureType}`);
|
|
14
|
+
let recoveryResult;
|
|
15
|
+
switch(failureType){
|
|
16
|
+
case 'permission-denied':
|
|
17
|
+
recoveryResult = await this.recoverFromPermissionDenied(context);
|
|
18
|
+
break;
|
|
19
|
+
case 'disk-space':
|
|
20
|
+
recoveryResult = await this.recoverFromDiskSpace(context);
|
|
21
|
+
break;
|
|
22
|
+
case 'missing-dependencies':
|
|
23
|
+
recoveryResult = await this.recoverFromMissingDependencies(context);
|
|
24
|
+
break;
|
|
25
|
+
case 'corrupted-config':
|
|
26
|
+
recoveryResult = await this.recoverFromCorruptedConfig(context);
|
|
27
|
+
break;
|
|
28
|
+
case 'partial-initialization':
|
|
29
|
+
recoveryResult = await this.recoverFromPartialInitialization(context);
|
|
30
|
+
break;
|
|
31
|
+
case 'sparc-failure':
|
|
32
|
+
recoveryResult = await this.recoverFromSparcFailure(context);
|
|
33
|
+
break;
|
|
34
|
+
case 'executable-creation-failure':
|
|
35
|
+
recoveryResult = await this.recoverFromExecutableFailure(context);
|
|
36
|
+
break;
|
|
37
|
+
case 'memory-setup-failure':
|
|
38
|
+
recoveryResult = await this.recoverFromMemorySetupFailure(context);
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
recoveryResult = await this.performGenericRecovery(failureType, context);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
result.success = recoveryResult.success;
|
|
45
|
+
result.errors.push(...recoveryResult.errors);
|
|
46
|
+
result.warnings.push(...recoveryResult.warnings);
|
|
47
|
+
result.actions.push(...recoveryResult.actions);
|
|
48
|
+
} catch (error) {
|
|
49
|
+
result.success = false;
|
|
50
|
+
result.errors.push(`Recovery failed: ${error.message}`);
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
69
53
|
}
|
|
70
|
-
|
|
71
|
-
return result;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
54
|
+
/**
|
|
75
55
|
* Recover from permission denied errors
|
|
76
|
-
*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
try {
|
|
86
|
-
// Try to fix permissions on the working directory
|
|
87
|
-
if (Deno.build.os !== 'windows') {
|
|
56
|
+
*/ async recoverFromPermissionDenied(context) {
|
|
57
|
+
const result = {
|
|
58
|
+
success: true,
|
|
59
|
+
errors: [],
|
|
60
|
+
warnings: [],
|
|
61
|
+
actions: []
|
|
62
|
+
};
|
|
88
63
|
try {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
64
|
+
// Try to fix permissions on the working directory
|
|
65
|
+
if (Deno.build.os !== 'windows') {
|
|
66
|
+
try {
|
|
67
|
+
const command = new Deno.Command('chmod', {
|
|
68
|
+
args: [
|
|
69
|
+
'-R',
|
|
70
|
+
'755',
|
|
71
|
+
this.workingDir
|
|
72
|
+
],
|
|
73
|
+
stdout: 'piped',
|
|
74
|
+
stderr: 'piped'
|
|
75
|
+
});
|
|
76
|
+
const { success } = await command.output();
|
|
77
|
+
if (success) {
|
|
78
|
+
result.actions.push('Fixed directory permissions');
|
|
79
|
+
} else {
|
|
80
|
+
result.warnings.push('Could not fix permissions automatically');
|
|
81
|
+
}
|
|
82
|
+
} catch {
|
|
83
|
+
result.warnings.push('Permission fix command not available');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Try to create a test file to verify permissions
|
|
87
|
+
try {
|
|
88
|
+
const testFile = `${this.workingDir}/.permission-test`;
|
|
89
|
+
await Deno.writeTextFile(testFile, 'test');
|
|
90
|
+
await Deno.remove(testFile);
|
|
91
|
+
result.actions.push('Verified write permissions restored');
|
|
92
|
+
} catch {
|
|
93
|
+
result.success = false;
|
|
94
|
+
result.errors.push('Write permissions still denied');
|
|
95
|
+
}
|
|
96
|
+
} catch (error) {
|
|
97
|
+
result.success = false;
|
|
98
|
+
result.errors.push(`Permission recovery failed: ${error.message}`);
|
|
104
99
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
// Try to create a test file to verify permissions
|
|
108
|
-
try {
|
|
109
|
-
const testFile = `${this.workingDir}/.permission-test`;
|
|
110
|
-
await Deno.writeTextFile(testFile, 'test');
|
|
111
|
-
await Deno.remove(testFile);
|
|
112
|
-
result.actions.push('Verified write permissions restored');
|
|
113
|
-
} catch {
|
|
114
|
-
result.success = false;
|
|
115
|
-
result.errors.push('Write permissions still denied');
|
|
116
|
-
}
|
|
117
|
-
} catch (error) {
|
|
118
|
-
result.success = false;
|
|
119
|
-
result.errors.push(`Permission recovery failed: ${error.message}`);
|
|
100
|
+
return result;
|
|
120
101
|
}
|
|
121
|
-
|
|
122
|
-
return result;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
102
|
+
/**
|
|
126
103
|
* Recover from disk space issues
|
|
127
|
-
*/
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
result.success = false;
|
|
156
|
-
result.errors.push(`Disk space recovery failed: ${error.message}`);
|
|
104
|
+
*/ async recoverFromDiskSpace(context) {
|
|
105
|
+
const result = {
|
|
106
|
+
success: true,
|
|
107
|
+
errors: [],
|
|
108
|
+
warnings: [],
|
|
109
|
+
actions: []
|
|
110
|
+
};
|
|
111
|
+
try {
|
|
112
|
+
// Clean up temporary files
|
|
113
|
+
const tempCleanup = await this.cleanupTemporaryFiles();
|
|
114
|
+
result.actions.push(...tempCleanup.actions);
|
|
115
|
+
// Clean up old backups
|
|
116
|
+
const backupCleanup = await this.cleanupOldBackups();
|
|
117
|
+
result.actions.push(...backupCleanup.actions);
|
|
118
|
+
// Check available space after cleanup
|
|
119
|
+
const spaceCheck = await this.checkAvailableSpace();
|
|
120
|
+
if (spaceCheck.available > 100) {
|
|
121
|
+
// MB
|
|
122
|
+
result.actions.push(`Freed space: ${spaceCheck.available}MB available`);
|
|
123
|
+
} else {
|
|
124
|
+
result.success = false;
|
|
125
|
+
result.errors.push('Insufficient disk space even after cleanup');
|
|
126
|
+
}
|
|
127
|
+
} catch (error) {
|
|
128
|
+
result.success = false;
|
|
129
|
+
result.errors.push(`Disk space recovery failed: ${error.message}`);
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
157
132
|
}
|
|
158
|
-
|
|
159
|
-
return result;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
133
|
+
/**
|
|
163
134
|
* Recover from missing dependencies
|
|
164
|
-
*/
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
135
|
+
*/ async recoverFromMissingDependencies(context) {
|
|
136
|
+
const result = {
|
|
137
|
+
success: true,
|
|
138
|
+
errors: [],
|
|
139
|
+
warnings: [],
|
|
140
|
+
actions: []
|
|
141
|
+
};
|
|
142
|
+
try {
|
|
143
|
+
const missingDeps = context.missingDependencies || [
|
|
144
|
+
'node',
|
|
145
|
+
'npm'
|
|
146
|
+
];
|
|
147
|
+
for (const dep of missingDeps){
|
|
148
|
+
const installResult = await this.attemptDependencyInstallation(dep);
|
|
149
|
+
if (installResult.success) {
|
|
150
|
+
result.actions.push(`Installed/configured: ${dep}`);
|
|
151
|
+
} else {
|
|
152
|
+
result.warnings.push(`Could not install ${dep}: ${installResult.error}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Verify dependencies are now available
|
|
156
|
+
const verifyResult = await this.verifyDependencies(missingDeps);
|
|
157
|
+
if (!verifyResult.allAvailable) {
|
|
158
|
+
result.success = false;
|
|
159
|
+
result.errors.push('Some dependencies still unavailable after recovery');
|
|
160
|
+
}
|
|
161
|
+
} catch (error) {
|
|
162
|
+
result.success = false;
|
|
163
|
+
result.errors.push(`Dependency recovery failed: ${error.message}`);
|
|
182
164
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
// Verify dependencies are now available
|
|
186
|
-
const verifyResult = await this.verifyDependencies(missingDeps);
|
|
187
|
-
if (!verifyResult.allAvailable) {
|
|
188
|
-
result.success = false;
|
|
189
|
-
result.errors.push('Some dependencies still unavailable after recovery');
|
|
190
|
-
}
|
|
191
|
-
} catch (error) {
|
|
192
|
-
result.success = false;
|
|
193
|
-
result.errors.push(`Dependency recovery failed: ${error.message}`);
|
|
165
|
+
return result;
|
|
194
166
|
}
|
|
195
|
-
|
|
196
|
-
return result;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
167
|
+
/**
|
|
200
168
|
* Recover from corrupted configuration
|
|
201
|
-
*/
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
169
|
+
*/ async recoverFromCorruptedConfig(context) {
|
|
170
|
+
const result = {
|
|
171
|
+
success: true,
|
|
172
|
+
errors: [],
|
|
173
|
+
warnings: [],
|
|
174
|
+
actions: []
|
|
175
|
+
};
|
|
176
|
+
try {
|
|
177
|
+
const corruptedFiles = context.corruptedFiles || [
|
|
178
|
+
'.roomodes'
|
|
179
|
+
];
|
|
180
|
+
for (const file of corruptedFiles){
|
|
181
|
+
const recoveryResult = await this.recoverConfigFile(file);
|
|
182
|
+
if (recoveryResult.success) {
|
|
183
|
+
result.actions.push(`Recovered config file: ${file}`);
|
|
184
|
+
} else {
|
|
185
|
+
result.warnings.push(`Could not recover: ${file}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Validate recovered configuration
|
|
189
|
+
const validationResult = await this.validateRecoveredConfigs(corruptedFiles);
|
|
190
|
+
if (!validationResult.valid) {
|
|
191
|
+
result.warnings.push('Some recovered configs may have issues');
|
|
192
|
+
}
|
|
193
|
+
} catch (error) {
|
|
194
|
+
result.success = false;
|
|
195
|
+
result.errors.push(`Config recovery failed: ${error.message}`);
|
|
219
196
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
// Validate recovered configuration
|
|
223
|
-
const validationResult = await this.validateRecoveredConfigs(corruptedFiles);
|
|
224
|
-
if (!validationResult.valid) {
|
|
225
|
-
result.warnings.push('Some recovered configs may have issues');
|
|
226
|
-
}
|
|
227
|
-
} catch (error) {
|
|
228
|
-
result.success = false;
|
|
229
|
-
result.errors.push(`Config recovery failed: ${error.message}`);
|
|
197
|
+
return result;
|
|
230
198
|
}
|
|
231
|
-
|
|
232
|
-
return result;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
199
|
+
/**
|
|
236
200
|
* Recover from partial initialization
|
|
237
|
-
*/
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
201
|
+
*/ async recoverFromPartialInitialization(context) {
|
|
202
|
+
const result = {
|
|
203
|
+
success: true,
|
|
204
|
+
errors: [],
|
|
205
|
+
warnings: [],
|
|
206
|
+
actions: []
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
// Identify what was partially completed
|
|
210
|
+
const completedItems = await this.identifyCompletedItems();
|
|
211
|
+
const missingItems = await this.identifyMissingItems();
|
|
212
|
+
result.actions.push(`Found ${completedItems.length} completed items`);
|
|
213
|
+
result.actions.push(`Found ${missingItems.length} missing items`);
|
|
214
|
+
// Complete missing items
|
|
215
|
+
for (const item of missingItems){
|
|
216
|
+
const completionResult = await this.completeItem(item);
|
|
217
|
+
if (completionResult.success) {
|
|
218
|
+
result.actions.push(`Completed: ${item.name}`);
|
|
219
|
+
} else {
|
|
220
|
+
result.warnings.push(`Could not complete: ${item.name}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Verify initialization is now complete
|
|
224
|
+
const verificationResult = await this.verifyInitializationComplete();
|
|
225
|
+
if (!verificationResult.complete) {
|
|
226
|
+
result.success = false;
|
|
227
|
+
result.errors.push('Initialization still incomplete after recovery');
|
|
228
|
+
}
|
|
229
|
+
} catch (error) {
|
|
230
|
+
result.success = false;
|
|
231
|
+
result.errors.push(`Partial initialization recovery failed: ${error.message}`);
|
|
261
232
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
// Verify initialization is now complete
|
|
265
|
-
const verificationResult = await this.verifyInitializationComplete();
|
|
266
|
-
if (!verificationResult.complete) {
|
|
267
|
-
result.success = false;
|
|
268
|
-
result.errors.push('Initialization still incomplete after recovery');
|
|
269
|
-
}
|
|
270
|
-
} catch (error) {
|
|
271
|
-
result.success = false;
|
|
272
|
-
result.errors.push(`Partial initialization recovery failed: ${error.message}`);
|
|
233
|
+
return result;
|
|
273
234
|
}
|
|
274
|
-
|
|
275
|
-
return result;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
/**
|
|
235
|
+
/**
|
|
279
236
|
* Recover from SPARC initialization failure
|
|
280
|
-
*/
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
result.success = false;
|
|
315
|
-
result.errors.push(`SPARC recovery failed: ${error.message}`);
|
|
237
|
+
*/ async recoverFromSparcFailure(context) {
|
|
238
|
+
const result = {
|
|
239
|
+
success: true,
|
|
240
|
+
errors: [],
|
|
241
|
+
warnings: [],
|
|
242
|
+
actions: []
|
|
243
|
+
};
|
|
244
|
+
try {
|
|
245
|
+
// Try to recover .roomodes file
|
|
246
|
+
const roomodesRecovery = await this.recoverRoomodesFile();
|
|
247
|
+
if (roomodesRecovery.success) {
|
|
248
|
+
result.actions.push('Recovered .roomodes configuration');
|
|
249
|
+
} else {
|
|
250
|
+
result.warnings.push('Could not recover .roomodes');
|
|
251
|
+
}
|
|
252
|
+
// Try to recover .roo directory structure
|
|
253
|
+
const rooRecovery = await this.recoverRooDirectory();
|
|
254
|
+
if (rooRecovery.success) {
|
|
255
|
+
result.actions.push('Recovered .roo directory structure');
|
|
256
|
+
} else {
|
|
257
|
+
result.warnings.push('Could not recover .roo directory');
|
|
258
|
+
}
|
|
259
|
+
// Try to recover SPARC commands
|
|
260
|
+
const commandsRecovery = await this.recoverSparcCommands();
|
|
261
|
+
if (commandsRecovery.success) {
|
|
262
|
+
result.actions.push('Recovered SPARC commands');
|
|
263
|
+
} else {
|
|
264
|
+
result.warnings.push('Could not recover SPARC commands');
|
|
265
|
+
}
|
|
266
|
+
} catch (error) {
|
|
267
|
+
result.success = false;
|
|
268
|
+
result.errors.push(`SPARC recovery failed: ${error.message}`);
|
|
269
|
+
}
|
|
270
|
+
return result;
|
|
316
271
|
}
|
|
317
|
-
|
|
318
|
-
return result;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
272
|
+
/**
|
|
322
273
|
* Recover from executable creation failure
|
|
323
|
-
*/
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
274
|
+
*/ async recoverFromExecutableFailure(context) {
|
|
275
|
+
const result = {
|
|
276
|
+
success: true,
|
|
277
|
+
errors: [],
|
|
278
|
+
warnings: [],
|
|
279
|
+
actions: []
|
|
280
|
+
};
|
|
281
|
+
try {
|
|
282
|
+
// Try to recreate the executable
|
|
283
|
+
const executablePath = `${this.workingDir}/claude-flow`;
|
|
284
|
+
// Remove corrupted executable if it exists
|
|
285
|
+
try {
|
|
286
|
+
await Deno.remove(executablePath);
|
|
287
|
+
result.actions.push('Removed corrupted executable');
|
|
288
|
+
} catch {
|
|
289
|
+
// File doesn't exist
|
|
290
|
+
}
|
|
291
|
+
// Recreate executable
|
|
292
|
+
const createResult = await this.createExecutableWrapper();
|
|
293
|
+
if (createResult.success) {
|
|
294
|
+
result.actions.push('Recreated claude-flow-novice executable');
|
|
295
|
+
// Set permissions
|
|
296
|
+
if (Deno.build.os !== 'windows') {
|
|
297
|
+
try {
|
|
298
|
+
const command = new Deno.Command('chmod', {
|
|
299
|
+
args: [
|
|
300
|
+
'+x',
|
|
301
|
+
executablePath
|
|
302
|
+
]
|
|
303
|
+
});
|
|
304
|
+
await command.output();
|
|
305
|
+
result.actions.push('Set executable permissions');
|
|
306
|
+
} catch {
|
|
307
|
+
result.warnings.push('Could not set executable permissions');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
} else {
|
|
311
|
+
result.success = false;
|
|
312
|
+
result.errors.push('Could not recreate executable');
|
|
313
|
+
}
|
|
314
|
+
} catch (error) {
|
|
315
|
+
result.success = false;
|
|
316
|
+
result.errors.push(`Executable recovery failed: ${error.message}`);
|
|
360
317
|
}
|
|
361
|
-
|
|
362
|
-
result.success = false;
|
|
363
|
-
result.errors.push('Could not recreate executable');
|
|
364
|
-
}
|
|
365
|
-
} catch (error) {
|
|
366
|
-
result.success = false;
|
|
367
|
-
result.errors.push(`Executable recovery failed: ${error.message}`);
|
|
318
|
+
return result;
|
|
368
319
|
}
|
|
369
|
-
|
|
370
|
-
return result;
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
/**
|
|
320
|
+
/**
|
|
374
321
|
* Recover from memory setup failure
|
|
375
|
-
*/
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
};
|
|
383
|
-
|
|
384
|
-
try {
|
|
385
|
-
// Recreate memory directory structure
|
|
386
|
-
const memoryDirs = ['memory', 'memory/agents', 'memory/sessions'];
|
|
387
|
-
|
|
388
|
-
for (const dir of memoryDirs) {
|
|
389
|
-
try {
|
|
390
|
-
await Deno.mkdir(`${this.workingDir}/${dir}`, { recursive: true });
|
|
391
|
-
result.actions.push(`Created directory: ${dir}`);
|
|
392
|
-
} catch {
|
|
393
|
-
result.warnings.push(`Could not create directory: ${dir}`);
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
// Recreate memory data file
|
|
398
|
-
const memoryDataPath = `${this.workingDir}/memory/claude-flow-data.json`;
|
|
399
|
-
const initialData = {
|
|
400
|
-
agents: [],
|
|
401
|
-
tasks: [],
|
|
402
|
-
lastUpdated: Date.now(),
|
|
403
|
-
};
|
|
404
|
-
|
|
405
|
-
try {
|
|
406
|
-
await Deno.writeTextFile(memoryDataPath, JSON.stringify(initialData, null, 2));
|
|
407
|
-
result.actions.push('Recreated memory data file');
|
|
408
|
-
} catch {
|
|
409
|
-
result.warnings.push('Could not recreate memory data file');
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// Recreate README files
|
|
413
|
-
const readmeFiles = [
|
|
414
|
-
{
|
|
415
|
-
path: 'memory/agents/README.md',
|
|
416
|
-
content: '# Agent Memory\n\nThis directory stores agent-specific memory data.',
|
|
417
|
-
},
|
|
418
|
-
{
|
|
419
|
-
path: 'memory/sessions/README.md',
|
|
420
|
-
content: '# Session Memory\n\nThis directory stores session-specific memory data.',
|
|
421
|
-
},
|
|
422
|
-
];
|
|
423
|
-
|
|
424
|
-
for (const readme of readmeFiles) {
|
|
322
|
+
*/ async recoverFromMemorySetupFailure(context) {
|
|
323
|
+
const result = {
|
|
324
|
+
success: true,
|
|
325
|
+
errors: [],
|
|
326
|
+
warnings: [],
|
|
327
|
+
actions: []
|
|
328
|
+
};
|
|
425
329
|
try {
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
330
|
+
// Recreate memory directory structure
|
|
331
|
+
const memoryDirs = [
|
|
332
|
+
'memory',
|
|
333
|
+
'memory/agents',
|
|
334
|
+
'memory/sessions'
|
|
335
|
+
];
|
|
336
|
+
for (const dir of memoryDirs){
|
|
337
|
+
try {
|
|
338
|
+
await Deno.mkdir(`${this.workingDir}/${dir}`, {
|
|
339
|
+
recursive: true
|
|
340
|
+
});
|
|
341
|
+
result.actions.push(`Created directory: ${dir}`);
|
|
342
|
+
} catch {
|
|
343
|
+
result.warnings.push(`Could not create directory: ${dir}`);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Recreate memory data file
|
|
347
|
+
const memoryDataPath = `${this.workingDir}/memory/claude-flow-data.json`;
|
|
348
|
+
const initialData = {
|
|
349
|
+
agents: [],
|
|
350
|
+
tasks: [],
|
|
351
|
+
lastUpdated: Date.now()
|
|
352
|
+
};
|
|
353
|
+
try {
|
|
354
|
+
await Deno.writeTextFile(memoryDataPath, JSON.stringify(initialData, null, 2));
|
|
355
|
+
result.actions.push('Recreated memory data file');
|
|
356
|
+
} catch {
|
|
357
|
+
result.warnings.push('Could not recreate memory data file');
|
|
358
|
+
}
|
|
359
|
+
// Recreate README files
|
|
360
|
+
const readmeFiles = [
|
|
361
|
+
{
|
|
362
|
+
path: 'memory/agents/README.md',
|
|
363
|
+
content: '# Agent Memory\n\nThis directory stores agent-specific memory data.'
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
path: 'memory/sessions/README.md',
|
|
367
|
+
content: '# Session Memory\n\nThis directory stores session-specific memory data.'
|
|
368
|
+
}
|
|
369
|
+
];
|
|
370
|
+
for (const readme of readmeFiles){
|
|
371
|
+
try {
|
|
372
|
+
await Deno.writeTextFile(`${this.workingDir}/${readme.path}`, readme.content);
|
|
373
|
+
result.actions.push(`Created ${readme.path}`);
|
|
374
|
+
} catch {
|
|
375
|
+
result.warnings.push(`Could not create ${readme.path}`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
} catch (error) {
|
|
379
|
+
result.success = false;
|
|
380
|
+
result.errors.push(`Memory setup recovery failed: ${error.message}`);
|
|
430
381
|
}
|
|
431
|
-
|
|
432
|
-
} catch (error) {
|
|
433
|
-
result.success = false;
|
|
434
|
-
result.errors.push(`Memory setup recovery failed: ${error.message}`);
|
|
382
|
+
return result;
|
|
435
383
|
}
|
|
436
|
-
|
|
437
|
-
return result;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
/**
|
|
384
|
+
/**
|
|
441
385
|
* Generic recovery for unknown failure types
|
|
442
|
-
*/
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
result.warnings.push('Generic recovery may not fully resolve the issue');
|
|
472
|
-
} catch (error) {
|
|
473
|
-
result.success = false;
|
|
474
|
-
result.errors.push(`Generic recovery failed: ${error.message}`);
|
|
386
|
+
*/ async performGenericRecovery(failureType, context) {
|
|
387
|
+
const result = {
|
|
388
|
+
success: true,
|
|
389
|
+
errors: [],
|
|
390
|
+
warnings: [],
|
|
391
|
+
actions: []
|
|
392
|
+
};
|
|
393
|
+
try {
|
|
394
|
+
// Attempt common recovery procedures
|
|
395
|
+
// 1. Clean up temporary files
|
|
396
|
+
const tempCleanup = await this.cleanupTemporaryFiles();
|
|
397
|
+
result.actions.push(...tempCleanup.actions);
|
|
398
|
+
// 2. Verify basic file permissions
|
|
399
|
+
const permCheck = await this.verifyBasicPermissions();
|
|
400
|
+
if (!permCheck.adequate) {
|
|
401
|
+
result.warnings.push('Permission issues detected');
|
|
402
|
+
}
|
|
403
|
+
// 3. Check for common file conflicts
|
|
404
|
+
const conflictCheck = await this.checkForConflicts();
|
|
405
|
+
if (conflictCheck.conflicts.length > 0) {
|
|
406
|
+
result.warnings.push(`Found ${conflictCheck.conflicts.length} potential conflicts`);
|
|
407
|
+
}
|
|
408
|
+
result.actions.push(`Performed generic recovery for: ${failureType}`);
|
|
409
|
+
result.warnings.push('Generic recovery may not fully resolve the issue');
|
|
410
|
+
} catch (error) {
|
|
411
|
+
result.success = false;
|
|
412
|
+
result.errors.push(`Generic recovery failed: ${error.message}`);
|
|
413
|
+
}
|
|
414
|
+
return result;
|
|
475
415
|
}
|
|
476
|
-
|
|
477
|
-
return result;
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
/**
|
|
416
|
+
/**
|
|
481
417
|
* Validate recovery system
|
|
482
|
-
*/
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
418
|
+
*/ async validateRecoverySystem() {
|
|
419
|
+
const result = {
|
|
420
|
+
success: true,
|
|
421
|
+
errors: [],
|
|
422
|
+
warnings: []
|
|
423
|
+
};
|
|
424
|
+
try {
|
|
425
|
+
// Test recovery procedures
|
|
426
|
+
const recoveryTests = [
|
|
427
|
+
'permission-denied',
|
|
428
|
+
'disk-space',
|
|
429
|
+
'corrupted-config'
|
|
430
|
+
];
|
|
431
|
+
for (const test of recoveryTests){
|
|
432
|
+
const testResult = await this.testRecoveryProcedure(test);
|
|
433
|
+
if (!testResult.success) {
|
|
434
|
+
result.warnings.push(`Recovery test failed: ${test}`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
} catch (error) {
|
|
438
|
+
result.success = false;
|
|
439
|
+
result.errors.push(`Recovery system validation failed: ${error.message}`);
|
|
440
|
+
}
|
|
441
|
+
return result;
|
|
442
|
+
}
|
|
443
|
+
// Helper methods
|
|
444
|
+
async cleanupTemporaryFiles() {
|
|
445
|
+
const result = {
|
|
446
|
+
actions: []
|
|
447
|
+
};
|
|
448
|
+
const tempPatterns = [
|
|
449
|
+
'*.tmp',
|
|
450
|
+
'*.temp',
|
|
451
|
+
'.claude-flow-*-test*'
|
|
452
|
+
];
|
|
453
|
+
for (const pattern of tempPatterns){
|
|
454
|
+
try {
|
|
455
|
+
// Simple cleanup - in a real implementation, use glob matching
|
|
456
|
+
result.actions.push(`Cleaned temporary files: ${pattern}`);
|
|
457
|
+
} catch {
|
|
458
|
+
// Continue with other patterns
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
return result;
|
|
462
|
+
}
|
|
463
|
+
async cleanupOldBackups() {
|
|
464
|
+
const result = {
|
|
465
|
+
actions: []
|
|
466
|
+
};
|
|
467
|
+
try {
|
|
468
|
+
const backupDir = `${this.workingDir}/.claude-flow-backups`;
|
|
469
|
+
// This would normally integrate with BackupManager
|
|
470
|
+
result.actions.push('Cleaned old backups');
|
|
471
|
+
} catch {
|
|
472
|
+
// Backup cleanup not critical
|
|
473
|
+
}
|
|
474
|
+
return result;
|
|
475
|
+
}
|
|
476
|
+
async checkAvailableSpace() {
|
|
477
|
+
try {
|
|
478
|
+
const command = new Deno.Command('df', {
|
|
479
|
+
args: [
|
|
480
|
+
'-m',
|
|
481
|
+
this.workingDir
|
|
482
|
+
],
|
|
483
|
+
stdout: 'piped'
|
|
484
|
+
});
|
|
485
|
+
const { stdout, success } = await command.output();
|
|
486
|
+
if (success) {
|
|
487
|
+
const output = new TextDecoder().decode(stdout);
|
|
488
|
+
const lines = output.trim().split('\n');
|
|
489
|
+
if (lines.length >= 2) {
|
|
490
|
+
const parts = lines[1].split(/\s+/);
|
|
491
|
+
if (parts.length >= 4) {
|
|
492
|
+
return {
|
|
493
|
+
available: parseInt(parts[3])
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
} catch {
|
|
499
|
+
// Can't check space
|
|
498
500
|
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
result.errors.push(`Recovery system validation failed: ${error.message}`);
|
|
501
|
+
return {
|
|
502
|
+
available: 1000
|
|
503
|
+
}; // Assume adequate
|
|
503
504
|
}
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
const tempPatterns = ['*.tmp', '*.temp', '.claude-flow-*-test*'];
|
|
514
|
-
|
|
515
|
-
for (const pattern of tempPatterns) {
|
|
516
|
-
try {
|
|
517
|
-
// Simple cleanup - in a real implementation, use glob matching
|
|
518
|
-
result.actions.push(`Cleaned temporary files: ${pattern}`);
|
|
519
|
-
} catch {
|
|
520
|
-
// Continue with other patterns
|
|
521
|
-
}
|
|
505
|
+
async attemptDependencyInstallation(dependency) {
|
|
506
|
+
const result = {
|
|
507
|
+
success: false,
|
|
508
|
+
error: null
|
|
509
|
+
};
|
|
510
|
+
// This would contain actual dependency installation logic
|
|
511
|
+
// For now, just simulate
|
|
512
|
+
result.success = true;
|
|
513
|
+
return result;
|
|
522
514
|
}
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
515
|
+
async verifyDependencies(dependencies) {
|
|
516
|
+
const result = {
|
|
517
|
+
allAvailable: true,
|
|
518
|
+
missing: []
|
|
519
|
+
};
|
|
520
|
+
for (const dep of dependencies){
|
|
521
|
+
try {
|
|
522
|
+
const command = new Deno.Command(dep, {
|
|
523
|
+
args: [
|
|
524
|
+
'--version'
|
|
525
|
+
],
|
|
526
|
+
stdout: 'piped',
|
|
527
|
+
stderr: 'piped'
|
|
528
|
+
});
|
|
529
|
+
const { success } = await command.output();
|
|
530
|
+
if (!success) {
|
|
531
|
+
result.allAvailable = false;
|
|
532
|
+
result.missing.push(dep);
|
|
533
|
+
}
|
|
534
|
+
} catch {
|
|
535
|
+
result.allAvailable = false;
|
|
536
|
+
result.missing.push(dep);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
return result;
|
|
540
|
+
}
|
|
541
|
+
async recoverConfigFile(filename) {
|
|
542
|
+
const result = {
|
|
543
|
+
success: true
|
|
544
|
+
};
|
|
545
|
+
// This would contain config file recovery logic
|
|
546
|
+
// Generate default config based on filename
|
|
547
|
+
return result;
|
|
548
|
+
}
|
|
549
|
+
async validateRecoveredConfigs(filenames) {
|
|
550
|
+
return {
|
|
551
|
+
valid: true
|
|
552
|
+
};
|
|
537
553
|
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
if (lines.length >= 2) {
|
|
556
|
-
const parts = lines[1].split(/\s+/);
|
|
557
|
-
if (parts.length >= 4) {
|
|
558
|
-
return { available: parseInt(parts[3]) };
|
|
559
|
-
}
|
|
554
|
+
async identifyCompletedItems() {
|
|
555
|
+
const items = [];
|
|
556
|
+
const checkFiles = [
|
|
557
|
+
'CLAUDE.md',
|
|
558
|
+
'memory-bank.md',
|
|
559
|
+
'coordination.md'
|
|
560
|
+
];
|
|
561
|
+
for (const file of checkFiles){
|
|
562
|
+
try {
|
|
563
|
+
await Deno.stat(`${this.workingDir}/${file}`);
|
|
564
|
+
items.push({
|
|
565
|
+
name: file,
|
|
566
|
+
type: 'file'
|
|
567
|
+
});
|
|
568
|
+
} catch {
|
|
569
|
+
// File doesn't exist
|
|
570
|
+
}
|
|
560
571
|
}
|
|
561
|
-
|
|
562
|
-
} catch {
|
|
563
|
-
// Can't check space
|
|
572
|
+
return items;
|
|
564
573
|
}
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
const result = {
|
|
583
|
-
allAvailable: true,
|
|
584
|
-
missing: [],
|
|
585
|
-
};
|
|
586
|
-
|
|
587
|
-
for (const dep of dependencies) {
|
|
588
|
-
try {
|
|
589
|
-
const command = new Deno.Command(dep, {
|
|
590
|
-
args: ['--version'],
|
|
591
|
-
stdout: 'piped',
|
|
592
|
-
stderr: 'piped',
|
|
593
|
-
});
|
|
594
|
-
|
|
595
|
-
const { success } = await command.output();
|
|
596
|
-
if (!success) {
|
|
597
|
-
result.allAvailable = false;
|
|
598
|
-
result.missing.push(dep);
|
|
574
|
+
async identifyMissingItems() {
|
|
575
|
+
const missing = [];
|
|
576
|
+
const requiredFiles = [
|
|
577
|
+
'CLAUDE.md',
|
|
578
|
+
'memory-bank.md',
|
|
579
|
+
'coordination.md',
|
|
580
|
+
'claude-flow'
|
|
581
|
+
];
|
|
582
|
+
for (const file of requiredFiles){
|
|
583
|
+
try {
|
|
584
|
+
await Deno.stat(`${this.workingDir}/${file}`);
|
|
585
|
+
} catch {
|
|
586
|
+
missing.push({
|
|
587
|
+
name: file,
|
|
588
|
+
type: 'file'
|
|
589
|
+
});
|
|
590
|
+
}
|
|
599
591
|
}
|
|
600
|
-
|
|
601
|
-
result.allAvailable = false;
|
|
602
|
-
result.missing.push(dep);
|
|
603
|
-
}
|
|
592
|
+
return missing;
|
|
604
593
|
}
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
success: true,
|
|
612
|
-
};
|
|
613
|
-
|
|
614
|
-
// This would contain config file recovery logic
|
|
615
|
-
// Generate default config based on filename
|
|
616
|
-
|
|
617
|
-
return result;
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
async validateRecoveredConfigs(filenames) {
|
|
621
|
-
return { valid: true };
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
async identifyCompletedItems() {
|
|
625
|
-
const items = [];
|
|
626
|
-
|
|
627
|
-
const checkFiles = ['CLAUDE.md', 'memory-bank.md', 'coordination.md'];
|
|
628
|
-
|
|
629
|
-
for (const file of checkFiles) {
|
|
630
|
-
try {
|
|
631
|
-
await Deno.stat(`${this.workingDir}/${file}`);
|
|
632
|
-
items.push({ name: file, type: 'file' });
|
|
633
|
-
} catch {
|
|
634
|
-
// File doesn't exist
|
|
635
|
-
}
|
|
594
|
+
async completeItem(item) {
|
|
595
|
+
const result = {
|
|
596
|
+
success: true
|
|
597
|
+
};
|
|
598
|
+
// This would contain item completion logic based on item type
|
|
599
|
+
return result;
|
|
636
600
|
}
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
601
|
+
async verifyInitializationComplete() {
|
|
602
|
+
return {
|
|
603
|
+
complete: true
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
async recoverRoomodesFile() {
|
|
607
|
+
const result = {
|
|
608
|
+
success: true
|
|
609
|
+
};
|
|
610
|
+
// Generate basic .roomodes content
|
|
611
|
+
const basicRoomodes = {
|
|
612
|
+
version: '1.0',
|
|
613
|
+
modes: {
|
|
614
|
+
architect: {
|
|
615
|
+
description: 'System design and architecture planning'
|
|
616
|
+
},
|
|
617
|
+
code: {
|
|
618
|
+
description: 'Clean, modular code implementation'
|
|
619
|
+
},
|
|
620
|
+
tdd: {
|
|
621
|
+
description: 'Test-driven development and testing'
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
};
|
|
625
|
+
try {
|
|
626
|
+
await Deno.writeTextFile(`${this.workingDir}/.roomodes`, JSON.stringify(basicRoomodes, null, 2));
|
|
627
|
+
} catch {
|
|
628
|
+
result.success = false;
|
|
629
|
+
}
|
|
630
|
+
return result;
|
|
652
631
|
}
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
success: true,
|
|
674
|
-
};
|
|
675
|
-
|
|
676
|
-
// Generate basic .roomodes content
|
|
677
|
-
const basicRoomodes = {
|
|
678
|
-
version: '1.0',
|
|
679
|
-
modes: {
|
|
680
|
-
architect: {
|
|
681
|
-
description: 'System design and architecture planning',
|
|
682
|
-
},
|
|
683
|
-
code: {
|
|
684
|
-
description: 'Clean, modular code implementation',
|
|
685
|
-
},
|
|
686
|
-
tdd: {
|
|
687
|
-
description: 'Test-driven development and testing',
|
|
688
|
-
},
|
|
689
|
-
},
|
|
690
|
-
};
|
|
691
|
-
|
|
692
|
-
try {
|
|
693
|
-
await Deno.writeTextFile(
|
|
694
|
-
`${this.workingDir}/.roomodes`,
|
|
695
|
-
JSON.stringify(basicRoomodes, null, 2),
|
|
696
|
-
);
|
|
697
|
-
} catch {
|
|
698
|
-
result.success = false;
|
|
632
|
+
async recoverRooDirectory() {
|
|
633
|
+
const result = {
|
|
634
|
+
success: true
|
|
635
|
+
};
|
|
636
|
+
try {
|
|
637
|
+
const rooDirs = [
|
|
638
|
+
'.roo',
|
|
639
|
+
'.roo/templates',
|
|
640
|
+
'.roo/workflows',
|
|
641
|
+
'.roo/modes'
|
|
642
|
+
];
|
|
643
|
+
for (const dir of rooDirs){
|
|
644
|
+
await Deno.mkdir(`${this.workingDir}/${dir}`, {
|
|
645
|
+
recursive: true
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
} catch {
|
|
649
|
+
result.success = false;
|
|
650
|
+
}
|
|
651
|
+
return result;
|
|
699
652
|
}
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
success: true,
|
|
707
|
-
};
|
|
708
|
-
|
|
709
|
-
try {
|
|
710
|
-
const rooDirs = ['.roo', '.roo/templates', '.roo/workflows', '.roo/modes'];
|
|
711
|
-
|
|
712
|
-
for (const dir of rooDirs) {
|
|
713
|
-
await Deno.mkdir(`${this.workingDir}/${dir}`, { recursive: true });
|
|
714
|
-
}
|
|
715
|
-
} catch {
|
|
716
|
-
result.success = false;
|
|
653
|
+
async recoverSparcCommands() {
|
|
654
|
+
const result = {
|
|
655
|
+
success: true
|
|
656
|
+
};
|
|
657
|
+
// This would recreate SPARC command files
|
|
658
|
+
return result;
|
|
717
659
|
}
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
const result = {
|
|
724
|
-
success: true,
|
|
725
|
-
};
|
|
726
|
-
|
|
727
|
-
// This would recreate SPARC command files
|
|
728
|
-
return result;
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
async createExecutableWrapper() {
|
|
732
|
-
const result = {
|
|
733
|
-
success: true,
|
|
734
|
-
};
|
|
735
|
-
|
|
736
|
-
const executableContent = `#!/usr/bin/env bash
|
|
660
|
+
async createExecutableWrapper() {
|
|
661
|
+
const result = {
|
|
662
|
+
success: true
|
|
663
|
+
};
|
|
664
|
+
const executableContent = `#!/usr/bin/env bash
|
|
737
665
|
# Claude Flow Local Executable Wrapper
|
|
738
666
|
exec deno run --allow-all --unstable-kv --unstable-cron \\
|
|
739
667
|
"${import.meta.url.replace('file://', '').replace(/[^/]*$/, '../../../main.js')}" "$@"
|
|
740
668
|
`;
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
669
|
+
try {
|
|
670
|
+
await Deno.writeTextFile(`${this.workingDir}/claude-flow`, executableContent);
|
|
671
|
+
} catch {
|
|
672
|
+
result.success = false;
|
|
673
|
+
}
|
|
674
|
+
return result;
|
|
675
|
+
}
|
|
676
|
+
async verifyBasicPermissions() {
|
|
677
|
+
const result = {
|
|
678
|
+
adequate: true
|
|
679
|
+
};
|
|
680
|
+
try {
|
|
681
|
+
const testFile = `${this.workingDir}/.permission-test`;
|
|
682
|
+
await Deno.writeTextFile(testFile, 'test');
|
|
683
|
+
await Deno.remove(testFile);
|
|
684
|
+
} catch {
|
|
685
|
+
result.adequate = false;
|
|
686
|
+
}
|
|
687
|
+
return result;
|
|
688
|
+
}
|
|
689
|
+
async checkForConflicts() {
|
|
690
|
+
return {
|
|
691
|
+
conflicts: []
|
|
692
|
+
};
|
|
693
|
+
}
|
|
694
|
+
async testRecoveryProcedure(procedureName) {
|
|
695
|
+
return {
|
|
696
|
+
success: true
|
|
697
|
+
};
|
|
746
698
|
}
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
async verifyBasicPermissions() {
|
|
752
|
-
const result = {
|
|
753
|
-
adequate: true,
|
|
754
|
-
};
|
|
755
|
-
|
|
756
|
-
try {
|
|
757
|
-
const testFile = `${this.workingDir}/.permission-test`;
|
|
758
|
-
await Deno.writeTextFile(testFile, 'test');
|
|
759
|
-
await Deno.remove(testFile);
|
|
760
|
-
} catch {
|
|
761
|
-
result.adequate = false;
|
|
699
|
+
constructor(workingDir){
|
|
700
|
+
this.workingDir = workingDir;
|
|
762
701
|
}
|
|
763
|
-
|
|
764
|
-
return result;
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
async checkForConflicts() {
|
|
768
|
-
return {
|
|
769
|
-
conflicts: [],
|
|
770
|
-
};
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
async testRecoveryProcedure(procedureName) {
|
|
774
|
-
return {
|
|
775
|
-
success: true,
|
|
776
|
-
};
|
|
777
|
-
}
|
|
778
702
|
}
|