@cometchat/skills 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/install.js +298 -41
- package/package.json +1 -1
- package/skills/cometchat/SKILL.md +146 -27
- package/skills/cometchat-a11y/SKILL.md +476 -0
- package/skills/cometchat-android-v5/SKILL.md +1 -1
- package/skills/cometchat-android-v5-calls/SKILL.md +413 -0
- package/skills/cometchat-android-v5-calls/references/README.md +53 -0
- package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +195 -0
- package/skills/cometchat-android-v5-calls/references/audio-controls.md +91 -0
- package/skills/cometchat-android-v5-calls/references/background-handling.md +168 -0
- package/skills/cometchat-android-v5-calls/references/call-layouts.md +123 -0
- package/skills/cometchat-android-v5-calls/references/call-logs.md +113 -0
- package/skills/cometchat-android-v5-calls/references/call-session.md +274 -0
- package/skills/cometchat-android-v5-calls/references/custom-ui.md +150 -0
- package/skills/cometchat-android-v5-calls/references/event-listeners.md +123 -0
- package/skills/cometchat-android-v5-calls/references/group-calls.md +205 -0
- package/skills/cometchat-android-v5-calls/references/idle-timeout.md +111 -0
- package/skills/cometchat-android-v5-calls/references/in-call-chat.md +134 -0
- package/skills/cometchat-android-v5-calls/references/join-session.md +120 -0
- package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +206 -0
- package/skills/cometchat-android-v5-calls/references/participant-management.md +110 -0
- package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +106 -0
- package/skills/cometchat-android-v5-calls/references/raise-hand.md +242 -0
- package/skills/cometchat-android-v5-calls/references/recording.md +101 -0
- package/skills/cometchat-android-v5-calls/references/ringing-integration.md +152 -0
- package/skills/cometchat-android-v5-calls/references/screen-sharing.md +82 -0
- package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +215 -0
- package/skills/cometchat-android-v5-calls/references/session-settings.md +121 -0
- package/skills/cometchat-android-v5-calls/references/setup.md +137 -0
- package/skills/cometchat-android-v5-calls/references/share-invite.md +151 -0
- package/skills/cometchat-android-v5-calls/references/video-controls.md +87 -0
- package/skills/cometchat-android-v5-calls/references/voip-calling.md +526 -0
- package/skills/cometchat-android-v5-components/SKILL.md +1 -1
- package/skills/cometchat-android-v5-core/SKILL.md +1 -1
- package/skills/cometchat-android-v5-customization/SKILL.md +1 -1
- package/skills/cometchat-android-v5-extensions/SKILL.md +1 -1
- package/skills/cometchat-android-v5-features/SKILL.md +1 -1
- package/skills/cometchat-android-v5-placement/SKILL.md +1 -1
- package/skills/cometchat-android-v5-production/SKILL.md +1 -1
- package/skills/cometchat-android-v5-push/SKILL.md +1 -1
- package/skills/cometchat-android-v5-testing/SKILL.md +1 -1
- package/skills/cometchat-android-v5-theming/SKILL.md +1 -1
- package/skills/cometchat-android-v5-troubleshooting/SKILL.md +1 -1
- package/skills/cometchat-android-v6/SKILL.md +1 -1
- package/skills/cometchat-android-v6-builder-settings/SKILL.md +1 -1
- package/skills/cometchat-android-v6-calls/SKILL.md +375 -0
- package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +97 -0
- package/skills/cometchat-android-v6-calls/references/call-layouts.md +91 -0
- package/skills/cometchat-android-v6-calls/references/call-session.md +163 -0
- package/skills/cometchat-android-v6-calls/references/device-management.md +171 -0
- package/skills/cometchat-android-v6-calls/references/group-calls.md +191 -0
- package/skills/cometchat-android-v6-calls/references/idle-timeout.md +107 -0
- package/skills/cometchat-android-v6-calls/references/in-call-chat.md +136 -0
- package/skills/cometchat-android-v6-calls/references/raise-hand.md +186 -0
- package/skills/cometchat-android-v6-calls/references/ringing-integration.md +176 -0
- package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +127 -0
- package/skills/cometchat-android-v6-calls/references/share-invite.md +105 -0
- package/skills/cometchat-android-v6-compose-components/SKILL.md +2 -2
- package/skills/cometchat-android-v6-compose-customization/SKILL.md +1 -1
- package/skills/cometchat-android-v6-compose-placement/SKILL.md +1 -1
- package/skills/cometchat-android-v6-compose-theming/SKILL.md +1 -1
- package/skills/cometchat-android-v6-core/SKILL.md +1 -1
- package/skills/cometchat-android-v6-events/SKILL.md +1 -1
- package/skills/cometchat-android-v6-extensions/SKILL.md +1 -1
- package/skills/cometchat-android-v6-features/SKILL.md +1 -1
- package/skills/cometchat-android-v6-kotlin-components/SKILL.md +1 -1
- package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +1 -1
- package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +1 -1
- package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +1 -1
- package/skills/cometchat-android-v6-migration/SKILL.md +398 -0
- package/skills/cometchat-android-v6-production/SKILL.md +1 -1
- package/skills/cometchat-android-v6-push/SKILL.md +1 -1
- package/skills/cometchat-android-v6-testing/SKILL.md +1 -1
- package/skills/cometchat-android-v6-troubleshooting/SKILL.md +1 -1
- package/skills/cometchat-angular-calls/SKILL.md +511 -0
- package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +95 -0
- package/skills/cometchat-angular-calls/references/call-layouts.md +106 -0
- package/skills/cometchat-angular-calls/references/call-session.md +167 -0
- package/skills/cometchat-angular-calls/references/custom-ui.md +231 -0
- package/skills/cometchat-angular-calls/references/device-management.md +135 -0
- package/skills/cometchat-angular-calls/references/group-calls.md +412 -0
- package/skills/cometchat-angular-calls/references/idle-timeout.md +145 -0
- package/skills/cometchat-angular-calls/references/in-call-chat.md +148 -0
- package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +205 -0
- package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +53 -0
- package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +183 -0
- package/skills/cometchat-angular-calls/references/picture-in-picture.md +285 -0
- package/skills/cometchat-angular-calls/references/raise-hand.md +167 -0
- package/skills/cometchat-angular-calls/references/recording-screen-share.md +267 -0
- package/skills/cometchat-angular-calls/references/ringing-integration.md +131 -0
- package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +100 -0
- package/skills/cometchat-angular-calls/references/share-invite.md +116 -0
- package/skills/cometchat-angular-components/SKILL.md +1 -1
- package/skills/cometchat-angular-core/SKILL.md +1 -1
- package/skills/cometchat-angular-customization/SKILL.md +1 -1
- package/skills/cometchat-angular-features/SKILL.md +1 -1
- package/skills/cometchat-angular-patterns/SKILL.md +1 -1
- package/skills/cometchat-angular-placement/SKILL.md +1 -1
- package/skills/cometchat-angular-production/SKILL.md +1 -1
- package/skills/cometchat-angular-push/SKILL.md +403 -0
- package/skills/cometchat-angular-testing/SKILL.md +333 -0
- package/skills/cometchat-angular-theming/SKILL.md +1 -1
- package/skills/cometchat-angular-troubleshooting/SKILL.md +1 -1
- package/skills/cometchat-astro-patterns/SKILL.md +1 -1
- package/skills/cometchat-calls/SKILL.md +358 -0
- package/skills/cometchat-calls/references/use-case-broadcast.md +194 -0
- package/skills/cometchat-calls/references/use-case-marketplace.md +158 -0
- package/skills/cometchat-calls/references/use-case-support.md +190 -0
- package/skills/cometchat-calls/references/use-case-team.md +169 -0
- package/skills/cometchat-calls/references/use-case-telehealth.md +154 -0
- package/skills/cometchat-components/SKILL.md +1 -1
- package/skills/cometchat-core/SKILL.md +1 -1
- package/skills/cometchat-customization/SKILL.md +2 -2
- package/skills/cometchat-features/SKILL.md +2 -2
- package/skills/cometchat-flutter-v5/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-calls/SKILL.md +325 -94
- package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +169 -0
- package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +98 -0
- package/skills/cometchat-flutter-v5-calls/references/call-session.md +330 -0
- package/skills/cometchat-flutter-v5-calls/references/device-management.md +120 -0
- package/skills/cometchat-flutter-v5-calls/references/group-calls.md +187 -0
- package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +97 -0
- package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +132 -0
- package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +160 -0
- package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +244 -0
- package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +193 -0
- package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +101 -0
- package/skills/cometchat-flutter-v5-calls/references/share-invite.md +142 -0
- package/skills/cometchat-flutter-v5-conversations/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-core/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-customization/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-events/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-messages/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-production/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-push/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-testing/SKILL.md +390 -0
- package/skills/cometchat-flutter-v5-theming/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +1 -1
- package/skills/cometchat-flutter-v5-users-groups/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-calls/SKILL.md +308 -243
- package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +134 -0
- package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +102 -0
- package/skills/cometchat-flutter-v6-calls/references/call-session.md +229 -0
- package/skills/cometchat-flutter-v6-calls/references/device-management.md +99 -0
- package/skills/cometchat-flutter-v6-calls/references/group-calls.md +190 -0
- package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +80 -0
- package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +122 -0
- package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +268 -0
- package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +171 -0
- package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +93 -0
- package/skills/cometchat-flutter-v6-calls/references/share-invite.md +102 -0
- package/skills/cometchat-flutter-v6-components/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-conversations/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-core/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-customization/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-events/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-features/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-messages/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-migration/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-placement/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-production/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-push/SKILL.md +452 -0
- package/skills/cometchat-flutter-v6-testing/SKILL.md +319 -0
- package/skills/cometchat-flutter-v6-theming/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +1 -1
- package/skills/cometchat-flutter-v6-users-groups/SKILL.md +1 -1
- package/skills/cometchat-i18n/SKILL.md +358 -0
- package/skills/cometchat-ios/SKILL.md +5 -5
- package/skills/cometchat-ios-calls/SKILL.md +409 -0
- package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +172 -0
- package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +189 -0
- package/skills/cometchat-ios-calls/references/call-layouts.md +136 -0
- package/skills/cometchat-ios-calls/references/call-session.md +221 -0
- package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +353 -0
- package/skills/cometchat-ios-calls/references/custom-ui.md +322 -0
- package/skills/cometchat-ios-calls/references/device-management.md +171 -0
- package/skills/cometchat-ios-calls/references/group-calls.md +396 -0
- package/skills/cometchat-ios-calls/references/idle-timeout.md +185 -0
- package/skills/cometchat-ios-calls/references/in-call-chat.md +183 -0
- package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +138 -0
- package/skills/cometchat-ios-calls/references/picture-in-picture.md +246 -0
- package/skills/cometchat-ios-calls/references/raise-hand.md +239 -0
- package/skills/cometchat-ios-calls/references/recording-screen-share.md +339 -0
- package/skills/cometchat-ios-calls/references/ringing-integration.md +142 -0
- package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +267 -0
- package/skills/cometchat-ios-calls/references/share-invite.md +152 -0
- package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +246 -0
- package/skills/cometchat-ios-calls/references/voip-cert-setup.md +166 -0
- package/skills/cometchat-ios-components/SKILL.md +1 -1
- package/skills/cometchat-ios-core/SKILL.md +1 -1
- package/skills/cometchat-ios-customization/SKILL.md +1 -1
- package/skills/cometchat-ios-features/SKILL.md +1 -1
- package/skills/cometchat-ios-placement/SKILL.md +1 -1
- package/skills/cometchat-ios-production/SKILL.md +1 -1
- package/skills/cometchat-ios-push/SKILL.md +1 -1
- package/skills/cometchat-ios-testing/SKILL.md +371 -0
- package/skills/cometchat-ios-theming/SKILL.md +1 -1
- package/skills/cometchat-ios-troubleshooting/SKILL.md +1 -1
- package/skills/cometchat-native-bare-patterns/SKILL.md +45 -3
- package/skills/cometchat-native-calls/SKILL.md +599 -0
- package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +203 -0
- package/skills/cometchat-native-calls/references/call-layouts.md +124 -0
- package/skills/cometchat-native-calls/references/call-session.md +182 -0
- package/skills/cometchat-native-calls/references/custom-ui.md +250 -0
- package/skills/cometchat-native-calls/references/device-management.md +135 -0
- package/skills/cometchat-native-calls/references/expo-vs-bare.md +179 -0
- package/skills/cometchat-native-calls/references/group-calls.md +291 -0
- package/skills/cometchat-native-calls/references/idle-timeout.md +128 -0
- package/skills/cometchat-native-calls/references/in-call-chat.md +143 -0
- package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +72 -0
- package/skills/cometchat-native-calls/references/picture-in-picture.md +276 -0
- package/skills/cometchat-native-calls/references/raise-hand.md +203 -0
- package/skills/cometchat-native-calls/references/recording-screen-share.md +290 -0
- package/skills/cometchat-native-calls/references/ringing-integration.md +118 -0
- package/skills/cometchat-native-calls/references/server-push-bridge.md +135 -0
- package/skills/cometchat-native-calls/references/server-push-payloads.md +193 -0
- package/skills/cometchat-native-calls/references/share-invite.md +144 -0
- package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +317 -0
- package/skills/cometchat-native-components/SKILL.md +1 -1
- package/skills/cometchat-native-core/SKILL.md +1 -1
- package/skills/cometchat-native-customization/SKILL.md +1 -1
- package/skills/cometchat-native-expo-patterns/SKILL.md +18 -1
- package/skills/cometchat-native-features/SKILL.md +1 -1
- package/skills/cometchat-native-placement/SKILL.md +1 -1
- package/skills/cometchat-native-production/SKILL.md +1 -1
- package/skills/cometchat-native-push/SKILL.md +1 -1
- package/skills/cometchat-native-testing/SKILL.md +1 -1
- package/skills/cometchat-native-theming/SKILL.md +1 -1
- package/skills/cometchat-native-troubleshooting/SKILL.md +1 -1
- package/skills/cometchat-nextjs-patterns/SKILL.md +1 -1
- package/skills/cometchat-placement/SKILL.md +1 -1
- package/skills/cometchat-production/SKILL.md +1 -1
- package/skills/cometchat-react-calls/SKILL.md +539 -0
- package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +145 -0
- package/skills/cometchat-react-calls/references/call-layouts.md +161 -0
- package/skills/cometchat-react-calls/references/call-session.md +235 -0
- package/skills/cometchat-react-calls/references/custom-ui.md +201 -0
- package/skills/cometchat-react-calls/references/device-management.md +206 -0
- package/skills/cometchat-react-calls/references/group-calls.md +262 -0
- package/skills/cometchat-react-calls/references/idle-timeout.md +175 -0
- package/skills/cometchat-react-calls/references/in-call-chat.md +212 -0
- package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +172 -0
- package/skills/cometchat-react-calls/references/picture-in-picture.md +245 -0
- package/skills/cometchat-react-calls/references/raise-hand.md +238 -0
- package/skills/cometchat-react-calls/references/recording-screen-share.md +143 -0
- package/skills/cometchat-react-calls/references/ringing-integration.md +255 -0
- package/skills/cometchat-react-calls/references/server-web-push-vapid.md +241 -0
- package/skills/cometchat-react-calls/references/share-invite.md +176 -0
- package/skills/cometchat-react-calls/references/testing-calls-on-web.md +198 -0
- package/skills/cometchat-react-calls/references/voip-and-web-push.md +165 -0
- package/skills/cometchat-react-patterns/SKILL.md +1 -1
- package/skills/cometchat-react-push/SKILL.md +448 -0
- package/skills/cometchat-react-router-patterns/SKILL.md +1 -1
- package/skills/cometchat-react-testing/SKILL.md +404 -0
- package/skills/cometchat-theming/SKILL.md +3 -3
- package/skills/cometchat-troubleshooting/SKILL.md +2 -2
package/bin/install.js
CHANGED
|
@@ -37,6 +37,13 @@ const SKILLS = [
|
|
|
37
37
|
// Dispatcher — shared across every family
|
|
38
38
|
{ name: "cometchat", families: ["web", "native", "flutter", "angular", "android", "ios"], description: "Entry point — detects framework, handles onboarding, guides integration" },
|
|
39
39
|
|
|
40
|
+
// Calls dispatcher — shared across every family (v4.1)
|
|
41
|
+
{ name: "cometchat-calls", families: ["web", "native", "flutter", "angular", "android", "ios"], description: "Calls entry point — routes to per-family -calls skill, picks standalone vs additive mode" },
|
|
42
|
+
|
|
43
|
+
// Cross-family polish (v4.1) — i18n + accessibility apply to every family
|
|
44
|
+
{ name: "cometchat-i18n", families: ["web", "native", "flutter", "angular", "android", "ios"], description: "Localization across all kits — CometChatLocalize.init/setLocale signature differences, RTL, fallback language, custom resources" },
|
|
45
|
+
{ name: "cometchat-a11y", families: ["web", "native", "flutter", "angular", "android", "ios"], description: "Accessibility (WCAG 2.1 AA) — contrast, keyboard nav, live regions for new messages, focus management on chat entry, prefers-reduced-motion, calls a11y" },
|
|
46
|
+
|
|
40
47
|
// Web (React / Next.js / React Router / Astro)
|
|
41
48
|
{ name: "cometchat-core", families: ["web"], description: "Foundational rules — init, login, CSS, env vars, SSR safety, provider" },
|
|
42
49
|
{ name: "cometchat-components", families: ["web"], description: "Component catalog — names, props, composition patterns" },
|
|
@@ -50,6 +57,9 @@ const SKILLS = [
|
|
|
50
57
|
{ name: "cometchat-customization", families: ["web"], description: "Component customization — custom views, builders, events" },
|
|
51
58
|
{ name: "cometchat-production", families: ["web"], description: "Production auth — token endpoints, user management, security" },
|
|
52
59
|
{ name: "cometchat-troubleshooting", families: ["web"], description: "Diagnostics — verify, drift, doctor, symptom lookup" },
|
|
60
|
+
{ name: "cometchat-react-calls", families: ["web"], description: "Web calls (v4.1) — Calls SDK install, dual-SDK init, Incoming/Outgoing/Ongoing, framework SSR safety" },
|
|
61
|
+
{ name: "cometchat-react-testing", families: ["web"], description: "Web testing (v4.1) — Vitest + RTL setup, mocking the SDK, Playwright e2e, init-resolves-before-render assertion, no-Auth-Key-in-source meta-test, CI" },
|
|
62
|
+
{ name: "cometchat-react-push", families: ["web"], description: "Web push (v4.1) — Service Worker + VAPID + Push API for new-message notifications, server-side webhook send, click-through routing, iOS PWA-only caveat" },
|
|
53
63
|
|
|
54
64
|
// React Native (Expo + bare RN)
|
|
55
65
|
{ name: "cometchat-native-core", families: ["native"], description: "RN: init, login, provider chain, env vars, anti-patterns" },
|
|
@@ -64,6 +74,7 @@ const SKILLS = [
|
|
|
64
74
|
{ name: "cometchat-native-push", families: ["native"], description: "RN push: APNs + FCM, dashboard providers, client registration, deep-link" },
|
|
65
75
|
{ name: "cometchat-native-testing", families: ["native"], description: "RN testing: Jest + RNTL, mocking the kit/SDK, Detox vs Maestro, CI" },
|
|
66
76
|
{ name: "cometchat-native-troubleshooting", families: ["native"], description: "RN troubleshooting: Metro cache, pod install, native module linking" },
|
|
77
|
+
{ name: "cometchat-native-calls", families: ["native"], description: "RN calls (v4.1) — Calls SDK + callkeep + voip-push + FCM, CallKit/ConnectionService, dev-client requirement" },
|
|
67
78
|
|
|
68
79
|
// Angular (12-15)
|
|
69
80
|
{ name: "cometchat-angular-core", families: ["angular"], description: "Angular: UIKitSettingsBuilder init, login order, environment config, provider" },
|
|
@@ -75,6 +86,9 @@ const SKILLS = [
|
|
|
75
86
|
{ name: "cometchat-angular-customization", families: ["angular"], description: "Angular: content projection, ng-template slots, custom views" },
|
|
76
87
|
{ name: "cometchat-angular-production", families: ["angular"], description: "Angular: server-minted auth tokens, user management, external-backend recipes" },
|
|
77
88
|
{ name: "cometchat-angular-troubleshooting", families: ["angular"], description: "Angular troubleshooting: build errors, module imports, Zone.js issues" },
|
|
89
|
+
{ name: "cometchat-angular-calls", families: ["angular"], description: "Angular calls (v4.1) — Calls SDK in APP_INITIALIZER, NgZone correctness, <cometchat-call-buttons> + <cometchat-incoming-call>" },
|
|
90
|
+
{ name: "cometchat-angular-testing", families: ["angular"], description: "Angular testing (v4.1) — Karma OR Jest, TestBed with CUSTOM_ELEMENTS_SCHEMA, NgZone-aware fakeAsync, Cypress e2e" },
|
|
91
|
+
{ name: "cometchat-angular-push", families: ["angular"], description: "Angular push (v4.1) — @angular/service-worker + ngsw-config, SwPush subscription, click-through via Router.navigateByUrl, Universal SSR guards" },
|
|
78
92
|
|
|
79
93
|
// Android native — both V5 (live, Java + Kotlin Views) and V6 (beta,
|
|
80
94
|
// Compose + Kotlin Views) ship together. The V5 + V6 dispatcher entries
|
|
@@ -92,6 +106,7 @@ const SKILLS = [
|
|
|
92
106
|
{ name: "cometchat-android-v5-extensions", families: ["android"], description: "V5 extensions — moderation, smart replies, message translation" },
|
|
93
107
|
{ name: "cometchat-android-v5-testing", families: ["android"], description: "V5 testing: Espresso, Robolectric, mocking the kit/SDK" },
|
|
94
108
|
{ name: "cometchat-android-v5-troubleshooting", families: ["android"], description: "V5 troubleshooting: gradle conflicts, manifest, lifecycle, ProGuard" },
|
|
109
|
+
{ name: "cometchat-android-v5-calls", families: ["android"], description: "V5 calls (v4.1) — calls-sdk-android Cloudsmith install, ConnectionService + FCM VoIP, foreground service, 16 deep references/" },
|
|
95
110
|
|
|
96
111
|
{ name: "cometchat-android-v6", families: ["android"], description: "V6 dispatcher — Compose + Kotlin Views (chatuikit-{compose,kotlin}-android:6.x)" },
|
|
97
112
|
{ name: "cometchat-android-v6-core", families: ["android"], description: "V6: gradle deps, init, login, message sending" },
|
|
@@ -111,6 +126,8 @@ const SKILLS = [
|
|
|
111
126
|
{ name: "cometchat-android-v6-push", families: ["android"], description: "V6 push: FCM, dashboard providers, deep-link" },
|
|
112
127
|
{ name: "cometchat-android-v6-testing", families: ["android"], description: "V6 testing: Espresso, Robolectric, Compose UI tests, mocking" },
|
|
113
128
|
{ name: "cometchat-android-v6-troubleshooting", families: ["android"], description: "V6 troubleshooting: gradle, Compose runtime, R8, BuildConfig" },
|
|
129
|
+
{ name: "cometchat-android-v6-calls", families: ["android"], description: "V6 calls (v4.1, beta) — calls bundled into chatuikit-{compose,kotlin}, .enableCalling(), surface-aware Compose+Views routing" },
|
|
130
|
+
{ name: "cometchat-android-v6-migration", families: ["android"], description: "V5→V6 migration recipes — gradle deps rewrite, UIKitSettings.Builder API, theme parent (CometChatTheme.DayNight), calls bundled, Compose vs Views cohort selection" },
|
|
114
131
|
|
|
115
132
|
// Flutter — V5 stable (`cometchat_chat_uikit:^5.2`) + V6 beta
|
|
116
133
|
// (`cometchat_chat_uikit:^6.0.0-beta`) ship together. Routed by the
|
|
@@ -127,6 +144,7 @@ const SKILLS = [
|
|
|
127
144
|
{ name: "cometchat-flutter-v5-production", families: ["flutter"], description: "V5: server-minted auth tokens, user management, external-backend recipes" },
|
|
128
145
|
{ name: "cometchat-flutter-v5-push", families: ["flutter"], description: "V5: FCM/APNs push, token lifecycle, deep-link" },
|
|
129
146
|
{ name: "cometchat-flutter-v5-troubleshooting", families: ["flutter"], description: "V5 troubleshooting: pubspec, GetX, Pod errors, runtime crashes" },
|
|
147
|
+
{ name: "cometchat-flutter-v5-testing", families: ["flutter"], description: "V5 testing (v4.1) — flutter_test + mocktail, GetX-aware widget tests, integration_test, golden tests, CI" },
|
|
130
148
|
|
|
131
149
|
{ name: "cometchat-flutter-v6", families: ["flutter"], description: "V6 dispatcher — cometchat_chat_uikit ^6.0.0-beta (Bloc-based)" },
|
|
132
150
|
{ name: "cometchat-flutter-v6-core", families: ["flutter"], description: "V6: pubspec deps, UIKitSettings, init/login, app entry" },
|
|
@@ -143,6 +161,8 @@ const SKILLS = [
|
|
|
143
161
|
{ name: "cometchat-flutter-v6-production", families: ["flutter"], description: "V6: server-minted auth tokens, user management, external-backend recipes" },
|
|
144
162
|
{ name: "cometchat-flutter-v6-troubleshooting", families: ["flutter"], description: "V6 troubleshooting: pubspec, Bloc, theme cache, build errors" },
|
|
145
163
|
{ name: "cometchat-flutter-v6-migration", families: ["flutter"], description: "V5→V6 migration recipes — GetX → Bloc, theme API rewrite, breaking changes" },
|
|
164
|
+
{ name: "cometchat-flutter-v6-testing", families: ["flutter"], description: "V6 testing (v4.1) — flutter_test + bloc_test, BlocProvider.value patterns, integration_test, calls init-order assertion" },
|
|
165
|
+
{ name: "cometchat-flutter-v6-push", families: ["flutter"], description: "V6 push (v4.1) — firebase_messaging FCM/APNs, background isolate handler with @pragma vm:entry-point, Bloc-driven foreground UI, deep-link to chat threads" },
|
|
146
166
|
|
|
147
167
|
// iOS — V5 stable (`CometChatUIKitSwift:^5`). No V6 beta yet; when
|
|
148
168
|
// it ships, add per-cohort namespacing as Android/Flutter do today.
|
|
@@ -156,6 +176,8 @@ const SKILLS = [
|
|
|
156
176
|
{ name: "cometchat-ios-production", families: ["ios"], description: "iOS: server-minted auth tokens, user management, external-backend recipes" },
|
|
157
177
|
{ name: "cometchat-ios-push", families: ["ios"], description: "iOS push: APNs + VoIP, CallKit, token lifecycle, deep-link" },
|
|
158
178
|
{ name: "cometchat-ios-troubleshooting", families: ["ios"], description: "iOS troubleshooting: SPM, CocoaPods, Xcode build errors, Info.plist, runtime crashes" },
|
|
179
|
+
{ name: "cometchat-ios-calls", families: ["ios"], description: "iOS calls (v4.1) — CometChatCallsSDK install, CallKit + PushKit VoIP, AVAudioSession routing, mixed SwiftUI/UIKit hosting" },
|
|
180
|
+
{ name: "cometchat-ios-testing", families: ["ios"], description: "iOS testing (v4.1) — XCTest + protocol-wrapped SDK mocks, async/await tests, SnapshotTesting, XCUITest, Xcode Cloud / GitHub Actions CI" },
|
|
159
181
|
];
|
|
160
182
|
|
|
161
183
|
// ── Base skills (cross-family) ────────────────────────────────────────────────
|
|
@@ -207,15 +229,50 @@ function ensureDir(dir) {
|
|
|
207
229
|
}
|
|
208
230
|
|
|
209
231
|
// ── IDE target directories ────────────────────────────────────────────────────
|
|
232
|
+
//
|
|
233
|
+
// Three install modes:
|
|
234
|
+
//
|
|
235
|
+
// - "multi" → one SKILL.md per skill in a directory tree. Anthropic-spec
|
|
236
|
+
// native. Used by Claude Code, Replit Agent, Kiro.
|
|
237
|
+
//
|
|
238
|
+
// - "single" → all skills concatenated into one markdown file at a
|
|
239
|
+
// specific path. Used by GitHub Copilot Chat
|
|
240
|
+
// (.github/copilot-instructions.md), Cursor + Continue.dev
|
|
241
|
+
// (AGENTS.md at project root), Cline (.clinerules/cometchat.md),
|
|
242
|
+
// Aider (CONVENTIONS.md). The single file is markdown with
|
|
243
|
+
// `---` separators between skills — works with any agent that
|
|
244
|
+
// reads markdown context.
|
|
245
|
+
//
|
|
246
|
+
// - "cli-only" → no file written. The agent uses the `cometchat` CLI
|
|
247
|
+
// directly. For agents without a skill/rules format
|
|
248
|
+
// (Codex CLI, Gemini CLI, Aider when not using
|
|
249
|
+
// CONVENTIONS.md). Installer prints CLI usage hints.
|
|
250
|
+
//
|
|
251
|
+
// File-path notes:
|
|
252
|
+
// - Cursor's docs (cursor.com/docs/rules) say rules live at `.cursor/rules/`,
|
|
253
|
+
// NOT `.cursor/skills/`. AGENTS.md at project root is the simpler
|
|
254
|
+
// alternative Cursor also supports.
|
|
255
|
+
// - GitHub Copilot reads `.github/copilot-instructions.md` automatically.
|
|
256
|
+
// - Cline reads `.clinerules/*.md`.
|
|
257
|
+
// - Aider reads any markdown file passed via `--read CONVENTIONS.md` (or via
|
|
258
|
+
// `read: CONVENTIONS.md` in `.aider.conf.yml`).
|
|
210
259
|
const IDE_TARGETS = {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
kiro: { local: ".kiro/skills", global: path.join(os.homedir(), ".kiro", "skills"), skillFile: "SKILL.md" },
|
|
215
|
-
copilot: { local: ".github", global: null, skillFile: null }, // single-file mode
|
|
260
|
+
// Multi-file (Anthropic-spec compatible)
|
|
261
|
+
claude: { mode: "multi", local: ".claude/skills", global: path.join(os.homedir(), ".claude", "skills"), skillFile: "SKILL.md" },
|
|
262
|
+
kiro: { mode: "multi", local: ".kiro/skills", global: path.join(os.homedir(), ".kiro", "skills"), skillFile: "SKILL.md" },
|
|
216
263
|
// Replit Agent reads `.agents/skills/` per docs.replit.com/core-concepts/agent/skills.
|
|
217
|
-
|
|
218
|
-
|
|
264
|
+
replit: { mode: "multi", local: ".agents/skills", global: path.join(os.homedir(), ".config", "agents", "skills"), skillFile: "SKILL.md" },
|
|
265
|
+
|
|
266
|
+
// Single-file (concatenated markdown)
|
|
267
|
+
copilot: { mode: "single", local: ".github", global: null, fileName: "copilot-instructions.md" },
|
|
268
|
+
cursor: { mode: "single", local: ".", global: null, fileName: "AGENTS.md" },
|
|
269
|
+
continue: { mode: "single", local: ".", global: null, fileName: "AGENTS.md" },
|
|
270
|
+
cline: { mode: "single", local: ".clinerules", global: null, fileName: "cometchat.md" },
|
|
271
|
+
aider: { mode: "single", local: ".", global: null, fileName: "CONVENTIONS.md" },
|
|
272
|
+
|
|
273
|
+
// CLI-only (no skill/rules format on the agent side)
|
|
274
|
+
codex: { mode: "cli-only", local: null, global: null },
|
|
275
|
+
gemini: { mode: "cli-only", local: null, global: null },
|
|
219
276
|
};
|
|
220
277
|
|
|
221
278
|
// ── Framework detection (inline — no subprocess) ─────────────────────────────
|
|
@@ -392,19 +449,105 @@ function installSkill(skill, baseDir, skillFile) {
|
|
|
392
449
|
return dest;
|
|
393
450
|
}
|
|
394
451
|
|
|
395
|
-
|
|
452
|
+
/**
|
|
453
|
+
* Generate a short orienting AGENTS.md / CONVENTIONS.md / etc. (~3-5 KB)
|
|
454
|
+
* that tells the agent how to drive the cometchat CLI for any task.
|
|
455
|
+
*
|
|
456
|
+
* Why short instead of full SKILL.md concatenation:
|
|
457
|
+
* - Cursor / Continue / Cline read these as ALWAYS-ON context. A 430 KB
|
|
458
|
+
* concatenation burns tokens on every turn. Bad UX, bad cost.
|
|
459
|
+
* - The CLI is the universal surface — `cometchat init`, `apply-feature`,
|
|
460
|
+
* `builder open/export`, etc. Agents reliably execute CLI commands.
|
|
461
|
+
* - Inline help (`cometchat <cmd> --help`) carries the per-command
|
|
462
|
+
* guidance lazily, only when the agent needs it.
|
|
463
|
+
*
|
|
464
|
+
* The full SKILL.md tree still ships when the user installs with --ide claude
|
|
465
|
+
* (or replit / kiro). For non-Anthropic agents, this short orientation is
|
|
466
|
+
* the right shape.
|
|
467
|
+
*/
|
|
468
|
+
function generateOrientingMd(skillsToInstall, families) {
|
|
469
|
+
const familyLabel = families.includes("all") ? "all platforms" : families.join(" + ");
|
|
470
|
+
const familyHint = families.length === 1 ? families[0] : "your project's framework";
|
|
471
|
+
|
|
472
|
+
let md = `# CometChat — AI Agent Instructions\n\n`;
|
|
473
|
+
md += `> Auto-generated by \`npx @cometchat/skills add\`. Do not hand-edit; rerun the installer to refresh.\n`;
|
|
474
|
+
md += `> Family: **${familyLabel}**. ${skillsToInstall.length} skills available.\n\n`;
|
|
475
|
+
|
|
476
|
+
md += `## When the user asks about CometChat\n\n`;
|
|
477
|
+
md += `If the user asks any of the following, run the matching CLI command — DO NOT improvise from training memory:\n\n`;
|
|
478
|
+
md += `| User says... | Run |\n|---|---|\n`;
|
|
479
|
+
md += `| "integrate cometchat" / "add chat" / "/cometchat" | \`cometchat init\` (or walk the user through \`detect\` → \`auth login\` → \`provision setup\` → \`apply\` → \`verify\`) |\n`;
|
|
480
|
+
md += `| "what's my framework" | \`cometchat detect --json\` |\n`;
|
|
481
|
+
md += `| "log me into CometChat" / "set up credentials" | \`cometchat auth login\` then \`cometchat provision setup --app-id <id> --framework <fw>\` |\n`;
|
|
482
|
+
md += `| "design chat visually" / "open the UI Kit Builder" | \`cometchat builder open --json\` (returns a deep URL into the dashboard's UI Kit Builder), then \`cometchat builder export --target . --json\` after the user designs |\n`;
|
|
483
|
+
md += `| "add polls" / "enable smart replies" / "turn on \\<feature\\>" | \`cometchat features list\` to find the feature id, then \`cometchat apply-feature <id>\` |\n`;
|
|
484
|
+
md += `| "match my brand" / "theme it like Slack" | \`cometchat apply-theme --preset slack\` (or \`--primary-color #...\`) |\n`;
|
|
485
|
+
md += `| "use real auth tokens, not the auth key" | \`cometchat production-auth\` |\n`;
|
|
486
|
+
md += `| "what went wrong" / "diagnose this" | \`cometchat doctor\` |\n`;
|
|
487
|
+
md += `| "what's installed already" | \`cometchat info\` or \`cometchat status\` |\n\n`;
|
|
488
|
+
|
|
489
|
+
md += `Run \`cometchat --help\` for the full command list. Each subcommand has \`--help\` with detailed usage.\n\n`;
|
|
490
|
+
|
|
491
|
+
md += `## How CometChat integration works (${familyHint})\n\n`;
|
|
492
|
+
md += `1. **Detect** the framework — \`cometchat detect --json\` returns framework, version, env-var prefix, and existing-integration state.\n`;
|
|
493
|
+
md += `2. **Authenticate** — the user logs into the CometChat dashboard via \`cometchat auth login\` (browser flow). Token is stored in OS keychain.\n`;
|
|
494
|
+
md += `3. **Provision** — \`cometchat provision setup --app-id <id> --framework <fw>\` writes credentials to the right env file (\`.env\` for Vite, \`.env.local\` for Next.js, \`local.properties\` for Android, \`Secrets.swift\` for iOS, etc.).\n`;
|
|
495
|
+
md += `4. **Apply** — \`cometchat apply --experience <N>\` writes the integration code (provider, components, placement). Idempotent.\n`;
|
|
496
|
+
md += `5. **Verify** — \`cometchat verify\` runs build + AST checks. \`cometchat doctor\` runs combined diagnostics.\n`;
|
|
497
|
+
md += `6. **Iterate** — features / theming / customization via the CLI commands above.\n\n`;
|
|
498
|
+
|
|
499
|
+
md += `## Hard rules (non-negotiable)\n\n`;
|
|
500
|
+
md += `- **Run \`cometchat detect\` BEFORE making framework assumptions.** The user's project might be React+Vite, Next.js App Router, React Router v7, Astro, Expo, bare RN, Angular 12-15, native Android (V5 stable + V6 beta), iOS V5, or Flutter (V5 stable + V6 beta) — each has different conventions.\n`;
|
|
501
|
+
md += `- **NEVER hardcode credentials.** Use \`cometchat provision setup\`, which writes the right env file with the right prefix. The Auth Key is for dev only — \`cometchat production-auth\` upgrades to server-minted tokens.\n`;
|
|
502
|
+
md += `- **NEVER hand-roll a custom search UI** — the UI Kit ships \`<CometChatSearch>\` (and \`showSearchBar\` on \`<CometChatConversations>\`). Hand-rolling silently breaks pagination + result highlighting.\n`;
|
|
503
|
+
md += `- **NEVER \`Skill()\`-style auto-load skills.** This file is your orientation; for deeper detail, run the CLI command for the specific task. The CLI's \`--help\` text is the source of truth.\n`;
|
|
504
|
+
md += `- **Component names + props** — for an unfamiliar component, run \`cometchat features info <name>\` or query the CometChat docs MCP if available. Don't invent from training data; the UI Kit's API surface has changed across versions.\n\n`;
|
|
505
|
+
|
|
506
|
+
md += `## When you need richer guidance\n\n`;
|
|
507
|
+
md += `Each \`cometchat <cmd> --help\` covers usage for that command. For deeper skill content (placement patterns, customization four-tier model, troubleshooting symptom-table, framework-specific gotchas) — install the multi-file skill set:\n\n`;
|
|
508
|
+
md += "```bash\n";
|
|
509
|
+
md += `npx @cometchat/skills add --family ${families[0] || "web"} --ide claude\n`;
|
|
510
|
+
md += "```\n\n";
|
|
511
|
+
md += `That writes ${skillsToInstall.length} per-skill markdown files to \`.claude/skills/cometchat-*/SKILL.md\`. Cursor / Continue / Cline can read those too — open the files directly when needed (\`@.claude/skills/cometchat-core/SKILL.md\` in Cursor, etc.).\n`;
|
|
512
|
+
|
|
513
|
+
return md;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* Write a single orienting file (AGENTS.md / CONVENTIONS.md / etc.) at
|
|
518
|
+
* <baseDir>/<fileName>. Used for non-Anthropic-spec agents that read one
|
|
519
|
+
* always-on context file instead of a per-skill directory tree.
|
|
520
|
+
*
|
|
521
|
+
* The orienting file is short (~3-5 KB) and points the agent at the CLI as
|
|
522
|
+
* the universal surface. The full per-skill SKILL.md tree is opt-in via
|
|
523
|
+
* `--ide claude` (or replit / kiro) for agents that want the rich content.
|
|
524
|
+
*/
|
|
525
|
+
function installSingleFileSkills(skillsToInstall, baseDir, fileName, families) {
|
|
396
526
|
ensureDir(baseDir);
|
|
397
|
-
const dest = path.join(baseDir,
|
|
398
|
-
|
|
399
|
-
for (const skill of skillsToInstall) {
|
|
400
|
-
const src = path.join(SKILLS_SRC_DIR, skill.name, "SKILL.md");
|
|
401
|
-
if (!fs.existsSync(src)) continue;
|
|
402
|
-
content += fs.readFileSync(src, "utf8") + "\n\n---\n\n";
|
|
403
|
-
}
|
|
404
|
-
fs.writeFileSync(dest, content, "utf8");
|
|
527
|
+
const dest = path.join(baseDir, fileName);
|
|
528
|
+
fs.writeFileSync(dest, generateOrientingMd(skillsToInstall, families), "utf8");
|
|
405
529
|
return dest;
|
|
406
530
|
}
|
|
407
531
|
|
|
532
|
+
/**
|
|
533
|
+
* For agents without a skill/rules format (Codex CLI, Gemini CLI), no file
|
|
534
|
+
* is written. The installer just prints CLI usage hints — the agent runs
|
|
535
|
+
* shell commands directly.
|
|
536
|
+
*/
|
|
537
|
+
function printCliOnlyHints(ide, skillsToInstall) {
|
|
538
|
+
console.log(c.dim(`\n ${ide} has no skill/rules format. The cometchat CLI is the integration surface.`));
|
|
539
|
+
console.log(c.dim(` Available commands (run any from the project root):\n`));
|
|
540
|
+
console.log(` ${c.cyan("cometchat detect")} Identify framework`);
|
|
541
|
+
console.log(` ${c.cyan("cometchat auth login")} Authenticate to CometChat`);
|
|
542
|
+
console.log(` ${c.cyan("cometchat provision setup")} Wire credentials into .env`);
|
|
543
|
+
console.log(` ${c.cyan("cometchat init")} Apply the integration`);
|
|
544
|
+
console.log(` ${c.cyan("cometchat builder open")} Visual UI Kit Builder (deep URL)`);
|
|
545
|
+
console.log(` ${c.cyan("cometchat builder export")} Export visual builder output to project`);
|
|
546
|
+
console.log(` ${c.cyan("cometchat apply-feature <id>")} Toggle a feature (polls / smart-replies / etc.)`);
|
|
547
|
+
console.log(` ${c.cyan("cometchat doctor")} Diagnose drift / missing config`);
|
|
548
|
+
console.log(c.dim(`\n ${skillsToInstall.length} skills available — none copied (no compatible format).\n`));
|
|
549
|
+
}
|
|
550
|
+
|
|
408
551
|
// ── Multi-agent picker via vercel-labs/skills ────────────────────────────────
|
|
409
552
|
//
|
|
410
553
|
// Spawns `npx -y skills@<pin> add cometchat-team/cometchat-skills -s <names>`
|
|
@@ -412,10 +555,10 @@ function installCopilotSkills(skillsToInstall, baseDir) {
|
|
|
412
555
|
// Cline / Kiro / Replit / 50+ agents) shows. The user picks which agents
|
|
413
556
|
// to write to; the skills CLI handles the per-agent path conventions.
|
|
414
557
|
//
|
|
415
|
-
// We pre-resolve the
|
|
416
|
-
//
|
|
417
|
-
// only sees skills relevant to their
|
|
418
|
-
// the marketplace.
|
|
558
|
+
// We pre-resolve the relevant skill list (BASE_SKILLS by default, full
|
|
559
|
+
// family if --family is set) and pass the names via `-s name1 name2 ...`
|
|
560
|
+
// so the user only sees skills relevant to their integration — not all
|
|
561
|
+
// 100+ in the marketplace.
|
|
419
562
|
//
|
|
420
563
|
// Pin: `skills@1.5.5` was the version verified against this codebase.
|
|
421
564
|
// Bump on intentional re-verification; pre-pin avoids breakage from a
|
|
@@ -423,12 +566,82 @@ function installCopilotSkills(skillsToInstall, baseDir) {
|
|
|
423
566
|
const SKILLS_CLI_PIN = "skills@1.5.5";
|
|
424
567
|
const SKILLS_REPO = "cometchat-team/cometchat-skills";
|
|
425
568
|
|
|
569
|
+
/**
|
|
570
|
+
* Read package.json + signal files to build a one-line "Detected" string
|
|
571
|
+
* we show the user before spawning the picker. Strictly cosmetic — the
|
|
572
|
+
* actual install doesn't depend on this.
|
|
573
|
+
*
|
|
574
|
+
* Returns something like:
|
|
575
|
+
* "Vite + React 19 + TypeScript (web family)"
|
|
576
|
+
* "Next.js 14 + TypeScript (web family)"
|
|
577
|
+
* "Expo 49 + React Native 0.72 (native family)"
|
|
578
|
+
* "no framework detected — base skills install fine without one"
|
|
579
|
+
*/
|
|
580
|
+
function describeProjectContext(cwd) {
|
|
581
|
+
const pkg = (() => {
|
|
582
|
+
try { return JSON.parse(fs.readFileSync(path.join(cwd, "package.json"), "utf-8")); }
|
|
583
|
+
catch { return null; }
|
|
584
|
+
})();
|
|
585
|
+
|
|
586
|
+
const family = detectFamily(cwd);
|
|
587
|
+
const familyLabel = family ? FAMILY_LABELS[family] : null;
|
|
588
|
+
if (!pkg) {
|
|
589
|
+
return family
|
|
590
|
+
? { line: `${familyLabel} project`, family }
|
|
591
|
+
: { line: "no framework detected — base skills install fine without one", family: null };
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
const deps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
|
|
595
|
+
const hasTS = !!(deps.typescript || pkg.types || pkg.typings);
|
|
596
|
+
const reactV = deps.react ? deps.react.replace(/^[~^]/, "").split(".")[0] : null;
|
|
597
|
+
const parts = [];
|
|
598
|
+
|
|
599
|
+
if (deps.next) parts.push(`Next.js ${deps.next.replace(/^[~^]/, "").split(".")[0]}`);
|
|
600
|
+
else if (deps.vite || deps["@vitejs/plugin-react"]) parts.push(`Vite${reactV ? ` + React ${reactV}` : ""}`);
|
|
601
|
+
else if (deps.astro) parts.push(`Astro`);
|
|
602
|
+
else if (deps.expo) parts.push(`Expo ${deps.expo.replace(/^[~^]/, "").split(".")[0]}${deps["react-native"] ? ` + React Native ${deps["react-native"].replace(/^[~^]/, "").split(".")[0]}` : ""}`);
|
|
603
|
+
else if (deps["react-native"]) parts.push(`React Native ${deps["react-native"].replace(/^[~^]/, "").split(".")[0]}`);
|
|
604
|
+
else if (deps["@angular/core"]) parts.push(`Angular ${deps["@angular/core"].replace(/^[~^]/, "").split(".")[0]}`);
|
|
605
|
+
else if (deps.react) parts.push(`React ${reactV}`);
|
|
606
|
+
else if (familyLabel) parts.push(familyLabel);
|
|
607
|
+
|
|
608
|
+
if (hasTS && !parts.some(p => p.includes("TypeScript"))) parts.push("TypeScript");
|
|
609
|
+
|
|
610
|
+
const line = parts.length
|
|
611
|
+
? `${parts.join(" + ")}${family ? ` (${family} family)` : ""}`
|
|
612
|
+
: familyLabel || "unknown framework — base install still works";
|
|
613
|
+
|
|
614
|
+
return { line, family };
|
|
615
|
+
}
|
|
616
|
+
|
|
426
617
|
async function delegateToSkillsCli({ skills, families, isGlobal }) {
|
|
427
618
|
const skillNames = skills.map(s => s.name);
|
|
428
|
-
const
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
619
|
+
const isBaseInstall = families.length === 1 && families[0] === "base";
|
|
620
|
+
const cwd = process.cwd();
|
|
621
|
+
const ctx = describeProjectContext(cwd);
|
|
622
|
+
const projectPath = cwd.replace(os.homedir(), "~");
|
|
623
|
+
|
|
624
|
+
// Pre-spawn: brand + project context + framing of what's about to happen
|
|
625
|
+
const installLabel = isBaseInstall
|
|
626
|
+
? `base install ${c.dim("· dispatcher routes the rest at runtime")}`
|
|
627
|
+
: `${families.includes("all") ? "all" : families.join("+")} family ${c.dim(`· ${skillNames.length} skills`)}`;
|
|
628
|
+
|
|
629
|
+
console.log(``);
|
|
630
|
+
console.log(` ${c.bold(c.cyan("CometChat Skills"))} ${c.dim("·")} ${installLabel}`);
|
|
631
|
+
console.log(``);
|
|
632
|
+
console.log(` ${c.dim("Project")} ${projectPath}`);
|
|
633
|
+
console.log(` ${c.dim("Detected")} ${ctx.line}`);
|
|
634
|
+
console.log(``);
|
|
635
|
+
if (isBaseInstall) {
|
|
636
|
+
console.log(` ${c.gray(`We're about to install ${skillNames.length} cross-family skills (${skillNames.map(s => s.replace(/^cometchat-?/, "") || "router").filter(Boolean).join(", ")})`)}`);
|
|
637
|
+
console.log(` ${c.gray(`to whichever AI agents you pick. Once installed, run /cometchat in your IDE`)}`);
|
|
638
|
+
console.log(` ${c.gray(`— the dispatcher detects your framework and writes the integration.`)}`);
|
|
639
|
+
} else {
|
|
640
|
+
console.log(` ${c.gray(`Installing ${skillNames.length} ${families.join("+")} skills via the multi-agent picker.`)}`);
|
|
641
|
+
}
|
|
642
|
+
console.log(``);
|
|
643
|
+
console.log(` ${c.gray("Launching the multi-agent picker...")}`);
|
|
644
|
+
console.log(``);
|
|
432
645
|
|
|
433
646
|
const npxArgs = [
|
|
434
647
|
"-y", // auto-accept the npx install prompt for the skills CLI itself
|
|
@@ -444,7 +657,13 @@ async function delegateToSkillsCli({ skills, families, isGlobal }) {
|
|
|
444
657
|
stdio: "inherit",
|
|
445
658
|
shell: false,
|
|
446
659
|
});
|
|
447
|
-
child.on("close", (code) =>
|
|
660
|
+
child.on("close", (code) => {
|
|
661
|
+
if (code === 0) {
|
|
662
|
+
// Post-spawn success: celebrate + concrete next steps
|
|
663
|
+
printPostInstallNextSteps({ isBaseInstall, ctx, projectPath });
|
|
664
|
+
}
|
|
665
|
+
resolve(code ?? 1);
|
|
666
|
+
});
|
|
448
667
|
child.on("error", (err) => {
|
|
449
668
|
console.error(c.red(`\n ✗ Failed to spawn skills CLI: ${err.message}`));
|
|
450
669
|
console.error(c.dim(` Falling back to legacy direct-write — re-run with --ide <name> to bypass the picker.\n`));
|
|
@@ -453,6 +672,26 @@ async function delegateToSkillsCli({ skills, families, isGlobal }) {
|
|
|
453
672
|
});
|
|
454
673
|
}
|
|
455
674
|
|
|
675
|
+
function printPostInstallNextSteps({ isBaseInstall, ctx, projectPath }) {
|
|
676
|
+
console.log(``);
|
|
677
|
+
console.log(` ${c.green("✓")} ${c.bold(isBaseInstall ? "Base skills installed." : "Skills installed.")}`);
|
|
678
|
+
console.log(``);
|
|
679
|
+
console.log(` ${c.bold("Next:")} open ${c.cyan(projectPath)} in any agent you picked, then in the chat panel:`);
|
|
680
|
+
console.log(``);
|
|
681
|
+
console.log(` ${c.cyan("/cometchat add chat to my app")}`);
|
|
682
|
+
console.log(``);
|
|
683
|
+
if (isBaseInstall) {
|
|
684
|
+
const detected = ctx.family ? ctx.line.replace(/ \(.*\)$/, "") : "your framework";
|
|
685
|
+
console.log(` ${c.gray(`The dispatcher detects ${detected}, walks you through CometChat signup,`)}`);
|
|
686
|
+
console.log(` ${c.gray(`and writes the integration code based on your project (~30 seconds).`)}`);
|
|
687
|
+
} else {
|
|
688
|
+
console.log(` ${c.gray("All skills are loaded; the dispatcher walks you through the rest.")}`);
|
|
689
|
+
}
|
|
690
|
+
console.log(``);
|
|
691
|
+
console.log(` ${c.dim("Docs:")} ${c.cyan("https://www.cometchat.com/docs/skills")}`);
|
|
692
|
+
console.log(``);
|
|
693
|
+
}
|
|
694
|
+
|
|
456
695
|
function printHelp() {
|
|
457
696
|
console.log(`
|
|
458
697
|
${c.bold("@cometchat/skills")} — Install CometChat AI coding skills
|
|
@@ -484,7 +723,17 @@ function printHelp() {
|
|
|
484
723
|
${c.cyan("all")} Install every skill (legacy v3 behavior)
|
|
485
724
|
|
|
486
725
|
${c.bold("IDE selection (direct-write mode only — default: claude):")}
|
|
487
|
-
${c.cyan("--ide
|
|
726
|
+
${c.cyan("--ide claude")} Multi-file SKILL.md at .claude/skills/ (default)
|
|
727
|
+
${c.cyan("--ide cursor")} Single AGENTS.md at project root
|
|
728
|
+
${c.cyan("--ide copilot")} Single .github/copilot-instructions.md
|
|
729
|
+
${c.cyan("--ide cline")} Single .clinerules/cometchat.md
|
|
730
|
+
${c.cyan("--ide continue")} Single AGENTS.md at project root
|
|
731
|
+
${c.cyan("--ide aider")} Single CONVENTIONS.md at project root
|
|
732
|
+
${c.cyan("--ide kiro")} Multi-file SKILL.md at .kiro/skills/
|
|
733
|
+
${c.cyan("--ide replit")} Multi-file SKILL.md at .agents/skills/
|
|
734
|
+
${c.cyan("--ide codex")} No skill format — print CLI hints
|
|
735
|
+
${c.cyan("--ide gemini")} No skill format — print CLI hints
|
|
736
|
+
${c.cyan("--ide all")} Install for every IDE
|
|
488
737
|
|
|
489
738
|
${c.bold("Multi-family / monorepo:")}
|
|
490
739
|
${c.cyan("--family web --family native")} Install BOTH families (repeat flag)
|
|
@@ -598,12 +847,12 @@ async function main() {
|
|
|
598
847
|
} else {
|
|
599
848
|
// Default: base install only (whether interactive or with --ide).
|
|
600
849
|
// The dispatcher detects the framework at runtime and installs the
|
|
601
|
-
// family-specific skills via its own runtime npx invocation.
|
|
850
|
+
// family-specific skills via its own runtime npx invocation. The
|
|
851
|
+
// user-facing intro is printed by delegateToSkillsCli (interactive
|
|
852
|
+
// flow) or the direct-write loop below (CI flow) — no duplicate
|
|
853
|
+
// banner here.
|
|
602
854
|
skillsToInstall = BASE_SKILLS;
|
|
603
855
|
families = ["base"];
|
|
604
|
-
console.log(`\n ${c.bold(c.cyan("CometChat Skills"))} ${c.dim("(base install — dispatcher routes the rest at runtime)")}`);
|
|
605
|
-
console.log(` ${c.gray(`Installing ${BASE_SKILLS.length} cross-family ${BASE_SKILLS.length === 1 ? "skill" : "skills"}: ${BASE_SKILLS.map(s => s.name).join(", ")}.`)}`);
|
|
606
|
-
console.log(` ${c.gray("After install, open your project in your IDE → /cometchat detects your framework and asks the agent to install family-specific skills on demand.")}\n`);
|
|
607
856
|
}
|
|
608
857
|
|
|
609
858
|
if (!skipPicker) {
|
|
@@ -624,6 +873,14 @@ async function main() {
|
|
|
624
873
|
process.exit(1);
|
|
625
874
|
}
|
|
626
875
|
|
|
876
|
+
// CLI-only mode: no file write. Just print CLI usage hints.
|
|
877
|
+
if (target.mode === "cli-only") {
|
|
878
|
+
const familyLabel = families.includes("all") ? "all" : families.join("+");
|
|
879
|
+
console.log(`\n ${c.bold(c.cyan("CometChat Skills"))} — ${ide} — ${c.bold(familyLabel)} family\n`);
|
|
880
|
+
printCliOnlyHints(ide, skillsToInstall);
|
|
881
|
+
continue;
|
|
882
|
+
}
|
|
883
|
+
|
|
627
884
|
if (isGlobal && !target.global) {
|
|
628
885
|
console.log(`\n ${c.yellow("⚠")} ${ide} does not support global install — skipping.`);
|
|
629
886
|
continue;
|
|
@@ -642,10 +899,9 @@ async function main() {
|
|
|
642
899
|
|
|
643
900
|
// --clean: wipe existing cometchat-* skill dirs in baseDir before install.
|
|
644
901
|
// Avoids stale skills accumulating across multiple --family runs in the
|
|
645
|
-
// same project
|
|
646
|
-
//
|
|
647
|
-
|
|
648
|
-
if (isClean && ide !== "copilot" && fs.existsSync(baseDir)) {
|
|
902
|
+
// same project. Only touches the cometchat-* skill dirs in multi-mode;
|
|
903
|
+
// single-mode rewrites the whole file.
|
|
904
|
+
if (isClean && target.mode === "multi" && fs.existsSync(baseDir)) {
|
|
649
905
|
let wiped = 0;
|
|
650
906
|
for (const entry of fs.readdirSync(baseDir)) {
|
|
651
907
|
if (entry === "cometchat" || entry.startsWith("cometchat-")) {
|
|
@@ -656,17 +912,18 @@ async function main() {
|
|
|
656
912
|
if (wiped > 0) console.log(c.dim(` ✓ cleaned ${wiped} existing cometchat-* skill ${wiped === 1 ? "dir" : "dirs"}\n`));
|
|
657
913
|
}
|
|
658
914
|
|
|
659
|
-
if (
|
|
660
|
-
const spinner = ora ? ora({ text:
|
|
915
|
+
if (target.mode === "single") {
|
|
916
|
+
const spinner = ora ? ora({ text: target.fileName, prefixText: " " }).start() : null;
|
|
661
917
|
try {
|
|
662
|
-
|
|
663
|
-
if (spinner) spinner.succeed(c.green("✓ ") + c.bold(
|
|
664
|
-
else console.log(` ✓
|
|
918
|
+
installSingleFileSkills(skillsToInstall, baseDir, target.fileName, families);
|
|
919
|
+
if (spinner) spinner.succeed(c.green("✓ ") + c.bold(target.fileName) + ` ${c.dim(`(${skillsToInstall.length} skills concatenated)`)}`);
|
|
920
|
+
else console.log(` ✓ ${target.fileName} (${skillsToInstall.length} skills)`);
|
|
665
921
|
} catch (err) {
|
|
666
|
-
if (spinner) spinner.fail(c.red(`✗
|
|
667
|
-
else console.error(` ✗
|
|
922
|
+
if (spinner) spinner.fail(c.red(`✗ ${target.fileName}: ${err.message}`));
|
|
923
|
+
else console.error(` ✗ ${target.fileName}: ${err.message}`);
|
|
668
924
|
}
|
|
669
925
|
} else {
|
|
926
|
+
// multi mode: one SKILL.md per skill
|
|
670
927
|
for (const skill of skillsToInstall) {
|
|
671
928
|
const spinner = ora ? ora({ text: skill.name, prefixText: " " }).start() : null;
|
|
672
929
|
try {
|