@cometchat/skills 4.0.0 → 4.2.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 (258) hide show
  1. package/README.md +42 -2
  2. package/bin/install.js +448 -57
  3. package/package.json +1 -1
  4. package/skills/cometchat/SKILL.md +337 -80
  5. package/skills/cometchat-a11y/SKILL.md +476 -0
  6. package/skills/cometchat-android-v5/SKILL.md +1 -1
  7. package/skills/cometchat-android-v5-calls/SKILL.md +413 -0
  8. package/skills/cometchat-android-v5-calls/references/README.md +53 -0
  9. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +195 -0
  10. package/skills/cometchat-android-v5-calls/references/audio-controls.md +91 -0
  11. package/skills/cometchat-android-v5-calls/references/background-handling.md +168 -0
  12. package/skills/cometchat-android-v5-calls/references/call-layouts.md +123 -0
  13. package/skills/cometchat-android-v5-calls/references/call-logs.md +113 -0
  14. package/skills/cometchat-android-v5-calls/references/call-session.md +274 -0
  15. package/skills/cometchat-android-v5-calls/references/custom-ui.md +150 -0
  16. package/skills/cometchat-android-v5-calls/references/event-listeners.md +123 -0
  17. package/skills/cometchat-android-v5-calls/references/group-calls.md +205 -0
  18. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +111 -0
  19. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +134 -0
  20. package/skills/cometchat-android-v5-calls/references/join-session.md +120 -0
  21. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +206 -0
  22. package/skills/cometchat-android-v5-calls/references/participant-management.md +110 -0
  23. package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +106 -0
  24. package/skills/cometchat-android-v5-calls/references/raise-hand.md +242 -0
  25. package/skills/cometchat-android-v5-calls/references/recording.md +101 -0
  26. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +152 -0
  27. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +82 -0
  28. package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +215 -0
  29. package/skills/cometchat-android-v5-calls/references/session-settings.md +121 -0
  30. package/skills/cometchat-android-v5-calls/references/setup.md +137 -0
  31. package/skills/cometchat-android-v5-calls/references/share-invite.md +151 -0
  32. package/skills/cometchat-android-v5-calls/references/video-controls.md +87 -0
  33. package/skills/cometchat-android-v5-calls/references/voip-calling.md +526 -0
  34. package/skills/cometchat-android-v5-components/SKILL.md +1 -1
  35. package/skills/cometchat-android-v5-core/SKILL.md +1 -1
  36. package/skills/cometchat-android-v5-customization/SKILL.md +1 -1
  37. package/skills/cometchat-android-v5-extensions/SKILL.md +1 -1
  38. package/skills/cometchat-android-v5-features/SKILL.md +1 -1
  39. package/skills/cometchat-android-v5-placement/SKILL.md +1 -1
  40. package/skills/cometchat-android-v5-production/SKILL.md +1 -1
  41. package/skills/cometchat-android-v5-push/SKILL.md +1 -1
  42. package/skills/cometchat-android-v5-testing/SKILL.md +1 -1
  43. package/skills/cometchat-android-v5-theming/SKILL.md +1 -1
  44. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +1 -1
  45. package/skills/cometchat-android-v6/SKILL.md +1 -1
  46. package/skills/cometchat-android-v6-builder-settings/SKILL.md +1 -1
  47. package/skills/cometchat-android-v6-calls/SKILL.md +375 -0
  48. package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +97 -0
  49. package/skills/cometchat-android-v6-calls/references/call-layouts.md +91 -0
  50. package/skills/cometchat-android-v6-calls/references/call-session.md +163 -0
  51. package/skills/cometchat-android-v6-calls/references/device-management.md +171 -0
  52. package/skills/cometchat-android-v6-calls/references/group-calls.md +191 -0
  53. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +107 -0
  54. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +136 -0
  55. package/skills/cometchat-android-v6-calls/references/raise-hand.md +186 -0
  56. package/skills/cometchat-android-v6-calls/references/ringing-integration.md +176 -0
  57. package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +127 -0
  58. package/skills/cometchat-android-v6-calls/references/share-invite.md +105 -0
  59. package/skills/cometchat-android-v6-compose-components/SKILL.md +2 -2
  60. package/skills/cometchat-android-v6-compose-customization/SKILL.md +1 -1
  61. package/skills/cometchat-android-v6-compose-placement/SKILL.md +1 -1
  62. package/skills/cometchat-android-v6-compose-theming/SKILL.md +1 -1
  63. package/skills/cometchat-android-v6-core/SKILL.md +1 -1
  64. package/skills/cometchat-android-v6-events/SKILL.md +1 -1
  65. package/skills/cometchat-android-v6-extensions/SKILL.md +1 -1
  66. package/skills/cometchat-android-v6-features/SKILL.md +1 -1
  67. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +1 -1
  68. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +1 -1
  69. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +1 -1
  70. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +1 -1
  71. package/skills/cometchat-android-v6-migration/SKILL.md +398 -0
  72. package/skills/cometchat-android-v6-production/SKILL.md +1 -1
  73. package/skills/cometchat-android-v6-push/SKILL.md +1 -1
  74. package/skills/cometchat-android-v6-testing/SKILL.md +1 -1
  75. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +1 -1
  76. package/skills/cometchat-angular-calls/SKILL.md +511 -0
  77. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +95 -0
  78. package/skills/cometchat-angular-calls/references/call-layouts.md +106 -0
  79. package/skills/cometchat-angular-calls/references/call-session.md +167 -0
  80. package/skills/cometchat-angular-calls/references/custom-ui.md +231 -0
  81. package/skills/cometchat-angular-calls/references/device-management.md +135 -0
  82. package/skills/cometchat-angular-calls/references/group-calls.md +412 -0
  83. package/skills/cometchat-angular-calls/references/idle-timeout.md +145 -0
  84. package/skills/cometchat-angular-calls/references/in-call-chat.md +148 -0
  85. package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +205 -0
  86. package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +53 -0
  87. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +183 -0
  88. package/skills/cometchat-angular-calls/references/picture-in-picture.md +285 -0
  89. package/skills/cometchat-angular-calls/references/raise-hand.md +167 -0
  90. package/skills/cometchat-angular-calls/references/recording-screen-share.md +267 -0
  91. package/skills/cometchat-angular-calls/references/ringing-integration.md +131 -0
  92. package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +100 -0
  93. package/skills/cometchat-angular-calls/references/share-invite.md +116 -0
  94. package/skills/cometchat-angular-components/SKILL.md +1 -1
  95. package/skills/cometchat-angular-core/SKILL.md +1 -1
  96. package/skills/cometchat-angular-customization/SKILL.md +1 -1
  97. package/skills/cometchat-angular-features/SKILL.md +1 -1
  98. package/skills/cometchat-angular-patterns/SKILL.md +1 -1
  99. package/skills/cometchat-angular-placement/SKILL.md +1 -1
  100. package/skills/cometchat-angular-production/SKILL.md +1 -1
  101. package/skills/cometchat-angular-push/SKILL.md +403 -0
  102. package/skills/cometchat-angular-testing/SKILL.md +333 -0
  103. package/skills/cometchat-angular-theming/SKILL.md +1 -1
  104. package/skills/cometchat-angular-troubleshooting/SKILL.md +1 -1
  105. package/skills/cometchat-astro-patterns/SKILL.md +1 -1
  106. package/skills/cometchat-calls/SKILL.md +358 -0
  107. package/skills/cometchat-calls/references/use-case-broadcast.md +194 -0
  108. package/skills/cometchat-calls/references/use-case-marketplace.md +158 -0
  109. package/skills/cometchat-calls/references/use-case-support.md +190 -0
  110. package/skills/cometchat-calls/references/use-case-team.md +169 -0
  111. package/skills/cometchat-calls/references/use-case-telehealth.md +154 -0
  112. package/skills/cometchat-components/SKILL.md +1 -1
  113. package/skills/cometchat-core/SKILL.md +1 -1
  114. package/skills/cometchat-customization/SKILL.md +2 -2
  115. package/skills/cometchat-features/SKILL.md +2 -2
  116. package/skills/cometchat-flutter-v5/SKILL.md +1 -1
  117. package/skills/cometchat-flutter-v5-calls/SKILL.md +325 -94
  118. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +169 -0
  119. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +98 -0
  120. package/skills/cometchat-flutter-v5-calls/references/call-session.md +330 -0
  121. package/skills/cometchat-flutter-v5-calls/references/device-management.md +120 -0
  122. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +187 -0
  123. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +97 -0
  124. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +132 -0
  125. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +160 -0
  126. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +244 -0
  127. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +193 -0
  128. package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +101 -0
  129. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +142 -0
  130. package/skills/cometchat-flutter-v5-conversations/SKILL.md +1 -1
  131. package/skills/cometchat-flutter-v5-core/SKILL.md +1 -1
  132. package/skills/cometchat-flutter-v5-customization/SKILL.md +1 -1
  133. package/skills/cometchat-flutter-v5-events/SKILL.md +1 -1
  134. package/skills/cometchat-flutter-v5-messages/SKILL.md +1 -1
  135. package/skills/cometchat-flutter-v5-production/SKILL.md +1 -1
  136. package/skills/cometchat-flutter-v5-push/SKILL.md +1 -1
  137. package/skills/cometchat-flutter-v5-testing/SKILL.md +390 -0
  138. package/skills/cometchat-flutter-v5-theming/SKILL.md +1 -1
  139. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +1 -1
  140. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +1 -1
  141. package/skills/cometchat-flutter-v6/SKILL.md +1 -1
  142. package/skills/cometchat-flutter-v6-calls/SKILL.md +308 -243
  143. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +134 -0
  144. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +102 -0
  145. package/skills/cometchat-flutter-v6-calls/references/call-session.md +229 -0
  146. package/skills/cometchat-flutter-v6-calls/references/device-management.md +99 -0
  147. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +190 -0
  148. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +80 -0
  149. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +122 -0
  150. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +268 -0
  151. package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +171 -0
  152. package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +93 -0
  153. package/skills/cometchat-flutter-v6-calls/references/share-invite.md +102 -0
  154. package/skills/cometchat-flutter-v6-components/SKILL.md +1 -1
  155. package/skills/cometchat-flutter-v6-conversations/SKILL.md +1 -1
  156. package/skills/cometchat-flutter-v6-core/SKILL.md +1 -1
  157. package/skills/cometchat-flutter-v6-customization/SKILL.md +1 -1
  158. package/skills/cometchat-flutter-v6-events/SKILL.md +1 -1
  159. package/skills/cometchat-flutter-v6-features/SKILL.md +1 -1
  160. package/skills/cometchat-flutter-v6-messages/SKILL.md +1 -1
  161. package/skills/cometchat-flutter-v6-migration/SKILL.md +1 -1
  162. package/skills/cometchat-flutter-v6-placement/SKILL.md +1 -1
  163. package/skills/cometchat-flutter-v6-production/SKILL.md +1 -1
  164. package/skills/cometchat-flutter-v6-push/SKILL.md +452 -0
  165. package/skills/cometchat-flutter-v6-testing/SKILL.md +319 -0
  166. package/skills/cometchat-flutter-v6-theming/SKILL.md +1 -1
  167. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +1 -1
  168. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +1 -1
  169. package/skills/cometchat-i18n/SKILL.md +358 -0
  170. package/skills/cometchat-ios/SKILL.md +5 -5
  171. package/skills/cometchat-ios-calls/SKILL.md +409 -0
  172. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +172 -0
  173. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +189 -0
  174. package/skills/cometchat-ios-calls/references/call-layouts.md +136 -0
  175. package/skills/cometchat-ios-calls/references/call-session.md +221 -0
  176. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +353 -0
  177. package/skills/cometchat-ios-calls/references/custom-ui.md +322 -0
  178. package/skills/cometchat-ios-calls/references/device-management.md +171 -0
  179. package/skills/cometchat-ios-calls/references/group-calls.md +396 -0
  180. package/skills/cometchat-ios-calls/references/idle-timeout.md +185 -0
  181. package/skills/cometchat-ios-calls/references/in-call-chat.md +183 -0
  182. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +138 -0
  183. package/skills/cometchat-ios-calls/references/picture-in-picture.md +246 -0
  184. package/skills/cometchat-ios-calls/references/raise-hand.md +239 -0
  185. package/skills/cometchat-ios-calls/references/recording-screen-share.md +339 -0
  186. package/skills/cometchat-ios-calls/references/ringing-integration.md +142 -0
  187. package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +267 -0
  188. package/skills/cometchat-ios-calls/references/share-invite.md +152 -0
  189. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +246 -0
  190. package/skills/cometchat-ios-calls/references/voip-cert-setup.md +166 -0
  191. package/skills/cometchat-ios-components/SKILL.md +1 -1
  192. package/skills/cometchat-ios-core/SKILL.md +1 -1
  193. package/skills/cometchat-ios-customization/SKILL.md +1 -1
  194. package/skills/cometchat-ios-features/SKILL.md +1 -1
  195. package/skills/cometchat-ios-placement/SKILL.md +1 -1
  196. package/skills/cometchat-ios-production/SKILL.md +1 -1
  197. package/skills/cometchat-ios-push/SKILL.md +1 -1
  198. package/skills/cometchat-ios-testing/SKILL.md +371 -0
  199. package/skills/cometchat-ios-theming/SKILL.md +1 -1
  200. package/skills/cometchat-ios-troubleshooting/SKILL.md +1 -1
  201. package/skills/cometchat-native-bare-patterns/SKILL.md +45 -3
  202. package/skills/cometchat-native-calls/SKILL.md +599 -0
  203. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +203 -0
  204. package/skills/cometchat-native-calls/references/call-layouts.md +124 -0
  205. package/skills/cometchat-native-calls/references/call-session.md +182 -0
  206. package/skills/cometchat-native-calls/references/custom-ui.md +250 -0
  207. package/skills/cometchat-native-calls/references/device-management.md +135 -0
  208. package/skills/cometchat-native-calls/references/expo-vs-bare.md +179 -0
  209. package/skills/cometchat-native-calls/references/group-calls.md +291 -0
  210. package/skills/cometchat-native-calls/references/idle-timeout.md +128 -0
  211. package/skills/cometchat-native-calls/references/in-call-chat.md +143 -0
  212. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +72 -0
  213. package/skills/cometchat-native-calls/references/picture-in-picture.md +276 -0
  214. package/skills/cometchat-native-calls/references/raise-hand.md +203 -0
  215. package/skills/cometchat-native-calls/references/recording-screen-share.md +290 -0
  216. package/skills/cometchat-native-calls/references/ringing-integration.md +118 -0
  217. package/skills/cometchat-native-calls/references/server-push-bridge.md +135 -0
  218. package/skills/cometchat-native-calls/references/server-push-payloads.md +193 -0
  219. package/skills/cometchat-native-calls/references/share-invite.md +144 -0
  220. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +317 -0
  221. package/skills/cometchat-native-components/SKILL.md +1 -1
  222. package/skills/cometchat-native-core/SKILL.md +1 -1
  223. package/skills/cometchat-native-customization/SKILL.md +1 -1
  224. package/skills/cometchat-native-expo-patterns/SKILL.md +18 -1
  225. package/skills/cometchat-native-features/SKILL.md +1 -1
  226. package/skills/cometchat-native-placement/SKILL.md +1 -1
  227. package/skills/cometchat-native-production/SKILL.md +1 -1
  228. package/skills/cometchat-native-push/SKILL.md +1 -1
  229. package/skills/cometchat-native-testing/SKILL.md +1 -1
  230. package/skills/cometchat-native-theming/SKILL.md +1 -1
  231. package/skills/cometchat-native-troubleshooting/SKILL.md +1 -1
  232. package/skills/cometchat-nextjs-patterns/SKILL.md +1 -1
  233. package/skills/cometchat-placement/SKILL.md +29 -1
  234. package/skills/cometchat-production/SKILL.md +1 -1
  235. package/skills/cometchat-react-calls/SKILL.md +539 -0
  236. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +145 -0
  237. package/skills/cometchat-react-calls/references/call-layouts.md +161 -0
  238. package/skills/cometchat-react-calls/references/call-session.md +235 -0
  239. package/skills/cometchat-react-calls/references/custom-ui.md +201 -0
  240. package/skills/cometchat-react-calls/references/device-management.md +206 -0
  241. package/skills/cometchat-react-calls/references/group-calls.md +262 -0
  242. package/skills/cometchat-react-calls/references/idle-timeout.md +175 -0
  243. package/skills/cometchat-react-calls/references/in-call-chat.md +212 -0
  244. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +172 -0
  245. package/skills/cometchat-react-calls/references/picture-in-picture.md +245 -0
  246. package/skills/cometchat-react-calls/references/raise-hand.md +238 -0
  247. package/skills/cometchat-react-calls/references/recording-screen-share.md +143 -0
  248. package/skills/cometchat-react-calls/references/ringing-integration.md +255 -0
  249. package/skills/cometchat-react-calls/references/server-web-push-vapid.md +241 -0
  250. package/skills/cometchat-react-calls/references/share-invite.md +176 -0
  251. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +198 -0
  252. package/skills/cometchat-react-calls/references/voip-and-web-push.md +165 -0
  253. package/skills/cometchat-react-patterns/SKILL.md +56 -8
  254. package/skills/cometchat-react-push/SKILL.md +448 -0
  255. package/skills/cometchat-react-router-patterns/SKILL.md +1 -1
  256. package/skills/cometchat-react-testing/SKILL.md +404 -0
  257. package/skills/cometchat-theming/SKILL.md +3 -3
  258. package/skills/cometchat-troubleshooting/SKILL.md +2 -2
