Files
VibeCoding/AGENTS.md

14 KiB
Raw Blame History

AGENTS.md — 项目全局规则

本仓库是一个 WebRTC 远程控制系统 的多端单体仓库monorepo包含 Android 被控端、多平台控制端Android / iOS / Flutter / Web、Spring Boot 信令服务器及其后台管理前端。


一、工程总览

目录 工程类型 主语言 构建工具 角色
WebRTCSignalServer/ Spring Boot 后端 Java 25 Maven 信令服务器 + REST API
WebRTCSignalServerWeb/ Vue3 SPA TypeScript Vite 服务器后台管理前端
WebRTCControlled/ Android App Java Gradle 被控端(投屏 + 接收指令)
WebRTCController/ Android App Java Gradle 控制端(观看 + 发送指令)
webrtc_controller_flutter/ Flutter App Dart Flutter CLI 控制端Android/iOS 跨平台)
webrtc_controller_ios/ iOS App Swift 5 Xcode + SPM 控制端(原生 iOS
WebRTCControllerWeb/ Vue3 SPA JavaScript Vite 控制端(网页版)
AdbLoopbackController/ Android App Java Gradle ADB 回环控制工具(独立)
vue-vben-admin-origin/ 第三方模板 TypeScript pnpm 只读参考,禁止修改

二、各工程详细规则

1. WebRTCSignalServer/ — 信令服务器

  • 类型Spring Boot 4.1.0 应用,spring-boot-starter-parent
  • 语言Java 25<java.version>25</java.version>
  • 坐标com.tt:webrtc-signal-server:1.0.0
  • 核心依赖spring-boot-starter-websocketstarter-webstarter-data-jpaMySQLstarter-data-redisstarter-validationspring-security-crypto(仅 BCrypt 编码器,不启用 Security 自动配置、Jackson
  • 测试spring-boot-starter-test + H2无外部 MySQL 时上下文可启动)
  • 构建mvn clean package / mvn spring-boot:run

AI 规则

  • 使用 Java 25 语法,可用 record、sealed、switch 模式匹配、文本块。
  • 持久化统一走 JPA Repository不要手写 JDBC。
  • Redis 用于在线状态、频控计数、nonce 去重、踢线广播。新增缓存需说明 key 规范与 TTL。
  • 密码只允许 BCrypt 编码,禁止明文或可逆加密存储。
  • 请求体参数校验统一使用 jakarta.validation 注解,不在 Controller 里手写 if 校验。
  • 不要引入 Spring Security 的完整过滤器链(当前设计是刻意只用 crypto 模块)。
  • 信令协议改动必须同步更新所有客户端Android / iOS / Flutter / Web

2. WebRTCSignalServerWeb/ — 后台管理前端

  • 类型Vue 3 SPAESM"type": "module"
  • 技术栈Vue ^3.5.12 + TypeScript ^5.6.3 + Vite ^5.4.10 + Pinia ^2.2.4 + Vue Router ^4.4.5 + Element Plus ^2.8.4 + ECharts ^5.5.1 + axios ^1.7.7
  • 脚本npm run dev / npm run build(含 vue-tsc --noEmit/ npm run preview(端口 5180

AI 规则

  • 统一使用 <script setup lang="ts"> + Composition API禁止 Options API。
  • UI 组件一律用 Element Plus图标用 @element-plus/icons-vue,不引入其他 UI 库。
  • 状态管理用 Pinia禁止 Vuex。
  • 所有请求走统一封装的 axios 实例,不在组件内直接 fetch
  • 构建前必须通过 vue-tsc 类型检查,禁止用 any 绕过报错。
  • 风格可参考 vue-vben-admin-origin/,但只读参考,不得拷贝整块代码或改动该目录。

3. WebRTCControlled/ — Android 被控端

  • 类型Android AppapplicationId / namespace = com.ttstd.controlled
  • 语言Java(源码全部为 .java;虽启用了 Kotlin/kapt 插件,但仅用于注解处理)
  • SDKcompileSdk 34 / minSdk 24 / targetSdk 34Java 兼容 VERSION_1_8jvmTarget = 1.8
  • buildFeaturesdataBindingbuildConfigaidl 均开启
  • 核心依赖WebRTC io.github.webrtc-sdk:android:144.7559.09、Protobuf 3.25.1、Gson 2.14.0、Retrofit 3.0.0 + OkHttp 5.3.2、RxJava3 + RxAndroid、Room 2.8.4、Lifecycle 2.10.0、androidx.security:security-crypto:1.1.0、MMKV 2.4.0、Glide 4.15.1
  • BuildConfig 字段API_BASEDEVICE_PROVISION_SECRET
  • 构建变体debug / release / zhanRuiDebug / zhanRuiRelease / CrosshatchDebug / CrosshatchReleasezhanRui 与 Crosshatch 变体使用 src/system/AndroidManifest.xml(系统签名场景)
  • 签名keypub / crosshatch / zhanxun,配置来自 rootProject.ext.signingConfigs(外部 config.gradle

AI 规则

  • 新代码一律用 Java 编写,不要擅自引入 Kotlin 源文件。
  • 语言级别限制在 Java 8禁止使用 Java 9+ 的 APIList.ofvar 之外的新特性需确认脱糖支持)。
  • 异步统一使用 RxJava3 + rxlifecycle4 管理生命周期,禁止裸 Thread / AsyncTask
  • 网络请求走 Retrofit + OkHttpJSON 用 GsonDataChannel 控制指令用 Protobuf 二进制,信令消息用 JSON,两者不可混用。
  • 敏感数据(deviceSecret / deviceUid / accessToken)必须存 security-crypto 加密 SharedPreferences禁止明文 SP 或硬编码。
  • DEVICE_PROVISION_SECRETAPI_BASE 是开发期占位值,禁止把真实密钥写入 build.gradle,应通过 flavor / CI 注入。
  • 修改签名配置、变体名或 src/system/AndroidManifest.xml 前必须先确认,涉及系统签名固件适配。
  • Room 实体/DAO 变更必须提供 Migration禁止 fallbackToDestructiveMigration

4. WebRTCController/ — Android 控制端

  • 类型Android AppapplicationId / namespace = com.ttstd.controller
  • 语言 / SDK / 依赖:与 WebRTCControlled 完全一致Java、compileSdk 34、minSdk 24、同一套依赖集
  • BuildConfig 字段API_BASEWS_URL

AI 规则

  • WebRTCControlled 的全部 Android 规则。
  • 该模块与被控端共享协议层代码Protobuf .proto、信令 JSON 结构),任一端修改协议必须双端同步,并同步 Flutter / iOS / Web 三端。
  • 修复 appName() 返回值前请先确认,可能影响既有 CI 产物名。

5. webrtc_controller_flutter/ — Flutter 控制端

  • 类型Flutter AppAndroid + iOS版本 1.0.0+1
  • 语言Dart SDK ^3.12.2
  • 核心依赖flutter_webrtc: ^1.5.2web_socket_channel: ^3.0.3protobuf: ^6.0.0 + fixnum: ^1.1.1flutter_secure_storage: ^9.0.0device_info_plus: ^11.0.0android_id: ^0.5.2+1http: ^1.2.0uuid: ^4.4.0path_provider: ^2.1.5
  • Lintflutter_lints: ^6.0.0
  • 入口lib/main.dartMyAppCupertinoAppControllerHome
  • 关键目录lib/config/ice_servers.dartlib/signaling/lib/webrtc/lib/controller/lib/widgets/
  • iOS:已配置 ios/Podfile 以支持 flutter_webrtc

AI 规则

  • 遵循 flutter_lints 规则,提交前跑 flutter analyze,不得有 warning。
  • 保持现有分层:config / signaling / webrtc / controller / widgets,新代码放入对应层,不要在 main.dart 堆逻辑。
  • UI 使用 Cupertino 风格(项目基调为 CupertinoApp),保持一致性。
  • 敏感凭据用 flutter_secure_storage,禁止 SharedPreferences 明文存储。
  • 控制指令编码必须与 Android 端 Protobuf schema 保持字段号一致。
  • 新增依赖需在 pubspec.yaml 锁定 caret 版本,并说明引入理由。
  • 改动 iOS 原生依赖后需提示执行 cd ios && pod install

6. webrtc_controller_ios/ — 原生 iOS 控制端

  • 类型iOS AppBundle ID com.ttstd.web-rtc-controller-ios
  • 语言Swift 5.0IPHONEOS_DEPLOYMENT_TARGET = 15.0
  • 依赖管理Swift Package Manager(远程包 WebRTC无 CocoaPods
  • 架构UIKitAppDelegate + SceneDelegate+ SwiftUIContentView)混合
  • 代码分组App/Signaling/Control/WebRTC/Views/ViewModel/Utils/
  • 关键文件WebRTCClient.swiftSignalingClient.swiftControlMessage.swiftControllerViewModel.swiftRemoteTouchView.swiftRemoteVideoView.swiftVideoRecorder.swift

AI 规则

  • 只用 Swift不引入 Objective-C 文件。
  • 依赖统一走 SPM禁止添加 Podfile / CocoaPods
  • 遵循 MVVM视图逻辑放 ViewModel/,网络与 WebRTC 逻辑放 Signaling/WebRTC/,不要在 View 中直接持有 RTCPeerConnection
  • 保持最低支持 iOS 15.0,禁止使用更高版本独占 API必要时用 @available 兜底)。
  • 修改 project.pbxproj 需谨慎,优先通过 Xcode 操作而非手改文本。
  • 控制消息结构(ControlMessage.swift)需与其他端协议对齐。

7. WebRTCControllerWeb/ — 网页控制端

  • 类型Vue 3 SPAESM
  • 技术栈Vue ^3.4.21 + Vite ^5.2.0 + protobufjs: ^7.3.2纯 JavaScript无 TypeScript
  • 脚本npm run dev / npm run build / npm run preview

AI 规则

  • 该工程未启用 TypeScript不要擅自引入 .ts 或 tsconfig,除非用户明确要求迁移。
  • 使用 <script setup> + Composition API。
  • WebRTC 直接用浏览器原生 APIRTCPeerConnection / RTCDataChannel),不要引入 adapter 之外的第三方封装库。
  • 控制指令用 protobufjs 编解码,.proto 定义须与 Android / iOS / Flutter 端一致。
  • 保持依赖精简,新增依赖前先确认是否有原生 API 替代方案。

