@tencent-rtc/trtc-agent-skills 0.1.7 → 0.1.8

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 (125) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/CODEBUDDY.md +1 -1
  4. package/README.md +10 -7
  5. package/README.zh.md +10 -7
  6. package/bin/cli.js +196 -44
  7. package/knowledge-base/conference/web/index.yaml +6 -6
  8. package/knowledge-base/slices/conference/web/official-roomkit-api.md +119 -8
  9. package/package.json +1 -1
  10. package/skills/trtc/SKILL.md +45 -10
  11. package/skills/trtc-ai-oral-coach/README.ja.md +3 -3
  12. package/skills/trtc-ai-oral-coach/README.md +3 -3
  13. package/skills/trtc-ai-oral-coach/README.zh-CN.md +3 -3
  14. package/skills/trtc-ai-oral-coach/SKILL.md +7 -4
  15. package/skills/trtc-ai-realtime-interpreter/README.ja.md +197 -0
  16. package/skills/trtc-ai-realtime-interpreter/README.md +197 -0
  17. package/skills/trtc-ai-realtime-interpreter/README.zh-CN.md +197 -0
  18. package/skills/trtc-ai-realtime-interpreter/SKILL.md +748 -0
  19. package/skills/trtc-ai-realtime-interpreter/auto_adapters/integration_templates/generic-rest-api.md +85 -0
  20. package/skills/trtc-ai-realtime-interpreter/auto_adapters/integration_templates/room-owner-authz-note.md +53 -0
  21. package/skills/trtc-ai-realtime-interpreter/auto_adapters/manifest.yaml +49 -0
  22. package/skills/trtc-ai-realtime-interpreter/auto_adapters/python/README.md +11 -0
  23. package/skills/trtc-ai-realtime-interpreter/auto_adapters/python/fastapi_reverse_proxy.py.tpl +84 -0
  24. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/.env.example +17 -0
  25. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/frontend/silent-listener.ts +91 -0
  26. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/manifest.yaml +110 -0
  27. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/requirements.txt +5 -0
  28. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/__init__.py +0 -0
  29. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/_capability_loader.py +89 -0
  30. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/agent.py +153 -0
  31. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/credentials.py +112 -0
  32. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/health.py +218 -0
  33. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/log_filter.py +33 -0
  34. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/server.py +266 -0
  35. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/trtc_client.py +188 -0
  36. package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/usersig.py +53 -0
  37. package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/README.md +46 -0
  38. package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/manifest.yaml +63 -0
  39. package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/src/__init__.py +0 -0
  40. package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/src/fanout.py +149 -0
  41. package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/src/router.py +83 -0
  42. package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/frontend/subtitle-parser.ts +145 -0
  43. package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/manifest.yaml +68 -0
  44. package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/src/__init__.py +0 -0
  45. package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/src/modes.py +73 -0
  46. package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/src/router.py +83 -0
  47. package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/src/service.py +77 -0
  48. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/README.md +23 -0
  49. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/backend/app/__init__.py +0 -0
  50. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/backend/app/server.py +277 -0
  51. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/backend/requirements.txt +5 -0
  52. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/backend/start.sh +28 -0
  53. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/recipe.yaml +72 -0
  54. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/index.html +12 -0
  55. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/legacy/index.html +738 -0
  56. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/package-lock.json +4302 -0
  57. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/package.json +33 -0
  58. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/postcss.config.js +6 -0
  59. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/App.vue +18 -0
  60. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/api/backend.ts +82 -0
  61. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/SetupScreen.vue +362 -0
  62. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/SummaryScreen.vue +203 -0
  63. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/ChatPanel.vue +188 -0
  64. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/ConferenceRoom.vue +453 -0
  65. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/ParticipantViewUI.vue +170 -0
  66. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/PeoplePanel.vue +206 -0
  67. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/SidePanel.vue +77 -0
  68. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/Toolbar.vue +371 -0
  69. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/TopBar.vue +310 -0
  70. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/TranscriptPanel.vue +225 -0
  71. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/composables/useAiInterpreter.ts +263 -0
  72. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/composables/useConference.ts +98 -0
  73. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/env.d.ts +7 -0
  74. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/main.ts +5 -0
  75. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/store.ts +103 -0
  76. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/style.css +19 -0
  77. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/tailwind.config.js +25 -0
  78. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/tsconfig.json +25 -0
  79. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/tsconfig.node.json +10 -0
  80. package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/vite.config.ts +26 -0
  81. package/skills/trtc-ai-realtime-interpreter/scripts/add-capability.py +163 -0
  82. package/skills/trtc-ai-realtime-interpreter/scripts/deploy-demo.sh +64 -0
  83. package/skills/trtc-ai-realtime-interpreter/scripts/lib/__init__.py +0 -0
  84. package/skills/trtc-ai-realtime-interpreter/scripts/lib/credential_validators.py +143 -0
  85. package/skills/trtc-ai-realtime-interpreter/scripts/lib/manifest_resolver.py +60 -0
  86. package/skills/trtc-ai-realtime-interpreter/scripts/lib/stack_detector.py +50 -0
  87. package/skills/trtc-ai-realtime-interpreter/scripts/post-install-patch.py +79 -0
  88. package/skills/trtc-ai-realtime-interpreter/scripts/verify-credentials.py +76 -0
  89. package/skills/trtc-ai-realtime-interpreter/start.sh +85 -0
  90. package/skills/trtc-ai-realtime-interpreter/triggers.yaml +29 -0
  91. package/skills/trtc-ai-service/README.ja.md +3 -3
  92. package/skills/trtc-ai-service/README.md +3 -3
  93. package/skills/trtc-ai-service/README.zh-CN.md +3 -3
  94. package/skills/trtc-ai-service/SKILL.md +9 -7
  95. package/skills/trtc-ai-service/capabilities/conversation-core/src/credentials.py +1 -1
  96. package/skills/trtc-chat/SKILL.md +1 -1
  97. package/skills/trtc-chat/docs/SKILL.md +1 -1
  98. package/skills/trtc-conference/flows/onboarding.md +6 -0
  99. package/skills/trtc-conference/flows/topic.md +6 -2
  100. package/skills/trtc-conference/playbooks/official-roomkit.md +3 -1
  101. package/skills/trtc-conference/tests/test_conference_index_contract.py +16 -0
  102. package/skills/trtc-conference/tests/test_conference_onboarding_contract.py +9 -0
  103. package/skills/trtc-conference/tests/test_conference_topic_flow_contract.py +16 -0
  104. package/skills/trtc-push/SKILL.md +118 -0
  105. package/skills/trtc-push/issues/ROUTER.json +429 -0
  106. package/skills/trtc-push/issues/cards/android/fcm-gms-domestic.md +53 -0
  107. package/skills/trtc-push/issues/cards/android/vendor-huawei.md +72 -0
  108. package/skills/trtc-push/issues/cards/common/console-certificate-quota.md +46 -0
  109. package/skills/trtc-push/issues/cards/common/registration-binding.md +67 -0
  110. package/skills/trtc-push/issues/cards/ios/aps-environment-3000.md +55 -0
  111. package/skills/trtc-push/issues/cards/ios/certificate-businessid.md +56 -0
  112. package/skills/trtc-push/issues/cards/ios/xcodegen-cocoapods-module.md +54 -0
  113. package/skills/trtc-push/issues/flows/android/delivered-not-displayed.md +52 -0
  114. package/skills/trtc-push/issues/flows/android/vendor-not-received.md +57 -0
  115. package/skills/trtc-push/issues/flows/common/badge.md +49 -0
  116. package/skills/trtc-push/issues/flows/common/console-product-limits.md +48 -0
  117. package/skills/trtc-push/issues/flows/common/server-api.md +51 -0
  118. package/skills/trtc-push/issues/flows/cross-platform/harmonyos.md +51 -0
  119. package/skills/trtc-push/issues/flows/cross-platform/uniapp-integration.md +57 -0
  120. package/skills/trtc-push/issues/flows/ios/offline-not-received.md +57 -0
  121. package/skills/trtc-push/references/code-templates.md +386 -0
  122. package/skills/trtc-push/references/hard-rules.md +112 -0
  123. package/skills/trtc-push/references/timpush-sdk-api.md +72 -0
  124. package/skills/trtc-push/references/workflow-protocol.md +82 -0
  125. /package/.cursor/rules/{main.mdc → ui-mode.mdc} +0 -0
