@cometchat/skills 5.0.0 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +8 -0
  4. package/MIGRATING.md +187 -0
  5. package/README.md +19 -1
  6. package/RULES.md +12 -1
  7. package/bin/cometchat-skills.mjs +106 -6
  8. package/package.json +8 -3
  9. package/peers.yaml +46 -3
  10. package/registry/android-calls-v5.json +40 -0
  11. package/registry/android-v6.json +40 -0
  12. package/registry/angular-v5.json +40 -0
  13. package/registry/flutter-calls-v5.json +40 -0
  14. package/registry/flutter-v6.json +40 -0
  15. package/registry/ios-calls-v5.json +40 -0
  16. package/registry/ios-v5.json +55 -0
  17. package/registry/rn-calls-v5.json +40 -0
  18. package/registry/rn-v5.json +40 -0
  19. package/registry/sdk-android-v5.json +40 -0
  20. package/registry/sdk-jsv4.json +40 -0
  21. package/registry/web-calls-v5.json +40 -0
  22. package/registry/web-v7.json +55 -0
  23. package/skills/cometchat/SKILL.md +8 -3
  24. package/skills/cometchat-a11y/SKILL.md +49 -0
  25. package/skills/cometchat-analytics/SKILL.md +61 -0
  26. package/skills/cometchat-android-v6-core/references/docs-map.md +2 -2
  27. package/skills/cometchat-android-v6-production/SKILL.md +1 -0
  28. package/skills/cometchat-angular-v5-production/SKILL.md +1 -0
  29. package/skills/cometchat-audit/SKILL.md +61 -0
  30. package/skills/cometchat-compliance/SKILL.md +63 -0
  31. package/skills/cometchat-flutter-v6-customization/SKILL.md +1 -1
  32. package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +8 -7
  33. package/skills/cometchat-flutter-v6-production/SKILL.md +1 -0
  34. package/skills/cometchat-i18n/SKILL.md +50 -0
  35. package/skills/cometchat-ios-core/SKILL.md +3 -2
  36. package/skills/cometchat-ios-core/references/anti-patterns.md +33 -0
  37. package/skills/cometchat-ios-core/references/docs-map.md +4 -3
  38. package/skills/cometchat-ios-core/references/layout.md +33 -0
  39. package/skills/cometchat-ios-production/SKILL.md +82 -0
  40. package/skills/cometchat-ios-testing/SKILL.md +57 -0
  41. package/skills/cometchat-ios-troubleshooting/SKILL.md +45 -0
  42. package/skills/cometchat-migrate-from-getstream/SKILL.md +65 -0
  43. package/skills/cometchat-migrate-from-getstream/references/concept-map.md +98 -0
  44. package/skills/cometchat-migrate-from-getstream/references/data-migration.md +74 -0
  45. package/skills/cometchat-migrate-from-getstream/references/feature-map.md +108 -0
  46. package/skills/cometchat-migrate-from-getstream/references/inventory.md +82 -0
  47. package/skills/cometchat-migrate-from-getstream/references/native-build.md +9 -0
  48. package/skills/cometchat-migrate-from-getstream/references/report-template.md +59 -0
  49. package/skills/cometchat-migrate-from-sendbird/SKILL.md +64 -0
  50. package/skills/cometchat-migrate-from-sendbird/references/concept-map.md +99 -0
  51. package/skills/cometchat-migrate-from-sendbird/references/data-migration.md +74 -0
  52. package/skills/cometchat-migrate-from-sendbird/references/feature-map.md +104 -0
  53. package/skills/cometchat-migrate-from-sendbird/references/inventory.md +86 -0
  54. package/skills/cometchat-migrate-from-sendbird/references/native-build.md +10 -0
  55. package/skills/cometchat-migrate-from-sendbird/references/report-template.md +59 -0
  56. package/skills/cometchat-migrate-from-twilio/SKILL.md +52 -0
  57. package/skills/cometchat-migrate-from-twilio/references/concept-map.md +49 -0
  58. package/skills/cometchat-migrate-from-twilio/references/data-migration.md +50 -0
  59. package/skills/cometchat-migrate-from-twilio/references/feature-map.md +27 -0
  60. package/skills/cometchat-migrate-from-twilio/references/inventory.md +53 -0
  61. package/skills/cometchat-migrate-from-twilio/references/report-template.md +52 -0
  62. package/skills/cometchat-moderation/SKILL.md +58 -0
  63. package/skills/cometchat-onboarding/SKILL.md +4 -1
  64. package/skills/cometchat-onboarding/references/platforms.md +15 -0
  65. package/skills/cometchat-react-native-core/SKILL.md +25 -3
  66. package/skills/cometchat-react-native-core/references/docs-map.md +2 -1
  67. package/skills/cometchat-react-native-production/SKILL.md +1 -0
  68. package/skills/cometchat-react-native-sdk/SKILL.md +16 -9
  69. package/skills/cometchat-react-native-troubleshooting/SKILL.md +58 -0
  70. package/skills/cometchat-react-v7-core/SKILL.md +4 -4
  71. package/skills/cometchat-react-v7-core/references/anti-patterns.md +1 -1
  72. package/skills/cometchat-react-v7-core/references/component-props.md +1 -1
  73. package/skills/cometchat-react-v7-core/references/layout.md +4 -12
  74. package/skills/cometchat-react-v7-production/SKILL.md +84 -0
  75. package/skills/cometchat-react-v7-testing/SKILL.md +60 -0
  76. package/skills/cometchat-react-v7-troubleshooting/SKILL.md +47 -0
  77. package/skills/cometchat-security/SKILL.md +80 -0
  78. package/skills/cometchat-self-host/SKILL.md +56 -0
  79. package/test-suite/catalogs/flutter-calls-v5.json +1 -1
  80. package/test-suite/scripts/lint-skills.mjs +30 -7
  81. package/test-suite/scripts/verify-family-agnostic.mjs +5 -1
  82. package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +0 -22
  83. package/skills/cometchat-react-v7-core/references/troubleshooting.md +0 -28
@@ -13,7 +13,7 @@
13
13
  "skills": "./skills",
14
14
  "strict": true,
15
15
  "description": "UI Kit skills for integrating CometChat across React v7, Angular v5, React Native v5, Android v6 (Kotlin/Compose), iOS v5 (Swift/UIKit, SPM) and Flutter v6. The /cometchat dispatcher detects your project — web (React on Vite/Next/CRA, or Angular) or mobile (React Native/Expo, Android, iOS, Flutter) — and routes to task-shaped skills (core, components, placement, customization, features, calls, push, migration; plus platform patterns). Headless Calls SDK skills cover calling without a UI Kit. Run `/cometchat add chat to my app` to start. Thin entry with progressive disclosure. Backed by a deterministic CLI and a CI-gated verification pipeline: every skill is checked against its pinned kit (symbol catalog + compile fence), and several families also pass a live simulator/emulator smoke (per-family status in peers.yaml).",
