sansheng-liubu 1.2.0 → 1.2.3

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.
@@ -119,7 +119,7 @@
119
119
 
120
120
  ## 五、 验收标准与质量门禁模块规范 (Quality Gates)
121
121
 
122
- 在 `TASK.md` 中强制建立**专属质量门禁专区**:
122
+ 在 `TASK.md` 中强制建立**专属质量门禁专区**,严禁形式主义,必须将自动化测试与人工验收标准细化至可严格断言的程度:
123
123
 
124
124
  ```markdown
125
125
  ## 🎯 验收标准与质量门禁 (Verification & Quality Gates)
@@ -140,32 +140,53 @@ dotnet test --filter "Category=IntegrationTest"
140
140
  ```
141
141
 
142
142
  ### 4. 人工 UAT 交付验收准则清单 (Human Sign-off Checklist)
143
- - [ ] `[UAT-01]` 进入 Vue 3 列表页,点击 Element `<el-button>` 异步导出,1秒内弹出 `<el-message>` 成功提示。
144
- - [ ] `[UAT-02]` 超过 100 万行导出时,后端正确拦截并向前端返回 4001 友好错误码。
145
- - [ ] `[UAT-03]` 下载中心生成直链,下载的 Excel 打开无乱码,脱敏字段显示正常。
143
+ > ⚠️ **制定铁律**:严禁“以代码测代码”。所有 UAT 项必须严格按照需求文档(PRD)的原义预期编写,且必须包含四要素(编号溯源、前置数据、操作步骤、PRD预期核对):
144
+
145
+ - [ ] `[UAT-01]` (溯源: REQ-01 / AC-1) 【订单列表异步导出正常流】
146
+ - **前置与数据**:登录 `operator_test` 运营账号,系统存在至少 1 笔“待发货”订单
147
+ - **操作步骤**:进入【订单管理 ➔ 列表】➔ 勾选前 2 条 ➔ 点击右上角【批量导出】
148
+ - **PRD预期对照**:1秒内弹出 `<el-message>` 成功提示:“导出任务已提交”;进入【下载中心】状态为“已完成”,下载 Excel 打开无乱码,客户手机号显示为 `138****0000` 脱敏格式。
149
+ - [ ] `[UAT-02]` (溯源: REQ-01 / AC-2) 【超过阈值熔断拦截】
150
+ - **前置与数据**:筛选全量订单(勾选或总数 > 10,000 条)
151
+ - **操作步骤**:点击【批量导出】
152
+ - **PRD预期对照**:前端直接弹出 Warning 提示:“单次导出不得超过 10,000 条”,不触发后端接口,导出按钮不锁定。
153
+ - [ ] `[UAT-03]` (溯源: REQ-02 / AC-1) 【无导出权限租户越权拦截】
154
+ - **前置与数据**:登录普通访客账号 `guest_user`
155
+ - **操作步骤**:直接通过 URL 访问 `/orders/export` 或伪造请求
156
+ - **PRD预期对照**:系统正确拦截并返回 4003 无权访问,前端重定向至 403 页面并提示“请联系管理员申请导出权限”。
146
157
  ```
147
158
 
159
+ ### 5. UAT-to-REQ 双向追溯与覆盖率门禁 (Traceability Gate)
160
+ 1. **无源不立**:每条 `[UAT-xx]` 必须显式标注 `(溯源: REQ-xx / AC-xx)`,严禁凭空拟定脱离需求的测试用例。
161
+ 2. **无漏不结**:中书省提取的每一个 `[REQ-xx]`,门下省必须至少派生出 **1 个正向业务流用例 + 1 个异常/边界用例**。门下省执行 `auditUATCoverage`,覆盖率未达 100% 严禁放行。
162
+ 3. **PRD 预期唯一真理源**:测试预期的判定标准永远以需求文档为准,绝不允许因开发实现的偏差而擅自篡改预期“将错就错”。
163
+
148
164
  ---
149
165
 
150
166
  ## 六、 交互式 UAT 逐项验收与即时自愈复盘闭环
151
167
 
152
168
  ```
153
169
  ┌─────────────────────────────────────────────────────────────┐
