@cometchat/skills 4.4.1 → 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 (489) 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/README.md +41 -163
  5. package/RULES.md +114 -0
  6. package/bin/cometchat-skills.mjs +1180 -0
  7. package/bin/legacy-skills.json +95 -0
  8. package/catalogs/android-v6.json +1646 -0
  9. package/catalogs/flutter-v6.json +651 -0
  10. package/catalogs/ios-v5.json +1383 -0
  11. package/catalogs/rn-calls-v5.json +134 -0
  12. package/catalogs/rn-calls-v5.symbols.txt +58 -0
  13. package/catalogs/rn-sdk-v4.json +672 -0
  14. package/catalogs/rn-v5.json +449 -0
  15. package/catalogs/rn-v5.symbols.txt +216 -0
  16. package/catalogs/sdk-android-v5.json +514 -0
  17. package/contracts.android-calls-v5.json +122 -0
  18. package/contracts.android-v6.json +135 -0
  19. package/contracts.angular-v5.json +694 -0
  20. package/contracts.flutter-calls-v5.json +77 -0
  21. package/contracts.flutter-v6.json +126 -0
  22. package/contracts.ios-calls-v5.json +67 -0
  23. package/contracts.ios-v5.json +436 -0
  24. package/contracts.json +82 -0
  25. package/contracts.rn-calls-v5.json +77 -0
  26. package/contracts.rn-v5.json +727 -0
  27. package/contracts.sdk-android-v5.json +15 -0
  28. package/contracts.web-calls-v5.json +45 -0
  29. package/features.android-calls-v5.json +246 -0
  30. package/features.android-v6.json +65 -0
  31. package/features.angular-v5.json +521 -0
  32. package/features.flutter-calls-v5.json +286 -0
  33. package/features.flutter-v6.json +484 -0
  34. package/features.ios-calls-v5.json +236 -0
  35. package/features.ios-v5.json +573 -0
  36. package/features.json +61 -0
  37. package/features.rn-calls-v5.json +187 -0
  38. package/features.rn-v5.json +614 -0
  39. package/features.sdk-android-v5.json +40 -0
  40. package/features.sdk-jsv4.json +24 -0
  41. package/features.web-calls-v5.json +108 -0
  42. package/package.json +151 -74
  43. package/peers.yaml +312 -0
  44. package/registry/README.md +31 -0
  45. package/registry/android-calls-v5.json +54 -0
  46. package/registry/android-v6.json +137 -0
  47. package/registry/angular-v5.json +114 -0
  48. package/registry/flutter-calls-v5.json +54 -0
  49. package/registry/flutter-v6.json +119 -0
  50. package/registry/ios-calls-v5.json +59 -0
  51. package/registry/ios-v5.json +97 -0
  52. package/registry/rn-calls-v5.json +59 -0
  53. package/registry/rn-v5.json +129 -0
  54. package/registry/sdk-android-v5.json +53 -0
  55. package/registry/sdk-jsv4.json +53 -0
  56. package/registry/web-calls-v5.json +54 -0
  57. package/registry/web-v7.json +99 -0
  58. package/skills/cometchat/SKILL.md +42 -2096
  59. package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
  60. package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
  61. package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
  62. package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
  63. package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
  64. package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
  65. package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
  66. package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
  67. package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
  68. package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
  69. package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
  70. package/skills/cometchat-android-v6-calls/SKILL.md +128 -411
  71. package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
  72. package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
  73. package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
  74. package/skills/cometchat-android-v6-core/SKILL.md +236 -672
  75. package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
  76. package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
  77. package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
  78. package/skills/cometchat-android-v6-core/references/layout.md +112 -0
  79. package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
  80. package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
  81. package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
  82. package/skills/cometchat-android-v6-events/SKILL.md +46 -184
  83. package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
  84. package/skills/cometchat-android-v6-features/SKILL.md +74 -143
  85. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
  86. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
  87. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
  88. package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
  89. package/skills/cometchat-android-v6-production/SKILL.md +40 -179
  90. package/skills/cometchat-android-v6-push/SKILL.md +39 -289
  91. package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
  92. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
  93. package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
  94. package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
  95. package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
  96. package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
  97. package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
  98. package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
  99. package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
  100. package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
  101. package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
  102. package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
  103. package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
  104. package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
  105. package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
  106. package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
  107. package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
  108. package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
  109. package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
  110. package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
  111. package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
  112. package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
  113. package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
  114. package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
  115. package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
  116. package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
  117. package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
  118. package/skills/cometchat-angular-v5-production/SKILL.md +101 -0
  119. package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
  120. package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
  121. package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
  122. package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
  123. package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
  124. package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
  125. package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
  126. package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
  127. package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -387
  128. package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
  129. package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
  130. package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
  131. package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
  132. package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
  133. package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
  134. package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
  135. package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
  136. package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
  137. package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
  138. package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
  139. package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
  140. package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +131 -0
  141. package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
  142. package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
  143. package/skills/cometchat-flutter-v6-production/SKILL.md +58 -615
  144. package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
  145. package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
  146. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
  147. package/skills/cometchat-ios-calls/SKILL.md +105 -511
  148. package/skills/cometchat-ios-components/SKILL.md +44 -834
  149. package/skills/cometchat-ios-core/SKILL.md +181 -1068
  150. package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
  151. package/skills/cometchat-ios-core/references/docs-map.md +123 -0
  152. package/skills/cometchat-ios-core/references/install.md +23 -0
  153. package/skills/cometchat-ios-core/references/layout.md +186 -0
  154. package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
  155. package/skills/cometchat-ios-core/references/swiftui.md +91 -0
  156. package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
  157. package/skills/cometchat-ios-customization/SKILL.md +33 -968
  158. package/skills/cometchat-ios-features/SKILL.md +29 -738
  159. package/skills/cometchat-ios-migration/SKILL.md +39 -0
  160. package/skills/cometchat-ios-placement/SKILL.md +51 -729
  161. package/skills/cometchat-ios-push/SKILL.md +24 -602
  162. package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
  163. package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
  164. package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
  165. package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
  166. package/skills/cometchat-onboarding/SKILL.md +89 -0
  167. package/skills/cometchat-onboarding/references/archetypes.md +51 -0
  168. package/skills/cometchat-onboarding/references/calling-first.md +77 -0
  169. package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
  170. package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
  171. package/skills/cometchat-onboarding/references/platforms.md +90 -0
  172. package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
  173. package/skills/cometchat-react-native-calls/SKILL.md +200 -0
  174. package/skills/cometchat-react-native-components/SKILL.md +142 -0
  175. package/skills/cometchat-react-native-core/SKILL.md +313 -0
  176. package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
  177. package/skills/cometchat-react-native-core/references/component-props.md +105 -0
  178. package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
  179. package/skills/cometchat-react-native-core/references/docs-map.md +126 -0
  180. package/skills/cometchat-react-native-core/references/layout.md +61 -0
  181. package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
  182. package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
  183. package/skills/cometchat-react-native-customization/SKILL.md +198 -0
  184. package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
  185. package/skills/cometchat-react-native-features/SKILL.md +122 -0
  186. package/skills/cometchat-react-native-migration/SKILL.md +103 -0
  187. package/skills/cometchat-react-native-placement/SKILL.md +158 -0
  188. package/skills/cometchat-react-native-production/SKILL.md +78 -0
  189. package/skills/cometchat-react-native-push/SKILL.md +88 -0
  190. package/skills/cometchat-react-native-sdk/SKILL.md +126 -0
  191. package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
  192. package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
  193. package/skills/cometchat-react-native-testing/SKILL.md +94 -0
  194. package/skills/cometchat-react-native-troubleshooting/SKILL.md +116 -0
  195. package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
  196. package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
  197. package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
  198. package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
  199. package/skills/cometchat-react-v7-components/SKILL.md +72 -0
  200. package/skills/cometchat-react-v7-core/SKILL.md +101 -0
  201. package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
  202. package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
  203. package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
  204. package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
  205. package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +22 -0
  206. package/skills/cometchat-react-v7-core/references/layout.md +158 -0
  207. package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
  208. package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
  209. package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
  210. package/skills/cometchat-react-v7-core/references/theming.md +52 -0
  211. package/skills/cometchat-react-v7-core/references/troubleshooting.md +28 -0
  212. package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
  213. package/skills/cometchat-react-v7-features/SKILL.md +92 -0
  214. package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
  215. package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
  216. package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
  217. package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
  218. package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
  219. package/skills/cometchat-react-v7-push/SKILL.md +53 -0
  220. package/test-suite/README.md +70 -0
  221. package/test-suite/catalogs/android-calls-v5.json +830 -0
  222. package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
  223. package/test-suite/catalogs/android-v6.json +1646 -0
  224. package/test-suite/catalogs/android-v6.symbols.txt +298 -0
  225. package/test-suite/catalogs/angular-v5.json +7587 -0
  226. package/test-suite/catalogs/flutter-calls-v5.json +196 -0
  227. package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
  228. package/test-suite/catalogs/flutter-v6.json +651 -0
  229. package/test-suite/catalogs/ios-calls-v5.json +158 -0
  230. package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
  231. package/test-suite/catalogs/ios-v5.json +1383 -0
  232. package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
  233. package/test-suite/catalogs/rn-calls-v5.json +134 -0
  234. package/test-suite/catalogs/rn-sdk-v4.json +672 -0
  235. package/test-suite/catalogs/rn-v5.json +449 -0
  236. package/test-suite/catalogs/sdk-android-v5.json +514 -0
  237. package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
  238. package/test-suite/catalogs/sdk-jsv4.json +800 -0
  239. package/test-suite/catalogs/web-calls-v5.json +195 -0
  240. package/test-suite/catalogs/web-v7.json +1243 -0
  241. package/test-suite/scripts/build-registry.mjs +113 -0
  242. package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
  243. package/test-suite/scripts/catalog-refresh.mjs +100 -0
  244. package/test-suite/scripts/lint-skills.mjs +909 -0
  245. package/test-suite/scripts/measure-tokens.mjs +169 -0
  246. package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
  247. package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
  248. package/test-suite/scripts/typecheck-fences.mjs +206 -0
  249. package/test-suite/scripts/verify-catalog.mjs +242 -0
  250. package/test-suite/scripts/verify-contract-fences.mjs +94 -0
  251. package/test-suite/scripts/verify-detection.mjs +178 -0
  252. package/test-suite/scripts/verify-docs-base.mjs +91 -0
  253. package/test-suite/scripts/verify-family-agnostic.mjs +130 -0
  254. package/test-suite/scripts/verify-golden-path.mjs +138 -0
  255. package/test-suite/scripts/verify-oracle-components.mjs +133 -0
  256. package/test-suite/scripts/verify-template-bindings.mjs +148 -0
  257. package/test-suite/typecheck/angular-v5/package.json +21 -0
  258. package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
  259. package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
  260. package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
  261. package/test-suite/typecheck/web-v7/package.json +18 -0
  262. package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
  263. package/bin/install.js +0 -1003
  264. package/skills/.claude-plugin/marketplace.json +0 -86
  265. package/skills/cometchat/references/asking-questions.md +0 -48
  266. package/skills/cometchat-a11y/SKILL.md +0 -477
  267. package/skills/cometchat-android-v5/SKILL.md +0 -121
  268. package/skills/cometchat-android-v5-calls/SKILL.md +0 -427
  269. package/skills/cometchat-android-v5-calls/references/README.md +0 -53
  270. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
  271. package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
  272. package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
  273. package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
  274. package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
  275. package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
  276. package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
  277. package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
  278. package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
  279. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
  280. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
  281. package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
  282. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
  283. package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
  284. package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
  285. package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
  286. package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
  287. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
  288. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
  289. package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
  290. package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
  291. package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
  292. package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
  293. package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
  294. package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
  295. package/skills/cometchat-android-v5-components/SKILL.md +0 -431
  296. package/skills/cometchat-android-v5-core/SKILL.md +0 -486
  297. package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
  298. package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
  299. package/skills/cometchat-android-v5-features/SKILL.md +0 -131
  300. package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
  301. package/skills/cometchat-android-v5-production/SKILL.md +0 -95
  302. package/skills/cometchat-android-v5-push/SKILL.md +0 -619
  303. package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
  304. package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
  305. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
  306. package/skills/cometchat-android-v6/SKILL.md +0 -108
  307. package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
  308. package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
  309. package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
  310. package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
  311. package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
  312. package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
  313. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
  314. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
  315. package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
  316. package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
  317. package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
  318. package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
  319. package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
  320. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
  321. package/skills/cometchat-angular-calls/SKILL.md +0 -378
  322. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
  323. package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
  324. package/skills/cometchat-angular-calls/references/call-session.md +0 -167
  325. package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
  326. package/skills/cometchat-angular-calls/references/device-management.md +0 -154
  327. package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
  328. package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
  329. package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
  330. package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
  331. package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
  332. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
  333. package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
  334. package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
  335. package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
  336. package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
  337. package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
  338. package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
  339. package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
  340. package/skills/cometchat-angular-components/SKILL.md +0 -235
  341. package/skills/cometchat-angular-core/SKILL.md +0 -386
  342. package/skills/cometchat-angular-customization/SKILL.md +0 -616
  343. package/skills/cometchat-angular-features/SKILL.md +0 -329
  344. package/skills/cometchat-angular-patterns/SKILL.md +0 -256
  345. package/skills/cometchat-angular-placement/SKILL.md +0 -314
  346. package/skills/cometchat-angular-production/SKILL.md +0 -564
  347. package/skills/cometchat-angular-push/SKILL.md +0 -389
  348. package/skills/cometchat-angular-testing/SKILL.md +0 -605
  349. package/skills/cometchat-angular-theming/SKILL.md +0 -290
  350. package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
  351. package/skills/cometchat-astro-patterns/SKILL.md +0 -708
  352. package/skills/cometchat-calls/SKILL.md +0 -364
  353. package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
  354. package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
  355. package/skills/cometchat-calls/references/use-case-support.md +0 -189
  356. package/skills/cometchat-calls/references/use-case-team.md +0 -180
  357. package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
  358. package/skills/cometchat-components/SKILL.md +0 -1142
  359. package/skills/cometchat-core/SKILL.md +0 -1048
  360. package/skills/cometchat-customization/SKILL.md +0 -580
  361. package/skills/cometchat-customization/references/component-catalog.md +0 -236
  362. package/skills/cometchat-features/SKILL.md +0 -861
  363. package/skills/cometchat-flutter-v5/SKILL.md +0 -173
  364. package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -453
  365. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
  366. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
  367. package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
  368. package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
  369. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
  370. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
  371. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
  372. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
  373. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
  374. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
  375. package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
  376. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
  377. package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
  378. package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
  379. package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
  380. package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
  381. package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
  382. package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
  383. package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
  384. package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
  385. package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
  386. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
  387. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
  388. package/skills/cometchat-flutter-v6/SKILL.md +0 -446
  389. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
  390. package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
  391. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
  392. package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
  393. package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
  394. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
  395. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
  396. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
  397. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
  398. package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
  399. package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
  400. package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
  401. package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
  402. package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
  403. package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
  404. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
  405. package/skills/cometchat-i18n/SKILL.md +0 -419
  406. package/skills/cometchat-ios/SKILL.md +0 -325
  407. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -174
  408. package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
  409. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
  410. package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
  411. package/skills/cometchat-ios-calls/references/call-session.md +0 -218
  412. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
  413. package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
  414. package/skills/cometchat-ios-calls/references/device-management.md +0 -171
  415. package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
  416. package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
  417. package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
  418. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
  419. package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
  420. package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
  421. package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
  422. package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
  423. package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
  424. package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
  425. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
  426. package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
  427. package/skills/cometchat-ios-production/SKILL.md +0 -738
  428. package/skills/cometchat-ios-testing/SKILL.md +0 -376
  429. package/skills/cometchat-ios-theming/SKILL.md +0 -667
  430. package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
  431. package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
  432. package/skills/cometchat-native-calls/SKILL.md +0 -669
  433. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
  434. package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
  435. package/skills/cometchat-native-calls/references/call-session.md +0 -182
  436. package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
  437. package/skills/cometchat-native-calls/references/device-management.md +0 -158
  438. package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
  439. package/skills/cometchat-native-calls/references/group-calls.md +0 -296
  440. package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
  441. package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
  442. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
  443. package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
  444. package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
  445. package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
  446. package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
  447. package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
  448. package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
  449. package/skills/cometchat-native-calls/references/share-invite.md +0 -146
  450. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
  451. package/skills/cometchat-native-components/SKILL.md +0 -628
  452. package/skills/cometchat-native-core/SKILL.md +0 -679
  453. package/skills/cometchat-native-customization/SKILL.md +0 -716
  454. package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
  455. package/skills/cometchat-native-features/SKILL.md +0 -638
  456. package/skills/cometchat-native-placement/SKILL.md +0 -509
  457. package/skills/cometchat-native-production/SKILL.md +0 -700
  458. package/skills/cometchat-native-push/SKILL.md +0 -594
  459. package/skills/cometchat-native-testing/SKILL.md +0 -582
  460. package/skills/cometchat-native-theming/SKILL.md +0 -681
  461. package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
  462. package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
  463. package/skills/cometchat-placement/SKILL.md +0 -1360
  464. package/skills/cometchat-production/SKILL.md +0 -1027
  465. package/skills/cometchat-react-calls/SKILL.md +0 -749
  466. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
  467. package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
  468. package/skills/cometchat-react-calls/references/call-session.md +0 -235
  469. package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
  470. package/skills/cometchat-react-calls/references/device-management.md +0 -210
  471. package/skills/cometchat-react-calls/references/group-calls.md +0 -257
  472. package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
  473. package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
  474. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
  475. package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
  476. package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
  477. package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
  478. package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
  479. package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
  480. package/skills/cometchat-react-calls/references/share-invite.md +0 -175
  481. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
  482. package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
  483. package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
  484. package/skills/cometchat-react-patterns/SKILL.md +0 -628
  485. package/skills/cometchat-react-push/SKILL.md +0 -634
  486. package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
  487. package/skills/cometchat-react-testing/SKILL.md +0 -413
  488. package/skills/cometchat-theming/SKILL.md +0 -498
  489. 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);