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,387 +1,336 @@
|
|
|
1
|
-
import { promises as fs } from
|
|
1
|
+
import { promises as fs } from "fs";
|
|
2
2
|
// mode-validator.js - SPARC mode functionality testing
|
|
3
|
-
|
|
4
3
|
export class ModeValidator {
|
|
5
|
-
|
|
6
|
-
this.workingDir = workingDir;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/**
|
|
4
|
+
/**
|
|
10
5
|
* Test all SPARC modes for basic functionality
|
|
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
|
-
|
|
6
|
+
*/ async testAllModes() {
|
|
7
|
+
const result = {
|
|
8
|
+
success: true,
|
|
9
|
+
errors: [],
|
|
10
|
+
warnings: [],
|
|
11
|
+
modes: {}
|
|
12
|
+
};
|
|
13
|
+
try {
|
|
14
|
+
// First, check if SPARC is initialized
|
|
15
|
+
const sparcInitialized = await this.checkSparcInitialization();
|
|
16
|
+
if (!sparcInitialized.initialized) {
|
|
17
|
+
result.warnings.push('SPARC not initialized - mode testing skipped');
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
// Get available modes
|
|
21
|
+
const availableModes = await this.getAvailableModes();
|
|
22
|
+
if (availableModes.length === 0) {
|
|
23
|
+
result.warnings.push('No SPARC modes found for testing');
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
// Test each mode
|
|
27
|
+
for (const mode of availableModes){
|
|
28
|
+
const modeTest = await this.testMode(mode);
|
|
29
|
+
result.modes[mode] = modeTest;
|
|
30
|
+
if (!modeTest.success) {
|
|
31
|
+
result.success = false;
|
|
32
|
+
result.errors.push(`Mode ${mode} failed testing: ${modeTest.error}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
} catch (error) {
|
|
36
|
+
result.success = false;
|
|
37
|
+
result.errors.push(`Mode testing failed: ${error.message}`);
|
|
43
38
|
}
|
|
44
|
-
|
|
45
|
-
} catch (error) {
|
|
46
|
-
result.success = false;
|
|
47
|
-
result.errors.push(`Mode testing failed: ${error.message}`);
|
|
39
|
+
return result;
|
|
48
40
|
}
|
|
49
|
-
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
41
|
+
/**
|
|
54
42
|
* Test a specific SPARC mode
|
|
55
|
-
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
43
|
+
*/ async testMode(modeName) {
|
|
44
|
+
const result = {
|
|
45
|
+
success: true,
|
|
46
|
+
error: null,
|
|
47
|
+
checks: {
|
|
48
|
+
accessible: false,
|
|
49
|
+
configValid: false,
|
|
50
|
+
executable: false
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
// Test 1: Check if mode is accessible via CLI
|
|
55
|
+
const accessTest = await this.testModeAccess(modeName);
|
|
56
|
+
result.checks.accessible = accessTest.success;
|
|
57
|
+
if (!accessTest.success) {
|
|
58
|
+
result.success = false;
|
|
59
|
+
result.error = accessTest.error;
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
// Test 2: Validate mode configuration
|
|
63
|
+
const configTest = await this.testModeConfig(modeName);
|
|
64
|
+
result.checks.configValid = configTest.success;
|
|
65
|
+
if (!configTest.success) {
|
|
66
|
+
result.success = false;
|
|
67
|
+
result.error = configTest.error;
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
// Test 3: Test mode execution (dry run)
|
|
71
|
+
const execTest = await this.testModeExecution(modeName);
|
|
72
|
+
result.checks.executable = execTest.success;
|
|
73
|
+
if (!execTest.success) {
|
|
74
|
+
result.success = false;
|
|
75
|
+
result.error = execTest.error;
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
} catch (error) {
|
|
79
|
+
result.success = false;
|
|
80
|
+
result.error = error.message;
|
|
81
|
+
}
|
|
92
82
|
return result;
|
|
93
|
-
}
|
|
94
|
-
} catch (error) {
|
|
95
|
-
result.success = false;
|
|
96
|
-
result.error = error.message;
|
|
97
83
|
}
|
|
98
|
-
|
|
99
|
-
return result;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
84
|
+
/**
|
|
103
85
|
* Check if SPARC is properly initialized
|
|
104
|
-
*/
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
} catch (error) {
|
|
132
|
-
result.error = error.message;
|
|
86
|
+
*/ async checkSparcInitialization() {
|
|
87
|
+
const result = {
|
|
88
|
+
initialized: false,
|
|
89
|
+
hasRoomodes: false,
|
|
90
|
+
hasExecutable: false,
|
|
91
|
+
error: null
|
|
92
|
+
};
|
|
93
|
+
try {
|
|
94
|
+
// Check for .roomodes file
|
|
95
|
+
try {
|
|
96
|
+
const stat = await Deno.stat(`${this.workingDir}/.roomodes`);
|
|
97
|
+
result.hasRoomodes = stat.isFile;
|
|
98
|
+
} catch {
|
|
99
|
+
result.error = '.roomodes file not found';
|
|
100
|
+
}
|
|
101
|
+
// Check for claude-flow-novice executable
|
|
102
|
+
try {
|
|
103
|
+
const stat = await Deno.stat(`${this.workingDir}/claude-flow`);
|
|
104
|
+
result.hasExecutable = stat.isFile;
|
|
105
|
+
} catch {
|
|
106
|
+
result.error = 'claude-flow-novice executable not found';
|
|
107
|
+
}
|
|
108
|
+
result.initialized = result.hasRoomodes && result.hasExecutable;
|
|
109
|
+
} catch (error) {
|
|
110
|
+
result.error = error.message;
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
133
113
|
}
|
|
134
|
-
|
|
135
|
-
return result;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
114
|
+
/**
|
|
139
115
|
* Get list of available SPARC modes
|
|
140
|
-
*/
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
modes.push(
|
|
156
|
-
'architect',
|
|
157
|
-
'code',
|
|
158
|
-
'tdd',
|
|
159
|
-
'spec-pseudocode',
|
|
160
|
-
'integration',
|
|
161
|
-
'debug',
|
|
162
|
-
'docs-writer',
|
|
163
|
-
);
|
|
116
|
+
*/ async getAvailableModes() {
|
|
117
|
+
const modes = [];
|
|
118
|
+
try {
|
|
119
|
+
// Try to get modes from .roomodes
|
|
120
|
+
const roomodesPath = `${this.workingDir}/.roomodes`;
|
|
121
|
+
const content = await fs.readFile(roomodesPath, 'utf8');
|
|
122
|
+
const config = JSON.parse(content);
|
|
123
|
+
if (config.modes && typeof config.modes === 'object') {
|
|
124
|
+
modes.push(...Object.keys(config.modes));
|
|
125
|
+
}
|
|
126
|
+
} catch (error) {
|
|
127
|
+
// Fallback to common modes
|
|
128
|
+
modes.push('architect', 'code', 'tdd', 'spec-pseudocode', 'integration', 'debug', 'docs-writer');
|
|
129
|
+
}
|
|
130
|
+
return modes;
|
|
164
131
|
}
|
|
165
|
-
|
|
166
|
-
return modes;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
132
|
+
/**
|
|
170
133
|
* Test if a mode is accessible via CLI
|
|
171
|
-
*/
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
134
|
+
*/ async testModeAccess(modeName) {
|
|
135
|
+
const result = {
|
|
136
|
+
success: false,
|
|
137
|
+
error: null
|
|
138
|
+
};
|
|
139
|
+
try {
|
|
140
|
+
// Test with sparc info command
|
|
141
|
+
const command = new Deno.Command('./claude-flow', {
|
|
142
|
+
args: [
|
|
143
|
+
'sparc',
|
|
144
|
+
'info',
|
|
145
|
+
modeName
|
|
146
|
+
],
|
|
147
|
+
cwd: this.workingDir,
|
|
148
|
+
stdout: 'piped',
|
|
149
|
+
stderr: 'piped'
|
|
150
|
+
});
|
|
151
|
+
const { success, stdout, stderr } = await command.output();
|
|
152
|
+
if (success) {
|
|
153
|
+
result.success = true;
|
|
154
|
+
} else {
|
|
155
|
+
const errorOutput = new TextDecoder().decode(stderr);
|
|
156
|
+
result.error = `Mode not accessible: ${errorOutput}`;
|
|
157
|
+
}
|
|
158
|
+
} catch (error) {
|
|
159
|
+
result.error = `Failed to test mode access: ${error.message}`;
|
|
160
|
+
}
|
|
161
|
+
return result;
|
|
197
162
|
}
|
|
198
|
-
|
|
199
|
-
return result;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
163
|
+
/**
|
|
203
164
|
* Test mode configuration validity
|
|
204
|
-
*/
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
165
|
+
*/ async testModeConfig(modeName) {
|
|
166
|
+
const result = {
|
|
167
|
+
success: false,
|
|
168
|
+
error: null
|
|
169
|
+
};
|
|
170
|
+
try {
|
|
171
|
+
// Read .roomodes and validate mode config
|
|
172
|
+
const roomodesPath = `${this.workingDir}/.roomodes`;
|
|
173
|
+
const content = await fs.readFile(roomodesPath, 'utf8');
|
|
174
|
+
const config = JSON.parse(content);
|
|
175
|
+
if (!config.modes || !config.modes[modeName]) {
|
|
176
|
+
result.error = `Mode ${modeName} not found in configuration`;
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
const modeConfig = config.modes[modeName];
|
|
180
|
+
// Basic validation
|
|
181
|
+
if (typeof modeConfig !== 'object') {
|
|
182
|
+
result.error = `Invalid configuration for mode ${modeName}`;
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
// Check for required fields
|
|
186
|
+
const requiredFields = [
|
|
187
|
+
'description'
|
|
188
|
+
];
|
|
189
|
+
for (const field of requiredFields){
|
|
190
|
+
if (!modeConfig[field]) {
|
|
191
|
+
result.error = `Mode ${modeName} missing required field: ${field}`;
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
result.success = true;
|
|
196
|
+
} catch (error) {
|
|
197
|
+
result.error = `Configuration validation failed: ${error.message}`;
|
|
236
198
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
result.success = true;
|
|
240
|
-
} catch (error) {
|
|
241
|
-
result.error = `Configuration validation failed: ${error.message}`;
|
|
199
|
+
return result;
|
|
242
200
|
}
|
|
243
|
-
|
|
244
|
-
return result;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
201
|
+
/**
|
|
248
202
|
* Test mode execution with a safe dry run
|
|
249
|
-
*/
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
203
|
+
*/ async testModeExecution(modeName) {
|
|
204
|
+
const result = {
|
|
205
|
+
success: false,
|
|
206
|
+
error: null
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
// Test with a safe, non-destructive command
|
|
210
|
+
const command = new Deno.Command('./claude-flow', {
|
|
211
|
+
args: [
|
|
212
|
+
'sparc',
|
|
213
|
+
'run',
|
|
214
|
+
modeName,
|
|
215
|
+
'test validation',
|
|
216
|
+
'--dry-run'
|
|
217
|
+
],
|
|
218
|
+
cwd: this.workingDir,
|
|
219
|
+
stdout: 'piped',
|
|
220
|
+
stderr: 'piped'
|
|
221
|
+
});
|
|
222
|
+
const { success, stdout, stderr } = await command.output();
|
|
223
|
+
if (success) {
|
|
224
|
+
result.success = true;
|
|
225
|
+
} else {
|
|
226
|
+
// Check if it's just because --dry-run isn't supported
|
|
227
|
+
const errorOutput = new TextDecoder().decode(stderr);
|
|
228
|
+
if (errorOutput.includes('dry-run') || errorOutput.includes('unknown flag')) {
|
|
229
|
+
// Try without dry-run but with a safe test task
|
|
230
|
+
const testCommand = new Deno.Command('./claude-flow', {
|
|
231
|
+
args: [
|
|
232
|
+
'sparc',
|
|
233
|
+
'modes'
|
|
234
|
+
],
|
|
235
|
+
cwd: this.workingDir,
|
|
236
|
+
stdout: 'piped',
|
|
237
|
+
stderr: 'piped'
|
|
238
|
+
});
|
|
239
|
+
const testResult = await testCommand.output();
|
|
240
|
+
if (testResult.success) {
|
|
241
|
+
const output = new TextDecoder().decode(testResult.stdout);
|
|
242
|
+
result.success = output.includes(modeName);
|
|
243
|
+
if (!result.success) {
|
|
244
|
+
result.error = `Mode ${modeName} not listed in available modes`;
|
|
245
|
+
}
|
|
246
|
+
} else {
|
|
247
|
+
result.error = `Mode execution test failed: ${errorOutput}`;
|
|
248
|
+
}
|
|
249
|
+
} else {
|
|
250
|
+
result.error = `Mode execution failed: ${errorOutput}`;
|
|
251
|
+
}
|
|
287
252
|
}
|
|
288
|
-
|
|
289
|
-
result.error = `
|
|
290
|
-
}
|
|
291
|
-
} else {
|
|
292
|
-
result.error = `Mode execution failed: ${errorOutput}`;
|
|
253
|
+
} catch (error) {
|
|
254
|
+
result.error = `Execution test failed: ${error.message}`;
|
|
293
255
|
}
|
|
294
|
-
|
|
295
|
-
} catch (error) {
|
|
296
|
-
result.error = `Execution test failed: ${error.message}`;
|
|
256
|
+
return result;
|
|
297
257
|
}
|
|
298
|
-
|
|
299
|
-
return result;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
258
|
+
/**
|
|
303
259
|
* Test SPARC workflow functionality
|
|
304
|
-
*/
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
260
|
+
*/ async testWorkflowFunctionality() {
|
|
261
|
+
const result = {
|
|
262
|
+
success: true,
|
|
263
|
+
errors: [],
|
|
264
|
+
warnings: [],
|
|
265
|
+
workflows: {}
|
|
266
|
+
};
|
|
267
|
+
try {
|
|
268
|
+
// Check for workflow files
|
|
269
|
+
const workflowDir = `${this.workingDir}/.roo/workflows`;
|
|
270
|
+
try {
|
|
271
|
+
const entries = [];
|
|
272
|
+
for await (const entry of Deno.readDir(workflowDir)){
|
|
273
|
+
if (entry.isFile && entry.name.endsWith('.json')) {
|
|
274
|
+
entries.push(entry.name);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Test each workflow file
|
|
278
|
+
for (const workflowFile of entries){
|
|
279
|
+
const workflowTest = await this.testWorkflowFile(workflowFile);
|
|
280
|
+
result.workflows[workflowFile] = workflowTest;
|
|
281
|
+
if (!workflowTest.success) {
|
|
282
|
+
result.warnings.push(`Workflow ${workflowFile} has issues: ${workflowTest.error}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (entries.length === 0) {
|
|
286
|
+
result.warnings.push('No workflow files found');
|
|
287
|
+
}
|
|
288
|
+
} catch {
|
|
289
|
+
result.warnings.push('Workflow directory not accessible');
|
|
290
|
+
}
|
|
291
|
+
} catch (error) {
|
|
292
|
+
result.errors.push(`Workflow testing failed: ${error.message}`);
|
|
337
293
|
}
|
|
338
|
-
|
|
339
|
-
result.warnings.push('Workflow directory not accessible');
|
|
340
|
-
}
|
|
341
|
-
} catch (error) {
|
|
342
|
-
result.errors.push(`Workflow testing failed: ${error.message}`);
|
|
294
|
+
return result;
|
|
343
295
|
}
|
|
344
|
-
|
|
345
|
-
return result;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
/**
|
|
296
|
+
/**
|
|
349
297
|
* Test a specific workflow file
|
|
350
|
-
*/
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
298
|
+
*/ async testWorkflowFile(filename) {
|
|
299
|
+
const result = {
|
|
300
|
+
success: true,
|
|
301
|
+
error: null
|
|
302
|
+
};
|
|
303
|
+
try {
|
|
304
|
+
const workflowPath = `${this.workingDir}/.roo/workflows/${filename}`;
|
|
305
|
+
const content = await fs.readFile(workflowPath, 'utf8');
|
|
306
|
+
// Parse JSON
|
|
307
|
+
const workflow = JSON.parse(content);
|
|
308
|
+
// Basic validation
|
|
309
|
+
if (typeof workflow !== 'object' || workflow === null) {
|
|
310
|
+
result.success = false;
|
|
311
|
+
result.error = 'Workflow must be a JSON object';
|
|
312
|
+
return result;
|
|
313
|
+
}
|
|
314
|
+
// Check for recommended fields
|
|
315
|
+
const recommendedFields = [
|
|
316
|
+
'name',
|
|
317
|
+
'description',
|
|
318
|
+
'steps'
|
|
319
|
+
];
|
|
320
|
+
for (const field of recommendedFields){
|
|
321
|
+
if (!(field in workflow)) {
|
|
322
|
+
result.success = false;
|
|
323
|
+
result.error = `Missing recommended field: ${field}`;
|
|
324
|
+
return result;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
} catch (error) {
|
|
328
|
+
result.success = false;
|
|
329
|
+
result.error = `Workflow validation failed: ${error.message}`;
|
|
378
330
|
}
|
|
379
|
-
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
constructor(workingDir){
|
|
334
|
+
this.workingDir = workingDir;
|
|
383
335
|
}
|
|
384
|
-
|
|
385
|
-
return result;
|
|
386
|
-
}
|
|
387
336
|
}
|