# 资产盘点与优化评估 —— Trae CN 既有产出

> 盘点日期：2026-10-16　方法：全盘定位 + 只读逐行审计（3 个独立审计进程）+ 真机环境核验
> 结论一句话：**你累计产出约 10,930 行源码，资产不差；真正的病是"同一个桥接写了三遍、且主链字段契约与界面不匹配"——缺的是收敛，不是重写。**

---

## 1. 资产地图

| # | 位置 | 是什么 | 规模 | 状态 | 处置 |
|---|---|---|---|---|---|
| 1 | `C:\NxCamToolkit\` | Python/tkinter 桌面工具（计算器/刀具库/材料库/工序编排/工序单） | 41 个 py ≈7,640 行 + 数据 2,047 行 + `dist\NxCamToolkit.exe` 13.3MB | 工具本体可用；NX 联动部分半成品 | **保留+重构** |
| 2 | `C:\NX_Plugins\NxCamWizard\` | NX 插件成品（DLL + .men/.rtb + 图标） | DLL 243KB | 被 NX 加载过（有 7 条业务日志），但核心用例失败 | **重构** |
| 3 | `C:\Users\Administrator\AppData\Local\NxCamToolkit\bridge\` | 实验场：文件信箱 + NxAiBridge 插件 + 约 20 个探针 | 30+ 文件 | 唯一有成功日志的一代；但留下**幽灵进程** | 探针**废弃**，协议**升级保留** |
| 4 | `C:\Users\Administrator\Desktop\连接云服务器\` | 云连接脚手架（relay worker + SSH 隧道）+ 硅基流动批处理 | 3 个子包 | 客户端 100%，**服务端 0%**；安全问题严重 | **安全重做** |
| 5 | `C:\Users\Administrator\Desktop\UG插件制作\` | 安装器（`install.ps1` 646 行）、插件成品、**草莓 CM 参考物** | install.ps1 30KB | 探测实测失效 | **重构** |
| 6 | `E:\autodl-dj\AUDJ\` | AI 视频（ComfyUI）项目，**与 NX 无关** | 100+ 脚本 | 独立项目 | 勿混入；但含明文口令需处置 |

---

## 2. 最大技术债：三代桥接并存

| 代 | 实现 | 入口 | 字段契约 | 状态 |
|---|---|---|---|---|
| **A（界面在用）** | `nx_bridge_dotnet.cs`（447 行）→ csc 编译成 `startup\NxAiBridge.dll`，靠 `UGII_USER_DIR` 被 NX 自动加载 | `launcher.py:175-213` | `connected/pid/ts/nx_open/part_name` + `tool_count` | **无任何成功日志**（全盘找不到 `=== .NET bridge start ===`） |
| **B（能力最全）** | `nx\nx_bridge.template.cs`（1125 行）：Mutex 单例、全字段、失败字典、读重试 | `launcher.py:236-259 write_bridge_script()` | 含 `cat/phase/tools/material/op_count` | **死代码**：该函数全工程无调用者 |
| **C（唯一成功）** | `run_journal.exe bridge_daemon.py` | `run_test.py:101-108` | 与 A/B 都不同 | 有成功日志，但 `while True` 无退出条件 → **幽灵进程** |

### 由此产生的 4 个具体故障（全部有行号证据）

1. **双信箱错位** —— `nx_bridge.cs:27` 写死 `C:/NxCamToolkit/bridge`，`protocol.py:22-25` 用 `%LOCALAPPDATA%\NxCamToolkit\bridge`。你给用户的"手动播放 nx_bridge.cs"兜底路线**必然超时**。
2. **契约错位** —— `monitor_frame.py:251-252` 读 `st['nx']`、`st['op_count']`，而 `nx_bridge_dotnet.cs:92-98` 只写 `connected/pid/ts/nx_open/part_name` → **界面永远显示"未连接 / 工序 0"**。`monitor_frame.py:420-421` 用 `f.get('op_name')`，而 Python 桥 `nx_bridge.template.py:157` 返回纯字符串 → 回写失败分支必抛 `AttributeError`。
3. **编码静默丢命令** —— `protocol.py:48-49` 用 UTF-8 + `ensure_ascii=False` 写 cmd，`bridge_daemon.py:41/63` 的 `open()` **没有 `encoding=`** → 中文工序名在 cp936 下 `UnicodeDecodeError`，异常被吞后 `bridge_daemon.py:68-71` 还把命令文件删掉。
4. **失败也回成功** —— `bridge_daemon.py:64-65` 无条件写 `{"ok": true}`；裸 `except` 在 `nx_bridge.template.py`、`nx_bridge_dotnet.cs`、`bridge_daemon.py` 里共 10+ 处。

> **优化动作**：以 B 代的语义为基线，按"极薄"原则裁剪成唯一实现，字段契约写成**可执行校验器**（任务卡 P0-09）。

---

## 3. 版本处理：现有做法在真机上全面失效

| 检查项 | 你的实现 | 真机事实 | 结果 |
|---|---|---|---|
| 注册表探测 | 查 `HKLM\SOFTWARE\Siemens\Unigraphics Solutions\NX` 等 7 个根 | 真实键是 `HKLM\SOFTWARE\Siemens\NX 2212` / `NX 2412`，值为 `INSTALLDIR`/`UGII_BASE_DIR` | **死代码** |
| 环境变量探测 | 读 `UGII_BASE_DIR` | 机器级只指向 NX2412 | **只找到 1 个版本** |
| 默认路径表 | 只覆盖 `C:\`、`D:\` | NX 装在 `E:\Program Files\Siemens\` | **漏掉** |
| 合并结果 | — | **NX2212 永远探测不到** | 🔴 多版本枚举形同虚设 |
| 多版本共存 | 写 `UGII_VENDOR_DIR`（**单值**） | 现值只指向 NX2412，NX2212 的 `vendor\NxCamWizard` 形同虚设 | 🔴 装第二个版本会顶掉第一个 |
| 卸载/回滚 | `Remove-Item -Recurse -Force` + 无条件清空 `UGII_VENDOR_DIR` | 无备份、无清单、会踩掉别家插件 | 🔴 高危 |
| 签名警告 | 永久写 `UGII_LOCAL_USER_DEFAULTS` 指向 `nx_user.dpv` | 全局关闭整机 NXOpen 签名警告，卸载不移除 | 🔴 安全倒退 |
| 顺带安装 | 检测到 `UGII_USER_DIR` 就再装一份 | 该变量指向 AI bridge 目录 | 🟠 两个插件混装 |
| v1.1 一键安装器 | `reg query ... /s /v UGII_BASE_DIR`（方向正确） | 但 `if not defined NXROOT` **只取第一个**，枚举顺序是 2212 在前 | 🟠 会把文件装到 NX2212 而用户以为是 2412 |
| 输出回显 | 无条件打印"[备份] 完成 / [安装] 已更新" | 实际是静默空操作（`application\Data` 已不存在） | 🟠 误导用户 |

> **正确做法（照抄草莓 CM 的思路）**：一套产品 + **每版本一个启动器**，用**进程级环境变量**注入，再拉起该版本 NX。区别在于我们要把它做成软件自动完成，而不是让用户跑 .bat。
> CM 的目录布局值得学：`Config/Data/Postprocessor/Template/Bmp` 全版本共享，只有**必须重编的二进制**按版本分（`Nxversion\NX10|NX12|NX19|NX22|NX23|NX24|NX25\`）。它的 `automatic_programming_processing.dll` 每版本大小都不同，其余 `.dlx/.grx` 完全一致——**"只有该分的东西才分"**。

---

## 4. 环境残留（必须清理）

| 变量（作用域） | 现值 | 危害 | 处置 |
|---|---|---|---|
| `UGII_VENDOR_DIR`（用户级） | `E:\...\NX2412\UGII\vendor` | 单值 → NX2212 加载不到自己的 vendor | 清除（先确认无别家插件依赖） |
| `UGII_USER_DIR`（用户级） | `...\AppData\Local\NxCamToolkit\bridge` | 任何 NX 启动都加载该目录；与 NxCamWizard 混装 | 保留但隔离，长期改为进程级 |
| `UGII_LOCAL_USER_DEFAULTS`（用户级） | `...\Roaming\NxCamWizard\nx_user.dpv` | 全局关闭整机 NXOpen 签名警告 | 清除并把 dpv 移出 |
| `UGII_BASE_DIR`（机器级） | `E:\...\NX2412` | 只指向一个版本 | 保留（作为默认），切换走进程级 |

`custom_dirs.dat`（两个 NX 各 2419 字节，MD5 完全相同）**未被篡改**，是原版——这点是好消息。

---

## 5. 云侧：能力盘点与安全否决项

**结论：客户端 100% 完成，服务端 0%。** 本机无 8001 监听，全盘找不到实现 `/poll` + `/result` 的代码——`relay`（`43.167.209.150:8001`）是个外部黑盒。

### 🔴 安全否决项（照这个设计装到客户机上就是灾难）

| 问题 | 证据 |
|---|---|
| **明文 ed25519 SSH 私钥随交付包分发**，且被写进 `administrators_authorized_keys` | `UG连云端_oneclick\nx_id`（还有一份副本在 `Desktop\UG插件\我的插件\oneclick\`） |
| **共享静态 token + 明文 HTTP**，无过期、无 per-machine 派生 | `config.json:1` `token=83efbf8c...`，`relay=http://...` |
| **云端可下发任意命令并在本机执行** —— 等价于把机器的 RCE 权限挂到公网 | `worker.ps1:27` `& $env:ComSpec /c "$cmd 2>&1"` |
| 反向 SSH 隧道把本机 22 映射到云端 2222 | `install_ssh.bat:23` |
| stderr 恒为空（已被 `2>&1` 合并），日志无法定位失败 | `worker.ps1:27/31` |
| 另外：`E:\autodl-dj\AUDJ\tmp_*.py` 与日志含**明文服务器口令**；`agent_config.py:32` **硬编码 Fernet 密钥** | 审计实证 |