154
- │ 🎯 弹出当前验收项 [UAT-01: 验证 100 万行导出熔断提示] │
170
+ │ 🎯 弹出当前验收项 [UAT-01: 订单列表异步导出正常流] │
171
+ │ 📌 溯源: REQ-01 / AC-1 │
172
+ │ 🛠️ 前置数据: 登录 operator_test,确保待发货订单存在 │
173
+ │ 🪜 操作步骤: 订单列表 ➔ 勾选 ➔ 点击批量导出 │
174
+ │ 🎯 PRD 预期: 1s内弹成功提示,下载中心解压无乱码且手机号脱敏 │
155
175
  └──────────────────────────────┬──────────────────────────────┘
156
176
  │
157
177
  ┌──────────────────────┴──────────────────────┐
158
178
  ▼ ▼
159
179
  【选项 1: ✅ Passed】 【选项 2: ❌ Not Passed】
160
- │ │ (附带输入缺陷现象)
180
+ │ │ (输入实际现象与 PRD 预期的偏差)
161
181
  │ ▼
162
182
  │ ┌──────────────────────────────┐
163
183
  │ │ AI 立即行动: │
164
- │ │ 1. 定位源码与补写复现用例 │
165
- │ │ 2. 修复 Bug 并跑通自动化测试 │
166
- │ │ 3. 原地重新弹出 UAT-01 弹窗 │
184
+ │ │ 1. 对照 PRD 定位代码实现偏差 │
185
+ │ │ 2. 补写针对性复现测试用例 │
186
+ │ │ 3. 修复 Bug 并跑通自动化门禁 │
187
+ │ │ 4. 原地重新拉起该项 UAT 复测 │
167
188
  │ └──────────────┬───────────────┘
168
- │ │ (用户复测通过)
189
+ │ │ (用户复测符合 PRD 预期)
169
190
  ▼ ▼
170
191
  ┌─────────────────────────────────────────────────────────────────────────────┐
171
192
  │ 1. 在 TASK.md 中标记: - [x] UAT-01: Passed │
@@ -193,8 +214,10 @@ dotnet test --filter "Category=IntegrationTest"
193
214
 
194
215
  ## 九、 防漏需求与细节溯源机制
195
216
 
196
- - 原子需求提取清单(`[REQ-01]`, `[REQ-02]`...)。
197
- - 需求跟踪矩阵(每个 Task 显式绑定 `[REQ-xx]`,100% 覆盖率对账)。
217
+ - **原子需求规格化提取**(`[REQ-01]`, `[REQ-02]`...):每个需求必须强制挂载 **AC (Acceptance Criteria,验收准则)**,明确正常流与异常流的预期结果。
218
+ - **双向需求跟踪矩阵 (RTM)**:
219
+ - **Task 覆盖**:每个 Task 显式绑定 `[REQ-xx]`,确保开发任务 100% 覆盖业务需求。
220
+ - **UAT 对账**:每个 UAT 项显式标注 `(溯源: REQ-xx / AC-xx)`,并通过 `auditUATCoverage` 强制对账,确保人工测试 100% 按照 PRD 预期进行验收。
198
221
 
199
222
  ---
200
223
 
package/README.md CHANGED
@@ -11,12 +11,12 @@
11
11
 
12
12
  | 阶段 | 执行位置 | 开发者输入 (敲什么) | 底层调用的命令 / Skill | 核心产物 / 状态 |
13
13
  | :--- | :--- | :--- | :--- | :--- |
14
- | **0. 环境准备** | 🖥️ 终端 | `sansheng init`<br>`sansheng map` | `csharp-ls`, `codebase-memory-mcp`<br>`codebase-map.js` | `.sansheng/config.json`<br>`.sansheng/codebase_map.md`<br>`.github/copilot-instructions.md` |
14
+ | **0. 环境准备** | 🖥️ 终端 | `sansheng init`<br>`sansheng map`<br>`sansheng update` | `csharp-ls`, `codebase-memory-mcp`<br>`codebase-map.js`, `updater.js` | `.sansheng/config.json`<br>`.sansheng/codebase_map.md`<br>NPM 原地热升级与规则自愈 |
15
15
  | **1. 中书省 ALIGN** | 💬 IDE 聊天框 | 直接输入需求文本,或:<br>`/sansheng [需求内容]` | **Skill**: `yongle-search` / `yongle-hybrid-search.js`<br>**Tools**: `codebase-map.js`, `tree-sitter` | 四要素微引用质询<br>`[REQ-xx]` 原子清单<br>`[RULE-xx]` 边界铁律 |