16
- "version": "5.0.0",
16
+ "version": "5.0.1",
17
17
  "author": {
18
18
  "name": "CometChat"
19
19
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://code.claude.com/schemas/plugin.json",
3
3
  "name": "cometchat-skills",
4
- "version": "5.0.0",
4
+ "version": "5.0.1",
5
5
  "description": "CometChat AI-coding skills — add real-time chat, voice/video calling and push to your app via your AI coding agent, across React v7, Angular v5, React Native v5, Android v6 (Kotlin/Compose), iOS v5 (Swift/UIKit, SPM) and Flutter v6. Ships the first-party CometChat Docs MCP so skills read always-current docs automatically; falls back to a guided MCP add, then to a direct docs fetch.",
6
6
  "author": {
7
7
  "name": "CometChat",
package/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # v5.0.1
2
+
3
+ ## New
4
+ - **Migrate from another chat provider in one prompt.** Added **Sendbird → CometChat** and **Stream (GetStream) → CometChat** migration skills, installed for every platform. From a single "migrate my app to CometChat" prompt they inventory the app, replace each supported feature with its CometChat equivalent, remove the features CometChat has no equivalent for (and list them), rewire the token server and webhooks, and write a data-migration script for users, groups and message history — then run the import for you once the app migration is done and you provide credentials (dry-run first, then import).
5
+ - The data-migration script works within CometChat's [Data Import](https://www.cometchat.com/docs/rest-api/data-import) limits (batch size and rate) and the ~6-month message-retention window (reach out to CometChat to import older history).
6
+
7
+ ---
8
+
1
9
  # v5.0.0
2
10
 
3
11
  ## New
package/MIGRATING.md ADDED
@@ -0,0 +1,187 @@
1
+ # Migrating from Sendbird or Stream (GetStream) to CometChat
2
+
3
+ This guide takes an existing chat app built on **Sendbird** or **Stream Chat** and moves it to
4
+ **CometChat** — in a single prompt to your AI coding agent. The agent does the whole job: it finds
5
+ every place your app uses the old vendor, swaps each supported feature for its CometChat equivalent,
6
+ removes the few features CometChat has no equivalent for, rewrites your token server and webhooks,
7
+ writes a script to import your users and message history, uninstalls the vendor, and checks the build.
8
+
9
+ It works whether your app uses the vendor's **UI Kit** (their prebuilt chat components) or their
10
+ **SDK / low-level client** (your own UI on their client) — or a mix of both. Every CometChat API it
11
+ writes is fetched from the live CometChat docs, never guessed.
12
+
13
+ Supported app platforms: **React, Angular, React Native / Expo, iOS, Android, Flutter.**
14
+
15
+ ---
16
+
17
+ ## Before you start (prerequisites)
18
+
19
+ 1. **A CometChat account and app.** Sign up free at [app.cometchat.com](https://app.cometchat.com)
20
+ and create an app. From **Dashboard → your app**, note the **App ID**, **Region**, and **Auth Key**
21
+ (under *Credentials*). For importing history you'll also create a **REST API key** (full access) —
22
+ see step 6.
23
+ - Create your CometChat app yourself. The migration never creates one for you.
24
+ 2. **Node.js 18 or newer** (for `npx` and the data-import script).
25
+ 3. **Your app builds today**, on the vendor, with your normal build command. Migrating an app that
26
+ doesn't build first only hides which errors were yours.
27
+ 4. **A clean git working tree.** The agent works on a new `cometchat-migration` branch and never
28
+ commits — but start from a clean state so the diff is easy to review.
29
+ 5. **Your AI coding agent** with the CometChat skills installed (next step). Claude Code is the
30
+ default; Cursor, Copilot, Windsurf, Cline, Continue, Gemini, Kiro, Replit and others are supported.
31
+
32
+ ---
33
+
34
+ ## Step 1 — Install the CometChat skills into your project
35
+
36
+ From your project root:
37
+
38
+ ```bash
39
+ npx @cometchat/skills add
40
+ ```
41
+
42
+ That installs the skills for Claude Code and connects the CometChat Docs MCP. For another agent, pass
43
+ `--ide` (for example `--ide cursor`); run `npx @cometchat/skills add --help` for the full list. Commit
44
+ the installed skill files if you want your whole team to share them.
45
+
46
+ > The skills that do the migration — `cometchat-migrate-from-sendbird` and
47
+ > `cometchat-migrate-from-getstream` — are installed for every platform, so you don't pick one; the
48
+ > agent selects the right one from what your project uses.
49
+
50
+ ## Step 2 — (Optional) fetch your credentials without copy-paste
51
+
52
+ You can paste your App ID / Region / Auth Key by hand later, or let the credentials CLI fetch them:
53
+
54
+ ```bash
55
+ npx @cometchat/skills-cli@3 auth login # opens the dashboard in your browser
56
+ npx @cometchat/skills-cli@3 provision run # writes .cometchat/config.json (git-ignored, owner-only)
57
+ ```
58
+
59
+ The migration reuses `.cometchat/config.json` if it's there, so this saves a step. Skip it if you'd
60
+ rather paste.
61
+
62
+ ## Step 3 — Ask your agent to migrate
63
+
64
+ Open your project in your agent and say:
65
+
66
+ ```
67
+ migrate my app to CometChat
68
+ ```
69
+
70
+ That's the whole instruction. You don't name the vendor — the agent detects Sendbird or Stream from
71
+ your dependencies. It then runs end-to-end **without stopping to ask you questions**, taking sensible
72
+ defaults and recording each one in the report at the end.
73
+
74
+ You can also be explicit: *"migrate my app from Sendbird to CometChat"* /
75
+ *"replace Stream Chat with CometChat"*.
76
+
77
+ ### What the agent does, in order
78
+
79
+ 1. **Detects** your framework and which vendor you're on, and creates a `cometchat-migration` git branch.
80
+ 2. **Inventories** every use of the vendor: UI Kit screens, SDK/client calls, event handlers, calls,
81
+ push, the token server, webhooks, env vars and tests.
82
+ 3. **Maps each feature** to CometChat, checking the CometChat docs at both levels — the **UI Kit** and
83
+ the **Chat SDK / REST API**. A feature with a UI Kit component is wired with that component; a
84
+ feature with only an SDK method is built on that method in your own UI. Every API is taken from the
85
+ live docs.
86
+ 4. **Installs CometChat** and wires init → login → render, keeping your own screens and routes.
87
+ 5. **Replaces usage file by file** — UI Kit components for UI-Kit apps, CometChat SDK calls for
88
+ client-mode apps, or both for a mixed app.
89
+ 6. **Removes, in full,** any feature CometChat genuinely doesn't offer (code, buttons, routes,
90
+ dependencies) — no dead ends left behind.
91
+ 7. **Rewrites the server side** — your token endpoint mints CometChat auth tokens; your webhooks map
92
+ to CometChat webhooks.
93
+ 8. **Writes a data-migration script** (`scripts/cometchat-migration/`) for your users, groups and
94
+ history, then — once the app migration is done — asks for your credentials and **runs the import
95
+ for you** (dry-run first, then import). If you don't share credentials, it's left for you to run.
96
+ 9. **Uninstalls the vendor** and re-runs your package manager.
97
+ 10. **Verifies the build** and writes `COMETCHAT_MIGRATION.md`.
98
+
99
+ ## Step 4 — Read the report
100
+
101
+ At the repo root you'll find **`COMETCHAT_MIGRATION.md`**, and the agent ends its reply with its two
102
+ key lists:
103
+
104
+ - **Removed — not available in CometChat.** Each row names the feature, the files it touched, what
105
+ users lose, and the closest CometChat alternative. Review these — this is where you decide whether to
106
+ rebuild anything a different way or drop it.
107
+ - **Your action items.** The remaining manual steps (below), in order.
108
+
109
+ ## Step 5 — Add your credentials and run it
110
+
111
+ If you didn't do step 2, put your credentials in the env file the report names (for React that's an
112
+ untracked `.env.local` with `VITE_COMETCHAT_APP_ID` / `VITE_COMETCHAT_REGION` /
113
+ `VITE_COMETCHAT_AUTH_KEY`), then start the app:
114
+
115
+ ```bash
116
+ npm run dev
117
+ ```
118
+
119
+ Sign in as one of **your own** users — the UID your server's `toCometChatId()` produces for them,
120
+ created in Dashboard → **Users** or by the import in Step 6. (A fresh app also seeds sample users such
121
+ as `cometchat-uid-1`; they're fine for a quick smoke test, but never hardcode one — production login is
122
+ your server-minted auth token.) You should see your conversations and be able to send a message.
123
+
124
+ ## Step 6 — Import your existing users and history
125
+
126
+ Once the app migration is done, the agent asks for your credentials and runs `scripts/cometchat-migration/` for you (dry-run first, then import). If you didn't share credentials at the time, run it yourself:
127
+
128
+ 1. In the CometChat Dashboard, create a **REST API key** with full access.
129
+ 2. Read `scripts/cometchat-migration/README.md`, set the environment variables it lists (your vendor
130
+ export credentials + your CometChat App ID / Region / REST API key).
131
+ 3. **Dry-run first**, then import:
132
+ ```bash
133
+ node scripts/cometchat-migration/migrate.mjs --dry-run
134
+ node scripts/cometchat-migration/migrate.mjs
135
+ ```
136
+ 4. Spot-check a few conversations in the app, then delete the export files (they hold user data).
137
+
138
+ The import uses CometChat's [Data Import API](https://www.cometchat.com/docs/rest-api/data-import) and
139
+ respects its limits (50 records per request, 60 requests per minute). Re-running it is safe.
140
+
141
+ **Choose a cut-over strategy:**
142
+ - **Hard switch (default here)** — export from the old vendor, import into CometChat, deploy. Simplest; do it in a maintenance window so no messages are sent mid-copy. The generated script does this.
143
+ - **Zero-downtime live migration** — keep both systems in sync while users roll onto the new build gradually. This bridges the two providers and is set up with CometChat's team: [contact sales](https://www.cometchat.com/contact-sales). Pick this if you can't take a window.
144
+ See [Data Import and Migration](https://www.cometchat.com/docs/fundamentals/data-import-and-migration) for both.
145
+
146
+ ## Step 7 — Go to production
147
+
148
+ - Enable in the CometChat Dashboard any features the report lists (extensions, AI, Search, etc.).
149
+ - For push, upload your FCM / APNs credentials to CometChat.
150
+ - Point your webhooks at the new receiver and pick the events.
151
+ - **Switch login from the dev Auth Key to server-minted auth tokens.** The Auth Key is for development
152
+ only; in production your server mints a per-user token
153
+ ([auth tokens](https://www.cometchat.com/docs/rest-api/auth-tokens)) and the client logs in with
154
+ `loginWithAuthToken()`. The agent leaves this as an action item and, where your app already had a
155
+ token server, wires it for you.
156
+ - Remove the old vendor's secrets from your CI and hosting, and deactivate the vendor app after the
157
+ cut-over.
158
+
159
+ ---
160
+
161
+ ## What migrates, and what doesn't
162
+
163
+ **Migrated** (fetched from the CometChat docs): 1:1 and group chat, conversation list, send / edit /
164
+ delete, typing indicators, read/delivery receipts, attachments, threads, reactions, mentions, polls,
165
+ message search, translation, link previews, presence, group membership and moderation, calls, and push
166
+ — wherever CometChat offers them for your platform.
167
+
168
+ **Removed** (no CometChat equivalent, examples): scheduled messages, atomic channel counters, custom
169
+ slash commands, arbitrary location sharing, Stream Activity Feeds, and vendor-only dev/QA tooling.
170
+ Every removal is listed in the report with its files and the closest alternative.
171
+
172
+ **Changed** (works differently): open/livestream channels become public groups; very large groups
173
+ (over 300 members) don't send receipts or typing indicators; a fresh group appears in the list after
174
+ its first message.
175
+
176
+ ---
177
+
178
+ ## Notes
179
+
180
+ - **One CometChat app for dev, one for production** is the recommended setup; migrate against dev
181
+ first.
182
+ - **Identity is preserved.** Your existing user IDs are converted to valid CometChat UIDs by one shared
183
+ rule used by the client, the server and the import script, so logins and imported history line up.
184
+ - **Nothing is destroyed.** The agent works on a branch and never force-deletes non-vendor code; your
185
+ vendor code is what it removes, by design.
186
+ - If no Sendbird or Stream usage is found, the agent says so and points you at
187
+ `npx @cometchat/skills add` for a fresh integration instead.
package/README.md CHANGED
@@ -31,6 +31,24 @@ add chat to my app
31
31
 
32
32
  The `cometchat` dispatcher routes to `cometchat-onboarding` (discover → understand → plan → approve), then hands a scoped build directive to that platform's `-core` skill, pulling in the others as the approved plan needs them (components, placement, theming, features, calls, push). Iterate afterward — *"add reactions" · "switch to dark mode" · "add a details side panel" · "switch to server-minted auth tokens"* (production auth — server-minted `loginWithAuthToken` — is covered inside each family's `-core` credentials/lifecycle guidance, and by the dedicated `-production` skill where one exists).
33
33
 
34
+ ### Migrating from Sendbird or Stream (GetStream)
35
+
36
+ ```
37
+ migrate my app to CometChat
38
+ ```
39
+
40
+ In a project that uses Sendbird or Stream Chat, this one prompt runs the whole migration, with no plan/approve round-trip. `detect` spots the vendor (`migrate_from`), and `cometchat-migrate-from-sendbird` / `cometchat-migrate-from-getstream` then:
41
+ - works on a `cometchat-migration` git branch;
42
+ - replaces every supported feature with its CometChat equivalent on your platform's UI Kit or SDK;
43
+ - **fully removes** the features CometChat doesn't have (code, UI entry points, dependencies);
44
+ - rewires your server's token endpoint and webhooks;
45
+ - writes a data-migration script for users, groups and message history and runs it for you once you provide the credentials (after the app migration is done);
46
+ - uninstalls the vendor and checks that the build passes.
47
+
48
+ It ends with `COMETCHAT_MIGRATION.md` and prints two lists: what was removed, and what you still need to do (credentials, dashboard toggles, running the import).
49
+
50
+ **Full step-by-step guide (prerequisites, install, run, data import, go-live):** [MIGRATING.md](MIGRATING.md).
51
+
34
52
  ## Credentials (dashboard CLI)
35
53
 
36
54
  A separate, dashboard-only CLI fetches your App ID / Region / Auth Key so you don't paste them by hand:
@@ -44,7 +62,7 @@ The CLI is dashboard/API-only (`auth · provision · config · features`) — it
44
62
 
45
63
  ## What's in the pack
46
64
 
47
- A thin `cometchat` router + a `cometchat-onboarding` journey, then a **full skill set per platform**. Every UI-Kit family ships `core` (install · credentials · init→login→render · the golden-path chat surface) plus, as the platform needs them, `components · placement · customization · features · calls · push · migration` and platform extras (`patterns`, `production`, `testing`, `troubleshooting`, `events`, the Android `compose-*` / `kotlin-*` cohorts):
65
+ A thin `cometchat` router + a `cometchat-onboarding` journey + two competitor-migration skills (`cometchat-migrate-from-sendbird`, `cometchat-migrate-from-getstream`, installed for every platform), then a **full skill set per platform**. Every UI-Kit family ships `core` (install · credentials · init→login→render · the golden-path chat surface) plus, as the platform needs them, `components · placement · customization · features · calls · push · migration` and platform extras (`patterns`, `production`, `testing`, `troubleshooting`, `events`, the Android `compose-*` / `kotlin-*` cohorts):
48
66
 
49
67
  | Family | UI Kit package | Consumption |
50
68
  |---|---|---|
package/RULES.md CHANGED
@@ -4,7 +4,7 @@
4
4
  # which governs how skills are AUTHORED. Keep them in sync when a rule changes.)
5
5
 
6
6
  ## Code safety
7
- - APPEND, never REPLACE the user's code. Additive diffs only. Never delete a competing SDK's files/deps without an explicit, waited-for confirmation.
7
+ - APPEND, never REPLACE the user's code. Additive diffs only. Never delete a competing SDK's files/deps without an explicit, waited-for confirmation. (An explicit request to migrate off that SDK IS that confirmation — see § Competitor migration.)
8
8
  - No speculative scaffolding; reuse the developer's existing primitives; golden-path defaults over prop sprawl.
9
9
 
10
10
  ## Platform / package integrity
@@ -105,6 +105,17 @@
105
105
  - Reuse the built-in back affordance, don't hand-roll it: `CometChatMessageHeader` ships `hideBackButton` (default `false`) + `onBack()`. On mobile wire `onBack` to clear the selection (pop to the list); on wide set `hideBackButton` (the list is always present).
106
106
  - Web recipe: drive the visible pane from selection state + `window.matchMedia("(max-width: 768px)")` (SSR-guarded, with a `change` listener). Panes need explicit height; never transition them with `transform` on a chat wrapper (clips the kit's `position:fixed` overlays — animate `right`/`left`/width). Native (RN/Flutter): stack navigation, one screen per route. Depth + recipe live in your platform's `placement` skill.
107
107
 
108
+ ## Competitor migration (Sendbird / Stream) — the one-prompt exception
109
+ - "Migrate my app to CometChat / from Sendbird / from Stream (GetStream)" routes to `cometchat-migrate-from-sendbird` / `cometchat-migrate-from-getstream` (detect reports the vendor as `migrate_from`). That request is the user's explicit, up-front approval for the WHOLE migration, so, only inside those skills:
110
+ - Removing the vendor's code, UI, dependencies and config is the requested outcome, not a violation of append-never-replace. Non-vendor code is still never deleted, only rewired.
111
+ - Every ask-and-wait point in a companion skill takes its documented default and is listed under "Defaults taken" in the migration report. The clarification contract is suspended for that run; nothing else is.
112
+ - A feature CometChat has no equivalent for (not in the family's `features.json` AND not in the docs) is REMOVED fully — code, entry points, state, deps — never left as a dead button. Every removal is listed in the final report.
113
+ - A docs lookup that fails because of TOOLING (Docs MCP down, network blocked) is never evidence a feature is unsupported: follow the 3-tier docs ladder, and if still unverifiable, KEEP the feature and flag it — never remove on a tool outage.
114
+ - **The app's OWN name is residue you must not silently rewrite.** A vendor-named project keeps matching the zero-residue grep after a complete migration: the Xcode project/scheme/workspace and Podfile target, the Android package directory and Gradle `namespace`/`applicationId`, the bundle id. Rename what is safe (the JS module name in `app.json` with its `AppDelegate`/`MainActivity` counterparts, the display name, the launch screen) and REPORT the rest as an action item with exact paths — renaming a project, package or bundle id changes the app's identity (signing, store listing, upgrade path) and is the user's call. Never claim zero residue while those files still match: name them and say why they were left.
115
+ - **Renaming a vendor-named storage key signs every existing user out.** `<vendor>@credential` -> `app@credential` collides with "returning users are logged in before the chat renders": the app boots, finds nothing under the new key, and shows the sign-in screen to people who were already signed in. Keep the old key, or read it once as a fallback and migrate the value across — and say which under Behavior changes in the report.
116
+ - Unchanged even here: never provision a CometChat app (use placeholders + an action item); never print secrets; never commit or push (work on a `cometchat-migration` branch); `version_conflict` still stops the build.
117
+ - **Data-migration script:** write it during the migration, but run it ONLY after the app migration is complete AND the user hands over the credentials it needs (the source keys + the CometChat App ID / Region / full-access REST API key). Ask for those credentials once the app is migrated — that credential prompt is the one question the single-prompt contract allows — then run it from env vars (never hardcoded, never committed). If the user declines to share credentials, leave running it as an action item.
118
+
108
119
  ## The CLI is a dashboard/API client only (loaded on demand)
109
120
  - **Env-writing and codegen are the SKILL's job** — done by reading your repo and emitting code, never a CLI command. **Detection** is `npx @cometchat/skills detect --json` (the skills pack's offline probe: framework, UI Kit + `version_conflict`, `existing_cometchat` = a CometChat UI Kit/SDK dependency is present), topped up by the skill's own repo read. The dashboard CLI (`@cometchat/skills-cli`, loaded on demand) does DASHBOARD/API operations only: `auth` (dashboard login) + `provision` (fetch an app's App ID/Region/Auth Key) + `config` + **`features`** (enable/disable dashboard **extensions + AI** for an app — `features list`/`enable <id>`/`disable <id>`). It writes no code and knows no framework (see your platform's `core` skill -> `references/setup-credentials.md`). For a feature: the CLI `features enable <id>` flips the DASHBOARD toggle; the SKILL wires the component/prop in code. Installing/refreshing the skill files is the separate `@cometchat/skills add`.
110
121
 
@@ -424,6 +424,9 @@ function detect() {
424
424
  "this looks like a Swift server/CLI package. If it IS an iOS app, pass --family ios.";
425
425
  }
426
426
  }
427
+ // Competitor SDKs (Sendbird / Stream) → the cross-family migration skill that replaces them.
428
+ // null when none — additive, so existing consumers of detect --json are unaffected.
429
+ result.migrate_from = detectMigrations();
427
430
  return result;
428
431
  }
429
432
 
@@ -455,7 +458,100 @@ function peers() {
455
458
  list[i].features = (block.match(/features:\s*(\S+\.json)/) || [])[1];
456
459
  list[i].contracts = (block.match(/contracts:\s*(\S+\.json)/) || [])[1];
457
460
  });
458
- return { entry, peers: list };
461
+ const gate = (y.match(/^gate:\s*(\S+)/m) || [])[1] || "cometchat-onboarding";
462
+ const entSec = (y.match(/^enterprise:\s*\n([\s\S]*?)(?=^\S)/m) || [])[1] || "";
463
+ const enterprise = [...entSec.matchAll(/^\s*-\s*(\S+)/gm)].map((m) => m[1].trim());
464
+ const cfSec = (y.match(/^crossFamily:\s*\n([\s\S]*?)(?=^\S)/m) || [])[1] || "";
465
+ const crossFamily = [...cfSec.matchAll(/^\s*-\s*(\S+)/gm)].map((m) => m[1].trim());
466
+ return { entry, gate, peers: list, migrations: migrationsFrom(y), enterprise, crossFamily };
467
+ }
468
+
469
+ // `migrations:` (peers.yaml, above `peers:`): one cross-family competitor-migration skill per
470
+ // vendor + the dependency patterns `detect` reports as `migrate_from`. Patterns are single-quoted
471
+ // YAML scalars, so backslashes arrive literally and go straight into RegExp.
472
+ function migrationsFrom(y) {
473
+ const sec = (y.match(/^migrations:\s*\n([\s\S]*?)(?=^\S)/m) || [])[1] || "";
474
+ return sec.split(/^\s*-\s*vendor:/m).slice(1).map((block) => {
475
+ const vendor = (block.match(/^\s*(\S+)/) || [])[1];
476
+ const q = (k) => (block.match(new RegExp(`^\\s*${k}:\\s*'([^']*)'`, "m")) || [])[1] || null;
477
+ const label = (block.match(/label:\s*"([^"]+)"/) || [])[1] || vendor;
478
+ const skill = (block.match(/skill:\s*(\S+)/) || [])[1];
479
+ return { vendor, label, skill, npm: q("npm"), pub: q("pub"), gradle: q("gradle"), ios: q("ios") };
480
+ }).filter((m) => m.vendor && m.skill);
481
+ }
482
+
483
+ // Platform-NEUTRAL skills: installed for every family (entry router, onboarding gate, and the
484
+ // competitor-migration skills). One list, read from peers.yaml, so `add`, the orienting router
485
+ // and the family filter never disagree about what is shared.
486
+ function neutralSkillDirs() {
487
+ const p = peers();
488
+ return new Set([p.entry || "cometchat", p.gate, ...(p.migrations || []).map((m) => m.skill), ...(p.enterprise || []), ...(p.crossFamily || [])].filter(Boolean));
489
+ }
490
+
491
+ // Workspace package dirs for a monorepo: npm/yarn `workspaces` + pnpm-workspace.yaml. A monorepo
492
+ // keeps the vendor dependency in apps/<x>/package.json, not the root. Globs are scanned one level
493
+ // only (`apps/*`; `apps/**` is treated the same, so a package nested deeper isn't found); `!`
494
+ // exclusions are honored; the result is capped.
495
+ function workspaceDirs() {
496
+ const pkg = readJSON(join(CWD, "package.json")) || {};
497
+ const ws = Array.isArray(pkg.workspaces) ? pkg.workspaces : (pkg.workspaces && pkg.workspaces.packages) || [];
498
+ let pnpm = "";
499
+ try { pnpm = readFileSync(join(CWD, "pnpm-workspace.yaml"), "utf8"); } catch { /* none */ }
500
+ const patterns = [...ws, ...[...pnpm.matchAll(/^\s*-\s*['"]?([^'"\n#]+?)['"]?\s*$/gm)].map((m) => m[1])];
501
+ const excluded = patterns.filter((g) => g.startsWith("!")).map((g) => g.slice(1).replace(/\/\*{1,2}$/, ""));
502
+ const dirs = [];
503
+ for (const g of patterns) {
504
+ if (g.startsWith("!")) continue;
505
+ const m = g.match(/^(.*?)\/\*{1,2}$/);
506
+ if (!m) { dirs.push(g); continue; }
507
+ try {
508
+ for (const d of readdirSync(join(CWD, m[1]), { withFileTypes: true }))
509
+ if (d.isDirectory() && d.name !== "node_modules") dirs.push(`${m[1]}/${d.name}`);
510
+ } catch { /* missing dir */ }
511
+ }
512
+ const kept = dirs.filter((d) => !excluded.some((x) => d === x || d.startsWith(`${x}/`)));
513
+ return [...new Set(kept)].slice(0, 50);
514
+ }
515
+
516
+ // Competitor SDKs present in THIS project (→ the migration skill to run). Reads dependency
517
+ // manifests only — names, not code — so it stays offline and cheap, like the rest of detect.
518
+ function detectMigrations() {
519
+ const read = (rel) => { try { return readFileSync(join(CWD, rel), "utf8"); } catch { return ""; } };
520
+ const depsOf = (p) => Object.keys({ ...((p && p.dependencies) || {}), ...((p && p.devDependencies) || {}) });
521
+ // Root package.json + every workspace package (monorepo): the vendor dep may live in apps/<x>.
522
+ const npmSources = [["package.json", readJSON(join(CWD, "package.json"))],
523
+ ...workspaceDirs().map((d) => [`${d}/package.json`, readJSON(join(CWD, d, "package.json"))])]
524
+ .map(([where, p]) => [where, depsOf(p)]);
525
+ const pub = read("pubspec.yaml");
526
+ const pubDeps = [...pub.matchAll(/^\s+([a-z0-9_]+):/gm)].map((m) => m[1]);
527
+ const gradle = ["app/build.gradle", "app/build.gradle.kts", "build.gradle", "build.gradle.kts",
528
+ "settings.gradle", "settings.gradle.kts", "gradle/libs.versions.toml"].map(read).join("\n");
529
+ let entries = [];
530
+ try { entries = readdirSync(CWD); } catch { /* unreadable cwd */ }
531
+ const xcode = entries.filter((f) => f.endsWith(".xcodeproj") || f.endsWith(".xcworkspace"));
532
+ const ios = [read("Podfile"), read("Package.swift"), read("Package.resolved"),
533
+ ...xcode.flatMap((x) => [read(`${x}/project.pbxproj`),
534
+ read(`${x}/project.xcworkspace/xcshareddata/swiftpm/Package.resolved`),
535
+ read(`${x}/xcshareddata/swiftpm/Package.resolved`)])].join("\n");
536
+ const found = [];
537
+ for (const m of peers().migrations || []) {
538
+ const evidence = new Set();
539
+ const names = (pattern, list, where) => {
540
+ if (!pattern) return;
541
+ const re = new RegExp(pattern, "i");
542
+ for (const d of list) if (re.test(d)) evidence.add(`${where}:${d}`);
543
+ };
544
+ const text = (pattern, src, where) => {
545
+ if (!pattern || !src) return;
546
+ for (const hit of src.matchAll(new RegExp(pattern, "gi"))) evidence.add(`${where}:${hit[0].toLowerCase()}`);
547
+ };
548
+ for (const [where, deps] of npmSources) names(m.npm, deps, where);
549
+ names(m.pub, pubDeps, "pubspec.yaml");
550
+ text(m.gradle, gradle, "gradle");
551
+ text(m.ios, ios, "ios");
552
+ if (evidence.size) found.push({ vendor: m.vendor, label: m.label, skill: m.skill, evidence: [...evidence].slice(0, 8) });
553
+ }
554
+ return found.length ? found : null;
459
555
  }