### ✅ 可复用 / ❌ 需重写

- **可复用**：`sf_batch_pipeline.py`（真实跑通、同时兼容 20000 包装与 OpenAI 标准两种响应、无 pandas 依赖写 xlsx、自带白名单预警）——只需补重试/退避、断点（落盘 batch_id）、分片校验、用量统计。
- **可复用（需加 auth）**：AUDJ 的 `agent_main.py` + `agent_routes.py` 是个能跑的 FastAPI 骨架 + 文件式记忆读写（注意：`.lock` 空文件锁**非原子**，`models` 接口**全是假数据**，CORS 是 `*`）。
- **需重写**：整个 oneclick 通道（见任务卡 P0-06）、`config.json`（改时效凭据）、`agent_config.py`（密钥外置）。

---

## 6. 数据资产（真正值钱的部分，务必保下来）

| 文件 | 内容 | 价值 |
|---|---|---|
| `data\ToolLibrary.xml`（23KB） | ToolPreset 43 条 | 刀具预设 |
| `data\MaterialLibrary.xml` | MaterialDef 17 条（P/M/K/N/S/H 六类） | 材料基准 Vc/Fz |
| `data\SpeedFeedTable.xml` | SpeedFeedPreset 33 条（**预设优先于材料库**） | 转速进给核心表 |
| `data\templates.json` | 12 个模板，`TEMPLATE_VERSION=3` | 工序模板 |
| `data\ai_programming_rules.json` | AI 编程规则库 v1（多项 `applied_in_engine=false`） | 未来自动编程的骨架 |
| `ai\advisor.py`（410 行） | 安全包络 + 案例融合 | **本批质量最高的代码**，保留 |
| `ai\knowledge.py`（301 行） | SQLite + 参数化查询 + 中位数统计 | 保留 |

