@cometchat/skills 4.4.2 → 5.0.1

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 (518) hide show
  1. package/.claude-plugin/marketplace.json +55 -0
  2. package/.claude-plugin/plugin.json +14 -0
  3. package/CHANGELOG.md +44 -0
  4. package/LICENSE +21 -0
  5. package/MIGRATING.md +187 -0
  6. package/README.md +52 -156
  7. package/RULES.md +125 -0
  8. package/bin/cometchat-skills.mjs +1280 -0
  9. package/bin/legacy-skills.json +95 -0
  10. package/catalogs/android-v6.json +1646 -0
  11. package/catalogs/flutter-v6.json +651 -0
  12. package/catalogs/ios-v5.json +1383 -0
  13. package/catalogs/rn-calls-v5.json +134 -0
  14. package/catalogs/rn-calls-v5.symbols.txt +58 -0
  15. package/catalogs/rn-sdk-v4.json +672 -0
  16. package/catalogs/rn-v5.json +449 -0
  17. package/catalogs/rn-v5.symbols.txt +216 -0
  18. package/catalogs/sdk-android-v5.json +514 -0
  19. package/contracts.android-calls-v5.json +122 -0
  20. package/contracts.android-v6.json +135 -0
  21. package/contracts.angular-v5.json +694 -0
  22. package/contracts.flutter-calls-v5.json +77 -0
  23. package/contracts.flutter-v6.json +126 -0
  24. package/contracts.ios-calls-v5.json +67 -0
  25. package/contracts.ios-v5.json +436 -0
  26. package/contracts.json +82 -0
  27. package/contracts.rn-calls-v5.json +77 -0
  28. package/contracts.rn-v5.json +727 -0
  29. package/contracts.sdk-android-v5.json +15 -0
  30. package/contracts.web-calls-v5.json +45 -0
  31. package/features.android-calls-v5.json +246 -0
  32. package/features.android-v6.json +65 -0
  33. package/features.angular-v5.json +521 -0
  34. package/features.flutter-calls-v5.json +286 -0
  35. package/features.flutter-v6.json +484 -0
  36. package/features.ios-calls-v5.json +236 -0
  37. package/features.ios-v5.json +573 -0
  38. package/features.json +61 -0
  39. package/features.rn-calls-v5.json +187 -0
  40. package/features.rn-v5.json +614 -0
  41. package/features.sdk-android-v5.json +40 -0
  42. package/features.sdk-jsv4.json +24 -0
  43. package/features.web-calls-v5.json +108 -0
  44. package/package.json +156 -74
  45. package/peers.yaml +355 -0
  46. package/registry/README.md +31 -0
  47. package/registry/android-calls-v5.json +94 -0
  48. package/registry/android-v6.json +177 -0
  49. package/registry/angular-v5.json +154 -0
  50. package/registry/flutter-calls-v5.json +94 -0
  51. package/registry/flutter-v6.json +159 -0
  52. package/registry/ios-calls-v5.json +99 -0
  53. package/registry/ios-v5.json +152 -0
  54. package/registry/rn-calls-v5.json +99 -0
  55. package/registry/rn-v5.json +169 -0
  56. package/registry/sdk-android-v5.json +93 -0
  57. package/registry/sdk-jsv4.json +93 -0
  58. package/registry/web-calls-v5.json +94 -0
  59. package/registry/web-v7.json +154 -0
  60. package/skills/cometchat/SKILL.md +47 -2096
  61. package/skills/cometchat-a11y/SKILL.md +44 -472
  62. package/skills/cometchat-analytics/SKILL.md +61 -0
  63. package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
  64. package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
  65. package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
  66. package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
  67. package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
  68. package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
  69. package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
  70. package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
  71. package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
  72. package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
  73. package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
  74. package/skills/cometchat-android-v6-calls/SKILL.md +128 -413
  75. package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
  76. package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
  77. package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
  78. package/skills/cometchat-android-v6-core/SKILL.md +236 -672
  79. package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
  80. package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
  81. package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
  82. package/skills/cometchat-android-v6-core/references/layout.md +112 -0
  83. package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
  84. package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
  85. package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
  86. package/skills/cometchat-android-v6-events/SKILL.md +46 -184
  87. package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
  88. package/skills/cometchat-android-v6-features/SKILL.md +74 -143
  89. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
  90. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
  91. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
  92. package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
  93. package/skills/cometchat-android-v6-production/SKILL.md +41 -179
  94. package/skills/cometchat-android-v6-push/SKILL.md +39 -289
  95. package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
  96. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
  97. package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
  98. package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
  99. package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
  100. package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
  101. package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
  102. package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
  103. package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
  104. package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
  105. package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
  106. package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
  107. package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
  108. package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
  109. package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
  110. package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
  111. package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
  112. package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
  113. package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
  114. package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
  115. package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
  116. package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
  117. package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
  118. package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
  119. package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
  120. package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
  121. package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
  122. package/skills/cometchat-angular-v5-production/SKILL.md +102 -0
  123. package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
  124. package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
  125. package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
  126. package/skills/cometchat-audit/SKILL.md +61 -0
  127. package/skills/cometchat-compliance/SKILL.md +63 -0
  128. package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
  129. package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
  130. package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
  131. package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
  132. package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
  133. package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -389
  134. package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
  135. package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
  136. package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
  137. package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
  138. package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
  139. package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
  140. package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
  141. package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
  142. package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
  143. package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
  144. package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
  145. package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
  146. package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +132 -0
  147. package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
  148. package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
  149. package/skills/cometchat-flutter-v6-production/SKILL.md +59 -615
  150. package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
  151. package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
  152. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
  153. package/skills/cometchat-i18n/SKILL.md +35 -404
  154. package/skills/cometchat-ios-calls/SKILL.md +112 -563
  155. package/skills/cometchat-ios-components/SKILL.md +44 -834
  156. package/skills/cometchat-ios-core/SKILL.md +182 -1068
  157. package/skills/cometchat-ios-core/references/anti-patterns.md +113 -0
  158. package/skills/cometchat-ios-core/references/docs-map.md +124 -0
  159. package/skills/cometchat-ios-core/references/install.md +23 -0
  160. package/skills/cometchat-ios-core/references/layout.md +219 -0
  161. package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
  162. package/skills/cometchat-ios-core/references/swiftui.md +91 -0
  163. package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
  164. package/skills/cometchat-ios-customization/SKILL.md +33 -968
  165. package/skills/cometchat-ios-features/SKILL.md +29 -738
  166. package/skills/cometchat-ios-migration/SKILL.md +39 -0
  167. package/skills/cometchat-ios-placement/SKILL.md +51 -729
  168. package/skills/cometchat-ios-production/SKILL.md +67 -723
  169. package/skills/cometchat-ios-push/SKILL.md +24 -602
  170. package/skills/cometchat-ios-testing/SKILL.md +36 -355
  171. package/skills/cometchat-ios-troubleshooting/SKILL.md +31 -989
  172. package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
  173. package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
  174. package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
  175. package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
  176. package/skills/cometchat-migrate-from-getstream/SKILL.md +65 -0
  177. package/skills/cometchat-migrate-from-getstream/references/concept-map.md +98 -0
  178. package/skills/cometchat-migrate-from-getstream/references/data-migration.md +74 -0
  179. package/skills/cometchat-migrate-from-getstream/references/feature-map.md +108 -0
  180. package/skills/cometchat-migrate-from-getstream/references/inventory.md +82 -0
  181. package/skills/cometchat-migrate-from-getstream/references/native-build.md +9 -0
  182. package/skills/cometchat-migrate-from-getstream/references/report-template.md +59 -0
  183. package/skills/cometchat-migrate-from-sendbird/SKILL.md +64 -0
  184. package/skills/cometchat-migrate-from-sendbird/references/concept-map.md +99 -0
  185. package/skills/cometchat-migrate-from-sendbird/references/data-migration.md +74 -0
  186. package/skills/cometchat-migrate-from-sendbird/references/feature-map.md +104 -0
  187. package/skills/cometchat-migrate-from-sendbird/references/inventory.md +86 -0
  188. package/skills/cometchat-migrate-from-sendbird/references/native-build.md +10 -0
  189. package/skills/cometchat-migrate-from-sendbird/references/report-template.md +59 -0
  190. package/skills/cometchat-migrate-from-twilio/SKILL.md +52 -0
  191. package/skills/cometchat-migrate-from-twilio/references/concept-map.md +49 -0
  192. package/skills/cometchat-migrate-from-twilio/references/data-migration.md +50 -0
  193. package/skills/cometchat-migrate-from-twilio/references/feature-map.md +27 -0
  194. package/skills/cometchat-migrate-from-twilio/references/inventory.md +53 -0
  195. package/skills/cometchat-migrate-from-twilio/references/report-template.md +52 -0
  196. package/skills/cometchat-moderation/SKILL.md +58 -0
  197. package/skills/cometchat-onboarding/SKILL.md +92 -0
  198. package/skills/cometchat-onboarding/references/archetypes.md +51 -0
  199. package/skills/cometchat-onboarding/references/calling-first.md +77 -0
  200. package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
  201. package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
  202. package/skills/cometchat-onboarding/references/platforms.md +105 -0
  203. package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
  204. package/skills/cometchat-react-native-calls/SKILL.md +200 -0
  205. package/skills/cometchat-react-native-components/SKILL.md +142 -0
  206. package/skills/cometchat-react-native-core/SKILL.md +335 -0
  207. package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
  208. package/skills/cometchat-react-native-core/references/component-props.md +105 -0
  209. package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
  210. package/skills/cometchat-react-native-core/references/docs-map.md +127 -0
  211. package/skills/cometchat-react-native-core/references/layout.md +61 -0
  212. package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
  213. package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
  214. package/skills/cometchat-react-native-customization/SKILL.md +198 -0
  215. package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
  216. package/skills/cometchat-react-native-features/SKILL.md +122 -0
  217. package/skills/cometchat-react-native-migration/SKILL.md +103 -0
  218. package/skills/cometchat-react-native-placement/SKILL.md +158 -0
  219. package/skills/cometchat-react-native-production/SKILL.md +79 -0
  220. package/skills/cometchat-react-native-push/SKILL.md +88 -0
  221. package/skills/cometchat-react-native-sdk/SKILL.md +133 -0
  222. package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
  223. package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
  224. package/skills/cometchat-react-native-testing/SKILL.md +94 -0
  225. package/skills/cometchat-react-native-troubleshooting/SKILL.md +174 -0
  226. package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
  227. package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
  228. package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
  229. package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
  230. package/skills/cometchat-react-v7-components/SKILL.md +72 -0
  231. package/skills/cometchat-react-v7-core/SKILL.md +101 -0
  232. package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
  233. package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
  234. package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
  235. package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
  236. package/skills/cometchat-react-v7-core/references/layout.md +150 -0
  237. package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
  238. package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
  239. package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
  240. package/skills/cometchat-react-v7-core/references/theming.md +52 -0
  241. package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
  242. package/skills/cometchat-react-v7-features/SKILL.md +92 -0
  243. package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
  244. package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
  245. package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
  246. package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
  247. package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
  248. package/skills/cometchat-react-v7-production/SKILL.md +84 -0
  249. package/skills/cometchat-react-v7-push/SKILL.md +53 -0
  250. package/skills/cometchat-react-v7-testing/SKILL.md +60 -0
  251. package/skills/cometchat-react-v7-troubleshooting/SKILL.md +47 -0
  252. package/skills/cometchat-security/SKILL.md +80 -0
  253. package/skills/cometchat-self-host/SKILL.md +56 -0
  254. package/test-suite/README.md +70 -0
  255. package/test-suite/catalogs/android-calls-v5.json +830 -0
  256. package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
  257. package/test-suite/catalogs/android-v6.json +1646 -0
  258. package/test-suite/catalogs/android-v6.symbols.txt +298 -0
  259. package/test-suite/catalogs/angular-v5.json +7587 -0
  260. package/test-suite/catalogs/flutter-calls-v5.json +196 -0
  261. package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
  262. package/test-suite/catalogs/flutter-v6.json +651 -0
  263. package/test-suite/catalogs/ios-calls-v5.json +158 -0
  264. package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
  265. package/test-suite/catalogs/ios-v5.json +1383 -0
  266. package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
  267. package/test-suite/catalogs/rn-calls-v5.json +134 -0
  268. package/test-suite/catalogs/rn-sdk-v4.json +672 -0
  269. package/test-suite/catalogs/rn-v5.json +449 -0
  270. package/test-suite/catalogs/sdk-android-v5.json +514 -0
  271. package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
  272. package/test-suite/catalogs/sdk-jsv4.json +800 -0
  273. package/test-suite/catalogs/web-calls-v5.json +195 -0
  274. package/test-suite/catalogs/web-v7.json +1243 -0
  275. package/test-suite/scripts/build-registry.mjs +113 -0
  276. package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
  277. package/test-suite/scripts/catalog-refresh.mjs +100 -0
  278. package/test-suite/scripts/lint-skills.mjs +932 -0
  279. package/test-suite/scripts/measure-tokens.mjs +169 -0
  280. package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
  281. package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
  282. package/test-suite/scripts/typecheck-fences.mjs +206 -0
  283. package/test-suite/scripts/verify-catalog.mjs +242 -0
  284. package/test-suite/scripts/verify-contract-fences.mjs +94 -0
  285. package/test-suite/scripts/verify-detection.mjs +178 -0
  286. package/test-suite/scripts/verify-docs-base.mjs +91 -0
  287. package/test-suite/scripts/verify-family-agnostic.mjs +134 -0
  288. package/test-suite/scripts/verify-golden-path.mjs +138 -0
  289. package/test-suite/scripts/verify-oracle-components.mjs +133 -0
  290. package/test-suite/scripts/verify-template-bindings.mjs +148 -0
  291. package/test-suite/typecheck/angular-v5/package.json +21 -0
  292. package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
  293. package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
  294. package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
  295. package/test-suite/typecheck/web-v7/package.json +18 -0
  296. package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
  297. package/bin/install.js +0 -1003
  298. package/skills/.claude-plugin/marketplace.json +0 -86
  299. package/skills/cometchat/references/asking-questions.md +0 -48
  300. package/skills/cometchat-android-v5/SKILL.md +0 -121
  301. package/skills/cometchat-android-v5-calls/SKILL.md +0 -429
  302. package/skills/cometchat-android-v5-calls/references/README.md +0 -53
  303. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
  304. package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
  305. package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
  306. package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
  307. package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
  308. package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
  309. package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
  310. package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
  311. package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
  312. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
  313. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
  314. package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
  315. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
  316. package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
  317. package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
  318. package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
  319. package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
  320. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
  321. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
  322. package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
  323. package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
  324. package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
  325. package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
  326. package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
  327. package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
  328. package/skills/cometchat-android-v5-components/SKILL.md +0 -431
  329. package/skills/cometchat-android-v5-core/SKILL.md +0 -486
  330. package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
  331. package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
  332. package/skills/cometchat-android-v5-features/SKILL.md +0 -131
  333. package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
  334. package/skills/cometchat-android-v5-production/SKILL.md +0 -95
  335. package/skills/cometchat-android-v5-push/SKILL.md +0 -619
  336. package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
  337. package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
  338. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
  339. package/skills/cometchat-android-v6/SKILL.md +0 -108
  340. package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
  341. package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
  342. package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
  343. package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
  344. package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
  345. package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
  346. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
  347. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
  348. package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
  349. package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
  350. package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
  351. package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
  352. package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
  353. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
  354. package/skills/cometchat-angular-calls/SKILL.md +0 -380
  355. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
  356. package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
  357. package/skills/cometchat-angular-calls/references/call-session.md +0 -167
  358. package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
  359. package/skills/cometchat-angular-calls/references/device-management.md +0 -154
  360. package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
  361. package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
  362. package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
  363. package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
  364. package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
  365. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
  366. package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
  367. package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
  368. package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
  369. package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
  370. package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
  371. package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
  372. package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
  373. package/skills/cometchat-angular-components/SKILL.md +0 -235
  374. package/skills/cometchat-angular-core/SKILL.md +0 -386
  375. package/skills/cometchat-angular-customization/SKILL.md +0 -616
  376. package/skills/cometchat-angular-features/SKILL.md +0 -329
  377. package/skills/cometchat-angular-patterns/SKILL.md +0 -256
  378. package/skills/cometchat-angular-placement/SKILL.md +0 -314
  379. package/skills/cometchat-angular-production/SKILL.md +0 -564
  380. package/skills/cometchat-angular-push/SKILL.md +0 -389
  381. package/skills/cometchat-angular-testing/SKILL.md +0 -605
  382. package/skills/cometchat-angular-theming/SKILL.md +0 -290
  383. package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
  384. package/skills/cometchat-astro-patterns/SKILL.md +0 -708
  385. package/skills/cometchat-calls/SKILL.md +0 -364
  386. package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
  387. package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
  388. package/skills/cometchat-calls/references/use-case-support.md +0 -189
  389. package/skills/cometchat-calls/references/use-case-team.md +0 -180
  390. package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
  391. package/skills/cometchat-components/SKILL.md +0 -1142
  392. package/skills/cometchat-core/SKILL.md +0 -1048
  393. package/skills/cometchat-customization/SKILL.md +0 -580
  394. package/skills/cometchat-customization/references/component-catalog.md +0 -236
  395. package/skills/cometchat-features/SKILL.md +0 -861
  396. package/skills/cometchat-flutter-v5/SKILL.md +0 -173
  397. package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -455
  398. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
  399. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
  400. package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
  401. package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
  402. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
  403. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
  404. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
  405. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
  406. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
  407. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
  408. package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
  409. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
  410. package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
  411. package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
  412. package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
  413. package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
  414. package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
  415. package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
  416. package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
  417. package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
  418. package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
  419. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
  420. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
  421. package/skills/cometchat-flutter-v6/SKILL.md +0 -446
  422. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
  423. package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
  424. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
  425. package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
  426. package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
  427. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
  428. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
  429. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
  430. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
  431. package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
  432. package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
  433. package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
  434. package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
  435. package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
  436. package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
  437. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
  438. package/skills/cometchat-ios/SKILL.md +0 -325
  439. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -181
  440. package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
  441. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
  442. package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
  443. package/skills/cometchat-ios-calls/references/call-session.md +0 -218
  444. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
  445. package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
  446. package/skills/cometchat-ios-calls/references/device-management.md +0 -171
  447. package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
  448. package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
  449. package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
  450. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
  451. package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
  452. package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
  453. package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
  454. package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
  455. package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
  456. package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
  457. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
  458. package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
  459. package/skills/cometchat-ios-theming/SKILL.md +0 -667
  460. package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
  461. package/skills/cometchat-native-calls/SKILL.md +0 -671
  462. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
  463. package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
  464. package/skills/cometchat-native-calls/references/call-session.md +0 -182
  465. package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
  466. package/skills/cometchat-native-calls/references/device-management.md +0 -158
  467. package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
  468. package/skills/cometchat-native-calls/references/group-calls.md +0 -296
  469. package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
  470. package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
  471. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
  472. package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
  473. package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
  474. package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
  475. package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
  476. package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
  477. package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
  478. package/skills/cometchat-native-calls/references/share-invite.md +0 -146
  479. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
  480. package/skills/cometchat-native-components/SKILL.md +0 -628
  481. package/skills/cometchat-native-core/SKILL.md +0 -679
  482. package/skills/cometchat-native-customization/SKILL.md +0 -716
  483. package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
  484. package/skills/cometchat-native-features/SKILL.md +0 -638
  485. package/skills/cometchat-native-placement/SKILL.md +0 -509
  486. package/skills/cometchat-native-production/SKILL.md +0 -700
  487. package/skills/cometchat-native-push/SKILL.md +0 -594
  488. package/skills/cometchat-native-testing/SKILL.md +0 -582
  489. package/skills/cometchat-native-theming/SKILL.md +0 -681
  490. package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
  491. package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
  492. package/skills/cometchat-placement/SKILL.md +0 -1360
  493. package/skills/cometchat-production/SKILL.md +0 -1027
  494. package/skills/cometchat-react-calls/SKILL.md +0 -752
  495. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
  496. package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
  497. package/skills/cometchat-react-calls/references/call-session.md +0 -235
  498. package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
  499. package/skills/cometchat-react-calls/references/device-management.md +0 -210
  500. package/skills/cometchat-react-calls/references/group-calls.md +0 -257
  501. package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
  502. package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
  503. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
  504. package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
  505. package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
  506. package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
  507. package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
  508. package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
  509. package/skills/cometchat-react-calls/references/share-invite.md +0 -175
  510. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
  511. package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
  512. package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
  513. package/skills/cometchat-react-patterns/SKILL.md +0 -628
  514. package/skills/cometchat-react-push/SKILL.md +0 -634
  515. package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
  516. package/skills/cometchat-react-testing/SKILL.md +0 -413
  517. package/skills/cometchat-theming/SKILL.md +0 -498
  518. package/skills/cometchat-troubleshooting/SKILL.md +0 -294
