claude-flow-novice 2.2.4 → 2.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/package.json +9 -8
  2. package/scripts/.claude-flow/metrics/agent-metrics.json +1 -0
  3. package/scripts/.claude-flow/metrics/performance.json +9 -0
  4. package/scripts/.claude-flow/metrics/task-metrics.json +10 -0
  5. package/scripts/CLEANUP_OPTIMIZATION_REPORT.json +312 -0
  6. package/scripts/CLEANUP_PERFORMANCE_OPTIMIZATION.md +387 -0
  7. package/scripts/CLEANUP_QUICK_START.md +268 -0
  8. package/scripts/CLEANUP_TEST_RESULTS.md +205 -0
  9. package/scripts/README.md +339 -0
  10. package/scripts/ace-query.sh +384 -0
  11. package/scripts/agent-token-analysis.js +430 -0
  12. package/scripts/auto-setup.js +332 -0
  13. package/scripts/build/README.md +167 -0
  14. package/scripts/build/build-config.js +27 -0
  15. package/scripts/build/build-prompt-copier.sh +30 -0
  16. package/scripts/build/performance-monitor.js +869 -0
  17. package/scripts/build/prepare-publish.js +150 -0
  18. package/scripts/build/typescript-fixer.js +621 -0
  19. package/scripts/build/unified-builder.sh +428 -0
  20. package/scripts/build/update-bin-version.js +32 -0
  21. package/scripts/build/validate-agents.js +238 -0
  22. package/scripts/build-index.js +43 -0
  23. package/scripts/build-orchestrator.js +320 -0
  24. package/scripts/check-routing-stats.cjs +122 -0
  25. package/scripts/ci-validation.js +375 -0
  26. package/scripts/cleanup-blocking-coordination.sh +420 -0
  27. package/scripts/cleanup-idle-sessions.sh +59 -0
  28. package/scripts/collect-build-metrics.js +65 -0
  29. package/scripts/demo/README.md +79 -0
  30. package/scripts/demo/autoscaling-demo-simplified.js +963 -0
  31. package/scripts/demo/comprehensive-dashboard-test.js +693 -0
  32. package/scripts/demo/confidence-log.js +87 -0
  33. package/scripts/demo/confidence-report.js +82 -0
  34. package/scripts/demo/demo-multi-swarm-coordination.js +325 -0
  35. package/scripts/demo/demo-production-deployment.js +399 -0
  36. package/scripts/demo/demo-visualization-system.js +149 -0
  37. package/scripts/demo/performance-analysis.cjs +71 -0
  38. package/scripts/demo/performance-analysis.js +71 -0
  39. package/scripts/demo/test-autoscaling-demo.js +314 -0
  40. package/scripts/dependency-optimizer.js +349 -0
  41. package/scripts/dependency-security-assessment.js +331 -0
  42. package/scripts/deploy-sdk.sh +176 -0
  43. package/scripts/deployment-readiness-report.json +179 -0
  44. package/scripts/dev/README.md +264 -0
  45. package/scripts/dev/claude-flow-wrapper.sh +35 -0
  46. package/scripts/dev/claude-monitor.py +419 -0
  47. package/scripts/dev/claude-sparc.sh +562 -0
  48. package/scripts/dev/claude-wrapper.sh +17 -0
  49. package/scripts/dev/demo-phase3-compliance.js +172 -0
  50. package/scripts/dev/demo-task-system.ts +224 -0
  51. package/scripts/dev/deployment-validator.js +315 -0
  52. package/scripts/dev/spawn-claude-terminal.sh +32 -0
  53. package/scripts/dev/start-portal.sh +506 -0
  54. package/scripts/dev/start-web-ui.js +15 -0
  55. package/scripts/dev/stop-portal.sh +311 -0
  56. package/scripts/dev/validate-examples.ts +288 -0
  57. package/scripts/dev/validate-phase2.cjs +451 -0
  58. package/scripts/dev/validate-phase2.js +785 -0
  59. package/scripts/dev/validate-phase3.cjs +208 -0
  60. package/scripts/dev/validate-security-remediation.js +1 -0
  61. package/scripts/ecosystem.config.cjs +90 -0
  62. package/scripts/fix-js-extensions.js +167 -0
  63. package/scripts/generate-basic-types.js +73 -0
  64. package/scripts/generate-changelog.js +318 -0
  65. package/scripts/git-hooks/pre-commit.sh +143 -0
  66. package/scripts/health-checks.js +634 -0
  67. package/scripts/hook-wrapper.sh +54 -0
  68. package/scripts/install/README.md +375 -0
  69. package/scripts/install/REDIS_SETUP_VALIDATION.json +245 -0
  70. package/scripts/install/check-prerequisites.js +303 -0
  71. package/scripts/install/config-wizard.js +606 -0
  72. package/scripts/install/dependency-checker.js +385 -0
  73. package/scripts/install/health-check.js +765 -0
  74. package/scripts/install/install.js +256 -0
  75. package/scripts/install/installation-benchmark.js +461 -0
  76. package/scripts/install/quick-install.js +720 -0
  77. package/scripts/install/quick-start-wizard.js +295 -0
  78. package/scripts/install/redis-cli.js +289 -0
  79. package/scripts/install/redis-install-guides.md +407 -0
  80. package/scripts/install/redis-setup.js +559 -0
  81. package/scripts/install/redis-test.js +278 -0
  82. package/scripts/install/service-manager.js +672 -0
  83. package/scripts/install/setup.js +832 -0
  84. package/scripts/install/uninstall.js +526 -0
  85. package/scripts/install/update.js +461 -0
  86. package/scripts/install-pre-commit-hook.sh +127 -0
  87. package/scripts/legacy/README.md +272 -0
  88. package/scripts/legacy/batch-fix-ts.sh +54 -0
  89. package/scripts/legacy/build-migration.sh +105 -0
  90. package/scripts/legacy/build-monitor.js +209 -0
  91. package/scripts/legacy/build-with-filter.sh +84 -0
  92. package/scripts/legacy/build-workaround.sh +71 -0
  93. package/scripts/legacy/fix-ts-advanced.js +358 -0
  94. package/scripts/legacy/fix-ts-final.sh +50 -0
  95. package/scripts/legacy/fix-ts-targeted.sh +49 -0
  96. package/scripts/legacy/fix-typescript-errors.js +305 -0
  97. package/scripts/legacy/force-build.sh +63 -0
  98. package/scripts/legacy/optimize-performance.js +400 -0
  99. package/scripts/legacy/performance-monitor.js +263 -0
  100. package/scripts/legacy/performance-monitoring.js +532 -0
  101. package/scripts/legacy/performance-test-runner.js +645 -0
  102. package/scripts/legacy/quick-fix-ts.js +281 -0
  103. package/scripts/legacy/safe-build.sh +63 -0
  104. package/scripts/memory-monitor-coordinator.js +322 -0
  105. package/scripts/migrate-to-sdk.sh +520 -0
  106. package/scripts/migration/QUICK-START.md +189 -0
  107. package/scripts/migration/QUICK-START.md.backup-1760135091363 +189 -0
  108. package/scripts/migration/README.md +464 -0
  109. package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md +500 -0
  110. package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md.backup-1760135091348 +500 -0
  111. package/scripts/migration/UPDATE-PATHS-README.md +464 -0
  112. package/scripts/migration/UPDATE-PATHS-README.md.backup-1760135091337 +464 -0
  113. package/scripts/migration/example-patterns.json +19 -0
  114. package/scripts/migration/install-arm64.js +78 -0
  115. package/scripts/migration/install.js +83 -0
  116. package/scripts/migration/migrate-hooks.js +173 -0
  117. package/scripts/migration/migration-examples.ts +318 -0
  118. package/scripts/migration/reorganize-workspace.js +504 -0
  119. package/scripts/migration/test-update-paths.js +359 -0
  120. package/scripts/migration/update-paths.js +664 -0
  121. package/scripts/migration/validate-migration.js +647 -0
  122. package/scripts/monitor-loop.sh +65 -0
  123. package/scripts/monitor-memory.sh +47 -0
  124. package/scripts/monitor-migration.js +339 -0
  125. package/scripts/monitor.py +43 -0
  126. package/scripts/monitoring/README.md +178 -0
  127. package/scripts/monitoring/alert-monitor.sh +220 -0
  128. package/scripts/monitoring/analyze-resources.sh +199 -0
  129. package/scripts/monitoring/dashboards/rate-limiting-dashboard.json +211 -0
  130. package/scripts/monitoring/dynamic-monitor.sh +85 -0
  131. package/scripts/monitoring/launch-stability-test.sh +184 -0
  132. package/scripts/monitoring/monitor-test.sh +93 -0
  133. package/scripts/monitoring/pre-test-validation.sh +208 -0
  134. package/scripts/monitoring/quick-test-alerting.sh +118 -0
  135. package/scripts/monitoring/quick-test-rate-limiting.sh +206 -0
  136. package/scripts/monitoring/rate-limiting-monitor.sh +380 -0
  137. package/scripts/monitoring/resource-monitor.sh +126 -0
  138. package/scripts/monitoring/stability-monitor.js +429 -0
  139. package/scripts/monitoring/test-monitor-quick.sh +54 -0
  140. package/scripts/monitoring/view-alerts.sh +307 -0
  141. package/scripts/npm-metrics-collector.js +482 -0
  142. package/scripts/npm-package-validation.cjs +299 -0
  143. package/scripts/optimization/build-optimizer.js +438 -0
  144. package/scripts/optimization/config-validator.js +761 -0
  145. package/scripts/optimization/test-optimization.js +432 -0
  146. package/scripts/optimization/unified-activation.js +839 -0
  147. package/scripts/optimize-package-swarm.js +54 -0
  148. package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
  149. package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
  150. package/scripts/performance/test-enhanced-backend.sh +504 -0
  151. package/scripts/performance-monitor.js +644 -0
  152. package/scripts/performance-test-runner.js +698 -0
  153. package/scripts/post-deployment-monitoring.js +350 -0
  154. package/scripts/post-edit-pipeline.js +2091 -0
  155. package/scripts/post-install-claude-md.js +78 -0
  156. package/scripts/postinstall.js +79 -0
  157. package/scripts/pre-publish-validation.cjs +212 -0
  158. package/scripts/pre-publish-validation.js +429 -0
  159. package/scripts/redis-lua/cleanup-blocking-coordination.lua +198 -0
  160. package/scripts/release-announcement.js +425 -0
  161. package/scripts/release-notification.js +248 -0
  162. package/scripts/release-rollback.js +376 -0
  163. package/scripts/release-validation.js +460 -0
  164. package/scripts/rollback-sdk.sh +66 -0
  165. package/scripts/run-production-validation.ts +590 -0
  166. package/scripts/run-stability-validation.sh +687 -0
  167. package/scripts/security/README.md +339 -0
  168. package/scripts/security/deployment-validation.cjs +279 -0
  169. package/scripts/security/envelope-encryption-confidence-report.cjs +422 -0
  170. package/scripts/security/install-git-hooks.sh +132 -0
  171. package/scripts/security/install-git-secrets.sh +295 -0
  172. package/scripts/security/rotate-api-keys.js +469 -0
  173. package/scripts/security/ruv-swarm-safe.js +74 -0
  174. package/scripts/security/security-audit.cjs +538 -0
  175. package/scripts/security/setup-redis-auth.sh +397 -0
  176. package/scripts/security/validate-envelope-encryption.cjs +340 -0
  177. package/scripts/security-scan.js +492 -0
  178. package/scripts/src/web/frontend/.claude-flow/metrics/agent-metrics.json +1 -0
  179. package/scripts/src/web/frontend/.claude-flow/metrics/performance.json +9 -0
  180. package/scripts/src/web/frontend/.claude-flow/metrics/task-metrics.json +10 -0
  181. package/scripts/switch-api.sh +158 -0
  182. package/scripts/sync-agents.js +290 -0
  183. package/scripts/test/50-agent-test.js +625 -0
  184. package/scripts/test/NEW_STABILITY_TEST_GUIDE.md +407 -0
  185. package/scripts/test/README.md +236 -0
  186. package/scripts/test/STABILITY_TEST_EXAMPLE.md +347 -0
  187. package/scripts/test/STABILITY_TEST_README.md +480 -0
  188. package/scripts/test/agent-worker.js +309 -0
  189. package/scripts/test/ai-coordination-test.js +650 -0
  190. package/scripts/test/ai-mesh-coordination-test.js +416 -0
  191. package/scripts/test/check-links.ts +274 -0
  192. package/scripts/test/check-performance-regression.ts +168 -0
  193. package/scripts/test/cli-agent-coordination-test.js +313 -0
  194. package/scripts/test/coordinator-multilingual-test.js +396 -0
  195. package/scripts/test/coordinator-transparency-demo.js +585 -0
  196. package/scripts/test/coverage-report.ts +692 -0
  197. package/scripts/test/generate-swarm-tests.js +633 -0
  198. package/scripts/test/integration-test-validation.cjs +253 -0
  199. package/scripts/test/load-test-swarm.js +576 -0
  200. package/scripts/test/mesh-coordination-zero-overlap-test.js +740 -0
  201. package/scripts/test/multilingual-hello-world-test.js +390 -0
  202. package/scripts/test/quick-multilingual-demo.js +464 -0
  203. package/scripts/test/real-agent-test.js +312 -0
  204. package/scripts/test/run-phase3-compliance-tests.js +427 -0
  205. package/scripts/test/run-stability-test-examples.sh +292 -0
  206. package/scripts/test/stability-results/stability-metrics.jsonl +83 -0
  207. package/scripts/test/stability-results/stability-test-report.json +128 -0
  208. package/scripts/test/stability-results/stability-test.log +1827 -0
  209. package/scripts/test/stability-test-50-agents.js +734 -0
  210. package/scripts/test/test-batch-tasks.ts +29 -0
  211. package/scripts/test/test-byzantine-resolution.js +246 -0
  212. package/scripts/test/test-claude-spawn-options.sh +63 -0
  213. package/scripts/test/test-cli-wizard.js +331 -0
  214. package/scripts/test/test-comprehensive.js +401 -0
  215. package/scripts/test/test-coordination-features.ts +238 -0
  216. package/scripts/test/test-fallback-systems.js +276 -0
  217. package/scripts/test/test-init-command.ts +302 -0
  218. package/scripts/test/test-mcp.ts +251 -0
  219. package/scripts/test/test-runner.ts +568 -0
  220. package/scripts/test/test-swarm-integration.sh +92 -0
  221. package/scripts/test/test-swarm.ts +142 -0
  222. package/scripts/test/validation-summary.ts +408 -0
  223. package/scripts/test-cleanup-performance.sh +416 -0
  224. package/scripts/test-dashboard-auth.cjs +203 -0
  225. package/scripts/test-docker-deployment.sh +207 -0
  226. package/scripts/test-npm-package.cjs +167 -0
  227. package/scripts/test-provider-routing.cjs +226 -0
  228. package/scripts/test-routing-telemetry.cjs +147 -0
  229. package/scripts/test-runner.cjs +154 -0
  230. package/scripts/test-zai-10k.cjs +81 -0
  231. package/scripts/test-zai-api.cjs +191 -0
  232. package/scripts/test-zai-diagnostic.cjs +151 -0
  233. package/scripts/test-zai-final.cjs +128 -0
  234. package/scripts/test-zai-with-env.cjs +85 -0
  235. package/scripts/utils/README.md +261 -0
  236. package/scripts/utils/clean-build-artifacts.sh +94 -0
  237. package/scripts/utils/cleanup-root.sh +69 -0
  238. package/scripts/utils/fix-cliffy-imports.js +307 -0
  239. package/scripts/utils/fix-duplicate-imports.js +114 -0
  240. package/scripts/utils/fix-error-handling.cjs +70 -0
  241. package/scripts/utils/fix-import-paths.js +104 -0
  242. package/scripts/utils/fix-imports.js +116 -0
  243. package/scripts/utils/fix-shebang.js +78 -0
  244. package/scripts/utils/fix-test-modules.js +27 -0
  245. package/scripts/utils/fix-timezone-issue-246.js +200 -0
  246. package/scripts/utils/fix-ts-comprehensive.py +182 -0
  247. package/scripts/utils/fix-ts-targeted-batch.js +250 -0
  248. package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
  249. package/scripts/utils/simple-test-fixer.js +190 -0
  250. package/scripts/utils/validate-metrics-structure.cjs +144 -0
  251. package/scripts/validate-agent-hooks.js +506 -0
  252. package/scripts/validate-changelog.js +241 -0
  253. package/scripts/validate-coordination-cli.js +69 -0
  254. package/scripts/validate-coordination-toggle-integration.cjs +501 -0
  255. package/scripts/validate-docker-infrastructure.sh +502 -0
  256. package/scripts/validate-entry-points.js +300 -0
  257. package/scripts/validate-stage3-performance.ts +377 -0
  258. package/scripts/validate-template-bundling.js +180 -0
  259. package/scripts/validation/README.md +33 -0
  260. package/scripts/validation/acl-security-validation.cjs +214 -0
  261. package/scripts/validation/acl-security-validation.js +402 -0
  262. package/scripts/validation/byzantine-verification.js +407 -0
  263. package/scripts/validation/final-phase-2-consensus.cjs +219 -0
  264. package/scripts/validation/final-security-validation.js +791 -0
  265. package/scripts/validation/final-wasm-validation.cjs +840 -0
  266. package/scripts/validation/integration-test-analysis.js +105 -0
  267. package/scripts/validation/phase-0-comprehensive-validation.js +474 -0
  268. package/scripts/validation/phase-0-consensus-report.js +139 -0
  269. package/scripts/validation/phase-0-final-report.js +112 -0
  270. package/scripts/validation/phase-0-redis-consensus-report.js +129 -0
  271. package/scripts/validation/phase-0-validation-improved.js +490 -0
  272. package/scripts/validation/phase-0-validation-test.js +65 -0
  273. package/scripts/validation/phase-1-consensus-report.cjs +342 -0
  274. package/scripts/validation/phase-1-consensus-validation.cjs +551 -0
  275. package/scripts/validation/phase-1-consensus-validation.js +551 -0
  276. package/scripts/validation/phase-2-consensus-report.cjs +186 -0
  277. package/scripts/validation/phase-2-validation.cjs +171 -0
  278. package/scripts/validation/phase-2-validation.js +171 -0
  279. package/scripts/validation/phase-4-consensus-report.js +181 -0
  280. package/scripts/validation/phase-4-final-validation.js +351 -0
  281. package/scripts/validation/phase-5-consensus-report.cjs +113 -0
  282. package/scripts/validation/phase-5-consensus-report.js +113 -0
  283. package/scripts/validation/security-analysis.js +49 -0
  284. package/scripts/validation/security-validation.js +492 -0
  285. package/scripts/validation/simple-security-validation.js +464 -0
  286. package/scripts/verify-installation.js +112 -0
  287. package/scripts/verify-mcp-server.js +86 -0
  288. package/scripts/verify-sdk-phase1.cjs +293 -0
