Browse Source

Document ai-dop-platform as part of single Ai-DOP repo; fix paths and menu generator root resolution.

Rewrite onboarding and handoff docs to use repo-relative server/ and Web/ paths; update db helper scripts for legacy-demo under in-repo ai-dop-platform. gen_aidop_menu.py discovers main clone whether platform lives inside the repo or under SourceCode/references/Admin.NET.
sky-guo 1 week ago
parent
commit
fa45001713

+ 2 - 1
ai-dop-platform/.cursor/rules/project.mdc

@@ -17,5 +17,6 @@ alwaysApply: true
 
 # Cursor 使用
 
-- 优先将 Cursor 工作区设为**本仓库根目录**(含 `server/` 与 `Web/`),或单独打开 `ai-dop-platform/` 子目录做文档与脚本编辑。
+- 优先将 Cursor 工作区设为**本仓库根目录**(含 `server/`、`Web/`、`ai-dop-platform/`),或单独打开 `ai-dop-platform/` 子目录做文档与脚本编辑。
+- 若本机仍存在 **`SourceCode/ai-dop-platform`**,推荐改为指向本目录的 **junction**,避免文档与主库内副本漂移。
 - 若 Admin.NET 以子模块或独立克隆维护,修改前确认与上游(如 Gitee `v2`)的同步策略,避免把上游大改混进业务 PR。

+ 3 - 3
ai-dop-platform/.cursor/skills/aidop-auto-verify-fix-loop/SKILL.md

@@ -23,13 +23,13 @@ After any implementation, run verification immediately, fix failures, and re-run
 ### Backend C# changes
 
 - Build target project first:
-  - `references/Admin.NET/server/Admin.NET.Core`: `dotnet build --framework net8.0`
-  - `references/Admin.NET/server/Admin.NET.Web.Entry`: `dotnet build --framework net8.0`
+  - `server/Admin.NET.Core` (repo root): `dotnet build --framework net8.0`
+  - `server/Admin.NET.Web.Entry` (repo root): `dotnet build --framework net8.0`
 - If API behavior changed, start/restart backend and run endpoint smoke tests.
 
 ### Frontend Web changes
 
-- In `references/Admin.NET/Web`:
+- In `Web/` (repo root):
   - `npm run build`
 - If route/menu/request logic changed, also verify:
   - page opens without blank screen

+ 17 - 24
ai-dop-platform/README.md

@@ -1,41 +1,34 @@
 # Ai-DOP 平台(团队基线)
 
-本目录是 **Ai-DOP 数字化运营** 的团队工作区:在 **Admin.NET** 上挂载业务插件,并保留旧 **Gitee Demo** 作为对照与前端来源。
-
-**源码根目录**:`D:\Projects\Ai-DOP\SourceCode`(本仓库为其下的 `ai-dop-platform`;Admin.NET 在同级 `references`)。
+本目录位于 **Ai-DOP 主库**(Gitee `sky-guo/ai-dop`)内,与 **`server/`**(.NET 后端)、**`Web/`**(官方 Vue 管理端)**同一 Git 仓库**,无需再与 `references` 外的副本对齐。
 
 ## 目录说明
 