@@ -0,0 +1,108 @@
1
+ # Stream → CometChat feature map
2
+
3
+ **How to use:**
4
+ 1. For each feature the ledger shows, find its row below.
5
+ 2. Check the **CometChat id** in the TARGET family's `features.json`. Ids differ slightly per family, so match on the `id` OR the entry's `name`. Common aliases: `threaded-replies`≈`threaded-conversations`, `delivery-read-receipts`≈`read-receipts`, `typing-indicators`≈`typing-indicator`, `quoted-replies`≈`quoted-reply`, `message-search`≈`conversation-advanced-search`, `media-file-attachments`≈`media-sharing`, `users-groups`≈`group-chat`, `text-messaging`≈`instant-messaging`, `smart-reply`≈`ai-smart-replies`.
6
+ 3. **Found** → migrate, wired by the skill in *Via*.
7
+ 4. **Not found (or the id column says "none")** → search the docs at BOTH levels: the UI Kit and the Chat SDK / REST API (SKILL step 3). Documented at either → migrate; no UI Kit drop-in means build it on the SDK method in the app's own UI. Documented at neither → apply *If absent*.
8
+
9
+ **Actions under *If absent*** apply only AFTER both docs searches (UI Kit and SDK) come back empty. The table's REMOVE is never a shortcut past that check, and the report's evidence must quote both queries:
10
+ - `REMOVE` → UNSUPPORTED: remove it fully (SKILL step 6) and list it in the report.
11
+ - `CHANGE` → keep the capability on the closest CometChat equivalent, and list the difference under "Behavior changes".
12
+
13
+ **Enablement:** a feature whose `features.json` entry says `needs_dashboard`, or is an extension/AI feature, still migrates in code. Add "enable <feature> in the CometChat dashboard" to the action items. `@cometchat/skills-cli features enable` can do it after `auth login`.
14
+
15
+ **Rows are grouped by area.** Columns: Stream feature (signals) · CometChat id · Via · If absent.
16
+
17
+ ### Messaging basics
18
+
19
+ | Stream feature (signals) | CometChat id | Via | If absent |
20
+ |---|---|---|---|
21
+ | Messaging / team / commerce / gaming channels (`client.channel(type, id)`) | `core-chat-surface`, `users-groups`, `text-messaging` | core | — (always present) |
22
+ | Channel list with unread counts, last message (`ChannelList`, `countUnread`) | `core-chat-surface` | core | — |
23
+ | Edit / delete messages (`updateMessage`, `deleteMessage`) | `text-messaging` | core | — |
24
+ | Typing indicators (`keystroke`, `typing.start`) | `typing-indicators` | core / features | CHANGE (drop the indicator) |
25
+ | Read state / receipts (`markRead`, `message.read`, `read` array) | `delivery-read-receipts` | core / features | CHANGE |
26
+ | Mark as unread (`markUnread`) | `mark-as-unread`, else the SDK's mark-as-unread call (`/sdk/<platform>/delivery-read-receipts`; needs Enhanced Messaging Status → action item) | features / SDK | REMOVE |
27
+ | Image / file / video attachments (`sendImage`, `sendFile`, `attachments`) | `media-file-attachments` | core / features | CHANGE (single file per message) |
28
+ | Voice recordings (`voiceRecording` attachment, audio recorder) | `voice-notes` | features | REMOVE the recorder, keep audio-file playback |
29
+ | Threads (`parent_id`, `<Thread>`) | `threaded-replies` | features / placement | REMOVE the thread UI |
30
+ | "Also send to channel" (`show_in_channel`) | none | docs | CHANGE (the reply stays in the thread) |
31
+ | Threads overview list (`ThreadList`, `queryThreads`) | none | docs | REMOVE |
32
+ | Quoted replies (`quoted_message_id`) | `quoted-replies` | features | REMOVE |
33
+ | Reactions (`sendReaction`) | `reactions` | features | REMOVE |
34
+ | Cumulative reaction scores ("claps", `score`), custom reaction types | none | docs | CHANGE (one reaction per emoji per user) |
35
+ | Mentions (`mentioned_users`) | `mentions` | features | REMOVE the mention picker, keep plain text |
36
+ | Polls (`createPoll`, `castPollVote`, `poll_id`) | `polls` | features | REMOVE |
37
+ | Message search (`client.search`, `ChannelSearch`/`SearchBar`) | `message-search` | features / placement | REMOVE |
38
+ | Pinned messages (`pinMessage`, `pinned_messages`) | `pin-message` | features | REMOVE |
39
+ | Message reminders / save for later (`createReminder`) | `reminders` / `save-message` | features | REMOVE |
40
+ | Silent / system messages (`silent: true`, `type: "system"`) | none | docs | CHANGE (sent as normal / action messages) |
41
+ | Drafts (`createDraft`, composer drafts) | none | docs | REMOVE the server-side drafts |
42
+ | Translation (`translateMessage`, auto-translation) | `message-translation` | features | REMOVE |
43
+ | Link previews / URL enrichment (`og_scrape_url`) | `link-preview` | features | CHANGE (plain links) |
44
+ | Giphy (`/giphy`, giphy attachments) | `gifs` | features | REMOVE |
45
+ | Custom slash commands (`commands`, custom command webhook) | none | docs | REMOVE |
46
+ | Location sharing, live location (`SharedLocation`, `startLiveLocationSharing`) | none | docs | REMOVE |
47
+ | Custom attachments / `extraData` on messages | `custom-message-types` (Angular also `card-messages`) + message metadata | customization / features | CHANGE (render as text + metadata) |
48
+
49
+ ### Users and presence
50
+
51
+ | Stream feature (signals) | CometChat id | Via | If absent |
52
+ |---|---|---|---|
53
+ | Presence, last active (`online`, `last_active`, `user.presence.changed`) | `user-presence` | core | CHANGE |
54
+ | User custom fields (`extraData`, `image`, `name`) | user name / avatar / metadata (core SDK) | core | — |
55
+ | Block users (`blockUser`) | `block-unblock-user` (iOS), else the core SDK block-users call | core / docs | REMOVE |
56
+ | Mute users (`muteUser`) | none (check the notification-preferences docs; muting a 1:1 conversation is covered by mute conversations) | docs | REMOVE |
57
+
58
+ ### Channels and moderation
59
+
60
+ | Stream feature (signals) | CometChat id | Via | If absent |
61
+ |---|---|---|---|
62
+ | Livestream channels (`livestream` type, large audiences) | `users-groups` (a **public** group) | core | CHANGE (over 300 members → no receipts/typing) |
63
+ | Join a public/preview channel (channel preview + Join button, `addMembers`, `channel.watch`) | join a public group: `CometChatGroups` (joinable list) + the SDK's `CometChat.joinGroup(guid, type)` (`/sdk/<platform>/groups-join-leave`) | components / SDK | REMOVE |
64
+ | Member-based 1:1 channels (`!members-…`, 2 members) | a **user** conversation | core | — |
65
+ | Channel name, image, custom fields (`channel.data`, `extraData`) — incl. editing them | group name / icon / metadata; editing = the SDK's update-group call (`/sdk/<platform>/update-group`) | core / SDK | — |
66
+ | Channel roles, permissions, grants (`channel_role`, custom roles) | group scopes admin / moderator / participant (+ CometChat roles, docs) | components / docs | CHANGE |
67
+ | Ban / remove members, banned list + unban (`banUser`, `removeMembers`, `unbanUser`) | group member management: the kit's members list + the SDK's banned-members request + unban (`/sdk/<platform>/group-kick-ban-members`) | components / SDK | REMOVE |
68
+ | Shadow ban (`shadowBan`) | none | docs | REMOVE |
69
+ | Freeze channel, slow mode (`frozen`, `enableSlowMode`) | none | docs | REMOVE |
70
+ | Invites with accept/reject (`inviteMembers`, `acceptInvite`) | none (members are added directly) | docs | CHANGE (invite = add member) + REMOVE the accept/reject UI |
71
+ | Mute a channel per user (`channel.mute`) | notification preferences: mute conversations (`/notifications/preferences`) | push / SDK | REMOVE |
72
+ | Hide / pin / archive a channel per user (`hide`, `pin`, `archive`) | none | docs | REMOVE |
73
+ | Truncate channel (`truncate`) | none (check the delete-conversation docs) | docs | REMOVE |
74
+ | Flag / report (`flagMessage`, `flagUser`) | `report-message` / `moderation` | features | REMOVE |
75
+ | AutoMod, blocklists, review queue (dashboard) | `moderation` | features + dashboard | action item: recreate the rules |
76
+
77
+ ### Push, calls and other products
78
+
79
+ | Stream feature (signals) | CometChat id | Via | If absent |
80
+ |---|---|---|---|
81
+ | Push devices (`addDevice(token, 'firebase' / 'apn')`, push templates) | `push-notifications` | push | action item (credentials in the dashboard) |
82
+ | Push preferences (`setPushPreferences`, per-channel) | notification preferences: mute conversations, DND, schedules (`/notifications/preferences`) | push / SDK | REMOVE only what the preferences page lacks |
83
+ | Stream Video calls, ringing (`StreamCall`, `call.ring`) | `voice-video-calls` | calls (or the headless calls peer) | REMOVE |
84
+ | Video livestream, audio rooms (Stream Video) | `live-streaming` | features / docs | REMOVE |
85
+ | **Activity Feeds** (`getstream`, `@stream-io/feeds-*`, `feed(`, `addActivity`, follows) | none | — | **REMOVE** (no CometChat equivalent) |
86
+ | AI assistant (`ai_indicator`, Stream AI components) | `ai-assistant`, `ai-agents`, `smart-reply`, `conversation-summary` | features | REMOVE |
87
+ | Offline storage (`@op-engineering/op-sqlite`, `stream_chat_persistence`, `StreamOfflinePluginFactory`, the local DB) | none | core | CHANGE (online-first; list the offline gap) |
88
+
89
+ ### Look and feel, server
90
+
91
+ | Stream feature (signals) | CometChat id | Via | If absent |
92
+ |---|---|---|---|
93
+ | Theme, CSS variables (`--str-chat__*`), `StreamChatTheme`, `ChatTheme`, `Appearance` | theming | customization | — |
94
+ | i18n (`Streami18n`, `StreamI18nService`, `stream_chat_localizations`) | localization (docs) | customization | CHANGE (the kit's defaults) |
95
+ | Webhooks (`verifyWebhook`, `x-signature`) | CometChat webhooks | server (SKILL step 7) | REMOVE (and list) each event with no equivalent |
96
+ | Before-message-send hook, SQS/SNS delivery | none (check the moderation / webhook docs) | server / docs | REMOVE |
97
+
98
+ A feature in the ledger that has no row here: treat it like a `none` row. Check `features.json`, then the docs, then REMOVE or CHANGE, and say which in the report.
99
+
100
+ ## Deciding "unsupported" — the verification ladder (read before any REMOVE)
101
+
102
+ **An MCP search that returns NOTHING is NOT evidence of "unsupported" — nor is the MCP being down.** An empty result (or "no dedicated page") is INCONCLUSIVE: the feature is often documented under CometChat's OWN term (a vendor "voice message recorder" is CometChat's **media recorder** / **voice notes**), folded into a broader page (a composer prop, not its own page), or just ranked out of the top hits. So when the MCP doesn't surface it, walk this ladder BEFORE any verdict:
103
+
104
+ 1. **Re-query with CometChat vocabulary** — component/product names; drop over-qualifiers like the version/platform.
105
+ 2. **LIVE-FETCH the likely docs page** — `fetch_cometchat_doc_page` (or a plain fetch of the docs URL + `.md`) of the family's composer / features / component page.
106
+ 3. **Cross-check the family CATALOG** (the installed component/symbol list) — if the component is there, it IS supported, migrate it.
107
+
108
+ Mark **UNSUPPORTED only** when the CATALOG lacks it AND the live doc fetch (not merely an empty MCP search) also finds nothing. If it genuinely can't be checked (tooling down, network blocked), KEEP it and mark `needs-verification` — never REMOVE a feature you could not verify is absent. **Every UNSUPPORTED row needs evidence** in the report: the `features.json` result plus the exact UI Kit AND SDK docs queries you ran and what each returned. A REMOVE with no docs query is not allowed. Docs MCP not connected? Use a plain fetch (`RULES.md` → Fetch discipline).
@@ -0,0 +1,82 @@
1
+ <!-- family-agnostic: per-platform-by-design — this reference IS the per-platform Stream inventory + target-family table; one row per platform by design. -->
2
+ # Stream (GetStream) inventory — what to find, and where it goes
3
+
4
+ Search case-insensitively. Skip `node_modules/`, `Pods/`, `build/`, `.dart_tool/`, `.gradle/` and `.git/`. "Stream" is also a common English word, so match the **package and type names below**, never the bare word `stream`. A package hit tells you Stream is present. The **import/API hits** tell you *what the app does with it*, and each one becomes a ledger row (`file:line → purpose`).
5
+
6
+ ## Target family (where each platform lands)
7
+ | App platform (detect `framework`) | Stream packages you'll see | CometChat family (`peers.yaml`) | UI SDK mode → | Client mode (own UI) → |
8
+ |---|---|---|---|---|
9
+ | React / Next / Vite / CRA / Astro / React Router | `stream-chat-react`, `stream-chat`, `@stream-io/stream-chat-css`, `@stream-io/video-react-sdk` | `react-v7` | `cometchat-react-v7-core` + `-components`/`-placement` | the core's SDK fallback (`@cometchat/chat-sdk-javascript`, docs-map → SDK docs) |
10
+ | Angular | `stream-chat-angular`, `stream-chat`, `@ngx-translate/core` (Stream i18n) | `angular-v5` | `cometchat-angular-v5-core` | the core's SDK fallback (JS Chat SDK) |
11
+ | React Native / Expo | `stream-chat-react-native`, `stream-chat-expo`, `stream-chat`, `@stream-io/video-react-native-sdk` | `react-native` | `cometchat-react-native-core` | `cometchat-react-native-sdk` |
12
+ | iOS (Swift) | SPM `stream-chat-swift` (`StreamChat`, `StreamChatUI`), `stream-chat-swiftui` (`StreamChatSwiftUI`), `stream-video-swift`; pods `StreamChat`, `StreamChatUI`, `StreamChatSwiftUI` | `ios` | `cometchat-ios-core` (UIKit; host SwiftUI screens via a representable) | the iOS core's SDK fallback (`CometChatSDK`) |
13
+ | Android | `io.getstream:stream-chat-android-client`, `-offline`, `-state`, `-ui-components` (Views), `-compose`, `io.getstream:stream-video-android-*` | `android-v6` (cohort from `android_variant`: Compose → `compose-*`, Views → `kotlin-*`) | `cometchat-android-v6-core` | `cometchat-android-v5-sdk` |
14
+ | Flutter | `stream_chat_flutter`, `stream_chat_flutter_core`, `stream_chat`, `stream_chat_persistence`, `stream_chat_localizations`, `stream_video_flutter` | `flutter-v6` | `cometchat-flutter-v6-core` | the Flutter core's SDK fallback (`cometchat_sdk`, re-exported by the kit) |
15
+ | Video only (no chat) | `@stream-io/video-react-sdk`, `@stream-io/video-client`, `@stream-io/video-react-native-sdk`, `stream-video-swift`, `io.getstream:stream-video-android-*`, `stream_video_flutter` | the matching headless calls peer (`js-calls`, `react-native-calls`, `ios-calls`, `android-calls`, `flutter-calls`) | — | `cometchat-js-v5-sdk` / `cometchat-react-native-v5-sdk` / `cometchat-ios-v5-sdk` / `cometchat-android-v5-calls-sdk` / `cometchat-flutter-v5-sdk` |
16
+ | Server | `stream-chat` (Node, with the API secret), `@stream-io/node-sdk`, Python `stream-chat`/`getstream`, `stream-chat-go`, `stream-chat-ruby`, `get-stream/stream-chat` (PHP), `io.getstream:stream-chat-java`, `stream-chat-net` | — (REST, no UI Kit) | — | CometChat REST (`/rest-api/…`) |
17
+
18
+ A platform that isn't in this table (Vue, Svelte, Unity, .NET MAUI…) has no family in this pack → STOP (2): report only.
19
+
20
+ ### React Native is a native platform for the build, not a web one
21
+ The migration is not done when Metro bundles: `cd ios && pod install` (the kit's Podfile needs the
22
+ `modular_headers` lines the family `-core` lists, or `pod install` itself fails), then BUILD **and
23
+ RUN** both platforms. Three failures never appear in CI — only when a person uses the app:
24
+
25
+ | Trap | What you see |
26
+ |---|---|
27
+ | React Native >= 0.87 on iOS | the kit's composer calls `InteractionManager`, removed from RN core in 0.87 — tapping send throws (`InteractionManager has been removed from react-native core`); Android is unaffected. Shim: the family `-troubleshooting` |
28
+ | a missing native peer | fails at MOUNT, and the error names the peer (`gesture-handler`, `svg`, `video`), never CometChat |
29
+ | `tsc --noEmit` | reports errors from inside the kit's own shipped source (it ships raw `src/*.tsx`), so gate on the Metro bundle — see the family `-core` -> Verify it works, which also carries the run recipe for a machine where port 8081 is taken |
30
+
31
+ ## Grep signals
32
+ **Manifests**: `package.json`, `pubspec.yaml`, `build.gradle(.kts)`, `gradle/libs.versions.toml`, `Podfile`, `Package.swift`, `*.xcodeproj/project.pbxproj`, `Package.resolved`, `requirements.txt`, `go.mod`, `Gemfile`, `composer.json` → `stream-chat`, `stream_chat`, `@stream-io/`, `io.getstream`, `GetStream/stream-`, `getstream` (also the Feeds package).
33
+
34
+ **Client / auth**:
35
+ - JS: `StreamChat.getInstance(`, `new StreamChat(`, `useCreateChatClient`, `connectUser(`, `disconnectUser`, `devToken(`, `tokenProvider`, `createToken(` (server).
36
+ - iOS: `ChatClient(config:`, `ChatClientConfig`.
37
+ - Android: `ChatClient.Builder`, `StreamOfflinePluginFactory`, `StreamStatePluginFactory`.
38
+ - Flutter: `StreamChatClient(`.
39
+ - Angular: `ChatClientService.init`.
40
+
41
+ **UI components**:
42
+ - React: `<Chat`, `<ChannelList`, `<Channel`, `<Window`, `<ChannelHeader`, `<MessageList`, `<VirtualizedMessageList`, `<MessageInput`, `<Thread`, `<ThreadList`, `<ChannelSearch`/`<SearchBar`.
43
+ - Hooks: `useChatContext`, `useChannelStateContext`, `useMessageContext`.
44
+ - CSS: `stream-chat-react/dist/css/…`, `@stream-io/stream-chat-css`.
45
+ - Angular: `StreamChatModule`, `StreamAutocompleteTextareaModule`, `ChannelService`, `StreamI18nService`, `<stream-channel-list>`, `<stream-channel>`, `<stream-message-list>`, `<stream-message-input>`, `<stream-thread>`.
46
+ - React Native: `OverlayProvider`, `Chat`, `ChannelList`, `Channel`, `MessageList`, `MessageInput`, `Thread`, `ImageGallery`.
47
+ - iOS: `ChatChannelListVC`, `ChatChannelVC`, `ChatThreadVC`, `Components.default`, `Appearance.default`; SwiftUI `StreamChat(chatClient:)`, `ChatChannelListView`, `ChatChannelView`, `ViewFactory`.
48
+ - Android Views: `ChannelListView`, `MessageListView`, `MessageComposerView`, `MessageListHeaderView`, `ChannelListViewModel`, `bindView`, `ChannelListActivity`, `MessageListActivity`.
49
+ - Android Compose: `ChatTheme`, `ChannelsScreen`, `MessagesScreen`, `MessagesViewModelFactory`.
50
+ - Flutter: `StreamChat(`, `StreamChannel(`, `StreamChannelListView`, `StreamChannelListController`, `StreamChannelHeader`, `StreamMessageListView`, `StreamMessageInput`, `StreamChatTheme`.
51
+
52
+ **Channels**:
53
+ - Handles: `client.channel('<type>', …)`, `channel.watch()`, `queryChannels(`, `cid`, channel types (`messaging`, `team`, `livestream`, `commerce`, `gaming`, custom).
54
+ - Members: `members:` (member-based distinct channels → `!members-` IDs), `addMembers`, `removeMembers`, `addModerators`.
55
+ - Invites: `inviteMembers`, `acceptInvite`.
56
+ - State: `channel.update`/`updatePartial`, `hide`, `show`, `truncate`, `freeze`/`frozen`, `enableSlowMode`, `mute`/`unmute`, `pin`/`archive`.
57
+
58
+ **Messages**:
59
+ - Send/edit/delete: `sendMessage(`, `updateMessage`, `partialUpdateMessage`, `deleteMessage`.
60
+ - Reply types: `parent_id`, `show_in_channel`, `quoted_message_id`.
61
+ - Reactions: `sendReaction`/`deleteReaction`.
62
+ - Mentions: `mentioned_users`.
63
+ - Uploads: `sendImage`/`sendFile`, `attachments` (`image`, `file`, `video`, `audio`, `voiceRecording`, `giphy`, custom types).
64
+ - Flags: `pinMessage`, `silent`, `markRead`/`markUnread`, `translateMessage`.
65
+ - Extras: polls (`createPoll`, `castPollVote`), reminders (`createReminder`), drafts (`createDraft`), location (`SharedLocation`, `startLiveLocationSharing`), `extraData`/custom fields.
66
+
67
+ **Events**: `client.on(`, `channel.on(`, `message.new`, `typing.start`/`typing.stop`, `message.read`, `notification.message_new`, `user.presence.changed`, `connection.changed`, `channel.updated`, `member.added`.
68
+
69
+ **Moderation**: `banUser`, `shadowBan`, `muteUser`, `blockUser`, `flagMessage`/`flagUser`, blocklists, AutoMod config, roles/grants, `channel_role`.
70
+
71
+ **Push**: `addDevice(`, `removeDevice(`, `PushProvider`, `firebase`/`apn` provider names, `setPushPreferences`, `getstream` keys in the notification payload handlers.
72
+
73
+ **Other Stream products**:
74
+ - Video: `StreamVideoClient`, `StreamCall`, `useCall`, `call.join`/`call.ring`, `SpeakerLayout`, `CallControls`.
75
+ - **Activity Feeds**: npm `getstream`, `@stream-io/feeds-client`/`@stream-io/feeds-react-sdk`, `client.feed(`, `addActivity`, `follow(`, Python `stream`/`getstream` feeds.
76
+ - AI: `ai_indicator`, `@stream-io/chat-react-ai`.
77
+
78
+ **Server**: `createToken(`, `upsertUser(s)`, `deleteUser(s)`, `exportChannels`, `verifyWebhook(`, the `x-signature` header, `before_message_send_hook_url`, custom command URLs, SQS/SNS config.
79
+
80
+ **Env / config**: `STREAM_API_KEY`, `STREAM_API_SECRET`, `STREAM_KEY`, `VITE_STREAM_*`, `NEXT_PUBLIC_STREAM_*`, `EXPO_PUBLIC_STREAM_*`, `REACT_APP_STREAM_*`, keys in plists/`local.properties`/`--dart-define`, and CI secrets named `STREAM_*`.
81
+
82
+ **Tests / mocks**: `jest.mock('stream-chat…')`, `generateChannel`/`generateUser` test utilities, `getTestClient`.
@@ -0,0 +1,9 @@
1
+ # Native platforms (Android · iOS · Flutter) — NOT done until the platform build passes
2
+
3
+ Before declaring done:
4
+ - **Toolchain first:** bump the sample to the family `-core`'s build floors (Android Gradle/AGP/compileSdk/Kotlin; iOS resolve SPM/pods; Flutter swap the dep in `pubspec.yaml` → `flutter pub get`).
5
+ - **The wrapper file may refuse every write.** `gradle/wrapper/gradle-wrapper.properties` is a protected path: `Edit`, `Write` and a Bash `sed` against it can each be refused. Attempt it anyway, and if every route is refused, say **exactly which commands were refused** in the report rather than reporting the bump as done — a stale wrapper is the #1 Android build failure (AGP >= 8.9.1 needs Gradle >= 8.11.1). Beyond `&`/`$(…)`/`timeout`, a `|` (even as a sed delimiter or inside an alternation like `(bin|all)`), a `{a,b}` brace expansion and a `VAR=x cmd` env prefix are refused the same way, silently — use `/` delimiters, character classes, plain literals and separate lines before concluding an edit is impossible.
6
+ - **Kit dep added AND `initFromSettings` wired** in the app entry (`Application.onCreate` · `AppDelegate`/`App` · Flutter `main`). Flutter's `cometchat-settings.json` is an **asset**: project root AND under `flutter: assets:` in `pubspec.yaml`, or the build fails ("No file or variants found for asset").
7
+ - **`toCometChatId` in the CLIENT language** (verbatim Dart port in `references/concept-map.md` §IDs; Kotlin/Swift likewise), own module (`lib/cometchat/ids.dart` · `…/cometchat/Ids.kt` · `CometChat/Ids.swift`), **called at login**. **The UID is `toCometChatId(<the app's existing Stream user id>)`** — the `User(id: …)`/`connectUser`/token-provider id it already has. The core's "fresh app → `cometchat-uid-1`" advice does NOT apply to a migration: the identity exists, keep it.
8
+ - **`LICENSE`/README attribution** is residue too.
9
+ - **RUN the platform build** (`./gradlew :app:assembleDebug` · `xcodebuild … build` · `flutter analyze && flutter build web`), fix EVERY error, then **run it**: Flutter → `flutter run -d web-server --web-port 8765` via the Bash tool's **background mode** (`run_in_background`), then `sleep 20` and **Read** its output file (repeat ×3) until "is available at" or an exception shows, then **stop that task** and continue. No shell loops, `&`, `$(…)` or `timeout` (denied headless; no `timeout` on macOS); never park on a notification (headless: that ends the run).
@@ -0,0 +1,59 @@
1
+ # Report template — `COMETCHAT_MIGRATION.md`
2
+
3
+ Write this file at the repo root, filled from the ledger. Leave out an empty section's rows, but keep its heading with "None." so the reader knows it was checked. Then END the chat reply with sections 3 and 5 pasted in full (SKILL step 11).
4
+
5
+ ```markdown
6
+ # Stream (GetStream) → CometChat migration
7
+
8
+ **Branch:** cometchat-migration (created from <base>; <n> uncommitted files came along) · **Platform:** <framework> → CometChat <family label> · **Mode:** UI SDK | client | mixed
9
+ **Build:** ✅ passes (`<command>`) | ❌ <n> errors (listed below) · **Stream residue:** none | <paths>
10
+
11
+ ## 1. Summary
12
+ <2–4 sentences: what the app did with Stream (Chat / Video / Feeds), what it does now, the headline removals.>
13
+
14
+ ## 2. Migrated
15
+ | Stream feature | CometChat equivalent | Files |
16
+ |---|---|---|
17
+ | ChannelList + Channel/Window | Conversations + message pane (UI Kit) | src/chat/ChatPage.tsx, … |
18
+
19
+ ## 3. Removed — not available in CometChat
20
+ | Feature | What it did | Removed from | What users lose | Evidence (features.json · `UI Kit:` docs query → result · `SDK:` docs query → result) | Closest CometChat alternative |
21
+ |---|---|---|---|---|---|
22
+ | Activity feed | Home timeline + follow buttons | src/feed/*, src/components/FollowButton.tsx, route /feed, server/feed.ts | The social feed | absent · UI Kit: `search_cometchat_docs "<feature> react ui kit"` → no page · SDK: `search_cometchat_docs "<feature> javascript sdk"` → no page | — |
23
+
24
+ ### Dev/QA-only code removed (not user features)
25
+ | Code | What it did | Removed from |
26
+ |---|---|---|
27
+ | <debug panel / event simulator / screenshot harness> | <…> | <paths> |
28
+
29
+ ## 4. Behavior changes (migrated, works differently)
30
+ - Livestream channels are now public groups; over 300 members, receipts and typing are off.
31
+
32
+ ## 5. Your action items
33
+ 1. Add your CometChat credentials (App ID, Region, Auth Key for dev) to `<untracked local env file>`. Never put them in a git-tracked file; placeholders are there now.
34
+ 2. Create a REST API key and set `COMETCHAT_REST_API_KEY` on the server (the token endpoint + the data script).
35
+ 3. Import your history: see `scripts/cometchat-migration/README.md` (dry run first).
36
+ 4. **Messages older than ~6 months were NOT imported** (<n> skipped) — CometChat's default retention window (a CometChat-side limit, the same for any source — not a Stream property). To bring them over, purchase Extended Storage (contact CometChat sales), then re-run the import.
37
+ 5. **Re-host media before deleting Stream** (<n> attachments). CometChat stores attachment URLs by reference, not the files, and Stream CDN URLs expire — re-host them to your own / CometChat media storage, or images and files break.
38
+ 6. Enable in the CometChat dashboard: <extensions / AI features the migrated features need>.
39
+ 7. Push: upload FCM/APNs credentials to CometChat (see the push setup).
40
+ 8. Point your webhooks at the new receiver and pick the events.
41
+ 9. Before production: switch from Auth Key login to server-issued auth tokens (if `devToken` was used).
42
+ 10. Remove `STREAM_*` secrets from your CI and hosting env, then delete the Stream app after the cut-over.
43
+
44
+ ## 6. Defaults taken (no questions were asked)
45
+ - <every decision made without asking, e.g. "UI SDK mode: replaced stream-chat-react with the CometChat UI Kit", "kept react-native-reanimated (used by other screens)">
46
+
47
+ ## 7. Verification
48
+ - Build: `<command>` → <result>
49
+ - Residue search: `stream-chat|stream_chat|@stream-io|getstream|StreamChat|StreamVideo` → <result>
50
+ - Tests: <ran / not present / updated n tests, removed m tests of removed features>
51
+ - Pre-existing issues (were failing before the migration): <list or none>
52
+ ```
53
+
54
+ Rules for the lists:
55
+ - Section 3's main table is for USER-facing features only. Debug panels, event simulators, doc-screenshot harnesses and demo settings go in the Dev/QA-only subsection, which needs no docs evidence. Moving a real user feature there to dodge the evidence rule is a defect.
56
+ - Every REMOVE row names the concrete files and UI entry points it touched, AND its evidence in this exact shape — `features.json`: <result> · `UI Kit:` `search_cometchat_docs "<feature> <platform> ui kit"` → <result> · `SDK:` `search_cometchat_docs "<feature> <platform> SDK"` → <result> (plus REST/live-fetch if used). A row whose cell lacks an explicit **SDK-level** query (the literal `SDK:` label or an `/sdk/` page) is graded as unevidenced, however right the removal is. "Removed feeds" alone is not enough. **The Evidence cell is MANDATORY on every row and must never be blank** — this includes narrower/partial removals (e.g. "Threads overview tab" while threaded replies stay): still cite the `features.json` + UI-Kit + SDK queries that show the specific surface has no equivalent. A row with an empty Evidence cell is an incomplete report.
57
+ - **Section 3 is a TABLE, never prose.** Write every removal as a row of the 6-column table above — not as bullets, paragraphs or a list, however well written. A removal outside a table row is ungradeable and the section is read as an incomplete report. (An empty section is the one exception: keep the heading with "None.")
58
+ - "Closest CometChat alternative" must be a real, documented capability (from `features.json` or the docs), or `—`. Never invent one.
59
+ - Order the action items by what unblocks running the app first: credentials first, then data, then production hardening.
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: cometchat-migrate-from-sendbird
3
+ description: "Migrate an app from Sendbird to CometChat end-to-end in ONE prompt, on any platform in this pack (React, Angular, React Native/Expo, iOS, Android, Flutter). Inventories every Sendbird usage (Chat SDK v3/v4, UIKit, Calls, Desk, push, server Platform API, webhooks), swaps each supported feature for its CometChat equivalent, REMOVES features CometChat has no equivalent for (code, UI, deps), writes a data-migration script for users/groups/history, uninstalls Sendbird, verifies the build, and ends with a report listing what was migrated, what was removed and what you still need to do. Triggers: 'migrate my app from Sendbird to CometChat', 'migrate my app to CometChat' (Sendbird detected), 'replace Sendbird with CometChat', 'switch from Sendbird', 'move off Sendbird', 'sendbird to cometchat', 'port my Sendbird chat to CometChat'."
4
+ license: "MIT"
5
+ compatibility: "FROM Sendbird Chat SDK v3 (`sendbird`) / v4 (`@sendbird/chat`, SendbirdChatSDK, com.sendbird.sdk, sendbird_chat_sdk), Sendbird UIKit (React, React Native, iOS UIKit/SwiftUI, Android Views/Compose, Flutter), Sendbird Calls → TO the CometChat family this pack detects (peers.yaml): React UI Kit v7, Angular v5, React Native v5, iOS v5, Android v6, Flutter v6, plus the headless Chat/Calls SDKs. Node >=18 for the data-migration script."
6
+ metadata:
7
+ author: "CometChat"
8
+ version: "1.0.0"
9
+ tags: "cometchat migration sendbird competitor switch replace port uikit sdk calls data-import"
10
+ ---
11
+
12
+ > **Ground truth:** the SENDBIRD side (what to look for) is baked in `references/inventory.md` + `references/feature-map.md` — confirm each hit by reading the user's code. The COMETCHAT side is never from memory: symbols come from the target family's skills + catalog, feature existence from that family's `features.json`, signatures from the docs via the family's `-core/references/docs-map.md` (Docs MCP first — `RULES.md` → Fetch discipline). REST pages live under `DOCS_BASE` = `https://www.cometchat.com/docs`.
13
+
14
+ ## Companion skills (read first)
15
+ - `cometchat-<family>-core` — the init → login → render the migrated app lands on. `<family>` is resolved in step 1; this skill ASSUMES that core and never restates its code.
16
+ - `cometchat-<family>-components` / `-features` / `-calls` / `-push` / `-customization` — pulled in only for the Sendbird features the inventory finds.
17
+
18
+ ## Use this skill when
19
+ The user asks to move an app off Sendbird: "migrate my app from Sendbird to CometChat", "replace Sendbird", "switch to CometChat", or "migrate my app to CometChat" when `npx @cometchat/skills detect --json` reports `migrate_from` with vendor `sendbird`. Stream/GetStream apps → `cometchat-migrate-from-getstream`. An app with BOTH vendors: run both skills, one after the other, into one report.
20
+
21
+ ## The single-prompt contract (read before step 1)
22
+ The migration request IS the approval (`RULES.md` → Competitor migration). Run every step below to the end in this one turn:
23
+ - **Do not stop to ask.** No onboarding plan/approve gate, no clarification questions. Where a companion skill would ask, take the default written here, and record it under *Defaults taken* in the report.
24
+ - **Safety net instead of questions:** in a git repo, first `git switch -c cometchat-migration` (carries any uncommitted work along; mention that in the report). Never commit, push, or rewrite history. No git → proceed and say so in the report.
25
+ - **Removing Sendbird is the requested outcome** — `RULES.md`'s append-never-replace does not protect Sendbird code. It still protects everything else: touch non-chat code only to rewire it.
26
+ - **Credentials: never ask, never provision.** Reuse `.cometchat/config.json` or existing CometChat env values if present; otherwise write the family's env/settings file with clearly-named placeholders so the build still compiles, and make "add your CometChat credentials" action item #1. **Never write a real key into a git-tracked file:** check `git ls-files <file>` first. If the file is tracked, put real values in the untracked local variant the framework reads (Vite/Next `.env.local`, Android `local.properties`, …) and keep placeholders in the tracked file. Adding a tracked file to `.gitignore` does NOT untrack it. The server's REST API key only ever goes into an untracked file or the hosting env.
27
+ - **Only three STOPs:** (1) no Sendbird usage found → say so and hand to `cometchat`; (2) the app's platform has no family in this pack (Vue, Unity, .NET, …) → deliver the inventory + feature map as the report, change nothing; (3) the build was already failing before you started → record the pre-existing errors, migrate anyway, and label them as pre-existing.
28
+
29
+ ## Migration workflow (BAKED — do every step, in order)
30
+ Every step applies to every app, however small: a 3-file sample still has vendor users and history, so steps 4 (`toCometChatId`) and 8 (data script) are ALWAYS delivered. Only a step whose subject truly doesn't exist (no server → step 7) may be skipped, and it's listed under *Defaults taken* as `skipped: <why>`. A silent skip is a failed migration.
31
+ 1. **Detect.** `npx @cometchat/skills detect --json` → `framework`, `android_variant`, `existing_cometchat`, `migrate_from`. Resolve `<family>` exactly like the router (`peers.yaml` `dir_prefix`; per-platform targets in `references/inventory.md` §Target family). Monorepo: migrate every package that uses Sendbird, including the server. `existing_cometchat: true` + Sendbird still present = a half-finished migration: resume it, don't redo it. Read `.cometchat/config.json` if it exists: its `appId`/`region`/`authKey` are THE credentials. Write them into the family's untracked env/settings file (single-prompt contract), never ask. Before editing anything, run the app's build once and record whether it passed.
32
+ 2. **Inventory — the usage ledger.** Grep per `references/inventory.md` (packages, imports, init/connect, UIKit components, handlers, collections, push registration, Calls, Desk, env vars, server Platform API calls, webhooks, tests/mocks). Record every hit as `file:line → what it does`. Classify the app: **UIKit mode** (Sendbird UIKit renders the chat) → the family's CometChat UI Kit replaces it; **SDK mode** (own UI on the Sendbird Chat SDK) → KEEP the app's UI and port its data layer to the family's CometChat Chat SDK; **mixed** → both.
33
+ 3. **Feature map.** For every Sendbird feature the ledger shows, look up its row in `references/feature-map.md`, then check the listed CometChat id in the TARGET family's `features.json`. Present → **migrate**. Absent → check BOTH levels — UI Kit (`search_cometchat_docs "<feature> <platform> ui kit"`) AND Chat SDK/REST (`… SDK`); documented at either → migrate (**no UI Kit drop-in is NOT unsupported**), built with the SDK method in the app's own UI (`RULES.md` → UI Kit first, SDK fallback). Mark **UNSUPPORTED only** when NEITHER has it — and **an empty MCP search is NOT proof**: follow the verification ladder (re-query with CometChat vocabulary → live-fetch the likely docs page → cross-check the family CATALOG) in `references/feature-map.md` §Deciding unsupported, before any REMOVE. Never call a feature unsupported from memory or invent an API; if it truly can't be verified, KEEP it as `needs-verification`. **Every UNSUPPORTED row needs evidence in the report** — the `features.json` result + the exact UI Kit AND SDK queries you ran.
34
+ 4. **Install CometChat and wire the core** per `cometchat-<family>-core` (its install, `initFromSettings`, login gate, render order, env file). **Identity:** the CometChat UID is the app's existing Sendbird user ID passed through ONE shared `toCometChatId()` (`references/concept-map.md` §IDs) — used by the client login, the server token endpoint, AND the data script, so all three agree. Login: the app minted Sendbird session/access tokens on a server → migrate that endpoint (step 7) and use the auth-token login; the app connected with only a user ID → Auth Key login (dev only) + an action item to switch to tokens before production. **Keep every identity source, in the same order:** whatever decides the current user today (URL params, env vars like `VITE_USER_ID`, the auth provider, a stored ID, a demo fallback) still decides it after the migration. Only the Sendbird-token-derived path becomes the CometChat auth token. Dropping one silently logs a configured deployment in as someone else. **NEVER replace a seeded identity with a placeholder.** If the app ships a concrete default user (`default_user_id`/`USER_ID`/a demo fallback in strings, env or constants), that exact value STAYS — pass it through `toCometChatId()`, do not overwrite it with `cometchat-uid-1`, `Cometchat User 1` or any `YOUR_*` stand-in. The core skill's placeholder UID is for an app that has NO identity yet; an app being migrated always has one. Getting this wrong is silent: the build passes, the app launches, and every migrated user signs in as a stranger with an empty inbox while the data script imported their history under their real id. Before you finish, diff every identity default you touched against its pre-migration value and confirm it is unchanged. **Returning users:** the app already persists who is signed in (localStorage, keychain, prefs, a cookie) from the vendor era. Gate the chat on CometChat's logged-in user, NOT that cached ID. On start, a stored ID with no CometChat session → run the same login path before rendering any CometChat component; if that fails → the sign-in screen. Otherwise every user who was signed in before the upgrade lands on a broken chat. **No UI Kit family for this app?** A headless / vanilla-JS app that draws its own UI on SendbirdChat / `sendbird` (no framework the pack ships a UI Kit for) has no `-core` to wire — do NOT stop. Install the CometChat **Chat SDK** for the platform (web → `@cometchat/chat-sdk-javascript`) and migrate the data layer straight onto it, taking every method from the SDK docs (`/sdk/<platform>/*`). Keep the app's own UI; there is no UI Kit to install. This is client/SDK mode with no framework core — the concept map's SDK/client-mode section still applies.
35
+ 5. **Replace usage, file by file,** using `references/concept-map.md`: Sendbird init/connect → CometChat init/login; channel list → conversations; group channel / 1:1 distinct channel → group / user conversation; handlers → listeners (remove them on unmount); message send/receive/edit/delete/threads → the core + `-features` skill; UIKit screens → the family's components (`-components`/`-placement`); theme/string sets → `-customization`; Calls → `-calls` (or the headless calls peer); push → `-push`. Remove each Sendbird import as you replace its last use. **Both modes fetch from docs only:** UI Kit component props AND SDK method signatures come from the live docs (the family `core`'s `docs-map.md`), verified against the catalog — never written from memory or ported from the vendor's API shape.
36
+ 6. **Remove unsupported features FULLY.** For each UNSUPPORTED row: delete the feature's code path, its UI entry points (buttons, menu items, routes, screens, settings toggles), state/stores, types, hooks, assets, tests, env vars, server endpoints and dependencies — no dead buttons, no commented-out blocks, no feature flags left on. Keep the surrounding screen working. Log each one for the report: feature · what it did · files changed · what users lose · the closest CometChat alternative (if any).
37
+ 7. **Server side.** Replace Sendbird session/access-token minting with a CometChat auth-token endpoint (REST: create the user if missing, then create an auth token — `/rest-api/auth-tokens`, REST API key from server env only). Map Sendbird webhooks to CometChat webhooks (`/rest-api/management-apis/webhooks/overview`); drop or list any event with no equivalent. Replace other Platform API calls with CometChat REST, or remove + list them (step 6).
38
+ 8. **Data migration script — write it, then run the import for the user.** Generate `scripts/cometchat-migration/` per `references/data-migration.md`: export users, channels, members and messages from the Sendbird Platform API → transform with the same `toCometChatId()` → import through the CometChat Data Import API. When the code migration is done, tell the user the **data-import script is ready** and ask for the credentials it needs — the source keys (`SENDBIRD_APP_ID`, `SENDBIRD_API_TOKEN`) and the CometChat **App ID, Region and full-access REST API key**. (Asking for these is the ONE question the single-prompt contract allows; everything else still takes the documented default.) As soon as the user provides them, **RUN the import yourself** from env vars — never write the secrets into a repo file: a `--dry-run` first (show the users / groups / members / messages counts), then the real import, then report what landed and what failed. Only messages within CometChat's **6-month retention window** import — tell the user to **reach out to CometChat to import messages older than 6 months**. If the user does not share credentials, leave running the script as an action item.
39
+ 9. **Uninstall Sendbird.** Remove every Sendbird dependency (package.json + regenerate the lockfile, Podfile/SPM, Gradle dependency AND the Sendbird Maven repo, pubspec), CSS imports, fonts/icons, env vars, native config, and CI secrets references. Re-run the package manager install. **On iOS/SPM the ROOT manifest counts too**: a vendored-SDK repo declares the vendor in its own `Package.swift`/`*.podspec` at the repo root, not just in the app's `.xcodeproj` — remove the dependency there AND delete any vendored `Framework/*.xcframework`, or the vendor package is still declared after every call site is gone. Update the app's OWN docs (README, setup/deploy guides, `.env.example`): setup steps, env var names and screenshots captions that describe Sendbird now describe CometChat. Rename Sendbird-named identifiers (`sendbirdUserId` → `userId`).
40
+ 10. **Verify** (§Verify it works). Fix every build error you introduced. Don't run live tests unless asked (`RULES.md` → Verification scope).
41
+ 11. **Report.** Write `COMETCHAT_MIGRATION.md` at the repo root from `references/report-template.md`, then END your reply with its two lists pasted in full: **Removed — not available in CometChat** and **Your action items**. This final list is the deliverable the user asked for; never skip it, even if nothing was removed (say "none").
42
+
43
+ ## Common pitfalls
44
+ - **Accessibility is never a "missing feature".** Sendbird-provided skip links, focus management, live regions and keyboard shortcuts are plain HTML/ARIA/host code. Re-create them in the app against the new CometChat layout, and never list them as Removed. Losing them is a regression, not an honest removal.
45
+ - **The provider swap moves wrapper elements.** `CometChatProvider` (and, on web, `CometChatErrorBoundary`) render wrapper elements exactly where the vendor's provider sat. If they now wrap the app's own shell/header, each wrapper needs a height in the chain, or the chat renders at 0px while the build passes. Follow the core's layout reference, and check the chain from the root element down to the conversation list.
46
+ - **IDs that CometChat rejects or merges.** UIDs/GUIDs are alpha-dash (`a-z 0-9 - _`), max 100 characters, and lowercased. Sendbird IDs can contain `@`, `.`, spaces or uppercase. Sanitize with one deterministic function and use it everywhere, or users log in to empty inboxes.
47
+ - **1:1 chats are not groups.** A distinct Sendbird group channel with exactly two members becomes a CometChat *user* conversation (`receiverType: user`), not a two-person group.
48
+ - **Large channels.** CometChat sends receipts and typing indicators only in groups up to 300 members (100,000 without them). Supergroups over 300 keep chatting but lose receipts: list that as a behavior change.
49
+ - **Leftover handlers.** Every Sendbird `ChannelHandler`/`GroupChannelHandler`/`ConnectionHandler` needs a CometChat listener that is also removed on unmount/dispose. Missing removals cause duplicate messages.
50
+ - **Half-removed features.** Deleting the API call but leaving the button (or the route) is a dead end (`RULES.md` → Default-on affordances). Remove the entry point too.
51
+ - **Collections/local cache.** Sendbird `GroupChannelCollection`/`MessageCollection` gave offline cache and auto-sync. Port them to the CometChat request builders + listeners and note the behavior change. Don't re-invent a cache.
52
+ - **Never delete non-Sendbird code** that just shares a file with Sendbird code. Rewire it.
53
+
54
+ ## Native platforms (Android · iOS) — NOT done until the platform build passes
55
+ Native builds (Android/iOS/Flutter) have extra REQUIRED steps beyond editing code — bump the sample toolchain to the `-core` build floors, add the kit dep AND wire `initFromSettings` in the app entry, port `toCometChatId` to the client language, edit `.pbxproj`/`.xcscheme` as structured build graphs (never a text scrub), and RUN the platform build. **A native migration is NOT done until you have followed `references/native-build.md` in full** — open it and work through every step; it is mandatory, not optional.
56
+
57
+ ## Verify it works
58
+ - The app builds/type-checks with the family's normal command (the core skill's "Verify it works"). **On native, this means actually running the platform build above — not just visual inspection.**
59
+ - **RUN it and read the logs — a compile is NOT a working app (do this; don't skip).** When you're done implementing, START the app and confirm it LOADS with the chat surface rendered and NO errors: web → the dev server (or build + preview), open it, watch the **browser console** + the dev-server terminal; native → the platform run + logcat / Xcode console / `flutter` logs. Fix EVERY runtime error you introduced before declaring done — a `Cannot read properties of undefined` from a half-migrated reference, or an SDK enum/class read at module-load before the SDK is ready, is a migration bug, not the user's problem (hand off to `cometchat-<family>-troubleshooting` for symptom → fix). If the app genuinely can't be started here (no dev env / needs a device), SAY SO and give the user the exact run command + what to watch for — never silently skip this.
60
+ - **Zero Sendbird residue — run exactly this, over ALL file types (docs included):** `grep -rIilE 'sendbird' . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist --exclude-dir=build --exclude-dir=.claude --exclude-dir=Pods --exclude-dir=.dart_tool --exclude-dir=.gradle | grep -vE 'COMETCHAT_MIGRATION.md|scripts/cometchat-migration'` → must print nothing (repeated `--exclude-dir=` flags on purpose: a `{a,b}` brace list is rejected by the coding agent's command-permission parser, so the check silently never runs). The ONE allowed mention is a single provenance comment above `toCometChatId()`; code identifiers, README lines and env names are residue, not "expected". **This includes a "migrated from <vendor>" line in the README or any doc you write** — a provenance note reads as helpful and is still residue; the migration report is where that belongs, and it is already exempt. Rewrite the app's own README so it describes CometChat, naming the vendor nowhere. The same goes for every other doc the repo ships — `CHANGELOG.md`, `docs/`, `changelogs/`, a vendored SDK's own release notes: if a file is not the migration report, it must not name the vendor. Delete the ones that document the vendor's product rather than your app. **Clearing residue out of `project.pbxproj` / `*.xcscheme` is a structured edit, never a text scrub** — remove the vendor's SPM package reference and its build-phase entries as whole blocks, and keep the project's own product and target structure (see the native block above).
61
+ - `scripts/cometchat-migration/migrate.mjs` + `README.md` exist — **even for a demo/sample app with no data of its own** (the script is a deliverable for the user's real data, not for this checkout; step 8 is never skipped).
62
+ - Every CometChat symbol you emitted exists in the family catalog. Every migrated feature is in `features.json` or the docs. Every UNSUPPORTED item is in the report's Removed list with its files.
63
+ - The server token endpoint, the client login and the data script all call the same `toCometChatId()`.
64
+ - **Runtime shape, statically checked:** every element from the root to the conversation list has a height (wrappers included). A user who was signed in before the migration is logged in to CometChat again before the chat renders. No real secret sits in a git-tracked file (`git ls-files` each file you wrote credentials to).
@@ -0,0 +1,99 @@
1
+ # Sendbird → CometChat concept map
2
+
3
+ This maps **roles**, not code. For every CometChat call, component and prop, take the exact name and signature from the target family's skill (`cometchat-<family>-core` / `-components` / `-features`), its catalog, and the docs (`-core/references/docs-map.md`). The platforms differ: web callbacks are `on*Click`, React Native's are `on*Press`, and Android/iOS/Flutter use their own init shapes. Never port a snippet from one family to another.
4
+
5
+ ## IDs (do this first — everything else depends on it)
6
+ CometChat UIDs and GUIDs are **alpha-dash only** (`a-z`, `0-9`, `-`, `_`), **max 100 characters**, and **lowercased automatically** (`/articles/properties-and-constraints`). Sendbird user IDs and channel URLs are not. Emit ONE deterministic helper per language the repo uses (client, server, and the data script share its logic exactly):
7
+
8
+ ```js
9
+ // toCometChatId — the single source of truth for Sendbird ID → CometChat UID/GUID.
10
+ // Deterministic: the same input always yields the same ID, on every platform and in the data script.
11
+ export function toCometChatId(id) {
12
+ const raw = String(id);
13
+ let out = raw.toLowerCase().replace(/[^a-z0-9_-]/g, "_");
14
+ // Changed or too long → add a short stable hash of the ORIGINAL, so "A.b" and "a_b" never merge.
15
+ if (out !== raw || out.length > 100) {
16
+ let h = 0;
17
+ for (const c of raw) h = (Math.imul(31, h) + c.codePointAt(0)) >>> 0;
18
+ out = `${out.slice(0, 90)}_${h.toString(36)}`;
19
+ }
20
+ return out;
21
+ }
22
+ ```
23
+
24
+ ```dart
25
+ // lib/cometchat/ids.dart — the SAME rule as the JS helper (same 32-bit hash, same base-36 suffix); output-identical.
26
+ String toCometChatId(String id) {
27
+ final raw = id;
28
+ var out = raw.toLowerCase().replaceAll(RegExp(r'[^a-z0-9_-]'), '_');
29
+ if (out != raw || out.length > 100) {
30
+ var h = 0;
31
+ for (final c in raw.runes) { h = ((31 * h) + c) & 0xFFFFFFFF; }
32
+ out = '${out.substring(0, out.length > 90 ? 90 : out.length)}_${h.toRadixString(36)}';
33
+ }
34
+ return out;
35
+ }
36
+ ```
37
+
38
+ The Dart port above is verbatim; port to Swift/Kotlin the same way: same steps, same 32-bit hash, same base-36 suffix. An ID that is already valid passes through unchanged, so most apps see no difference.
39
+
40
+ ## Core concepts
41
+ | Sendbird | CometChat (role) | Notes |
42
+ |---|---|---|
43
+ | Application ID | App ID + Region | Region comes from the dashboard (`us`/`eu`/`in`). Both go in the family's env/settings file. |
44
+ | `SendbirdChat.init` / `new SendBird()` / `SendbirdUIKit.init` / `SendbirdUI.initialize` | the family's `initFromSettings` (UI Kit) or the Chat SDK's init | Per core skill. Init once, before any login or render. |
45
+ | `connect(userId, accessToken/sessionToken)` | the auth-token login, with a token from YOUR server | Production path. |
46
+ | `connect(userId)` with no token | the Auth Key login | Dev only (`RULES.md` → Credentials). Action item: move to tokens. |
47
+ | `SessionHandler` (token refresh) | re-login with a fresh auth token when the SDK reports an expired or invalid session | Fetch the token lifecycle docs. |
48
+ | `disconnect()` | logout | Call on sign-out, and clean up listeners. |
49
+ | User (`userId`, `nickname`, `profileUrl`, `metadata`) | User (`uid` = `toCometChatId(userId)`, name, avatar, metadata) | Users must EXIST before login. The server endpoint creates them on first login; the data script imports the rest. |
50
+ | GroupChannel, **distinct, exactly 2 members** | a **user** conversation (1:1) | Receiver = the other member's UID. Never a 2-person group. |
51
+ | GroupChannel (other) / supergroup | Group (`guid` = `toCometChatId(channel_url)`) | Private → `private`. `isPublic` → `public`. A password flow → `password`. |
52
+ | OpenChannel | a **public** Group | Users join it. There's no "enter/exit"-only presence. |
53
+ | Channel list query / `GroupChannelCollection` | the conversations list (UI Kit) or the conversations request builder (SDK) | |
54
+ | `PreviousMessageListQuery` / `MessageCollection` | the message list (UI Kit) or the messages request builder (SDK) | Paging, not a local cache. |
55
+ | UserMessage / FileMessage / AdminMessage | text message / media message / (admin → an action or a custom message; usually dropped) | |
56
+ | `customType`, `data`, `metaArrays` | custom message type + message metadata | |
57
+ | `parentMessageId` (thread) | the parent message ID on the reply | Threads feature row. |
58
+ | `GroupChannelHandler`, `ConnectionHandler`, `UserEventHandler` | message / group / user / connection listeners | Add on mount, REMOVE on unmount/dispose (by listener ID). |
59
+ | Operators | group scope `admin` / `moderator` | |
60
+ | Push token registration | the family's push skill (Notifications product) | |
61
+
62
+ ## UIKit screen map (UIKit mode)
63
+ | Sendbird UIKit screen (any platform) | CometChat UI Kit role | Where |
64
+ |---|---|---|
65
+ | `App` / all-in-one chat | the production-ready core surface (conversation list ↔ message pane) | `-core` golden path |
66
+ | Channel list (`GroupChannelList`, `ChannelList`, `SBUGroupChannelListViewController`, `ChannelListFragment`/`ChannelListScreen`, `createGroupChannelListFragment`, `SBUGroupChannelListScreen`) | Conversations | `-components` |
67
+ | Channel (`GroupChannel`, `Channel`, `SBUGroupChannelViewController`, `ChannelFragment`/`ChannelScreen`, `createGroupChannelFragment`, `SBUGroupChannelScreen`) | message header + message list + message composer | `-core` / `-components` |
68
+ | Channel settings / members | group details + group members | `-placement` (details panel) / `-components` |
69
+ | Create channel | the users picker + group creation | `-components` |
70
+ | Thread | the thread header + threaded message list | `-features` (`threaded-replies`) |
71
+ | Message search | Search | `-features` (`message-search`) |
72
+ | Open channel screen | the message pane on a public group | `-core` |
73
+ | Edit profile | no kit screen → keep the app's UI and call the SDK's update-current-user method | docs |
74
+
75
+ On React v7 these are `CometChatConversations`, `CometChatMessageHeader`, `CometChatMessageList`, `CometChatMessageComposer`, `CometChatThreadHeader`, `CometChatSearch`, `CometChatUsers`, `CometChatGroups` and `CometChatGroupMembers`. Other families: take the names from their `-components` skill.
76
+
77
+ **Routing and navigation:** keep the app's routes and URLs. Swap only what renders inside them. A Sendbird route param like `/chat/:channelUrl` becomes `toCometChatId(channelUrl)`, so deep links and bookmarks keep working after the data import.
78
+
79
+ **Styling:** delete the Sendbird CSS import and any Sendbird theme providers. Re-apply the brand through the family's `-customization` skill (colors, fonts, dark mode). Follow-the-OS theming is a core obligation (`RULES.md`).
80
+
81
+ ## Behavioral differences to handle (sdk-mode gotchas)
82
+ Keeping the app's own UI means matching the vendor's runtime BEHAVIOR, not just method names. The app should look and behave the same after migration — only the data source changed. Watch these:
83
+ - **Optimistic send / local echo.** Sendbird's `send` GroupChannel.sendUserMessage returns a pending message immediately (local echo), then a second callback confirms it; the message appears instantly, then updates on confirm. CometChat's `CometChat.sendMessage()` resolves with the sent message on success and rejects on failure — there's no separate pending object. To keep the instant-echo UX, insert a local placeholder yourself on submit and replace it with the resolved message (or roll it back on reject). Don't drop the echo and make sends feel laggy.
84
+ - **Pagination.** Sendbird pages with PreviousMessageListQuery / MessageCollection. CometChat uses `new CometChat.MessagesRequestBuilder().setUID/setGUID(...).setLimit(n).build()` and `.fetchPrevious()` (older) / `.fetchNext()` (newer), holding ONE builder instance per conversation for the cursor. Map the app's scroll-to-load to the same builder; a fresh builder per page re-fetches from the top.
85
+ - **Listener lifecycle.** Each GroupChannelHandler becomes a CometChat listener added with a unique ID and REMOVED on unmount/dispose. Reuse the app's existing subscribe/unsubscribe points; a listener added on every render without removal duplicates messages.
86
+ - **Delivered/read + typing.** These are separate `CometChat` calls and listener events, not fields on the message object. Wire them where the app read the vendor's equivalents.
87
+ - **Fetch every method + shape from the SDK docs** (`/sdk/<platform>/*`) and verify against the catalog — never port the vendor's signature by analogy.
88
+
89
+ ## SDK mode (the app draws its own UI)
90
+ Keep every component and screen. Replace only the data layer (the service/store/hook that talks to Sendbird): each method calls the CometChat Chat SDK equivalent, and each handler becomes a listener. Keep the app's own model types. Map CometChat objects into them at the boundary, so the UI code doesn't change. **Every CometChat SDK method, its signature, its listener class and its parameter shapes come from the live docs — never from memory and never from the vendor's API by analogy.** For each data-layer call, open the family's SDK docs (`cometchat-<family>-core/references/docs-map.md` → SDK section, or the `-sdk` skill where one ships), fetch the exact method (e.g. `CometChat.getConversationList` via `new CometChat.ConversationsRequestBuilder()`, `CometChat.sendMessage`, `CometChat.addMessageListener`), and verify it against the family catalog before you emit it. A `<vendor>`-method-to-CometChat-method guess that you did not fetch is a defect, even if it compiles. Look up the method list in the family's SDK docs (docs-map → SDK section; React Native: `cometchat-react-native-sdk/references/method-map.md`; Android: `cometchat-android-v5-sdk`).
91
+
92
+ ## Server
93
+ | Sendbird server piece | CometChat replacement |
94
+ |---|---|
95
+ | Session/access-token endpoint (`POST /v3/users/{id}/token`, or `issue_access_token` on user create) | Your endpoint: create the user if missing (`POST /v3/users`), then `POST /v3/users/{uid}/auth_tokens`. Uses the **REST API key**, server env only, never shipped to clients (`/rest-api/auth-tokens`). |
96
+ | Webhook receiver (`x-sendbird-signature`) | A CometChat webhook receiver with the events mapped (`/rest-api/management-apis/webhooks/overview`). Delete the Sendbird signature check. |
97
+ | User sync on sign-up (Platform API create/update user) | CometChat REST create/update user (docs), called with the same `toCometChatId()` |
98
+ | Moderation / admin scripts | CometChat REST equivalents, or REMOVE + list them |
99
+ | Env: `SENDBIRD_API_TOKEN` | `COMETCHAT_APP_ID`, `COMETCHAT_REGION`, `COMETCHAT_REST_API_KEY` (placeholders + an action item) |
@@ -0,0 +1,74 @@
1
+ # Data migration — Sendbird history → CometChat (write it; the user runs it)
2
+
3
+ CometChat supports two approaches (`/fundamentals/data-import-and-migration`):
4
+ - **Historical import:** bulk-load users, groups, members and messages before go-live. It uses the Data Import REST API, and this script does it.
5
+ - **Live migration:** both systems bridged during a gradual rollout. This needs CometChat's team, so if the app can't have a cut-over window, add the action item "contact CometChat sales for live migration".
6
+
7
+ Emit `scripts/cometchat-migration/` with:
8
+ - `migrate.mjs`: Node ≥18, no dependencies, uses global `fetch`.
9
+ - `README.md`: how to run it.
10
+ - `id.mjs`: a copy of `toCometChatId()` from `concept-map.md`. It must be byte-identical in logic to the one the app and server use.
11
+
12
+ The script reads its secrets from env (`SENDBIRD_APP_ID`, `SENDBIRD_API_TOKEN`, `COMETCHAT_APP_ID`, `COMETCHAT_REGION`, `COMETCHAT_REST_API_KEY`), never from a file in the repo. **The agent runs it for the user** once they provide those credentials (SKILL.md step 8): a `--dry-run` first, then the import — always from env vars, never hardcoded into a repo file, and never committed. If the user declines to share credentials, leave running it as an action item instead.
13
+
14
+ ## 1. Export from Sendbird (Platform API)
15
+ Base `https://api-${SENDBIRD_APP_ID}.sendbird.com/v3`, with header `Api-Token: ${SENDBIRD_API_TOKEN}`. These endpoints and their paging parameters are from Sendbird's Platform API. **Check each one against Sendbird's current Platform API reference while writing the script, and note any difference in the README.**
16
+
17
+ | Data | Endpoint | Paging |
18
+ |---|---|---|
19
+ | Users | `GET /users?limit=100` | `next` token → `&token=` |
20
+ | Group channels | `GET /group_channels?limit=100&show_empty=true&show_member=true` | `next` token |
21
+ | Channel members | `GET /group_channels/{channel_url}/members?limit=100` | `next` token |
22
+ | Messages | `GET /group_channels/{channel_url}/messages?message_ts=<ms>&prev_limit=0&next_limit=200&include=false&with_sorted_meta_array=true` | advance `message_ts` past the last `created_at` |
23
+ | Open channels (+ messages) | `GET /open_channels?limit=100`, `GET /open_channels/{channel_url}/messages?…` | same |
24
+
25
+ Honor Sendbird's rate limits (back off on HTTP 429). Write each export to `export/*.jsonl` so a failed run can resume without re-exporting.
26
+
27
+ ## 2. Transform
28
+ - **User:** `uid = toCometChatId(user_id)`, `name = nickname || user_id`, `avatar = profile_url` (must be a URL), `metadata = { ...metadata, sendbirdUserId: user_id }`, `createdAt = seconds(created_at)` when present.
29
+ - **Channel:**
30
+ - Distinct with exactly 2 members → **no group**; its messages become user-to-user messages.
31
+ - Otherwise: `guid = toCometChatId(channel_url)`, `name = name || "Group"`, `icon = cover_url`, `type = is_public ? "public" : "private"`, `owner` = the creator's `uid` (else the first operator), `metadata = { sendbirdChannelUrl: channel_url, customType: custom_type, data }`, `tags = custom_type ? [custom_type] : []`.
32
+ - **Member:** the key is `${guid}_member_${uid}`. Operators get `scope: "admin"`, everyone else `"participant"`. Banned members get `isBanned: true`.
33
+ - **Message:**
34
+ - `muid = String(message_id)`, `sender = toCometChatId(user.user_id)`, `receiverType` + `receiver` (the other member's uid for a 1:1 channel, else the guid), `sentAt = Math.floor(created_at / 1000)`.
35
+ - `MESG` → `category:"message"`, `type:"text"`, `data.text = message`.
36
+ - `FILE` → `type` from the MIME prefix (`image/` → `image`, `video/` → `video`, `audio/` → `audio`, else `file`), `data.attachments = [{ url, name, mimeType, extension, size }]`. **CometChat stores the attachment URL by REFERENCE — it does not copy or re-host the file** (verified against the Data Import API). So the file survives only while the source URL does: re-host every attachment to your own / CometChat media storage **before decommissioning Sendbird**, or images and files break. List re-hosting as an action item.
37
+ - `ADMM` (admin messages, e.g. "X joined"): import as a `category:"message", type:"text"` message from a system/admin UID so the history reads the same (don't silently drop it); if the app rendered them specially, note it as a behavior change. Count them in the summary.
38
+ - `custom_type` / `data` / `sorted_metaarray` → `data.metadata`.
39
+ - Mentions → rewrite each mention in the text to `<@uid:UID>` and fill `mentionedUserDetails`.
40
+ - **Filter out messages CometChat will reject BEFORE sending — each one, left in a batch, aborts the whole request with HTTP 500 (`ERR_EXCEPTION`) after the good rows have already imported:**
41
+ - **Older than retention (~6 months):** CometChat retains messages about **6 months** by default and the Data Import API rejects any message whose `sentAt` predates that window (`"Messages older than 6 months cannot be imported"`). This is a **destination limit** — it is the SAME for every source (Sendbird / Stream / Twilio) because it is enforced on the CometChat side, not the vendor's. Compute `cutoff = now − 6 months`, DROP older messages, count them, and add the action item: *"N messages predate CometChat's 6-month retention window and were not migrated — purchase Extended Storage (contact CometChat sales), then re-run to include them."* (`/fundamentals/data-import-and-migration`; retention: CometChat Help Center → Data Retention.)
42
+ - **Empty text:** a `type:"text"` message whose `data.text` is empty/whitespace is rejected (`ERR_EMPTY_MESSAGE_TEXT`) — skip it. This also catches body-less `ADMM`/system lines.
43
+ - **Seconds, not milliseconds:** every CometChat timestamp here is a 10-digit UNIX time.
44
+ - **Not carried by the import API:** thread parent links, reactions, poll votes, pins, per-user read state beyond `readAt`/`deliveredAt`. Replies import as ordinary messages. Say so in the report.
45
+
46
+ ## 3. Import into CometChat (Data Import API)
47
+ Base `https://${COMETCHAT_APP_ID}.api-${COMETCHAT_REGION}.cometchat.io/v3/data_import`, with headers `apikey: ${COMETCHAT_REST_API_KEY}` and `content-type: application/json`. Fetch each page for the full payload before writing that call:
48
+ - `/rest-api/data-import-apis/users/import-users`
49
+ - `/rest-api/data-import-apis/groups/import-groups`
50
+ - `/rest-api/data-import-apis/groups/import-group-members`
51
+ - `/rest-api/data-import-apis/messages/import-messages`
52
+
53
+ | Order | Endpoint | Body shape |
54
+ |---|---|---|
55
+ | 1 | `POST /data_import/users` | `{ "users": { "<uid>": { uid, name, avatar?, metadata?, createdAt? } } }` |
56
+ | 2 | `POST /data_import/groups` | `{ "groups": { "<guid>": { guid, name, type, owner, icon?, metadata?, tags?, createdAt? } } }` |
57
+ | 3 | `POST /data_import/members` | `{ "members": { "<guid>_member_<uid>": { memberId, guid, uid, scope?, isBanned?, joinedAt? } } }` |
58
+ | 4 | `POST /data_import/messages` | `{ "messages": { "<muid>": { muid, sender, receiverType, receiver, category, type, data, sentAt, deliveredAt?, readAt? } } }` |
59
+
60
+ - **Batching:** at most **50 entities per request** and **60 requests per minute**. Throttle to about one request per second, and retry `ERR_TOO_MANY_REQUESTS` with backoff.
61
+ - **Read PER-ROW results, not the HTTP status.** The response body reports `success` (true/false) per key under `data` — count those, not the status code. A request can even return **HTTP 500 (`ERR_EXCEPTION`) while having imported its rows**, so on any non-2xx do NOT assume nothing landed: re-run (idempotency makes that safe) and rely on the per-row / already-exists signal below.
62
+ - **Treat "already exists" as success, not failure.** On a re-run — or after a 500 that actually landed — rows come back as `ERR_UID_ALREADY_EXISTS` / `ERR_GUID_ALREADY_EXISTS` / `ERR_ALREADY_JOINED` / `ERR_IMPORT_MUID_ALREADY_EXISTS`. These mean the row is present. Log only genuine failures to `import-errors.jsonl` and carry on; never abort the whole run for one bad row.
63
+ - **Idempotency:** re-running with the same uid/guid/muid is safe (overwrite / already-exists).
64
+ - **Order matters:** users → groups → members → messages, oldest messages first.
65
+
66
+ Finish by printing counts: exported, imported, converted (admin→text), skipped (deleted / beyond the 6-month retention window / empty), failed (with a pointer to the error file).
67
+
68
+ ## README.md for the script (emit it)
69
+ 1. Create a **REST API key** (full access) in the CometChat dashboard.
70
+ 2. Export the five env vars.
71
+ 3. Dry run: `node scripts/cometchat-migration/migrate.mjs --dry-run`. This exports and transforms, then prints counts without importing.
72
+ 4. Import: `node scripts/cometchat-migration/migrate.mjs`.
73
+ 5. Spot-check a few conversations in the dashboard, then point production at the new build.
74
+ 6. Delete the export files. They hold user data.