16
16
  | **1.1 决策对齐** | 💬 IDE 聊天框 | `1A 2B 3A` (单选)<br>`A+B` (组合) / `先B后A` (演进)<br>`修改 Q1 为 B` (插话回溯) | 流式 Markdown 解析<br>自动涟漪影响分析 | 决策确定,自动触发门下省 |
17
17
  | **2. 门下省 PLAN** | 💬 IDE 聊天框 / 🖥️ 终端 | 自动触发,或输入:<br>`定稿,生成任务板`<br>终端查看: `sansheng status` | **Tools**: `menxia.js`<br>**Gate**: `dotnet test`, `npx vitest` | `.sansheng/TASK.md` (≤150行)<br>100% 需求覆盖率对账表<br>聊天框 3 行 HUD 进度看板 |
18
18
  | **3. 六部 RUN** | 💬 IDE 聊天框 | `c` / `r` (全自动跑完)<br>`s` / `n` (单步执行并汇报) | **Skill**: `invoke_subagent` / `worker.js`<br>**Tools**: `csharp-ls`, `dotnet format`, `biome`<br>**Test**: `dotnet test --verbosity quiet` | 纯净上下文代码编写<br>单元测试 100% 绿灯<br>自动化质量门禁通过 |
19
- | **4. 交互式 UAT** | 💬 IDE 聊天框 / 🖥️ 终端 | 终端: `sansheng uat`<br>卡片判定: `1` 或 `y` (通过)<br>缺陷反馈: `2 <报错/现象描述>` | **Agent**: 原地补写边界测试 ➔ 修复 ➔ 复测<br>**Skill**: `yongle-postmortem` (通过后自动归档) | `[UAT-xx]` 逐项打勾<br>避坑心得归档至知识库 |
19
+ | **4. 交互式 UAT** | 💬 IDE 聊天框 / 🖥️ 终端 | 网页看板: `sansheng html`<br>终端验收: `sansheng uat`<br>卡片判定: `1` 或 `y` (通过)<br>缺陷反馈: `2 <报错/现象描述>` | **看板**: 0 Token 本地自包含 HTML (Chrome/Edge 鼠标点选)<br>**Agent**: 原地补写边界测试 ➔ 修复 ➔ 复测<br>**Skill**: `yongle-postmortem` (通过后自动归档) | `.sansheng/uat.html` (网页看板)<br>`[UAT-xx]` 逐项打勾<br>避坑心得归档至知识库 |
20
20
  | **5. 归档结项** | 💬 IDE 聊天框 / 🖥️ 终端 | 终端: `sansheng archive`<br>聊天框: `archive` 或 `结项` | **Tools**: `shangshu.js` (`closeMilestone`)<br>**Skill**: `yongle-sync` / `yongle-sync-knowledge.js` | `TASK.md` ➔ `.sansheng/archive/`<br>`ROADMAP.md` 标记完成<br>清理临时文件,仓库 100% 纯净 |
21
21
 
22
22
  ---
@@ -61,6 +61,12 @@ sansheng sync-rules
61
61
  sansheng sync-rules --export trae,qoder,cursor