460
556
 
461
557
  function shippedSkillDirs() {
@@ -483,6 +579,9 @@ function cmdDetect() {
483
579
  if (sig.length) console.log(`repo signals: ${sig.map(([k, v]) => `${k}=${v}`).join(" ")}`);
484
580
  if (r.version_conflict) console.log(`⚠️ version_conflict: ${r.version_conflict.detail} → STOP & reconcile (RULES §3)`);
485
581
  if (r.hint) console.log(`hint: ${r.hint}`);
582
+ for (const m of r.migrate_from || []) {
583
+ console.log(`migrate from: ${m.label} (${m.evidence.join(", ")}) → skill ${m.skill}`);
584
+ }
486
585
  });
487
586
  }
488
587
 
@@ -555,7 +654,7 @@ function sharedRootDirs() {
555
654
  return SHARED_ROOT_DIRS.filter((d) => existsSync(join(PACK_ROOT, d)));
556
655
  }
557
656
 
558
- // Only THIS project's family (+ the two platform-neutral skills) is installed.
657
+ // Only THIS project's family (+ the platform-neutral skills: router, gate, competitor migrations) is installed.
559
658
  // Installing every family let a React skill out-match its RN twin: React's
560
659
  // features triggers are unqualified ('add polls'), RN's say "React Native", so an