@@ -0,0 +1,672 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Claude Flow Novice - Service Manager
5
+ *
6
+ * Cross-platform service management for start/stop/restart operations
7
+ */
8
+
9
+ import { execSync, spawn } from 'child_process';
10
+ import { existsSync, writeFileSync, readFileSync, unlinkSync } from 'fs';
11
+ import { join, dirname } from 'path';
12
+ import { homedir, platform } from 'os';
13
+ import chalk from 'chalk';
14
+ import ora from 'ora';
15
+
16
+ class ServiceManager {
17
+ constructor() {
18
+ this.platform = platform();
19
+ this.homeDir = homedir();
20
+ this.configDir = join(this.homeDir, '.claude-flow-novice', 'config');
21
+ this.logDir = join(this.homeDir, '.claude-flow-novice', 'logs');
22
+ this.services = new Map();
23
+ this.loadServiceConfig();
24
+ }
25
+
26
+ loadServiceConfig() {
27
+ try {
28
+ const configPath = join(this.configDir, 'services.json');
29
+ if (existsSync(configPath)) {
30
+ const config = JSON.parse(readFileSync(configPath, 'utf8'));
31
+ Object.entries(config.services).forEach(([name, config]) => {
32
+ this.services.set(name, config);
33
+ });
34
+ }
35
+ } catch (error) {
36
+ console.warn(chalk.yellow('Warning: Could not load service configuration'));
37
+ }
38
+ }
39
+
40
+ async start(serviceName) {
41
+ if (serviceName) {
42
+ return this.startService(serviceName);
43
+ } else {
44
+ return this.startAllServices();
45
+ }
46
+ }
47
+
48
+ async stop(serviceName) {
49
+ if (serviceName) {
50
+ return this.stopService(serviceName);
51
+ } else {
52
+ return this.stopAllServices();
53
+ }
54
+ }
55
+
56
+ async restart(serviceName) {
57
+ if (serviceName) {
58
+ return this.restartService(serviceName);
59
+ } else {
60
+ return this.restartAllServices();
61
+ }
62
+ }
63
+
64
+ async status(serviceName) {
65
+ if (serviceName) {
66
+ return this.getServiceStatus(serviceName);
67
+ } else {
68
+ return this.getAllServiceStatus();
69
+ }
70
+ }
71
+
72
+ async startService(serviceName) {
73
+ const service = this.services.get(serviceName);
74
+ if (!service) {
75
+ throw new Error(`Unknown service: ${serviceName}`);
76
+ }
77
+
78
+ if (!service.enabled) {
79
+ console.log(chalk.yellow(`Service ${serviceName} is disabled`));
80
+ return false;
81
+ }
82
+
83
+ const spinner = ora(`Starting ${serviceName}...`).start();
84
+
85
+ try {
86
+ const success = await this.executeServiceCommand(serviceName, 'start');
87
+
88
+ if (success) {
89
+ spinner.succeed(`${serviceName} started successfully`);
90
+ await this.logServiceEvent(serviceName, 'start', 'success');
91
+ return true;
92
+ } else {
93
+ spinner.fail(`Failed to start ${serviceName}`);
94
+ await this.logServiceEvent(serviceName, 'start', 'failed');
95
+ return false;
96
+ }
97
+ } catch (error) {
98
+ spinner.fail(`Failed to start ${serviceName}: ${error.message}`);
99
+ await this.logServiceEvent(serviceName, 'start', 'error', error.message);
100
+ throw error;
101
+ }
102
+ }
103
+
104
+ async stopService(serviceName) {
105
+ const service = this.services.get(serviceName);
106
+ if (!service) {
107
+ throw new Error(`Unknown service: ${serviceName}`);
108
+ }
109
+
110
+ const spinner = ora(`Stopping ${serviceName}...`).start();
111
+
112
+ try {
113
+ const success = await this.executeServiceCommand(serviceName, 'stop');
114
+
115
+ if (success) {
116
+ spinner.succeed(`${serviceName} stopped successfully`);
117
+ await this.logServiceEvent(serviceName, 'stop', 'success');
118
+ return true;
119
+ } else {
120
+ spinner.fail(`Failed to stop ${serviceName}`);
121
+ await this.logServiceEvent(serviceName, 'stop', 'failed');
122
+ return false;
123
+ }
124
+ } catch (error) {
125
+ spinner.fail(`Failed to stop ${serviceName}: ${error.message}`);
126
+ await this.logServiceEvent(serviceName, 'stop', 'error', error.message);
127
+ throw error;
128
+ }
129
+ }
130
+
131
+ async restartService(serviceName) {
132
+ const spinner = ora(`Restarting ${serviceName}...`).start();
133
+
134
+ try {
135
+ await this.stopService(serviceName);
136
+ await this.startService(serviceName);
137
+
138
+ spinner.succeed(`${serviceName} restarted successfully`);
139
+ return true;
140
+ } catch (error) {
141
+ spinner.fail(`Failed to restart ${serviceName}: ${error.message}`);
142
+ throw error;
143
+ }
144
+ }
145
+
146
+ async startAllServices() {
147
+ console.log(chalk.blue('Starting all services...\n'));
148
+
149
+ const results = [];
150
+ const enabledServices = Array.from(this.services.entries())
151
+ .filter(([_, config]) => config.enabled)
152
+ .map(([name]) => name);
153
+
154
+ for (const serviceName of enabledServices) {
155
+ try {
156
+ const result = await this.startService(serviceName);
157
+ results.push({ service: serviceName, success: result });
158
+ } catch (error) {
159
+ results.push({ service: serviceName, success: false, error: error.message });
160
+ }
161
+ }
162
+
163
+ this.displayServiceResults(results);
164
+ return results.every(r => r.success);
165
+ }
166
+
167
+ async stopAllServices() {
168
+ console.log(chalk.blue('Stopping all services...\n'));
169
+
170
+ const results = [];
171
+ const runningServices = await this.getRunningServices();
172
+
173
+ for (const serviceName of runningServices) {
174
+ try {
175
+ const result = await this.stopService(serviceName);
176
+ results.push({ service: serviceName, success: result });
177
+ } catch (error) {
178
+ results.push({ service: serviceName, success: false, error: error.message });
179
+ }
180
+ }
181
+
182
+ this.displayServiceResults(results);
183
+ return results.every(r => r.success);
184
+ }
185
+
186
+ async restartAllServices() {
187
+ console.log(chalk.blue('Restarting all services...\n'));
188
+
189
+ const results = [];
190
+ const enabledServices = Array.from(this.services.entries())
191
+ .filter(([_, config]) => config.enabled)
192
+ .map(([name]) => name);
193
+
194
+ for (const serviceName of enabledServices) {
195
+ try {
196
+ const result = await this.restartService(serviceName);
197
+ results.push({ service: serviceName, success: result });
198
+ } catch (error) {
199
+ results.push({ service: serviceName, success: false, error: error.message });
200
+ }
201
+ }
202
+
203
+ this.displayServiceResults(results);
204
+ return results.every(r => r.success);
205
+ }
206
+
207
+ async getServiceStatus(serviceName) {
208
+ const service = this.services.get(serviceName);
209
+ if (!service) {
210
+ throw new Error(`Unknown service: ${serviceName}`);
211
+ }
212
+
213
+ try {
214
+ const status = await this.getServiceProcessStatus(serviceName);
215
+ const health = await this.getServiceHealth(serviceName);
216
+
217
+ return {
218
+ name: serviceName,
219
+ enabled: service.enabled,
220
+ running: status.running,
221
+ pid: status.pid,
222
+ uptime: status.uptime,
223
+ health: health,
224
+ autoStart: service.autoStart
225
+ };
226
+ } catch (error) {
227
+ return {
228
+ name: serviceName,
229
+ enabled: service.enabled,
230
+ running: false,
231
+ error: error.message
232
+ };
233
+ }
234
+ }
235
+
236
+ async getAllServiceStatus() {
237
+ console.log(chalk.blue.bold('Service Status\n'));
238
+
239
+ const results = [];
240
+
241
+ for (const [serviceName, service] of this.services.entries()) {
242
+ try {
243
+ const status = await this.getServiceStatus(serviceName);
244
+ results.push(status);
245
+ } catch (error) {
246
+ results.push({
247
+ name: serviceName,
248
+ enabled: service.enabled,
249
+ running: false,
250
+ error: error.message
251
+ });
252
+ }
253
+ }
254
+
255
+ this.displayServiceStatus(results);
256
+ return results;
257
+ }
258
+
259
+ async executeServiceCommand(serviceName, action) {
260
+ const service = this.services.get(serviceName);
261
+
262
+ switch (serviceName) {
263
+ case 'redis':
264
+ return this.manageRedis(action);
265
+ case 'dashboard':
266
+ return this.manageDashboard(action);
267
+ case 'monitoring':
268
+ return this.manageMonitoring(action);
269
+ default:
270
+ throw new Error(`Unsupported service: ${serviceName}`);
271
+ }
272
+ }
273
+
274
+ async manageRedis(action) {
275
+ try {
276
+ switch (action) {
277
+ case 'start':
278
+ if (this.platform === 'win32') {
279
+ await this.executeCommand('net start redis', { timeout: 30000 });
280
+ } else if (this.platform === 'darwin') {
281
+ await this.executeCommand('brew services start redis', { timeout: 30000 });
282
+ } else {
283
+ await this.executeCommand('sudo systemctl start redis-server', { timeout: 30000 });
284
+ }
285
+ return true;
286
+
287
+ case 'stop':
288
+ if (this.platform === 'win32') {
289
+ await this.executeCommand('net stop redis', { timeout: 30000 });
290
+ } else if (this.platform === 'darwin') {
291
+ await this.executeCommand('brew services stop redis', { timeout: 30000 });
292
+ } else {
293
+ await this.executeCommand('sudo systemctl stop redis-server', { timeout: 30000 });
294
+ }
295
+ return true;
296
+
297
+ default:
298
+ return false;
299
+ }
300
+ } catch (error) {
301
+ // Fallback to direct Redis commands
302
+ try {
303
+ if (action === 'start') {
304
+ const configPath = join(this.configDir, 'redis.json');
305
+ const redisConfig = JSON.parse(readFileSync(configPath, 'utf8'));
306
+
307
+ spawn('redis-server', [redisConfig.configFile], {
308
+ detached: true,
309
+ stdio: 'ignore'
310
+ }).unref();
311
+
312
+ return true;
313
+ } else if (action === 'stop') {
314
+ await this.executeCommand('redis-cli shutdown', { timeout: 10000 });
315
+ return true;
316
+ }
317
+ } catch (fallbackError) {
318
+ throw error;
319
+ }
320
+ }
321
+ }
322
+
323
+ async manageDashboard(action) {
324
+ const dashboardConfig = this.services.get('dashboard');
325
+ if (!dashboardConfig || !dashboardConfig.enabled) {
326
+ return false;
327
+ }
328
+
329
+ try {
330
+ if (action === 'start') {
331
+ const port = dashboardConfig.port || 3000;
332
+ spawn('node', [
333
+ join(this.configDir, '..', '.claude-flow-novice', 'dist', 'src', 'cli', 'main.js'),
334
+ 'dashboard',
335
+ '--port', port.toString()
336
+ ], {
337
+ detached: true,
338
+ stdio: 'ignore'
339
+ }).unref();
340
+
341
+ return true;
342
+ } else if (action === 'stop') {
343
+ const processInfo = await this.findProcessByPort(dashboardConfig.port || 3000);
344
+ if (processInfo) {
345
+ process.kill(processInfo.pid, 'SIGTERM');
346
+ return true;
347
+ }
348
+ }
349
+ } catch (error) {
350
+ throw new Error(`Dashboard ${action} failed: ${error.message}`);
351
+ }
352
+
353
+ return false;
354
+ }
355
+
356
+ async manageMonitoring(action) {
357
+ const monitoringConfig = this.services.get('monitoring');
358
+ if (!monitoringConfig || !monitoringConfig.enabled) {
359
+ return false;
360
+ }
361
+
362
+ try {
363
+ if (action === 'start') {
364
+ spawn('node', [
365
+ join(this.configDir, '..', '.claude-flow-novice', 'dist', 'src', 'cli', 'main.js'),
366
+ 'monitor'
367
+ ], {
368
+ detached: true,
369
+ stdio: 'ignore'
370
+ }).unref();
371
+
372
+ return true;
373
+ } else if (action === 'stop') {
374
+ const processInfo = await this.findProcessByName('claude-flow-monitor');
375
+ if (processInfo) {
376
+ process.kill(processInfo.pid, 'SIGTERM');
377
+ return true;
378
+ }
379
+ }
380
+ } catch (error) {
381
+ throw new Error(`Monitoring ${action} failed: ${error.message}`);
382
+ }
383
+
384
+ return false;
385
+ }
386
+
387
+ async getServiceProcessStatus(serviceName) {
388
+ try {
389
+ let pid = null;
390
+ let uptime = null;
391
+
392
+ switch (serviceName) {
393
+ case 'redis':
394
+ const redisInfo = await this.getRedisInfo();
395
+ pid = redisInfo.process_id;
396
+ uptime = redisInfo.uptime_in_seconds;
397
+ break;
398
+
399
+ case 'dashboard':
400
+ const dashboardConfig = this.services.get('dashboard');
401
+ const dashboardProcess = await this.findProcessByPort(dashboardConfig?.port || 3000);
402
+ if (dashboardProcess) {
403
+ pid = dashboardProcess.pid;
404
+ uptime = Date.now() - dashboardProcess.startTime;
405
+ }
406
+ break;
407
+
408
+ case 'monitoring':
409
+ const monitorProcess = await this.findProcessByName('claude-flow-monitor');
410
+ if (monitorProcess) {
411
+ pid = monitorProcess.pid;
412
+ uptime = Date.now() - monitorProcess.startTime;
413
+ }
414
+ break;
415
+ }
416
+
417
+ return {
418
+ running: pid !== null,
419
+ pid,
420
+ uptime
421
+ };
422
+ } catch (error) {
423
+ return { running: false };
424
+ }
425
+ }
426
+
427
+ async getRedisInfo() {
428
+ try {
429
+ const info = execSync('redis-cli info server', { encoding: 'utf8' });
430
+ const lines = info.split('\r\n');
431
+ const result = {};
432
+
433
+ lines.forEach(line => {
434
+ if (line.includes(':')) {
435
+ const [key, value] = line.split(':');
436
+ result[key] = value;
437
+ }
438
+ });
439
+
440
+ return result;
441
+ } catch (error) {
442
+ return {};
443
+ }
444
+ }
445
+
446
+ async getServiceHealth(serviceName) {
447
+ try {
448
+ switch (serviceName) {
449
+ case 'redis':
450
+ const ping = execSync('redis-cli ping', { encoding: 'utf8' }).trim();
451
+ return ping === 'PONG' ? 'healthy' : 'unhealthy';
452
+
453
+ case 'dashboard':
454
+ const dashboardConfig = this.services.get('dashboard');
455
+ const port = dashboardConfig?.port || 3000;
456
+ // Simple HTTP check
457
+ try {
458
+ const response = await fetch(`http://localhost:${port}/health`);
459
+ return response.ok ? 'healthy' : 'unhealthy';
460
+ } catch (error) {
461
+ return 'unhealthy';
462
+ }
463
+
464
+ default:
465
+ return 'unknown';
466
+ }
467
+ } catch (error) {
468
+ return 'unhealthy';
469
+ }
470
+ }
471
+
472
+ async findProcessByPort(port) {
473
+ try {
474
+ let command;
475
+ if (this.platform === 'win32') {
476
+ command = `netstat -ano | findstr :${port}`;
477
+ } else {
478
+ command = `lsof -i :${port} | grep LISTEN`;
479
+ }
480
+
481
+ const output = execSync(command, { encoding: 'utf8' });
482
+ const lines = output.trim().split('\n');
483
+
484
+ if (lines.length > 0) {
485
+ const parts = lines[0].split(/\s+/);
486
+ const pid = this.platform === 'win32'
487
+ ? parseInt(parts[parts.length - 1])
488
+ : parseInt(parts[1]);
489
+
490
+ return { pid, startTime: Date.now() }; // Simplified
491
+ }
492
+ } catch (error) {
493
+ // Process not found
494
+ }
495
+
496
+ return null;
497
+ }
498
+
499
+ async findProcessByName(name) {
500
+ try {
501
+ let command;
502
+ if (this.platform === 'win32') {
503
+ command = `tasklist | findstr ${name}`;
504
+ } else {
505
+ command = `ps aux | grep ${name} | grep -v grep`;
506
+ }
507
+
508
+ const output = execSync(command, { encoding: 'utf8' });
509
+ const lines = output.trim().split('\n');
510
+
511
+ if (lines.length > 0) {
512
+ const parts = lines[0].split(/\s+/);
513
+ const pid = parseInt(parts[1]);
514
+
515
+ return { pid, startTime: Date.now() }; // Simplified
516
+ }
517
+ } catch (error) {
518
+ // Process not found
519
+ }
520
+
521
+ return null;
522
+ }
523
+
524
+ async getRunningServices() {
525
+ const running = [];
526
+
527
+ for (const [serviceName] of this.services.entries()) {
528
+ const status = await this.getServiceProcessStatus(serviceName);
529
+ if (status.running) {
530
+ running.push(serviceName);
531
+ }
532
+ }
533
+
534
+ return running;
535
+ }
536
+
537
+ displayServiceResults(results) {
538
+ console.log('\n' + chalk.blue.bold('Operation Results:'));
539
+
540
+ results.forEach(result => {
541
+ if (result.success) {
542
+ console.log(chalk.green(` ✅ ${result.service}: Success`));
543
+ } else {
544
+ console.log(chalk.red(` ❌ ${result.service}: ${result.error || 'Failed'}`));
545
+ }
546
+ });
547
+ console.log();
548
+ }
549
+
550
+ displayServiceStatus(statuses) {
551
+ console.log(chalk.blue.bold('Services Status:\n'));
552
+
553
+ statuses.forEach(status => {
554
+ const statusIcon = status.running ? '🟢' : '🔴';
555
+ const enabledIcon = status.enabled ? '✅' : '❌';
556
+ const healthIcon = {
557
+ healthy: '🟢',
558
+ unhealthy: '🔴',
559
+ unknown: '⚪'
560
+ }[status.health] || '⚪';
561
+
562
+ console.log(`${statusIcon} ${chalk.bold(status.name)}`);
563
+ console.log(` Enabled: ${enabledIcon}`);
564
+ console.log(` Health: ${healthIcon}`);
565
+
566
+ if (status.running) {
567
+ console.log(` PID: ${status.pid}`);
568
+ console.log(` Uptime: ${Math.round(status.uptime / 1000)}s`);
569
+ } else if (status.error) {
570
+ console.log(` Error: ${status.error}`);
571
+ }
572
+
573
+ console.log();
574
+ });
575
+ }
576
+
577
+ async logServiceEvent(serviceName, action, result, error = null) {
578
+ const logEntry = {
579
+ timestamp: new Date().toISOString(),
580
+ service: serviceName,
581
+ action,
582
+ result,
583
+ error
584
+ };
585
+
586
+ const logFile = join(this.logDir, 'service-events.log');
587
+
588
+ try {
589
+ if (!existsSync(this.logDir)) {
590
+ require('fs').mkdirSync(this.logDir, { recursive: true });
591
+ }
592
+
593
+ require('fs').appendFileSync(logFile, JSON.stringify(logEntry) + '\n');
594
+ } catch (error) {
595
+ // Log file creation failed - ignore
596
+ }
597
+ }
598
+
599
+ async executeCommand(command, options = {}) {
600
+ return new Promise((resolve, reject) => {
601
+ const child = spawn(command, [], {
602
+ shell: true,
603
+ stdio: 'pipe',
604
+ ...options
605
+ });
606
+
607
+ let stdout = '';
608
+ let stderr = '';
609
+
610
+ child.stdout?.on('data', (data) => stdout += data.toString());
611
+ child.stderr?.on('data', (data) => stderr += data.toString());
612
+
613
+ child.on('close', (code) => {
614
+ if (code === 0) {
615
+ resolve({ stdout, stderr });
616
+ } else {
617
+ reject(new Error(`Command failed with code ${code}: ${stderr}`));
618
+ }
619
+ });
620
+
621
+ child.on('error', reject);
622
+
623
+ if (options.timeout) {
624
+ setTimeout(() => {
625
+ child.kill();
626
+ reject(new Error('Command timeout'));
627
+ }, options.timeout);
628
+ }
629
+ });
630
+ }
631
+ }
632
+
633
+ // CLI Interface
634
+ async function main() {
635
+ const command = process.argv[2];
636
+ const serviceName = process.argv[3];
637
+
638
+ const manager = new ServiceManager();
639
+
640
+ try {
641
+ let result;
642
+
643
+ switch (command) {
644
+ case 'start':
645
+ result = await manager.start(serviceName);
646
+ break;
647
+ case 'stop':
648
+ result = await manager.stop(serviceName);
649
+ break;
650
+ case 'restart':
651
+ result = await manager.restart(serviceName);
652
+ break;
653
+ case 'status':
654
+ result = await manager.status(serviceName);
655
+ break;
656
+ default:
657
+ console.error(chalk.red('Unknown command. Use: start|stop|restart|status [service-name]'));
658
+ process.exit(1);
659
+ }
660
+
661
+ process.exit(result ? 0 : 1);
662
+ } catch (error) {
663
+ console.error(chalk.red('Error:'), error.message);
664
+ process.exit(1);
665
+ }
666
+ }
667
+
668
+ if (import.meta.url === `file://${process.argv[1]}`) {
669
+ main();
670
+ }
671
+
672
+ export default ServiceManager;