62
62
  ```
63
63
 
64
+ #### 4. 智能检测与原地升级 (无需卸载)
65
+ ```bash
66
+ # 从 NPM 官方源自动检测最新版本并原地覆盖升级,无损同步工作区配置与 IDE 规则
67
+ sansheng update
68
+ ```
69
+
64
70
  ---
65
71
 
66
72
  ### 阶段 1:中书省 【ALIGN 需求对齐阶段】
@@ -155,23 +161,52 @@ sansheng status
155
161
 
156
162
  ### 阶段 4:交互式 UAT 验收与自愈复盘闭环
157
163
 
158
- 所有代码与自动化单元测试通过后,触发 UAT 交付门禁:
164
+ 所有代码与自动化单元测试通过后,触发 UAT 交付门禁。
159
165
 
160
- #### 1. 方式 A:聊天框单项卡片验收
161
- AI 依次弹出当前 UAT 项(如 `[UAT-01: 超过 100 万行导出熔断提示]`):
162
- - **判定通过**:输入 `1` 或 `y` ➔ 打勾 `- [x] UAT-01: Passed`,自动推进下一项;
163
- - **判定不通过**:输入 `2 导出时页面没有弹出 4001 错误提示框`
164
- - 🤖 **工兵立即自愈**:
165
- 1. 定位源码并在测试工程补写 `Export_OverLimit_ShouldReturn4001` 复现用例;
166
- 2. 修复控制器/前端代码并跑通 `dotnet test`;
167
- 3. 原地重新提示用户复测;
168
- - 💡 **复测通过后**:自动触发 Skill `yongle-postmortem` 将本次排查与修复经验沉淀至《永乐大典》。
166
+ #### 📌 铁律:四要素用例标准与 PRD 预期对账(严禁以代码测代码)
167
+ 在 `TASK.md` 中生成的每一项 UAT 必须具备**四要素**(编号溯源、前置数据、操作步骤、🎯 PRD预期核对):
168
+ ```markdown
169
+ - [ ] `[UAT-01]` (溯源: REQ-01 / AC-1) 【订单列表异步导出正常流】
170
+ - **前置与数据**:登录 operator_test 运营账号,系统存在待发货状态订单
171
+ - **操作步骤**:进入【订单管理 ➔ 列表】➔ 勾选前 2 条 ➔ 点击右上角【批量导出】
172
+ - **PRD预期对照**:1秒内弹出成功提示:“导出任务已提交”;进入【下载中心】状态为“已完成”,下载 Excel 打开无乱码,客户手机号显示为 138****0000 脱敏格式。
173
+ ```
174
+ - **门禁对账**:门下省执行 `auditUATCoverage`,严格校验每个 `[REQ-xx]` 是否 100% 被正向与异常 UAT 覆盖,缺项或无 PRD 预期直接阻断。
175
+
176
+ ---
177
+
178
+ #### 验收执行的三种方式:
179
+
180
+ #### 1. 方式 A:0 Token 本地交互式 HTML 验收看板(⭐ 最爽体验:浏览器鼠标点选)
181
+ 无需启动常驻服务或占用端口,纯本地 3ms 瞬间编译:
182
+ ```bash
183
+ # 1. 当前项目直接生成(全向自动探测 .sansheng/TASK.md, TASK.md, task.md 等)
184
+ sansheng html
185
+
186
+ # 2. 已有项目或指定任意文件路径编译
187
+ sansheng html ./path/to/task.md
188
+ sansheng html D:/Projects/MyService/TASK.md
189
+
190
+ # 3. 免全局安装在已有项目中通过 npx 快速调用
191
+ npx sansheng-liubu html
192
+ ```
193
+ - **已有项目全格式兼容**:无论是新规范的标准四要素用例,还是已有项目中的单行老格式用例(如 `- [ ] [UAT-01] 导出正常通过`),均能自动向下兼容并生成可交互勾选卡片;
194
+ - **双击即开**:直接用 Chrome / Edge 双击打开生成的 `uat.html`;
195
+ - **鼠标直选与自动静默写回**:点击网页顶部的 **【📁 关联本地 TASK.md】** 授权一次,之后在网页上**每用鼠标勾选/取消一项,浏览器利用原生 File System Access API 自动实时写回磁盘的 `TASK.md`**(自动更新 `- [x]`);
196
+ - **四要素卡片与进度计算**:直观展示前置、步骤与高亮的 🎯 PRD 预期对照,实时展示通过百分比(如 `67% Passed`);
197
+ - **一键缺陷反馈**:点击卡片下方“记录反馈”,输入偏差后点击“复制自愈指令”,直接发给 AI 触发代码修复。
169
198
 
170
199
  #### 2. 方式 B:终端交互式独立验收
171
200
  ```bash