8. AdbLoopbackController/ — ADB 回环控制工具

  • 类型Android AppapplicationId / namespace = com.ttstd.adbloopback
  • 语言Java无 KotlinJava 兼容 VERSION_1_8
  • SDKAGP 8.1.4compileSdk 34 / minSdk 24 / targetSdk 34
  • 依赖:仅 appcompat:1.6.1material:1.11.0constraintlayout:2.1.4
  • 入口MainActivity
  • 特色:自实现 ADB 协议栈 —— adb/AdbConnectionAdbPairingAdbStreamTlsPskClient
  • 签名:依赖外部 config.gradlesigningConfigs.keypub

AI 规则

  • 纯 Java 项目,不要引入 Kotlin
  • 依赖保持极简,新增第三方库前必须说明必要性。
  • adb/ 包是手写的 ADB 无线调试协议(含配对与 TLS-PSK 握手)实现,改动需严格对照 ADB 协议规范,任何修改都要说明协议依据。
  • 与 WebRTC 系列工程相互独立,不要在两者间引入耦合。

9. vue-vben-admin-origin/ — 第三方模板(只读)

  • 类型:上游开源后台模板 vue-vben-adminTypeScript + Vue 3 monorepopnpm
  • 用途:仅作为 WebRTCSignalServerWeb 的风格与实现参考

