@cometchat/skills 4.4.2 → 5.0.0

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 (490) hide show
  1. package/.claude-plugin/marketplace.json +55 -0
  2. package/.claude-plugin/plugin.json +14 -0
  3. package/CHANGELOG.md +36 -0
  4. package/LICENSE +21 -0
  5. package/README.md +41 -163
  6. package/RULES.md +114 -0
  7. package/bin/cometchat-skills.mjs +1180 -0
  8. package/bin/legacy-skills.json +95 -0
  9. package/catalogs/android-v6.json +1646 -0
  10. package/catalogs/flutter-v6.json +651 -0
  11. package/catalogs/ios-v5.json +1383 -0
  12. package/catalogs/rn-calls-v5.json +134 -0
  13. package/catalogs/rn-calls-v5.symbols.txt +58 -0
  14. package/catalogs/rn-sdk-v4.json +672 -0
  15. package/catalogs/rn-v5.json +449 -0
  16. package/catalogs/rn-v5.symbols.txt +216 -0
  17. package/catalogs/sdk-android-v5.json +514 -0
  18. package/contracts.android-calls-v5.json +122 -0
  19. package/contracts.android-v6.json +135 -0
  20. package/contracts.angular-v5.json +694 -0
  21. package/contracts.flutter-calls-v5.json +77 -0
  22. package/contracts.flutter-v6.json +126 -0
  23. package/contracts.ios-calls-v5.json +67 -0
  24. package/contracts.ios-v5.json +436 -0
  25. package/contracts.json +82 -0
  26. package/contracts.rn-calls-v5.json +77 -0
  27. package/contracts.rn-v5.json +727 -0
  28. package/contracts.sdk-android-v5.json +15 -0
  29. package/contracts.web-calls-v5.json +45 -0
  30. package/features.android-calls-v5.json +246 -0
  31. package/features.android-v6.json +65 -0
  32. package/features.angular-v5.json +521 -0
  33. package/features.flutter-calls-v5.json +286 -0
  34. package/features.flutter-v6.json +484 -0
  35. package/features.ios-calls-v5.json +236 -0
  36. package/features.ios-v5.json +573 -0
  37. package/features.json +61 -0
  38. package/features.rn-calls-v5.json +187 -0
  39. package/features.rn-v5.json +614 -0
  40. package/features.sdk-android-v5.json +40 -0
  41. package/features.sdk-jsv4.json +24 -0
  42. package/features.web-calls-v5.json +108 -0
  43. package/package.json +151 -74
  44. package/peers.yaml +312 -0
  45. package/registry/README.md +31 -0
  46. package/registry/android-calls-v5.json +54 -0
  47. package/registry/android-v6.json +137 -0
  48. package/registry/angular-v5.json +114 -0
  49. package/registry/flutter-calls-v5.json +54 -0
  50. package/registry/flutter-v6.json +119 -0
  51. package/registry/ios-calls-v5.json +59 -0
  52. package/registry/ios-v5.json +97 -0
  53. package/registry/rn-calls-v5.json +59 -0
  54. package/registry/rn-v5.json +129 -0
  55. package/registry/sdk-android-v5.json +53 -0
  56. package/registry/sdk-jsv4.json +53 -0
  57. package/registry/web-calls-v5.json +54 -0
  58. package/registry/web-v7.json +99 -0
  59. package/skills/cometchat/SKILL.md +42 -2096
  60. package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
  61. package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
  62. package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
  63. package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
  64. package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
  65. package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
  66. package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
  67. package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
  68. package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
  69. package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
  70. package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
  71. package/skills/cometchat-android-v6-calls/SKILL.md +128 -413
  72. package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
  73. package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
  74. package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
  75. package/skills/cometchat-android-v6-core/SKILL.md +236 -672
  76. package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
  77. package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
  78. package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
  79. package/skills/cometchat-android-v6-core/references/layout.md +112 -0
  80. package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
  81. package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
  82. package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
  83. package/skills/cometchat-android-v6-events/SKILL.md +46 -184
  84. package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
  85. package/skills/cometchat-android-v6-features/SKILL.md +74 -143
  86. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
  87. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
  88. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
  89. package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
  90. package/skills/cometchat-android-v6-production/SKILL.md +40 -179
  91. package/skills/cometchat-android-v6-push/SKILL.md +39 -289
  92. package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
  93. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
  94. package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
  95. package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
  96. package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
  97. package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
  98. package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
  99. package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
  100. package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
  101. package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
  102. package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
  103. package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
  104. package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
  105. package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
  106. package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
  107. package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
  108. package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
  109. package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
  110. package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
  111. package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
  112. package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
  113. package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
  114. package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
  115. package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
  116. package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
  117. package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
  118. package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
  119. package/skills/cometchat-angular-v5-production/SKILL.md +101 -0
  120. package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
  121. package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
  122. package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
  123. package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
  124. package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
  125. package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
  126. package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
  127. package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
  128. package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -389
  129. package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
  130. package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
  131. package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
  132. package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
  133. package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
  134. package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
  135. package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
  136. package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
  137. package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
  138. package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
  139. package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
  140. package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
  141. package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +131 -0
  142. package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
  143. package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
  144. package/skills/cometchat-flutter-v6-production/SKILL.md +58 -615
  145. package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
  146. package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
  147. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
  148. package/skills/cometchat-ios-calls/SKILL.md +112 -563
  149. package/skills/cometchat-ios-components/SKILL.md +44 -834
  150. package/skills/cometchat-ios-core/SKILL.md +181 -1068
  151. package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
  152. package/skills/cometchat-ios-core/references/docs-map.md +123 -0
  153. package/skills/cometchat-ios-core/references/install.md +23 -0
  154. package/skills/cometchat-ios-core/references/layout.md +186 -0
  155. package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
  156. package/skills/cometchat-ios-core/references/swiftui.md +91 -0
  157. package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
  158. package/skills/cometchat-ios-customization/SKILL.md +33 -968
  159. package/skills/cometchat-ios-features/SKILL.md +29 -738
  160. package/skills/cometchat-ios-migration/SKILL.md +39 -0
  161. package/skills/cometchat-ios-placement/SKILL.md +51 -729
  162. package/skills/cometchat-ios-push/SKILL.md +24 -602
  163. package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
  164. package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
  165. package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
  166. package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
  167. package/skills/cometchat-onboarding/SKILL.md +89 -0
  168. package/skills/cometchat-onboarding/references/archetypes.md +51 -0
  169. package/skills/cometchat-onboarding/references/calling-first.md +77 -0
  170. package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
  171. package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
  172. package/skills/cometchat-onboarding/references/platforms.md +90 -0
  173. package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
  174. package/skills/cometchat-react-native-calls/SKILL.md +200 -0
  175. package/skills/cometchat-react-native-components/SKILL.md +142 -0
  176. package/skills/cometchat-react-native-core/SKILL.md +313 -0
  177. package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
  178. package/skills/cometchat-react-native-core/references/component-props.md +105 -0
  179. package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
  180. package/skills/cometchat-react-native-core/references/docs-map.md +126 -0
  181. package/skills/cometchat-react-native-core/references/layout.md +61 -0
  182. package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
  183. package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
  184. package/skills/cometchat-react-native-customization/SKILL.md +198 -0
  185. package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
  186. package/skills/cometchat-react-native-features/SKILL.md +122 -0
  187. package/skills/cometchat-react-native-migration/SKILL.md +103 -0
  188. package/skills/cometchat-react-native-placement/SKILL.md +158 -0
  189. package/skills/cometchat-react-native-production/SKILL.md +78 -0
  190. package/skills/cometchat-react-native-push/SKILL.md +88 -0
  191. package/skills/cometchat-react-native-sdk/SKILL.md +126 -0
  192. package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
  193. package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
  194. package/skills/cometchat-react-native-testing/SKILL.md +94 -0
  195. package/skills/cometchat-react-native-troubleshooting/SKILL.md +116 -0
  196. package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
  197. package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
  198. package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
  199. package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
  200. package/skills/cometchat-react-v7-components/SKILL.md +72 -0
  201. package/skills/cometchat-react-v7-core/SKILL.md +101 -0
  202. package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
  203. package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
  204. package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
  205. package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
  206. package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +22 -0
  207. package/skills/cometchat-react-v7-core/references/layout.md +158 -0
  208. package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
  209. package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
  210. package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
  211. package/skills/cometchat-react-v7-core/references/theming.md +52 -0
  212. package/skills/cometchat-react-v7-core/references/troubleshooting.md +28 -0
  213. package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
  214. package/skills/cometchat-react-v7-features/SKILL.md +92 -0
  215. package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
  216. package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
  217. package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
  218. package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
  219. package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
  220. package/skills/cometchat-react-v7-push/SKILL.md +53 -0
  221. package/test-suite/README.md +70 -0
  222. package/test-suite/catalogs/android-calls-v5.json +830 -0
  223. package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
  224. package/test-suite/catalogs/android-v6.json +1646 -0
  225. package/test-suite/catalogs/android-v6.symbols.txt +298 -0
  226. package/test-suite/catalogs/angular-v5.json +7587 -0
  227. package/test-suite/catalogs/flutter-calls-v5.json +196 -0
  228. package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
  229. package/test-suite/catalogs/flutter-v6.json +651 -0
  230. package/test-suite/catalogs/ios-calls-v5.json +158 -0
  231. package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
  232. package/test-suite/catalogs/ios-v5.json +1383 -0
  233. package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
  234. package/test-suite/catalogs/rn-calls-v5.json +134 -0
  235. package/test-suite/catalogs/rn-sdk-v4.json +672 -0
  236. package/test-suite/catalogs/rn-v5.json +449 -0
  237. package/test-suite/catalogs/sdk-android-v5.json +514 -0
  238. package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
  239. package/test-suite/catalogs/sdk-jsv4.json +800 -0
  240. package/test-suite/catalogs/web-calls-v5.json +195 -0
  241. package/test-suite/catalogs/web-v7.json +1243 -0
  242. package/test-suite/scripts/build-registry.mjs +113 -0
  243. package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
  244. package/test-suite/scripts/catalog-refresh.mjs +100 -0
  245. package/test-suite/scripts/lint-skills.mjs +909 -0
  246. package/test-suite/scripts/measure-tokens.mjs +169 -0
  247. package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
  248. package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
  249. package/test-suite/scripts/typecheck-fences.mjs +206 -0
  250. package/test-suite/scripts/verify-catalog.mjs +242 -0
  251. package/test-suite/scripts/verify-contract-fences.mjs +94 -0
  252. package/test-suite/scripts/verify-detection.mjs +178 -0
  253. package/test-suite/scripts/verify-docs-base.mjs +91 -0
  254. package/test-suite/scripts/verify-family-agnostic.mjs +130 -0
  255. package/test-suite/scripts/verify-golden-path.mjs +138 -0
  256. package/test-suite/scripts/verify-oracle-components.mjs +133 -0
  257. package/test-suite/scripts/verify-template-bindings.mjs +148 -0
  258. package/test-suite/typecheck/angular-v5/package.json +21 -0
  259. package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
  260. package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
  261. package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
  262. package/test-suite/typecheck/web-v7/package.json +18 -0
  263. package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
  264. package/bin/install.js +0 -1003
  265. package/skills/.claude-plugin/marketplace.json +0 -86
  266. package/skills/cometchat/references/asking-questions.md +0 -48
  267. package/skills/cometchat-a11y/SKILL.md +0 -477
  268. package/skills/cometchat-android-v5/SKILL.md +0 -121
  269. package/skills/cometchat-android-v5-calls/SKILL.md +0 -429
  270. package/skills/cometchat-android-v5-calls/references/README.md +0 -53
  271. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
  272. package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
  273. package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
  274. package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
  275. package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
  276. package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
  277. package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
  278. package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
  279. package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
  280. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
  281. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
  282. package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
  283. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
  284. package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
  285. package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
  286. package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
  287. package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
  288. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
  289. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
  290. package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
  291. package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
  292. package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
  293. package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
  294. package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
  295. package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
  296. package/skills/cometchat-android-v5-components/SKILL.md +0 -431
  297. package/skills/cometchat-android-v5-core/SKILL.md +0 -486
  298. package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
  299. package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
  300. package/skills/cometchat-android-v5-features/SKILL.md +0 -131
  301. package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
  302. package/skills/cometchat-android-v5-production/SKILL.md +0 -95
  303. package/skills/cometchat-android-v5-push/SKILL.md +0 -619
  304. package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
  305. package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
  306. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
  307. package/skills/cometchat-android-v6/SKILL.md +0 -108
  308. package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
  309. package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
  310. package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
  311. package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
  312. package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
  313. package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
  314. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
  315. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
  316. package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
  317. package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
  318. package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
  319. package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
  320. package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
  321. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
  322. package/skills/cometchat-angular-calls/SKILL.md +0 -380
  323. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
  324. package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
  325. package/skills/cometchat-angular-calls/references/call-session.md +0 -167
  326. package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
  327. package/skills/cometchat-angular-calls/references/device-management.md +0 -154
  328. package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
  329. package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
  330. package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
  331. package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
  332. package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
  333. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
  334. package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
  335. package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
  336. package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
  337. package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
  338. package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
  339. package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
  340. package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
  341. package/skills/cometchat-angular-components/SKILL.md +0 -235
  342. package/skills/cometchat-angular-core/SKILL.md +0 -386
  343. package/skills/cometchat-angular-customization/SKILL.md +0 -616
  344. package/skills/cometchat-angular-features/SKILL.md +0 -329
  345. package/skills/cometchat-angular-patterns/SKILL.md +0 -256
  346. package/skills/cometchat-angular-placement/SKILL.md +0 -314
  347. package/skills/cometchat-angular-production/SKILL.md +0 -564
  348. package/skills/cometchat-angular-push/SKILL.md +0 -389
  349. package/skills/cometchat-angular-testing/SKILL.md +0 -605
  350. package/skills/cometchat-angular-theming/SKILL.md +0 -290
  351. package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
  352. package/skills/cometchat-astro-patterns/SKILL.md +0 -708
  353. package/skills/cometchat-calls/SKILL.md +0 -364
  354. package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
  355. package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
  356. package/skills/cometchat-calls/references/use-case-support.md +0 -189
  357. package/skills/cometchat-calls/references/use-case-team.md +0 -180
  358. package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
  359. package/skills/cometchat-components/SKILL.md +0 -1142
  360. package/skills/cometchat-core/SKILL.md +0 -1048
  361. package/skills/cometchat-customization/SKILL.md +0 -580
  362. package/skills/cometchat-customization/references/component-catalog.md +0 -236
  363. package/skills/cometchat-features/SKILL.md +0 -861
  364. package/skills/cometchat-flutter-v5/SKILL.md +0 -173
  365. package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -455
  366. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
  367. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
  368. package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
  369. package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
  370. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
  371. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
  372. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
  373. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
  374. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
  375. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
  376. package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
  377. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
  378. package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
  379. package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
  380. package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
  381. package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
  382. package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
  383. package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
  384. package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
  385. package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
  386. package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
  387. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
  388. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
  389. package/skills/cometchat-flutter-v6/SKILL.md +0 -446
  390. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
  391. package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
  392. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
  393. package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
  394. package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
  395. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
  396. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
  397. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
  398. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
  399. package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
  400. package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
  401. package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
  402. package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
  403. package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
  404. package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
  405. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
  406. package/skills/cometchat-i18n/SKILL.md +0 -419
  407. package/skills/cometchat-ios/SKILL.md +0 -325
  408. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -181
  409. package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
  410. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
  411. package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
  412. package/skills/cometchat-ios-calls/references/call-session.md +0 -218
  413. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
  414. package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
  415. package/skills/cometchat-ios-calls/references/device-management.md +0 -171
  416. package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
  417. package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
  418. package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
  419. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
  420. package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
  421. package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
  422. package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
  423. package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
  424. package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
  425. package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
  426. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
  427. package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
  428. package/skills/cometchat-ios-production/SKILL.md +0 -738
  429. package/skills/cometchat-ios-testing/SKILL.md +0 -376
  430. package/skills/cometchat-ios-theming/SKILL.md +0 -667
  431. package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
  432. package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
  433. package/skills/cometchat-native-calls/SKILL.md +0 -671
  434. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
  435. package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
  436. package/skills/cometchat-native-calls/references/call-session.md +0 -182
  437. package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
  438. package/skills/cometchat-native-calls/references/device-management.md +0 -158
  439. package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
  440. package/skills/cometchat-native-calls/references/group-calls.md +0 -296
  441. package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
  442. package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
  443. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
  444. package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
  445. package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
  446. package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
  447. package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
  448. package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
  449. package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
  450. package/skills/cometchat-native-calls/references/share-invite.md +0 -146
  451. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
  452. package/skills/cometchat-native-components/SKILL.md +0 -628
  453. package/skills/cometchat-native-core/SKILL.md +0 -679
  454. package/skills/cometchat-native-customization/SKILL.md +0 -716
  455. package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
  456. package/skills/cometchat-native-features/SKILL.md +0 -638
  457. package/skills/cometchat-native-placement/SKILL.md +0 -509
  458. package/skills/cometchat-native-production/SKILL.md +0 -700
  459. package/skills/cometchat-native-push/SKILL.md +0 -594
  460. package/skills/cometchat-native-testing/SKILL.md +0 -582
  461. package/skills/cometchat-native-theming/SKILL.md +0 -681
  462. package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
  463. package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
  464. package/skills/cometchat-placement/SKILL.md +0 -1360
  465. package/skills/cometchat-production/SKILL.md +0 -1027
  466. package/skills/cometchat-react-calls/SKILL.md +0 -752
  467. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
  468. package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
  469. package/skills/cometchat-react-calls/references/call-session.md +0 -235
  470. package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
  471. package/skills/cometchat-react-calls/references/device-management.md +0 -210
  472. package/skills/cometchat-react-calls/references/group-calls.md +0 -257
  473. package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
  474. package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
  475. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
  476. package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
  477. package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
  478. package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
  479. package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
  480. package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
  481. package/skills/cometchat-react-calls/references/share-invite.md +0 -175
  482. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
  483. package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
  484. package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
  485. package/skills/cometchat-react-patterns/SKILL.md +0 -628
  486. package/skills/cometchat-react-push/SKILL.md +0 -634
  487. package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
  488. package/skills/cometchat-react-testing/SKILL.md +0 -413
  489. package/skills/cometchat-theming/SKILL.md +0 -498
  490. package/skills/cometchat-troubleshooting/SKILL.md +0 -294