172
201
  sansheng uat
173
202
  ```
174
- 在命令行控制台中逐项判定与自愈复测。
203
+ 命令行逐项展示需求溯源、前置数据、操作步骤与 PRD 预期对照表,支持终端键盘快捷判定与即时自愈。同时每次执行会自动同步刷新 `.sansheng/uat.html`。
204
+
205
+ #### 3. 方式 C:聊天框单项卡片验收
206
+ AI 依次在聊天窗口弹出当前 UAT 项四要素:
207
+ - **判定通过**:输入 `1` 或 `y` ➔ 打勾 `- [x] UAT-01: Passed`,自动推进下一项;
208
+ - **判定不通过**:输入 `2 <实际现象与PRD预期的偏差>` ➔ AI 对照需求文档原文定位源码偏差,补写复现用例、修复并原地复测;
209
+ - **自愈复盘**:修复通过后自动触发 `yongle-postmortem` 将排查经验沉淀至《永乐大典》。
175
210
 
176
211
  ---
177
212
 
@@ -276,11 +311,20 @@ pnpm update sansheng-liubu
276
311
  2. 找到 `sansheng-liubu`,若有新版本将显示 **Update** 按钮;
277
312
  3. 点击 **Update**,Cordis 运行时将自动完成无损热重载(Hot-Reload),无需重启 DSH 后台服务。
278
313
 
279
- #### 方式 C:通过三省六部内置 CLI 升级
314
+ #### 方式 C:通过三省六部内置 CLI 原地升级
280
315
  ```bash
316
+ # 自动检测 npm 远端版本并原地覆盖升级 (无须卸载再安装),随后增量同步工作区配置与 IDE 规则
281
317
  sansheng update
