@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,269 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * typecheck-fences-kotlin.mjs — Tier-2 compile gate for NATIVE (Kotlin/Android) skill
4
+ * families: compile the skills' Kotlin code fences against the REAL pinned UI Kit +
5
+ * Chat SDK, catching signature/import drift that the Tier-1 name-only catalog can't
6
+ * see (a wrong arg count, a member that moved, a symbol that exists but isn't public).
7
+ *
8
+ * The Kotlin sibling of typecheck-fences.mjs (which does the same for TS/React). Same
9
+ * contract: extract import-bearing fences → stage them into a project that has the kit
10
+ * installed → compile → report ONLY kit-API errors.
11
+ *
12
+ * Strategy: extract every ```kotlin fence that imports `com.cometchat.…` (real recipe
13
+ * blocks, not prose fragments), wrap each in its own package/file inside the Gradle
14
+ * probe project, run `:fences:compileDebugKotlin`, and classify the diagnostics:
15
+ * • KIT-API errors → the fence references a CometChat symbol/signature that does not
16
+ * exist as written. This FAILS the gate (exit 1).
17
+ * • FRAGMENT noise → unresolved placeholder identifiers the recipes legitimately use
18
+ * (`uid`, `binding`, `R`, a screen the reader supplies). Fences that
19
+ * only produce these are stripped and counted, like the TS gate's
20
+ * non-parseable-fragment pass.
21
+ *
22
+ * Usage:
23
+ * node test-suite/scripts/typecheck-fences-kotlin.mjs \
24
+ * --project test-suite/typecheck/android-v6 --discover android-v6 [--keep]
25
+ * Exit: 0 no kit-API errors · 1 kit-API drift · 2 BLOCKED(setup) — toolchain/SDK/kit
26
+ * unavailable (honest, never fake-green).
27
+ */
28
+ import { readFileSync, writeFileSync, mkdirSync, rmSync, existsSync, readdirSync } from "node:fs";
29
+ import { join, dirname } from "node:path";
30
+ import { execFileSync } from "node:child_process";
31
+ import { fileURLToPath } from "node:url";
32
+
33
+ const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
34
+ const args = process.argv.slice(2);
35
+ const opt = (name, def) => { const i = args.indexOf(`--${name}`); return i >= 0 ? args[i + 1] : def; };
36
+ const KEEP = args.includes("--keep");
37
+
38
+ // ── derive family metadata from families.json (RULES.md §22) ─────────────────
39
+ const FAMILIES_PATH = join(ROOT, ".claude/skills/cometchat-skill-reviewer/tools/families.json");
40
+ const { families: FAM_DATA, default: DEFAULT_FAMILY } = JSON.parse(readFileSync(FAMILIES_PATH, "utf8"));
41
+
42
+ const PROJECT = opt("project", null);
43
+ const DISCOVER = opt("discover", DEFAULT_FAMILY);
44
+ const projectAbs = PROJECT ? join(ROOT, PROJECT) : null;
45
+
46
+ // ── families: skill-dir globs derived from families.json ─────────────────────
47
+ // --discover accepts a catalog-basename prefix (e.g. the part before "-v<N>").
48
+ // All non-parked, non-template families whose platform matches contribute their
49
+ // reviewsSkills globs — so adding a new Android family requires no edit here.
50
+ const discoverPlatform = DISCOVER.replace(/-v\d+$/, "");
51
+ const discoverGlobs = Object.values(FAM_DATA)
52
+ .filter((f) => f.platform === discoverPlatform && !f.parked && !/^template/i.test(f._status || ""))
53
+ .flatMap((f) => (f.reviewsSkills || []).map((p) =>
54
+ p.endsWith("-") ? new RegExp("^" + p) : new RegExp("^" + p + "$")));
55
+
56
+ // ── BLOCKED(setup) preflight — fail honestly, with the fix ───────────────────
57
+ function blocked(msg, fix) {
58
+ console.error(`\n⛔ BLOCKED(setup): ${msg}`);
59
+ if (fix) console.error(` → ${fix}`);
60
+ console.error(` The gate did NOT run — this is not a pass.`);
61
+ process.exit(2);
62
+ }
63
+ if (!projectAbs) blocked(`--project is required`, `pass --project test-suite/typecheck/<family>`);
64
+ if (!existsSync(projectAbs)) blocked(`probe project not found: ${PROJECT}`);
65
+ const gradlew = join(projectAbs, "gradlew");
66
+ if (!existsSync(gradlew)) blocked(`no Gradle wrapper in ${PROJECT}`, `copy gradle/wrapper + gradlew from an Android project`);
67
+ const localProps = join(projectAbs, "local.properties");
68
+ if (!existsSync(localProps) || !/sdk\.dir=/.test(readFileSync(localProps, "utf8"))) {
69
+ blocked(`Android SDK location unknown (${PROJECT}/local.properties has no sdk.dir)`,
70
+ `write sdk.dir=/path/to/Android/sdk into ${PROJECT}/local.properties (git-ignored)`);
71
+ }
72
+
73
+ // ── discover skill files whose fences import the kit ─────────────────────────
74
+ const globs = discoverGlobs;
75
+ if (!globs.length) blocked(`unknown --discover platform "${DISCOVER}" — no matching families found in families.json`);
76
+ const NEEDLE = "import com.cometchat.";
77
+ const files = [];
78
+ const collect = (dir) => {
79
+ for (const e of readdirSync(dir, { withFileTypes: true })) {
80
+ const p = join(dir, e.name);
81
+ if (e.isDirectory()) collect(p);
82
+ else if (e.name.endsWith(".md") && readFileSync(p, "utf8").includes(NEEDLE)) files.push(p);
83
+ }
84
+ };
85
+ const skillsRoot = join(ROOT, "skills");
86
+ for (const d of readdirSync(skillsRoot, { withFileTypes: true })) {
87
+ if (d.isDirectory() && globs.some((g) => g.test(d.name))) collect(join(skillsRoot, d.name));
88
+ }
89
+
90
+ // ── extract + stage fences ───────────────────────────────────────────────────
91
+ const FENCE_RE = /```kotlin[^\n]*\n([\s\S]*?)```/g;
92
+ // Placeholders the recipes legitimately reference without defining. Provided as
93
+ // function parameters so the fence body compiles; anything ELSE unresolved is real.
94
+ const PLACEHOLDERS = [
95
+ ["context", "android.content.Context"],
96
+ ["uid", "String"],
97
+ ["authToken", "String"],
98
+ ["user", "com.cometchat.chat.models.User"],
99
+ ["group", "com.cometchat.chat.models.Group"],
100
+ ["message", "com.cometchat.chat.models.BaseMessage"],
101
+ ["conversation", "com.cometchat.chat.models.Conversation"],
102
+ ["lifecycleScope", "kotlinx.coroutines.CoroutineScope"],
103
+ ];
104
+
105
+ function extractFences(file) {
106
+ const src = readFileSync(file, "utf8");
107
+ const out = [];
108
+ let m, idx = 0;
109
+ while ((m = FENCE_RE.exec(src))) {
110
+ const body = m[1];
111
+ if (!body.includes(NEEDLE)) continue; // real recipe, not a fragment
112
+ if (/gate-skip/.test(body)) continue; // explicitly excluded
113
+ out.push({ idx: idx++, body });
114
+ }
115
+ return out;
116
+ }
117
+
118
+ const FENCE_DIR = join(projectAbs, "fences", "src", "main", "kotlin", "__fences__");
119
+ rmSync(FENCE_DIR, { recursive: true, force: true });
120
+ mkdirSync(FENCE_DIR, { recursive: true });
121
+
122
+ const manifest = [];
123
+ let n = 0;
124
+ for (const file of files) {
125
+ const rel = file.replace(ROOT + "/", "");
126
+ for (const f of extractFences(file)) {
127
+ const id = `f${n++}`;
128
+ const lines = f.body.split("\n");
129
+ const imports = lines.filter((l) => /^\s*import\s+/.test(l)).map((l) => l.trim());
130
+ const rest = lines.filter((l) => !/^\s*import\s+/.test(l) && !/^\s*package\s+/.test(l)).join("\n");
131
+ // How to stage the body so it compiles in the SAME context the recipe assumes —
132
+ // otherwise the compiler reports context errors (Compose/coroutine) that look like
133
+ // kit drift but are staging artifacts:
134
+ // • declares a class/object/interface or an annotated (@Composable) function → it is
135
+ // already top-level Kotlin; emit as-is.
136
+ // • calls Compose APIs (Modifier/remember/Scaffold/a composable kit call) → wrap in a
137
+ // @Composable function (composable invocations are only legal from one).
138
+ // • otherwise → wrap in a suspend function (covers `collect`/`await` style snippets)
139
+ // that supplies the placeholder identifiers the recipe assumes.
140
+ const declaresTopLevel = /^\s*(?:@[A-Za-z]|(?:private |internal |public |abstract |sealed |open |data )*(?:class|object|interface)\s)/m.test(rest);
141
+ const usesCompose = /\bModifier\b|\bremember\b|\bScaffold\b|\bLaunchedEffect\b|\bComposable\b|\bColumn\(|\bBox\(|CometChatTheme\(/.test(rest);
142
+ const used = PLACEHOLDERS.filter(([nme]) => new RegExp(`\\b${nme}\\b`).test(rest));
143
+ const params = used.map(([nme, type]) => `${nme}: ${type}`).join(", ");
144
+ // Non-Compose recipes are written from inside an Activity (`init(this, …)`), so stage
145
+ // them as an Activity EXTENSION function — otherwise `this` doesn't resolve and the
146
+ // compiler reports a context error that looks like drift.
147
+ const wrapper = usesCompose
148
+ ? [`@androidx.compose.runtime.Composable`, `private fun fence(${params}) {`]
149
+ : [`private suspend fun androidx.activity.ComponentActivity.fence(${params}) {`];
150
+ const src = [
151
+ `@file:Suppress("unused", "UNUSED_VARIABLE", "UNUSED_PARAMETER", "UNUSED_EXPRESSION")`,
152
+ `package __fences__.${id}`,
153
+ ``,
154
+ ...imports,
155
+ ``,
156
+ `// @fence ${rel} #${f.idx}`,
157
+ declaresTopLevel ? rest : [...wrapper, rest, `}`].join("\n"),
158
+ ``,
159
+ ].join("\n");
160
+ writeFileSync(join(FENCE_DIR, `${id}.kt`), src);
161
+ manifest.push({ id, file: rel, idx: f.idx });
162
+ }
163
+ }
164
+ console.log(`Extracted ${manifest.length} import-bearing kotlin fence(s) from ${files.length} skill file(s) into ${PROJECT}/fences/src/main/kotlin/__fences__`);
165
+ if (!manifest.length) { console.log("nothing to compile."); process.exit(0); }
166
+
167
+ // ── compile ──────────────────────────────────────────────────────────────────
168
+ // Kotlin 2.x diagnostic line shape (VERIFIED against the real compiler output, not
169
+ // assumed — the message text follows the position directly, with NO literal "error:"):
170
+ // e: file:///abs/path/__fences__/f3.kt:9:1 Syntax error: Expecting a top level declaration.
171
+ // e: file:///abs/path/__fences__/f7.kt:12:5 Unresolved reference: foo
172
+ const DIAG_RE = /^e:\s+\S*__fences__\/(f\d+)\.kt:(\d+):(\d+)\s+(.*)$/;
173
+ function runGradle() {
174
+ try {
175
+ execFileSync(gradlew, [":fences:compileDebugKotlin", "--console=plain", "-q"],
176
+ { cwd: projectAbs, stdio: ["ignore", "pipe", "pipe"], timeout: 15 * 60 * 1000 });
177
+ return { ok: true, out: "" };
178
+ } catch (e) {
179
+ const out = `${e.stdout || ""}${e.stderr || ""}`;
180
+ if (/Could not (resolve|find)\s+com\.cometchat/i.test(out))
181
+ blocked("the pinned CometChat kit could not be resolved from Cloudsmith",
182
+ "check network access to dl.cloudsmith.io and the pinned version in fences/build.gradle.kts");
183
+ if (/SDK location not found|Failed to install the following Android SDK|No version of NDK/i.test(out))
184
+ blocked("Android SDK/toolchain incomplete", "install the required compileSdk platform via Android Studio / sdkmanager");
185
+ if (/Unsupported class file major version|Could not determine java version|JAVA_HOME/i.test(out))
186
+ blocked("JDK mismatch for AGP", "use JDK 17+ (AGP 8.x); set JAVA_HOME accordingly");
187
+ return { ok: false, out };
188
+ }
189
+ }
190
+
191
+ const diagsByFence = (text) => {
192
+ const per = new Map();
193
+ for (const line of text.split("\n")) {
194
+ const m = line.trim().match(DIAG_RE);
195
+ if (!m) continue;
196
+ const [, id, ln, , msg] = m;
197
+ if (!per.has(id)) per.set(id, []);
198
+ per.get(id).push({ line: ln, msg });
199
+ }
200
+ return per;
201
+ };
202
+ // A diagnostic is KIT-API drift only when it implicates a CometChat symbol. Kotlin
203
+ // reports an unresolved kit symbol as "Unresolved reference: CometChatFoo" and a bad
204
+ // signature as "None of the following candidates is applicable…" / argument errors on
205
+ // a line that names the symbol — so match the message OR the staged source line.
206
+ const fenceSrc = (id) => { try { return readFileSync(join(FENCE_DIR, `${id}.kt`), "utf8").split("\n"); } catch { return []; } };
207
+ const isKitDiag = (id, d) => {
208
+ const srcLine = fenceSrc(id)[Number(d.line) - 1] || "";
209
+ const unresolved = d.msg.match(/Unresolved reference:?\s*'?([A-Za-z_][\w]*)'?/i);
210
+ if (unresolved) {
211
+ const sym = unresolved[1];
212
+ if (/^CometChat/.test(sym)) return true; // a kit type that doesn't exist
213
+ // A MEMBER access on a kit receiver that doesn't resolve IS drift
214
+ // (`CometChatUIKit.totallyBogusMethod(…)`, `CometChatEvents.nonexistentProperty`).
215
+ // A BARE identifier is a placeholder the recipe expects the reader to supply.
216
+ const isMemberOfKit = new RegExp(`CometChat[\\w.]*\\s*\\.\\s*${sym}\\b`).test(srcLine) ||
217
+ new RegExp(`\\.\\s*${sym}\\b`).test(srcLine) && /CometChat/.test(srcLine);
218
+ return isMemberOfKit;
219
+ }
220
+ // Everything else counts as drift when it implicates the kit — by message, or by the
221
+ // staged source line (argument/overload errors name the callee on that line).
222
+ return /CometChat|com\.cometchat/i.test(d.msg) || /CometChat/i.test(srcLine);
223
+ };
224
+
225
+ let { ok, out } = runGradle();
226
+ const stripped = new Set();
227
+ // Fragment pass (the Kotlin analogue of the TS gate's non-parseable pass): a fence whose
228
+ // errors are ALL non-kit — a syntax error from an illustrative snippet, or an unresolved
229
+ // placeholder the reader supplies — is a fragment, not drift. Drop it and recompile so it
230
+ // cannot mask real errors in the OTHER fences (a syntax error aborts the whole module).
231
+ for (let pass = 0; !ok && pass < 6; pass++) {
232
+ const per = diagsByFence(out);
233
+ if (!per.size) break;
234
+ const dropping = [...per.entries()].filter(([id, ds]) => ds.every((d) => !isKitDiag(id, d)));
235
+ if (!dropping.length) break;
236
+ for (const [id] of dropping) { rmSync(join(FENCE_DIR, `${id}.kt`), { force: true }); stripped.add(id); }
237
+ ({ ok, out } = runGradle());
238
+ }
239
+
240
+ // ── classify what remains ────────────────────────────────────────────────────
241
+ const kitErrors = [];
242
+ if (!ok) {
243
+ for (const [id, ds] of diagsByFence(out)) {
244
+ for (const d of ds) {
245
+ if (!isKitDiag(id, d)) continue;
246
+ const src = manifest.find((x) => x.id === id);
247
+ kitErrors.push({ id, where: src ? `${src.file} #${src.idx}` : id, line: d.line, msg: d.msg });
248
+ }
249
+ }
250
+ // Compile failed but nothing was attributable to a fence: a project/toolchain problem,
251
+ // NOT a green result. Fail as BLOCKED(setup) rather than silently passing.
252
+ if (!kitErrors.length && !diagsByFence(out).size) {
253
+ console.error(out.split("\n").filter((l) => /error|FAILURE|Caused by/i.test(l)).slice(0, 12).join("\n"));
254
+ blocked("the probe project failed to compile for a non-fence reason",
255
+ `run: (cd ${PROJECT} && ./gradlew :fences:compileDebugKotlin) and fix the project`);
256
+ }
257
+ }
258
+
259
+ if (!KEEP) rmSync(FENCE_DIR, { recursive: true, force: true });
260
+ const checked = manifest.length - stripped.size;
261
+ const note = stripped.size ? ` (${stripped.size} illustrative fragment fence(s) skipped)` : "";
262
+
263
+ if (ok || kitErrors.length === 0) {
264
+ console.log(`\n✅ Tier-2 (kotlin): no kit-API errors across ${checked} compiled fence(s)${note}.`);
265
+ process.exit(0);
266
+ }
267
+ console.log(`\n❌ ${kitErrors.length} kit-API error(s) — real signature/import drift vs the pinned kit:`);
268
+ for (const e of kitErrors) console.log(` [${e.where}] line ${e.line}: ${e.msg}`);
269
+ process.exit(1);
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * typecheck-fences.mjs — Tier-2 compile gate: type-check the skills' code fences
4
+ * against the REAL pinned kit (catches method/signature/importability drift that
5
+ * the Tier-1 name-only catalog can't see — a wrong arg count, a member that moved,
6
+ * a symbol that exists but isn't barrel-exported).
7
+ *
8
+ * Ported from the legacy pack's battle-tested engine, adapted for the v5 layout:
9
+ * • scans SKILL.md AND references/*.md for each react-v7 skill (v5 puts real code
10
+ * in references/), where legacy only scanned SKILL.md;
11
+ * • --discover web-v7 routes fences by the kit they import.
12
+ *
13
+ * Strategy: extract every ```ts/```tsx fence that imports from "@cometchat/…"
14
+ * (real recipe blocks, not prose fragments), drop each into a throwaway dir inside
15
+ * a project that has the kit installed, run `tsc --noEmit`, report only KIT-API
16
+ * errors. Placeholder identifiers the recipes use (selectedUser, myHandler, …)
17
+ * surface as TS2304/implicit-any — expected fragment noise, filtered out. What
18
+ * remains is real API drift:
19
+ * TS2305/2307/2724 (no exported member / cannot find module)
20
+ * TS2339/2551 (property does not exist on type)
21
+ * TS2345/2554/2769 (argument type / arg count / overload mismatch)
22
+ * TS2353 (unknown property in object literal)
23
+ *
24
+ * Usage:
25
+ * node test-suite/scripts/typecheck-fences.mjs \
26
+ * --project test-suite/typecheck/web-v7 --tsconfig tsconfig.json --discover web-v7
27
+ * The --project dir must have the kit installed (CI: `npm ci` it first).
28
+ * Exit: 0 no kit-API errors · 1 kit-API drift · 2 bad invocation / project not installed.
29
+ */
30
+ import { readFileSync, writeFileSync, mkdirSync, rmSync, existsSync, readdirSync } from "node:fs";
31
+ import { join, basename, dirname } from "node:path";
32
+ import { execSync } from "node:child_process";
33
+ import { fileURLToPath } from "node:url";
34
+
35
+ const HERE = dirname(fileURLToPath(import.meta.url));
36
+ const ROOT = join(HERE, "..", "..");
37
+ const args = process.argv.slice(2);
38
+ const opt = (name, def) => { const i = args.indexOf(`--${name}`); return i >= 0 ? args[i + 1] : def; };
39
+
40
+ const PROJECT = opt("project");
41
+ const TSCONFIG = opt("tsconfig", "tsconfig.json");
42
+ const DISCOVER = opt("discover"); // web-v7
43
+
44
+ if (!PROJECT) { console.error("ERROR: --project <kit-installed-dir> is required"); process.exit(2); }
45
+ const projectAbs = join(ROOT, PROJECT);
46
+ if (!existsSync(join(projectAbs, "node_modules", "@cometchat"))) {
47
+ console.error(`ERROR: pinned kit not installed in ${PROJECT}.\n` +
48
+ ` Run: npm --prefix ${PROJECT} ci (or npm --prefix ${PROJECT} install)`);
49
+ process.exit(2);
50
+ }
51
+
52
+ // --discover <family>: auto-find every react-v7 skill file whose fences import
53
+ // that family's kit (self-maintaining — the skill list can't rot). The trailing
54
+ // quote keeps chat-uikit-react" from matching chat-uikit-react-native".
55
+ // Per family: the import needle that identifies its fences, AND the skill-directory prefix to
56
+ // scan. BOTH must be family-driven — a hardcoded directory prefix silently discovers 0 files for
57
+ // every other family, which reads as "all fences pass". (AUDIT: RN Phase C.)
58
+ const FAMILIES_JSON = join(ROOT, ".claude/skills/cometchat-skill-reviewer/tools/families.json");
59
+ // Needles + skill-dir pattern are declared per family in families.json (RULES.md §22),
60
+ // so onboarding a family needs no edit here.
61
+ const DISCOVER_FAMILY = Object.fromEntries(
62
+ Object.values(JSON.parse(readFileSync(FAMILIES_JSON, "utf8")).families)
63
+ .filter((f) => f.fenceNeedles && f.skillDirPattern)
64
+ .map((f) => [basename(f.catalog || "", ".json"),
65
+ { needles: f.fenceNeedles, dir: new RegExp(f.skillDirPattern) }]),
66
+ );
67
+ const files = [];
68
+ if (DISCOVER) {
69
+ const fam = DISCOVER_FAMILY[DISCOVER];
70
+ if (!fam) { console.error(`unknown --discover family: ${DISCOVER}`); process.exit(2); }
71
+ const { needles, dir: dirRe } = fam;
72
+ const skillsRoot = join(ROOT, "skills");
73
+ const collect = (dir) => {
74
+ for (const e of readdirSync(dir, { withFileTypes: true })) {
75
+ const p = join(dir, e.name);
76
+ if (e.isDirectory()) collect(p);
77
+ else if (e.name.endsWith(".md")) {
78
+ const body = readFileSync(p, "utf8");
79
+ if (needles.some((n) => body.includes(n))) files.push(p);
80
+ }
81
+ }
82
+ };
83
+ for (const d of readdirSync(skillsRoot, { withFileTypes: true })) {
84
+ if (d.isDirectory() && dirRe.test(d.name)) collect(join(skillsRoot, d.name));
85
+ }
86
+ if (files.length === 0) {
87
+ console.error(`ERROR: --discover ${DISCOVER} matched 0 files (dir ${dirRe}, needles ${needles.join(" | ")}).\n` +
88
+ `A family that discovers nothing is a WIRING bug — it would otherwise report "all fences pass".`);
89
+ process.exit(2);
90
+ }
91
+ } else {
92
+ // explicit file/dir args
93
+ for (const a of args.filter((x, i) => !x.startsWith("--") && !["--project", "--tsconfig", "--discover"].includes(args[i - 1]))) {
94
+ const p = join(ROOT, a);
95
+ if (existsSync(p)) files.push(p);
96
+ }
97
+ }
98
+
99
+ const KIT_ERROR_CODES = new Set([
100
+ "TS2305", "TS2307", "TS2724", // module / exported member
101
+ "TS2614", // no exported member (import-kind mismatch, e.g. default vs named)
102
+ "TS2339", "TS2551", // property does not exist
103
+ "TS2345", "TS2554", "TS2769", // argument / arg-count / overload
104
+ "TS2353", // unknown object-literal property
105
+ "TS2322", "TS2741", // type not assignable / missing required property (real API-shape drift)
106
+ "TS2882", // side-effect import with no type declaration (e.g. the CSS "/styles" entry)
107
+ ]);
108
+
109
+ // TS2304 (cannot find name) is placeholder noise in illustrative fragments (APP_ID, uid, guid…),
110
+ // so it only counts for WHOLE-FILE fences — a first line naming the file (`// src/main.ts`) says
111
+ // "paste this as the file", and an undeclared helper there fails the user's build. A fence that
112
+ // extends a file shown earlier says so: `// src/app/x.ts — continued …` is exempt.
113
+ const WHOLE_FILE_RE = /^\/\/\s*[\w@./\[\]()-]+\.(?:ts|tsx|mts)\b/;
114
+ function isWholeFile(body) {
115
+ const first = (body.split("\n").find((l) => l.trim()) || "").trim();
116
+ return WHOLE_FILE_RE.test(first) && !/\bcontinued\b/i.test(first);
117
+ }
118
+
119
+ function extractFences(file) {
120
+ const src = readFileSync(file, "utf8");
121
+ const out = [];
122
+ const re = /```(?:tsx?|typescript|ts)\n([\s\S]*?)```/g;
123
+ let m, idx = 0;
124
+ while ((m = re.exec(src))) {
125
+ const body = m[1];
126
+ if (!/from\s+["']@cometchat\//.test(body)) continue; // real recipe, not a fragment
127
+ if (/tier2-version-gated/.test(body)) continue; // API newer than the pinned kit
128
+ out.push({ idx: idx++, body, wholeFile: isWholeFile(body) });
129
+ }
130
+ return out;
131
+ }
132
+
133
+ const FENCE_DIR = join(projectAbs, "src", "__fences__");
134
+ rmSync(FENCE_DIR, { recursive: true, force: true });
135
+ mkdirSync(FENCE_DIR, { recursive: true });
136
+
137
+ // Ambient decls for framework globals the fences legitimately use (Vite env, CSS,
138
+ // ?url/?raw asset imports) — not kit APIs; without them tsc emits env noise.
139
+ writeFileSync(join(FENCE_DIR, "__ambient.d.ts"),
140
+ [
141
+ "interface ImportMeta { env: Record<string, string>; }",
142
+ 'declare module "*.css" { const s: string; export default s; }',
143
+ 'declare module "*.css?url" { const s: string; export default s; }',
144
+ 'declare module "*?url" { const s: string; export default s; }',
145
+ 'declare module "*?raw" { const s: string; export default s; }',
146
+ ].join("\n") + "\n");
147
+
148
+ const manifest = [];
149
+ for (const file of files) {
150
+ if (!existsSync(file)) { console.error(`skip (not found): ${file}`); continue; }
151
+ const rel = file.replace(ROOT + "/", "");
152
+ const name = rel.replace(/[^A-Za-z0-9_-]/g, "_");
153
+ for (const f of extractFences(file)) {
154
+ const fenceFile = join(FENCE_DIR, `${name}__${f.idx}.tsx`);
155
+ writeFileSync(fenceFile, `// @fence ${rel} #${f.idx}\n${f.body}\n`);
156
+ manifest.push({ fenceFile, skill: name, idx: f.idx, wholeFile: f.wholeFile });
157
+ }
158
+ }
159
+ console.log(`Extracted ${manifest.length} import-bearing fence(s) from ${files.length} file(s) into ${PROJECT}/src/__fences__`);
160
+
161
+ // tsc --noEmit, TWO-PASS: tsc suppresses ALL semantic diagnostics if any file has
162
+ // a syntactic (TS1xxx) error. Illustrative fragments often don't parse standalone
163
+ // and would mask real drift in every other fence — so strip the non-parseable ones
164
+ // (reported as a count) and re-run until the set parses cleanly.
165
+ const ERR_RE = /__fences__\/(.+)\.tsx\((\d+),(\d+)\):\s+error\s+(TS\d+):\s+(.*)/;
166
+ function runTsc() {
167
+ try {
168
+ execSync(`npx tsc --noEmit -p ${TSCONFIG}`, { cwd: projectAbs, stdio: ["ignore", "pipe", "pipe"] });
169
+ return "";
170
+ } catch (e) { return `${e.stdout || ""}${e.stderr || ""}`; }
171
+ }
172
+ let raw = runTsc();
173
+ const stripped = new Set();
174
+ for (let pass = 0; pass < 10; pass++) {
175
+ const syntactic = new Set();
176
+ for (const line of raw.split("\n")) {
177
+ const m = line.match(ERR_RE);
178
+ if (m && /^TS1\d{3}$/.test(m[4])) syntactic.add(m[1]);
179
+ }
180
+ if (syntactic.size === 0) break;
181
+ for (const nm of syntactic) { rmSync(join(FENCE_DIR, `${nm}.tsx`), { force: true }); stripped.add(nm); }
182
+ raw = runTsc();
183
+ }
184
+
185
+ const wholeFileFences = new Set(manifest.filter((f) => f.wholeFile).map((f) => `${f.skill}__${f.idx}`));
186
+ const kitErrors = [];
187
+ for (const line of raw.split("\n")) {
188
+ const m = line.match(ERR_RE);
189
+ if (!m) continue;
190
+ const [, fenceName, , , code, msg] = m;
191
+ if (code === "TS2304" && wholeFileFences.has(fenceName)) { kitErrors.push({ fenceName, code, msg }); continue; }
192
+ if (!KIT_ERROR_CODES.has(code)) continue;
193
+ if (code === "TS2307" && !/@cometchat\//.test(msg)) continue; // app-relative/CSS imports = env noise
194
+ kitErrors.push({ fenceName, code, msg });
195
+ }
196
+
197
+ rmSync(FENCE_DIR, { recursive: true, force: true });
198
+ const checked = manifest.length - stripped.size;
199
+ const strippedNote = stripped.size ? ` (${stripped.size} non-parseable fragment fence(s) skipped)` : "";
200
+ if (kitErrors.length === 0) {
201
+ console.log(`\n✅ Tier-2: no kit-API errors across ${checked} semantically-checked fence(s)${strippedNote}.`);
202
+ process.exit(0);
203
+ }
204
+ console.log(`\n❌ ${kitErrors.length} kit-API error(s) — real method/signature/import drift:`);
205
+ for (const e of kitErrors) console.log(` [${e.fenceName}] ${e.code}: ${e.msg}`);
206
+ process.exit(1);