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,469 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * API Key Rotation Script
5
+ * Automates the process of rotating API keys and updating configuration
6
+ *
7
+ * Usage:
8
+ * node scripts/security/rotate-api-keys.js [--key=KEY_NAME] [--new-value=VALUE] [--auto]
9
+ *
10
+ * @security Phase 0 Debt Resolution
11
+ */
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+ const readline = require('readline');
16
+ const crypto = require('crypto');
17
+
18
+ // Load SecretsManager
19
+ const { getSecretsManager } = require('../../src/security/SecretsManager.cjs');
20
+
21
+ /**
22
+ * CLI Arguments Parser
23
+ */
24
+ function parseArgs() {
25
+ const args = {
26
+ key: null,
27
+ newValue: null,
28
+ auto: false,
29
+ interactive: true,
30
+ dryRun: false,
31
+ force: false
32
+ };
33
+
34
+ for (let i = 2; i < process.argv.length; i++) {
35
+ const arg = process.argv[i];
36
+
37
+ if (arg.startsWith('--key=')) {
38
+ args.key = arg.split('=')[1];
39
+ } else if (arg.startsWith('--new-value=')) {
40
+ args.newValue = arg.split('=')[1];
41
+ } else if (arg === '--auto') {
42
+ args.auto = true;
43
+ args.interactive = false;
44
+ } else if (arg === '--dry-run') {
45
+ args.dryRun = true;
46
+ } else if (arg === '--force') {
47
+ args.force = true;
48
+ } else if (arg === '--help' || arg === '-h') {
49
+ printHelp();
50
+ process.exit(0);
51
+ }
52
+ }
53
+
54
+ return args;
55
+ }
56
+
57
+ /**
58
+ * Print help message
59
+ */
60
+ function printHelp() {
61
+ console.log(`
62
+ API Key Rotation Script
63
+ ========================
64
+
65
+ Usage:
66
+ node scripts/security/rotate-api-keys.js [OPTIONS]
67
+
68
+ Options:
69
+ --key=KEY_NAME Specific key to rotate (e.g., ANTHROPIC_API_KEY)
70
+ --new-value=VALUE New value for the key
71
+ --auto Auto-generate values for supported keys
72
+ --dry-run Show what would be done without making changes
73
+ --force Force rotation even if key was recently rotated
74
+ --help, -h Show this help message
75
+
76
+ Examples:
77
+ # Interactive rotation (prompts for all inputs)
78
+ node scripts/security/rotate-api-keys.js
79
+
80
+ # Rotate specific key
81
+ node scripts/security/rotate-api-keys.js --key=REDIS_PASSWORD --auto
82
+
83
+ # Rotate with new value
84
+ node scripts/security/rotate-api-keys.js --key=REDIS_PASSWORD --new-value=new-secure-password
85
+
86
+ # Dry run to see what would happen
87
+ node scripts/security/rotate-api-keys.js --key=REDIS_PASSWORD --dry-run
88
+
89
+ Security Notes:
90
+ - API keys should be rotated every 90 days
91
+ - Always test the new key before fully committing
92
+ - Keep a backup of old keys for rollback
93
+ - Update all services using the rotated key
94
+ `);
95
+ }
96
+
97
+ /**
98
+ * Prompt user for input
99
+ */
100
+ async function prompt(question) {
101
+ const rl = readline.createInterface({
102
+ input: process.stdin,
103
+ output: process.stdout
104
+ });
105
+
106
+ return new Promise((resolve) => {
107
+ rl.question(question, (answer) => {
108
+ rl.close();
109
+ resolve(answer);
110
+ });
111
+ });
112
+ }
113
+
114
+ /**
115
+ * Validate key format
116
+ */
117
+ function validateKeyFormat(key, value) {
118
+ const patterns = {
119
+ ANTHROPIC_API_KEY: /^sk-ant-api03-[a-zA-Z0-9\-_]{95}$/,
120
+ Z_AI_API_KEY: /^[a-f0-9]{32}\.[a-zA-Z0-9]{16}$/,
121
+ ZAI_API_KEY: /^[a-f0-9]{32}\.[a-zA-Z0-9]{16}$/,
122
+ NPM_API_KEY: /^npm_[a-zA-Z0-9]{36}$/,
123
+ REDIS_PASSWORD: /^.{32,}$/
124
+ };
125
+
126
+ if (patterns[key]) {
127
+ return patterns[key].test(value);
128
+ }
129
+
130
+ // Generic validation for other keys
131
+ return value && value.length >= 20;
132
+ }
133
+
134
+ /**
135
+ * Auto-generate secure value for supported keys
136
+ */
137
+ function autoGenerateValue(key) {
138
+ switch (key) {
139
+ case 'REDIS_PASSWORD': {
140
+ const length = 64;
141
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;:,.<>?';
142
+ let password = '';
143
+ const randomBytes = crypto.randomBytes(length);
144
+ for (let i = 0; i < length; i++) {
145
+ password += chars[randomBytes[i] % chars.length];
146
+ }
147
+ return password;
148
+ }
149
+
150
+ case 'JWT_SECRET':
151
+ case 'SESSION_SECRET': {
152
+ return crypto.randomBytes(64).toString('hex');
153
+ }
154
+
155
+ default:
156
+ return null;
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Check if key was recently rotated
162
+ */
163
+ async function checkRecentRotation(key, secretsManager) {
164
+ const rotationLogPath = path.join(process.cwd(), 'memory', 'security', 'key-rotations.json');
165
+
166
+ if (!fs.existsSync(rotationLogPath)) {
167
+ return false;
168
+ }
169
+
170
+ const rotations = JSON.parse(fs.readFileSync(rotationLogPath, 'utf8'));
171
+ const recentRotation = rotations
172
+ .filter(r => r.key === key)
173
+ .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp))[0];
174
+
175
+ if (!recentRotation) {
176
+ return false;
177
+ }
178
+
179
+ const rotationDate = new Date(recentRotation.timestamp);
180
+ const daysSinceRotation = Math.floor((Date.now() - rotationDate) / (1000 * 60 * 60 * 24));
181
+
182
+ return daysSinceRotation < 7; // Recently rotated if within 7 days
183
+ }
184
+
185
+ /**
186
+ * Backup current .env file
187
+ */
188
+ function backupEnvFile() {
189
+ const envPath = path.join(process.cwd(), '.env');
190
+ if (!fs.existsSync(envPath)) {
191
+ return null;
192
+ }
193
+
194
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
195
+ const backupPath = path.join(process.cwd(), 'memory', 'security', `env-backup-${timestamp}.txt`);
196
+ const backupDir = path.dirname(backupPath);
197
+
198
+ if (!fs.existsSync(backupDir)) {
199
+ fs.mkdirSync(backupDir, { recursive: true, mode: 0o700 });
200
+ }
201
+
202
+ fs.copyFileSync(envPath, backupPath);
203
+ fs.chmodSync(backupPath, 0o600);
204
+
205
+ return backupPath;
206
+ }
207
+
208
+ /**
209
+ * Rotate a single API key
210
+ */
211
+ async function rotateKey(key, newValue, args) {
212
+ const secretsManager = getSecretsManager();
213
+ await secretsManager.initialize();
214
+
215
+ console.log(`\n🔄 Rotating: ${key}`);
216
+
217
+ // Check if recently rotated
218
+ if (!args.force && await checkRecentRotation(key, secretsManager)) {
219
+ console.log(`⚠️ ${key} was recently rotated (within 7 days)`);
220
+ if (args.interactive) {
221
+ const proceed = await prompt('Continue anyway? (yes/no): ');
222
+ if (proceed.toLowerCase() !== 'yes') {
223
+ console.log('❌ Rotation cancelled');
224
+ return false;
225
+ }
226
+ } else {
227
+ console.log('❌ Use --force to override');
228
+ return false;
229
+ }
230
+ }
231
+
232
+ // Get current value
233
+ const currentValue = secretsManager.getSecret(key);
234
+ if (!currentValue) {
235
+ console.log(`⚠️ ${key} is not currently set`);
236
+ } else {
237
+ console.log(`✅ Current value found (will be backed up)`);
238
+ }
239
+
240
+ // Validate new value
241
+ if (!validateKeyFormat(key, newValue)) {
242
+ console.log(`❌ Invalid format for ${key}`);
243
+ console.log(` Value: ${newValue.substring(0, 20)}...`);
244
+ return false;
245
+ }
246
+
247
+ console.log(`✅ New value validated`);
248
+
249
+ // Dry run check
250
+ if (args.dryRun) {
251
+ console.log(`\n🔍 DRY RUN - Would rotate ${key}`);
252
+ console.log(` Old value: ${currentValue ? currentValue.substring(0, 10) + '...' : 'not set'}`);
253
+ console.log(` New value: ${newValue.substring(0, 10)}...`);
254
+ return true;
255
+ }
256
+
257
+ // Backup .env file
258
+ const backupPath = backupEnvFile();
259
+ if (backupPath) {
260
+ console.log(`💾 Backed up .env to: ${backupPath}`);
261
+ }
262
+
263
+ try {
264
+ // Perform rotation
265
+ await secretsManager.rotateApiKey(key, newValue);
266
+ console.log(`✅ Successfully rotated ${key}`);
267
+
268
+ // Additional actions based on key type
269
+ switch (key) {
270
+ case 'REDIS_PASSWORD':
271
+ console.log(`\n⚠️ IMPORTANT: Update Redis configuration:`);
272
+ console.log(` 1. Update redis.conf: requirepass ${newValue}`);
273
+ console.log(` 2. Restart Redis server`);
274
+ console.log(` 3. Test connection with new password`);
275
+ break;
276
+
277
+ case 'ANTHROPIC_API_KEY':
278
+ console.log(`\n⚠️ IMPORTANT: Update Anthropic dashboard:`);
279
+ console.log(` 1. Revoke old API key in Anthropic console`);
280
+ console.log(` 2. Test new key with a simple request`);
281
+ break;
282
+
283
+ case 'NPM_API_KEY':
284
+ console.log(`\n⚠️ IMPORTANT: Update npm configuration:`);
285
+ console.log(` 1. Verify token in npm: npm whoami`);
286
+ console.log(` 2. Revoke old token in npm website`);
287
+ break;
288
+ }
289
+
290
+ return true;
291
+ } catch (error) {
292
+ console.error(`❌ Rotation failed: ${error.message}`);
293
+
294
+ // Rollback from backup if available
295
+ if (backupPath && fs.existsSync(backupPath)) {
296
+ console.log(`🔄 Rolling back from backup...`);
297
+ fs.copyFileSync(backupPath, path.join(process.cwd(), '.env'));
298
+ console.log(`✅ Rolled back to previous state`);
299
+ }
300
+
301
+ return false;
302
+ }
303
+ }
304
+
305
+ /**
306
+ * Interactive rotation workflow
307
+ */
308
+ async function interactiveRotation() {
309
+ console.log(`
310
+ ╔══════════════════════════════════════════════════════════════╗
311
+ ║ API Key Rotation - Interactive Mode ║
312
+ ╚══════════════════════════════════════════════════════════════╝
313
+ `);
314
+
315
+ const secretsManager = getSecretsManager();
316
+ await secretsManager.initialize();
317
+
318
+ // Check which keys need rotation
319
+ const needRotation = await secretsManager.checkRotationRequired();
320
+
321
+ if (needRotation.length > 0) {
322
+ console.log(`\n⚠️ The following keys need rotation (90+ days):`);
323
+ needRotation.forEach((key, i) => {
324
+ console.log(` ${i + 1}. ${key}`);
325
+ });
326
+ } else {
327
+ console.log(`\n✅ All keys are up to date (rotated within 90 days)`);
328
+ }
329
+
330
+ // Ask which key to rotate
331
+ console.log(`\nAvailable keys to rotate:`);
332
+ const allKeys = ['ANTHROPIC_API_KEY', 'Z_AI_API_KEY', 'NPM_API_KEY', 'REDIS_PASSWORD'];
333
+ allKeys.forEach((key, i) => {
334
+ const current = secretsManager.getSecret(key);
335
+ const status = current ? '✅ set' : '❌ not set';
336
+ const needsRotation = needRotation.includes(key) ? '⚠️ rotation needed' : '';
337
+ console.log(` ${i + 1}. ${key} (${status}) ${needsRotation}`);
338
+ });
339
+
340
+ const keyChoice = await prompt('\nEnter key number to rotate (or "q" to quit): ');
341
+ if (keyChoice.toLowerCase() === 'q') {
342
+ console.log('👋 Goodbye!');
343
+ process.exit(0);
344
+ }
345
+
346
+ const keyIndex = parseInt(keyChoice) - 1;
347
+ if (keyIndex < 0 || keyIndex >= allKeys.length) {
348
+ console.log('❌ Invalid selection');
349
+ process.exit(1);
350
+ }
351
+
352
+ const selectedKey = allKeys[keyIndex];
353
+
354
+ // Check if auto-generate is available
355
+ const canAutoGenerate = autoGenerateValue(selectedKey) !== null;
356
+ let newValue;
357
+
358
+ if (canAutoGenerate) {
359
+ const autoGen = await prompt(`Auto-generate secure value? (yes/no): `);
360
+ if (autoGen.toLowerCase() === 'yes') {
361
+ newValue = autoGenerateValue(selectedKey);
362
+ console.log(`✅ Generated secure value`);
363
+ } else {
364
+ newValue = await prompt(`Enter new value for ${selectedKey}: `);
365
+ }
366
+ } else {
367
+ newValue = await prompt(`Enter new value for ${selectedKey}: `);
368
+ }
369
+
370
+ // Confirm rotation
371
+ console.log(`\n📋 Rotation Summary:`);
372
+ console.log(` Key: ${selectedKey}`);
373
+ console.log(` New value: ${newValue.substring(0, 20)}...`);
374
+
375
+ const confirm = await prompt('\nProceed with rotation? (yes/no): ');
376
+ if (confirm.toLowerCase() !== 'yes') {
377
+ console.log('❌ Rotation cancelled');
378
+ process.exit(0);
379
+ }
380
+
381
+ // Perform rotation
382
+ const args = { interactive: true, dryRun: false, force: false };
383
+ const success = await rotateKey(selectedKey, newValue, args);
384
+
385
+ if (success) {
386
+ console.log(`\n✅ Rotation complete!`);
387
+
388
+ // Generate security audit
389
+ console.log(`\n📊 Generating security audit...`);
390
+ const audit = await secretsManager.generateSecurityAudit();
391
+ console.log(`\nSecurity Status:`);
392
+ console.log(` Total secrets: ${audit.secrets.total}`);
393
+ console.log(` Missing required: ${audit.secrets.missing.length}`);
394
+ console.log(` Keys needing rotation: ${audit.rotation.needRotation.length}`);
395
+
396
+ if (audit.recommendations.length > 0) {
397
+ console.log(`\n⚠️ Recommendations:`);
398
+ audit.recommendations.forEach((rec, i) => {
399
+ console.log(` ${i + 1}. [${rec.severity}] ${rec.message}`);
400
+ });
401
+ }
402
+ } else {
403
+ console.log(`\n❌ Rotation failed`);
404
+ process.exit(1);
405
+ }
406
+ }
407
+
408
+ /**
409
+ * Main function
410
+ */
411
+ async function main() {
412
+ const args = parseArgs();
413
+
414
+ console.log(`
415
+ ╔══════════════════════════════════════════════════════════════╗
416
+ ║ Claude Flow Novice - API Key Rotation ║
417
+ ║ Phase 0 Security Debt ║
418
+ ╚══════════════════════════════════════════════════════════════╝
419
+ `);
420
+
421
+ // Interactive mode
422
+ if (args.interactive && !args.key) {
423
+ await interactiveRotation();
424
+ return;
425
+ }
426
+
427
+ // Command-line mode
428
+ if (!args.key) {
429
+ console.log('❌ --key parameter required in non-interactive mode');
430
+ console.log(' Use --help for usage information');
431
+ process.exit(1);
432
+ }
433
+
434
+ let newValue = args.newValue;
435
+
436
+ // Auto-generate if requested
437
+ if (args.auto) {
438
+ newValue = autoGenerateValue(args.key);
439
+ if (!newValue) {
440
+ console.log(`❌ Auto-generation not supported for ${args.key}`);
441
+ console.log(' Provide --new-value instead');
442
+ process.exit(1);
443
+ }
444
+ console.log(`✅ Auto-generated secure value for ${args.key}`);
445
+ }
446
+
447
+ if (!newValue) {
448
+ console.log('❌ --new-value or --auto required');
449
+ process.exit(1);
450
+ }
451
+
452
+ // Perform rotation
453
+ const success = await rotateKey(args.key, newValue, args);
454
+
455
+ if (success) {
456
+ console.log(`\n✅ Rotation complete!`);
457
+ process.exit(0);
458
+ } else {
459
+ console.log(`\n❌ Rotation failed`);
460
+ process.exit(1);
461
+ }
462
+ }
463
+
464
+ // Run main function
465
+ main().catch((error) => {
466
+ console.error('❌ Fatal error:', error.message);
467
+ console.error(error.stack);
468
+ process.exit(1);
469
+ });
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Safe wrapper for ruv-swarm MCP server
5
+ * Handles known logger issue in v1.0.8
6
+ */
7
+
8
+ import { spawn } from 'child_process';
9
+ import { createInterface } from 'readline';
10
+
11
+ console.log('🚀 Starting ruv-swarm MCP server with error handling...');
12
+
13
+ const ruvSwarmProcess = spawn('npx', ['ruv-swarm', 'mcp', 'start'], {
14
+ stdio: ['pipe', 'pipe', 'pipe'],
15
+ env: {
16
+ ...process.env,
17
+ MCP_MODE: 'stdio',
18
+ LOG_LEVEL: 'WARN'
19
+ }
20
+ });
21
+
22
+ // Forward stdin to ruv-swarm
23
+ process.stdin.pipe(ruvSwarmProcess.stdin);
24
+
25
+ // Handle stdout (JSON-RPC messages)
26
+ ruvSwarmProcess.stdout.pipe(process.stdout);
27
+
28
+ // Handle stderr with filtering
29
+ const rlErr = createInterface({
30
+ input: ruvSwarmProcess.stderr,
31
+ crlfDelay: Infinity
32
+ });
33
+
34
+ let errorHandled = false;
35
+
36
+ rlErr.on('line', (line) => {
37
+ // Filter out the known logger error
38
+ if (line.includes('logger.logMemoryUsage is not a function')) {
39
+ if (!errorHandled) {
40
+ console.error('⚠️ Known ruv-swarm v1.0.8 logger issue detected - continuing normally');
41
+ console.error('💡 This error does not affect functionality');
42
+ errorHandled = true;
43
+ }
44
+ return;
45
+ }
46
+
47
+ // Forward other stderr output
48
+ process.stderr.write(line + '\n');
49
+ });
50
+
51
+ // Handle process exit
52
+ ruvSwarmProcess.on('exit', (code, signal) => {
53
+ if (code !== null && code !== 0) {
54
+ console.error(`\n❌ ruv-swarm exited with code ${code}`);
55
+ console.error('💡 Try using: npx claude-flow@alpha mcp start');
56
+ }
57
+ process.exit(code || 0);
58
+ });
59
+
60
+ // Handle errors
61
+ ruvSwarmProcess.on('error', (error) => {
62
+ console.error('❌ Failed to start ruv-swarm:', error.message);
63
+ console.error('💡 Try using: npx claude-flow@alpha mcp start');
64
+ process.exit(1);
65
+ });
66
+
67
+ // Handle termination signals
68
+ process.on('SIGTERM', () => {
69
+ ruvSwarmProcess.kill('SIGTERM');
70
+ });
71
+
72
+ process.on('SIGINT', () => {
73
+ ruvSwarmProcess.kill('SIGINT');
74
+ });