package/AGENTS.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Reply in the user's language.
4
4
 
5
- TRTC products covered: Conference, Chat, Call, Live, RTC Engine, and Conversational AI (AI customer service / 智能客服 / voice agent / AI oral coach / 口语陪练 / speaking coach scenarios).
5
+ TRTC products covered: Conference, Chat, Call, Live, RTC Engine, Conversational AI (AI customer service / 智能客服 / voice agent / AI oral coach / 口语陪练 / speaking coach scenarios), and TIMPush (离线推送).
6
6
 
7
7
  For any TRTC-related request, read and follow `skills/trtc/SKILL.md` first.
8
8
  This file is an installed host bootstrap. The actual TRTC skill lives under
package/CLAUDE.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Reply in the user's language.
4
4
 
5
- TRTC products covered: Conference, Chat, Call, Live, RTC Engine, and Conversational AI (AI customer service / 智能客服 / voice agent / AI oral coach / 口语陪练 / speaking coach scenarios).
5
+ TRTC products covered: Conference, Chat, Call, Live, RTC Engine, Conversational AI (AI customer service / 智能客服 / voice agent / AI oral coach / 口语陪练 / speaking coach scenarios), and TIMPush (离线推送).
6
6
 
7
7
  For any TRTC-related request, read and follow `skills/trtc/SKILL.md` first.
8
8
  This file is an installed host bootstrap. The actual TRTC skill lives under
package/CODEBUDDY.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Reply in the user's language.
4
4
 
5
- TRTC products covered: Conference, Chat, Call, Live, RTC Engine, and Conversational AI (AI customer service / 智能客服 / voice agent / AI oral coach / 口语陪练 / speaking coach scenarios).
5
+ TRTC products covered: Conference, Chat, Call, Live, RTC Engine, Conversational AI (AI customer service / 智能客服 / voice agent / AI oral coach / 口语陪练 / speaking coach scenarios), and TIMPush (离线推送).
6
6
 
7
7
  For any TRTC-related request, read and follow `skills/trtc/SKILL.md` first.
8
8
  This file is an installed host bootstrap. The actual TRTC skill lives under
package/README.md CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  **English** | [简体中文](README.zh.md)
4
4
 