### 必须固化进单元测试的业务口径（这是你的行业 know-how，不能被重构吃掉）

- 切削参数**单一数据源，系数只乘一次**；预设表优先于材料库
- **丝锥 Fz = 螺距，绝不缩放**（不乘状态/刀径系数），靠降转速保守；`feed = rpm × 螺距`（齿数按 1）
- **钻头 Fz = 每转进给 mm/r**，`feed = rpm × fz`，**齿数按 1，不许乘 2**
- 钻/攻丝预设名无"粗/精"字样，必须按 `ToolType` 直接命中，否则回落材料库会出现**丝锥 4774 rpm** 的灾难
- **钛合金预设在 S 类内部按材料名区分，不得套用于 Inconel 等镍基合金**
- Ap/Ae 的 clamp：钢 ≤0.5D、铝 ≤0.8D、S ≤0.45D、H ≤0.4D；粗加工 Ae ≤0.65D
- 悬伸比 >4D 警告；`MRR = Ap × Ae × Vf`
- fz 刀径系数以 D12 = 1.0，D6 ≈ 0.53、D16 ≈ 1.25

---

## 7. 优化决策一页表

| 处置 | 清单 |
|---|---|
| **保留** | `path_helper.py`、`bridge\protocol.py`（升级 v2）、`ai\advisor.py`、`ai\knowledge.py`、`ai\llm_client.py`、`main.py`（计算器与库管理，零 NX 耦合）、`plan_module.py` 的规则库、`nx\nx_bridge.template.cs`（作为唯一桥接语义基线）、`data\` 全部、`sf_batch_pipeline.py` |
| **重构** | `nx_bridge_dotnet.cs`（补字段+单例）、`launcher.py`（删死代码、补编译错误回报、改进程级环境）、`monitor_frame.py`（契约与失败分支）、`plan_module.py` 的三个 journal 生成器（路径写死）、`NxCamWizard.dll`（保留 UI 壳，重写 ToolManager） |
| **废弃** | `nx\nx_bridge.template.py`、`nx_oneshot.template.py`、`nx\nx_bridge.cs`（三条并行实现）、`nx_create_ops/tools/apply_template.py`（路径已坏）、AppData 下约 20 个探针（`clr_load*.py`、`NxLoader.il`、`NxAiBridge.il`、`click_*.py`、`find_ribbon.py`、`inspect_*.py`、`mini.py`、`tiny.py`、`simple_*.py`、`site_probe.py`、`session_test.py`、`remoting_probe.py`、`deep_search.py`、`list_menus.py`）、`__pycache__`、旧 `dist\exe`、`nx_auto_ops.cs`（0 字节） |
| **新建** | `D:\NX_AI\`（按任务书的目录结构），旧目录一律不动 |

---

## 8. 现在就要做的 5 件事（人工，不依赖 Trae）

1. **杀掉幽灵进程** —— 任务管理器里结束 `python.exe` / `pythonw.exe` / `ugraf.exe` / `run_journal.exe` 残留。
   （我这边的进程视图被沙箱限制，看不到也杀不掉 PID 22580，只能你来。）
2. **作废凭据** —— `nx_id` 私钥视同已泄露：删掉 `administrators_authorized_keys` 里的对应项、关闭 sshd 自启、改掉所有出现过的口令、下线 relay 通道。
3. **清残留** —— 执行 P0-05 生成的清理脚本（先 `-DryRun` 看清单）。
4. **建工作区** —— 把 `00_总规划与范例调研.md`、`02_TraeCN施工任务书.md` 拷到 `D:\NX_AI\docs\`，Trae 要能读到。
5. **配权限** —— 在 Trae 设置里把 `D:\NX_AI\` 加入免打扰白名单（它当前只对 `C:\NxCamToolkit`、两个 NX 目录等有 readWrite 授权），否则无人值守会被审批弹窗卡住。