318
+
319
+ # 仅检查是否有新版本
320
+ sansheng update --check
321
+
322
+ # 跳过 npm 包更新,仅同步工作区配置与 IDE 提示词规则
323
+ sansheng update --skip-npm
324
+
325
+ # 强制从 NPM 重新安装最新版
326
+ sansheng update --force
282
327
  ```
283
- - 自动检查 npm 注册表最新版本并无损增量同步工作区配置与 Prompt 模板。
284
328
 
285
329
  ---
286
330
 
@@ -348,9 +392,10 @@ DSH 模型上下文可随时调用以下受控工具:
348
392
  | `sansheng sync-rules` | 多 IDE 协同开发时 | 嗅探 Trae/CatPaw/Qoder/Cursor 规则并智能转译至 Copilot |
349
393
  | `sansheng sync-rules --export <ide>` | 导出规则至其他 IDE | 将集中维护的规则导出为 `.trae/rules.md` / `.cursorrules` 等 |
350
394
  | `sansheng status` | 随时查看进度 | 查看当前活跃 Phase 的 3 行 HUD 任务进度看板 |
395
+ | `sansheng html` | 网页可视化鼠标勾选 | 0 Token 编译本地自包含 UAT 看板 (`.sansheng/uat.html`),支持浏览器静默写回 |
351
396
  | `sansheng uat` | 命令行交互验收 | 启动交互式单项 UAT 验收与自愈修复循环 |
352
397
  | `sansheng archive` | 模块全部交付结项时 | 触发两级归档、更新 ROADMAP、清理缓存、同步《永乐大典》 |
353
- | `sansheng update` | 升级工作流引擎 | 检查最新版本、无损增量合并配置与 IDE Prompt 模板 |
398
+ | `sansheng update` | 升级工作流引擎 | 从 NPM 检查并原地更新至最新版 (无须卸载),无损增量合并配置与 IDE Prompt 模板 |
354
399
 
355
400
  ---
356
401
 
package/SKILL.md CHANGED
@@ -10,7 +10,7 @@ description: 基于「三省六部制」的极简高质跨环境 AI 研发工作
10
10
  ## 交互模式与快捷键
11
11
 
12
12
  - **零前缀感知**:根据用户自然语言输入,自动切换中书省(ALIGN)与六部(RUN)阶段。
13
- - **统一指令**:输入 `/sansheng [内容]` 自动路由生命周期;`/sansheng map` 更新拓扑图;`/sansheng sync-rules` 转译规则。
13
+ - **统一指令**:输入 `/sansheng [内容]` 自动路由生命周期;`/sansheng map` 更新拓扑图;`/sansheng sync-rules` 转译规则;`/sansheng update` 从 npm 原地更新最新版并同步工作区。
14
14
 
15
15
  | 快捷键 | 功能描述 |
16
16
  |---|---|
@@ -25,7 +25,7 @@ description: 基于「三省六部制」的极简高质跨环境 AI 研发工作
25
25
  ### 中书省 ➔ 【ALIGN 需求对齐阶段】
26
26
  - **动作0 代码拓扑感知**:无拓扑图时自动执行 `/sansheng map` 生成 AST 地图,基于地图精准提问。
27
27
  - **动作1 前置召回**:静默检索永乐大典相关技术栈踩坑经验。
28
- - **动作2 原子化提取**:将需求拆解为 `[REQ-xx]` 编号清单。
28
+ - **动作2 原子化提取**:将需求拆解为挂载验收标准 (AC) 的 `[REQ-xx]` 编号清单。
29
29
  - **动作3 锚定式质询**:提问格式为 坐标 + 微引用 + 疑点分析 + 推荐选项。
30
30
  - **动作4 敏捷交互响应**:支持堆栈下钻、零废话握手及三态语法。
31
31
  - **动作5 提炼边界铁律**:提炼 3-5 条红线规则 `[RULE-xx]`。
@@ -34,15 +34,15 @@ description: 基于「三省六部制」的极简高质跨环境 AI 研发工作
34
34
 
35
35
  ### 门下省 ➔ 【PLAN 计划与门禁阶段】
36
36
  - **动作1 依赖拓扑分析**:标记模块三色分类(独立/顺序/强联动)与极简副作用表。
37
- - **动作2 建立质量门禁**:制定自动化单测(100%绿灯)、边界用例、端到端冒烟命令与 UAT 交付清单 `[UAT-xx]`。
38
- - **动作3 覆盖率对账**:确保所有 `[REQ-xx]` 100% 被 Task 覆盖。
37
+ - **动作2 建立质量门禁**:制定自动化单测(100%绿灯)、边界用例、端到端冒烟命令与四要素 UAT 交付清单 `[UAT-xx]`(包含需求溯源、前置数据、操作步骤与 PRD 预期核对)。
38
+ - **动作3 覆盖率对账**:执行 Task 与 UAT 双向覆盖对账,确保所有 `[REQ-xx]` 100% 被覆盖。
39
39
  - **动作4 生成任务板**:信息固化至 `.sansheng/TASK.md`(最多150行),聊天窗口仅回显 3 行极简 HUD。
40
40
 
41
41
  ### 尚书省与六部 ➔ 【RUN 执行与归档阶段】
42
42
  - **动作1 纯净派生**:调度子 Agent 或工兵执行单任务,仅携带当前 Task 与 1-2 个源码文件。
43
43
  - **动作2 物理压榨**:调用原生指令重命名,用工具排版,业务修改仅输出局部 Diff。
44
44
  - **动作3 弹性自愈**:连续 2 次测试失败自动升级处理。
45
- - **动作4 交互式 UAT**:单项验收,修复通过即时触发 `yongle-postmortem` 归档。
45
+ - **动作4 交互式 UAT**:单项四要素验收(以 PRD 预期为唯一真理源),修复通过即时触发 `yongle-postmortem` 归档。
46
46
  - **动作5 两级自动归档**:任务看板自动归档;结项同步全量经验,清理活跃任务板。
47
47
  - **§15 四级语义权限矩阵**:
48
48
  - 🟢 L1只读 (view/grep/ls):自动放行
package/bin/cli.js CHANGED
@@ -4,8 +4,9 @@ import fs from 'fs';
4
4
  import path from 'path';
5
5
  import { extractCodebaseMap } from '../src/tools/codebase-map.js';
6
6
  import { runInteractiveUAT } from '../src/core/uat-runner.js';
7
+ import { exportUATHtml } from '../src/core/uat-html-compiler.js';
7
8
  import { executeArchive } from '../src/core/shangshu.js';
8
- import { runUpdate } from '../src/core/updater.js';
9
+ import { runUpdate, getLocalVersion } from '../src/core/updater.js';
9
10
  import { promptAndInstallYongle } from '../src/tools/yongle-installer.js';
10
11
  import { LSPClient } from '../src/tools/lsp-client.js';
11
12
  import { CBMBridge } from '../src/tools/cbm-bridge.js';
@@ -15,7 +16,7 @@ import { RuleSync } from '../src/tools/rule-sync.js';
15
16
  const args = process.argv.slice(2);
16
17
  const command = args[0] || 'help';
17
18
 
18
- console.log(`🏛️ 【三省六部 (sansheng-liubu)】AI 研发工作流引擎 v1.2`);
19
+ console.log(`🏛️ 【三省六部 (sansheng-liubu)】AI 研发工作流引擎 v${getLocalVersion()}`);
19
20
 
20
21
  async function main() {
21
22
  switch (command) {
@@ -28,7 +29,7 @@ async function main() {
28
29
  break;
29
30
  case 'update':
30
31
  case 'upgrade':
31
- await runUpdate();
32
+ await runUpdate(args.slice(1));
32
33
  break;
33
34
  case 'map':
34
35
  generateMap();
@@ -36,8 +37,14 @@ async function main() {
36
37
  case 'status':
37
38
  showStatus();
38
39
  break;
40
+ case 'html':
41
+ case 'uat-html':
42
+ handleExportHtml(args[1]);
43
+ break;
39
44
  case 'uat':
45
+ try { exportUATHtml(); } catch (e) {}
40
46
  await runInteractiveUAT();
47
+ try { exportUATHtml(); } catch (e) {}
41
48
  break;
42
49
  case 'archive':
43
50
  executeArchive();
@@ -174,15 +181,28 @@ function showStatus() {
174
181
  console.log(`\n👉 回复 c (全自动推进) 或 s (单步推进)`);
175
182
  }
176
183
 
184
+ function handleExportHtml(targetPath) {
185
+ const res = exportUATHtml({ taskPath: targetPath });
186
+ if (res.success) {
187
+ console.log(`\n🎉 ${res.message}`);
188
+ console.log(`💡 提示: 您可以直接用默认浏览器双击打开此 HTML 文件,体验鼠标勾选与自动静默保存!\n`);
189
+ } else {
190
+ console.log(`\n⚠️ ${res.message}\n`);
191
+ }
192
+ }
193
+
177
194
  function showHelp() {
178
195
  console.log(`
