ai-project-manage-cli 6.0.54 → 6.0.55
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.
- package/dist/index.js +21 -2
- package/package.json +1 -1
- package/template/rules/write_doc.md +4 -1
- package/template/skills/apm-dev/SKILL.md +7 -2
- package/template/skills/apm-diff-review/SKILL.md +6 -6
- package/template/skills/apm-write-plan/SKILL.md +19 -12
- package/template/skills/apm-write-plan/api-template.md +35 -0
- package/template/skills/apm-write-plan/plan-template.md +46 -18
package/dist/index.js
CHANGED
|
@@ -1482,7 +1482,7 @@ async function runUpdate() {
|
|
|
1482
1482
|
const latest = await fetchLatestPublishedVersion();
|
|
1483
1483
|
if (latest && current === latest) {
|
|
1484
1484
|
console.log(`[apm] \u5DF2\u662F\u6700\u65B0\u7248\u672C ${current}`);
|
|
1485
|
-
return;
|
|
1485
|
+
return { didUpdate: false };
|
|
1486
1486
|
}
|
|
1487
1487
|
if (!npmAvailable()) {
|
|
1488
1488
|
console.error(
|
|
@@ -1512,6 +1512,7 @@ async function runUpdate() {
|
|
|
1512
1512
|
`[apm] \u66F4\u65B0\u5B8C\u6210\u3002\u82E5\u7248\u672C\u53F7\u672A\u53D8\u5316\uFF0C\u8BF7\u5728\u65B0\u7EC8\u7AEF\u6267\u884C apm -V \u786E\u8BA4\uFF08\u5168\u5C40\u5B89\u88C5\u8DEF\u5F84\u53EF\u80FD\u672A\u5237\u65B0\uFF09`
|
|
1513
1513
|
);
|
|
1514
1514
|
}
|
|
1515
|
+
return { didUpdate: true };
|
|
1515
1516
|
}
|
|
1516
1517
|
|
|
1517
1518
|
// src/commands/update-skills.ts
|
|
@@ -1741,6 +1742,7 @@ async function runUpdateMessageStatus(options) {
|
|
|
1741
1742
|
}
|
|
1742
1743
|
|
|
1743
1744
|
// src/commands/connect.ts
|
|
1745
|
+
import { spawnSync as spawnSync2 } from "child_process";
|
|
1744
1746
|
import WebSocket from "ws";
|
|
1745
1747
|
|
|
1746
1748
|
// src/ws/protocol.ts
|
|
@@ -2584,7 +2586,24 @@ function startHeartbeat(ws, clientMachineId) {
|
|
|
2584
2586
|
const timer = setInterval(send, HEARTBEAT_MS);
|
|
2585
2587
|
return () => clearInterval(timer);
|
|
2586
2588
|
}
|
|
2589
|
+
function reexecConnect(options) {
|
|
2590
|
+
const args = [process.argv[1], "connect"];
|
|
2591
|
+
const server = options.server?.trim();
|
|
2592
|
+
if (server) {
|
|
2593
|
+
args.push("--server", server);
|
|
2594
|
+
}
|
|
2595
|
+
const result = spawnSync2(process.execPath, args, { stdio: "inherit" });
|
|
2596
|
+
if (result.error) {
|
|
2597
|
+
console.error("[apm] \u91CD\u542F connect \u5931\u8D25:", result.error.message);
|
|
2598
|
+
process.exit(1);
|
|
2599
|
+
}
|
|
2600
|
+
process.exit(result.status ?? 0);
|
|
2601
|
+
}
|
|
2587
2602
|
async function runConnect(options) {
|
|
2603
|
+
const { didUpdate } = await runUpdate();
|
|
2604
|
+
if (didUpdate) {
|
|
2605
|
+
reexecConnect(options);
|
|
2606
|
+
}
|
|
2588
2607
|
const cfg = await ensureLoggedConfig();
|
|
2589
2608
|
if (options.server?.trim()) {
|
|
2590
2609
|
cfg.baseUrl = options.server.trim().replace(/\/+$/, "");
|
|
@@ -3939,7 +3958,7 @@ function buildProgram() {
|
|
|
3939
3958
|
await runUpdateMessageStatus(opts);
|
|
3940
3959
|
});
|
|
3941
3960
|
program.command("connect").description(
|
|
3942
|
-
"\u8FDE\u63A5\u5E73\u53F0 WebSocket\uFF08/ws/agent\uFF09\uFF0C\u7EF4\u6301\u5FC3\u8DF3\u5E76\u5904\u7406\u4E0B\u884C message\uFF08TYPING \u2192 Cursor \u2192 SUCCESS/FAILED\uFF09"
|
|
3961
|
+
"\u8FDE\u63A5\u5E73\u53F0 WebSocket\uFF08/ws/agent\uFF09\uFF0C\u7EF4\u6301\u5FC3\u8DF3\u5E76\u5904\u7406\u4E0B\u884C message\uFF08TYPING \u2192 Cursor \u2192 SUCCESS/FAILED\uFF09\uFF1B\u542F\u52A8\u524D\u81EA\u52A8 apm update \u5230\u6700\u65B0\u7248"
|
|
3943
3962
|
).option("--server <url>", "API \u6839\u5730\u5740\uFF0C\u8986\u76D6 config \u4E2D\u7684 baseUrl").action(async (opts) => {
|
|
3944
3963
|
await runConnect(opts);
|
|
3945
3964
|
});
|
package/package.json
CHANGED
|
@@ -21,7 +21,10 @@
|
|
|
21
21
|
固定文件名: `SQL.md`
|
|
22
22
|
保存位置: `.apm/sessions/<会话 ID>/docs/SQL.md`
|
|
23
23
|
适用场景: 后端开发涉及 SQL 改动(DDL/DML、表结构、Mapper/XML 中 SQL 等)时必须产出或追加更新,详见 `.apm/skills/apm-dev/SKILL.md` 中「后端 SQL 变更文档」章节。
|
|
24
|
-
格式要求:
|
|
24
|
+
格式要求:
|
|
25
|
+
|
|
26
|
+
- 须标注**目标数据库**(库名/实例名、类型如 MySQL;同一变更涉及多库时分别标注)
|
|
27
|
+
- 待执行的 SQL 语句须放在 ` ```sql ` 代码块中,按执行顺序逐条列出
|
|
25
28
|
|
|
26
29
|
## 文档同步
|
|
27
30
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
### 步骤 1: 获取实现计划与协作内容
|
|
6
6
|
|
|
7
7
|
1. 用 **Read** 工具阅读本端计划:前端读 `.apm/sessions/<会话ID>/docs/FRONTEND-PLAN.md`,后端读 `docs/BACKEND-PLAN.md`;计划不存在则退出流程并回复说明(兼容旧流程:若存在 `PRD.md` + `FRONTEND.md` / `BACKEND.md` + `API.md`,按旧文档执行)。
|
|
8
|
-
2.
|
|
8
|
+
2. 前端涉及接口对接时,以 `docs/API.md` 为唯一契约来源,**不等后端部署完成**;`API.md` 不存在或字段没写清时 `@后端` 补充,禁止自行猜测或在计划中重复编写接口定义。
|
|
9
9
|
3. **假设门禁(开发前必须检查)**:查看计划「依据与假设」章节——
|
|
10
10
|
- 「假设」仍有未确认项:**Read** `.apm/sessions/<会话ID>/messages.xml`,查找项目经理是否已回复确认;
|
|
11
11
|
- 项目经理已回复:先按 `.apm/skills/apm-write-plan/SKILL.md` 步骤 5 把确认结果**回填进计划文档并同步**(确认的假设移入「依据」,否定的修订实现步骤与白名单),然后再开发;
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
若本次改动涉及 SQL(DDL/DML、表结构、索引、数据修复、Mapper/XML 中新增或修改 SQL 语句等),开发阶段必须 **Write** `.apm/sessions/<会话ID>/docs/SQL.md`,内容包括:
|
|
52
52
|
|
|
53
|
+
- **目标数据库**(库名/实例名、类型如 MySQL;同一变更涉及多库时分别标注)
|
|
53
54
|
- 变更摘要(改了什么表/数据、为什么)
|
|
54
55
|
- 完整 SQL 语句(按执行顺序排列;**每条须放在 ` ```sql ` 代码块中**,便于复制执行)
|
|
55
56
|
- 执行环境说明(测试/生产是否一致、是否需人工执行)
|
|
@@ -58,6 +59,10 @@
|
|
|
58
59
|
示例:
|
|
59
60
|
|
|
60
61
|
````markdown
|
|
62
|
+
## 目标数据库
|
|
63
|
+
|
|
64
|
+
`oxc_platform`(MySQL 8.x)
|
|
65
|
+
|
|
61
66
|
## 变更摘要
|
|
62
67
|
|
|
63
68
|
为 inspection_class 表新增 is_project_add 字段。
|
|
@@ -84,6 +89,6 @@ ALTER TABLE inspection_class ADD COLUMN is_project_add VARCHAR(1) DEFAULT '0';
|
|
|
84
89
|
2. **发布测试环境**:**Read** `.apm/skills/apm-deploy/SKILL.md` 并按其流程部署;**后端**涉及 SQL 变更时,须在回复中引用 `docs/SQL.md`,并写明待执行的 SQL 文件名或执行顺序。
|
|
85
90
|
3. **白名单对账**:在回复中逐文件列出本次改动与计划白名单的对应关系。
|
|
86
91
|
|
|
87
|
-
**注意:不做联调。** 前后端各自按 API
|
|
92
|
+
**注意:不做联调。** 前后端各自按 `API.md` 交付,接口对不上属于契约或实现问题,由 diff 评审与人工验收暴露后打回修复;禁止自行发起「联调」「接口实测」类的开放式动作。
|
|
88
93
|
|
|
89
94
|
完成后用 `append_message` 回复:改动概述 + 白名单对账 + 构建结果 + 测试环境地址,并 `@` 评审角色进行 diff 评审。
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
|
|
19
19
|
### 步骤 2:四项检查
|
|
20
20
|
|
|
21
|
-
| 检查项 | 判定
|
|
22
|
-
| -------------- |
|
|
23
|
-
| **白名单对账** | diff 中出现白名单之外的文件,且计划未更新说明 → **不通过**
|
|
24
|
-
| **需求相关性** | 存在与本需求无关的改动(顺手重构、改格式、动了无关逻辑)→ **不通过**
|
|
25
|
-
| **计划落实** | 计划「实现步骤」中的关键点在 diff 中找不到对应实现 → **不通过**
|
|
26
|
-
| **SQL 文档** | **仅后端**:diff 涉及 SQL 改动(DDL/DML、表结构、Mapper/XML 中 SQL 等),但 `docs/SQL.md`
|
|
21
|
+
| 检查项 | 判定 |
|
|
22
|
+
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| **白名单对账** | diff 中出现白名单之外的文件,且计划未更新说明 → **不通过** |
|
|
24
|
+
| **需求相关性** | 存在与本需求无关的改动(顺手重构、改格式、动了无关逻辑)→ **不通过** |
|
|
25
|
+
| **计划落实** | 计划「实现步骤」中的关键点在 diff 中找不到对应实现 → **不通过** |
|
|
26
|
+
| **SQL 文档** | **仅后端**:diff 涉及 SQL 改动(DDL/DML、表结构、Mapper/XML 中 SQL 等),但 `docs/SQL.md` 缺失、未标注目标数据库、或与改动不一致 → **不通过** |
|
|
27
27
|
|
|
28
28
|
注意事项:
|
|
29
29
|
|
|
@@ -6,10 +6,12 @@
|
|
|
6
6
|
|
|
7
7
|
本技能合并了原 `apm-write-prd`、`apm-review`、`apm-write-frontend-plan`、`apm-write-backend-api` 四个技能的职能:评审(判断是否参与、发现口径缺口)和方案(怎么改、改哪些文件)一步完成。
|
|
8
8
|
|
|
9
|
-
| 角色 | 产出文档
|
|
10
|
-
| ---- |
|
|
11
|
-
| 后端 | `BACKEND-PLAN.md
|
|
12
|
-
| 前端 | `FRONTEND-PLAN.md`
|
|
9
|
+
| 角色 | 产出文档 | 路径 |
|
|
10
|
+
| ---- | ------------------------------------------------------------- | ------------------------------------- |
|
|
11
|
+
| 后端 | `BACKEND-PLAN.md`(实现计划)+ `API.md`(联调契约,单独产出) | `docs/BACKEND-PLAN.md`、`docs/API.md` |
|
|
12
|
+
| 前端 | `FRONTEND-PLAN.md` | `docs/FRONTEND-PLAN.md` |
|
|
13
|
+
|
|
14
|
+
**两份后端文档禁止合并**:`BACKEND-PLAN.md` 不写完整参数表 / JSON 示例;`API.md` 不写 Service / SQL 等实现细节。
|
|
13
15
|
|
|
14
16
|
---
|
|
15
17
|
|
|
@@ -28,14 +30,17 @@
|
|
|
28
30
|
2. **再调研代码**:只看与需求直接相关的页面 / 接口 / 表。**调研预算:最多读 15 个代码文件**,禁止全库考古、禁止顺藤摸瓜阅读无关模块。
|
|
29
31
|
3. **口径不清不要自己拍板**:调研中发现需求没写清的业务口径(例如字段含义、互斥规则、历史数据兼容),一律记入计划的「依据与假设」章节,禁止编造业务规则。
|
|
30
32
|
|
|
33
|
+
**前端额外要求**:若本次涉及接口对接,**Read** `docs/API.md`;不存在则先 `@后端` 产出 `API.md`,**禁止在计划中自行编写或抄写接口定义**。
|
|
34
|
+
|
|
31
35
|
### 步骤 3:按模板写计划
|
|
32
36
|
|
|
33
|
-
**Read** `.apm/skills/apm-write-plan/plan-template.md`,按模板 **Write**
|
|
37
|
+
**Read** `.apm/skills/apm-write-plan/plan-template.md`,按模板 **Write** 对应的计划文档。硬性要求,缺一不可:
|
|
34
38
|
|
|
35
39
|
1. **依据与假设**:每条关键口径标注来源(需求原文第几条 / 现有代码行为 / 已有文档);标不出来源的就是「假设」,单独列出。
|
|
36
40
|
2. **改动文件白名单**:本次允许改动的文件完整列表。后续开发与 diff 评审都以此为准,**开发时改了白名单之外的文件会被打回**。
|
|
37
|
-
3.
|
|
41
|
+
3. **后端专属——同步产出 API.md**(涉及接口变更时):**Read** `.apm/skills/apm-write-plan/api-template.md`,按模板 **Write** `docs/API.md`。这是前端联调的唯一契约来源,前端直接阅读本文档,禁止各写一份。
|
|
38
42
|
4. **后端专属——SQL 变更声明**(仅当涉及表结构/数据变更时):在「实现步骤」中注明开发须产出 `docs/SQL.md`;计划本身不写大段 SQL,完整语句由后端开发阶段写入该文档。
|
|
43
|
+
5. **前端专属——接口对接要点**:只写「何时调、关键点」,引用 `API.md` 章节,**禁止复制参数表 / JSON 示例**。
|
|
39
44
|
|
|
40
45
|
### 步骤 4:回复
|
|
41
46
|
|
|
@@ -43,7 +48,8 @@
|
|
|
43
48
|
|
|
44
49
|
- **「假设」章节非空**:把假设逐条列进回复内容,`@项目经理` 请其确认;明确说「以上假设确认前不开始开发」。
|
|
45
50
|
- **无假设**:回复计划已就绪,可进入测试要点编写。
|
|
46
|
-
-
|
|
51
|
+
- **后端**:涉及接口变更时,回复中 `@前端` 阅读 `API.md` 并编写 `FRONTEND-PLAN.md`。
|
|
52
|
+
- **前端**:`API.md` 尚未就绪时,回复 `@后端` 先产出 `API.md`,**禁止自行编写接口契约**。
|
|
47
53
|
|
|
48
54
|
### 步骤 5:假设回填(项目经理确认后必须执行)
|
|
49
55
|
|
|
@@ -54,10 +60,11 @@
|
|
|
54
60
|
- 被确认的假设 → **移入「依据」表格**,来源写「项目经理确认(第 N 轮)」;
|
|
55
61
|
- 被否定或修正的假设 → 按项目经理给出的口径**修订「实现步骤」与「改动文件白名单」**;
|
|
56
62
|
- 项目经理没有回应的假设 → 保留在「假设」中,再次 `@项目经理` 追问。
|
|
57
|
-
3.
|
|
58
|
-
4.
|
|
63
|
+
3. **后端**:假设修订涉及接口口径时,同步更新 `docs/API.md`。
|
|
64
|
+
4. 重新执行 `apm sync-document` 同步计划与 API 文档。
|
|
65
|
+
5. 回复消息:逐条说明每个假设的处理结果(确认采纳 / 按口径修订了什么),全部解决则声明「假设已清零,可进入测试要点编写」。
|
|
59
66
|
|
|
60
|
-
|
|
67
|
+
**禁止**跳过回填直接开发:澄清结论必须落进计划文档(接口口径落进 `API.md`),后续开发与 diff 评审都只认文档,不认聊天记录。
|
|
61
68
|
|
|
62
69
|
---
|
|
63
70
|
|
|
@@ -65,8 +72,8 @@
|
|
|
65
72
|
|
|
66
73
|
- 篇幅 **40 ~ 100 行**,宁可少写;不要伪代码、不要大段 SQL(完整语句写入 `docs/SQL.md`,由后端开发阶段产出)。
|
|
67
74
|
- 用产品语言描述行为,文件路径只出现在「改动文件白名单」。
|
|
68
|
-
-
|
|
75
|
+
- 前后端可同轮并行编写计划;前端接口部分依赖 `API.md`,后端须先或同步产出。
|
|
69
76
|
|
|
70
77
|
## 何时使用
|
|
71
78
|
|
|
72
|
-
协作流程阶段 1(实现计划);或用户要求写 `BACKEND-PLAN.md` / `FRONTEND-PLAN.md`。
|
|
79
|
+
协作流程阶段 1(实现计划);或用户要求写 `BACKEND-PLAN.md` / `FRONTEND-PLAN.md` / `API.md`。
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# API.md 模板
|
|
2
|
+
|
|
3
|
+
给前端联调用。实现步骤见 `BACKEND-PLAN.md`;本文只写契约,篇幅尽量克制。
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# <功能名称> — 接口
|
|
7
|
+
|
|
8
|
+
## 背景
|
|
9
|
+
|
|
10
|
+
<1 ~ 2 句:本次新增/变更/复用哪些接口>
|
|
11
|
+
|
|
12
|
+
## <接口名称>(新增)
|
|
13
|
+
|
|
14
|
+
- **GET** `/实际/path`
|
|
15
|
+
- **用途**:…
|
|
16
|
+
- **参数**:`pageNo`、`pageSize`(可选,默认 …);`xxx`(何时传、何时不传)
|
|
17
|
+
- **成功**:`result` 结构简述 + 简短 JSON 示例
|
|
18
|
+
- **失败**:格式非法 → `message` 示例;无数据 → 空列表算成功
|
|
19
|
+
|
|
20
|
+
## <接口名称>(现网,不变)
|
|
21
|
+
|
|
22
|
+
- **GET** `/实际/path/{id}`
|
|
23
|
+
- **用途**:…
|
|
24
|
+
- **前端关注字段**:`fieldA` → 模板 xxx
|
|
25
|
+
|
|
26
|
+
## 联调说明
|
|
27
|
+
|
|
28
|
+
1. 首屏:只传 …
|
|
29
|
+
2. 筛选:…
|
|
30
|
+
3. 选中后:必须先调详情,禁止 …
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 不要写
|
|
34
|
+
|
|
35
|
+
SQL、Java 类路径、Service 实现、后端验收清单。
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# 计划文档模板
|
|
2
2
|
|
|
3
|
-
> 后端写 `docs/BACKEND-PLAN.md
|
|
4
|
-
>
|
|
3
|
+
> 后端写 `docs/BACKEND-PLAN.md` + `docs/API.md`(两份文档禁止合并)。
|
|
4
|
+
> 前端写 `docs/FRONTEND-PLAN.md`;接口细节只读 `docs/API.md`,禁止在计划中重复抄写。
|
|
5
|
+
|
|
6
|
+
## 后端计划(BACKEND-PLAN.md)
|
|
5
7
|
|
|
6
8
|
```markdown
|
|
7
|
-
# <需求名> ·
|
|
9
|
+
# <需求名> · 后端实现计划
|
|
8
10
|
|
|
9
11
|
## 1. 需求理解
|
|
10
12
|
|
|
@@ -33,35 +35,61 @@
|
|
|
33
35
|
2. 第二步做什么
|
|
34
36
|
3. ...(通常 3 ~ 6 步,不写代码细节)
|
|
35
37
|
|
|
36
|
-
>
|
|
38
|
+
> 若涉及表结构或数据变更,在步骤中注明「开发须产出 `docs/SQL.md`」,SQL 语句不写在本计划内。
|
|
39
|
+
> 若涉及接口变更,在步骤中注明「须同步产出 `docs/API.md`」,接口参数表不写在本计划内。
|
|
37
40
|
|
|
38
41
|
## 4. 改动文件白名单
|
|
39
42
|
|
|
40
43
|
> 开发只允许改这些文件;diff 评审会逐一对账,越界会被打回。
|
|
41
44
|
> 开发中确需新增,先更新本清单并在群里说明原因。
|
|
42
45
|
|
|
43
|
-
- `src
|
|
44
|
-
- `src
|
|
46
|
+
- `src/.../InspectionProjectController.java` — 新增保存入参校验
|
|
47
|
+
- `src/.../InspectionProjectService.java` — 互斥逻辑
|
|
45
48
|
- ...
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 前端计划(FRONTEND-PLAN.md)
|
|
52
|
+
|
|
53
|
+
> 写计划前必须先 **Read** `docs/API.md`;不存在则退出并 `@后端`,禁止自行编造接口或写「期望接口」。
|
|
54
|
+
|
|
55
|
+
```markdown
|
|
56
|
+
# <需求名> · 前端实现计划
|
|
46
57
|
|
|
47
|
-
##
|
|
58
|
+
## 1. 需求理解
|
|
48
59
|
|
|
49
|
-
|
|
60
|
+
用 3 ~ 5 行复述本端要做什么(产品语言),不复制需求原文。
|
|
50
61
|
|
|
51
|
-
|
|
52
|
-
- 新增入参:
|
|
62
|
+
## 2. 依据与假设
|
|
53
63
|
|
|
54
|
-
|
|
55
|
-
| ------------ | ------ | ---- | -------------------------------- |
|
|
56
|
-
| isProjectAdd | string | 否 | "1"=加分项;与 isProjectDed 互斥 |
|
|
64
|
+
### 依据(口径 + 来源)
|
|
57
65
|
|
|
58
|
-
|
|
66
|
+
| # | 口径 | 来源 |
|
|
67
|
+
| --- | ------------------------------ | --------------- |
|
|
68
|
+
| 1 | 「是否加分」与「是否扣分」互斥 | 需求原文第 1 条 |
|
|
69
|
+
| 2 | 加分项不汇总进分类分值 | 需求原文第 2 条 |
|
|
59
70
|
|
|
60
|
-
|
|
71
|
+
### 假设(待项目经理确认,确认前不开发)
|
|
61
72
|
|
|
62
|
-
-
|
|
73
|
+
- [ ] A1:xxx(为什么需要确认)
|
|
74
|
+
|
|
75
|
+
> 无假设时写「无,口径均有依据」。
|
|
76
|
+
|
|
77
|
+
## 3. 实现步骤
|
|
78
|
+
|
|
79
|
+
1. 第一步做什么(对应哪条口径)
|
|
80
|
+
2. 第二步做什么
|
|
81
|
+
3. 对接 `API.md` 中的某某接口(只写调用时机,不复制参数表)
|
|
82
|
+
4. ...
|
|
83
|
+
|
|
84
|
+
## 4. 改动文件白名单
|
|
85
|
+
|
|
86
|
+
- `src/views/inspection/InspectionProjectForm.vue` — 新增「是否加分」单选与互斥逻辑
|
|
87
|
+
- `src/api/inspection.ts` — 新增字段透传
|
|
88
|
+
- ...
|
|
63
89
|
|
|
64
|
-
##
|
|
90
|
+
## 5. 接口对接要点(引用 API.md,禁止复制)
|
|
65
91
|
|
|
66
|
-
-
|
|
92
|
+
- 列表:<何时请求、首屏传什么>(见 `API.md` § xxx)
|
|
93
|
+
- 详情:<选中后怎么走>(见 `API.md` § xxx)
|
|
94
|
+
- 注意:<禁止用列表数据代替详情等>
|
|
67
95
|
```
|