AI 规则

  • 严禁修改该目录下任何文件,也不要为其安装依赖或执行构建。
  • 不要将其纳入代码搜索的改动范围;检索到的匹配结果仅供参考。
  • 需要复用其能力时,在 WebRTCSignalServerWeb 中重新实现,而非拷贝目录。

三、跨工程通用规则

协议一致性(最高优先级)

本系统有 1 个被控端 + 5 个控制端,通信协议改动影响面极大:

  • 信令通道WebSocket + JSON
  • 控制指令通道WebRTC DataChannel + Protobuf 二进制
  • 修改 .proto 文件或信令 JSON 字段时,必须同时更新WebRTCControlledWebRTCControllerwebrtc_controller_flutterwebrtc_controller_iosWebRTCControllerWebWebRTCSignalServer
  • Protobuf 字段号只增不改不删;废弃字段用 reserved 标记。
  • 指令类型TOUCH / SWIPE / KEY 等)新增时需在所有端补齐分支处理。

安全

  • 禁止在源码、build.gradlepubspec.yamlapplication.yml 中硬编码真实密钥、证书口令、生产地址。
  • 现有占位值(dev-device-provision-secret-change-me192.168.5.224:8080)为开发默认值,不要当作正式配置扩散。
  • 签名文件与密码通过 config.gradle / CI 环境变量注入,不进版本库。
  • 客户端凭据一律加密存储Android: security-cryptoFlutter: secure_storageiOS: Keychain

JSON / 序列化库选型规范

  • 禁止使用 fastjson
  • 各平台按以下原则选型:
平台 / 语言 推荐库 备选
Spring BootJava Jacksonspring-boot-starter-web 已内置)
AndroidJava Gson Jackson体积稍大但功能更强
AndroidKotlin kotlinx.serialization Moshi已有技术积累的项目可沿用
纯后端 Kotlin非 Spring Boot kotlinx.serialization Jackson
iOSSwift Codable(系统原生)
FlutterDart json_annotation + json_serializable + freezed
  • 例外流程:若因第三方依赖必须使用其他库,需提交技术评审并锁定版本、开启安全扫描。

ViewModel 规则

  • 绝不持有 ContextViewModel 中严格禁止持有 ContextActivityFragmentView 的引用。若需要 Application Context,请继承 AndroidViewModel(但优先推荐使用 Hilt 注入所需依赖)。
  • 数据暴露规范
    • 对外只暴露不可变的 LiveData<T>
    • 内部维护私有的 MutableLiveData<T>
    • 示例:
      private final MutableLiveData<UserUiState> _uiState = new MutableLiveData<>();
      public LiveData<UserUiState> getUiState() {
          return _uiState;
      }
      

代码修改

  • 优先做最小化定向修改,不要对既有大文件做整体重写或重构。
  • 修改前先读取文件当前内容,避免基于陈旧上下文编辑。
  • 不要主动创建 *.md 文档、示例文件或临时脚本;临时产物用完即删。
  • 编辑后修复自己引入的 lint / 编译错误。
  • 注释与提交说明使用简体中文

禁止事项

  • 不改动 vue-vben-admin-origin/
  • 不删除 .codebuddy/ 目录。
  • 不擅自升级 AGP、Spring Boot、Flutter SDK、Vue 等大版本。
  • 不在 Java 工程中混入 Kotlin 源码。
  • 不提交构建产物(build/dist/*.class*.flat*.dex*.dumpstream)。