179
196
  用法:
180
197
  sansheng init 初始化三省六部工作区 (收敛配置与总纲至 .sansheng/,注入 VS Code 增强)
181
198
  sansheng sync-rules 嗅探 Trae/CatPaw/Qoder/Cursor 规则并智能转译同步至 VS Code Copilot
182
199
  sansheng sync-rules --export 反向导出集中规则至指定 IDE (如 --export trae,catpaw,qoder)
183
- sansheng update 检查最新版本、无损同步工作区配置与 IDE 技能规则
200
+ sansheng update 从 NPM 检查并原地升级至最新版本,无损增量同步工作区配置与 IDE 规则
201
+ (参数: --check 仅检查版本, --skip-npm 仅同步工作区, --force 强制重装)
184
202
  sansheng map 提取当前项目 AST 符号骨架 (.sansheng/codebase_map.md)
185
203
  sansheng status 查看当前活跃阶段的 3 行 HUD 任务进度
204
+ sansheng html [path] 0 Token 将已有项目的 task.md 编译为本地交互式网页验收看板 (.sansheng/uat.html)
205
+ (可选指定路径,如: sansheng html ./task.md 或全向自动探测)
186
206
  sansheng uat 启动交互式单项 UAT 验收与自愈修复循环
187
207
  sansheng archive 执行项目两级归档并同步至《永乐大典》