5
- An agent skill provided by [TRTC](https://trtc.io) (Tencent Real-Time Communication) to help developers integrate real-time audio/video, live streaming, and instant messaging into their apps — from first setup to production-ready code.
5
+ An agent skill provided by [TRTC](https://trtc.io/?utm_source=github&utm_medium=skill&utm_campaign=Twitter%20AI%20%E4%B8%93%E9%A1%B9%20-%20AI%20Oral%20Coach&_channel_track_key=HIzH2eVJ) (Tencent Real-Time Communication) to help developers integrate real-time audio/video, live streaming, instant messaging, and TIMPush offline push into their apps — from first setup to production-ready code.
6
6
 
7
7
  Instead of reading through long documentation, you describe what you want to build in plain language. The skill routes your request to the right knowledge, asks a few clarifying questions, and walks you through the integration step by step.
8
8
 
9
- You can use it to build scenarios like video conferencing, live streaming rooms, 1-on-1 video consultations, online classrooms, or customer support chat — across Web, iOS, Android, Flutter, and more.
9
+ You can use it to build scenarios like video conferencing, live streaming rooms, 1-on-1 video consultations, online classrooms, customer support chat, or mobile offline push — across Web, iOS, Android, Flutter, and more.
10
10
 
11
11
  ---
12
12
 
13
13
  ## About Tencent RTC
14
14
 
15
- [Tencent RTC](https://trtc.io) (Real-Time Communication) powers real-time audio, video, and conversational AI experiences for thousands of businesses worldwide. With a global edge network spanning 200+ countries and regions, TRTC delivers sub-300ms ultra-low latency at scale.
15
+ [Tencent RTC](https://trtc.io/?utm_source=github&utm_medium=skill&utm_campaign=Twitter%20AI%20%E4%B8%93%E9%A1%B9%20-%20AI%20Oral%20Coach&_channel_track_key=HIzH2eVJ) (Real-Time Communication) powers real-time audio, video, and conversational AI experiences for thousands of businesses worldwide. With a global edge network spanning 200+ countries and regions, TRTC delivers sub-300ms ultra-low latency at scale.
16
16
 
17
17
  ---
18
18
 
@@ -47,6 +47,8 @@ The skill activates automatically when you mention TRTC or describe a real-time
47
47
  | **Scenario walkthrough** | Loads a complete feature scenario and walks you through each capability in order, with code and checkpoints | • *"Walk me through building a complete conference room from scratch"*<br>• *"Guide me through a 1-on-1 video consultation end to end"* |
48
48
  | **AI customer service** | Builds a voice-first AI customer service agent from scratch — or wires the AI backend into your existing app. Covers credential setup, capability assembly (knowledge base, human handoff, tool calling, session summary), and launch | • *"Build me an AI customer service agent with TRTC"*<br>• *"I want to integrate AI customer service into my existing Node.js backend"*<br>• *"Help me set up TRTC Conversational AI"* |
49
49
  | **AI oral coach** | Builds a voice-first AI oral English speaking coach from scratch — or wires the AI backend into your existing app. Covers credential setup, capability assembly (scenario roleplay, quick correction, reply suggestions, ability report, custom learning KB), and launch | • *"Build me an AI oral English coach with TRTC"*<br>• *"I want to integrate AI speaking practice into my existing app"*<br>• *"Help me set up an AI speaking coach"* |
50
+ | **AI realtime interpreter** | Builds a real-time AI meeting interpreter from scratch — or wires the translation backend into your existing app. Covers credential setup, capability assembly (realtime translation, meeting fanout, bilingual subtitles, transcription), and launch | • *"Build me a real-time AI interpreter with TRTC"*<br>• *"I want to add real-time translation to my meeting room"*<br>• *"Help me set up AI meeting interpretation"* |
51
+ | **Push offline push** | Guides TIMPush integration and troubleshooting via `trtc-push-mcp`, covering Android, iOS, Flutter, UniApp, vendor channel setup, APNs, badge, server API, and console limit checks | • *"Help me integrate TIMPush"*<br>• *"Integrate Tencent Cloud offline push"*<br>• *"registerPush failed with 800006"* |
50
52
  | **Docs & lookup** | Answers factual questions from the official knowledge base with cited sources | • *"What does error code 6206 mean?"*<br>• *"How much does Conference cost per participant minute?"*<br>• *"What's the max number of participants?"* |
51
53
 
52
54
  The skill saves your progress in the project. If you close the tool and come back later, it picks up where you left off.
@@ -57,10 +59,11 @@ The skill saves your progress in the project. If you close the tool and come bac
57
59
 
58
60
  | Product | Description | Availability |
59
61
  |---------|-------------|--------------|
60
- | **Conference** | Video conferencing — multi-party meetings, screen sharing, in-meeting chat | Web ✅ |
61
- | **Conversational AI** | Voice-first AI agents — AI customer service (voice agent, knowledge base, human handoff, tool calling, session summary) and AI oral coach (scenario roleplay, quick correction, reply suggestions, ability report) | Web ✅ |
62
+ | **Conference** | Video conferencing — multi-party meetings, screen sharing, in-meeting chat | Web ✅ (Vue3 / React) |
63
+ | **Conversational AI** | Voice-first AI agents — AI customer service (voice agent, knowledge base, human handoff, tool calling, session summary), AI oral coach (scenario roleplay, quick correction, reply suggestions, ability report), and AI realtime interpreter (multilingual meeting interpretation, bilingual subtitles, fanout orchestration) | Web ✅ |
62
64
  | **Live** | Interactive live streaming — anchor/audience roles, co-hosting, barrage, gifts, beauty filters | Coming soon |
63
65
  | **Chat** | Instant messaging — messages, conversations, groups, user profiles | Web ✅ |
66
+ | **Push** | Tencent Cloud IM Push / offline push — Android/iOS push setup, vendor channels, APNs, Flutter, UniApp, badge, server API, and troubleshooting | Android / iOS / Flutter / UniApp ✅ |
64
67
  | **Call** | Audio/video calling — 1-on-1 and group calls | Coming soon |
65
68
  | **RTC Engine** | Low-level real-time audio/video engine — room management, publishing, subscribing | Coming soon |
66
69
 
@@ -77,7 +80,7 @@ When you describe what you want to build, the skill:
77
80
  - **Walks through** one capability at a time with production-ready code, waits for you to confirm it works, then moves to the next step
78
81
  - **Saves your progress** to `.trtc-session.yaml` in your project root (auto-added to `.gitignore`) so you can resume in a later session without re-explaining what you're building
79
82
 
80
- Step-by-step integration is currently available for **Conference on Web**, **Chat on Web**, and **Conversational AI (AI customer service & AI oral coach)**. The Conversational AI skills use their own capability model — they do not follow the slice/scenario pipeline; instead they guide you through credential setup, capability selection, and launch in a self-contained flow. Docs lookup, error code search, and pricing questions work across all TRTC products.
83
+ Step-by-step integration is currently available for **Conference on Web (Vue3 / React official RoomKit path)**, **Chat on Web**, **Conversational AI (AI customer service, AI oral coach & AI realtime interpreter)**, and **TIMPush offline push (Android / iOS / Flutter / UniApp)**. The Conversational AI skills use their own capability model — they do not follow the slice/scenario pipeline; instead they guide you through credential setup, capability selection, and launch in a self-contained flow. TIMPush uses the `trtc-push-mcp` workflow engine to drive platform detection, vendor setup, credential-safe local configuration, and troubleshooting. Docs lookup, error code search, and pricing questions work across all TRTC products.
81
84
 
82
85
  ### Knowledge base: Slices and Scenarios
83
86
 
@@ -102,4 +105,4 @@ The skill's knowledge is structured into two layers:
102
105
 
103
106
  ## Contact Us
104
107
 
105
- Need technical support or enterprise pricing? Submit your contact information at [trtc.io/contact](https://trtc.io/contact) and our team will get back to you shortly.
108
+ Need technical support or enterprise pricing? Submit your contact information at [trtc.io/contact](https://trtc.io/contact) and our team will get back to you shortly.
package/README.zh.md CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  **[English](README.md)** | 简体中文
4
4
 
5
- 由 [TRTC](https://trtc.io)(腾讯实时音视频)提供的 Agent Skill,帮助开发者将实时音视频、直播、即时通信能力集成到应用中——从零开始到可上线的代码。
5
+ 由 [TRTC](https://trtc.io/?utm_source=github&utm_medium=skill&utm_campaign=Twitter%20AI%20%E4%B8%93%E9%A1%B9%20-%20AI%20Oral%20Coach&_channel_track_key=HIzH2eVJ)(腾讯实时音视频)提供的 Agent Skill,帮助开发者将实时音视频、直播、即时通信和 TIMPush 离线推送能力集成到应用中——从零开始到可上线的代码。
6
6
 
7
7
  不需要翻文档,用自然语言描述你要做什么,Skill 会自动匹配对应知识、问几个关键问题,然后一步步带你完成集成。
8
8
 
9
- 可以用来构建视频会议、直播间、1v1 视频问诊、在线教室、客服会话等场景,支持 Web、iOS、Android、Flutter 等平台。
9
+ 可以用来构建视频会议、直播间、1v1 视频问诊、在线教室、客服会话、移动端离线推送等场景,支持 Web、iOS、Android、Flutter 等平台。
10
10
 
11
11
  ---
12
12
 
13
13
  ## 关于 Tencent RTC
14
14
 
15
- [Tencent RTC](https://trtc.io)(实时音视频)为全球数千家企业提供实时音频、视频和对话式 AI 体验。依托覆盖 200+ 国家和地区的全球边缘网络,TRTC 提供低于 300ms 的超低延迟大规模实时通信能力。
15
+ [Tencent RTC](https://trtc.io/?utm_source=github&utm_medium=skill&utm_campaign=Twitter%20AI%20%E4%B8%93%E9%A1%B9%20-%20AI%20Oral%20Coach&_channel_track_key=HIzH2eVJ)(实时音视频)为全球数千家企业提供实时音频、视频和对话式 AI 体验。依托覆盖 200+ 国家和地区的全球边缘网络,TRTC 提供低于 300ms 的超低延迟大规模实时通信能力。
16
16
 
17
17
  ---
18
18
 
@@ -47,6 +47,8 @@ npx -y @tencent-rtc/trtc-agent-skills@latest add --clean
47
47
  | **场景引导** | 加载完整场景,按顺序逐步实现每个能力,每步附代码和验证 | *"我想搭建一个会议应用"* · *"我想用 Conference 搭建一个医疗问诊场景"* |
48
48
  | **AI 客服搭建** | 从零搭建语音优先的 AI 客服智能体,或将 AI 客服后端接入现有应用。覆盖密钥配置、能力组装(知识库、人工转接、工具调用、会话摘要)、服务启动全流程 | *"帮我用 TRTC 搭建一个 AI 客服"* · *"我想把 AI 客服能力集成到我的 Node.js 后端"* · *"帮我接入 TRTC Conversational AI"* |
49
49
  | **AI 口语陪练** | 从零搭建语音优先的 AI 英语口语陪练教练,或将 AI 口语陪练后端接入现有应用。覆盖密钥配置、能力组装(场景角色扮演、单句纠正、接话建议、能力报告、自定义知识库)、服务启动全流程 | *"帮我用 TRTC 搭建一个 AI 口语陪练"* · *"我想把口语陪练能力集成到我的应用中"* · *"帮我搭建一个英语口语教练"* |
50
+ | **AI 实时翻译** | 从零搭建实时 AI 会议翻译,或将翻译后端接入现有应用。覆盖密钥配置、能力组装(实时翻译、会议扇出、双语字幕、转写记录)、服务启动全流程 | *"帮我用 TRTC 做一个 AI 实时会议翻译"* · *"我想把 AI 实时翻译能力接入我现有的会议室"* · *"帮我搭建一个同声传译系统"* |
51
+ | **Push 离线推送** | 通过 `trtc-push-mcp` 引导 TIMPush 集成和排障,覆盖 Android、iOS、Flutter、UniApp、厂商通道、APNs、角标、服务端 API 和控制台限制检查 | *"帮我集成 TIMPush"* · *"接入腾讯云离线推送"* · *"registerPush 报 800006"* |
50
52
  | **文档查询** | 从官方知识库检索事实性问题,每个答案附来源引用 | *"错误码 6206 是什么意思?"* · *"Conference 按分钟怎么计费?"* · *"会议室最多支持多少人?"* |
51
53
 
52
54
  Skill 会在项目中保存你的进度。关掉工具下次回来,可以从上次中断的地方继续,不需要重新复述你在做什么。
@@ -57,10 +59,11 @@ Skill 会在项目中保存你的进度。关掉工具下次回来,可以从
57
59
 
58
60
  | 产品 | 说明 | 可用状态 |
59
61
  |------|------|---------|
60
- | **Conference** | 视频会议——多人会议、屏幕共享、会中聊天 | Web |
61
- | **Conversational AI** | 语音优先的 AI 智能体——AI 客服(语音对话、知识库检索、人工转接、工具调用、会话摘要)与 AI 口语陪练(场景角色扮演、单句纠正、接话建议、能力报告) | Web ✅ |
62
+ | **Conference** | 视频会议——多人会议、屏幕共享、会中聊天 | Web ✅(Vue3 / React) |
63
+ | **Conversational AI** | 语音优先的 AI 智能体——AI 客服(语音对话、知识库检索、人工转接、工具调用、会话摘要)、AI 口语陪练(场景角色扮演、单句纠正、接话建议、能力报告)与 AI 实时翻译(多语言会议翻译、双语字幕、扇出编排) | Web ✅ |
62
64
  | **Live** | 互动直播——主播/观众、连麦、弹幕、礼物、美颜 | 即将支持 |
63
65
  | **Chat** | 即时通信——消息、会话、群组、用户资料 | Web ✅ |
66
+ | **Push** | 腾讯云即时通信推送 / 离线推送 TIMPush——Android/iOS 推送配置、厂商通道、APNs、Flutter、UniApp、角标、服务端 API 和排障 | Android / iOS / Flutter / UniApp ✅ |
64
67
  | **Call** | 音视频通话——1v1 和群组通话 | 即将支持 |
65
68
  | **RTC Engine** | 实时音视频引擎——进房、推流、拉流 | 即将支持 |
66
69
 
@@ -77,7 +80,7 @@ Skill 会在项目中保存你的进度。关掉工具下次回来,可以从
77
80
  - **逐步推进**,每次只处理一个能力,给出可用代码,等你确认成功后再继续
78
81
  - **保存进度**到项目根目录的 `.trtc-session.yaml`(自动加入 `.gitignore`),支持跨 session 续接
79
82
 
80
- 集成引导目前支持 **Conference Web**、**Chat Web** 和 **Conversational AI(AI 客服 & AI 口语陪练)**。Conversational AI Skill 拥有独立的能力模型,不走 Slice/Scenario 流水线,而是通过自闭环的引导流程完成密钥配置、能力选择和服务启动。文档查询、错误码搜索、计费咨询全产品可用(Conference、Live、Chat、Call、RTC Engine)。
83
+ 集成引导目前支持 **Conference Web(Vue3 / React 官方 RoomKit 路径)**、**Chat Web**、**Conversational AI(AI 客服、AI 口语陪练 & AI 实时翻译)** 和 **TIMPush 离线推送(Android / iOS / Flutter / UniApp)**。Conversational AI Skill 拥有独立的能力模型,不走 Slice/Scenario 流水线,而是通过自闭环的引导流程完成密钥配置、能力选择和服务启动。TIMPush 通过 `trtc-push-mcp` workflow engine 驱动平台识别、厂商配置、凭据安全的本地配置写入和排障流程。文档查询、错误码搜索、计费咨询全产品可用(Conference、Live、Chat、Call、RTC Engine、TIMPush)。
81
84
 
82
85
  ### 知识库:Slice 与 Scenario
83
86
 
@@ -103,4 +106,4 @@ Skill 的知识分两层:
103
106
 
104
107
  ## 联系我们
105
108
 
106
- 如需技术支持或企业定制优惠,可访问 [trtc.io/contact](https://trtc.io/contact) 提交联系方式,我们的团队将尽快与您联系。
109
+ 如需技术支持或企业定制优惠,可访问 [trtc.io/contact](https://trtc.io/contact) 提交联系方式,我们的团队将尽快与您联系。
package/bin/cli.js CHANGED
@@ -63,7 +63,9 @@ const SKILL_ALLOWLIST = new Set([
63
63
  "trtc-conference",
64
64
  "trtc-ai-service",
65
65
  "trtc-ai-oral-coach",
66
+ "trtc-ai-realtime-interpreter",
66
67
  "trtc-chat",
68
+ "trtc-push",
67
69
  ]);
68
70
 
69
71
  function getSkillNames() {
@@ -107,6 +109,96 @@ const MCP_TARGETS = {
107
109
  const MCP_SERVER_NAME = "tencent-rtc-skill-tool";
108
110
  const MCP_SERVER_ENTRY = "@tencent-rtc/skill-tool@latest";
109
111
 
112
+ // Multi-MCP registry. tencent-rtc-skill-tool is always installed via npx.
113
+ // trtc-push-mcp is now public on npm and should be installed automatically with
114
+ // the skill suite. Maintainers can still force a local checkout via
115
+ // TRTC_PUSH_MCP_ENTRY / TIMPUSH_MCP_ENTRY when validating unpublished MCP code.
116
+ const TRTC_PUSH_MCP_NAME = "trtc-push-mcp";
117
+ const TRTC_PUSH_MCP_PACKAGE = process.env.TRTC_PUSH_MCP_PACKAGE || "@tencent-rtc/trtc-push-mcp@1";
118
+
119
+ function getDefaultPathFallbacks({ platform = process.platform, env = process.env } = {}) {
120
+ if (platform === "win32") {
121
+ const systemRoot = env.SystemRoot || env.WINDIR || "C:\\Windows";
122
+ return [path.win32.join(systemRoot, "System32"), systemRoot];
123
+ }
124
+ return ["/opt/homebrew/bin", "/usr/local/bin", "/usr/bin", "/bin", "/usr/sbin", "/sbin"];
125
+ }
126
+
127
+ function buildNodePathEnv({
128
+ execPath = process.execPath,
129
+ pathEnv = process.env.PATH || "",
130
+ platform = process.platform,
131
+ env = process.env,
132
+ } = {}) {
133
+ const nodeBin = path.dirname(execPath);
134
+ const fallback = getDefaultPathFallbacks({ platform, env });
135
+ const seen = new Set();
136
+ return [nodeBin, ...pathEnv.split(path.delimiter), ...fallback]
137
+ .filter(Boolean)
138
+ .filter((part) => {
139
+ if (seen.has(part)) return false;
140
+ seen.add(part);
141
+ return true;
142
+ })
143
+ .join(path.delimiter);
144
+ }
145
+
146
+ function buildNpxMcpEntry(packageName, { execPath = process.execPath, pathEnv = process.env.PATH || "" } = {}) {
147
+ return {
148
+ type: "stdio",
149
+ command: "npx",
150
+ args: ["-y", packageName],
151
+ env: {
152
+ PATH: buildNodePathEnv({ execPath, pathEnv }),
153
+ },
154
+ };
155
+ }
156
+
157
+ function resolveTrtcPushMcpEntry({
158
+ env = process.env,
159
+ execPath = process.execPath,
160
+ existsSync = fs.existsSync,
161
+ } = {}) {
162
+ const fromEnv = env.TRTC_PUSH_MCP_ENTRY || env.TIMPUSH_MCP_ENTRY;
163
+ if (fromEnv && existsSync(fromEnv)) {
164
+ return {
165
+ command: "node",
166
+ args: [path.resolve(fromEnv)],
167
+ source: "env",
168
+ env: { TRTC_PUSH_MCP_REPORT_DISABLED: "1" },
169
+ };
170
+ }
171
+ return {
172
+ ...buildNpxMcpEntry(env.TRTC_PUSH_MCP_PACKAGE || TRTC_PUSH_MCP_PACKAGE, {
173
+ execPath,
174
+ pathEnv: env.PATH || "",
175
+ }),
176
+ source: "npm",
177
+ };
178
+ }
179
+
180
+ function getMcpServersToInstall() {
181
+ const servers = [
182
+ {
183
+ name: MCP_SERVER_NAME,
184
+ entry: buildNpxMcpEntry(MCP_SERVER_ENTRY),
185
+ },
186
+ ];
187
+ const trtcPushMcp = resolveTrtcPushMcpEntry();
188
+ const entry = {
189
+ type: "stdio",
190
+ command: trtcPushMcp.command,
191
+ args: trtcPushMcp.args,
192
+ };
193
+ if (trtcPushMcp.env) entry.env = trtcPushMcp.env;
194
+ const note =
195
+ trtcPushMcp.source === "npm"
196
+ ? `npm → ${trtcPushMcp.args[1]}`
197
+ : `local → ${trtcPushMcp.args[0]}`;
198
+ servers.push({ name: TRTC_PUSH_MCP_NAME, entry, note });
199
+ return servers;
200
+ }
201
+
110
202
  // Hooks distribution targets per IDE.
111
203
  // claude / codebuddy / codex: hooks/ files copied to <root>/.{ide}/hooks/, and
112
204
  // hooks/hooks.json is rewritten + merged into <root>/.{ide}/settings.json.
@@ -157,7 +249,6 @@ const HOOKS_TARGETS = {
157
249
  // PLUGIN_ROOT by walking up to the nearest dir containing skills/, so
158
250
  // this nested location still resolves correctly.
159
251
  hooksDir: ".cursor/hooks/trtc-agent-skills",
160
- hooksFiles: ["cursor-adapter.py"],
161
252
  settingsFile: ".cursor/hooks.json",
162
253
  sourceConfig: "hooks-cursor.json",
163
254
  // The hardcoded path string we need to rewrite in hooks-cursor.json.
@@ -171,11 +262,13 @@ const HOOKS_TARGETS = {
171
262
  // one of these path-segment hints — every guardrail script we ship lives under
172
263
  // `skills/<skill>/hooks/` or `skills/<skill>/guardrails/`, and the cursor
173
264
  // adapter under our namespaced hooks subdir.
265
+ // NOTE: trtc-topic and trtc-apply are no longer in SKILL_ALLOWLIST, but their
266
+ // hints are kept here so --clean can remove hook entries left by older installs.
174
267
  const OWNED_COMMAND_HINTS = [
175
268
  "/skills/trtc/hooks/",
176
269
  "/skills/trtc/room-builder/guardrails/",
177
- "/skills/trtc-topic/guardrails/",
178
- "/skills/trtc-apply/guardrails/",
270
+ "/skills/trtc-topic/guardrails/", // legacy — removed from allowlist, kept for cleanup
271
+ "/skills/trtc-apply/guardrails/", // legacy — removed from allowlist, kept for cleanup
179
272
  "/skills/trtc-conference/hooks/",
180
273
  "/hooks/trtc-agent-skills/cursor-adapter.py",
181
274
  ];
@@ -250,6 +343,30 @@ function isSymlink(p) {
250
343
  catch { return false; }
251
344
  }
252
345
 
346
+ // Local checkout install (npx from sibling / `node bin/cli.js` inside this repo)
347
+ // should symlink skills so edits under skills/ are live in IDE skill roots.
348
+ // Opt out with TRTC_SKILLS_COPY=1; force on with TRTC_SKILLS_SYMLINK=1.
349
+ function shouldSymlinkSkills(skillsRootAbs, resolvedRoot) {
350
+ if (process.env.TRTC_SKILLS_COPY === "1") return false;
351
+ if (process.env.TRTC_SKILLS_SYMLINK === "1") return true;
352
+ const pkg = path.resolve(PKG_ROOT);
353
+ const root = path.resolve(resolvedRoot);
354
+ const skillsRoot = path.resolve(skillsRootAbs);
355
+ return root === pkg || skillsRoot.startsWith(pkg + path.sep);
356
+ }
357
+
358
+ function installSkillDir(src, dest, { symlink }) {
359
+ rmrf(dest);
360
+ if (symlink) {
361
+ ensureDir(path.dirname(dest));
362
+ const rel = path.relative(path.dirname(dest), src);
363
+ fs.symlinkSync(rel || src, dest, "dir");
364
+ return "symlink";
365
+ }
366
+ copyRecursive(src, dest);
367
+ return "copy";
368
+ }
369
+
253
370
  // ── project root resolution ───────────────────────────────────────────────────
254
371
  // Walk UP from cwd for strong repo-root signals (P1 monorepo manifest,
255
372
  // P2 package.json workspaces, P3 .git). Otherwise P4 cwd-local package.json,
@@ -344,7 +461,7 @@ function printHelp() {
344
461
  ${c.dim("KB :")} ${c.gray("alongside the skills root as knowledge-base/")}
345
462
  ${c.dim("Hooks :")} ${c.gray("<projectRoot>/.{ide}/hooks/ + settings file with hook events wired")}
346
463
  ${c.dim("Rules :")} ${c.gray("CLAUDE.md / AGENTS.md / CODEBUDDY.md (marker-merged)")}
347
- ${c.dim("MCP :")} ${c.gray("tencent-rtc-skill-tool IDE mcp config (npx @tencent-rtc/skill-tool@latest)")}
464
+ ${c.dim("MCP :")} ${c.gray("tencent-rtc-skill-tool + npm trtc-push-mcp (local only with TRTC_PUSH_MCP_ENTRY)")}
348
465
 
349
466
  ${c.dim("Skills are copied as sibling dirs so relative routing (../trtc-onboarding) keeps working.")}
350
467
  `);
@@ -353,13 +470,12 @@ function printHelp() {
353
470
  function listSkills() {
354
471
  const descriptions = {
355
472
  "trtc": "Entry router — detects product/platform, routes to sub-skills",
473
+ "trtc-docs": "Docs & error-code lookup",
474
+ "trtc-conference": "Video conference / multi-person room scenarios",
356
475
  "trtc-ai-service": "AI customer service scenarios (TRTC Conversational AI)",
357
476
  "trtc-ai-oral-coach": "AI oral speaking coach / 口语陪练 (TRTC Conversational AI)",
358
- "trtc-onboarding": "Get-started / integration / troubleshooting flow",
359
- "trtc-docs": "Docs & error-code lookup",
360
- "trtc-topic": "Step-by-step scenario walkthrough",
361
- "trtc-search": "Internal slice lookup (AI-facing)",
362
- "trtc-apply": "Internal compile/integration quality gate",
477
+ "trtc-chat": "IM / Chat SDK integration",
478
+ "trtc-push": "TIMPush offline push integration (via trtc-push-mcp)",
363
479
  };
364
480
  console.log(`\n ${c.bold("Skills shipped in this package:")}\n`);
365
481
  for (const name of getSkillNames()) {
@@ -370,7 +486,7 @@ function listSkills() {
370
486
  }
371
487
 
372
488
  // ── core: skill install ─────────────────────────────────────────────────────────
373
- function cleanSkills(skillsRootAbs) {
489
+ function cleanSkills(skillsRootAbs, ide) {
374
490
  if (!fs.existsSync(skillsRootAbs)) return 0;
375
491
  let wiped = 0;
376
492
  for (const name of getSkillNames()) {
@@ -380,9 +496,15 @@ function cleanSkills(skillsRootAbs) {
380
496
  // also wipe a co-located knowledge-base copy if present
381
497
  const kb = path.join(path.dirname(skillsRootAbs), "knowledge-base");
382
498
  if (fs.existsSync(kb)) { rmrf(kb); }
383
- // also wipe a co-located hooks/ copy if present (npx-mode hook scripts)
384
- const hooks = path.join(path.dirname(skillsRootAbs), "hooks");
385
- if (fs.existsSync(hooks)) { rmrf(hooks); }
499
+ // Wipe only our exact hooks dir (not the IDE's hooks/ parent). For cursor
500
+ // this is the namespaced .cursor/hooks/trtc-agent-skills/ subdir; for other
501
+ // IDEs it coincides with the parent .{ide}/hooks/ dir.
502
+ const hooksTarget = HOOKS_TARGETS[ide];
503
+ const resolvedRoot = path.dirname(path.dirname(skillsRootAbs));
504
+ const hooksDir = hooksTarget
505
+ ? path.join(resolvedRoot, hooksTarget.hooksDir)
506
+ : path.join(path.dirname(skillsRootAbs), "hooks");
507
+ if (fs.existsSync(hooksDir)) { rmrf(hooksDir); }
386
508
  return wiped;
387
509
  }
388
510
 
@@ -464,14 +586,17 @@ function cleanHooksSettings(ideList, resolvedRoot) {
464
586
  }
465
587
  }
466
588
 
467
- function installSkills(skillsRootAbs) {
589
+ function installSkills(skillsRootAbs, resolvedRoot) {
468
590
  ensureDir(skillsRootAbs);
591
+ const symlink = shouldSymlinkSkills(skillsRootAbs, resolvedRoot);
592
+ const modes = [];
469
593
  for (const name of getSkillNames()) {
470
594
  const src = path.join(SKILLS_SRC, name);
471
- if (fs.existsSync(src)) {
472
- copyRecursive(src, path.join(skillsRootAbs, name));
473
- }
595
+ if (!fs.existsSync(src)) continue;
596
+ const mode = installSkillDir(src, path.join(skillsRootAbs, name), { symlink });
597
+ modes.push({ name, mode });
474
598
  }
599
+ return { symlink, modes };
475
600
  }
476
601
 
477
602
  // Copy knowledge-base so that skills can resolve it. Skills use
@@ -714,11 +839,7 @@ function installAiInstructions(ideList, resolvedRoot) {
714
839
 
715
840
  // ── MCP installation ──────────────────────────────────────────────────────────
716
841
  function installMcp(ideList, resolvedRoot) {
717
- const serverEntry = {
718
- type: "stdio",
719
- command: "npx",
720
- args: ["-y", MCP_SERVER_ENTRY],
721
- };
842
+ const servers = getMcpServersToInstall();
722
843
 
723
844
  for (const ide of ideList) {
724
845
  const mcpTarget = MCP_TARGETS[ide];
@@ -730,7 +851,9 @@ function installMcp(ideList, resolvedRoot) {
730
851
  ensureDir(path.dirname(configPath));
731
852
 
732
853
  if (mcpTarget.format === "toml") {
733
- installMcpToml(configPath, serverEntry);
854
+ for (const server of servers) {
855
+ installMcpToml(configPath, server.name, server.entry);
856
+ }
734
857
  } else {
735
858
  let config = {};
736
859
  if (fs.existsSync(configPath)) {
@@ -740,27 +863,39 @@ function installMcp(ideList, resolvedRoot) {
740
863
  if (!config.mcpServers || typeof config.mcpServers !== "object") {
741
864
  config.mcpServers = {};
742
865
  }
743
- config.mcpServers[MCP_SERVER_NAME] = serverEntry;
866
+ for (const server of servers) {
867
+ config.mcpServers[server.name] = server.entry;
868
+ }
744
869
  fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", "utf8");
745
870
  }
746
- console.log(c.green(" ✓ ") + `${ide} MCP → ${configPath}`);
871
+ const labels = servers
872
+ .map(s => s.name + (s.note ? ` (${s.note})` : ""))
873
+ .join(", ");
874
+ console.log(c.green(" ✓ ") + `${ide} MCP → ${configPath}` + c.dim(` [${labels}]`));
747
875
  }
748
876
  }
749
877
 
750
- function installMcpToml(configPath, serverEntry) {
878
+ function installMcpToml(configPath, serverName, serverEntry) {
751
879
  let content = fs.existsSync(configPath) ? fs.readFileSync(configPath, "utf8") : "";
752
880
 
753
- const sectionHeader = `[mcp_servers.${MCP_SERVER_NAME}]`;
881
+ const sectionHeader = `[mcp_servers.${serverName}]`;
754
882
  const argsValue = JSON.stringify(serverEntry.args).replace(/,/g, ", ");
755
- const newSection = [
883
+ const lines = [
756
884
  sectionHeader,
757
885
  `command = "${serverEntry.command}"`,
758
886
  `args = ${argsValue}`,
759
- ].join("\n") + "\n";
887
+ ];
888
+ if (serverEntry.env && typeof serverEntry.env === "object") {
889
+ for (const [k, v] of Object.entries(serverEntry.env)) {
890
+ lines.push(`[mcp_servers.${serverName}.env]`);
891
+ lines.push(`${k} = "${String(v).replace(/"/g, '\\"')}"`);
892
+ }
893
+ }
894
+ const newSection = lines.join("\n") + "\n";
760
895
 
761
- const escapedName = MCP_SERVER_NAME.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
896
+ const escapedName = serverName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
762
897
  const sectionRegex = new RegExp(
763
- `\\[mcp_servers\\.${escapedName}\\]\\n(?:(?!\\[)[^\\n]*\\n)*`,
898
+ `\\[mcp_servers\\.${escapedName}\\](?:\\.[^\\]\\n]+)?\\n(?:(?!\\[)[^\\n]*\\n)*`,
764
899
  "g"
765
900
  );
766
901
  content = content.replace(sectionRegex, "");
@@ -784,7 +919,7 @@ function installClaudePermissions(ideList, resolvedRoot) {
784
919
  if (!settings.permissions || typeof settings.permissions !== "object") settings.permissions = {};
785
920
  if (!Array.isArray(settings.permissions.allow)) settings.permissions.allow = [];
786
921
 
787
- const rules = [`mcp__${MCP_SERVER_NAME}__*`];
922
+ const rules = [`mcp__${MCP_SERVER_NAME}__*`, `mcp__${TRTC_PUSH_MCP_NAME}__*`];
788
923
  const added = rules.filter(r => !settings.permissions.allow.includes(r));
789
924
  if (added.length > 0) {
790
925
  settings.permissions.allow.push(...added);
@@ -810,9 +945,13 @@ function installCursorPermissions(ideList, resolvedRoot) {
810
945
  }
811
946
  if (!Array.isArray(perms.mcpAllowlist)) perms.mcpAllowlist = [];
812
947
 
813
- const rule = `${MCP_SERVER_NAME}:skill_analysis`;
814
- if (!perms.mcpAllowlist.includes(rule)) {
815
- perms.mcpAllowlist.push(rule);
948
+ const rules = [
949
+ `${MCP_SERVER_NAME}:skill_analysis`,
950
+ `${TRTC_PUSH_MCP_NAME}:*`,
951
+ ];
952
+ const added = rules.filter(r => !perms.mcpAllowlist.includes(r));
953
+ if (added.length > 0) {
954
+ perms.mcpAllowlist.push(...added);
816
955
  fs.writeFileSync(permPath, JSON.stringify(perms, null, 2) + "\n", "utf8");
817
956
  console.log(c.green(" ✓ ") + `cursor permissions → ${permPath}`);
818
957
  } else {
@@ -914,12 +1053,15 @@ function main() {
914
1053
  console.log(` ${c.bold(ide)} ${c.gray("→ " + skillsRootAbs + "/")}`);
915
1054
 
916
1055
  if (isClean) {
917
- const wiped = cleanSkills(skillsRootAbs);
1056
+ const wiped = cleanSkills(skillsRootAbs, ide);
918
1057
  if (wiped > 0) console.log(c.dim(` ✓ cleaned ${wiped} existing skill ${wiped === 1 ? "entry" : "entries"}`));
919
1058
  }
920
1059
 
921
- installSkills(skillsRootAbs);
922
- for (const name of getSkillNames()) console.log(c.green(" ✓ ") + name + "/");
1060
+ const { modes } = installSkills(skillsRootAbs, resolvedRoot);
1061
+ for (const { name, mode } of modes) {
1062
+ const tag = mode === "symlink" ? c.dim(" (symlink → skills/" + name + ")") : "";
1063
+ console.log(c.green(" ✓ ") + name + "/" + tag);
1064
+ }
923
1065
 
924
1066
  const kbDest = copyKnowledgeBase(skillsRootAbs);
925
1067
  console.log(c.green(" ✓ ") + "knowledge-base/ " + c.dim("→ " + kbDest));
@@ -947,10 +1089,20 @@ function main() {
947
1089
  console.log(`\n ${c.bold("Done.")} ${c.dim("Just describe what you want to build in your IDE — the skill activates automatically.")}\n`);
948
1090
  }
949
1091
 
950
- try {
951
- main();
952
- } catch (err) {
953
- console.error(c.red(`\n Error: ${err.message || err}\n`));
954
- if (err.stack && process.env.DEBUG) console.error(c.dim(err.stack) + "\n");
955
- process.exit(1);
1092
+ module.exports = {
1093
+ getDefaultPathFallbacks,
1094
+ buildNodePathEnv,
1095
+ buildNpxMcpEntry,
1096
+ resolveTrtcPushMcpEntry,
1097
+ getMcpServersToInstall,
1098
+ };
1099
+
1100
+ if (require.main === module) {
1101
+ try {
1102
+ main();
1103
+ } catch (err) {
1104
+ console.error(c.red(`\n Error: ${err.message || err}\n`));
1105
+ if (err.stack && process.env.DEBUG) console.error(c.dim(err.stack) + "\n");
1106
+ process.exit(1);
1107
+ }
956
1108
  }
@@ -107,20 +107,20 @@ slices:
107
107
 
108
108
  - id: conference/official-roomkit-api
109
109
  name: 官方 RoomKit 适配层 API
110
- keywords: [roomkit, tuiroomkit, tui-roomkit, conference-api]
110
+ keywords: [roomkit, tuiroomkit, tui-roomkit, conference-api, react, vue3, roomkit-web-react]
111
111
  tags: [official-roomkit, conference-api, conference-object, setWidgetVisible, registerWidget,
112
- onWill, setFeatureConfig, createAndJoinRoom, joinRoom, UIKitProvider]
112
+ onWill, setFeatureConfig, createAndJoinRoom, joinRoom, UIKitProvider, React, Vue3]
113
113
  file: slices/conference/web/official-roomkit-api.md
114
114
  description: >
115
- 官方 RoomKit 集成模式下 conference 对象的完整 API 签名、枚举定义、调用时序和代码示例
115
+ 官方 RoomKit 集成模式下 Vue3 / React conference 对象的完整 API 签名、枚举定义、调用时序和代码示例
116
116
  (ui_mode=official-roomkit 专用)
117
117
 
118
118
  - id: conference/official-roomkit-login-ui
119
119
  name: 官方 RoomKit 登录 UI
120
- keywords: [roomkit, login-ui, tuiroomkit]
121
- tags: [official-roomkit, login-ui, layout, form, UIKitProvider, LoginPanel]
120
+ keywords: [roomkit, login-ui, tuiroomkit, react, vue3]
121
+ tags: [official-roomkit, login-ui, layout, form, UIKitProvider, LoginPanel, React, Vue3]
122
122
  file: slices/conference/web/official-roomkit-login-ui.md
123
- description: 官方 RoomKit 登录页的布局、表单、凭证提示与状态反馈规范,包括 UIKitProvider 与 LoginPanel 集成约束
123
+ description: 官方 RoomKit 登录页的布局、表单、凭证提示与状态反馈规范,包括 Vue3 / React UIKitProvider 与 LoginPanel 集成约束
124
124
 
125
125
  - id: conference/integration-audit
126
126
  name: Conference Web 集成审计