@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.
- package/AGENTS.md +1 -1
- package/CLAUDE.md +1 -1
- package/CODEBUDDY.md +1 -1
- package/README.md +10 -7
- package/README.zh.md +10 -7
- package/bin/cli.js +196 -44
- package/knowledge-base/conference/web/index.yaml +6 -6
- package/knowledge-base/slices/conference/web/official-roomkit-api.md +119 -8
- package/package.json +1 -1
- package/skills/trtc/SKILL.md +45 -10
- package/skills/trtc-ai-oral-coach/README.ja.md +3 -3
- package/skills/trtc-ai-oral-coach/README.md +3 -3
- package/skills/trtc-ai-oral-coach/README.zh-CN.md +3 -3
- package/skills/trtc-ai-oral-coach/SKILL.md +7 -4
- package/skills/trtc-ai-realtime-interpreter/README.ja.md +197 -0
- package/skills/trtc-ai-realtime-interpreter/README.md +197 -0
- package/skills/trtc-ai-realtime-interpreter/README.zh-CN.md +197 -0
- package/skills/trtc-ai-realtime-interpreter/SKILL.md +748 -0
- package/skills/trtc-ai-realtime-interpreter/auto_adapters/integration_templates/generic-rest-api.md +85 -0
- package/skills/trtc-ai-realtime-interpreter/auto_adapters/integration_templates/room-owner-authz-note.md +53 -0
- package/skills/trtc-ai-realtime-interpreter/auto_adapters/manifest.yaml +49 -0
- package/skills/trtc-ai-realtime-interpreter/auto_adapters/python/README.md +11 -0
- package/skills/trtc-ai-realtime-interpreter/auto_adapters/python/fastapi_reverse_proxy.py.tpl +84 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/.env.example +17 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/frontend/silent-listener.ts +91 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/manifest.yaml +110 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/requirements.txt +5 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/__init__.py +0 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/_capability_loader.py +89 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/agent.py +153 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/credentials.py +112 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/health.py +218 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/log_filter.py +33 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/server.py +266 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/trtc_client.py +188 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/conversation-core/src/usersig.py +53 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/README.md +46 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/manifest.yaml +63 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/src/__init__.py +0 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/src/fanout.py +149 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/meeting-ops/src/router.py +83 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/frontend/subtitle-parser.ts +145 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/manifest.yaml +68 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/src/__init__.py +0 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/src/modes.py +73 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/src/router.py +83 -0
- package/skills/trtc-ai-realtime-interpreter/capabilities/realtime-translation/src/service.py +77 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/README.md +23 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/backend/app/__init__.py +0 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/backend/app/server.py +277 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/backend/requirements.txt +5 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/backend/start.sh +28 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/recipe.yaml +72 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/index.html +12 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/legacy/index.html +738 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/package-lock.json +4302 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/package.json +33 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/postcss.config.js +6 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/App.vue +18 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/api/backend.ts +82 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/SetupScreen.vue +362 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/SummaryScreen.vue +203 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/ChatPanel.vue +188 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/ConferenceRoom.vue +453 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/ParticipantViewUI.vue +170 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/PeoplePanel.vue +206 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/SidePanel.vue +77 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/Toolbar.vue +371 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/TopBar.vue +310 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/components/conference/TranscriptPanel.vue +225 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/composables/useAiInterpreter.ts +263 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/composables/useConference.ts +98 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/env.d.ts +7 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/main.ts +5 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/store.ts +103 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/src/style.css +19 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/tailwind.config.js +25 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/tsconfig.json +25 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/tsconfig.node.json +10 -0
- package/skills/trtc-ai-realtime-interpreter/scenarios/meeting-interpreter/ui/vite.config.ts +26 -0
- package/skills/trtc-ai-realtime-interpreter/scripts/add-capability.py +163 -0
- package/skills/trtc-ai-realtime-interpreter/scripts/deploy-demo.sh +64 -0
- package/skills/trtc-ai-realtime-interpreter/scripts/lib/__init__.py +0 -0
- package/skills/trtc-ai-realtime-interpreter/scripts/lib/credential_validators.py +143 -0
- package/skills/trtc-ai-realtime-interpreter/scripts/lib/manifest_resolver.py +60 -0
- package/skills/trtc-ai-realtime-interpreter/scripts/lib/stack_detector.py +50 -0
- package/skills/trtc-ai-realtime-interpreter/scripts/post-install-patch.py +79 -0
- package/skills/trtc-ai-realtime-interpreter/scripts/verify-credentials.py +76 -0
- package/skills/trtc-ai-realtime-interpreter/start.sh +85 -0
- package/skills/trtc-ai-realtime-interpreter/triggers.yaml +29 -0
- package/skills/trtc-ai-service/README.ja.md +3 -3
- package/skills/trtc-ai-service/README.md +3 -3
- package/skills/trtc-ai-service/README.zh-CN.md +3 -3
- package/skills/trtc-ai-service/SKILL.md +9 -7
- package/skills/trtc-ai-service/capabilities/conversation-core/src/credentials.py +1 -1
- package/skills/trtc-chat/SKILL.md +1 -1
- package/skills/trtc-chat/docs/SKILL.md +1 -1
- package/skills/trtc-conference/flows/onboarding.md +6 -0
- package/skills/trtc-conference/flows/topic.md +6 -2
- package/skills/trtc-conference/playbooks/official-roomkit.md +3 -1
- package/skills/trtc-conference/tests/test_conference_index_contract.py +16 -0
- package/skills/trtc-conference/tests/test_conference_onboarding_contract.py +9 -0
- package/skills/trtc-conference/tests/test_conference_topic_flow_contract.py +16 -0
- package/skills/trtc-push/SKILL.md +118 -0
- package/skills/trtc-push/issues/ROUTER.json +429 -0
- package/skills/trtc-push/issues/cards/android/fcm-gms-domestic.md +53 -0
- package/skills/trtc-push/issues/cards/android/vendor-huawei.md +72 -0
- package/skills/trtc-push/issues/cards/common/console-certificate-quota.md +46 -0
- package/skills/trtc-push/issues/cards/common/registration-binding.md +67 -0
- package/skills/trtc-push/issues/cards/ios/aps-environment-3000.md +55 -0
- package/skills/trtc-push/issues/cards/ios/certificate-businessid.md +56 -0
- package/skills/trtc-push/issues/cards/ios/xcodegen-cocoapods-module.md +54 -0
- package/skills/trtc-push/issues/flows/android/delivered-not-displayed.md +52 -0
- package/skills/trtc-push/issues/flows/android/vendor-not-received.md +57 -0
- package/skills/trtc-push/issues/flows/common/badge.md +49 -0
- package/skills/trtc-push/issues/flows/common/console-product-limits.md +48 -0
- package/skills/trtc-push/issues/flows/common/server-api.md +51 -0
- package/skills/trtc-push/issues/flows/cross-platform/harmonyos.md +51 -0
- package/skills/trtc-push/issues/flows/cross-platform/uniapp-integration.md +57 -0
- package/skills/trtc-push/issues/flows/ios/offline-not-received.md +57 -0
- package/skills/trtc-push/references/code-templates.md +386 -0
- package/skills/trtc-push/references/hard-rules.md +112 -0
- package/skills/trtc-push/references/timpush-sdk-api.md +72 -0
- package/skills/trtc-push/references/workflow-protocol.md +82 -0
- /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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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)
|
|
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**,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
359
|
-
"trtc-
|
|
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
|
-
//
|
|
384
|
-
|
|
385
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.${
|
|
881
|
+
const sectionHeader = `[mcp_servers.${serverName}]`;
|
|
754
882
|
const argsValue = JSON.stringify(serverEntry.args).replace(/,/g, ", ");
|
|
755
|
-
const
|
|
883
|
+
const lines = [
|
|
756
884
|
sectionHeader,
|
|
757
885
|
`command = "${serverEntry.command}"`,
|
|
758
886
|
`args = ${argsValue}`,
|
|
759
|
-
]
|
|
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 =
|
|
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
|
|
814
|
-
|
|
815
|
-
|
|
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
|
|
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
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
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 集成审计
|