188
208
  `);
package/bin/worker.js CHANGED
@@ -1,28 +1,61 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ import fs from 'fs';
4
+ import { execSync } from 'child_process';
5
+
3
6
  /**
4
- * 六部工兵 (Headless Worker) 独立执行进程
7
+ * 六部工兵 (Headless Worker) 独立执行进程 (SPEC §16)
5
8
  * 仅携带单个 Task 与目标源码文件,0 历史 Token 负担
6
9
  */
7
10
 
8
11
  const args = process.argv.slice(2);
9
12
  let task = null;
10
13
  let model = 'deepseek-v3';
14
+ let testCmd = null;
11
15
 
12
16
  for (let i = 0; i < args.length; i++) {
13
17
  if (args[i] === '--task' && args[i + 1]) {
14
18
  try { task = JSON.parse(args[i + 1]); } catch (_) {}
19
+ i++;
20
+ } else if (args[i] === '--task-file' && args[i + 1]) {
21
+ try {
22
+ if (fs.existsSync(args[i + 1])) {
23
+ task = JSON.parse(fs.readFileSync(args[i + 1], 'utf-8'));
24
+ }
25
+ } catch (_) {}
26
+ i++;
15
27
  } else if (args[i] === '--model' && args[i + 1]) {
16
28
  model = args[i + 1];
29
+ i++;
30
+ } else if (args[i] === '--test-cmd' && args[i + 1]) {
31
+ testCmd = args[i + 1];
32
+ i++;
17
33
  }
18
34
  }
19
35
 
20
36
  if (!task) {
21
- console.log(`[Worker] 无有效任务载荷,正常退出。`);
37
+ console.log(`[Worker] 未检测到有效任务载荷,已安全退出。`);
22
38
  process.exit(0);
23
39
  }
24
40
 
25
- console.log(`👷 [Worker 启动] 执行: ${task.title || '单任务'} | 模型: ${model}`);
26
- // 在真实环境中,这里直连 LLM API 执行代码写入与本地测试校验
27
- // 此处模拟执行并返回状态码 0
28
- process.exit(0);
41
+ const taskId = task.id || 'TASK-WORKER';
42
+ const taskTitle = task.title || task.name || '单任务执行';
43
+ console.log(`👷 [六部工兵启动] 任务: [${taskId}] ${taskTitle} | 执行模型: ${model}`);
44
+
45
+ // 若指定了自测门禁命令,执行本地冒烟验证 (SPEC §16 & §17)
46
+ if (testCmd || task.testCmd) {
47
+ const cmdToRun = testCmd || task.testCmd;
48
+ console.log(`🧪 [工兵自测门禁] 正在运行测试命令: ${cmdToRun}`);
49
+ try {
50
+ execSync(cmdToRun, { stdio: 'inherit' });
51
+ console.log(`✅ [工兵自测通过] 测试绿灯,任务交付。`);
52
+ process.exit(0);
53
+ } catch (err) {
54
+ console.error(`❌ [工兵自测失败] 退出码非 0: ${err.message}`);
55
+ process.exit(1); // 返回错误码以触发 SubagentAdapter 弹性升配
56
+ }
57
+ } else {
58
+ // 无附加验证命令时,标准执行完毕正常退出
59
+ console.log(`✅ [六部工兵] 任务处理完成。`);
60
+ process.exit(0);
61
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sansheng-liubu",
3
- "version": "1.2.0",
3
+ "version": "1.2.3",
4
4
  "description": "基于「三省六部制」的极简高质跨环境 AI 研发工作流引擎与 DeepSeek Harness 插件 (Vue 3 + .NET 8 / Core 3.1 深度优化)",
5
5
  "main": "src/index.js",
6
6
  "types": "src/index.d.ts",
@@ -19,7 +19,8 @@
19
19
  "homepage": "https://github.com/TwotwoPiggy/sansheng-liubu#readme",
20
20
  "scripts": {
21
21
  "start": "node ./bin/cli.js",
22
- "test": "node ./bin/cli.js map",
22
+ "test": "node --test test/*.spec.mjs",
23
+ "test:unit": "node --test test/*.spec.mjs",
23
24
  "test:plugin": "node --test test/plugin.spec.mjs",
24
25
  "test:lsp": "node scripts/test-lsp.mjs",
25
26
  "release": "node scripts/release.mjs",