561
660
  // RN user asking "add polls" matched the WRONG framework's skill (AUDIT-101).
@@ -565,7 +664,7 @@ function sharedRootDirs() {
565
664
  function familySkillDirs(fam) {
566
665
  const all = shippedSkillDirs();
567
666
  if (!fam || !fam.dirPrefix) return all;
568
- const neutral = new Set([peers().entry || "cometchat", "cometchat-onboarding"]);
667
+ const neutral = neutralSkillDirs();
569
668
  return all.filter((d) => neutral.has(d) || d.startsWith(fam.dirPrefix));
570
669
  }
571
670
 
@@ -800,7 +899,7 @@ function generateOrientingMd(reg, dirs, refBase, fam) {
800
899
  const kit = (fam && fam.kit_package) || "";
801
900
  // Scope the table to THIS family + the platform-neutral router/gate. Listing
802
901
  // every family's skills is what let an RN agent read React rows (AUDIT-101).
803
- const shared = new Set([entry, "cometchat-onboarding"]);
902
+ const shared = neutralSkillDirs();
804
903
  const scoped = (fam && fam.dirPrefix)
805
904
  ? dirs.filter((d) => shared.has(d) || d.startsWith(fam.dirPrefix))
806
905
  : dirs;
@@ -821,8 +920,9 @@ function generateOrientingMd(reg, dirs, refBase, fam) {
821
920
  md += `## Start here\n\n`;
822
921
  md += `1. **Detect** — \`npx @cometchat/skills detect --json\` (framework, installed UI Kit, version_conflict). If \`version_conflict\` is non-null, STOP and reconcile before touching code.\n`;
823
922
  md += `2. **Already integrated?** If \`detect\` says \`existing_cometchat: true\`, this is a TASK, not an integration — go **straight** to the matching skill in the table above and skip onboarding. "Change my avatar", "add a logout button", "add polls", "restyle the bubble" are all tasks. Do NOT re-run the plan/approve journey, and do NOT fall back to reading \`node_modules\` when the phrasing is not an exact match — pick the closest row and open it.\n`;
824
- md += `3. **Route** open \`${refBase}/${entry}/SKILL.md\` (the dispatcher); it points to the right task skill for the request.\n`;
825
- md += `4. **Follow the skill** — it carries the exact init→login→render, the component props, and the verify steps.\n\n`;
923
+ md += `3. **Migrating off Sendbird or Stream?** If the user asks to migrate/switch/replace and \`detect\` reports \`migrate_from\` (or the user names the vendor), open that entry's \`skill\` from the table it runs the whole migration in one pass (no onboarding) and ends with the list of removed features.\n`;
924
+ md += `4. **Route** — open \`${refBase}/${entry}/SKILL.md\` (the dispatcher); it points to the right task skill for the request.\n`;
925
+ md += `5. **Follow the skill** — it carries the exact init→login→render, the component props, and the verify steps.\n\n`;
826
926
 
827
927
  md += `## Hard rules (full text in \`${refBase}/RULES.md\`)\n\n`;
828
928
  md += `- **APPEND, never replace** the user's code — additive diffs; confirm before bulk edits.\n`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cometchat/skills",
3
- "version": "5.0.0",
3
+ "version": "5.0.1",
4
4
  "workspaces": [
5
5
  "packages/*"
6
6
  ],
@@ -17,6 +17,9 @@
17
17
  },
18
18
  "//verify:fences": "Tier-2 fences (verify:fences:web-v7, verify:fences:angular-v5) are in verify:ci but deliberately NOT in default verify: each needs its pinned kit installed in test-suite/typecheck/<family> (git-ignored, not shipped, no postinstall) and hard-exits code 2 when absent — so promoting them into verify would break verify in a clean checkout. Setup: npm run verify:fences:<family>:setup. Rationale + owner CI-cost decision: test-suite/README.md (AUDIT-030).",
19
19
  "scripts": {
20
+ "sync:plugin-version": "node scripts/sync-plugin-version.mjs",
21
+ "version": "node scripts/sync-plugin-version.mjs && git add .claude-plugin/plugin.json .claude-plugin/marketplace.json",
22
+ "verify:plugin-manifest": "node test-suite/scripts/verify-plugin-manifest.mjs",
20
23
  "lint:skills": "node test-suite/scripts/lint-skills.mjs",
21
24
  "verify:catalog": "node test-suite/scripts/verify-catalog.mjs --family web-v7 && node test-suite/scripts/verify-catalog.mjs --family angular-v5",
22
25
  "verify:catalog:strict": "node test-suite/scripts/verify-catalog.mjs --family web-v7 --strict-drift && node test-suite/scripts/verify-catalog.mjs --family angular-v5 --strict-drift",
@@ -34,7 +37,7 @@
34
37
  "verify:tokens": "node test-suite/scripts/measure-tokens.mjs --all --tolerance 10",
35
38
  "verify": "npm run lint:skills && npm run verify:catalog:selftest && npm run verify:family && npm run verify:detection && npm run verify:docs-base && npm run verify:fences:contract && npm run verify:oracle:angular-v5 && npm run verify:catalog && npm run verify:registry && npm run verify:tokens && npm run verify:predicate && npm run verify:catalog:flutter-v6 && npm run verify:registry:flutter-v6",
36
39
  "verify:catalog:sync": "node test-suite/scripts/verify-catalog-sync.mjs",
37
- "verify:ci": "npm run lint:skills && npm run verify:catalog:selftest && npm run verify:catalog:sync && npm run verify:family && npm run verify:detection && npm run verify:docs-base:strict && npm run verify:fences:contract && npm run verify:oracle:angular-v5 && npm run verify:catalog:strict && npm run verify:registry && npm run verify:fences:web-v7 && npm run verify:fences:angular-v5 && npm run verify:templates:angular-v5 && npm run verify:goldenpath:angular-v5 && npm run verify:tokens && npm run verify:predicate && npm run verify:catalog:flutter-v6 && npm run verify:registry:flutter-v6",
40
+ "verify:ci": "npm run lint:skills && npm run verify:catalog:selftest && npm run verify:catalog:sync && npm run verify:family && npm run verify:detection && npm run verify:docs-base:strict && npm run verify:fences:contract && npm run verify:oracle:angular-v5 && npm run verify:catalog:strict && npm run verify:registry && npm run verify:fences:web-v7 && npm run verify:fences:angular-v5 && npm run verify:templates:angular-v5 && npm run verify:goldenpath:angular-v5 && npm run verify:tokens && npm run verify:predicate && npm run verify:catalog:flutter-v6 && npm run verify:registry:flutter-v6 && npm run verify:plugin-manifest",
38
41
  "catalog:refresh": "node test-suite/scripts/catalog-refresh.mjs",
39
42
  "catalog:check": "node test-suite/scripts/catalog-refresh.mjs --check",
40
43
  "registry:build": "node test-suite/scripts/build-registry.mjs",
@@ -66,7 +69,8 @@
66
69
  "verify:goldenpath:angular-v5": "node test-suite/scripts/verify-golden-path.mjs --family angular-v5",
67
70
  "verify:catalog:selftest": "node test-suite/fixtures/catalog-extractor/selftest.mjs",
68
71
  "verify:swift-api:ios-v5:setup": "node test-suite/scripts/ios-resolve-interfaces.mjs --out test-suite/typecheck/ios-v5/.interfaces",
69
- "verify:swift-api:ios-v5": "node test-suite/scripts/verify-swift-docs-api.mjs --interface test-suite/typecheck/ios-v5/.interfaces/CometChatUIKitSwift.swiftinterface --interface test-suite/typecheck/ios-v5/.interfaces/CometChatSDK.swiftinterface --interface test-suite/typecheck/ios-v5/.interfaces/CometChatCallsSDK.swiftinterface --docs skills/cometchat-ios-core --docs skills/cometchat-ios-components --docs skills/cometchat-ios-placement --docs skills/cometchat-ios-customization --docs skills/cometchat-ios-features --docs skills/cometchat-ios-calls --docs skills/cometchat-ios-push --docs skills/cometchat-ios-migration"
72
+ "verify:swift-api:ios-v5": "node test-suite/scripts/verify-swift-docs-api.mjs --interface test-suite/typecheck/ios-v5/.interfaces/CometChatUIKitSwift.swiftinterface --interface test-suite/typecheck/ios-v5/.interfaces/CometChatSDK.swiftinterface --interface test-suite/typecheck/ios-v5/.interfaces/CometChatCallsSDK.swiftinterface --docs skills/cometchat-ios-core --docs skills/cometchat-ios-components --docs skills/cometchat-ios-placement --docs skills/cometchat-ios-customization --docs skills/cometchat-ios-features --docs skills/cometchat-ios-calls --docs skills/cometchat-ios-push --docs skills/cometchat-ios-migration",
73
+ "verify:m9:ios-v5:selftest": "node test-suite/fixtures/ios-v5/m9-swift-extractor-selftest.mjs"
70
74
  },
71
75
  "keywords": [
72
76
  "cometchat",
@@ -104,6 +108,7 @@
104
108
  },
105
109
  "files": [
106
110
  "CHANGELOG.md",
111
+ "MIGRATING.md",
107
112
  "bin",
108
113
  ".claude-plugin",
109
114
  "skills",
package/peers.yaml CHANGED
@@ -8,6 +8,49 @@ gate: cometchat-onboarding
8
8
  groups:
9
9
  web: [react, angular, js]
10
10
  mobile: [ios, react-native, android, flutter]
11
+ # COMPETITOR MIGRATION — cross-family skills (one per vendor, installed for EVERY family, like the
12
+ # gate). "Migrate my app to CometChat / from <vendor>" routes STRAIGHT to the vendor's skill: it runs
13
+ # the whole migration in one prompt (no onboarding gate) and lands on the detected family's core.
14
+ # `npx @cometchat/skills detect --json` reports `migrate_from` from these patterns — case-insensitive
15
+ # regexes over dependency NAMES (npm/pub) or manifest TEXT (gradle/ios: build files, Podfile,
16
+ # Package.swift, pbxproj, Package.resolved). Kept ABOVE `peers:` so no peer block parser sees them.
17
+ migrations:
18
+ - vendor: sendbird
19
+ label: "Sendbird"
20
+ skill: cometchat-migrate-from-sendbird
21
+ npm: '^(@sendbird/|sendbird)'
22
+ pub: '^sendbird_'
23
+ gradle: 'com\.sendbird[\w.:-]*'
24
+ ios: 'sendbird/sendbird-(uikit|chat-sdk|calls)-ios|Sendbird(UIKit|ChatSDK|Calls)|SendBird(UIKit|Calls|SDK)'
25
+ - vendor: twilio
26
+ label: "Twilio Conversations"
27
+ skill: cometchat-migrate-from-twilio
28
+ npm: '^(@twilio/conversations|twilio-conversations|twilio-chat)$'
29
+ pub: '^twilio_conversations'
30
+ gradle: 'com\.twilio:conversations[\w-]*'
31
+ ios: 'TwilioConversationsClient|twilio-conversations|pod\s+.TwilioConversations'
32
+ - vendor: getstream
33
+ label: "Stream (GetStream)"
34
+ skill: cometchat-migrate-from-getstream
35
+ npm: '^(stream-chat|@stream-io/stream-chat)'
36
+ pub: '^stream_chat'
37
+ gradle: 'io\.getstream:stream-chat[\w-]*'
38
+ ios: 'getstream/stream-chat-swift|pod\s+.StreamChat'
39
+ # Cross-family skills — authored once, installed for EVERY family (like the gate + migrations); client
40
+ # wiring delegates to the resolved family's core/production skill. `crossFamily:` = accessibility,
41
+ # localization, audit and analytics.
42
+ crossFamily:
43
+ - cometchat-a11y
44
+ - cometchat-i18n
45
+ - cometchat-audit
46
+ - cometchat-analytics
47
+ # Cross-family ENTERPRISE skills — server/REST/dashboard-side concerns, the same across platforms;
48
+ # installed for every family and routed as neutral pointers (not a peer's `skills:` list).
49
+ enterprise:
50
+ - cometchat-security
51
+ - cometchat-compliance
52
+ - cometchat-self-host
53
+ - cometchat-moderation
11
54
  peers:
12
55
  - platform: react
13
56
  label: "React v7 UI Kit"
@@ -29,7 +72,7 @@ peers:
29
72
  # SHIPPED skills. calls + push + migration are in this pack. push is a THIN, docs-first skill
30
73
  # (fetches the notifications docs; its live gate is blocked-external — can't auto-smoke push).
31
74
  # The headless JS SDK is NOT a separate skill (its methods are the per-feature fallback inside core).
32
- skills: [core, components, placement, customization, patterns, features, calls, push, migration]
75
+ skills: [core, components, placement, customization, patterns, features, calls, push, migration, production, testing, troubleshooting]
33
76
  install_policy: on-demand
34
77
  verified: true # Tier-1 catalog (exports-only web-v7.json) verified vs installed 7.1.0; Tier-2/3 via the demo app build + live smoke
35
78
  - platform: angular
@@ -281,9 +324,9 @@ peers:
281
324
  # SHIPPED skills. Deliberately NO composite/all-in-one component exists in v5, so `core` teaches
282
325
  # the host-composed chat screen (IOS-DOCS-001). `patterns` is omitted: iOS has no Vite/Next/CRA
283
326
  # equivalent to consolidate. `migration` covers the documented v4 -> v5 upgrade.
284
- skills: [core, components, placement, customization, features, calls, push, migration]
327
+ skills: [core, components, placement, customization, features, calls, push, migration, production, testing, troubleshooting]
285
328
  install_policy: on-demand
286
- verified: true # Tier-1 catalog (ios-v5.json, .swiftinterface-derived) verified vs the published 5.1.19 xcframework (sha256 matches the public Package.swift); Tier-3 = the native harness (xcodebuild + XCUITest on a simulator)
329
+ verified: true # Tier-1 catalog (ios-v5.json, .swiftinterface-derived) derived from the 5.1.x xcframework; skills pin exactly CometChatUIKitSwift 5.1.22 (see cometchat-ios-core/references/install.md — 5.1.19 was a packaging regression routed around). Refresh the catalog against 5.1.22 if the two ever diverge. Tier-3 = the native harness (xcodebuild + XCUITest on a simulator)
287
330
 
288
331
  # ── mobile / Flutter UI Kit v6 ────────────────────────────────────────────────
289
332
  # Onboarded via the factory's ADD-FRAMEWORK runbook. Detection: `npx @cometchat/skills detect`
@@ -25,6 +25,16 @@
25
25
  "version": "1.1.0",
26
26
  "role": "router"
27
27
  },
28
+ {
29
+ "name": "cometchat-a11y",
30
+ "version": "1.0.0",
31
+ "role": "skill"
32
+ },
33
+ {
34
+ "name": "cometchat-analytics",
35
+ "version": "1.0.0",
36
+ "role": "skill"
37
+ },
28
38
  {
29
39
  "name": "cometchat-android-v5-calls-sdk",
30
40
  "version": "1.0.0",
@@ -35,20 +45,50 @@
35
45
  "version": "1.0.0",
36
46
  "role": "skill"
37
47
  },
48
+ {
49
+ "name": "cometchat-audit",
50
+ "version": "1.0.0",
51
+ "role": "skill"
52
+ },
53
+ {
54
+ "name": "cometchat-compliance",
55
+ "version": "1.0.0",
56
+ "role": "skill"
57
+ },
38
58
  {
39
59
  "name": "cometchat-flutter-v5-sdk",
40
60
  "version": "1.0.0",
41
61
  "role": "skill"
42
62
  },
63
+ {
64
+ "name": "cometchat-i18n",
65
+ "version": "1.0.0",
66
+ "role": "skill"
67
+ },
43
68
  {
44
69
  "name": "cometchat-js-v5-sdk",
45
70
  "version": "1.0.0",
46
71
  "role": "skill"
47
72
  },
73
+ {
74
+ "name": "cometchat-moderation",
75
+ "version": "1.0.0",
76
+ "role": "skill"
77
+ },
48
78
  {
49
79
  "name": "cometchat-onboarding",
50
80
  "version": "1.0.0",
51
81
  "role": "skill"
82
+ },
83
+ {
84
+ "name": "cometchat-security",
85
+ "version": "1.0.0",
86
+ "role": "skill"
87
+ },
88
+ {
89
+ "name": "cometchat-self-host",
90
+ "version": "1.0.0",
91
+ "role": "skill"
52
92
  }
53
93
  ]
54
94
  }