@@ -0,0 +1,166 @@
1
+ # VoIP cert setup — the manual Apple Developer steps
2
+
3
+ The skill cannot automate these. They require browser access to https://developer.apple.com and physical possession of the developer team's signing identity. This reference is the printed instruction sheet the dispatcher hands the user.
4
+
5
+ Print this verbatim during scaffold; pause execution until the user confirms each step.
6
+
7
+ ---
8
+
9
+ ## What you're creating
10
+
11
+ A **VoIP Services certificate** is a separate certificate from your standard APNs (push notifications) certificate. It's specifically for PushKit VoIP delivery — the high-priority, terminated-app-wakeup channel iOS provides for calling apps.
12
+
13
+ Without this certificate, your push server cannot deliver VoIP pushes. The OS won't ring the user's lock screen. CallKit never fires.
14
+
15
+ ---
16
+
17
+ ## Prerequisites
18
+
19
+ - Apple Developer Program membership (paid — free accounts can't create VoIP certs)
20
+ - Admin or App Manager role in the developer team
21
+ - The bundle ID of your app already registered in https://developer.apple.com/account/resources/identifiers/list
22
+ - Mac with Keychain Access (the cert must be generated from a CSR signed by your dev keychain)
23
+
24
+ ---
25
+
26
+ ## Step-by-step
27
+
28
+ ### 1. Generate a Certificate Signing Request
29
+
30
+ On your Mac:
31
+
32
+ 1. Open **Keychain Access** (`/Applications/Utilities/Keychain Access.app`)
33
+ 2. Menu: **Keychain Access → Certificate Assistant → Request a Certificate from a Certificate Authority...**
34
+ 3. Fill in:
35
+ - **User Email Address:** your Apple ID email
36
+ - **Common Name:** something like "YourApp VoIP CSR"
37
+ - **CA Email Address:** leave blank
38
+ - **Request is:** Saved to disk + Let me specify key pair information (check both)
39
+ 4. Click Continue → save the `.certSigningRequest` file (e.g. to Desktop)
40
+ 5. On the key-pair-info screen: 2048 bits, RSA → Continue → save
41
+
42
+ ### 2. Create the cert in Apple Developer portal
43
+
44
+ 1. Open https://developer.apple.com/account/resources/certificates/list
45
+ 2. Click the "+" button to add a new certificate
46
+ 3. Under "Services", select **VoIP Services Certificate** → Continue
47
+ 4. Pick the App ID (bundle ID) of your app from the dropdown → Continue
48
+ 5. Upload the `.certSigningRequest` file you just created → Continue
49
+ 6. Apple generates the cert. Click **Download** → saves a `.cer` file (e.g. `voip_services.cer`)
50
+
51
+ ### 3. Install the cert in Keychain
52
+
53
+ 1. Double-click the `.cer` file → Keychain Access opens with the cert added
54
+ 2. Find it in the "My Certificates" category — should expand to show a private key alongside
55
+
56
+ ### 4. Export as .p12
57
+
58
+ 1. Right-click the cert → **Export "VoIP Services: ..."**
59
+ 2. File Format: **Personal Information Exchange (.p12)**
60
+ 3. Save → enter a passphrase (you'll need this on the push server)
61
+ 4. Output: a `.p12` file (e.g. `voip_services.p12`)
62
+
63
+ ### 5. (Optional) Convert .p12 to .pem for some push libs
64
+
65
+ Some Node.js libraries (e.g. `node-apn` older versions) need `.pem`:
66
+
67
+ ```bash
68
+ openssl pkcs12 -in voip_services.p12 -out voip_cert.pem -nodes -clcerts
69
+ ```
70
+
71
+ The `.pem` contains both cert and key.
72
+
73
+ ### 6. Upload to your push server
74
+
75
+ Where this goes depends on your stack:
76
+
77
+ - **Node.js (`node-apn` v3+):** point at the `.p12` file via `cert: { path, passphrase }`
78
+ - **Server-side using `apn` lib:** load the cert + key
79
+ - **Self-managed APNs:** use the .p12 directly via `curl` to APNs HTTP/2 endpoint
80
+ - **Third-party services (OneSignal, Firebase APNs forwarding):** they have UIs to upload the .p12 + passphrase
81
+
82
+ ---
83
+
84
+ ## Critical detail: the topic
85
+
86
+ When sending a VoIP push, the APNs `topic` header MUST be your bundle ID **with `.voip` suffix**:
87
+
88
+ ```
89
+ apns-topic: com.yourcompany.yourapp.voip
90
+ ```
91
+
92
+ NOT just `com.yourcompany.yourapp` — that's the standard APNs topic for non-VoIP pushes. The two are separate channels.
93
+
94
+ If you set the wrong topic, APNs returns `BadDeviceToken` or `TopicMismatch` and your call doesn't ring.
95
+
96
+ In `node-apn`:
97
+
98
+ ```ts
99
+ const note = new apn.Notification();
100
+ note.topic = `${process.env.IOS_BUNDLE_ID}.voip`;
101
+ note.pushType = "voip";
102
+ ```
103
+
104
+ `pushType: "voip"` is required by APNs HTTP/2 protocol since iOS 13.
105
+
106
+ ---
107
+
108
+ ## Cert expiration
109
+
110
+ VoIP certs expire after **1 year**. Calendar this — Apple will email a warning ~30 days before expiry, but it's easy to miss in inbox noise. When the cert expires:
111
+
112
+ - iOS devices keep working briefly (cached subscriptions)
113
+ - New incoming-call pushes silently fail
114
+ - Users complain "I'm not getting calls anymore"
115
+
116
+ Renew by repeating steps 1-6. The new cert can replace the old in your push server with no client-side change required (devices use the same VoIP push token).
117
+
118
+ ---
119
+
120
+ ## Bypassing the cert: APNs Auth Tokens (.p8)
121
+
122
+ Apple now supports **token-based auth** for APNs (since iOS 10) — a `.p8` key + key ID + team ID instead of a per-app cert. Pros:
123
+
124
+ - Single key works for all your apps (vs one cert per bundle)
125
+ - Doesn't expire (you rotate manually when you want)
126
+ - Easier rotation
127
+
128
+ Cons:
129
+
130
+ - Some older push libraries don't support it
131
+ - Setup process is different
132
+
133
+ To use:
134
+
135
+ 1. Apple Developer portal → Keys → "+" → APNs (Authentication Key)
136
+ 2. Download the `.p8` (one-time download — Apple won't let you download it again)
137
+ 3. Note the Key ID + Team ID
138
+ 4. Configure your push lib with `{ token: { key: ".p8 contents", keyId, teamId } }`
139
+
140
+ The skill prefers token-auth for new push servers; uses cert auth if the project already has one.
141
+
142
+ ---
143
+
144
+ ## When stuck
145
+
146
+ | Error | Fix |
147
+ |---|---|
148
+ | `BadDeviceToken` from APNs | Topic mismatch — `.voip` suffix missing, or production token used with sandbox cert |
149
+ | `TopicDisallowed` | The cert is for a different bundle ID |
150
+ | `Unregistered` | Token expired or app uninstalled — drop from your DB |
151
+ | `BadCertificate` | Cert expired or tampered — re-export or re-generate |
152
+ | `BadCertificateEnvironment` | Production cert + sandbox token, or vice versa |
153
+ | `Forbidden` | Cert revoked or topic doesn't match |
154
+
155
+ ---
156
+
157
+ ## Sandbox vs production
158
+
159
+ Apple has two APNs environments:
160
+
161
+ - **Sandbox** (Xcode debug builds, dev provisioning profile) — uses sandbox APNs (api.sandbox.push.apple.com)
162
+ - **Production** (TestFlight + App Store, distribution profile) — uses production APNs (api.push.apple.com)
163
+
164
+ VoIP cert covers both — the same cert works for sandbox and production tokens. But the SERVER must hit the right endpoint depending on which environment the device token was registered against.
165
+
166
+ The skill writes the push server with environment switching (`production: process.env.NODE_ENV === "production"` for `node-apn`).
@@ -3,7 +3,7 @@ name: cometchat-ios-components
3
3
  description: "Complete catalog of CometChat iOS UI Kit v5 components with correct usage patterns from official documentation."
4
4
  license: "MIT"
5
5
  compatibility: "CometChatUIKitSwift ^5; CometChatSDK ^4; iOS 13+"
6
- allowed-tools: "executeBash, readFile, fileSearch, listDirectory"
6
+ allowed-tools: "shell, file-read, file-search, file-list"
7
7
  metadata:
8
8
  author: "CometChat"
9
9
  version: "3.0.0"
@@ -3,7 +3,7 @@ name: cometchat-ios-core
3
3
  description: "Shared rules for CometChat iOS UI Kit v5. Always loaded alongside placement skills. Read this first."
4
4
  license: "MIT"
5
5
  compatibility: "iOS 13+; Swift 5.0+; CometChatUIKitSwift ^5; CometChatSDK ^4"
6
- allowed-tools: "executeBash, readFile, fileSearch, listDirectory"
6
+ allowed-tools: "shell, file-read, file-search, file-list"
7
7
  metadata:
8
8
  author: "CometChat"
9
9
  version: "3.0.0"
@@ -3,7 +3,7 @@ name: cometchat-ios-customization
3
3
  description: "Customize CometChat iOS UI Kit beyond theming — custom views, message templates, text formatters, and event handling."
4
4
  license: "MIT"
5
5
  compatibility: "CometChatUIKitSwift ^5; iOS 13+"
6
- allowed-tools: "executeBash, readFile, fileSearch, listDirectory"
6
+ allowed-tools: "shell, file-read, file-search, file-list"
7
7
  metadata:
8
8
  author: "CometChat"
9
9
  version: "3.0.0"
@@ -3,7 +3,7 @@ name: cometchat-ios-features
3
3
  description: "Feature catalog for CometChat iOS UI Kit — calls, reactions, polls, stickers, AI features, and extensions."
4
4
  license: "MIT"
5
5
  compatibility: "CometChatUIKitSwift ^5; iOS 13+"
6
- allowed-tools: "executeBash, readFile, fileSearch, listDirectory"
6
+ allowed-tools: "shell, file-read, file-search, file-list"
7
7
  metadata:
8
8
  author: "CometChat"
9
9
  version: "3.0.0"
@@ -3,7 +3,7 @@ name: cometchat-ios-placement
3
3
  description: "WHERE to put CometChat in your iOS app — navigation patterns, tab bars, modals, and embedded views."
4
4
  license: "MIT"
5
5
  compatibility: "CometChatUIKitSwift ^5; iOS 13+"
6
- allowed-tools: "executeBash, readFile, fileSearch, listDirectory"
6
+ allowed-tools: "shell, file-read, file-search, file-list"
7
7
  metadata:
8
8
  author: "CometChat"
9
9
  version: "3.0.0"
@@ -3,7 +3,7 @@ name: cometchat-ios-production
3
3
  description: "Production-ready CometChat iOS setup — server-side auth tokens, security best practices, and deployment checklist."
4
4
  license: "MIT"
5
5
  compatibility: "CometChatUIKitSwift ^5; iOS 13+"
6
- allowed-tools: "executeBash, readFile, fileSearch, listDirectory"
6
+ allowed-tools: "shell, file-read, file-search, file-list"
7
7
  metadata:
8
8
  author: "CometChat"
9
9
  version: "3.0.0"
@@ -3,7 +3,7 @@ name: cometchat-ios-push
3
3
  description: "Set up push notifications for CometChat iOS apps — APNs configuration, token registration, and notification handling."
4
4
  license: "MIT"
5
5
  compatibility: "CometChatUIKitSwift ^5; iOS 13+"
6
- allowed-tools: "executeBash, readFile, fileSearch, listDirectory"
6
+ allowed-tools: "shell, file-read, file-search, file-list"
7
7
  metadata:
8
8
  author: "CometChat"
9
9
  version: "3.0.0"
@@ -0,0 +1,371 @@
1
+ ---
2
+ name: cometchat-ios-testing
3
+ description: Testing patterns for CometChat iOS UI Kit v5 in Swift / SwiftUI / UIKit projects. Covers XCTest setup, mocking CometChatSDK + CometChatUIKitSwift via protocols, snapshot testing with iOSSnapshotTestCase, async/await test helpers, UI testing for full chat flows on simulators, and CI on Xcode Cloud / GitHub Actions.
4
+ license: "MIT"
5
+ compatibility: "Xcode 15+, Swift 5.9+, iOS 13+ deployment target; XCTest (built-in); SnapshotTesting >= 1.15 (Pointfree); CometChatUIKitSwift ~> 5.1"
6
+ allowed-tools: "shell, file-read, file-search, file-list, ask-user"
7
+ metadata:
8
+ author: "CometChat"
9
+ version: "4.0.0"
10
+ tags: "cometchat ios testing xctest swift uikit swiftui mocking snapshot async-await ui-tests xcode-cloud github-actions"
11
+ ---
12
+
13
+ ## Purpose
14
+
15
+ Testing patterns for iOS CometChat integrations. XCTest (built-in) for unit + integration; SnapshotTesting (Pointfree) for visual regression; XCUITest for full-flow UI tests on the simulator.
16
+
17
+ **Read these other skills first:**
18
+ - `cometchat-ios-core` — init, login, Secrets pattern
19
+ - `cometchat-ios-components` — what each VC does (tests assert against this)
20
+ - `cometchat-ios-calls/references/callkit-and-pushkit.md` — CallKit testing strategy (different from chat)
21
+
22
+ **Ground truth:**
23
+ - XCTest — https://developer.apple.com/documentation/xctest
24
+ - SnapshotTesting — https://github.com/pointfreeco/swift-snapshot-testing
25
+
26
+ ---
27
+
28
+ ## 1. Test target structure
29
+
30
+ A typical iOS project has three targets:
31
+
32
+ | Target | When |
33
+ |---|---|
34
+ | `YourApp` | Production code |
35
+ | `YourAppTests` | Unit + integration tests (XCTest) |
36
+ | `YourAppUITests` | UI tests (XCUITest, runs on simulator) |
37
+
38
+ The skill writes to `YourAppTests` for most assertions; `YourAppUITests` for full flows.
39
+
40
+ ---
41
+
42
+ ## 2. Mocking the SDK via protocols
43
+
44
+ The CometChat SDKs are class-based with static methods (`CometChat.init`, `CometChat.login`). Hard to mock directly. **Wrap them in protocols you own:**
45
+
46
+ ```swift
47
+ // Protocols/CometChatService.swift
48
+ import CometChatSDK
49
+
50
+ protocol CometChatServiceProtocol {
51
+ func initialize(appId: String, region: String) async throws
52
+ func login(uid: String, authKey: String) async throws -> User
53
+ func logout() async throws
54
+ func getLoggedInUser() -> User?
55
+ func sendMessage(_ message: TextMessage) async throws -> TextMessage
56
+ }
57
+
58
+ // Production implementation
59
+ final class CometChatService: CometChatServiceProtocol {
60
+ func initialize(appId: String, region: String) async throws {
61
+ try await withCheckedThrowingContinuation { (cont: CheckedContinuation<Void, Error>) in
62
+ let settings = AppSettings.AppSettingsBuilder()
63
+ .subscribePresenceForAllUsers()
64
+ .setRegion(region: region)
65
+ .build()
66
+ CometChat.init(appId: appId, appSettings: settings) { isInitialized, error in
67
+ if let error = error { cont.resume(throwing: error) } else { cont.resume() }
68
+ }
69
+ }
70
+ }
71
+
72
+ func login(uid: String, authKey: String) async throws -> User {
73
+ try await withCheckedThrowingContinuation { (cont: CheckedContinuation<User, Error>) in
74
+ CometChat.login(UID: uid, apiKey: authKey, onSuccess: { cont.resume(returning: $0) },
75
+ onError: { cont.resume(throwing: $0) })
76
+ }
77
+ }
78
+
79
+ // ... etc
80
+ }
81
+ ```
82
+
83
+ Inject the protocol via DI:
84
+
85
+ ```swift
86
+ final class ChatViewController: UIViewController {
87
+ private let service: CometChatServiceProtocol
88
+
89
+ init(service: CometChatServiceProtocol = CometChatService()) {
90
+ self.service = service
91
+ super.init(nibName: nil, bundle: nil)
92
+ }
93
+ required init?(coder: NSCoder) { fatalError() }
94
+ }
95
+ ```
96
+
97
+ Test with a mock:
98
+
99
+ ```swift
100
+ // Tests/CometChatServiceMock.swift
101
+ final class CometChatServiceMock: CometChatServiceProtocol {
102
+ var initializeCallCount = 0
103
+ var initializeError: Error?
104
+ var loginUser: User?
105
+ var loginError: Error?
106
+
107
+ func initialize(appId: String, region: String) async throws {
108
+ initializeCallCount += 1
109
+ if let error = initializeError { throw error }
110
+ }
111
+
112
+ func login(uid: String, authKey: String) async throws -> User {
113
+ if let error = loginError { throw error }
114
+ return loginUser ?? User(uid: uid, name: "Test User")
115
+ }
116
+
117
+ func logout() async throws {}
118
+ func getLoggedInUser() -> User? { loginUser }
119
+ func sendMessage(_ message: TextMessage) async throws -> TextMessage { message }
120
+ }
121
+ ```
122
+
123
+ ---
124
+
125
+ ## 3. XCTest patterns
126
+
127
+ ### Async/await tests
128
+
129
+ ```swift
130
+ import XCTest
131
+ @testable import YourApp
132
+
133
+ final class ChatViewControllerTests: XCTestCase {
134
+ func testInitializeRunsBeforeLogin() async throws {
135
+ let mock = CometChatServiceMock()
136
+ let vc = ChatViewController(service: mock)
137
+
138
+ await vc.bootstrapCometChat()
139
+
140
+ XCTAssertEqual(mock.initializeCallCount, 1)
141
+ XCTAssertNotNil(vc.currentUser)
142
+ }
143
+
144
+ func testLoginFailureSurfacesError() async throws {
145
+ let mock = CometChatServiceMock()
146
+ mock.loginError = NSError(domain: "Test", code: 401, userInfo: [NSLocalizedDescriptionKey: "Unauthorized"])
147
+
148
+ let vc = ChatViewController(service: mock)
149
+ await vc.bootstrapCometChat()
150
+
151
+ XCTAssertEqual(vc.errorMessage, "Unauthorized")
152
+ XCTAssertEqual(vc.errorLabel?.textColor, .red) // skill rule: error UI must be visible
153
+ }
154
+ }
155
+ ```
156
+
157
+ ### Expectation-based tests (legacy / non-async code)
158
+
159
+ ```swift
160
+ func testMessageSendFiresCallback() {
161
+ let expectation = expectation(description: "message sent")
162
+
163
+ let mock = CometChatServiceMock()
164
+ let vc = ChatViewController(service: mock)
165
+ vc.send(message: "Hello") { _ in
166
+ expectation.fulfill()
167
+ }
168
+
169
+ wait(for: [expectation], timeout: 1.0)
170
+ }
171
+ ```
172
+
173
+ For SDK callback-based code, prefer wrapping in protocol + async/await per Section 2; this pattern is for legacy code only.
174
+
175
+ ---
176
+
177
+ ## 4. SwiftUI view tests
178
+
179
+ ```swift
180
+ import SwiftUI
181
+ import XCTest
182
+ @testable import YourApp
183
+
184
+ @MainActor
185
+ final class ProfileViewTests: XCTestCase {
186
+ func testCallButtonInvokesService() throws {
187
+ let mock = CallServiceMock()
188
+ let view = ProfileView(user: testUser(), callService: mock)
189
+
190
+ let host = UIHostingController(rootView: view)
191
+ host.loadViewIfNeeded()
192
+
193
+ // Hard to interact with SwiftUI views from XCTest directly — use ViewInspector or UI tests
194
+ // For most behavioral tests, prefer XCUITest (Section 6)
195
+ }
196
+ }
197
+ ```
198
+
199
+ Pure SwiftUI testing is hard; pragmatic choice is to keep most tests at the service / view-model layer and put view assertions in UI tests.
200
+
201
+ ### ViewInspector (third-party)
202
+
203
+ For SwiftUI views you do want to inspect from XCTest, install `ViewInspector`:
204
+
205
+ ```swift
206
+ import ViewInspector
207
+
208
+ func testProfileShowsUserName() throws {
209
+ let user = testUser()
210
+ let view = ProfileView(user: user)
211
+ let text = try view.inspect().find(text: user.name)
212
+ XCTAssertNotNil(text)
213
+ }
214
+ ```
215
+
216
+ Adds a runtime dep. Not strictly necessary if you have UI tests.
217
+
218
+ ---
219
+
220
+ ## 5. Snapshot testing
221
+
222
+ ```bash
223
+ # Package.swift dependency
224
+ .package(url: "https://github.com/pointfreeco/swift-snapshot-testing.git", from: "1.15.0")
225
+ ```
226
+
227
+ ```swift
228
+ import SnapshotTesting
229
+ import XCTest
230
+ @testable import YourApp
231
+
232
+ final class ChatViewSnapshotTests: XCTestCase {
233
+ func testEmptyChatView() {
234
+ let view = ChatView(messages: [])
235
+ let host = UIHostingController(rootView: view)
236
+ assertSnapshot(matching: host, as: .image(on: .iPhone13))
237
+ }
238
+
239
+ func testChatViewWithMessages() {
240
+ let messages = [
241
+ TextMessage(text: "Hi", senderUid: "alice"),
242
+ TextMessage(text: "Hey", senderUid: "bob"),
243
+ ]
244
+ let view = ChatView(messages: messages)
245
+ let host = UIHostingController(rootView: view)
246
+ assertSnapshot(matching: host, as: .image(on: .iPhone13))
247
+ }
248
+ }
249
+ ```
250
+
251
+ First run creates the reference image; subsequent runs diff against it. Commit the `__Snapshots__` directory.
252
+
253
+ **Gotcha:** snapshot tests are sensitive to font rendering — if CI uses a different macOS version than dev, snapshots won't match. Pin runners to a known version.
254
+
255
+ ---
256
+
257
+ ## 6. UI tests (XCUITest)
258
+
259
+ ```swift
260
+ import XCTest
261
+
262
+ final class ChatUITests: XCTestCase {
263
+ override func setUp() {
264
+ continueAfterFailure = false
265
+ let app = XCUIApplication()
266
+ app.launchEnvironment["UI_TEST_MODE"] = "1"
267
+ app.launchEnvironment["TEST_UID"] = "cometchat-uid-1"
268
+ app.launch()
269
+ }
270
+
271
+ func testLoginAndSeeConversations() {
272
+ let app = XCUIApplication()
273
+ XCTAssertTrue(app.staticTexts["Welcome"].waitForExistence(timeout: 10))
274
+ app.buttons["Messages"].tap()
275
+ XCTAssertTrue(app.staticTexts["Conversations"].waitForExistence(timeout: 10))
276
+ }
277
+
278
+ func testSendMessage() {
279
+ let app = XCUIApplication()
280
+ app.buttons["Messages"].tap()
281
+ app.buttons["cometchat-uid-2"].tap()
282
+
283
+ let composer = app.textFields["Type a message"]
284
+ composer.tap()
285
+ composer.typeText("Hello from UI test")
286
+ app.buttons["Send"].tap()
287
+
288
+ XCTAssertTrue(app.staticTexts["Hello from UI test"].waitForExistence(timeout: 5))
289
+ }
290
+ }
291
+ ```
292
+
293
+ **`UI_TEST_MODE` flag:** in production code, check this env var and skip animations / use shorter timeouts:
294
+
295
+ ```swift
296
+ if ProcessInfo.processInfo.environment["UI_TEST_MODE"] == "1" {
297
+ UIView.setAnimationsEnabled(false)
298
+ }
299
+ ```
300
+
301
+ **Test users:** UI tests need real login. Use the dev `cometchat-uid-1` through `cometchat-uid-5`; never use production credentials.
302
+
303
+ ---
304
+
305
+ ## 7. CI configuration
306
+
307
+ ### GitHub Actions
308
+
309
+ ```yaml
310
+ name: tests
311
+ on: [push, pull_request]
312
+
313
+ jobs:
314
+ unit:
315
+ runs-on: macos-13 # pin macOS version for snapshot stability
316
+ steps:
317
+ - uses: actions/checkout@v4
318
+ - run: |
319
+ xcodebuild test \
320
+ -scheme YourApp \
321
+ -destination "platform=iOS Simulator,name=iPhone 15,OS=17.0" \
322
+ -only-testing:YourAppTests \
323
+ COMETCHAT_TEST_APP_ID="${{ secrets.TEST_COMETCHAT_APP_ID }}" \
324
+ COMETCHAT_TEST_REGION="${{ secrets.TEST_COMETCHAT_REGION }}" \
325
+ COMETCHAT_TEST_AUTH_KEY="${{ secrets.TEST_COMETCHAT_AUTH_KEY }}"
326
+
327
+ ui:
328
+ runs-on: macos-13
329
+ needs: unit
330
+ steps:
331
+ - uses: actions/checkout@v4
332
+ - run: |
333
+ xcodebuild test \
334
+ -scheme YourApp \
335
+ -destination "platform=iOS Simulator,name=iPhone 15,OS=17.0" \
336
+ -only-testing:YourAppUITests \
337
+ COMETCHAT_TEST_APP_ID="${{ secrets.TEST_COMETCHAT_APP_ID }}"
338
+ ```
339
+
340
+ ### Xcode Cloud
341
+
342
+ Configure in App Store Connect → Xcode Cloud. Use the same env var convention; Xcode Cloud injects them into `xcodebuild` automatically.
343
+
344
+ ---
345
+
346
+ ## 8. Anti-patterns
347
+
348
+ 1. **Mocking CometChat directly** (without the protocol wrapper). The static methods aren't swappable; you'd need OCMock and method swizzling. The protocol wrapper is cleaner.
349
+ 2. **Using real WebSocket connections** in unit tests. They're flaky on CI. Mock the service layer.
350
+ 3. **Snapshot tests on a Mac with system font preference different from CI.** Pin macOS + Xcode versions.
351
+ 4. **Hardcoding `cometchat-uid-1` strings** across many tests. Centralize via a `TestUsers` enum so renames are one-edit.
352
+ 5. **Skipping `continueAfterFailure = false`** in UI tests. Default UI tests continue running after a failure, hiding root causes in cascade failures.
353
+ 6. **Storing test credentials in `Secrets.swift`.** Use env vars passed via `xcodebuild` and read via `ProcessInfo.processInfo.environment["..."]` in test bundles only.
354
+
355
+ ## 9. Verification checklist
356
+
357
+ - [ ] `CometChatServiceProtocol` (or similar) wrapping the SDK; production VCs use it via DI
358
+ - [ ] Mock implementation in `Tests/Mocks/`
359
+ - [ ] At least one test for "init resolves before VC is functional"
360
+ - [ ] At least one test for "error UI shows on init/login failure"
361
+ - [ ] Snapshot tests for at least the empty + populated states of chat surfaces
362
+ - [ ] At least one UI test for login + see conversations
363
+ - [ ] Test target uses dedicated CometChat test App ID via env vars (not Secrets.swift)
364
+ - [ ] CI pinned to macOS + Xcode versions
365
+ - [ ] No `continueAfterFailure = true` in UI tests
366
+
367
+ ## 10. Pointers
368
+
369
+ - `cometchat-ios-calls/references/callkit-and-pushkit.md` — calls + CallKit testing
370
+ - `cometchat-ios-core` — init, login, Secrets patterns the tests assert against
371
+ - `cometchat-ios-troubleshooting` — when tests pass but production breaks
@@ -3,7 +3,7 @@ name: cometchat-ios-theming
3
3
  description: "Customize the look and feel of CometChat iOS UI Kit — colors, fonts, styles, and dark mode support."
4
4
  license: "MIT"
5
5
  compatibility: "CometChatUIKitSwift ^5; iOS 13+"
6
- allowed-tools: "executeBash, readFile, fileSearch, listDirectory"
6
+ allowed-tools: "shell, file-read, file-search, file-list"
7
7
  metadata:
8
8
  author: "CometChat"
9
9
  version: "3.0.0"
@@ -3,7 +3,7 @@ name: cometchat-ios-troubleshooting
3
3
  description: "Diagnose and fix common CometChat iOS integration issues — build errors, runtime errors, and debugging techniques."
4
4
  license: "MIT"
5
5
  compatibility: "CometChatUIKitSwift ^5; iOS 13+"
6
- allowed-tools: "executeBash, readFile, fileSearch, listDirectory"
6
+ allowed-tools: "shell, file-read, file-search, file-list"
7
7
  metadata:
8
8
  author: "CometChat"
9
9
  version: "3.0.0"