-| 路径 | 说明 |
-|------|------|
-| `../references/Admin.NET/`(相对本仓库根目录) | Admin.NET 上游源码(建议跟踪官方稳定分支,如 `v2`)。 |
-| `../references/Admin.NET/server/Plugins/Admin.NET.Plugin.AiDOP/` | **AiDOP 业务插件**:订单 / 计划 / 工单 API(SqlSugar + 与旧 Demo 一致的 `api/Order`、`api/Plan`、`api/WorkOrder`)。 |
-| `legacy-demo/` | 迁入的 Vue + 原独立后端;页面与交互参考,新后端以插件为准。 |
-| `docs/` | 架构与上手文档。 |
-| `.cursor/rules/` | Cursor 团队规则(边界、栈、风格)。 |
+| 路径(相对主库根目录) | 说明 |
+|------------------------|------|
+| `server/` | .NET 解决方案(`Admin.NET.sln`);**`server/Plugins/Admin.NET.Plugin.AiDOP/`** 为 AiDOP 业务插件(`api/Order`、`api/Plan`、`api/WorkOrder` 等)。 |
+| `Web/` | 官方管理端前端;`prepare` 会安装 **pre-push** hook。 |
+| `ai-dop-platform/`(本目录) | 团队文档、Cursor 规则、**legacy-demo**、**tools/** 脚本。 |
 
 ## 环境要求
 
-- **.NET 8 SDK**(与 Admin.NET `TargetFrameworks` 一致;若使用 net10 需对应 SDK)。
-- **Node.js**( `legacy-demo/frontend`)。
-- **MySQL**(连接串配置在 Admin.NET 的 `Configuration/Database.json` 等,与官方文档一致)。
+- **.NET 8 SDK**(与 `TargetFrameworks` 一致;若使用 net10 需对应 SDK)。
+- **Node.js**(`Web/` 与 `legacy-demo/frontend`)。
+- **MySQL**(连接串见 `server/Admin.NET.Application/Configuration/Database.json` 等)。
 
 ## 快速开始
 
-1. 用 Visual Studio / Rider / `dotnet run` 启动 **`Admin.NET.Web.Entry`**(项目在 `../references/Admin.NET/server/Admin.NET.Web.Entry/`;默认 HTTP 端口见该项目的 `Properties/launchSettings.json`,一般为 `http://localhost:5005`)。
-2. 开发环境下插件会对表 `ado_orders`、`ado_plans`、`ado_work_orders` 执行 **CodeFirst 建表**(仅 `Development`)。
-3. 在 `legacy-demo/frontend` 执行 `npm install` 与 `npm run dev`;Vite 已将 `/api` 代理到 `5005`。
-
-更细的步骤与路由说明见 [docs/GETTING_STARTED.md](docs/GETTING_STARTED.md)。
+1. 启动后端:在 **`server/Admin.NET.Web.Entry/`** 下 `dotnet run --framework net8.0`(端口见 `launchSettings.json`,常见为 **5005**)。
+2. **Development** 下插件会对 `ado_*` 表做 **CodeFirst**(见 [docs/GETTING_STARTED.md](docs/GETTING_STARTED.md))。
+3. 旧 Demo:`legacy-demo/frontend` 执行 `npm install` 与 `npm run dev`(`/api` 代理到 5005)。
 
-**重启 Cursor 或新开对话后要接着干活**(工作区为 **`SourceCode\ai-dop-platform`** 时):
+更细步骤见 [docs/GETTING_STARTED.md](docs/GETTING_STARTED.md)。
 
-1. **先读总览**:`@docs/PROJECT_HANDOFF.md` — 项目目标、功能清单、进度、目录与下一步顺序。  
-2. **再按清单执行**:`@docs/CURRENT_TASKS.md` — 环境、双 SDK、验收勾选、即时待办。
+**Cursor 续作**(工作区为 **`ai-dop-platform/`** 时):先 `@docs/PROJECT_HANDOFF.md`,再 `@docs/CURRENT_TASKS.md`。若工作区为主库根目录,路径为 `@ai-dop-platform/docs/...`。
 
-若工作区根是 **`SourceCode` 父目录**,则改为:`@ai-dop-platform/docs/PROJECT_HANDOFF.md` 与 `@ai-dop-platform/docs/CURRENT_TASKS.md`。(推荐仍打开 **`ai-dop-platform`** 为根,路径最简。)
+本机若仍使用 **`SourceCode/ai-dop-platform`**,建议改为指向 **`…/references/Admin.NET/ai-dop-platform`** 的 **目录联接(junction)**,与主库内本目录为同一内容(见上层 `SourceCode/README.md`)。
 
 ## 重要说明
 
-- Demo 业务接口当前使用 **`[AllowAnonymous]`**,便于接旧前端;**上线前**请改为鉴权或菜单权限控制
-- 请勿向 `../references/Admin.NET` 提交与上游无关的大范围修改;业务迭代放在插件或本仓库单独分支并记录与上游的差异策略
+- Demo 接口上的 **`[AllowAnonymous]`** 仅便于联调;**上线前**请改为鉴权或菜单权限
+- 与上游 Admin.NET 的大范围差异请用分支管理并写清合并策略;业务迭代优先落在插件与 `Web/` 扩展

+ 14 - 4
ai-dop-platform/docs/AIDOP_MENU_SEED.md

@@ -12,12 +12,12 @@
 
 1. 将仓库中 **`tools/gen_aidop_menu.py`** 保存为文件(内容见下)。
 2. 执行:`python tools/gen_aidop_menu.py`(在 `ai-dop-platform` 根目录)。
-3. 在 **`references/Admin.NET/Web/src/views/aidop/planning/index.vue`** 创建占位页(内容见下)。
+3. 在主库 **`Web/src/views/aidop/planning/index.vue`** 创建占位页(内容见下)。
 4. **重启后端**,使种子写入/更新 `sys_menu`;超级管理员若仍看不到新菜单,在 **角色管理** 中给角色勾选 **Ai-DOP** 下菜单,或清空库重建(仅开发环境)。
 
 ## `tools/gen_aidop_menu.py`
 
-保存为 `ai-dop-platform/tools/gen_aidop_menu.py` 后执行 `python tools/gen_aidop_menu.py`
+**请以主库内 `tools/gen_aidop_menu.py` 为准**(含主库根解析);在 **`ai-dop-platform/`** 根执行 `python tools/gen_aidop_menu.py` 即可。下列代码块为说明用摘录,与仓库文件冲突时以仓库为准
 
 ```python
 # -*- coding: utf-8 -*-
@@ -25,7 +25,17 @@
 from pathlib import Path
 
 ROOT = Path(__file__).resolve().parents[1]
-OUT = ROOT.parent / "references/Admin.NET/server/Plugins/Admin.NET.Plugin.AiDOP/SeedData/SysMenuSeedData.cs"
+
+def _find_aidop_repo_root(ai_dop_platform_dir: Path) -> Path:
+    for ancestor in [ai_dop_platform_dir.resolve()] + list(ai_dop_platform_dir.resolve().parents):
+        if (ancestor / "server" / "Admin.NET.sln").is_file():
+            return ancestor
+        nested = ancestor / "references" / "Admin.NET" / "server" / "Admin.NET.sln"
+        if nested.is_file():
+            return ancestor / "references" / "Admin.NET"
+    raise RuntimeError("找不到 server/Admin.NET.sln")
+
+OUT = _find_aidop_repo_root(ROOT) / "server/Plugins/Admin.NET.Plugin.AiDOP/SeedData/SysMenuSeedData.cs"
 
 mods = [
     ("S0", "S0 运营建模", [("数据建模", "支持数据库表结构设计与建模", "高", "5", "核心基础功能"), ("业务建模", "支持业务流程建模与配置", "高", "5", "核心基础功能")]),
@@ -161,7 +171,7 @@ if __name__ == "__main__":
 
 说明:一级业务模块编码为 **`S0`~`S9`**(路径 `/aidop/s0` … `/aidop/s9`),展示名称分别为:S0 运营建模、S1 产销协同、S2 制造协同、S3 供应协同、S4 采购执行、S5 物料仓储、S6 生产执行、S7 成品仓储、S8 异常监控、S9 运营指标。`M11`~`M16` 仍为平台类菜单,详见 `tools/gen_aidop_menu.py`。
 
-## `references/Admin.NET/Web/src/views/aidop/planning/index.vue`
+## `Web/src/views/aidop/planning/index.vue`(主库根相对路径)
 
 在官方 Web 中创建目录 `src/views/aidop/planning/`,新建 `index.vue`:
 

+ 3 - 3
ai-dop-platform/docs/ARCHITECTURE.md

@@ -2,7 +2,7 @@
 
 ## 系统定调
 
-- **主系统**:Ai-DOP 在 **Admin.NET** 上全新建设与演进——运行入口为 **`Admin.NET.Web.Entry`**,领域与 API 在 **`Admin.NET.Plugin.*`(当前为 AiDOP)** 中扩展,**目标管理端与业务 UI** 以官方 **`references/Admin.NET/Web`** 为载体在该前端内扩展(与后端双进程联调,见 `docs/GETTING_STARTED.md`)。
+- **主系统**:Ai-DOP 在 **Admin.NET** 上全新建设与演进——运行入口为 **`Admin.NET.Web.Entry`**,领域与 API 在 **`Admin.NET.Plugin.*`(当前为 AiDOP)** 中扩展,**目标管理端与业务 UI** 以主库内官方 **`Web/`** 工程为载体在该前端内扩展(与后端双进程联调,见 `docs/GETTING_STARTED.md`)。
 - **legacy-demo**:**仅作对照**,用于旧 **HTTP 契约、页面交互与数据** 的参照与迁移期联调;**不作为**产品长期主栈。新能力与正式发布界面应在 **插件 + 官方 Web** 中实现,直至 legacy 可退役。
 
 ## 总览
@@ -26,7 +26,7 @@ flowchart LR
   Plugin --> Sugar
 ```
 
-- **呈现层**:**主路径**为 **`references/Admin.NET/Web`**(权限、菜单、租户、审批及后续 Ai-DOP 业务页)。**`legacy-demo/frontend`**(5174)按上节所述**仅对照**,代理到同一后端 `/api`。
+- **呈现层**:**主路径**为 **`Web/`**(权限、菜单、租户、审批及后续 Ai-DOP 业务页)。**`legacy-demo/frontend`**(5174)按上节所述**仅对照**,代理到同一后端 `/api`。
 - **应用层**:Admin.NET 提供认证、多租户、系统管理;**AiDOP 领域** 在 `Admin.NET.Plugin.AiDOP` 中扩展。
 - **数据层**:业务表使用 **SqlSugar** 映射,表名与旧 EF Demo 一致(`ado_*`),便于数据迁移与对照。
 
@@ -52,7 +52,7 @@ flowchart LR
 
 ## 上游 Admin.NET
 
-`D:\Projects\Ai-DOP\SourceCode\references\Admin.NET` 为克隆的上游仓库(与 `ai-dop-platform` 同级)。升级上游时:
+**Ai-DOP 主库**(本机常为 `D:\Projects\Ai-DOP\SourceCode\references\Admin.NET`)在 **同一克隆** 内包含 **`server/`**、**`Web/`**、**`ai-dop-platform/`**。与 Gitee 官方 **zuohuaijun/Admin.NET** 同步时:
 
 1. 在独立分支合并或 rebase 官方稳定分支。
 2. 再编译并跑冒烟测试(登录、菜单、插件 API)。

+ 3 - 3
ai-dop-platform/docs/CURRENT_TASKS.md

@@ -12,7 +12,7 @@
 - **.NET 8 SDK 8.0.419** 可能安装在用户目录:`%LOCALAPPDATA%\Microsoft\dotnet`。
 - 若终端里 `dotnet --version` 仍是 6.x,在用户 **PATH** 中应把上述目录 **排在 `C:\Program Files\dotnet` 之前**,或新开终端 / 重启 Cursor 后再试。
 - **源码根目录**:`D:\Projects\Ai-DOP\SourceCode`。
-- 解决方案路径(相对 `SourceCode/ai-dop-platform`):`../references/Admin.NET/server/Admin.NET.sln`
+- 解决方案路径(相对 `ai-dop-platform/`):`../server/Admin.NET.sln`(工作区为主库根时则为 `server/Admin.NET.sln`)
 
 ## 编译注意(Admin.NET 多目标)
 
@@ -35,7 +35,7 @@ $installDir = "$env:LOCALAPPDATA\Microsoft\dotnet"
 ## 建议立刻验收的清单
 
 - [ ] `dotnet --list-sdks` 含 **8.0.x** 与 **10.0.x**(与 Admin.NET 多目标一致)。
-- [ ] `dotnet build ../references/Admin.NET/server/Admin.NET.sln -c Debug` **无错误**(在已配置 MySQL 的前提下;若仅测编译可先不关库)。
+- [ ] `dotnet build ../server/Admin.NET.sln -c Debug` **无错误**(在已配置 MySQL 的前提下;若仅测编译可先不关库;主库根下执行时改为 `server/Admin.NET.sln`)。
 - [ ] 启动 **Admin.NET.Web.Entry**,确认默认端口(一般为 **5005**)可访问。
 - [ ] 配置 Admin.NET 的 **MySQL** 连接后,Development 下插件应对 `ado_*` 表 **CodeFirst**(见 [GETTING_STARTED.md](GETTING_STARTED.md))。
 - [ ] `legacy-demo/frontend`:`npm install` → `npm run dev`,Vite 代理 `/api` → `5005`,抽查 `GET /api/Order` 等。
@@ -50,7 +50,7 @@ $installDir = "$env:LOCALAPPDATA\Microsoft\dotnet"
 
 | 内容 | 路径(相对 `D:\Projects\Ai-DOP\SourceCode`) |
 |------|-----------------------------------------------|
-| AiDOP 插件 | `references/Admin.NET/server/Plugins/Admin.NET.Plugin.AiDOP/` |
+| AiDOP 插件 | `server/Plugins/Admin.NET.Plugin.AiDOP/`(主库根相对路径) |
 | MVC 兼容 API | 插件内 `Controllers/` |
 | 旧 Demo 前端 | `ai-dop-platform/legacy-demo/frontend/` |
 | 团队 Cursor 规则 | `ai-dop-platform/.cursor/rules/` |

+ 3 - 3
ai-dop-platform/docs/CURSOR_AUTOVERIFY_AND_HOOKS.md

@@ -11,15 +11,15 @@
 
 - 项目规则:`.cursor/rules/auto-verify-fix-loop.mdc`
 - 项目 Skill:`.cursor/skills/aidop-auto-verify-fix-loop/SKILL.md`
-- Web hooks 安装脚本:`references/Admin.NET/Web/scripts/install-git-hooks.cjs`
+- Web hooks 安装脚本:`Web/scripts/install-git-hooks.cjs`(主库根相对路径)
 - Web `package.json` 已添加:
   - `prepare`: `node scripts/install-git-hooks.cjs`
 
 ## 团队成员首次使用步骤
 
-1. 拉取仓库代码并用 Cursor 打开工作区(建议 `SourceCode/ai-dop-platform` 或 `SourceCode`)。
+1. 拉取 **Ai-DOP 主库**(`ai-dop`)并用 Cursor 打开工作区(建议主库根目录,或仅 `ai-dop-platform/`;本机 `SourceCode/ai-dop-platform` 可为指向主库内该目录的 junction)。
 2. 安装 Web 依赖(会自动触发 `prepare` 安装 hook):
-   - `cd references/Admin.NET/Web`
+   - `cd Web`(主库根下)
    - `npm install`(或 `pnpm install`)
 3. 若依赖已装过,手动补装 hook:
    - `npm run prepare`

+ 12 - 11
ai-dop-platform/docs/GETTING_STARTED.md

@@ -2,9 +2,10 @@
 
 ## 1. 打开解决方案
 
-路径(**`D:\Projects\Ai-DOP\SourceCode\ai-dop-platform`** 下向上一级再进 `references`):
+**Ai-DOP 主库**(Gitee `ai-dop`)克隆内,`server/` 与 `ai-dop-platform/` 同级。
 
-`../references/Admin.NET/server/Admin.NET.sln`
+- 工作区为 **`ai-dop-platform/`** 时:`../server/Admin.NET.sln`
+- 工作区为 **主库根目录**(含 `server/`、`Web/`、`ai-dop-platform/`)时:`server/Admin.NET.sln`
 
 其中 **启动项目** 为 `Admin.NET.Web.Entry`。
 
@@ -52,12 +53,12 @@ npm run dev
 
 业务开发以 **`Admin.NET.Web.Entry`** 与插件为主;需要操作框架自带的系统管理界面时,再单独启动官方 Vue 管理端(与后端是两个进程)。
 
-路径(相对本仓库 `ai-dop-platform` 根目录):
+路径(相对 `ai-dop-platform/` 根目录,与 `server/` 同级):
 
-`../references/Admin.NET/Web`
+`../Web`
 
 ```bash
-cd ../references/Admin.NET/Web
+cd ../Web
 pnpm install
 pnpm dev
 ```
@@ -72,11 +73,11 @@ Vite 会拉起开发服务器;端口在 `Web/.env` 的 `VITE_PORT`(默认 **
 
 ## 6. 构建验证
 
-在已安装 **.NET 8+** SDK 的机器上:
+在已安装 **.NET 8+** SDK 的机器上(默认当前目录为 **`ai-dop-platform/`**;若在主库根目录,将 `../server` 改为 `server`)
 
 ```bash
-dotnet restore ../references/Admin.NET/server/Admin.NET.sln
-dotnet build ../references/Admin.NET/server/Admin.NET.sln -c Release
+dotnet restore ../server/Admin.NET.sln
+dotnet build ../server/Admin.NET.sln -c Release
 ```
 
 若首次编译出现 `NETSDK1004`(找不到 `project.assets.json`),请先执行上一行的 `dotnet restore` 再构建。
@@ -91,19 +92,19 @@ dotnet build ../references/Admin.NET/server/Admin.NET.sln -c Release
 - `csharp.mdc`:插件与 C# 约定。
 - `vue.mdc`:Demo 前端约定。
 
-请将 Cursor 工作区根目录设为 **`D:\Projects\Ai-DOP\SourceCode\ai-dop-platform`**(或整个 **`SourceCode`**),以便规则与路径一致。
+请将 Cursor 工作区根目录设为 **主库内的 `ai-dop-platform/`**(本机若使用 `SourceCode/ai-dop-platform`,可为指向该目录的 **junction**,与主库内文件夹为同一内容),或直接打开 **主库根目录**,以便规则与路径一致。
 
 ## 8. 自动验证与提交门禁(推荐启用)
 
 本仓库已增加以下能力:
 
 - Cursor 默认按“改完即验证、失败即修复再验证”的闭环执行(见 `.cursor/rules/auto-verify-fix-loop.mdc`)。
-- `references/Admin.NET/Web` 已配置 `prepare`,安装依赖时自动写入 `pre-push` hook。
+- 主库根下 `Web/` 已配置 `prepare`,安装依赖时自动写入 `pre-push` hook。
 
 团队成员首次拉代码后,建议执行:
 
 ```bash
-cd ../references/Admin.NET/Web
+cd ../Web
 npm install
 ```
 

+ 1 - 1
ai-dop-platform/docs/NEW_MEMBER_ONBOARDING_ZERO_TO_ONE.md

@@ -75,7 +75,7 @@
 这会自动做以下事情:
 
 - 检查 `dotnet`/`node`
-- 安装 `references/Admin.NET/Web` 依赖
+- 安装主库根下 `Web/` 依赖
 - 自动安装 `pre-push` hook
 - 构建 `Admin.NET.Core`
 - 可选直接启动前后端服务

+ 19 - 20
ai-dop-platform/docs/PROJECT_HANDOFF.md

@@ -3,9 +3,9 @@
 **使用方式**:重启 Cursor 或新开聊天后,先 **@ 本文件**。路径取决于工作区根目录:
 
 - 根目录为 **`…/ai-dop-platform`**:`@docs/PROJECT_HANDOFF.md`
-- 根目录为 **`…/SourceCode`**:`@ai-dop-platform/docs/PROJECT_HANDOFF.md`
+- 根目录为 **Ai-DOP 主库根**(含 `server/`、`Web/`):`@ai-dop-platform/docs/PROJECT_HANDOFF.md`
 
-更细的验收勾选见 [CURRENT_TASKS.md](CURRENT_TASKS.md)(同样:在 `SourceCode` 根下则 `@ai-dop-platform/docs/CURRENT_TASKS.md`)。
+更细的验收勾选见 [CURRENT_TASKS.md](CURRENT_TASKS.md)(主库根下则 `@ai-dop-platform/docs/CURRENT_TASKS.md`)。
 
 ---
 
@@ -13,7 +13,7 @@
 
 - **名称**:Ai-DOP(数字化运营平台),在 **Admin.NET** 通用权限与多租户能力之上做行业业务。
 - **团队**:约 3~4 人,**按模块全栈**;共享内核(权限、租户、公共组件)需有人把关,避免各自改乱。
-- **工作区**:**源码统一在 `D:\Projects\Ai-DOP\SourceCode`**。其中 **`ai-dop-platform`** 为团队文档、Cursor 规则、**旧 Demo 前端 + 对照后端**;**真实运行主线**是同级 **`references`** 下的 **Admin.NET 源码 + AiDOP 插件**
+- **工作区**:**Ai-DOP 主库**为 **单一 Git 仓库**(Gitee `sky-guo/ai-dop`,本机常克隆在 `SourceCode/references/Admin.NET`)。**`ai-dop-platform/`** 与 **`server/`**、**`Web/`** 同库:文档与规则、**legacy-demo**、工具脚本与 **.NET 后端 + 官方 Web + 插件** 一并拉取与提交
 
 ---
 
@@ -58,28 +58,27 @@
 ## 4. 仓库与目录结构(务必分清)
 
 ```
-D:\Projects\Ai-DOP\SourceCode\   # ★ 项目源码根目录(本机约定)
-├── README.md                    # SourceCode 层说明
-├── ai-dop-platform/             # 本仓库:文档、规则、legacy-demo
-│   ├── .cursor/rules/           # 团队 Cursor 规则
-│   ├── docs/                    # 本 handoff、GETTING_STARTED、ARCHITECTURE、CURRENT_TASKS
-│   └── legacy-demo/             # 旧 Gitee Demo(前端 + 原 EF 后端,作对照)
-└── references/
-    └── Admin.NET/
-        └── server/
-            ├── Admin.NET.sln
-            ├── Plugins/
-            │   └── Admin.NET.Plugin.AiDOP/   # ★ AiDOP 业务插件(实体、DTO、兼容 MVC API)
-            └── Admin.NET.Web.Entry/           # ★ 启动项目(默认端口常為 5005)
+D:\Projects\Ai-DOP\SourceCode\references\Admin.NET\   # ★ Ai-DOP 主库(本机路径示例)
+├── server/                      # .NET 解决方案(Admin.NET.sln、插件、Web.Entry)
+│   ├── Admin.NET.sln
+│   ├── Plugins/
+│   │   └── Admin.NET.Plugin.AiDOP/   # ★ AiDOP 业务插件
+│   └── Admin.NET.Web.Entry/          # ★ 启动项目(默认端口常为 5005)
+├── Web/                         # 官方 Vue 管理端
+└── ai-dop-platform/             # 文档、Cursor 规则、legacy-demo、tools
+    ├── .cursor/rules/
+    ├── docs/
+    └── legacy-demo/
 ```
 
-**相对路径**:从 `SourceCode/ai-dop-platform` 根到解决方案为 **`../references/Admin.NET/server/Admin.NET.sln`**。
+**相对路径**:从 **`ai-dop-platform/`** 根到解决方案为 **`../server/Admin.NET.sln`**。若 Cursor 打开 **主库根目录**,则为 **`server/Admin.NET.sln`**。  
+本机 **`SourceCode/ai-dop-platform`** 建议改为指向 **`…/references/Admin.NET/ai-dop-platform`** 的 **目录联接(junction)**,避免与主库内文档双份漂移。
 
 ---
 
 ## 5. 已完成的基线工作(截至文档编写时)
 
-- [x] 拉取/固定 **Admin.NET**(如 Gitee `v2`)于 `SourceCode/references/Admin.NET`
+- [x] 拉取/固定 **Ai-DOP 主库**(如 Gitee `v2`);内容与上游 Admin.NET 同树,含 **`server/`**、**`Web/`**、**`ai-dop-platform/`**
 - [x] 建立 **`Admin.NET.Plugin.AiDOP`**:SqlSugar 实体 `AdoOrder` / `AdoPlan` / `AdoWorkOrder`;MVC 控制器 **`api/Order`、`api/Plan`、`api/WorkOrder`**;`[NonUnify]` 保持与旧前端一致的 JSON 形状;**Development** 下 **CodeFirst.InitTables**。
 - [x] 解决方案与 **Web.Core** 已 **引用插件** 并 **`AddApplicationPart`** 注册控制器程序集。
 - [x] `ai-dop-platform`:**README**、**GETTING_STARTED**、**ARCHITECTURE**、**CURRENT_TASKS**、**.cursor/rules**;**legacy-demo** 已拷贝入仓库。
@@ -95,7 +94,7 @@ D:\Projects\Ai-DOP\SourceCode\   # ★ 项目源码根目录(本机约定)
 建议顺序(与 [CURRENT_TASKS.md](CURRENT_TASKS.md) 勾选一致):
 
 1. **本机 SDK**:`dotnet --list-sdks` 同时有 **8.0.x 与 10.0.x**;缺 10 时按 CURRENT_TASKS 在无占用 `dotnet.exe` 情况下安装。
-2. **编译**:`dotnet build ../references/Admin.NET/server/Admin.NET.sln -c Debug` 通过。
+2. **编译**:`dotnet build ../server/Admin.NET.sln -c Debug` 通过(主库根下则 `server/Admin.NET.sln`)
 3. **配置 MySQL**(Admin.NET 官方配置方式),启动 **Web.Entry**,确认 **Development** 下 **ado_*** 表可用。
 4. **前端联调**:`legacy-demo/frontend` 起 dev,抽查 **GET /api/Order** 等。
 5. **安全硬化**:评估移除 **`[AllowAnonymous]`**,挂菜单/权限;生产关闭依赖 **CodeFirst** 的建表方式。
@@ -106,7 +105,7 @@ D:\Projects\Ai-DOP\SourceCode\   # ★ 项目源码根目录(本机约定)
 ## 7. 风险与约定
 
 - **不要**在 `Admin.NET.Core` 里堆业务代码;业务在 **`Admin.NET.Plugin.AiDOP`** 或后续新插件中扩展。
-- **不要**把与上游无关的大改直接混进 `references/Admin.NET`;与官方差异应用分支/文档说明。
+- **不要**把与上游无关的大改直接混进 **本主库**;与官方 Admin.NET 差异应用分支/文档说明。
 - Demo 接口 **匿名可访问** 仅用于开发联调,**上线前必须收紧**。
 
 ---

+ 3 - 3
ai-dop-platform/docs/db/_copy_data.py

@@ -1,7 +1,7 @@
-from pathlib import Path
+from pathlib import Path
 pairs = [
- (r"d:/Projects/Ai-DOP/SourceCode/ai-dop-platform/legacy-demo/frontend/src/data/homeModulesSync.js", r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/Web/src/views/dashboard/data/homeModulesSync.ts"),
- (r"d:/Projects/Ai-DOP/SourceCode/ai-dop-platform/legacy-demo/frontend/src/data/s2Kpis.js", r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/Web/src/views/dashboard/data/s2Kpis.ts"),
+ (r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/ai-dop-platform/legacy-demo/frontend/src/data/homeModulesSync.js", r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/Web/src/views/dashboard/data/homeModulesSync.ts"),
+ (r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/ai-dop-platform/legacy-demo/frontend/src/data/s2Kpis.js", r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/Web/src/views/dashboard/data/s2Kpis.ts"),
 ]
 for s,d in pairs:
   src=Path(s); dst=Path(d); dst.parent.mkdir(parents=True, exist_ok=True)

+ 2 - 2
ai-dop-platform/docs/db/_copy_home.py

@@ -1,5 +1,5 @@
-from pathlib import Path
-src = Path(r"d:/Projects/Ai-DOP/SourceCode/ai-dop-platform/legacy-demo/frontend/src/views/HomeView.vue")
+from pathlib import Path
+src = Path(r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/ai-dop-platform/legacy-demo/frontend/src/views/HomeView.vue")
 dst = Path(r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/Web/src/views/dashboard/home.vue")
 dst.parent.mkdir(parents=True, exist_ok=True)
 t = src.read_text(encoding='utf-8')

+ 2 - 2
ai-dop-platform/docs/db/_copy_kanban.py

@@ -1,6 +1,6 @@
-from pathlib import Path
+from pathlib import Path
 
-legacy = Path(r"d:/Projects/Ai-DOP/SourceCode/ai-dop-platform/legacy-demo/frontend/src")
+legacy = Path(r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/ai-dop-platform/legacy-demo/frontend/src")
 web = Path(r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/Web/src/views/aidop/kanban")
 (web / "components").mkdir(parents=True, exist_ok=True)
 (web / "data").mkdir(parents=True, exist_ok=True)

+ 2 - 2
ai-dop-platform/docs/db/_copy_s0_data.py

@@ -1,5 +1,5 @@
-from pathlib import Path
-src = Path(r"d:/Projects/Ai-DOP/SourceCode/ai-dop-platform/legacy-demo/frontend/src/data/operationModelSchema.js")
+from pathlib import Path
+src = Path(r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/ai-dop-platform/legacy-demo/frontend/src/data/operationModelSchema.js")
 dst = Path(r"d:/Projects/Ai-DOP/SourceCode/references/Admin.NET/Web/src/views/aidop/kanban/data/operationModelSchema.ts")
 dst.parent.mkdir(parents=True, exist_ok=True)
 dst.write_text(src.read_text(encoding='utf-8'), encoding='utf-8')

+ 16 - 1
ai-dop-platform/tools/gen_aidop_menu.py

@@ -5,8 +5,23 @@ from __future__ import annotations
 from pathlib import Path
 from typing import Dict, Tuple
 
+
+def _find_aidop_repo_root(ai_dop_platform_dir: Path) -> Path:
+    """Locate main clone root (contains server/Admin.NET.sln), whether platform lives in-repo or under SourceCode/references."""
+    for ancestor in [ai_dop_platform_dir.resolve()] + list(ai_dop_platform_dir.resolve().parents):
+        if (ancestor / "server" / "Admin.NET.sln").is_file():
+            return ancestor
+        nested = ancestor / "references" / "Admin.NET" / "server" / "Admin.NET.sln"
+        if nested.is_file():
+            return ancestor / "references" / "Admin.NET"
+    raise RuntimeError(
+        "找不到 server/Admin.NET.sln:请将本仓库克隆为 SourceCode/references/Admin.NET,"
+        "或把 ai-dop-platform 放在该克隆内的 ai-dop-platform/ 下。"
+    )
+
+
 ROOT = Path(__file__).resolve().parents[1]
-OUT = ROOT.parent / "references/Admin.NET/server/Plugins/Admin.NET.Plugin.AiDOP/SeedData/SysMenuSeedData.cs"
+OUT = _find_aidop_repo_root(ROOT) / "server/Plugins/Admin.NET.Plugin.AiDOP/SeedData/SysMenuSeedData.cs"
 
 # 叶子菜单 Vue 组件路径(相对 Web views,与动态 import 一致);键为 (模块代码, 叶序号 1-based)
 COMPONENT_OVERRIDES: Dict[Tuple[str, int], str] = {