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,664 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Path Update Automation Script
5
+ *
6
+ * Automated search/replace path updates with validation and safety features.
7
+ * Supports JSON, YAML, JavaScript, and Markdown files with syntax validation.
8
+ *
9
+ * Features:
10
+ * - Regex pattern-based path updates
11
+ * - JSON/YAML/JavaScript syntax validation after updates
12
+ * - Backup creation before modifications
13
+ * - Dry-run mode
14
+ * - File type filtering
15
+ * - Pattern configuration via JSON file or CLI args
16
+ * - Detailed change reporting
17
+ *
18
+ * Usage:
19
+ * node scripts/migration/update-paths.js --pattern "node test-" --replacement "node tests/manual/test-" --types yml,json,js,md
20
+ * node scripts/migration/update-paths.js --config patterns.json --dry-run
21
+ * node scripts/migration/update-paths.js --pattern "\.claude-flow-novice/dist" --replacement "dist/" --regex
22
+ *
23
+ * @module scripts/migration/update-paths
24
+ */
25
+
26
+ import { promises as fs } from 'fs';
27
+ import path from 'path';
28
+ import { glob } from 'glob';
29
+ import yaml from 'yaml';
30
+
31
+ // ANSI color codes for terminal output
32
+ const colors = {
33
+ reset: '\x1b[0m',
34
+ bright: '\x1b[1m',
35
+ red: '\x1b[31m',
36
+ green: '\x1b[32m',
37
+ yellow: '\x1b[33m',
38
+ blue: '\x1b[34m',
39
+ cyan: '\x1b[36m',
40
+ magenta: '\x1b[35m'
41
+ };
42
+
43
+ /**
44
+ * Validates JSON syntax by attempting to parse
45
+ * @param {string} content - File content to validate
46
+ * @returns {Object} Validation result with success flag and error if any
47
+ */
48
+ function validateJSON(content) {
49
+ try {
50
+ JSON.parse(content);
51
+ return { valid: true };
52
+ } catch (error) {
53
+ return { valid: false, error: error.message };
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Validates YAML syntax by attempting to parse
59
+ * @param {string} content - File content to validate
60
+ * @returns {Object} Validation result with success flag and error if any
61
+ */
62
+ function validateYAML(content) {
63
+ try {
64
+ yaml.parse(content);
65
+ return { valid: true };
66
+ } catch (error) {
67
+ return { valid: false, error: error.message };
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Validates JavaScript syntax using basic checks
73
+ * Full AST parsing would require additional dependencies
74
+ * @param {string} content - File content to validate
75
+ * @returns {Object} Validation result with success flag and error if any
76
+ */
77
+ function validateJavaScript(content) {
78
+ try {
79
+ // Basic syntax validation - check for common syntax errors
80
+ // This is a simplified check - full AST parsing would be more comprehensive
81
+
82
+ // Check for balanced braces/brackets/parentheses
83
+ const braceBalance = (content.match(/\{/g) || []).length - (content.match(/\}/g) || []).length;
84
+ const bracketBalance = (content.match(/\[/g) || []).length - (content.match(/\]/g) || []).length;
85
+ const parenBalance = (content.match(/\(/g) || []).length - (content.match(/\)/g) || []).length;
86
+
87
+ if (braceBalance !== 0) {
88
+ return { valid: false, error: 'Unbalanced curly braces' };
89
+ }
90
+ if (bracketBalance !== 0) {
91
+ return { valid: false, error: 'Unbalanced square brackets' };
92
+ }
93
+ if (parenBalance !== 0) {
94
+ return { valid: false, error: 'Unbalanced parentheses' };
95
+ }
96
+
97
+ // Try to use Function constructor for basic syntax check (not executed)
98
+ // This is a limited check but catches many syntax errors
99
+ try {
100
+ new Function(content);
101
+ } catch (error) {
102
+ // Function constructor error indicates syntax issue
103
+ return { valid: false, error: error.message };
104
+ }
105
+
106
+ return { valid: true };
107
+ } catch (error) {
108
+ return { valid: false, error: error.message };
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Validates Markdown syntax (basic structure check)
114
+ * @param {string} content - File content to validate
115
+ * @returns {Object} Validation result with success flag and error if any
116
+ */
117
+ function validateMarkdown(content) {
118
+ // Markdown is more forgiving, but we can check for common issues
119
+ try {
120
+ // Check for balanced code fences
121
+ const codeFences = (content.match(/```/g) || []).length;
122
+ if (codeFences % 2 !== 0) {
123
+ return { valid: false, error: 'Unbalanced code fences (```)' };
124
+ }
125
+
126
+ // Check for balanced inline code
127
+ const lines = content.split('\n');
128
+ for (let i = 0; i < lines.length; i++) {
129
+ const line = lines[i];
130
+ // Skip code fence lines
131
+ if (line.trim().startsWith('```')) continue;
132
+
133
+ const backticks = (line.match(/`/g) || []).length;
134
+ if (backticks % 2 !== 0) {
135
+ return { valid: false, error: `Unbalanced backticks on line ${i + 1}` };
136
+ }
137
+ }
138
+
139
+ return { valid: true };
140
+ } catch (error) {
141
+ return { valid: false, error: error.message };
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Get validator function based on file extension
147
+ * @param {string} filePath - Path to file
148
+ * @returns {Function|null} Validator function or null if no validator
149
+ */
150
+ function getValidator(filePath) {
151
+ const ext = path.extname(filePath).toLowerCase();
152
+
153
+ const validators = {
154
+ '.json': validateJSON,
155
+ '.yml': validateYAML,
156
+ '.yaml': validateYAML,
157
+ '.js': validateJavaScript,
158
+ '.mjs': validateJavaScript,
159
+ '.cjs': validateJavaScript,
160
+ '.md': validateMarkdown
161
+ };
162
+
163
+ return validators[ext] || null;
164
+ }
165
+
166
+ /**
167
+ * Create backup of file before modification
168
+ * @param {string} filePath - Path to file to backup
169
+ * @returns {Promise<string>} Path to backup file
170
+ */
171
+ async function createBackup(filePath) {
172
+ const backupPath = `${filePath}.backup-${Date.now()}`;
173
+ await fs.copyFile(filePath, backupPath);
174
+ return backupPath;
175
+ }
176
+
177
+ /**
178
+ * Apply pattern replacement to file content
179
+ * @param {string} content - Original file content
180
+ * @param {Object} pattern - Pattern configuration
181
+ * @param {boolean} isRegex - Whether pattern is regex
182
+ * @returns {Object} Result with updated content and match count
183
+ */
184
+ function applyPattern(content, pattern, isRegex = false) {
185
+ let updatedContent;
186
+ let matchCount = 0;
187
+
188
+ if (isRegex) {
189
+ // Use regex pattern
190
+ const regex = new RegExp(pattern.pattern, 'g');
191
+ const matches = content.match(regex);
192
+ matchCount = matches ? matches.length : 0;
193
+ updatedContent = content.replace(regex, pattern.replacement);
194
+ } else {
195
+ // Use string literal pattern
196
+ const parts = content.split(pattern.pattern);
197
+ matchCount = parts.length - 1;
198
+ updatedContent = parts.join(pattern.replacement);
199
+ }
200
+
201
+ return {
202
+ content: updatedContent,
203
+ matchCount,
204
+ changed: matchCount > 0
205
+ };
206
+ }
207
+
208
+ /**
209
+ * Process a single file with pattern updates
210
+ * @param {string} filePath - Path to file to process
211
+ * @param {Array<Object>} patterns - Array of pattern configurations
212
+ * @param {Object} options - Processing options
213
+ * @returns {Promise<Object>} Processing result
214
+ */
215
+ async function processFile(filePath, patterns, options = {}) {
216
+ const { dryRun = false, createBackups = true, verbose = false } = options;
217
+
218
+ try {
219
+ // Read original content
220
+ const originalContent = await fs.readFile(filePath, 'utf8');
221
+ let currentContent = originalContent;
222
+
223
+ const changes = [];
224
+ let totalMatches = 0;
225
+
226
+ // Apply all patterns
227
+ for (const pattern of patterns) {
228
+ const result = applyPattern(currentContent, pattern, options.regex);
229
+
230
+ if (result.changed) {
231
+ changes.push({
232
+ pattern: pattern.pattern,
233
+ replacement: pattern.replacement,
234
+ matches: result.matchCount
235
+ });
236
+ totalMatches += result.matchCount;
237
+ currentContent = result.content;
238
+ }
239
+ }
240
+
241
+ // If no changes, return early
242
+ if (totalMatches === 0) {
243
+ return {
244
+ filePath,
245
+ processed: true,
246
+ changed: false,
247
+ changes: [],
248
+ validated: true
249
+ };
250
+ }
251
+
252
+ // Validate updated content
253
+ const validator = getValidator(filePath);
254
+ let validationResult = { valid: true };
255
+
256
+ if (validator) {
257
+ validationResult = validator(currentContent);
258
+
259
+ if (!validationResult.valid) {
260
+ return {
261
+ filePath,
262
+ processed: false,
263
+ changed: false,
264
+ changes,
265
+ validated: false,
266
+ error: `Validation failed: ${validationResult.error}`,
267
+ totalMatches
268
+ };
269
+ }
270
+ }
271
+
272
+ // Create backup and write updated content (unless dry-run)
273
+ if (!dryRun) {
274
+ if (createBackups) {
275
+ const backupPath = await createBackup(filePath);
276
+ if (verbose) {
277
+ console.log(`${colors.cyan}Backup created: ${backupPath}${colors.reset}`);
278
+ }
279
+ }
280
+
281
+ await fs.writeFile(filePath, currentContent, 'utf8');
282
+ }
283
+
284
+ return {
285
+ filePath,
286
+ processed: true,
287
+ changed: true,
288
+ changes,
289
+ validated: validationResult.valid,
290
+ totalMatches,
291
+ dryRun
292
+ };
293
+
294
+ } catch (error) {
295
+ return {
296
+ filePath,
297
+ processed: false,
298
+ changed: false,
299
+ error: error.message
300
+ };
301
+ }
302
+ }
303
+
304
+ /**
305
+ * Find files matching type filters
306
+ * @param {Array<string>} types - File extensions to include
307
+ * @param {string} basePath - Base directory to search
308
+ * @returns {Promise<Array<string>>} Array of matching file paths
309
+ */
310
+ async function findFiles(types, basePath = process.cwd()) {
311
+ const patterns = types.map(type => {
312
+ const ext = type.startsWith('.') ? type : `.${type}`;
313
+ return `**/*${ext}`;
314
+ });
315
+
316
+ const allFiles = [];
317
+
318
+ for (const pattern of patterns) {
319
+ const files = await glob(pattern, {
320
+ cwd: basePath,
321
+ absolute: true,
322
+ ignore: [
323
+ '**/node_modules/**',
324
+ '**/.git/**',
325
+ '**/dist/**',
326
+ '**/.claude-flow-novice/**',
327
+ '**/backup-*/**',
328
+ '**/*.backup-*'
329
+ ]
330
+ });
331
+ allFiles.push(...files);
332
+ }
333
+
334
+ // Remove duplicates
335
+ return [...new Set(allFiles)];
336
+ }
337
+
338
+ /**
339
+ * Generate detailed report of changes
340
+ * @param {Array<Object>} results - Processing results
341
+ * @param {boolean} dryRun - Whether this was a dry run
342
+ */
343
+ function generateReport(results, dryRun = false) {
344
+ const processed = results.filter(r => r.processed);
345
+ const changed = results.filter(r => r.changed);
346
+ const errors = results.filter(r => r.error);
347
+ const validationErrors = results.filter(r => !r.validated);
348
+
349
+ console.log(`\n${colors.bright}${colors.blue}=== Path Update Report ===${colors.reset}\n`);
350
+
351
+ if (dryRun) {
352
+ console.log(`${colors.yellow}${colors.bright}DRY RUN MODE - No files were modified${colors.reset}\n`);
353
+ }
354
+
355
+ console.log(`${colors.bright}Summary:${colors.reset}`);
356
+ console.log(` Total files processed: ${processed.length}`);
357
+ console.log(` Files with changes: ${changed.length}`);
358
+ console.log(` Files with errors: ${errors.length}`);
359
+ console.log(` Validation failures: ${validationErrors.length}`);
360
+
361
+ if (changed.length > 0) {
362
+ console.log(`\n${colors.bright}${colors.green}Changed Files:${colors.reset}`);
363
+ changed.forEach(result => {
364
+ console.log(`\n ${colors.cyan}${result.filePath}${colors.reset}`);
365
+ console.log(` Total matches: ${result.totalMatches}`);
366
+ result.changes.forEach(change => {
367
+ console.log(` - "${change.pattern}" → "${change.replacement}" (${change.matches} matches)`);
368
+ });
369
+ });
370
+ }
371
+
372
+ if (errors.length > 0) {
373
+ console.log(`\n${colors.bright}${colors.red}Errors:${colors.reset}`);
374
+ errors.forEach(result => {
375
+ console.log(` ${colors.red}${result.filePath}${colors.reset}`);
376
+ console.log(` ${result.error}`);
377
+ });
378
+ }
379
+
380
+ if (validationErrors.length > 0) {
381
+ console.log(`\n${colors.bright}${colors.yellow}Validation Failures:${colors.reset}`);
382
+ validationErrors.forEach(result => {
383
+ console.log(` ${colors.yellow}${result.filePath}${colors.reset}`);
384
+ console.log(` ${result.error}`);
385
+ });
386
+ }
387
+
388
+ console.log('');
389
+ }
390
+
391
+ /**
392
+ * Parse command line arguments
393
+ * @param {Array<string>} argv - Command line arguments
394
+ * @returns {Object} Parsed options
395
+ */
396
+ function parseArgs(argv) {
397
+ const args = argv.slice(2);
398
+ const options = {
399
+ patterns: [],
400
+ types: ['yml', 'yaml', 'json', 'js', 'mjs', 'cjs', 'md'],
401
+ dryRun: false,
402
+ regex: false,
403
+ verbose: false,
404
+ configFile: null,
405
+ createBackups: true
406
+ };
407
+
408
+ for (let i = 0; i < args.length; i++) {
409
+ const arg = args[i];
410
+
411
+ switch (arg) {
412
+ case '--pattern':
413
+ case '-p':
414
+ if (i + 1 < args.length) {
415
+ options.patternString = args[++i];
416
+ }
417
+ break;
418
+
419
+ case '--replacement':
420
+ case '-r':
421
+ if (i + 1 < args.length) {
422
+ options.replacementString = args[++i];
423
+ }
424
+ break;
425
+
426
+ case '--config':
427
+ case '-c':
428
+ if (i + 1 < args.length) {
429
+ options.configFile = args[++i];
430
+ }
431
+ break;
432
+
433
+ case '--types':
434
+ case '-t':
435
+ if (i + 1 < args.length) {
436
+ options.types = args[++i].split(',').map(t => t.trim());
437
+ }
438
+ break;
439
+
440
+ case '--dry-run':
441
+ case '-d':
442
+ options.dryRun = true;
443
+ break;
444
+
445
+ case '--regex':
446
+ options.regex = true;
447
+ break;
448
+
449
+ case '--verbose':
450
+ case '-v':
451
+ options.verbose = true;
452
+ break;
453
+
454
+ case '--no-backup':
455
+ options.createBackups = false;
456
+ break;
457
+
458
+ case '--help':
459
+ case '-h':
460
+ options.showHelp = true;
461
+ break;
462
+ }
463
+ }
464
+
465
+ // Build patterns array
466
+ if (options.patternString && options.replacementString) {
467
+ options.patterns.push({
468
+ pattern: options.patternString,
469
+ replacement: options.replacementString
470
+ });
471
+ }
472
+
473
+ return options;
474
+ }
475
+
476
+ /**
477
+ * Load patterns from configuration file
478
+ * @param {string} configPath - Path to config file
479
+ * @returns {Promise<Array<Object>>} Array of pattern configurations
480
+ */
481
+ async function loadConfig(configPath) {
482
+ try {
483
+ const content = await fs.readFile(configPath, 'utf8');
484
+ const config = JSON.parse(content);
485
+
486
+ if (!Array.isArray(config.patterns)) {
487
+ throw new Error('Config file must contain a "patterns" array');
488
+ }
489
+
490
+ return config.patterns;
491
+ } catch (error) {
492
+ throw new Error(`Failed to load config file: ${error.message}`);
493
+ }
494
+ }
495
+
496
+ /**
497
+ * Display help message
498
+ */
499
+ function showHelp() {
500
+ console.log(`
501
+ ${colors.bright}${colors.blue}Path Update Automation Script${colors.reset}
502
+
503
+ ${colors.bright}Usage:${colors.reset}
504
+ node scripts/migration/update-paths.js [options]
505
+
506
+ ${colors.bright}Options:${colors.reset}
507
+ -p, --pattern <pattern> Search pattern (string or regex)
508
+ -r, --replacement <replacement> Replacement string
509
+ -c, --config <file> Load patterns from JSON config file
510
+ -t, --types <types> Comma-separated file types (default: yml,yaml,json,js,mjs,cjs,md)
511
+ -d, --dry-run Preview changes without modifying files
512
+ --regex Treat pattern as regex
513
+ -v, --verbose Verbose output
514
+ --no-backup Skip backup creation
515
+ -h, --help Show this help message
516
+
517
+ ${colors.bright}Examples:${colors.reset}
518
+ # Simple string replacement
519
+ node scripts/migration/update-paths.js \\
520
+ --pattern "node test-" \\
521
+ --replacement "node tests/manual/test-" \\
522
+ --types yml,json,js
523
+
524
+ # Regex replacement
525
+ node scripts/migration/update-paths.js \\
526
+ --pattern "\\.claude-flow-novice/dist" \\
527
+ --replacement "dist/" \\
528
+ --regex
529
+
530
+ # Load patterns from config file
531
+ node scripts/migration/update-paths.js \\
532
+ --config patterns.json \\
533
+ --dry-run
534
+
535
+ # Process only YAML files with verbose output
536
+ node scripts/migration/update-paths.js \\
537
+ --pattern "test-results/" \\
538
+ --replacement ".artifacts/test-results/" \\
539
+ --types yml \\
540
+ --verbose
541
+
542
+ ${colors.bright}Config File Format (JSON):${colors.reset}
543
+ {
544
+ "patterns": [
545
+ {
546
+ "pattern": "node test-",
547
+ "replacement": "node tests/manual/test-"
548
+ },
549
+ {
550
+ "pattern": "\\\\.claude-flow-novice/dist",
551
+ "replacement": "dist/"
552
+ }
553
+ ]
554
+ }
555
+
556
+ ${colors.bright}Supported File Types:${colors.reset}
557
+ - .yml, .yaml (YAML validation)
558
+ - .json (JSON validation)
559
+ - .js, .mjs, .cjs (JavaScript validation)
560
+ - .md (Markdown validation)
561
+
562
+ ${colors.bright}Safety Features:${colors.reset}
563
+ - Automatic backups before modification
564
+ - Syntax validation after updates
565
+ - Dry-run mode for preview
566
+ - Detailed change reporting
567
+ `);
568
+ }
569
+
570
+ /**
571
+ * Main execution function
572
+ */
573
+ async function main() {
574
+ const options = parseArgs(process.argv);
575
+
576
+ if (options.showHelp) {
577
+ showHelp();
578
+ process.exit(0);
579
+ }
580
+
581
+ try {
582
+ // Load patterns from config file if specified
583
+ if (options.configFile) {
584
+ const configPatterns = await loadConfig(options.configFile);
585
+ options.patterns.push(...configPatterns);
586
+ }
587
+
588
+ // Validate we have patterns to apply
589
+ if (options.patterns.length === 0) {
590
+ console.error(`${colors.red}Error: No patterns specified. Use --pattern/--replacement or --config${colors.reset}`);
591
+ console.log(`Run with --help for usage information`);
592
+ process.exit(1);
593
+ }
594
+
595
+ console.log(`${colors.bright}${colors.blue}Path Update Automation${colors.reset}\n`);
596
+
597
+ if (options.dryRun) {
598
+ console.log(`${colors.yellow}Running in DRY RUN mode - no files will be modified${colors.reset}\n`);
599
+ }
600
+
601
+ console.log(`${colors.bright}Configuration:${colors.reset}`);
602
+ console.log(` File types: ${options.types.join(', ')}`);
603
+ console.log(` Patterns: ${options.patterns.length}`);
604
+ console.log(` Regex mode: ${options.regex ? 'enabled' : 'disabled'}`);
605
+ console.log(` Backups: ${options.createBackups ? 'enabled' : 'disabled'}`);
606
+
607
+ // Find files to process
608
+ console.log(`\n${colors.cyan}Scanning for files...${colors.reset}`);
609
+ const files = await findFiles(options.types);
610
+ console.log(`Found ${files.length} files to process\n`);
611
+
612
+ // Process all files
613
+ const results = [];
614
+ for (const file of files) {
615
+ if (options.verbose) {
616
+ console.log(`Processing: ${file}`);
617
+ }
618
+
619
+ const result = await processFile(file, options.patterns, {
620
+ dryRun: options.dryRun,
621
+ createBackups: options.createBackups,
622
+ verbose: options.verbose,
623
+ regex: options.regex
624
+ });
625
+
626
+ results.push(result);
627
+ }
628
+
629
+ // Generate report
630
+ generateReport(results, options.dryRun);
631
+
632
+ // Exit with error code if there were errors
633
+ const hasErrors = results.some(r => r.error || !r.validated);
634
+ process.exit(hasErrors ? 1 : 0);
635
+
636
+ } catch (error) {
637
+ console.error(`${colors.red}${colors.bright}Fatal Error:${colors.reset} ${error.message}`);
638
+ if (options.verbose) {
639
+ console.error(error.stack);
640
+ }
641
+ process.exit(1);
642
+ }
643
+ }
644
+
645
+ // Run if executed directly
646
+ if (import.meta.url === `file://${process.argv[1]}`) {
647
+ main();
648
+ }
649
+
650
+ // Export for testing
651
+ export {
652
+ validateJSON,
653
+ validateYAML,
654
+ validateJavaScript,
655
+ validateMarkdown,
656
+ getValidator,
657
+ createBackup,
658
+ applyPattern,
659
+ processFile,
660
+ findFiles,
661
+ generateReport,
662
+ parseArgs,
663
+ loadConfig
664
+ };