127 lines
7.0 KiB
Markdown
127 lines
7.0 KiB
Markdown
# AGENTS.md
|
||
|
||
## 项目目标
|
||
|
||
- 使用 C#/.NET 独立实现 wxautox4 商业版的业务功能,只兼容功能,不兼容其 Python API。
|
||
- 当前阶段实现 Desktop Agent、CLI 和业务层,不实现 Windows Service、正式 Web/UI、授权和自动升级。
|
||
- 仅通过 Windows UI Automation、Win32 和正常桌面交互实现;允许为本地数据库只读访问而读取 `Weixin.exe` 内存并进行 SQLCipher 解密;禁止协议破解、DLL 注入、进程内存修改、数据库写入、登录或风控绕过。
|
||
- Agent 安装并成功连接控制面即完成节点及数据同步授权,不再要求额外用户确认;连接授权仅覆盖已验证账号的规范化只读数据,仍禁止上传原始微信数据库、密钥和未脱敏内容。
|
||
- 开发前先阅读 `docs/WxAgent-CSharp-开发计划.md`,功能范围、里程碑和参考对象以该文档为准。
|
||
|
||
## 技术约束
|
||
|
||
- 使用 .NET 8;Windows 项目目标为 `net8.0-windows10.0.19041.0`、`win-x64`。
|
||
- UI 自动化优先使用 FlaUI.UIA3;只有 FlaUI 明确缺失能力时才直接调用 UIA COM。
|
||
- Win32 API 优先通过 Microsoft.Windows.CsWin32 按需生成,不维护大批手写 P/Invoke。
|
||
- JSON 使用 `System.Text.Json`,日志使用 `Microsoft.Extensions.Logging`,并发使用 `Channel<T>`、`Task` 和 `IAsyncEnumerable<T>`。
|
||
- 数据库能力只读:候选密钥必须通过目标数据库 page 1 HMAC 校验后才能保存或使用;日志和普通 CLI 输出不得包含完整密钥。
|
||
- 不提前引入微服务、插件系统、消息队列、Redis 或新的 UI 框架。
|
||
|
||
## 项目边界
|
||
|
||
```text
|
||
node-agent/WxAgent.Core net8.0:模型、解析、去重、状态机和业务用例
|
||
node-agent/WxAgent.Windows net8.0-windows:FlaUI、UIA 和 Win32
|
||
node-agent/WxAgent.Host net8.0-windows:Desktop Agent 和 CLI
|
||
node-agent/WxAgent.Tray net8.0-windows:托盘常驻与生命周期管理
|
||
node-agent/WxAgent.Service net8.0:节点本地服务兼容层
|
||
control-plane/ Go:远程中心控制面;测试与 Go 代码同目录
|
||
|
||
tests/node-agent/WxAgent.Core.Tests Linux 可执行的纯逻辑测试
|
||
tests/node-agent/WxAgent.Service.Tests 节点本地服务测试
|
||
```
|
||
|
||
- 保持 Windows 专用代码与纯业务逻辑分离,使 Core 测试可在 Linux 执行。
|
||
- 不为单一实现建立无实际用途的通用框架;跨平台边界和真机测试所需的最小抽象除外。
|
||
|
||
## Linux 开发与构建
|
||
|
||
- Linux 负责主要开发、代码检查、全部项目编译和 Core 测试。
|
||
- Windows UIA 代码可在 Linux 编译,但不能在 Linux 执行。
|
||
- Windows 项目必须设置 `<EnableWindowsTargeting>true</EnableWindowsTargeting>`。
|
||
- 暂不使用 NativeAOT;发布时关闭 trimming。
|
||
|
||
```bash
|
||
dotnet restore WxAgent.sln -p:EnableWindowsTargeting=true
|
||
dotnet test tests/node-agent/WxAgent.Core.Tests -c Release
|
||
dotnet build WxAgent.sln -c Release -p:EnableWindowsTargeting=true
|
||
dotnet publish node-agent/WxAgent.Host -c Release -r win-x64 --self-contained true \
|
||
-p:EnableWindowsTargeting=true -p:PublishSingleFile=true -p:PublishTrimmed=false
|
||
```
|
||
|
||
## Windows 真机操作
|
||
|
||
### 连接信息
|
||
|
||
- Windows 主机:`10.1.1.101`
|
||
- 计算机名:`DESKTOP-EGI7QCK`
|
||
- 登录用户:`rogee`
|
||
- 用户目录:`C:\Users\Rogee`
|
||
- SSH:`ssh rogee@10.1.1.101`,当前 Linux 主机的 SSH 密钥可直接登录。
|
||
- PowerShell:`ssh rogee@10.1.1.101 "powershell -NoProfile -Command '<命令>'"`
|
||
- Windows MCP:`http://10.1.1.101:8765/mcp`,配置见 `.mcp.json`。
|
||
- 微信程序:`C:\Program Files\Tencent\Weixin\Weixin.exe`
|
||
- 当前 Windows 未发现全局 `dotnet` 命令,优先上传 Linux 生成的 self-contained 发布包;需要 Windows SDK 时可直接安装。
|
||
- 建议部署目录:`C:\Users\Rogee\wx-agent`。
|
||
|
||
不得删除或模糊以上真机连接信息;开发产物必须能够上传到该主机执行生产前真机验证。
|
||
|
||
- 优先使用 Windows MCP 操作和检查 Windows 主机。
|
||
- MCP 无法满足需求或明显不便时,改用 SSH/PowerShell 上传产物、执行命令和收集日志。
|
||
- 调试需要的应用、SDK、检查工具或依赖可以直接安装,无需事先确认。
|
||
- 微信自动化必须运行在微信所在的已登录、未锁定用户会话中,不能在 Session 0 中验证。
|
||
- 默认只使用“文件传输助手” "Hao 豪" "吉祥三宝" "消息测试专用群组"这几个进行消息收发测试,其中“消息测试专用群组” 可测试 @所有人 功能;未经用户明确要求,不操作真实联系人和群聊。
|
||
|
||
上传示例:
|
||
|
||
```bash
|
||
ssh rogee@10.1.1.101 'powershell -NoProfile -Command "New-Item -ItemType Directory -Force C:\Users\Rogee\wx-agent | Out-Null"'
|
||
scp -r node-agent/WxAgent.Host/bin/Release/net8.0-windows10.0.19041.0/win-x64/publish/* \
|
||
rogee@10.1.1.101:'C:/Users/Rogee/wx-agent/'
|
||
```
|
||
|
||
每次 Windows 发布至少执行:
|
||
|
||
```powershell
|
||
WxAgent.Host doctor
|
||
WxAgent.Host inspect-ui --output artifacts/ui-tree.json
|
||
WxAgent.Host smoke
|
||
```
|
||
|
||
## UI Automation 规则
|
||
|
||
- 同一个微信窗口的点击、输入、滚动及页面切换必须进入单一命令队列,禁止并发写操作。
|
||
- UIA 事件回调只采集必要信息并快速返回,不在回调线程执行耗时业务逻辑。
|
||
- 不长期持有 UIA 元素对象;控件可能因页面虚拟化随时失效。
|
||
- 消息监听采用“UIA 事件 + 低频轮询 + 可见快照比较 + 有界去重”。
|
||
- 读取和查找操作可以有限重试;发送消息、联系人变更、群成员变更和朋友圈操作不得盲目重试。
|
||
|
||
控件定位顺序固定为:
|
||
|
||
```text
|
||
AutomationId
|
||
→ ControlType + Name
|
||
→ 稳定祖先节点 + 相对关系
|
||
→ UIA Pattern
|
||
→ 集中维护的坐标兜底
|
||
```
|
||
|
||
- 禁止在业务代码中散落绝对坐标。
|
||
- 定位器、消息识别规则和控件路径集中维护。
|
||
- 当前已知关键节点包括 `MainView`、`session_list`、`chat_message_page`、`chat_message_list`、`chat_input_field` 和 `tool_bar_accessible`;完整基线见开发计划。
|
||
|
||
## 测试与完成标准
|
||
|
||
- 非平凡解析、去重、状态机或分支逻辑必须留下一个最小可运行测试。
|
||
- UIA 节点应尽早转换为脱敏、可序列化的快照,使消息解析和定位规则能在 Linux 离线测试。
|
||
- 每项功能必须具备:公共调用方式、超时/取消行为、明确错误码、测试或真机检查、当前微信版本验收记录和失败诊断信息。
|
||
- 变更完成前先运行相关 `dotnet test`、`dotnet build`;涉及 Windows 自动化时还必须在真机执行对应 smoke。
|
||
- 日志默认不得记录完整消息内容、联系人名称、附件内容或未脱敏 UI 树。
|
||
|
||
## 功能实现原则
|
||
|
||
- 公开行为以 wxautox4 官方文档和 `docs/WxAgent-CSharp-开发计划.md` 中的功能复制矩阵为验收基线。
|
||
- 优先复用 FlaUI、CsWin32 和 .NET 标准库,不从零重写已有能力。
|
||
- 修复 UI 兼容问题时应修改共享定位器或解析规则,禁止只给单个调用路径打补丁。
|
||
- 微信版本变化时先运行 `doctor/smoke`、比较 UI 树快照,再集中更新定位器并执行真机回归。
|