claude-flow-novice 1.3.0 â 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-flow-novice/preferences/generation.json +147 -0
- package/.claude-flow-novice/preferences/language-configs/javascript.json +51 -0
- package/.claude-flow-novice/preferences/language-configs/python.json +50 -0
- package/.claude-flow-novice/preferences/language-configs/rust.json +237 -0
- package/.claude-flow-novice/preferences/language-configs/typescript.json +54 -0
- package/.claude-flow-novice/preferences/project-local.json +91 -0
- package/.claude-flow-novice/preferences/resource-delegation.json +120 -0
- package/.claude-flow-novice/preferences/team-shared.json +195 -0
- package/.claude-flow-novice/preferences/user-global.json +247 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-JAVASCRIPT.md +769 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-PYTHON.md +1214 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-RUST.md +475 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-TYPESCRIPT.md +851 -0
- package/.claude-flow-novice/templates/claude-md-templates/README.md +263 -0
- package/CLAUDE.md +81 -0
- package/README-NPM.md +0 -0
- package/package.json +11 -7
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/migration/README.md +434 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/src/cli/simple-commands/__tests__/agent.test.js +291 -0
- package/src/cli/simple-commands/__tests__/memory.test.js +8 -0
- package/src/cli/simple-commands/__tests__/swarm.test.js +371 -0
- package/src/cli/simple-commands/__tests__/task.test.js +8 -0
- package/src/cli/simple-commands/agent.js +216 -0
- package/src/cli/simple-commands/analysis.js +570 -0
- package/src/cli/simple-commands/automation-executor.js +1603 -0
- package/src/cli/simple-commands/automation.js +627 -0
- package/src/cli/simple-commands/batch-manager.js +338 -0
- package/src/cli/simple-commands/claude-telemetry.js +311 -0
- package/src/cli/simple-commands/claude-track.js +102 -0
- package/src/cli/simple-commands/concurrent-display.js +348 -0
- package/src/cli/simple-commands/config.js +319 -0
- package/src/cli/simple-commands/coordination.js +307 -0
- package/src/cli/simple-commands/enhanced-ui-views.js +654 -0
- package/src/cli/simple-commands/enhanced-webui-complete.js +1038 -0
- package/src/cli/simple-commands/fix-hook-variables.js +363 -0
- package/src/cli/simple-commands/github/gh-coordinator.js +605 -0
- package/src/cli/simple-commands/github/github-api.js +624 -0
- package/src/cli/simple-commands/github/init.js +543 -0
- package/src/cli/simple-commands/github.js +377 -0
- package/src/cli/simple-commands/goal.js +145 -0
- package/src/cli/simple-commands/hive-mind/auto-save-middleware.js +311 -0
- package/src/cli/simple-commands/hive-mind/communication.js +740 -0
- package/src/cli/simple-commands/hive-mind/core.js +1031 -0
- package/src/cli/simple-commands/hive-mind/db-optimizer.js +872 -0
- package/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1364 -0
- package/src/cli/simple-commands/hive-mind/memory.js +1292 -0
- package/src/cli/simple-commands/hive-mind/performance-optimizer.js +618 -0
- package/src/cli/simple-commands/hive-mind/performance-test.js +373 -0
- package/src/cli/simple-commands/hive-mind/queen.js +809 -0
- package/src/cli/simple-commands/hive-mind/session-manager.js +1223 -0
- package/src/cli/simple-commands/hive-mind-optimize.js +361 -0
- package/src/cli/simple-commands/hive-mind-wizard.js +281 -0
- package/src/cli/simple-commands/hive-mind.js +3112 -0
- package/src/cli/simple-commands/hive.js +140 -0
- package/src/cli/simple-commands/hook-safety.js +671 -0
- package/src/cli/simple-commands/hooks.js +1268 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224542.json +7 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224544.json +8 -0
- package/src/cli/simple-commands/init/README.md +106 -0
- package/src/cli/simple-commands/init/VALIDATION_ROLLBACK.md +488 -0
- package/src/cli/simple-commands/init/agent-copier.js +347 -0
- package/src/cli/simple-commands/init/batch-init.js +663 -0
- package/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +438 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +876 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +356 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +501 -0
- package/src/cli/simple-commands/init/claude-commands/slash-commands.js +57 -0
- package/src/cli/simple-commands/init/claude-commands/sparc-commands.js +296 -0
- package/src/cli/simple-commands/init/copy-revised-templates.js +175 -0
- package/src/cli/simple-commands/init/executable-wrapper.js +122 -0
- package/src/cli/simple-commands/init/gitignore-updater.js +137 -0
- package/src/cli/simple-commands/init/help.js +110 -0
- package/src/cli/simple-commands/init/hive-mind-init.js +749 -0
- package/src/cli/simple-commands/init/index.js +1953 -0
- package/src/cli/simple-commands/init/performance-monitor.js +344 -0
- package/src/cli/simple-commands/init/rollback/backup-manager.js +542 -0
- package/src/cli/simple-commands/init/rollback/index.js +399 -0
- package/src/cli/simple-commands/init/rollback/recovery-manager.js +778 -0
- package/src/cli/simple-commands/init/rollback/rollback-executor.js +521 -0
- package/src/cli/simple-commands/init/rollback/state-tracker.js +486 -0
- package/src/cli/simple-commands/init/sparc/roo-readme.js +61 -0
- package/src/cli/simple-commands/init/sparc/roomodes-config.js +102 -0
- package/src/cli/simple-commands/init/sparc/workflows.js +40 -0
- package/src/cli/simple-commands/init/sparc-structure.js +68 -0
- package/src/cli/simple-commands/init/template-copier.js +640 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +1185 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +265 -0
- package/src/cli/simple-commands/init/templates/claude-flow-universal +81 -0
- package/src/cli/simple-commands/init/templates/claude-flow.bat +18 -0
- package/src/cli/simple-commands/init/templates/claude-flow.ps1 +24 -0
- package/src/cli/simple-commands/init/templates/claude-md.js +1101 -0
- package/src/cli/simple-commands/init/templates/commands/analysis/bottleneck-detect.md +162 -0
- package/src/cli/simple-commands/init/templates/commands/automation/auto-agent.md +122 -0
- package/src/cli/simple-commands/init/templates/commands/coordination/swarm-init.md +85 -0
- package/src/cli/simple-commands/init/templates/commands/github/github-swarm.md +121 -0
- package/src/cli/simple-commands/init/templates/commands/helpers/standard-checkpoint-hooks.sh +179 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/notification.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-command.md +116 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-edit.md +117 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-task.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-command.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-edit.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-search.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-task.md +111 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-end.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-restore.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-start.md +117 -0
- package/src/cli/simple-commands/init/templates/coordination-md.js +340 -0
- package/src/cli/simple-commands/init/templates/coordination.md +16 -0
- package/src/cli/simple-commands/init/templates/enhanced-templates.js +2347 -0
- package/src/cli/simple-commands/init/templates/github-safe-enhanced.js +331 -0
- package/src/cli/simple-commands/init/templates/github-safe.js +106 -0
- package/src/cli/simple-commands/init/templates/memory-bank-md.js +259 -0
- package/src/cli/simple-commands/init/templates/memory-bank.md +16 -0
- package/src/cli/simple-commands/init/templates/readme-files.js +72 -0
- package/src/cli/simple-commands/init/templates/safe-hook-patterns.js +430 -0
- package/src/cli/simple-commands/init/templates/settings.json +109 -0
- package/src/cli/simple-commands/init/templates/settings.json.enhanced +35 -0
- package/src/cli/simple-commands/init/templates/sparc-modes.js +1401 -0
- package/src/cli/simple-commands/init/templates/verification-claude-md.js +432 -0
- package/src/cli/simple-commands/init/validation/config-validator.js +354 -0
- package/src/cli/simple-commands/init/validation/health-checker.js +599 -0
- package/src/cli/simple-commands/init/validation/index.js +388 -0
- package/src/cli/simple-commands/init/validation/mode-validator.js +387 -0
- package/src/cli/simple-commands/init/validation/post-init-validator.js +390 -0
- package/src/cli/simple-commands/init/validation/pre-init-validator.js +290 -0
- package/src/cli/simple-commands/init/validation/test-runner.js +488 -0
- package/src/cli/simple-commands/init.js +4 -0
- package/src/cli/simple-commands/mcp-health.js +163 -0
- package/src/cli/simple-commands/mcp-integration-layer.js +689 -0
- package/src/cli/simple-commands/mcp.js +420 -0
- package/src/cli/simple-commands/memory-consolidation.js +631 -0
- package/src/cli/simple-commands/memory.js +345 -0
- package/src/cli/simple-commands/migrate-hooks.js +63 -0
- package/src/cli/simple-commands/monitor.js +417 -0
- package/src/cli/simple-commands/neural.js +148 -0
- package/src/cli/simple-commands/pair-autofix-only.js +755 -0
- package/src/cli/simple-commands/pair-basic.js +751 -0
- package/src/cli/simple-commands/pair-old.js +623 -0
- package/src/cli/simple-commands/pair-working.js +849 -0
- package/src/cli/simple-commands/pair.js +849 -0
- package/src/cli/simple-commands/performance-hooks.js +149 -0
- package/src/cli/simple-commands/performance-metrics.js +601 -0
- package/src/cli/simple-commands/process-ui-enhanced.js +821 -0
- package/src/cli/simple-commands/process-ui.js +274 -0
- package/src/cli/simple-commands/realtime-update-system.js +659 -0
- package/src/cli/simple-commands/sparc/architecture.js +1750 -0
- package/src/cli/simple-commands/sparc/commands.js +575 -0
- package/src/cli/simple-commands/sparc/completion.js +1831 -0
- package/src/cli/simple-commands/sparc/coordinator.js +1045 -0
- package/src/cli/simple-commands/sparc/index.js +321 -0
- package/src/cli/simple-commands/sparc/phase-base.js +430 -0
- package/src/cli/simple-commands/sparc/pseudocode.js +984 -0
- package/src/cli/simple-commands/sparc/refinement.js +1856 -0
- package/src/cli/simple-commands/sparc/specification.js +736 -0
- package/src/cli/simple-commands/sparc-modes/architect.js +125 -0
- package/src/cli/simple-commands/sparc-modes/ask.js +126 -0
- package/src/cli/simple-commands/sparc-modes/code.js +148 -0
- package/src/cli/simple-commands/sparc-modes/debug.js +112 -0
- package/src/cli/simple-commands/sparc-modes/devops.js +137 -0
- package/src/cli/simple-commands/sparc-modes/docs-writer.js +38 -0
- package/src/cli/simple-commands/sparc-modes/generic.js +34 -0
- package/src/cli/simple-commands/sparc-modes/index.js +201 -0
- package/src/cli/simple-commands/sparc-modes/integration.js +55 -0
- package/src/cli/simple-commands/sparc-modes/mcp.js +38 -0
- package/src/cli/simple-commands/sparc-modes/monitoring.js +38 -0
- package/src/cli/simple-commands/sparc-modes/optimization.js +38 -0
- package/src/cli/simple-commands/sparc-modes/security-review.js +130 -0
- package/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +167 -0
- package/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +38 -0
- package/src/cli/simple-commands/sparc-modes/supabase-admin.js +149 -0
- package/src/cli/simple-commands/sparc-modes/swarm.js +436 -0
- package/src/cli/simple-commands/sparc-modes/tdd.js +112 -0
- package/src/cli/simple-commands/sparc-modes/tutorial.js +277 -0
- package/src/cli/simple-commands/sparc.js +530 -0
- package/src/cli/simple-commands/start-ui.js +147 -0
- package/src/cli/simple-commands/start-wrapper.js +285 -0
- package/src/cli/simple-commands/start.js +2 -0
- package/src/cli/simple-commands/status.js +303 -0
- package/src/cli/simple-commands/stream-chain-clean.js +221 -0
- package/src/cli/simple-commands/stream-chain-fixed.js +89 -0
- package/src/cli/simple-commands/stream-chain-real.js +408 -0
- package/src/cli/simple-commands/stream-chain-working.js +323 -0
- package/src/cli/simple-commands/stream-chain.js +491 -0
- package/src/cli/simple-commands/stream-processor.js +340 -0
- package/src/cli/simple-commands/swarm-executor.js +253 -0
- package/src/cli/simple-commands/swarm-metrics-integration.js +371 -0
- package/src/cli/simple-commands/swarm-ui.js +741 -0
- package/src/cli/simple-commands/swarm-webui-integration.js +311 -0
- package/src/cli/simple-commands/swarm.js +2277 -0
- package/src/cli/simple-commands/task.js +228 -0
- package/src/cli/simple-commands/templates/mle-star-workflow.json +294 -0
- package/src/cli/simple-commands/timestamp-fix.js +104 -0
- package/src/cli/simple-commands/token-tracker.js +372 -0
- package/src/cli/simple-commands/tool-execution-framework.js +555 -0
- package/src/cli/simple-commands/train-and-stream.js +354 -0
- package/src/cli/simple-commands/training-pipeline.js +874 -0
- package/src/cli/simple-commands/training.js +288 -0
- package/src/cli/simple-commands/verification-hooks.js +336 -0
- package/src/cli/simple-commands/verification-integration.js +464 -0
- package/src/cli/simple-commands/verification-training-integration.js +646 -0
- package/src/cli/simple-commands/verification.js +551 -0
- package/src/cli/simple-commands/web-server.js +929 -0
- package/src/cli/simple-commands/webui-validator.js +136 -0
- package/src/language/README.md +503 -0
- package/src/language/claude-md-generator.js +618 -0
- package/src/language/cli.js +422 -0
- package/src/language/example.js +347 -0
- package/src/language/integration-system.js +619 -0
- package/src/language/language-detector.js +581 -0
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
// sparc.js - SPARC development mode commands
|
|
2
|
+
import { printSuccess, printError, printWarning } from '../utils.js';
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
import { spawn } from 'child_process';
|
|
5
|
+
import { promisify } from 'util';
|
|
6
|
+
import { createSparcPrompt } from './sparc-modes/index.js';
|
|
7
|
+
import { cwd, exit, existsSync } from '../node-compat.js';
|
|
8
|
+
import process from 'process';
|
|
9
|
+
|
|
10
|
+
export async function sparcCommand(subArgs, flags) {
|
|
11
|
+
const sparcCmd = subArgs[0];
|
|
12
|
+
|
|
13
|
+
// Show help if requested or no args
|
|
14
|
+
if (
|
|
15
|
+
flags.help ||
|
|
16
|
+
flags.h ||
|
|
17
|
+
sparcCmd === '--help' ||
|
|
18
|
+
sparcCmd === '-h' ||
|
|
19
|
+
(!sparcCmd && Object.keys(flags).length === 0)
|
|
20
|
+
) {
|
|
21
|
+
showSparcHelp();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Merge flags back into subArgs for backward compatibility
|
|
26
|
+
const mergedArgs = [...subArgs];
|
|
27
|
+
for (const [key, value] of Object.entries(flags)) {
|
|
28
|
+
if (key === 'non-interactive' || key === 'n') {
|
|
29
|
+
mergedArgs.push('--non-interactive');
|
|
30
|
+
} else if (key === 'dry-run' || key === 'd') {
|
|
31
|
+
mergedArgs.push('--dry-run');
|
|
32
|
+
} else if (key === 'verbose' || key === 'v') {
|
|
33
|
+
mergedArgs.push('--verbose');
|
|
34
|
+
} else if (key === 'no-permissions') {
|
|
35
|
+
mergedArgs.push('--no-permissions');
|
|
36
|
+
} else if (key === 'enable-permissions') {
|
|
37
|
+
mergedArgs.push('--enable-permissions');
|
|
38
|
+
} else if (key === 'namespace') {
|
|
39
|
+
mergedArgs.push('--namespace', value);
|
|
40
|
+
} else if (key === 'config') {
|
|
41
|
+
mergedArgs.push('--config', value);
|
|
42
|
+
} else if (key === 'interactive' || key === 'i') {
|
|
43
|
+
mergedArgs.push('--interactive');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Check if first arg is a known subcommand
|
|
48
|
+
const knownSubcommands = ['modes', 'info', 'run', 'tdd'];
|
|
49
|
+
|
|
50
|
+
if (!knownSubcommands.includes(sparcCmd)) {
|
|
51
|
+
// If not a known subcommand, treat it as a task description for sparc orchestrator
|
|
52
|
+
// Insert 'run' and 'sparc' to make it: ['run', 'sparc', ...rest of args]
|
|
53
|
+
mergedArgs.unshift('run', 'sparc');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Now process the command
|
|
57
|
+
const actualCmd = mergedArgs[0];
|
|
58
|
+
|
|
59
|
+
switch (actualCmd) {
|
|
60
|
+
case 'modes':
|
|
61
|
+
await listSparcModes(mergedArgs);
|
|
62
|
+
break;
|
|
63
|
+
|
|
64
|
+
case 'info':
|
|
65
|
+
await showModeInfo(mergedArgs);
|
|
66
|
+
break;
|
|
67
|
+
|
|
68
|
+
case 'run':
|
|
69
|
+
await runSparcMode(mergedArgs, flags);
|
|
70
|
+
break;
|
|
71
|
+
|
|
72
|
+
case 'tdd':
|
|
73
|
+
await runTddWorkflow(mergedArgs);
|
|
74
|
+
break;
|
|
75
|
+
|
|
76
|
+
default:
|
|
77
|
+
showSparcHelp();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function listSparcModes(subArgs) {
|
|
82
|
+
try {
|
|
83
|
+
// Get the actual working directory where the command was run from
|
|
84
|
+
const workingDir = process.env.PWD || cwd();
|
|
85
|
+
const configPath = `${workingDir}/.roomodes`;
|
|
86
|
+
let configContent;
|
|
87
|
+
try {
|
|
88
|
+
configContent = await fs.readFile(configPath, 'utf8');
|
|
89
|
+
} catch (error) {
|
|
90
|
+
printError('SPARC configuration file (.roomodes) not found');
|
|
91
|
+
console.log(`Please ensure .roomodes file exists in: ${workingDir}`);
|
|
92
|
+
console.log();
|
|
93
|
+
console.log('To enable SPARC development modes, run:');
|
|
94
|
+
console.log(' npx claude-flow@latest init --sparc');
|
|
95
|
+
console.log();
|
|
96
|
+
console.log('This will create:');
|
|
97
|
+
console.log(' âĸ .roomodes file with 17+ SPARC development modes');
|
|
98
|
+
console.log(' âĸ .roo/ directory with templates and workflows');
|
|
99
|
+
console.log(' âĸ SPARC-enhanced CLAUDE.md configuration');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const config = JSON.parse(configContent);
|
|
104
|
+
const verbose = subArgs.includes('--verbose') || subArgs.includes('-v');
|
|
105
|
+
|
|
106
|
+
printSuccess('Available SPARC Modes:');
|
|
107
|
+
console.log();
|
|
108
|
+
|
|
109
|
+
for (const mode of config.customModes) {
|
|
110
|
+
console.log(`âĸ ${mode.name} (${mode.slug})`);
|
|
111
|
+
if (verbose) {
|
|
112
|
+
console.log(` ${mode.roleDefinition}`);
|
|
113
|
+
console.log(` Tools: ${mode.groups.join(', ')}`);
|
|
114
|
+
console.log();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (!verbose) {
|
|
119
|
+
console.log();
|
|
120
|
+
console.log('Use --verbose for detailed descriptions');
|
|
121
|
+
}
|
|
122
|
+
} catch (err) {
|
|
123
|
+
printError(`Failed to list SPARC modes: ${err.message}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function showModeInfo(subArgs) {
|
|
128
|
+
const modeSlug = subArgs[1];
|
|
129
|
+
if (!modeSlug) {
|
|
130
|
+
printError('Usage: sparc info <mode-slug>');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
// Get the actual working directory where the command was run from
|
|
136
|
+
const workingDir = process.env.PWD || cwd();
|
|
137
|
+
const configPath = `${workingDir}/.roomodes`;
|
|
138
|
+
let configContent;
|
|
139
|
+
try {
|
|
140
|
+
configContent = await fs.readFile(configPath, 'utf8');
|
|
141
|
+
} catch (error) {
|
|
142
|
+
printError('SPARC configuration file (.roomodes) not found');
|
|
143
|
+
console.log(`Please ensure .roomodes file exists in: ${workingDir}`);
|
|
144
|
+
console.log();
|
|
145
|
+
console.log('To enable SPARC development modes, run:');
|
|
146
|
+
console.log(' npx claude-flow@latest init --sparc');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const config = JSON.parse(configContent);
|
|
150
|
+
const mode = config.customModes.find((m) => m.slug === modeSlug);
|
|
151
|
+
|
|
152
|
+
if (!mode) {
|
|
153
|
+
printError(`Mode not found: ${modeSlug}`);
|
|
154
|
+
console.log('Available modes:');
|
|
155
|
+
for (const m of config.customModes) {
|
|
156
|
+
console.log(` ${m.slug} - ${m.name}`);
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
printSuccess(`SPARC Mode: ${mode.name}`);
|
|
162
|
+
console.log();
|
|
163
|
+
console.log('Role Definition:');
|
|
164
|
+
console.log(mode.roleDefinition);
|
|
165
|
+
console.log();
|
|
166
|
+
console.log('Custom Instructions:');
|
|
167
|
+
console.log(mode.customInstructions);
|
|
168
|
+
console.log();
|
|
169
|
+
console.log('Tool Groups:');
|
|
170
|
+
console.log(mode.groups.join(', '));
|
|
171
|
+
console.log();
|
|
172
|
+
console.log('Source:');
|
|
173
|
+
console.log(mode.source);
|
|
174
|
+
} catch (err) {
|
|
175
|
+
printError(`Failed to show mode info: ${err.message}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async function runSparcMode(subArgs, flags) {
|
|
180
|
+
const runModeSlug = subArgs[1];
|
|
181
|
+
const taskDescription = subArgs
|
|
182
|
+
.slice(2)
|
|
183
|
+
.filter((arg) => !arg.startsWith('--'))
|
|
184
|
+
.join(' ');
|
|
185
|
+
|
|
186
|
+
if (!runModeSlug || !taskDescription) {
|
|
187
|
+
printError('Usage: sparc run <mode-slug> <task-description>');
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
// Get the actual working directory where the command was run from
|
|
193
|
+
const workingDir = process.env.PWD || cwd();
|
|
194
|
+
const configPath = `${workingDir}/.roomodes`;
|
|
195
|
+
let configContent;
|
|
196
|
+
try {
|
|
197
|
+
configContent = await fs.readFile(configPath, 'utf8');
|
|
198
|
+
} catch (error) {
|
|
199
|
+
printError('SPARC configuration file (.roomodes) not found');
|
|
200
|
+
console.log(`Please ensure .roomodes file exists in: ${workingDir}`);
|
|
201
|
+
console.log();
|
|
202
|
+
console.log('To enable SPARC development modes, run:');
|
|
203
|
+
console.log(' npx claude-flow@latest init --sparc');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const config = JSON.parse(configContent);
|
|
207
|
+
const mode = config.customModes.find((m) => m.slug === runModeSlug);
|
|
208
|
+
|
|
209
|
+
if (!mode) {
|
|
210
|
+
printError(`Mode not found: ${runModeSlug}`);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Build enhanced SPARC prompt
|
|
215
|
+
const memoryNamespace = subArgs.includes('--namespace')
|
|
216
|
+
? subArgs[subArgs.indexOf('--namespace') + 1]
|
|
217
|
+
: mode.slug;
|
|
218
|
+
|
|
219
|
+
const enhancedTask = createSparcPrompt(mode, taskDescription, memoryNamespace);
|
|
220
|
+
|
|
221
|
+
// Build tools based on mode groups
|
|
222
|
+
const tools = buildToolsFromGroups(mode.groups);
|
|
223
|
+
const toolsList = Array.from(tools).join(',');
|
|
224
|
+
const instanceId = `sparc-${runModeSlug}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
225
|
+
|
|
226
|
+
if (subArgs.includes('--dry-run') || subArgs.includes('-d')) {
|
|
227
|
+
printWarning('DRY RUN - SPARC Mode Configuration:');
|
|
228
|
+
console.log(`Mode: ${mode.name} (${mode.slug})`);
|
|
229
|
+
console.log(`Instance ID: ${instanceId}`);
|
|
230
|
+
|
|
231
|
+
const enablePermissions = subArgs.includes('--enable-permissions');
|
|
232
|
+
if (!enablePermissions) {
|
|
233
|
+
console.log(`Tools: ALL (via --dangerously-skip-permissions)`);
|
|
234
|
+
console.log(`Permissions: Will be auto-skipped`);
|
|
235
|
+
} else {
|
|
236
|
+
console.log(`Tools: ${toolsList}`);
|
|
237
|
+
console.log(`Permissions: Will prompt for actions`);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
console.log(`Task: ${taskDescription}`);
|
|
241
|
+
console.log();
|
|
242
|
+
console.log('Enhanced prompt preview:');
|
|
243
|
+
console.log(enhancedTask.substring(0, 300) + '...');
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
printSuccess(`Starting SPARC mode: ${mode.name}`);
|
|
248
|
+
console.log(`đ Instance ID: ${instanceId}`);
|
|
249
|
+
console.log(`đ¯ Mode: ${mode.slug}`);
|
|
250
|
+
|
|
251
|
+
const isNonInteractive = subArgs.includes('--non-interactive') || subArgs.includes('-n');
|
|
252
|
+
const enablePermissions = subArgs.includes('--enable-permissions');
|
|
253
|
+
|
|
254
|
+
if (!enablePermissions) {
|
|
255
|
+
console.log(`đ§ Tools: ALL (including MCP and WebSearch via --dangerously-skip-permissions)`);
|
|
256
|
+
console.log(`⥠Permissions: Auto-skipped (--dangerously-skip-permissions)`);
|
|
257
|
+
} else {
|
|
258
|
+
console.log(`đ§ Tools: ${toolsList}`);
|
|
259
|
+
console.log(`â
Permissions: Enabled (will prompt for actions)`);
|
|
260
|
+
}
|
|
261
|
+
console.log(`đ Task: ${taskDescription}`);
|
|
262
|
+
|
|
263
|
+
if (isNonInteractive) {
|
|
264
|
+
console.log(`đ Running in non-interactive mode with stream-json output`);
|
|
265
|
+
console.log();
|
|
266
|
+
|
|
267
|
+
// Show debug info immediately for non-interactive mode
|
|
268
|
+
console.log('đ Debug: Preparing claude command...');
|
|
269
|
+
console.log(`Enhanced prompt length: ${enhancedTask.length} characters`);
|
|
270
|
+
console.log(`First 200 chars of prompt: ${enhancedTask.substring(0, 200)}...`);
|
|
271
|
+
}
|
|
272
|
+
console.log();
|
|
273
|
+
|
|
274
|
+
// Execute Claude with SPARC configuration
|
|
275
|
+
await executeClaude(enhancedTask, toolsList, instanceId, memoryNamespace, subArgs);
|
|
276
|
+
} catch (err) {
|
|
277
|
+
printError(`Failed to run SPARC mode: ${err.message}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
async function runTddWorkflow(subArgs) {
|
|
282
|
+
const tddTaskDescription = subArgs.slice(1).join(' ');
|
|
283
|
+
|
|
284
|
+
if (!tddTaskDescription) {
|
|
285
|
+
printError('Usage: sparc tdd <task-description>');
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
printSuccess('Starting SPARC TDD Workflow');
|
|
290
|
+
console.log('Following Test-Driven Development with SPARC methodology');
|
|
291
|
+
console.log();
|
|
292
|
+
|
|
293
|
+
const phases = [
|
|
294
|
+
{ name: 'Red', description: 'Write failing tests', mode: 'tdd' },
|
|
295
|
+
{ name: 'Green', description: 'Minimal implementation', mode: 'code' },
|
|
296
|
+
{ name: 'Refactor', description: 'Optimize and clean', mode: 'tdd' },
|
|
297
|
+
];
|
|
298
|
+
|
|
299
|
+
console.log('TDD Phases:');
|
|
300
|
+
for (const phase of phases) {
|
|
301
|
+
console.log(` ${phase.name}: ${phase.description} (${phase.mode} mode)`);
|
|
302
|
+
}
|
|
303
|
+
console.log();
|
|
304
|
+
|
|
305
|
+
if (subArgs.includes('--interactive') || subArgs.includes('-i')) {
|
|
306
|
+
printSuccess('Starting interactive TDD workflow');
|
|
307
|
+
console.log('This would walk through each phase interactively');
|
|
308
|
+
console.log('Run each phase with: sparc run <mode> "Phase: <task>"');
|
|
309
|
+
} else {
|
|
310
|
+
printSuccess('Starting full TDD workflow');
|
|
311
|
+
console.log('This would execute all phases automatically');
|
|
312
|
+
console.log('Use --interactive for step-by-step control');
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Remove the createSparcPrompt function from here as it's now imported from sparc-modes/index.js
|
|
317
|
+
|
|
318
|
+
function buildToolsFromGroups(groups) {
|
|
319
|
+
const toolMappings = {
|
|
320
|
+
read: ['View', 'LS', 'GlobTool', 'GrepTool'],
|
|
321
|
+
edit: ['Edit', 'Replace', 'MultiEdit', 'Write'],
|
|
322
|
+
browser: ['WebFetch'],
|
|
323
|
+
mcp: ['mcp_tools'],
|
|
324
|
+
command: ['Bash', 'Terminal'],
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
const tools = new Set(['View', 'Edit', 'Bash']); // Always include basic tools
|
|
328
|
+
|
|
329
|
+
for (const group of groups) {
|
|
330
|
+
if (Array.isArray(group)) {
|
|
331
|
+
const groupName = group[0];
|
|
332
|
+
if (toolMappings[groupName]) {
|
|
333
|
+
toolMappings[groupName].forEach((tool) => tools.add(tool));
|
|
334
|
+
}
|
|
335
|
+
} else if (toolMappings[group]) {
|
|
336
|
+
toolMappings[group].forEach((tool) => tools.add(tool));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return tools;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async function executeClaude(enhancedTask, toolsList, instanceId, memoryNamespace, subArgs) {
|
|
344
|
+
// Check for non-interactive mode
|
|
345
|
+
const isNonInteractive = subArgs.includes('--non-interactive') || subArgs.includes('-n');
|
|
346
|
+
const enablePermissions = subArgs.includes('--enable-permissions');
|
|
347
|
+
|
|
348
|
+
// Build arguments array correctly
|
|
349
|
+
const claudeArgs = [];
|
|
350
|
+
claudeArgs.push(enhancedTask);
|
|
351
|
+
|
|
352
|
+
// Add --dangerously-skip-permissions by default unless --enable-permissions is set
|
|
353
|
+
if (!enablePermissions) {
|
|
354
|
+
claudeArgs.push('--dangerously-skip-permissions');
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (isNonInteractive) {
|
|
358
|
+
// Non-interactive mode: add additional flags
|
|
359
|
+
claudeArgs.push('-p'); // Use short form for print
|
|
360
|
+
claudeArgs.push('--output-format', 'stream-json');
|
|
361
|
+
claudeArgs.push('--verbose');
|
|
362
|
+
} else {
|
|
363
|
+
// Interactive mode - check for verbose flag
|
|
364
|
+
if (subArgs.includes('--verbose') || subArgs.includes('-v')) {
|
|
365
|
+
claudeArgs.push('--verbose');
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// When using --dangerously-skip-permissions, we don't need to specify individual tools
|
|
370
|
+
// as it enables ALL tools including mcp and websearch
|
|
371
|
+
// Only add --allowedTools if permissions are enabled
|
|
372
|
+
if (enablePermissions) {
|
|
373
|
+
claudeArgs.push('--allowedTools', toolsList);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if (subArgs.includes('--config')) {
|
|
377
|
+
const configIndex = subArgs.indexOf('--config');
|
|
378
|
+
claudeArgs.push('--mcp-config', subArgs[configIndex + 1]);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Show debug info for non-interactive mode or when verbose
|
|
382
|
+
if (isNonInteractive || subArgs.includes('--verbose') || subArgs.includes('-v')) {
|
|
383
|
+
console.log('\nđ Debug: Executing claude with:');
|
|
384
|
+
console.log('Command: claude');
|
|
385
|
+
console.log(
|
|
386
|
+
'Permissions:',
|
|
387
|
+
enablePermissions
|
|
388
|
+
? 'â
Enabled (will prompt)'
|
|
389
|
+
: '⥠Skipped (--dangerously-skip-permissions)',
|
|
390
|
+
);
|
|
391
|
+
console.log(
|
|
392
|
+
'Tools:',
|
|
393
|
+
enablePermissions ? `Specified: ${toolsList}` : 'ALL tools enabled (MCP, WebSearch, etc.)',
|
|
394
|
+
);
|
|
395
|
+
console.log('Mode:', isNonInteractive ? 'đ¤ Non-interactive' : 'đŦ Interactive');
|
|
396
|
+
console.log('Args array length:', claudeArgs.length);
|
|
397
|
+
console.log('First arg (prompt) length:', claudeArgs[0].length, 'characters');
|
|
398
|
+
|
|
399
|
+
if (isNonInteractive) {
|
|
400
|
+
console.log('First 200 chars of prompt:', claudeArgs[0].substring(0, 200) + '...');
|
|
401
|
+
console.log('\nAll arguments:');
|
|
402
|
+
claudeArgs.forEach((arg, i) => {
|
|
403
|
+
if (i === 0) {
|
|
404
|
+
console.log(` [0] <SPARC prompt with ${arg.length} characters>`);
|
|
405
|
+
} else {
|
|
406
|
+
console.log(` [${i}] ${arg}`);
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
console.log('\nFull command structure:');
|
|
410
|
+
console.log('claude "<SPARC prompt>" ' + claudeArgs.slice(1).join(' '));
|
|
411
|
+
}
|
|
412
|
+
console.log();
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
try {
|
|
416
|
+
// Log the actual command being executed
|
|
417
|
+
console.log('\nđ Executing command:');
|
|
418
|
+
console.log(`Command: claude`);
|
|
419
|
+
console.log(`Working Directory: ${cwd()}`);
|
|
420
|
+
console.log(`Number of args: ${claudeArgs.length}`);
|
|
421
|
+
|
|
422
|
+
// Check if claude command exists
|
|
423
|
+
try {
|
|
424
|
+
const checkResult = await new Promise((resolve) => {
|
|
425
|
+
const child = spawn('which', ['claude'], {
|
|
426
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
427
|
+
});
|
|
428
|
+
let stdout = '';
|
|
429
|
+
child.stdout?.on('data', (data) => {
|
|
430
|
+
stdout += data;
|
|
431
|
+
});
|
|
432
|
+
child.on('close', (code) => {
|
|
433
|
+
resolve({ success: code === 0, stdout: Buffer.from(stdout) });
|
|
434
|
+
});
|
|
435
|
+
});
|
|
436
|
+
if (!checkResult.success) {
|
|
437
|
+
console.error('â Error: claude command not found in PATH');
|
|
438
|
+
console.error('Please ensure claude CLI is installed and in your PATH');
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
const claudePath = new TextDecoder().decode(checkResult.stdout).trim();
|
|
442
|
+
console.log(`Claude path: ${claudePath}`);
|
|
443
|
+
} catch (e) {
|
|
444
|
+
console.warn('â ī¸ Could not verify claude command location');
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Use spawn for claude command
|
|
448
|
+
const env = { ...process.env, CLAUDE_INSTANCE_ID: instanceId };
|
|
449
|
+
|
|
450
|
+
console.log('\nđĄ Spawning claude process...\n');
|
|
451
|
+
const child = spawn('claude', claudeArgs, {
|
|
452
|
+
cwd: cwd(),
|
|
453
|
+
env: env,
|
|
454
|
+
stdio: 'inherit',
|
|
455
|
+
});
|
|
456
|
+
const status = await new Promise((resolve) => {
|
|
457
|
+
child.on('close', (code) => {
|
|
458
|
+
resolve({ code, success: code === 0 });
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
if (status.success) {
|
|
463
|
+
printSuccess(`SPARC instance ${instanceId} completed successfully`);
|
|
464
|
+
} else {
|
|
465
|
+
printError(`SPARC instance ${instanceId} exited with code ${status.code}`);
|
|
466
|
+
}
|
|
467
|
+
} catch (err) {
|
|
468
|
+
printError(`Failed to execute Claude: ${err.message}`);
|
|
469
|
+
console.error('Stack trace:', err.stack);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
function showSparcHelp() {
|
|
474
|
+
console.log('SPARC commands:');
|
|
475
|
+
console.log(' <task> Run SPARC orchestrator (default mode)');
|
|
476
|
+
console.log(' modes List available SPARC development modes');
|
|
477
|
+
console.log(' info <mode> Show detailed information about a mode');
|
|
478
|
+
console.log(' run <mode> <task> Execute a task in specified SPARC mode');
|
|
479
|
+
console.log(' tdd <task> Run Test-Driven Development workflow');
|
|
480
|
+
console.log();
|
|
481
|
+
console.log('Examples:');
|
|
482
|
+
console.log(' claude-flow sparc "orchestrate app development" # Uses sparc orchestrator');
|
|
483
|
+
console.log(' claude-flow sparc modes --verbose');
|
|
484
|
+
console.log(' claude-flow sparc info architect');
|
|
485
|
+
console.log(' claude-flow sparc run code "implement user authentication"');
|
|
486
|
+
console.log(' claude-flow sparc run code "add login feature" --non-interactive');
|
|
487
|
+
console.log(' claude-flow sparc run tdd "create test suite" --namespace tests');
|
|
488
|
+
console.log(' claude-flow sparc tdd "payment processing system" --interactive');
|
|
489
|
+
console.log();
|
|
490
|
+
console.log('Parallel Execution with BatchTool:');
|
|
491
|
+
console.log(' # Run multiple SPARC modes concurrently');
|
|
492
|
+
console.log(' batchtool run --parallel \\');
|
|
493
|
+
console.log(' "npx claude-flow sparc run code \'user service\' --non-interactive" \\');
|
|
494
|
+
console.log(' "npx claude-flow sparc run code \'auth service\' --non-interactive" \\');
|
|
495
|
+
console.log(' "npx claude-flow sparc run tdd \'test suite\' --non-interactive"');
|
|
496
|
+
console.log();
|
|
497
|
+
console.log(' # Boomerang orchestration pattern');
|
|
498
|
+
console.log(' batchtool orchestrate --boomerang \\');
|
|
499
|
+
console.log(
|
|
500
|
+
' --research "npx claude-flow sparc run ask \'requirements\' --non-interactive" \\',
|
|
501
|
+
);
|
|
502
|
+
console.log(' --design "npx claude-flow sparc run architect \'system\' --non-interactive" \\');
|
|
503
|
+
console.log(' --implement "npx claude-flow sparc run code \'features\' --non-interactive" \\');
|
|
504
|
+
console.log(' --test "npx claude-flow sparc run tdd \'validation\' --non-interactive"');
|
|
505
|
+
console.log();
|
|
506
|
+
console.log('Flags:');
|
|
507
|
+
console.log(' --dry-run, -d Show configuration without executing');
|
|
508
|
+
console.log(' --verbose, -v Show detailed output');
|
|
509
|
+
console.log(' --interactive, -i Run TDD workflow interactively');
|
|
510
|
+
console.log(' --non-interactive, -n Run in non-interactive mode with stream-json output');
|
|
511
|
+
console.log(' --enable-permissions Enable permission prompts (default: skip permissions)');
|
|
512
|
+
console.log(' --namespace <ns> Use custom memory namespace (default: mode slug)');
|
|
513
|
+
console.log(' --config <path> Use custom MCP configuration file');
|
|
514
|
+
console.log();
|
|
515
|
+
console.log('Permission Behavior:');
|
|
516
|
+
console.log(' By default, SPARC runs with --dangerously-skip-permissions for efficiency');
|
|
517
|
+
console.log(' Use --enable-permissions to restore permission prompts if needed');
|
|
518
|
+
console.log();
|
|
519
|
+
console.log('Non-Interactive Mode:');
|
|
520
|
+
console.log(' When using --non-interactive, claude will be executed with:');
|
|
521
|
+
console.log(' - --dangerously-skip-permissions (unless --enable-permissions is set)');
|
|
522
|
+
console.log(' - -p (print mode for streaming output)');
|
|
523
|
+
console.log(' - --output-format stream-json (structured output format)');
|
|
524
|
+
console.log(' - --verbose (detailed execution logs)');
|
|
525
|
+
console.log();
|
|
526
|
+
console.log('Boomerang Pattern:');
|
|
527
|
+
console.log(' A cyclical orchestration where outputs from one phase feed into the next:');
|
|
528
|
+
console.log(' Research â Design â Implement â Test â Optimize â Loop back');
|
|
529
|
+
console.log(' Perfect for iterative development with continuous refinement');
|
|
530
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// start-ui.js - Standalone UI launcher (Web UI by default)
|
|
2
|
+
import { printSuccess, printError, printWarning, printInfo } from '../utils.js';
|
|
3
|
+
import { compat } from '../runtime-detector.js';
|
|
4
|
+
|
|
5
|
+
export async function launchUI(args = []) {
|
|
6
|
+
try {
|
|
7
|
+
// Parse arguments
|
|
8
|
+
const portValue = getArgValue(args, '--port') || getArgValue(args, '-p');
|
|
9
|
+
const port = portValue ? parseInt(portValue) : 3000;
|
|
10
|
+
|
|
11
|
+
const terminal = args.includes('--terminal') || args.includes('-t');
|
|
12
|
+
const web = !terminal; // Default to web UI unless terminal is specified
|
|
13
|
+
|
|
14
|
+
if (web) {
|
|
15
|
+
// Launch Web UI
|
|
16
|
+
try {
|
|
17
|
+
const { ClaudeCodeWebServer } = await import('./web-server.js');
|
|
18
|
+
const webServer = new ClaudeCodeWebServer(port);
|
|
19
|
+
await webServer.start();
|
|
20
|
+
|
|
21
|
+
printSuccess('đ Claude Flow Web UI is running!');
|
|
22
|
+
console.log(`đ Open your browser to: http://localhost:${port}/console`);
|
|
23
|
+
console.log();
|
|
24
|
+
console.log('Features:');
|
|
25
|
+
console.log(' ⨠Access all 71+ MCP tools through the web interface');
|
|
26
|
+
console.log(' đ Real-time monitoring and analytics');
|
|
27
|
+
console.log(' đ§ Neural network training and management');
|
|
28
|
+
console.log(' đ Workflow automation and SPARC modes');
|
|
29
|
+
console.log(' đ GitHub integration and DAA management');
|
|
30
|
+
console.log();
|
|
31
|
+
console.log('Press Ctrl+C to stop the server');
|
|
32
|
+
|
|
33
|
+
// Open browser if possible
|
|
34
|
+
try {
|
|
35
|
+
const openCommand =
|
|
36
|
+
process.platform === 'darwin'
|
|
37
|
+
? 'open'
|
|
38
|
+
: process.platform === 'win32'
|
|
39
|
+
? 'start'
|
|
40
|
+
: 'xdg-open';
|
|
41
|
+
|
|
42
|
+
const { exec } = await import('child_process');
|
|
43
|
+
exec(`${openCommand} http://localhost:${port}/console`);
|
|
44
|
+
} catch {
|
|
45
|
+
// Browser opening failed, that's okay
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Handle shutdown
|
|
49
|
+
const shutdown = async () => {
|
|
50
|
+
console.log('\n' + 'âšī¸ Shutting down Web UI...');
|
|
51
|
+
await webServer.stop();
|
|
52
|
+
printSuccess('â Shutdown complete');
|
|
53
|
+
process.exit(0);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
process.on('SIGINT', shutdown);
|
|
57
|
+
process.on('SIGTERM', shutdown);
|
|
58
|
+
|
|
59
|
+
// Keep process alive
|
|
60
|
+
await new Promise(() => {});
|
|
61
|
+
} catch (err) {
|
|
62
|
+
printError(`Failed to launch Web UI: ${err.message}`);
|
|
63
|
+
console.error('Stack trace:', err.stack);
|
|
64
|
+
console.log();
|
|
65
|
+
printWarning('Falling back to terminal UI...');
|
|
66
|
+
// Fall back to terminal UI
|
|
67
|
+
await launchTerminalUI(port);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (terminal) {
|
|
72
|
+
await launchTerminalUI(port);
|
|
73
|
+
}
|
|
74
|
+
} catch (err) {
|
|
75
|
+
printError(`Failed to launch UI: ${err.message}`);
|
|
76
|
+
console.error('Stack trace:', err.stack);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function launchTerminalUI(port) {
|
|
81
|
+
// Launch Terminal UI
|
|
82
|
+
try {
|
|
83
|
+
// Try enhanced UI first
|
|
84
|
+
const { launchEnhancedUI } = await import('./process-ui-enhanced.js');
|
|
85
|
+
await launchEnhancedUI();
|
|
86
|
+
} catch (err) {
|
|
87
|
+
// Try simple UI as fallback
|
|
88
|
+
try {
|
|
89
|
+
let ProcessManager, ProcessUI;
|
|
90
|
+
try {
|
|
91
|
+
// Try the compiled version first (for production/npm packages)
|
|
92
|
+
const pmModule = await import('../../../dist/cli/commands/start/process-manager.js');
|
|
93
|
+
const puiModule = await import('../../../dist/cli/commands/start/process-ui-simple.js');
|
|
94
|
+
ProcessManager = pmModule.ProcessManager;
|
|
95
|
+
ProcessUI = puiModule.ProcessUI;
|
|
96
|
+
} catch (distError) {
|
|
97
|
+
// If dist version not found, try TypeScript version (for development)
|
|
98
|
+
const pmModule = await import('../commands/start/process-manager.ts');
|
|
99
|
+
const puiModule = await import('../commands/start/process-ui-simple.ts');
|
|
100
|
+
ProcessManager = pmModule.ProcessManager;
|
|
101
|
+
ProcessUI = puiModule.ProcessUI;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
printSuccess('đ Claude-Flow Process Management UI');
|
|
105
|
+
console.log('â'.repeat(60));
|
|
106
|
+
|
|
107
|
+
// Initialize process manager
|
|
108
|
+
const processManager = new ProcessManager();
|
|
109
|
+
await processManager.initialize();
|
|
110
|
+
|
|
111
|
+
// Start the UI
|
|
112
|
+
const ui = new ProcessUI(processManager);
|
|
113
|
+
await ui.start();
|
|
114
|
+
|
|
115
|
+
// Cleanup on exit
|
|
116
|
+
await processManager.stopAll();
|
|
117
|
+
console.log();
|
|
118
|
+
printSuccess('â Shutdown complete');
|
|
119
|
+
} catch (fallbackErr) {
|
|
120
|
+
printError(`Failed to launch Terminal UI: ${fallbackErr.message}`);
|
|
121
|
+
console.error('Stack trace:', fallbackErr.stack);
|
|
122
|
+
|
|
123
|
+
// Final fallback
|
|
124
|
+
console.log();
|
|
125
|
+
printWarning('UI launch failed. Use these commands instead:');
|
|
126
|
+
console.log();
|
|
127
|
+
console.log('Process Management Commands:');
|
|
128
|
+
console.log(' âĸ Start all: claude-flow start');
|
|
129
|
+
console.log(' âĸ Check status: claude-flow status');
|
|
130
|
+
console.log(' âĸ View logs: claude-flow logs');
|
|
131
|
+
console.log(' âĸ Stop: claude-flow stop');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function getArgValue(args, flag) {
|
|
137
|
+
const index = args.indexOf(flag);
|
|
138
|
+
if (index !== -1 && index < args.length - 1) {
|
|
139
|
+
return args[index + 1];
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Run if called directly
|
|
145
|
+
if (import.meta.main) {
|
|
146
|
+
await launchUI();
|
|
147
|
+
}
|