@@ -0,0 +1,436 @@
1
+ {
2
+ "generatedFrom": "Minimum-completeness oracle for the iOS UI Kit v5 family. Capabilities are NOT ported from contracts.json (web-react v7) — each was checked against the shipped CometChatUIKitSwift 5.1.19 public .swiftinterface, and the surface/layout ones were verified EMPIRICALLY by the native harness on a simulator (test-suite/harness/ios, Fixtures/good-core-surface vs the three broken fixtures). Where a React capability has no iOS equivalent it is recorded in `notTransferred` with the reason, rather than silently dropped.",
3
+ "family": "ios-uikit",
4
+ "major": "v5",
5
+ "catalog": "ios-v5",
6
+ "notTransferred": [
7
+ {
8
+ "webCapability": "error-boundary-wrap",
9
+ "reason": "No CometChatErrorBoundary equivalent ships in the iOS kit (0 matches for 'errorboundary' in the 5.1.19 interface). The nearest real affordances are per-component: errorStateView / errorStateTitleText / errorStateSubTitleText on CometChatListBase, and set(onError:) on the list components. Covered by `error-state-handled` below."
10
+ },
11
+ {
12
+ "webCapability": "in-chat-message-search-default",
13
+ "reason": "CometChatMessageHeader has NO search affordance on iOS — its only menu API is set(options:) ([CometChatPopupMenu.MenuItem]). React's header search icon has no counterpart, so an in-chat scoped search is NOT part of the iOS default surface. Global search stays (Conversations.onSearchClick -> CometChatSearch)."
14
+ },
15
+ {
16
+ "webCapability": "prepared-ancestor-chain / pinned-viewport-height / column-min-height-0 / no-load-transition-reflow",
17
+ "reason": "These are CSS-cascade concerns with no native analogue. The equivalent iOS obligations are `safe-area-pinned`, `keyboard-avoiding-composer` and `explicit-vertical-division` below — all three empirically verified by the harness rather than reasoned by analogy."
18
+ },
19
+ {
20
+ "webCapability": "responsive-one-pane-on-mobile",
21
+ "reason": "iOS is one-pane by construction: the default UX is a UINavigationController push, not side-by-side panes. There is nothing to collapse. (An iPad split-view variant is a placement concern, not a core-surface floor.)"
22
+ },
23
+ {
24
+ "webCapability": "active-item-reflected",
25
+ "reason": "React needs activeConversation because the list stays on screen beside the message pane. In a push-navigation stack the list is covered, so there is no active row to reflect. No activeConversation/selected-row API exists on CometChatConversations. Revisit if an iPad split-view placement lands."
26
+ }
27
+ ],
28
+ "contracts": [
29
+ {
30
+ "for": "core-chat-surface",
31
+ "kind": "feature",
32
+ "min_capabilities": [
33
+ "init-login-gate",
34
+ "conversations-list",
35
+ "message-pane-header-list-composer",
36
+ "single-target-user-or-group",
37
+ "controller-wired",
38
+ "navigation-push-to-messages",
39
+ "safe-area-pinned",
40
+ "keyboard-avoiding-composer",
41
+ "explicit-vertical-division",
42
+ "no-duplicate-navigation-bar",
43
+ "affordances-wired-or-hidden",
44
+ "error-state-handled",
45
+ "prod-auth-token-guidance",
46
+ "no-double-keyboard-pin"
47
+ ],
48
+ "docs_topic": "/ui-kit/ios/ios-conversation",
49
+ "notes": "APP-LEVEL floor for an unscoped 'add chat'. HOST-COMPOSED — v5 ships no composite component (IOS-DOCS-001), so the developer owns the chat screen and the navigation. Capability meanings, all verified on device by the harness: `single-target-user-or-group` — pass exactly ONE of user/group to header, list and composer, taken from conversation.conversationWith; never both. `controller-wired` — call set(controller:) on all three; this is an iOS-specific obligation with NO React analogue, and omitting it leaves the kit's built-in affordances rendering but silently inert when tapped, which no compile gate catches. `navigation-push-to-messages` — wire set(onItemClick:) to push the chat screen; an unwired list is the iOS form of a dead-end affordance. `safe-area-pinned` — header to view.safeAreaLayoutGuide.topAnchor so nothing sits under the notch. `keyboard-avoiding-composer` — pin the composer to view.keyboardLayoutGuide.topAnchor (iOS 15+; the kit's floor is 15.1), NOT to safeAreaLayoutGuide.bottomAnchor as the published recipe shows — the doc's version is covered by the keyboard the moment the user types. This is a HARDENING DELTA on top of the guide, and the gap is logged for the docs. `explicit-vertical-division` — header fixed height, composer at the bottom, list filling between, so the list scrolls internally instead of growing its parent. `no-duplicate-navigation-bar` — the kit header carries its own title and back control, so hide the host navigation bar in viewDidLoad and restore it in viewWillDisappear, or the screen shows two headers."
50
+ },
51
+ {
52
+ "for": "chat-experience",
53
+ "kind": "feature",
54
+ "min_capabilities": [
55
+ "selector-conversations",
56
+ "selector-users-groups-tabs",
57
+ "message-pane-header-list-composer",
58
+ "single-target-user-or-group",
59
+ "controller-wired",
60
+ "navigation-push-to-messages",
61
+ "screen-dismiss-round-trip",
62
+ "safe-area-pinned",
63
+ "keyboard-avoiding-composer",
64
+ "explicit-vertical-division",
65
+ "no-dead-end-affordances",
66
+ "error-state-handled"
67
+ ],
68
+ "docs_topic": "/ui-kit/ios/ios-tab-based-chat",
69
+ "notes": "The grown app: users/groups tabs, group details, call logs. The tab host is a UITabBarController the developer owns. `screen-dismiss-round-trip` — a PUSHED screen gets its back control from UINavigationController for free, but anything PRESENTED modally (search, details, a picker) owns its own dismissal; an opened modal with no way out is the iOS form of the AUDIT-017 defect."
70
+ },
71
+ {
72
+ "for": "threaded-replies",
73
+ "kind": "feature",
74
+ "min_capabilities": [
75
+ "thread-header-with-parent-message",
76
+ "thread-list-and-composer-scoped",
77
+ "single-target-user-or-group",
78
+ "controller-wired",
79
+ "screen-dismiss-round-trip"
80
+ ],
81
+ "docs_topic": "/ui-kit/ios/guide-threaded-messages",
82
+ "notes": "THREE components, TWO different parent APIs — a real trap, verified against 5.1.19: CometChatThreadedMessageHeader takes set(parentMessage: BaseMessage), while CometChatMessageList and CometChatCompactMessageComposer take set(parentMessageId: Int). The thread list and composer ALSO need the conversation target (user or group) alongside the parent id — the iOS counterpart of AUDIT-060, where passing the parent alone makes replies silently never send."
83
+ },
84
+ {
85
+ "for": "message-search",
86
+ "kind": "feature",
87
+ "min_capabilities": [
88
+ "global-search-entry-wired",
89
+ "search-scope-set",
90
+ "search-result-click-wired",
91
+ "screen-dismiss-round-trip"
92
+ ],
93
+ "docs_topic": "/ui-kit/ios/search",
94
+ "notes": "GLOBAL search only on iOS (see notTransferred: the message header has no search affordance). Entry is CometChatConversations.onSearchClick — an assignable property, not a setter. Scope with set(searchIn: [SearchScope]) and offer chips with set(searchFilters:initialFilter:); there is no request builder. Results dead-end unless onConversationClicked / onMessageClicked are assigned."
95
+ },
96
+ {
97
+ "for": "voice-video-calls",
98
+ "kind": "feature",
99
+ "min_capabilities": [
100
+ "calls-sdk-linked",
101
+ "call-buttons-or-programmatic-initiate",
102
+ "incoming-call-handling",
103
+ "call-screen-dismiss-round-trip",
104
+ "call-logs"
105
+ ],
106
+ "docs_topic": "/ui-kit/ios/calling-integration",
107
+ "notes": "`calls-sdk-linked` is NOT optional on 5.1.19: the shipped kit interface itself does `import CometChatCallsSDK`, so the Calls SDK must be linked for ANY integration to build — including a chat-only one. That is a departure from the web pack, where the calls SDK is an add-on for the calls feature alone, and it belongs in core's install step rather than being deferred to the calls skill. Harness-pinned trio: kit 5.1.19 / CometChatSDK 4.1.7 / CometChatCallsSDK 5.0.3 — the kit is a prebuilt binary compiled against ONE SDK version and SPM does not resolve that transitively, so the versions are exact, not floors."
108
+ },
109
+ {
110
+ "for": "CometChatConversations",
111
+ "kind": "component",
112
+ "min_capabilities": [
113
+ "conversation-list",
114
+ "last-message-preview",
115
+ "unread-count",
116
+ "presence",
117
+ "receipts",
118
+ "realtime-updates",
119
+ "item-click-wired"
120
+ ],
121
+ "docs_topic": "/ui-kit/ios/conversations"
122
+ },
123
+ {
124
+ "for": "CometChatMessageList",
125
+ "kind": "component",
126
+ "min_capabilities": [
127
+ "render-messages",
128
+ "message-bubbles-by-type",
129
+ "delivery-read-receipts",
130
+ "reactions-when-enabled",
131
+ "thread-open",
132
+ "realtime-updates"
133
+ ],
134
+ "docs_topic": "/ui-kit/ios/message-list"
135
+ },
136
+ {
137
+ "for": "CometChatCompactMessageComposer",
138
+ "kind": "component",
139
+ "min_capabilities": [
140
+ "send-text",
141
+ "attach-media-file",
142
+ "voice-recording"
143
+ ],
144
+ "docs_topic": "/ui-kit/ios/compact-message-composer"
145
+ },
146
+ {
147
+ "for": "CometChatGroupMembers",
148
+ "kind": "component",
149
+ "min_capabilities": [
150
+ "view-members",
151
+ "kick-member",
152
+ "ban-member",
153
+ "change-scope",
154
+ "search-members"
155
+ ],
156
+ "docs_topic": "/ui-kit/ios/group-members",
157
+ "notes": "Adding members is NOT a component — the kit ships none (CometChatAddMembers does not exist). It is the documented SDK fallback: build a picker from CometChatUsers with selectionMode, then CometChat.addMembersToGroup(guid:groupMembers:bannedUIDs:onSuccess:onError:). UI Kit first, SDK where the kit has nothing."
158
+ }
159
+ ],
160
+ "_detectors": "G4 checks a capability by looking for EVIDENCE of it in the emitted Swift. A regex is evidence of presence, not proof of correctness — it can confirm the emit pins to keyboardLayoutGuide, not that the result looks right; that is G6's job. Capabilities that cannot honestly be evidenced by an emit carry kind:'unchecked' with a reason, and contract-check.mjs REPORTS them rather than counting them as met. A gate that silently scores an undetectable capability green is the phantom-green this pack exists to prevent.",
161
+ "capabilityDetectors": {
162
+ "conversations-list": {
163
+ "kind": "regex",
164
+ "any": [
165
+ "CometChatConversations\\s*\\("
166
+ ],
167
+ "why": "the list component is instantiated"
168
+ },
169
+ "message-pane-header-list-composer": {
170
+ "kind": "regex",
171
+ "all": [
172
+ "CometChatMessageHeader\\s*\\(",
173
+ "CometChatMessageList\\s*\\(",
174
+ "CometChat(?:Compact)?MessageComposer\\s*\\("
175
+ ],
176
+ "why": "all three message components are composed (either composer satisfies this — the skill teaches the compact one, but composition is what this gate checks)"
177
+ },
178
+ "single-target-user-or-group": {
179
+ "kind": "regex",
180
+ "all": [
181
+ "as\\?\\s*User",
182
+ "as\\?\\s*Group"
183
+ ],
184
+ "why": "conversationWith is narrowed to exactly one of User/Group"
185
+ },
186
+ "controller-wired": {
187
+ "kind": "regex",
188
+ "minCount": {
189
+ "set\\(controller:": 3
190
+ },
191
+ "why": "set(controller:) on header, list and composer — the docs' recipe calls it on all three"
192
+ },
193
+ "navigation-push-to-messages": {
194
+ "kind": "regex",
195
+ "any": [
196
+ "pushViewController"
197
+ ],
198
+ "why": "selection actually navigates somewhere"
199
+ },
200
+ "safe-area-pinned": {
201
+ "kind": "regex",
202
+ "any": [
203
+ "safeAreaLayoutGuide"
204
+ ],
205
+ "why": "the surface is pinned to the safe area"
206
+ },
207
+ "keyboard-avoiding-composer": {
208
+ "kind": "regex",
209
+ "all": [
210
+ "composerView\\.bottomAnchor|composer\\.bottomAnchor"
211
+ ],
212
+ "why": "the composer pins to safeAreaLayoutGuide.bottomAnchor and lets the kit handle the keyboard. This detector previously REQUIRED keyboardLayoutGuide, so G4 actively enforced a defect: an emit that followed the published recipe FAILED the contract, and the double-pinned version that destroys the screen PASSED it."
213
+ },
214
+ "explicit-vertical-division": {
215
+ "kind": "regex",
216
+ "all": [
217
+ "heightAnchor\\.constraint",
218
+ "bottomAnchor"
219
+ ],
220
+ "why": "header height fixed and the list bounded, so it scrolls internally"
221
+ },
222
+ "no-duplicate-navigation-bar": {
223
+ "kind": "regex",
224
+ "any": [
225
+ "setNavigationBarHidden"
226
+ ],
227
+ "why": "the host nav bar is hidden so the kit header is not a second one"
228
+ },
229
+ "error-state-handled": {
230
+ "kind": "regex",
231
+ "any": [
232
+ "set\\(onError:",
233
+ "errorStateView",
234
+ "set\\(errorView:"
235
+ ],
236
+ "why": "failures surface somewhere instead of looking like an empty list"
237
+ },
238
+ "screen-dismiss-round-trip": {
239
+ "kind": "regex",
240
+ "any": [
241
+ "dismiss\\(",
242
+ "popViewController",
243
+ "setNavigationBarHidden\\(false"
244
+ ],
245
+ "why": "anything opened can be closed"
246
+ },
247
+ "selector-conversations": {
248
+ "kind": "regex",
249
+ "any": [
250
+ "CometChatConversations\\s*\\("
251
+ ]
252
+ },
253
+ "selector-users-groups-tabs": {
254
+ "kind": "regex",
255
+ "all": [
256
+ "CometChatUsers\\s*\\(",
257
+ "CometChatGroups\\s*\\("
258
+ ]
259
+ },
260
+ "thread-header-with-parent-message": {
261
+ "kind": "regex",
262
+ "all": [
263
+ "CometChatThreadedMessageHeader",
264
+ "set\\(parentMessage:"
265
+ ],
266
+ "why": "the thread header takes the message object, unlike the list/composer"
267
+ },
268
+ "thread-list-and-composer-scoped": {
269
+ "kind": "regex",
270
+ "all": [
271
+ "set\\(parentMessageId:",
272
+ "set\\((user|group):"
273
+ ],
274
+ "why": "parent id AND the conversation target, or replies never send"
275
+ },
276
+ "global-search-entry-wired": {
277
+ "kind": "regex",
278
+ "any": [
279
+ "onSearchClick"
280
+ ]
281
+ },
282
+ "search-scope-set": {
283
+ "kind": "regex",
284
+ "any": [
285
+ "set\\(searchIn:",
286
+ "set\\(searchFilters:"
287
+ ]
288
+ },
289
+ "search-result-click-wired": {
290
+ "kind": "regex",
291
+ "any": [
292
+ "onConversationClicked",
293
+ "onMessageClicked"
294
+ ]
295
+ },
296
+ "calls-sdk-linked": {
297
+ "kind": "regex",
298
+ "any": [
299
+ "CometChatCallsSDK"
300
+ ]
301
+ },
302
+ "call-buttons-or-programmatic-initiate": {
303
+ "kind": "regex",
304
+ "any": [
305
+ "CometChatCallButtons",
306
+ "onVoiceCallClick",
307
+ "onVideoCallClick"
308
+ ]
309
+ },
310
+ "incoming-call-handling": {
311
+ "kind": "regex",
312
+ "any": [
313
+ "CometChatIncomingCall",
314
+ "CometChatCallEventListener"
315
+ ]
316
+ },
317
+ "call-screen-dismiss-round-trip": {
318
+ "kind": "regex",
319
+ "any": [
320
+ "set\\(onCancelClick:",
321
+ "dismiss\\("
322
+ ]
323
+ },
324
+ "call-logs": {
325
+ "kind": "regex",
326
+ "any": [
327
+ "CometChatCallLogs"
328
+ ]
329
+ },
330
+ "item-click-wired": {
331
+ "kind": "regex",
332
+ "any": [
333
+ "set\\(onItemClick:"
334
+ ]
335
+ },
336
+ "init-login-gate": {
337
+ "kind": "unchecked",
338
+ "why": "the review harness performs init+login before mounting the emit, so an emit CANNOT evidence it. Enforced instead by the harness refusing to mount until login resolves."
339
+ },
340
+ "prod-auth-token-guidance": {
341
+ "kind": "unchecked",
342
+ "why": "prose guidance in the skill, not code in the emit. Covered by the skill checklist, not by G4."
343
+ },
344
+ "affordances-wired-or-hidden": {
345
+ "kind": "unchecked",
346
+ "why": "already enforced by G3 via golden.defaultOnAffordances — re-checking here would double-count, not double-check."
347
+ },
348
+ "no-dead-end-affordances": {
349
+ "kind": "unchecked",
350
+ "why": "same as above — G3 owns this."
351
+ },
352
+ "last-message-preview": {
353
+ "kind": "unchecked",
354
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
355
+ },
356
+ "unread-count": {
357
+ "kind": "unchecked",
358
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
359
+ },
360
+ "presence": {
361
+ "kind": "unchecked",
362
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
363
+ },
364
+ "receipts": {
365
+ "kind": "unchecked",
366
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
367
+ },
368
+ "realtime-updates": {
369
+ "kind": "unchecked",
370
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
371
+ },
372
+ "send-text": {
373
+ "kind": "unchecked",
374
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
375
+ },
376
+ "attach-media-file": {
377
+ "kind": "unchecked",
378
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
379
+ },
380
+ "voice-recording": {
381
+ "kind": "unchecked",
382
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
383
+ },
384
+ "render-messages": {
385
+ "kind": "unchecked",
386
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
387
+ },
388
+ "message-bubbles-by-type": {
389
+ "kind": "unchecked",
390
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
391
+ },
392
+ "delivery-read-receipts": {
393
+ "kind": "unchecked",
394
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
395
+ },
396
+ "reactions-when-enabled": {
397
+ "kind": "unchecked",
398
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
399
+ },
400
+ "thread-open": {
401
+ "kind": "unchecked",
402
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
403
+ },
404
+ "conversation-list": {
405
+ "kind": "unchecked",
406
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
407
+ },
408
+ "view-members": {
409
+ "kind": "unchecked",
410
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
411
+ },
412
+ "kick-member": {
413
+ "kind": "unchecked",
414
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
415
+ },
416
+ "ban-member": {
417
+ "kind": "unchecked",
418
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
419
+ },
420
+ "change-scope": {
421
+ "kind": "unchecked",
422
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
423
+ },
424
+ "search-members": {
425
+ "kind": "unchecked",
426
+ "why": "a behaviour the KIT renders once the component is mounted with a target — no emit code evidences it, so a regex would only prove the component exists (already G0/G1) while implying more was checked. Runtime-only: G6 sees it or it does not."
427
+ },
428
+ "no-double-keyboard-pin": {
429
+ "kind": "regex",
430
+ "none": [
431
+ "keyboardLayoutGuide"
432
+ ],
433
+ "why": "keyboardLayoutGuide must NOT appear: CometChatCompactMessageComposer does its own keyboard adjustment, so pinning to it double-applies the offset and collapses the message list to height 0 (measured, iPhone 16 / iOS 18.2)."
434
+ }
435
+ }
436
+ }
package/contracts.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "generatedFrom": "cometchat.com/docs — ui-kit/react component pages (conversations, group-members) verified 2026-07-29; message-composer/message-list minimums from features.json + component docs (entries noting VERIFY need the exact toggle confirmed).",
3
+ "family": "web-react",
4
+ "major": "v7",
5
+ "capabilityDetectors": {
6
+ "global-conversation-search": {
7
+ "kind": "regex",
8
+ "why": "global search is rendered AND entered from CometChatConversations' OWN search bar affordance (showSearchBar + onSearchBarClicked) — NOT a standalone <CometChatSearch> stacked above the list. Clicking the conversation list's search bar opens the search view (the canonical React v7 placement; parity with Angular searchBarClick / iOS onSearchClick).",
9
+ "all": [
10
+ "CometChatSearch",
11
+ "onSearchBarClicked"
12
+ ]
13
+ }
14
+ },
15
+ "contracts": [
16
+ {
17
+ "for": "core-chat-surface",
18
+ "kind": "feature",
19
+ "min_capabilities": ["error-boundary-wrap", "init-login-gate", "conversations-list", "message-pane-header-list-composer", "threaded-replies-panel-default", "thread-surface-differentiated", "in-chat-message-search-default", "global-conversation-search", "affordances-wired-or-hidden", "active-item-reflected", "panel-close-round-trip", "prepared-ancestor-chain", "pinned-viewport-height", "column-min-height-0", "no-load-transition-reflow", "responsive-one-pane-on-mobile", "prod-auth-token-guidance"],
20
+ "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/overview",
21
+ "notes": "APP-LEVEL floor for an unscoped 'add chat' — the production-ready CORE surface (features.json 'core-chat-surface'; composition in .claude/skills/cometchat-skill-creator/references/FULL-APP-BLUEPRINT.md §7). Capabilities are the whole surface, not per-component features: wrap the app in CometChatErrorBoundary; gate render on init->login; a CometChatConversations LIST <-> a message pane (MessageHeader+MessageList+MessageComposer); THREADED REPLIES ARE INCLUDED BY DEFAULT (threaded-replies-panel-default): wire MessageList onThreadRepliesClick -> a thread panel (CometChatThreadHeader + a thread MessageList + MessageComposer scoped to parentMessageId, with a back/close round-trip) — set hideReplyInThreadOption ONLY if the user explicitly opts out of threads; the thread reads as a DISTINCT surface (thread-surface-differentiated): scope --cometchat-message-list-bg: var(--cometchat-background-color-01) on the thread wrapper so the thread MESSAGE LIST matches its header/composer and differs from the main list's -03 — REQUIRED because the message list paints its OWN opaque bg and does NOT inherit a wrapper background (a wrapper bg alone leaves the thread list undifferentiated; verified vs 7.1.0 CSS, AUDIT-020/024). TWO searches, both default-on: (a) GLOBAL conversation search over the LIST column (Conversations onSearchBarClicked -> CometChatSearch, no uid/guid) or showSearchBar={false}; (b) IN-CHAT scoped message search in the SIDE PANEL (MessageHeader onSearchOptionClicked -> CometChatSearch with the current uid/guid so it searches only that chat, mutually exclusive with the thread, onBack closes, onMessageClicked jumps to the hit) — the sample-app CometChatHome pattern; opt-out via showSearchOption={false}. Wire-or-hide any other default-on affordance so nothing dead-ends; SIZE the surface per the reflow-free-surface standard (skills/cometchat-react-v7-core/references/layout.md) so it is full-size from frame 1 and never reflows — the four sizing capabilities are checkable invariants, not one vague token: prepared-ancestor-chain = html,body,#root{height:100%;margin:0} (prepare a bare app's missing chain AND reset the Vite/CRA/Next scaffold center+cap+pad, AUDIT-019); pinned-viewport-height = the surface box pinned to a content-INDEPENDENT height (full-page 100dvh; embedded a fixed height or a sized grid/flex cell) — NEVER min-height/auto; column-min-height-0 = each column height:100%;min-height:0;overflow:hidden so flex children SCROLL rather than grow the parent (sizing the root alone leaves the kit filling nothing); no-load-transition-reflow = the surface is full-size BEFORE content loads, not grow into it — render the kit's OWN loadingView/emptyView inside the pinned box so the loading->loaded swap causes zero shift (don't gate the whole surface behind a placeholder->chat swap; the kit fills its parent by design, so a content-driven box is the defect, not the kit). Collapse to one pane on mobile (header hideBackButton/onBack); and TELL the user the prod auth-token path (loginWithAuthToken; Auth Key dev-only). Complete and wired but LEAN: NOT a bare/broken two-pane demo, and NOT the whole combined app. Do NOT add selector tabs / a user-or-group details side panel / a scoped search side panel / call logs / incoming call (those are the GROWTHS -> chat-experience) or gated extensions/AI/plugins unless asked — the thread panel IS part of the default. Growing to the whole app raises the floor to the chat-experience contract below; a scoped-down ask (embed/popup/sidebar) opts into the specific placement instead. Per-pane minimums are still fixed by the CometChatConversations/MessageList/MessageComposer contracts below."
22
+ },
23
+ {
24
+ "for": "chat-experience",
25
+ "kind": "feature",
26
+ "min_capabilities": ["error-boundary-wrap", "selector-conversations", "selector-users-groups-calls-tabs", "message-pane-header-list-composer", "side-panel-user-group-details", "side-panel-thread", "side-panel-or-column-search", "incoming-call-handling", "active-item-reflected", "panel-close-round-trip", "prepared-ancestor-chain", "pinned-viewport-height", "column-min-height-0", "no-load-transition-reflow", "responsive-one-pane-on-mobile", "no-dead-end-affordances"],
27
+ "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/overview",
28
+ "notes": "The GROW target — the whole combined single-page app, emitted when the user asks for the full app (NOT the default for a plain 'add chat' — that is core-chat-surface above). Composition in .claude/skills/cometchat-skill-creator/references/FULL-APP-BLUEPRINT.md §4. Capabilities are PANES, not per-component features: the core surface PLUS a selector (Conversations + Users/Groups/CallLogs tabs) <-> a message pane <-> a mutually-exclusive side panel (user/group details OR thread OR scoped search), CometChatIncomingCall at root, global search over the list column, all wrapped in CometChatErrorBoundary, with a mobile collapse to one pane. It is the UNION of the core surface + the growths. Wire every default-on affordance to its destination in the right pane, or hide it — nothing dead-ends. TWO composition invariants make 'nothing dead-ends' concrete (AUDIT-079): active-item-reflected = the selection is REFLECTED in the list — pass activeConversation / activeUser / activeGroup back to CometChatConversations/CometChatUsers/CometChatGroups so the selected row highlights (the kit ships these props; without them there is no active state and the user can't tell what's open); panel-close-round-trip = EVERY side panel the app opens (user/group details via CometChatGroupMembers, thread via CometChatThreadHeader, scoped/global search via CometChatSearch) MUST wire its close — onBack/onClose (the components render a back/close button whose handler is the host's job; a host-composed user-details panel must add its own close). These generalize the search/thread round-trip (AUDIT-017) to the details/members panel and add active-state reflection; both apply to core-chat-surface too. SIZE it per the reflow-free-surface standard (skills/cometchat-react-v7-core/references/layout.md): the same four sizing invariants as core-chat-surface (prepared-ancestor-chain, pinned-viewport-height, column-min-height-0, no-load-transition-reflow) apply to the three-column app — the 3-column CSS in cometchat-react-v7-placement satisfies them; the surface must be full-size from frame 1 and not grow-into-place as content loads. Least-code = drop-ins for HOW. Do NOT turn on gated extensions/AI/plugins (that's a separate opt-in). Per-pane minimums are still fixed by the CometChatConversations/MessageList/MessageComposer/GroupMembers contracts below."
29
+ },
30
+ {
31
+ "for": "CometChatConversations",
32
+ "kind": "component",
33
+ "min_capabilities": ["conversation-list", "last-message-preview", "unread-count", "delete-conversation", "search", "presence", "receipts", "infinite-scroll", "realtime-updates"],
34
+ "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/conversations",
35
+ "notes": "Ships all of these by default; surface (don't hand-build). Toggles: hideUnreadCount / hideUserStatus / hideReceipts (FETCH exact props)."
36
+ },
37
+ {
38
+ "for": "CometChatGroupMembers",
39
+ "kind": "component",
40
+ "min_capabilities": ["view-members", "kick-member", "ban-member", "view-banned-members", "change-scope", "search-members"],
41
+ "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/group-members",
42
+ "notes": "Role-based: destructive actions surface for admin/owner. add-member + banned-members are related flows (ui events member-added / member-banned). A group DETAILS screen must include all of these."
43
+ },
44
+ {
45
+ "for": "CometChatMessageList",
46
+ "kind": "component",
47
+ "min_capabilities": ["render-messages", "message-bubbles-by-type", "delivery-read-receipts", "reactions-when-enabled", "thread-open", "realtime-updates"],
48
+ "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/message-list",
49
+ "notes": "Reactions/threads render when the feature is enabled (features.json). VERIFY exact prop toggles from docs."
50
+ },
51
+ {
52
+ "for": "CometChatMessageComposer",
53
+ "kind": "component",
54
+ "min_capabilities": ["send-text", "attach-media-file", "emoji", "voice-recording"],
55
+ "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/message-composer",
56
+ "notes": "voice-recording built in (hideVoiceRecordingButton default false). AI copilot actions auto-appear here when enabled. VERIFY exact prop names."
57
+ },
58
+ {
59
+ "for": "voice-video-calls",
60
+ "kind": "feature",
61
+ "min_capabilities": ["initiate-call", "incoming-call-ui", "outgoing-call-ui", "call-logs"],
62
+ "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/call-features",
63
+ "notes": "Maps to CometChatCallButtons + CometChatIncomingCall + CometChatOutgoingCall + CometChatCallLogs. Needs @cometchat/calls-sdk-javascript@5 (see features.json)."
64
+ },
65
+ {
66
+ "for": "sdk-chat-surface",
67
+ "kind": "feature",
68
+ "consumption": "sdk",
69
+ "min_capabilities": ["init-before-anything", "init-then-login-ordering", "prod-auth-token-guidance", "send-message", "receive-via-listener", "listener-register-with-id", "listener-remove-on-teardown", "sdk-error-handling", "pagination-via-request-builder", "production-ready-design-system", "sized-shell-no-overflow", "conversations-users-groups-lists", "list-search", "delete-conversation", "message-actions-working", "thread-panel", "user-group-detail-with-actions", "optimistic-ui-mutations", "loading-empty-error-states"],
70
+ "docs_topic": "https://www.cometchat.com/docs/sdk/javascript/overview",
71
+ "notes": "HEADLESS (build-your-own-UI) FLOOR for a Chat SDK skill — the SDK analogue of core-chat-surface, gating any SDK-type skill (there is no SDK skill in THIS react-v7 UI-Kit pack yet; this entry is the production-ready minimum an SDK skill inherits from the factory template, matched to the JS SDK catalog sdk-jsv4 landed in AUDIT-021). Capabilities are SDK behaviours the emitted code MUST include, mapped to the JS SDK (FETCH exact signatures from docs — bake the map, fetch the manual): init-before-anything = init resolves BEFORE any other SDK call — use CometChat.initFromSettings(settings) (persists integrationSource='ai-agent' for telemetry attribution, AUDIT-084), NOT the classic CometChat.init(appId, appSettings). init-then-login-ordering = CometChat.login(uid, authToken|authKey) runs AFTER init and BEFORE send/fetch/listeners. prod-auth-token-guidance = loginWithAuthToken / server-side token exchange; Auth Key dev-only. send-message = build a CometChat.TextMessage and CometChat.sendMessage(...), awaited. receive-via-listener = a registered listener DELIVERS incoming messages (onTextMessageReceived/onMediaMessageReceived), not polling. listener-register-with-id = CometChat.addMessageListener(UNIQUE_ID, new CometChat.MessageListener({...})). listener-remove-on-teardown = CometChat.removeMessageListener(UNIQUE_ID) on teardown — register AND remove; a leaked listener FAILS this contract. sdk-error-handling = every awaited SDK call handles the CometChatException path. pagination-via-request-builder = new CometChat.MessagesRequestBuilder().setLimit(n).build() + fetchNext(), not one unbounded call. Least-code = use the SDK's own builders/listeners (HOW), never drop the teardown or error path (WHAT). BECAUSE THE SDK HAS NO UI, the emitted app must ALSO be production-ready UI, deterministically (spec: the SDK skill's references/app-surface.md; AUDIT-024): production-ready-design-system = REUSE the app's existing design system (Tailwind/MUI/Chakra/shadcn/CSS-var theme/tokens) or, if fresh, ESTABLISH a small token-based one (theme.css palette/spacing/radii + reusable primitives) — NEVER ad-hoc inline styles / one-off hex. sized-shell-no-overflow = 100dvh 3-region shell, message list scrolls internally, min-width:0 (no page horizontal scrollbar), scaffold boilerplate reset. conversations-users-groups-lists + list-search = all three lists, EACH searchable (setSearchKeyword + client filter). delete-conversation = deleteConversation action per row. message-actions-working = Reply-in-thread/React/Edit/Delete each wired to the SDK AND reflected in the UI (own-message gating for edit/delete). thread-panel = setParentMessageId thread view + composer. user-group-detail-with-actions = user detail (block/unblock) + group detail (add/kick/ban member, change scope, leave), scope-gated. optimistic-ui-mutations = send/edit/delete/react update the UI IMMEDIATELY (temp/sending state) then reconcile with the SDK Promise (confirm on resolve, roll back + surface CometChatException.message on reject) — never wait for the round-trip. loading-empty-error-states = skeleton/empty/error on every surface, never blank or [object Object]. This is the full default for a GENERIC 'build chat with the SDK' prompt; a UI that renders only bare bubbles UNDER-DELIVERS. All symbols named here (User/Group/TextMessage/MessagesRequestBuilder/UsersRequestBuilder/MessageListener/init/login/sendMessage/addMessageListener/removeMessageListener) are in the JS-SDK namespace API surface the AUDIT-021 --members extractor recovers (5→396); regenerate the sdk-jsv4 catalog with build-catalog.mjs --exports-only --members before authoring the SDK skill this contract gates."
72
+ },
73
+ {
74
+ "for": "onboarding-plan",
75
+ "kind": "plan",
76
+ "consumption": "plan",
77
+ "min_capabilities": ["discovery-summary", "intent-capability-map", "numbered-actions", "files-that-change", "packages", "credential-auth-strategy", "modify-or-approve-gate"],
78
+ "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/overview",
79
+ "notes": "JOURNEY FLOOR for the framework-agnostic onboarding front door (cometchat-onboarding, type `onboarding`) — the DISCOVER->UNDERSTAND->PLAN skill the entry router gates on FIRST (peers.yaml gate:). It emits NO CometChat symbols, so it has NO symbol catalog and no per-component contract; its completeness oracle is THIS plan-level contract (kind:plan, consumption:plan) — the analogue of core-chat-surface for a plan instead of a UI. min_capabilities are the SECTIONS the plan artifact MUST contain (skills/cometchat-onboarding/references/plan-artifact.md): discovery-summary = every beat-1 signal, each a value or explicit null (framework/bundler/language/pkg-mgr/auth/styling/state/routing/ssr/existing-cometchat/version_conflict/env). intent-capability-map = the confirmed archetype+modality+scope translated to CometChat capabilities (from the baked archetype map in references/archetypes.md). numbered-actions = the scoped build steps in order. files-that-change = the concrete additive paths (APPEND, never replace). packages = exact package(s) with major pins (the core owns exact coordinates). credential-auth-strategy = dev Auth-Key vs prod server-minted token, CHOSEN from discovery. modify-or-approve-gate = an explicit edit-or-approve invitation; nothing is written before approval. TWO behavioural must-dos accompany the sections (CHECKLIST row 25): every beat-2 intent question carries a repo-inferred recommended default (no blank asks); and the boundary is at PLAN (onboarding does discover+understand+plan, then hands a SCOPED build directive to the framework core, e.g. cometchat-react-v7-core — it must NOT fork the core's detect/credential flow). Least-code is n/a (no emitted code). Platform-agnostic: every family reuses the ONE onboarding skill, so this contract is inherited from templates/contracts.example.json. A non-React framework with no core yet still gets the full plan + an honest 'core not built yet' posture; do NOT hand off to a nonexistent core."
80
+ }
81
+ ]
82
+ }
@@ -0,0 +1,77 @@
1
+ {
2
+ "generatedFrom": "@cometchat/calls-sdk-react-native@5.0.5 (bundled dist/index.d.ts) + /calls/react-native docs (v5, via docs MCP)",
3
+ "family": "rn-calls-v5",
4
+ "major": "v5",
5
+ "capabilityDetectors": {},
6
+ "contracts": [
7
+ {
8
+ "for": "calls-session-surface",
9
+ "kind": "feature",
10
+ "consumption": "sdk",
11
+ "min_capabilities": [
12
+ "init-before-anything",
13
+ "init-result-checked",
14
+ "init-then-login-ordering",
15
+ "prod-auth-token-guidance",
16
+ "generate-token-before-render",
17
+ "render-component-not-joinsession",
18
+ "component-in-flex-sized-view",
19
+ "listener-registered-before-render",
20
+ "listener-unsub-on-teardown",
21
+ "leave-session-on-teardown",
22
+ "single-active-session",
23
+ "no-redundant-call-controls",
24
+ "native-permissions-declared",
25
+ "sdk-error-handling"
26
+ ],
27
+ "docs_topic": "/calls/react-native/join-session",
28
+ "notes": "HEADLESS meet-style FLOOR for the RN Calls SDK v5 skill (cometchat-react-native-v5-sdk). This is the NATIVE FORK of web's calls-session-surface: the wiring concept is identical, the join step is NOT. init-before-anything = init via the ai-agent/telemetry-attributed CometChatCalls.initFromSettings(settings) (persists integrationSource='ai-agent'; RULES \u00a75 / AUDIT-084/175), settings passed INLINE (CometChatSettings shape baked in references/docs-map.md; intentionally undocumented/@nodoc, DOCS-BACKLOG F4/C1). The documented CometChatCalls.init({appId, region}) is FALLBACK ONLY. init-result-checked = BOTH init entry points resolve to a Result object ({success:false,error:{...}} | {success:true,error:null}), NOT a rejecting promise \u2014 a bare `await init(...)` that ignores `.success` silently continues on a validation failure and FAILS this contract. init-then-login-ordering = CometChatCalls.login(uid, authKey) | loginWithAuthToken(token) runs AFTER init and BEFORE generateToken/render/listeners. In v5 the Calls SDK authenticates ITSELF \u2014 do NOT hand generateToken a Chat-SDK auth token (that is the v4 pattern; generateToken's authToken param is optional and unnecessary after login). prod-auth-token-guidance = loginWithAuthToken / server-minted token; Auth Key dev-only. generate-token-before-render = const {token} = await CometChatCalls.generateToken(sessionId) resolves BEFORE the component mounts; render null/a loader until then. render-component-not-joinsession = THE NATIVE FORK: React Native has NO joinSession() and NO DOM container. You join by RENDERING <CometChatCalls.Component callToken={token} sessionSettings={settings} />. An emit that calls joinSession(...) or startSession(...) FAILS \u2014 startSession is the deprecated v4 path and joinSession does not exist on this platform at all. component-in-flex-sized-view = the Component is wrapped in a View with real dimensions (style={{flex:1}} or explicit height); a zero-height parent renders the call invisibly \u2014 the RN analogue of web's sized containerEl. listener-registered-before-render = CometChatCalls.addEventListener(eventName, cb, { signal }) registered BEFORE the component mounts. listener-unsub-on-teardown = every listener is removed on unmount \u2014 either by calling the unsubscribe function addEventListener returns, or via an AbortController whose signal was passed and whose abort() runs in the effect cleanup. A leaked listener FAILS. leave-session-on-teardown = CometChatCalls.leaveSession() on unmount (no session id \u2014 see single-active-session). single-active-session = CometChatCalls is a SINGLETON holding ONE active session: exactly one Component is mounted at a time, and switching sessions means leaveSession() -> await the onSessionLeft event -> generateToken(next) -> re-render. Every action method (leaveSession/muteAudio/setLayout/...) takes NO session id because it always targets the active session. no-redundant-call-controls = the Component ALREADY renders mute / video / switch-camera / leave / layout / recording controls. Do NOT add external buttons around it (AUDIT-170). The action methods are for CUSTOM controls only, and then the built-ins must first be hidden via the sessionSettings hide* flags. native-permissions-declared = iOS NSCameraUsageDescription + NSMicrophoneUsageDescription in Info.plist (+ pod install), Android CAMERA + RECORD_AUDIO + Bluetooth permissions in AndroidManifest.xml. Unlike web there is no getUserMedia prompt to fall back on \u2014 a missing native permission fails the call with no UI signal. sdk-error-handling = generateToken rejects with errorCode/errorDescription (ERROR_SESSION_ID_MISSING / ERROR_AUTH_TOKEN_MISSING / ERROR_SDK_NOT_INITIALIZED) and every await handles it. Least-code = use the SDK's own component + methods (HOW); never drop teardown, permissions, or the error path (WHAT). Meet-style needs ONLY the Calls SDK \u2014 no Chat SDK. Every CometChatCalls.* symbol named here is in the rn-calls-v5 catalog."
29
+ },
30
+ {
31
+ "for": "calls-oneonone-ringing",
32
+ "kind": "feature",
33
+ "consumption": "sdk",
34
+ "min_capabilities": [
35
+ "chat-sdk-init-login",
36
+ "initiate-call-signaling",
37
+ "incoming-call-listener-with-id",
38
+ "accept-or-reject-call",
39
+ "generate-token-from-accepted-session",
40
+ "render-component-after-accept",
41
+ "call-listener-remove-on-teardown",
42
+ "sdk-error-handling",
43
+ "voip-included-by-default"
44
+ ],
45
+ "docs_topic": "/calls/react-native/ringing",
46
+ "notes": "1:1 RINGING FLOOR \u2014 adds the Chat SDK signaling layer on top of calls-session-surface. Ringing = a specific user is called, gets an incoming prompt, accepts or rejects. The Chat SDK (@cometchat/chat-sdk-react-native@4) does the SIGNALING; the Calls SDK carries the MEDIA. Chat-SDK signatures are FETCHED via references/docs-map.md \u00a7 '1:1 RINGING' \u2014 never baked, and never sourced from search('default calling') (that surfaces the stale /sdk/<p>/3.0/ tree with the deprecated startSession flow and no incoming-call UI). chat-sdk-init-login = the Chat SDK is init'd and logged in alongside the Calls SDK login. initiate-call-signaling = CometChat.initiateCall(...) starts the ring. incoming-call-listener-with-id = CometChat.addCallListener(UNIQUE_ID, new CometChat.CallListener({ onIncomingCallReceived, onOutgoingCallAccepted, onOutgoingCallRejected, onIncomingCallCancelled })) \u2014 the id is required so the listener can be removed. accept-or-reject-call = CometChat.acceptCall(sessionId) / CometChat.rejectCall(sessionId, status). generate-token-from-accepted-session = CometChatCalls.generateToken(acceptedCall.getSessionId()) \u2014 the session id comes FROM the accepted call, never invented. render-component-after-accept = the media half then follows calls-session-surface exactly: render <CometChatCalls.Component> once the token resolves (NOT joinSession). call-listener-remove-on-teardown = CometChat.removeCallListener(UNIQUE_ID) on teardown, IN ADDITION TO the Calls-SDK listener teardown the inherited floor requires \u2014 two SDKs, two teardowns, and missing either one FAILS. sdk-error-handling = every awaited call handles the CometChatException path. This contract INHERITS the calls-session-surface floor for the media half (component sizing, listener teardown, leaveSession, permissions, no-redundant-controls). voip-included-by-default = RINGING SHIPS WITH VoIP. Signaling alone rings the callee only while their app is open, so an emit that stops there delivers half a feature and fails the first real device test. Whenever ringing is chosen the emit MUST ALSO produce the background half per the calls-ringing-voip contract \u2014 native VoIP setup (iOS PushKit+CallKit, Android FCM + ConnectionService), typed token registration, and a plain statement of the steps only the user can do (Apple VoIP certificate, Firebase server key, Xcode capabilities). Do NOT offer VoIP as an optional follow-up and do NOT ask whether it is wanted: 'ringing' means the phone rings. Meet-style is exempt \u2014 it has no ringing. Ringing cannot be verified with one client \u2014 it needs TWO logged-in users on separate devices/simulators; a single-client run proves the outgoing half only and must be reported as such. foreground-only-ringing-stated = the emit MUST state, in code comments or the README it writes, that this rings the callee ONLY while their app is in the foreground: onIncomingCallReceived arrives over the Chat SDK websocket, so a backgrounded or killed app receives nothing and the caller's call simply times out (default 45s). Ringing a CLOSED app is a SEPARATE native build \u2014 VoIP push with iOS CallKit/PushKit and Android FCM + ConnectionService/CallKeep, registered via CometChat.registerTokenForPushNotification \u2014 covered by /calls/react-native/voip-calling and out of scope for this contract. Silently shipping foreground-only ringing as if it were complete is the single most common way this feature disappoints in device testing, so the limitation is a REQUIRED capability, not a nicety."
47
+ },
48
+ {
49
+ "for": "calls-ringing-voip",
50
+ "kind": "feature",
51
+ "consumption": "sdk",
52
+ "min_capabilities": [
53
+ "voip-capabilities-and-credentials",
54
+ "native-incoming-call-surface",
55
+ "typed-token-registration-after-login",
56
+ "answer-rejoins-normal-flow",
57
+ "device-verification-stated",
58
+ "platform-correct-token-source"
59
+ ],
60
+ "docs_topic": "/calls/react-native/voip-calling",
61
+ "notes": "BACKGROUND-RINGING FLOOR. voip-capabilities-and-credentials = iOS Push Notifications + Background Modes/Voice over IP + a VoIP .p12 uploaded to Dashboard -> Notifications; Android Firebase + server key. Credentials are dashboard work the emit CANNOT do \u2014 it must say so rather than imply code alone suffices. native-incoming-call-surface = iOS PushKit + CallKit (and reportNewIncomingCall MUST be called on every VoIP push or iOS terminates the app), Android a self-managed ConnectionService with MANAGE_OWN_CALLS + READ_PHONE_STATE + BIND_TELECOM_CONNECTION_SERVICE. typed-token-registration-after-login = use the TYPED CometChatNotifications.registerPushToken(token, PushPlatforms.APNS_REACT_NATIVE_VOIP on iOS | FCM_REACT_NATIVE_ANDROID on Android), NOT the legacy CometChat.registerTokenForPushNotification(token, { voip: true }) that /calls/react-native/voip-calling still shows (DOCS-BACKLOG C16). iOS VoIP is a DISTINCT platform from ordinary iOS push, so an app that both rings and notifies registers two tokens. It runs AFTER login, re-runs on token refresh, and CometChatNotifications.unregisterPushToken() runs on logout \u2014 otherwise the next user on the device inherits the previous user's calls. This also keeps the calls skill consistent with the pack's own cometchat-react-native-push skill, which already uses CometChatNotifications. answer-rejoins-normal-flow = the OS answer action leads to CometChat.acceptCall(sessionId) -> CometChatCalls.generateToken(sessionId) -> render <CometChatCalls.Component>; it does NOT fork into a second call path. device-verification-stated = the emit states this cannot be verified on a simulator or in CI and needs two real devices \u2014 an unqualified 'ringing works' claim FAILS. Recipe: references/ringing-voip.md Part 1. platform-correct-token-source = the two platforms obtain the device token from DIFFERENT places and the emit must not conflate them. iOS: PushKit hands it to the native module, which posts VoIPTokenReceived \u2014 the JS MUST subscribe to that event, or the Swift side emits into nothing and no token is ever registered. Android: the token comes from the messaging library (messaging().getToken() / onTokenRefresh via @react-native-firebase/messaging), NOT from an event. CallKitManager is iOS-ONLY and emits EXACTLY VoIPTokenReceived, CallKitAnswerCall and CallKitEndCall; subscribing to any other name (e.g. an invented FcmTokenReceived) throws at runtime \u2014 'X is not a supported event type for CallKitManager' \u2014 which is a redbox on a real device that no compile or mock gate can catch. Both paths converge on the same registerPushToken call with their own PushPlatforms value."
62
+ },
63
+ {
64
+ "for": "call-background-handling",
65
+ "kind": "feature",
66
+ "consumption": "sdk",
67
+ "min_capabilities": [
68
+ "ios-background-audio-mode",
69
+ "android-foreground-service-permissions",
70
+ "appstate-pip-transitions",
71
+ "connection-events-handled"
72
+ ],
73
+ "docs_topic": "/calls/react-native/background-handling",
74
+ "notes": "ACTIVE-CALL-IN-BACKGROUND FLOOR. ios-background-audio-mode = Background Modes -> Audio, AirPlay and Picture in Picture; the emit states that video PAUSES while backgrounded on iOS and only audio continues. android-foreground-service-permissions = FOREGROUND_SERVICE + _MICROPHONE + _CAMERA + _MEDIA_PLAYBACK + _MEDIA_PROJECTION + WAKE_LOCK + POST_NOTIFICATIONS in AndroidManifest.xml. Without these an Android 10+ call DIES on backgrounding, which is the most common omission because it looks fine in foreground testing. The emit must NOT declare its own call service \u2014 the SDK ships and auto-merges CometChatOngoingCallService, and must NOT add its own wake locks. appstate-pip-transitions = an AppState listener drives enablePictureInPictureLayout on background and disable on foreground, and is removed on teardown. connection-events-handled = onConnectionLost / onConnectionRestored / onConnectionClosed are subscribed (reconnect UI + end-of-call), torn down with the rest. Recipe: references/ringing-voip.md Part 2."
75
+ }
76
+ ]
77
+ }