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,425 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Release Announcement Script
5
+ * Generates formatted release announcements for various platforms
6
+ */
7
+
8
+ import { execSync } from 'child_process';
9
+ import fs from 'fs';
10
+ import path from 'path';
11
+ import { fileURLToPath } from 'url';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+ const rootDir = path.join(__dirname, '..');
16
+
17
+ const packageJson = JSON.parse(fs.readFileSync(path.join(rootDir, 'package.json'), 'utf8'));
18
+ const version = packageJson.version;
19
+ const packageName = packageJson.name;
20
+ const description = packageJson.description;
21
+ const repository = packageJson.repository;
22
+
23
+ class ReleaseAnnouncement {
24
+ constructor() {
25
+ this.packageName = packageName;
26
+ this.version = version;
27
+ this.description = description;
28
+ this.repository = repository;
29
+ }
30
+
31
+ async generateAnnouncements() {
32
+ console.log(`📢 Generating release announcements for ${this.packageName}@${this.version}`);
33
+
34
+ const changelog = this.extractChangelogEntry();
35
+
36
+ if (!changelog) {
37
+ console.log('⚠️ No changelog entry found - generating basic announcement');
38
+ }
39
+
40
+ // Generate announcements for different platforms
41
+ await this.generateGitHubAnnouncement(changelog);
42
+ await this.generateTwitterAnnouncement(changelog);
43
+ await this.generateSlackAnnouncement(changelog);
44
+ await this.generateEmailAnnouncement(changelog);
45
+ await this.generateDiscordAnnouncement(changelog);
46
+
47
+ console.log('✅ All release announcements generated');
48
+ }
49
+
50
+ extractChangelogEntry() {
51
+ try {
52
+ const changelogPath = path.join(rootDir, 'CHANGELOG.md');
53
+ if (!fs.existsSync(changelogPath)) {
54
+ return null;
55
+ }
56
+
57
+ const content = fs.readFileSync(changelogPath, 'utf8');
58
+ const versionRegex = new RegExp(`## \\[${this.version.replace('.', '\\.')}\\][\\s\\S]*?(?=## \\[|$)`);
59
+ const match = content.match(versionRegex);
60
+
61
+ if (match) {
62
+ let changelogEntry = match[0];
63
+ changelogEntry = changelogEntry.replace(/^## \[[^\]]+\][\s\n]*/, '').trim();
64
+ return changelogEntry;
65
+ }
66
+
67
+ return null;
68
+ } catch (error) {
69
+ console.log('⚠️ Error extracting changelog:', error.message);
70
+ return null;
71
+ }
72
+ }
73
+
74
+ async generateGitHubAnnouncement(changelog) {
75
+ console.log('📝 Generating GitHub announcement...');
76
+
77
+ const announcement = this.formatGitHubRelease(changelog);
78
+ const filePath = path.join(rootDir, `RELEASE_ANNOUNCEMENT_GITHUB_v${this.version}.md`);
79
+
80
+ fs.writeFileSync(filePath, announcement, 'utf8');
81
+ console.log(`✅ GitHub announcement saved to ${filePath}`);
82
+
83
+ // Also output to console for easy copy-paste
84
+ console.log('\n📋 GitHub Release Content:');
85
+ console.log('='.repeat(50));
86
+ console.log(announcement);
87
+ console.log('='.repeat(50));
88
+ }
89
+
90
+ formatGitHubRelease(changelog) {
91
+ const date = new Date().toLocaleDateString();
92
+ const repoUrl = this.repository.url.replace('git+https://github.com/', '').replace('.git', '');
93
+
94
+ let content = `# 🎉 Release v${this.version}
95
+
96
+ **Published:** ${date}
97
+ **Package:** \`${this.packageName}\`
98
+ **Version:** \`${this.version}\`
99
+
100
+ ## 📦 Installation
101
+
102
+ \`\`\`bash
103
+ npm install ${this.packageName}@${this.version}
104
+ \`\`\`
105
+
106
+ ## 📖 Documentation
107
+
108
+ - [GitHub Repository](https://github.com/${repoUrl})
109
+ - [Documentation](https://github.com/${repoUrl}#readme)
110
+ - [Changelog](https://github.com/${repoUrl}/blob/main/CHANGELOG.md)
111
+
112
+ ## ✨ What's New`;
113
+
114
+ if (changelog) {
115
+ content += `\n\n${changelog}`;
116
+ } else {
117
+ content += '\n\nThis release includes various improvements and bug fixes. See the [changelog](CHANGELOG.md) for detailed information.';
118
+ }
119
+
120
+ content += `
121
+
122
+ ## 🙏 Acknowledgments
123
+
124
+ Thanks to everyone who contributed to this release!
125
+
126
+ ---
127
+
128
+ **🔗 Links:**
129
+ - [NPM Package](https://www.npmjs.com/package/${this.packageName})
130
+ - [GitHub Issues](https://github.com/${repoUrl}/issues)
131
+ - [GitHub Discussions](https://github.com/${repoUrl}/discussions)
132
+
133
+ **⚠️ Note:** If you encounter any issues, please report them on [GitHub Issues](https://github.com/${repoUrl}/issues).`;
134
+
135
+ return content;
136
+ }
137
+
138
+ async generateTwitterAnnouncement(changelog) {
139
+ console.log('🐦 Generating Twitter announcement...');
140
+
141
+ const announcement = this.formatTweet(changelog);
142
+ const filePath = path.join(rootDir, `RELEASE_ANNOUNCEMENT_TWITTER_v${this.version}.txt`);
143
+
144
+ fs.writeFileSync(filePath, announcement, 'utf8');
145
+ console.log(`✅ Twitter announcement saved to ${filePath}`);
146
+
147
+ console.log('\n🐦 Tweet Content:');
148
+ console.log('='.repeat(50));
149
+ console.log(announcement);
150
+ console.log('='.repeat(50));
151
+ }
152
+
153
+ formatTweet(changelog) {
154
+ const repoUrl = this.repository.url.replace('git+https://github.com/', '').replace('.git', '');
155
+ const npmUrl = `https://www.npmjs.com/package/${this.packageName}`;
156
+
157
+ // Extract key features from changelog for the tweet
158
+ let highlights = '';
159
+ if (changelog) {
160
+ const features = changelog.match(/### Features\n\n((?:-.+\n?)*)/);
161
+ if (features) {
162
+ const featureList = features[1].split('\n')
163
+ .filter(line => line.startsWith('-'))
164
+ .slice(0, 2) // Take first 2 features
165
+ .map(line => line.replace(/^-\s+/, ''));
166
+ highlights = featureList.join(', ');
167
+ }
168
+ }
169
+
170
+ const tweet = `🎉 ${this.packageName} v${this.version} is now live!
171
+
172
+ ${highlights ? `✨ ${highlights}` : '🚀 New features and improvements'}
173
+
174
+ 📦 Install: npm install ${this.packageName}@${this.version}
175
+ 📖 Docs: https://github.com/${repoUrl}#readme
176
+ 🔗 Package: ${npmUrl}
177
+
178
+ #JavaScript #NodeJS #OpenSource`;
179
+
180
+ return tweet;
181
+ }
182
+
183
+ async generateSlackAnnouncement(changelog) {
184
+ console.log('💬 Generating Slack announcement...');
185
+
186
+ const announcement = this.formatSlackMessage(changelog);
187
+ const filePath = path.join(rootDir, `RELEASE_ANNOUNCEMENT_SLACK_v${this.version}.json`);
188
+
189
+ fs.writeFileSync(filePath, JSON.stringify(announcement, null, 2), 'utf8');
190
+ console.log(`✅ Slack announcement saved to ${filePath}`);
191
+
192
+ console.log('\n💬 Slack Message Content:');
193
+ console.log('='.repeat(50));
194
+ console.log(JSON.stringify(announcement, null, 2));
195
+ console.log('='.repeat(50));
196
+ }
197
+
198
+ formatSlackMessage(changelog) {
199
+ const repoUrl = this.repository.url.replace('git+https://github.com/', '').replace('.git', '');
200
+ const npmUrl = `https://www.npmjs.com/package/${this.packageName}`;
201
+
202
+ const message = {
203
+ text: `🎉 New Release: ${this.packageName} v${this.version}`,
204
+ blocks: [
205
+ {
206
+ type: "header",
207
+ text: {
208
+ type: "plain_text",
209
+ text: `🎉 ${this.packageName} v${this.version} Released!`
210
+ }
211
+ },
212
+ {
213
+ type: "section",
214
+ text: {
215
+ type: "mrkdwn",
216
+ text: `*Package:* \`${this.packageName}\`\n*Version:* \`${this.version}\`\n*Description:* ${this.description}`
217
+ }
218
+ },
219
+ {
220
+ type: "divider"
221
+ },
222
+ {
223
+ type: "section",
224
+ text: {
225
+ type: "mrkdwn",
226
+ text: "*📦 Installation:*"
227
+ }
228
+ },
229
+ {
230
+ type: "section",
231
+ text: {
232
+ type: "mrkdwn",
233
+ text: `\`\`\`bash\nnpm install ${this.packageName}@${this.version}\n\`\`\``
234
+ }
235
+ },
236
+ {
237
+ type: "actions",
238
+ elements: [
239
+ {
240
+ type: "button",
241
+ text: {
242
+ type: "plain_text",
243
+ text: "📖 Documentation"
244
+ },
245
+ url: `https://github.com/${repoUrl}#readme`
246
+ },
247
+ {
248
+ type: "button",
249
+ text: {
250
+ type: "plain_text",
251
+ text: "📦 NPM Package"
252
+ },
253
+ url: npmUrl
254
+ },
255
+ {
256
+ type: "button",
257
+ text: {
258
+ type: "plain_text",
259
+ text: "📝 Changelog"
260
+ },
261
+ url: `https://github.com/${repoUrl}/blob/main/CHANGELOG.md`
262
+ }
263
+ ]
264
+ }
265
+ ]
266
+ };
267
+
268
+ // Add changelog highlights if available
269
+ if (changelog) {
270
+ const features = changelog.match(/### Features\n\n((?:-.+\n?)*)/);
271
+ if (features) {
272
+ const featureList = features[1].split('\n')
273
+ .filter(line => line.startsWith('-'))
274
+ .slice(0, 5) // Take first 5 features
275
+ .map(line => line.replace(/^-\s+/, ''));
276
+
277
+ if (featureList.length > 0) {
278
+ message.blocks.splice(3, 0, {
279
+ type: "section",
280
+ text: {
281
+ type: "mrkdwn",
282
+ text: "*✨ Key Features:*\n" + featureList.map(f => `• ${f}`).join('\n')
283
+ }
284
+ });
285
+ }
286
+ }
287
+ }
288
+
289
+ return message;
290
+ }
291
+
292
+ async generateEmailAnnouncement(changelog) {
293
+ console.log('📧 Generating email announcement...');
294
+
295
+ const announcement = this.formatEmail(changelog);
296
+ const filePath = path.join(rootDir, `RELEASE_ANNOUNCEMENT_EMAIL_v${this.version}.html`);
297
+
298
+ fs.writeFileSync(filePath, announcement, 'utf8');
299
+ console.log(`✅ Email announcement saved to ${filePath}`);
300
+
301
+ console.log('\n📧 Email Content (preview):');
302
+ console.log('='.repeat(50));
303
+ console.log(this.stripHtml(announcement.substring(0, 500)) + '...');
304
+ console.log('='.repeat(50));
305
+ }
306
+
307
+ formatEmail(changelog) {
308
+ const repoUrl = this.repository.url.replace('git+https://github.com/', '').replace('.git', '');
309
+ const npmUrl = `https://www.npmjs.com/package/${this.packageName}`;
310
+
311
+ return `<!DOCTYPE html>
312
+ <html>
313
+ <head>
314
+ <meta charset="utf-8">
315
+ <title>${this.packageName} v${this.version} Released</title>
316
+ <style>
317
+ body { font-family: Arial, sans-serif; line-height: 1.6; max-width: 600px; margin: 0 auto; }
318
+ .header { background: #f8f9fa; padding: 20px; text-align: center; }
319
+ .content { padding: 20px; }
320
+ .install-box { background: #f1f3f4; padding: 15px; border-radius: 5px; font-family: monospace; }
321
+ .button { display: inline-block; padding: 10px 20px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; margin: 5px; }
322
+ .footer { text-align: center; padding: 20px; color: #666; font-size: 12px; }
323
+ </style>
324
+ </head>
325
+ <body>
326
+ <div class="header">
327
+ <h1>🎉 ${this.packageName} v${this.version} Released!</h1>
328
+ <p>${this.description}</p>
329
+ </div>
330
+
331
+ <div class="content">
332
+ <h2>📦 Installation</h2>
333
+ <div class="install-box">
334
+ npm install ${this.packageName}@${this.version}
335
+ </div>
336
+
337
+ <h2>📖 Resources</h2>
338
+ <p>
339
+ <a href="https://github.com/${repoUrl}#readme" class="button">Documentation</a>
340
+ <a href="${npmUrl}" class="button">NPM Package</a>
341
+ <a href="https://github.com/${repoUrl}/blob/main/CHANGELOG.md" class="button">Changelog</a>
342
+ </p>
343
+
344
+ <h2>✨ What's New</h2>
345
+ <div>
346
+ ${changelog ? changelog.replace(/\n/g, '<br>') : 'This release includes various improvements and bug fixes.'}
347
+ </div>
348
+ </div>
349
+
350
+ <div class="footer">
351
+ <p>You're receiving this email because you subscribed to updates about ${this.packageName}.</p>
352
+ <p><a href="https://github.com/${repoUrl}">Unsubscribe</a></p>
353
+ </div>
354
+ </body>
355
+ </html>`;
356
+ }
357
+
358
+ async generateDiscordAnnouncement(changelog) {
359
+ console.log('🎮 Generating Discord announcement...');
360
+
361
+ const announcement = this.formatDiscordMessage(changelog);
362
+ const filePath = path.join(rootDir, `RELEASE_ANNOUNCEMENT_DISCORD_v${this.version}.txt`);
363
+
364
+ fs.writeFileSync(filePath, announcement, 'utf8');
365
+ console.log(`✅ Discord announcement saved to ${filePath}`);
366
+
367
+ console.log('\n🎮 Discord Message Content:');
368
+ console.log('='.repeat(50));
369
+ console.log(announcement);
370
+ console.log('='.repeat(50));
371
+ }
372
+
373
+ formatDiscordMessage(changelog) {
374
+ const repoUrl = this.repository.url.replace('git+https://github.com/', '').replace('.git', '');
375
+ const npmUrl = `https://www.npmjs.com/package/${this.packageName}`;
376
+
377
+ let message = `🎉 **${this.packageName} v${this.version} Released!** 🎉
378
+
379
+ **Package:** \`${this.packageName}\`
380
+ **Version:** \`${this.version}\`
381
+
382
+ **Installation:**
383
+ \`\`\`bash
384
+ npm install ${this.packageName}@${this.version}
385
+ \`\`\`
386
+
387
+ **Links:**
388
+ 📖 [Documentation](https://github.com/${repoUrl}#readme)
389
+ 📦 [NPM Package](${npmUrl})
390
+ 📝 [Changelog](https://github.com/${repoUrl}/blob/main/CHANGELOG.md)`;
391
+
392
+ if (changelog) {
393
+ const features = changelog.match(/### Features\n\n((?:-.+\n?)*)/);
394
+ if (features) {
395
+ const featureList = features[1].split('\n')
396
+ .filter(line => line.startsWith('-'))
397
+ .slice(0, 5)
398
+ .map(line => line.replace(/^-\s+/, ''));
399
+
400
+ if (featureList.length > 0) {
401
+ message += `\n\n**✨ Key Features:**\n${featureList.map(f => `• ${f}`).join('\n')}`;
402
+ }
403
+ }
404
+ }
405
+
406
+ message += '\n\n*If you encounter any issues, please report them on [GitHub Issues](https://github.com/' + repoUrl + '/issues).*';
407
+
408
+ return message;
409
+ }
410
+
411
+ stripHtml(html) {
412
+ return html.replace(/<[^>]*>/g, '');
413
+ }
414
+ }
415
+
416
+ // CLI Interface
417
+ async function main() {
418
+ const announcer = new ReleaseAnnouncement();
419
+ await announcer.generateAnnouncements();
420
+ }
421
+
422
+ main().catch(error => {
423
+ console.error('❌ Announcement generation failed:', error);
424
+ process.exit(1);
425
+ });
@@ -0,0 +1,248 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Release Notification Script
5
+ * Sends notifications about successful releases
6
+ */
7
+
8
+ import { execSync } from 'child_process';
9
+ import fs from 'fs';
10
+ import path from 'path';
11
+ import { fileURLToPath } from 'url';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+ const rootDir = path.join(__dirname, '..');
16
+
17
+ const packageJson = JSON.parse(fs.readFileSync(path.join(rootDir, 'package.json'), 'utf8'));
18
+ const version = packageJson.version;
19
+ const packageName = packageJson.name;
20
+ const repository = packageJson.repository;
21
+
22
+ class ReleaseNotifier {
23
+ constructor() {
24
+ this.packageName = packageName;
25
+ this.version = version;
26
+ this.repository = repository;
27
+ }
28
+
29
+ async sendNotifications() {
30
+ console.log(`📢 Sending release notifications for ${this.packageName}@${this.version}`);
31
+
32
+ await this.createGitHubRelease();
33
+ await this.updateDocumentation();
34
+ await this.sendTeamNotifications();
35
+ await this.updateMetrics();
36
+
37
+ console.log('✅ All release notifications sent successfully');
38
+ }
39
+
40
+ async createGitHubRelease() {
41
+ try {
42
+ // Get changelog entry for this version
43
+ const changelog = this.extractChangelogEntry();
44
+
45
+ if (!changelog) {
46
+ console.log('⚠️ No changelog entry found for this version');
47
+ return;
48
+ }
49
+
50
+ // Create GitHub release using gh CLI
51
+ const releaseTitle = `Release v${this.version}`;
52
+ const releaseNotes = `# ${releaseTitle}\n\n${changelog}\n\n---\n\n**Installation:**\n\`\`\`bash\nnpm install ${this.packageName}@${this.version}\n\`\`\`\n\n**Documentation:** [View Docs](https://github.com/${this.repository.url.replace('git+https://github.com/', '').replace('.git', '')}#readme)`;
53
+
54
+ try {
55
+ execSync(`gh release create v${this.version} --title "${releaseTitle}" --notes "${releaseNotes}"`, {
56
+ encoding: 'utf8',
57
+ cwd: rootDir,
58
+ stdio: 'pipe'
59
+ });
60
+
61
+ console.log('✅ GitHub release created');
62
+ } catch (error) {
63
+ console.log('⚠️ Could not create GitHub release (gh CLI not available or no permissions)');
64
+ console.log(`Manual release notes:\n${releaseNotes}`);
65
+ }
66
+ } catch (error) {
67
+ console.log('⚠️ Error creating GitHub release:', error.message);
68
+ }
69
+ }
70
+
71
+ extractChangelogEntry() {
72
+ try {
73
+ const changelogPath = path.join(rootDir, 'CHANGELOG.md');
74
+ if (!fs.existsSync(changelogPath)) {
75
+ return null;
76
+ }
77
+
78
+ const content = fs.readFileSync(changelogPath, 'utf8');
79
+ const versionRegex = new RegExp(`## \\[${this.version.replace('.', '\\.')}\\][\\s\\S]*?(?=## \\[|$)`);
80
+ const match = content.match(versionRegex);
81
+
82
+ if (match) {
83
+ let changelogEntry = match[0];
84
+ // Remove the version line and clean up
85
+ changelogEntry = changelogEntry.replace(/^## \[[^\]]+\][\s\n]*/, '').trim();
86
+ return changelogEntry;
87
+ }
88
+
89
+ return null;
90
+ } catch (error) {
91
+ console.log('⚠️ Error extracting changelog:', error.message);
92
+ return null;
93
+ }
94
+ }
95
+
96
+ async updateDocumentation() {
97
+ try {
98
+ // Update version in README files
99
+ const readmeFiles = ['README.md', 'README-NPM.md'];
100
+
101
+ readmeFiles.forEach(filename => {
102
+ const readmePath = path.join(rootDir, filename);
103
+ if (fs.existsSync(readmePath)) {
104
+ let content = fs.readFileSync(readmePath, 'utf8');
105
+
106
+ // Update version references
107
+ content = content.replace(
108
+ new RegExp(`${this.packageName}@[\\d.]+`, 'g'),
109
+ `${this.packageName}@${this.version}`
110
+ );
111
+
112
+ content = content.replace(
113
+ /Latest version: \d+\.\d+\.\d+/g,
114
+ `Latest version: ${this.version}`
115
+ );
116
+
117
+ fs.writeFileSync(readmePath, content, 'utf8');
118
+ console.log(`✅ Updated ${filename}`);
119
+ }
120
+ });
121
+
122
+ // Create release notes file
123
+ const releaseNotesPath = path.join(rootDir, `RELEASE_NOTES_v${this.version}.md`);
124
+ const changelogEntry = this.extractChangelogEntry();
125
+
126
+ if (changelogEntry) {
127
+ const releaseNotes = `# Release Notes v${this.version}\n\nPublished: ${new Date().toISOString()}\n\n${changelogEntry}\n\n---\n\n**Package:** ${this.packageName}\n**Version:** ${this.version}\n**Repository:** ${this.repository.url}\n\n## Installation\n\n\`\`\`bash\nnpm install ${this.packageName}@${this.version}\n\`\`\`\n\n## Documentation\n\nFor detailed documentation, visit: [GitHub Repository](${this.repository.url.replace('git+', '').replace('.git', '')})`;
128
+
129
+ fs.writeFileSync(releaseNotesPath, releaseNotes, 'utf8');
130
+ console.log(`✅ Created ${releaseNotesPath}`);
131
+ }
132
+ } catch (error) {
133
+ console.log('⚠️ Error updating documentation:', error.message);
134
+ }
135
+ }
136
+
137
+ async sendTeamNotifications() {
138
+ try {
139
+ // Create notification message
140
+ const message = `🎉 New Release: ${this.packageName} v${this.version}\n\n${this.packageName} version ${this.version} has been published to NPM!\n\n📦 Install: npm install ${this.packageName}@${this.version}\n📖 Docs: ${this.repository.url.replace('git+', '').replace('.git', '')}\n📝 Changelog: https://github.com/${this.repository.url.replace('git+https://github.com/', '').replace('.git', '')}/blob/main/CHANGELOG.md`;
141
+
142
+ console.log('\n📧 Team Notification Message:');
143
+ console.log('=' .repeat(50));
144
+ console.log(message);
145
+ console.log('=' .repeat(50));
146
+
147
+ // Here you could integrate with Slack, Discord, email, etc.
148
+ // For now, just display the message
149
+
150
+ // Example Slack integration (if webhook URL is available)
151
+ // await this.sendSlackNotification(message);
152
+
153
+ } catch (error) {
154
+ console.log('⚠️ Error sending team notifications:', error.message);
155
+ }
156
+ }
157
+
158
+ async sendSlackNotification(message) {
159
+ // Example Slack integration
160
+ const slackWebhook = process.env.SLACK_RELEASE_WEBHOOK;
161
+ if (!slackWebhook) return;
162
+
163
+ try {
164
+ const response = await fetch(slackWebhook, {
165
+ method: 'POST',
166
+ headers: { 'Content-Type': 'application/json' },
167
+ body: JSON.stringify({
168
+ text: message,
169
+ username: 'Release Bot',
170
+ icon_emoji: ':package:'
171
+ })
172
+ });
173
+
174
+ if (response.ok) {
175
+ console.log('✅ Slack notification sent');
176
+ }
177
+ } catch (error) {
178
+ console.log('⚠️ Error sending Slack notification:', error.message);
179
+ }
180
+ }
181
+
182
+ async updateMetrics() {
183
+ try {
184
+ // Update release metrics
185
+ const metrics = {
186
+ version: this.version,
187
+ releaseDate: new Date().toISOString(),
188
+ packageName: this.packageName,
189
+ type: this.determineReleaseType()
190
+ };
191
+
192
+ const metricsPath = path.join(rootDir, '.release-metrics.json');
193
+ let existingMetrics = [];
194
+
195
+ if (fs.existsSync(metricsPath)) {
196
+ existingMetrics = JSON.parse(fs.readFileSync(metricsPath, 'utf8'));
197
+ }
198
+
199
+ existingMetrics.push(metrics);
200
+ fs.writeFileSync(metricsPath, JSON.stringify(existingMetrics, null, 2), 'utf8');
201
+
202
+ console.log('✅ Release metrics updated');
203
+ } catch (error) {
204
+ console.log('⚠️ Error updating metrics:', error.message);
205
+ }
206
+ }
207
+
208
+ determineReleaseType() {
209
+ const parts = this.version.split('.');
210
+ if (parts.length >= 3) {
211
+ if (parts[0] !== '0') {
212
+ // Major version (1.x.x and above)
213
+ if (parts[1] === '0' && parts[2] === '0') {
214
+ return 'major';
215
+ } else if (parts[2] === '0') {
216
+ return 'minor';
217
+ } else {
218
+ return 'patch';
219
+ }
220
+ } else {
221
+ // Development version (0.x.x)
222
+ if (parts[1] === '0') {
223
+ return 'major-dev';
224
+ } else {
225
+ return 'minor-dev';
226
+ }
227
+ }
228
+ }
229
+
230
+ // Check for pre-release
231
+ if (this.version.includes('-')) {
232
+ return 'pre-release';
233
+ }
234
+
235
+ return 'unknown';
236
+ }
237
+ }
238
+
239
+ // CLI Interface
240
+ async function main() {
241
+ const notifier = new ReleaseNotifier();
242
+ await notifier.sendNotifications();
243
+ }
244
+
245
+ main().catch(error => {
246
+ console.error('❌ Release notification failed:', error);
247
+ process.exit(1);
248
+ });