cgraphx 2.0.0 → 2.0.2
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/README.en.md +1 -1
- package/README.md +1 -1
- package/dist/.claude-template/FLOW-MAP.md +7 -5
- package/dist/.claude-template/commands/end.md +1 -1
- package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +3 -2
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +6 -4
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +7 -4
- package/dist/.claude-template/skills/iboc-check/SKILL.md +116 -0
- package/dist/.claude-template/skills/iboc-check/filler-prompt.md +75 -0
- package/dist/.claude-template/skills/implementation/SKILL.md +7 -0
- package/dist/.claude-template/skills/init-project-guides/SKILL.md +1 -1
- package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
- package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
- package/dist/.claude-template/skills/write-api/assets/template-request.bru +3 -3
- package/dist/.claude-template/skills/write-api/references/bru-format.md +6 -6
- package/dist/.claude-template/skills/write-delivery-guide/SKILL.md +97 -0
- package/dist/.claude-template/skills/write-delivery-guide/template-change-type.md +120 -0
- package/dist/.claude-template/skills/write-delivery-guide/template-multi-role-flow.md +148 -0
- package/dist/.claude-template/skills/write-unit-test-code/SKILL.md +23 -6
- package/dist/cli/index.js +45 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/installer/claude-assets.d.ts +1 -1
- package/dist/cli/installer/claude-assets.js +1 -1
- package/dist/cli/installer/index.d.ts +9 -11
- package/dist/cli/installer/index.d.ts.map +1 -1
- package/dist/cli/installer/index.js +14 -36
- package/dist/cli/installer/index.js.map +1 -1
- package/dist/cli/installer/targets/claude.d.ts +4 -20
- package/dist/cli/installer/targets/claude.d.ts.map +1 -1
- package/dist/cli/installer/targets/claude.js +42 -125
- package/dist/cli/installer/targets/claude.js.map +1 -1
- package/dist/cli/installer/targets/types.d.ts +9 -10
- package/dist/cli/installer/targets/types.d.ts.map +1 -1
- package/dist/cli/installer/targets/types.js +3 -4
- package/dist/cli/installer/targets/types.js.map +1 -1
- package/dist/cli/upgrade/index.d.ts +73 -5
- package/dist/cli/upgrade/index.d.ts.map +1 -1
- package/dist/cli/upgrade/index.js +178 -40
- package/dist/cli/upgrade/index.js.map +1 -1
- package/dist/core/features/scanner.d.ts +2 -0
- package/dist/core/features/scanner.d.ts.map +1 -1
- package/dist/core/features/scanner.js +27 -6
- package/dist/core/features/scanner.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# 场景模板:改动型
|
|
2
|
+
|
|
3
|
+
本文件是 `write-delivery-guide` 的「改动型」形态场景模板——统一六项结构:判断特征 / 故事线主轴 / 讲解维度要求 / 图表类型 / 完整参考案例 / 常见讲错。生成交付讲解时 Read 本文件并照此生成。
|
|
4
|
+
|
|
5
|
+
> ⚠️ **本模板参考案例为拟真案例,待真实使用替换**(第一次真实改动交付后,用实际生成的讲解替换参考案例,并借此校准本模板六项)。
|
|
6
|
+
|
|
7
|
+
## 判断特征
|
|
8
|
+
|
|
9
|
+
- diff 以修改/删除既有代码为主(不是以新增文件为主);
|
|
10
|
+
- 触碰既有流程:状态机、既有接口行为、既有任务/事件的逻辑;
|
|
11
|
+
- spec 中表述为「修改/调整既有行为」,常伴随兼容性说明与需保留行为清单。
|
|
12
|
+
|
|
13
|
+
## 故事线主轴
|
|
14
|
+
|
|
15
|
+
**原流程中的部位**:先讲改动前的原故事线(读者已有的心智地图),再标出改动落在第几步。读者关心的第一问题是「改在我熟悉的流程的哪里」,不是「改了几个文件」。
|
|
16
|
+
|
|
17
|
+
## 讲解维度要求
|
|
18
|
+
|
|
19
|
+
1. **原流程全景**:改动前的完整故事线,高亮改动部位;
|
|
20
|
+
2. **前后对比**:之前什么样 → 现在什么样(两边各一句话逻辑 + 关键代码位置);
|
|
21
|
+
3. **为什么改**:来自 spec / 任务上下文,一句话;
|
|
22
|
+
4. **波及范围**:谁会受影响——逐个判断调用方、相关场景、定时任务、数据,列成表;
|
|
23
|
+
5. **什么没变**:显式列出需保留的行为(取自 spec「需保留行为」),让接收者确认既有行为安全;
|
|
24
|
+
6. 改动的组件按四问展开(见 SKILL.md 通用规则)。
|
|
25
|
+
|
|
26
|
+
## 图表类型
|
|
27
|
+
|
|
28
|
+
全景与改动定位用 flowchart / stateDiagram,改动部位用虚线或标注高亮;前后对比可用表格辅助。
|
|
29
|
+
|
|
30
|
+
## 完整参考案例
|
|
31
|
+
|
|
32
|
+
> 拟真案例(待真实使用替换):
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
# 交付讲解:订单状态机加入退款分支
|
|
37
|
+
|
|
38
|
+
## 1. 30 秒看懂
|
|
39
|
+
|
|
40
|
+
给订单流程加了一条退款分支:订单支付完成后可以进入 REFUNDING,退款处理完毕回到 PAID 或终态 REFUNDED。只改了状态机的流转部位,下单与支付流程不变。
|
|
41
|
+
|
|
42
|
+
## 2. 全景(高亮改动部位)
|
|
43
|
+
|
|
44
|
+
```mermaid
|
|
45
|
+
flowchart LR
|
|
46
|
+
A[下单 CREATED] --> B[支付 PAID]
|
|
47
|
+
B --> C[发货 SHIPPED]
|
|
48
|
+
B --> D[关单 CLOSED]
|
|
49
|
+
B -. 本次新增 .-> E[退款中 REFUNDING]
|
|
50
|
+
E -. 取消 .-> B
|
|
51
|
+
E -. 成功 .-> F[已退款 REFUNDED]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 3. 场景故事线:原流程与改动部位
|
|
55
|
+
|
|
56
|
+
**原流程**(改动前):下单 → 支付 → {发货 | 关单}——PAID 之后只能去 SHIPPED / CLOSED。
|
|
57
|
+
|
|
58
|
+
**改动部位**:在「支付完成」这个环节之后,插入一条退款分支(上图虚线)。其余环节不变。
|
|
59
|
+
|
|
60
|
+
**为什么改**:业务要求支持支付后退款(spec:订单在发货前允许申请退款)。
|
|
61
|
+
|
|
62
|
+
## 4. 组件挂接(改动涉及的组件)
|
|
63
|
+
|
|
64
|
+
### `OrderStateMachine` — 状态流转注册(核心改动)
|
|
65
|
+
|
|
66
|
+
- **何时用**:任何推动订单状态的入口(支付回调、发货、关单、新增的退款入口)都会经过它
|
|
67
|
+
- **做什么**(改动后):PAID 的合法后继从 {SHIPPED, CLOSED} 扩为 {SHIPPED, CLOSED, REFUNDING};新增 REFUNDING 的两条出边(退款成功 → REFUNDED,退款取消 → 回 PAID)
|
|
68
|
+
- **用了之后使什么成为可能**:退款入口可以合法推动订单进入退款中
|
|
69
|
+
- **挂点**:各状态变更入口 → 本组件 → 下游按状态分发的逻辑
|
|
70
|
+
- 代码:`OrderStateMachine.java:45-67`(改动前仅 45 行的两条注册)
|
|
71
|
+
|
|
72
|
+
### `OrderCloseJob` — 关单定时任务(适配改动)
|
|
73
|
+
|
|
74
|
+
- **何时用**:定时扫描超时未发货订单并关单(既有任务,本次只加过滤)
|
|
75
|
+
- **做什么**(改动后):扫描 PAID 超时订单时**排除 REFUNDING**——退款中的订单不应被关单
|
|
76
|
+
- **用了之后使什么成为可能**:新分支不会误伤既有关单逻辑
|
|
77
|
+
- **挂点**:定时触发 → 本任务 → 订单置 CLOSED
|
|
78
|
+
- 代码:`OrderCloseJob.java:30`
|
|
79
|
+
|
|
80
|
+
## 5. 改动定位:前后对比与波及
|
|
81
|
+
|
|
82
|
+
| | 之前 | 现在 |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| PAID 可流转到 | SHIPPED / CLOSED | SHIPPED / CLOSED / **REFUNDING** |
|
|
85
|
+
| REFUNDING 流转到 | —(无此状态) | 退款成功 → REFUNDED;退款取消 → 回 PAID |
|
|
86
|
+
|
|
87
|
+
**波及范围**(逐个判断):
|
|
88
|
+
|
|
89
|
+
| 受影响方 | 影响 |
|
|
90
|
+
|---|---|
|
|
91
|
+
| `OrderCloseJob` 关单定时任务 | 原扫描「所有 PAID 状态订单」——现在必须排除 REFUNDING,否则会把退款中的订单关掉(已处理) |
|
|
92
|
+
| 订单列表页状态筛选 | 需要新增 REFUNDING 枚举展示(本次只交付后端枚举与接口返回,前端后续需求) |
|
|
93
|
+
| 发货流程 | 不受影响——SHIPPED 前置仍是 PAID,退款分支是并行岔路不是串行 |
|
|
94
|
+
|
|
95
|
+
**什么没变**:下单、支付回调、发货流程、关单规则(除排除 REFUNDING 外)。
|
|
96
|
+
|
|
97
|
+
## 6. 已验证与已知边界
|
|
98
|
+
|
|
99
|
+
- 已验证:PAID → REFUNDING → REFUNDED;退款取消回 PAID;关单任务不再误关 REFUNDING 订单。
|
|
100
|
+
- 已知边界:部分退款本次不支持(业务确认 v1 砍掉)。
|
|
101
|
+
|
|
102
|
+
## 7. 导读入口
|
|
103
|
+
|
|
104
|
+
以上任何一节都可以追问,例如:
|
|
105
|
+
|
|
106
|
+
- 「为什么退款取消回到 PAID,而不是单独加一个状态?」
|
|
107
|
+
- 「除了关单任务,还有哪些地方扫描 PAID 状态?」
|
|
108
|
+
- 「REFUNDING 中的订单,用户再次下单/再次支付会被拦截吗?」
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
(参考案例完)
|
|
113
|
+
|
|
114
|
+
## 常见讲错
|
|
115
|
+
|
|
116
|
+
- ❌ 只列改动的文件/函数,不把它放回原流程——接收者找不到改动部位;
|
|
117
|
+
- ❌ 只讲新逻辑,不讲原来是什么样——没有前后对比就看不出「改了什么」;
|
|
118
|
+
- ❌ 漏波及范围——不讲哪些调用方/定时任务/场景受影响;
|
|
119
|
+
- ❌ 全景图不高亮改动范围——接收者误以为整条流程都变了;
|
|
120
|
+
- ❌ 不讲「什么没变」——接收者无法确认既有行为是否安全。
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# 场景模板:多角色流程
|
|
2
|
+
|
|
3
|
+
本文件是 `write-delivery-guide` 的「多角色流程」形态场景模板——统一六项结构:判断特征 / 故事线主轴 / 讲解维度要求 / 图表类型 / 完整参考案例 / 常见讲错。生成交付讲解时 Read 本文件并照此生成。
|
|
4
|
+
|
|
5
|
+
## 判断特征
|
|
6
|
+
|
|
7
|
+
- 交付包含服务不同角色的多个接口/入口(如申请人 / 审批人 / 管理员);
|
|
8
|
+
- 流程有明确环节,环节之间有状态流转(草稿 → 已提交 → 通过/拒绝 之类);
|
|
9
|
+
- spec 中有角色、环节、状态流转章节。
|
|
10
|
+
|
|
11
|
+
## 故事线主轴
|
|
12
|
+
|
|
13
|
+
**角色 × 环节**:谁在第几步干什么。读者的心智索引是「那条用户提交、管理员审批的流程」,不是「那 6 个接口」——先给故事,接口挂在故事环节上。
|
|
14
|
+
|
|
15
|
+
## 讲解维度要求
|
|
16
|
+
|
|
17
|
+
1. **故事线表**:环节 / 谁 / 干什么 / 入口,一步一行;
|
|
18
|
+
2. **一次完整走查**:至少一个带真实角色与数据的请求走查(故事式);
|
|
19
|
+
3. **状态流转讲透**:哪个接口把状态从哪推到哪、哪个状态驱动哪个接口可见(如待办列表由 PENDING 驱动)——这是多角色流程最容易漏的暗线;
|
|
20
|
+
4. **角色边界**:哪些接口属于哪个角色、谁能看见什么;
|
|
21
|
+
5. 每个接口按四问展开(见 SKILL.md 通用规则)。
|
|
22
|
+
|
|
23
|
+
## 图表类型
|
|
24
|
+
|
|
25
|
+
全景节用 flowchart(按角色分组);故事线可用 sequenceDiagram;状态流转用 stateDiagram。
|
|
26
|
+
|
|
27
|
+
## 完整参考案例
|
|
28
|
+
|
|
29
|
+
以下是「审批流」交付的讲解全文(真实交付场景)。生成时模仿它的结构与讲解深度:
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
# 交付讲解:审批流
|
|
34
|
+
|
|
35
|
+
## 1. 30 秒看懂
|
|
36
|
+
|
|
37
|
+
给系统加了一条完整的「申请人发起 → 管理员审批」链路:申请人创建并提交审批,管理员在待办里看到并处理,通过后触发下游流程,拒绝后申请人可修改重提。本次交付全部为新增代码,未改动既有逻辑。
|
|
38
|
+
|
|
39
|
+
## 2. 全景
|
|
40
|
+
|
|
41
|
+
```mermaid
|
|
42
|
+
flowchart LR
|
|
43
|
+
subgraph A1[申请人]
|
|
44
|
+
A11[创建草稿] --> A12[提交审批]
|
|
45
|
+
end
|
|
46
|
+
subgraph M1[管理员]
|
|
47
|
+
B11[待办列表] --> B12[查看详情] --> B13{通过 / 拒绝}
|
|
48
|
+
end
|
|
49
|
+
A12 -->|状态 PENDING| B11
|
|
50
|
+
B13 -->|通过 APPROVED| C[下游通知/回调]
|
|
51
|
+
B13 -->|拒绝 REJECTED| A11
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
本次交付覆盖上图全部环节(均为新增)。
|
|
55
|
+
|
|
56
|
+
## 3. 场景故事线:审批流(角色:申请人 / 管理员)
|
|
57
|
+
|
|
58
|
+
| 环节 | 谁 | 干什么 | 入口 |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
| 1 | 申请人 | 创建审批草稿 | `POST /approvals/draft` |
|
|
61
|
+
| 2 | 申请人 | 提交,进入审批流程 | `POST /approvals/{id}/submit` |
|
|
62
|
+
| 3 | 管理员 | 待办列表看到这条审批 | `GET /approvals/todo` |
|
|
63
|
+
| 4 | 管理员 | 查看审批详情 | `GET /approvals/{id}` |
|
|
64
|
+
| 5 | 管理员 | 通过或拒绝 | `POST /approvals/{id}/approve` / `reject` |
|
|
65
|
+
|
|
66
|
+
**一次审批走查**:张三要请假——先创建草稿(状态 DRAFT,可反复修改),确认后提交 → 状态变为 PENDING,系统给管理员生成一条待办 → 管理员李四打开待办列表看到「张三 · 请假」→ 点进详情查看 → 点通过:状态 APPROVED,张三收到通知,下游考勤流程触发;若拒绝:状态 REJECTED,张三可修改草稿后重新提交(回到环节 1)。
|
|
67
|
+
|
|
68
|
+
## 4. 组件挂接
|
|
69
|
+
|
|
70
|
+
### `POST /approvals/draft` — 创建草稿(环节 1)
|
|
71
|
+
|
|
72
|
+
- **何时用**:申请人开始填写审批时;无前置
|
|
73
|
+
- **做什么**:创建一条审批记录,状态初始化为 DRAFT
|
|
74
|
+
- **用了之后使什么成为可能**:草稿可反复修改、可提交(解锁环节 2)
|
|
75
|
+
- **挂点**:(入口)→ 本接口 → submit
|
|
76
|
+
- 副作用:`approval` 表 +1 行
|
|
77
|
+
- 代码:`ApprovalController.java:32` → `ApprovalService.createDraft()`
|
|
78
|
+
|
|
79
|
+
### `POST /approvals/{id}/submit` — 提交(环节 2)
|
|
80
|
+
|
|
81
|
+
- **何时用**:申请人填完草稿、要正式进入流程;前置:草稿存在且状态 = DRAFT
|
|
82
|
+
- **做什么**:校验必填 → 状态 DRAFT → PENDING → 给管理员生成待办
|
|
83
|
+
- **用了之后使什么成为可能**:这条审批出现在管理员待办列表(解锁环节 3)
|
|
84
|
+
- **挂点**:draft → 本接口 → 管理员待办
|
|
85
|
+
- 副作用:`approval.status` 变更、`todo` 表 +1 行、发通知
|
|
86
|
+
- 代码:`ApprovalService.java:58`
|
|
87
|
+
|
|
88
|
+
### `GET /approvals/todo` — 待办列表(环节 3)
|
|
89
|
+
|
|
90
|
+
- **何时用**:管理员打开待办页;须有审批权限
|
|
91
|
+
- **做什么**:查出本管理员权限范围内状态为 PENDING 的审批,返回列表
|
|
92
|
+
- **用了之后使什么成为可能**:管理员选择一条去处理(解锁环节 4)
|
|
93
|
+
- **挂点**:submit → 本接口 → 详情
|
|
94
|
+
- 关键点:列表由状态 = PENDING 驱动——是 submit 让数据出现在这里
|
|
95
|
+
- 代码:`ApprovalQueryController.java:21`
|
|
96
|
+
|
|
97
|
+
### `GET /approvals/{id}` — 查看详情(环节 4)
|
|
98
|
+
|
|
99
|
+
- **何时用**:管理员处理前看审批内容;前置:对该条有可见权限
|
|
100
|
+
- **做什么**:返回审批完整内容 + 附件信息 + 当前状态
|
|
101
|
+
- **用了之后使什么成为可能**:管理员能做出通过/拒绝决策(解锁环节 5)
|
|
102
|
+
- **挂点**:待办列表 → 本接口 → approve/reject
|
|
103
|
+
- 代码:`ApprovalQueryController.java:44`
|
|
104
|
+
|
|
105
|
+
### `POST /approvals/{id}/approve` — 通过(环节 5a)
|
|
106
|
+
|
|
107
|
+
- **何时用**:管理员决定通过;前置:状态 = PENDING 且有审批权限
|
|
108
|
+
- **做什么**:状态 PENDING → APPROVED → 移除待办 → 触发下游(通知 + 业务回调)
|
|
109
|
+
- **用了之后使什么成为可能**:审批生效,下游业务被触发
|
|
110
|
+
- **挂点**:详情 → 本接口 → 下游流程
|
|
111
|
+
- 副作用:`approval.status` 变更、`todo` 删行、发事件
|
|
112
|
+
- 代码:`ApprovalService.java:87`
|
|
113
|
+
|
|
114
|
+
### `POST /approvals/{id}/reject` — 拒绝(环节 5b)
|
|
115
|
+
|
|
116
|
+
- **何时用**:管理员决定拒绝;前置同通过
|
|
117
|
+
- **做什么**:状态 PENDING → REJECTED → 移除待办 → 记录拒绝原因 → 通知申请人
|
|
118
|
+
- **用了之后使什么成为可能**:申请人可修改草稿后重新提交(回到环节 1)
|
|
119
|
+
- **挂点**:详情 → 本接口 → 申请人修改重提
|
|
120
|
+
- 代码:`ApprovalService.java:112`
|
|
121
|
+
|
|
122
|
+
## 5. 改动定位
|
|
123
|
+
|
|
124
|
+
(本次交付全部为新增,未改动既有流程,此节省略。有改动已有流程时按改动型模板生成。)
|
|
125
|
+
|
|
126
|
+
## 6. 已验证与已知边界
|
|
127
|
+
|
|
128
|
+
- 已验证:提交 → 通过 → 下游触发全链路;拒绝 → 修改重提;待办列表由 PENDING 状态驱动。
|
|
129
|
+
- 已知边界:审批撤回本次不支持(业务已确认砍掉);会签/加签在下一期。
|
|
130
|
+
|
|
131
|
+
## 7. 导读入口
|
|
132
|
+
|
|
133
|
+
以上任何一节都可以追问,例如:
|
|
134
|
+
|
|
135
|
+
- 「为什么待办列表依赖 PENDING 状态,而不是单独维护一张待办表?」
|
|
136
|
+
- 「连续点两次通过会怎样(幂等)?」
|
|
137
|
+
- 「通过时触发的下游回调失败了怎么办?」
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
(参考案例完)
|
|
142
|
+
|
|
143
|
+
## 常见讲错
|
|
144
|
+
|
|
145
|
+
- ❌ 按接口清单逐个列协议,没有故事线——接收者无法重建场景;
|
|
146
|
+
- ❌ 只讲参数返回值,不讲何时用、谁触发;
|
|
147
|
+
- ❌ 漏掉状态流转暗线——没讲哪个状态驱动待办/可见性接口;
|
|
148
|
+
- ❌ 不标角色边界——分不清哪些接口是申请人的、哪些是管理员的。
|
|
@@ -40,6 +40,8 @@ description: 基于 write-unit-test-spec 产出的测试规格文档 + 已有实
|
|
|
40
40
|
|
|
41
41
|
## 流程
|
|
42
42
|
|
|
43
|
+
**前置(每次执行,先于步骤 1):读测试规范** `docs/guides/testing-standards.md` —— 约束步骤 4 测试文件产出:测试目录与命名(规范「目录与命名(偏离项)」优先于测试规格的骨架映射)、框架与文件后缀、Mock 政策与 fixture 组织、单测/集成边界。**缺失 → 中断,提示用户先跑 `/init-project-guides` 补齐**,用户明确表示不需要规范才可继续——不对齐项目约定的测试代码,合并时全是返工。
|
|
44
|
+
|
|
43
45
|
### 1. 前置检查
|
|
44
46
|
|
|
45
47
|
- 确认 `docs/features/<feature-id>/<前缀>-单元测试-spec.md` 存在。**不存在 → 报错退出**:"找不到测试规格,请先跑 /write-unit-test-spec"。不现场派生场景。
|
|
@@ -66,21 +68,36 @@ description: 基于 write-unit-test-spec 产出的测试规格文档 + 已有实
|
|
|
66
68
|
|
|
67
69
|
### 4. 产出测试文件(断言填实)
|
|
68
70
|
|
|
69
|
-
写到 `<项目测试目录>/<feature-id>.test.ts`(
|
|
71
|
+
写到 `<项目测试目录>/<feature-id>.test.ts`(命名/后缀:测试规范「目录与命名(偏离项)」优先,其次测试规格的"骨架映射"节)。形态:
|
|
70
72
|
|
|
71
73
|
- 实现已就绪的场景 → `describe` + `it`(含真实断言,基于读到的签名写,能真跑)
|
|
72
74
|
- 实现缺失的场景 → `it.skip` + `// TODO: 实现提供后填实` 占位
|
|
73
75
|
- import 被目标(已存在的模块直接 import;不存在的标 TODO 注释,不强行 import)
|
|
74
|
-
- 框架(vitest/jest/...)
|
|
76
|
+
- 框架(vitest/jest/...)和文件后缀按测试规范,规范未写按项目既有约定
|
|
75
77
|
- 已有同模块测试文件 → 文件名加后缀避免覆盖(如 `<feature-id>.补充.test.ts`),在报告里提示"已有 X,是否合并由用户判断"
|
|
76
78
|
|
|
77
|
-
**AI 自己发挥的空间**:fixture / mock 怎么组织、describe
|
|
79
|
+
**AI 自己发挥的空间**:fixture / mock 怎么组织、describe 嵌套多深、断言写多细——测试规范有约定按约定(Mock 政策 / fixture 组织),未约定处 agent 按既有测试风格判断,不强加模板。
|
|
78
80
|
|
|
79
81
|
### 5. 跑测试验证 + 产出测试报告
|
|
80
82
|
|
|
81
83
|
跑一次项目的测试命令(如 `npm test`),确认新写的测试能跑(通过或失败都行,失败说明实现有 bug 或测试断言写错)。
|
|
82
84
|
|
|
83
|
-
**产出单元测试报告**,写到 `docs/features/<feature-id>/<前缀>-单元测试报告.md
|
|
85
|
+
**产出单元测试报告**,写到 `docs/features/<feature-id>/<前缀>-单元测试报告.md`。头部直接写入(测试人取 `git config user.name`,不问用户),正文结构轻量,至少包含:
|
|
86
|
+
|
|
87
|
+
**头部样例**:
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
# 单元测试报告: <需求名称>
|
|
91
|
+
|
|
92
|
+
> feature-id: <feature-id>
|
|
93
|
+
> 测试人: <git config user.name>
|
|
94
|
+
> 测试时间: <YYYY-MM-DD>
|
|
95
|
+
> 关联测试规格: <前缀>-单元测试-spec.md
|
|
96
|
+
> 关联被测实现: <实现代码路径,多个逐行列出>
|
|
97
|
+
> 关联测试代码: <测试文件路径;补充测试文件一并列出>
|
|
98
|
+
> 测试框架: <如 JUnit 4.13.2 + Mockito / vitest 2.x>
|
|
99
|
+
> 运行时: <如 JDK 17.0.19(homebrew openjdk@17)/ Node v22.x>
|
|
100
|
+
```
|
|
84
101
|
|
|
85
102
|
- 测试概况:总数 / 通过 / 失败 / 跳过(it.skip 占位)/ 时长
|
|
86
103
|
- 逐场景详细结果:每个 `it` 的通过/失败/跳过 + 入参 + 执行过程 + 断言判定 + 失败原因(如有)
|
|
@@ -193,7 +210,7 @@ it.skip('权限不足应返回 403', () => {
|
|
|
193
210
|
| 产物 | 路径 | 形态 |
|
|
194
211
|
|---|---|---|
|
|
195
212
|
| 测试文件 | `<项目测试目录>/<feature-id>.test.ts` | describe + `it`(断言填实) / `it.skip`(实现待补) |
|
|
196
|
-
| 单元测试报告 | `docs/features/<feature-id>/<前缀>-单元测试报告.md` | 测试概况 + 逐场景结果 + 偏差小结 + 下一步建议 |
|
|
213
|
+
| 单元测试报告 | `docs/features/<feature-id>/<前缀>-单元测试报告.md` | 头部溯源(测试人/时间/关联产物/环境)+ 测试概况 + 逐场景结果 + 偏差小结 + 下一步建议 |
|
|
197
214
|
|
|
198
215
|
## 边界场景
|
|
199
216
|
|
|
@@ -211,7 +228,7 @@ it.skip('权限不足应返回 403', () => {
|
|
|
211
228
|
- 不修实现代码(失败如实报告)
|
|
212
229
|
- 不假装通过(断言不调到假绿)
|
|
213
230
|
- 不引入硬 gate(precommit hook / 提交拦截)
|
|
214
|
-
- 不假设测试框架(
|
|
231
|
+
- 不假设测试框架(从测试规范、测试规格的骨架映射读,或运行时探测)
|
|
215
232
|
- 不改 write-unit-test-spec / implementation / write-plan(它们对本 skill 零依赖)
|
|
216
233
|
|
|
217
234
|
## 和其他 skill 的关系
|
package/dist/cli/index.js
CHANGED
|
@@ -70,6 +70,7 @@ const cli_4 = require("../core/features/cli");
|
|
|
70
70
|
const web_1 = require("../web");
|
|
71
71
|
const node_version_check_1 = require("./node-version-check");
|
|
72
72
|
const fatal_handler_1 = require("./fatal-handler");
|
|
73
|
+
const directory_1 = require("../core/directory");
|
|
73
74
|
// -----------------------------------------------------------------------------
|
|
74
75
|
// Node.js version floor.
|
|
75
76
|
//
|
|
@@ -104,6 +105,30 @@ if (process.argv.length === 2) {
|
|
|
104
105
|
else {
|
|
105
106
|
main();
|
|
106
107
|
}
|
|
108
|
+
// Dynamic import helper — tsc compiles import() to require() in CJS mode,
|
|
109
|
+
// which fails for ESM-only packages (@clack/prompts). Same trick as the
|
|
110
|
+
// installer.
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
112
|
+
const importESM = new Function('specifier', 'return import(specifier)');
|
|
113
|
+
/**
|
|
114
|
+
* Confirmation gate for `upgrade`'s auto project-install when the current
|
|
115
|
+
* directory doesn't look like a cgraphx project (no `.cgraphx/` / `.claude/`).
|
|
116
|
+
* Non-interactive stdin declines (safe default for scripts); a cancelled
|
|
117
|
+
* prompt or a prompt failure also declines — upgrade degrades to
|
|
118
|
+
* "package updated, run install yourself", never crashes on a prompt.
|
|
119
|
+
*/
|
|
120
|
+
async function confirmProjectInstall(message) {
|
|
121
|
+
if (!process.stdin.isTTY)
|
|
122
|
+
return false;
|
|
123
|
+
try {
|
|
124
|
+
const clack = await importESM('@clack/prompts');
|
|
125
|
+
const ans = await clack.confirm({ message, initialValue: false });
|
|
126
|
+
return clack.isCancel(ans) ? false : ans;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
107
132
|
function main() {
|
|
108
133
|
const program = new commander_1.Command();
|
|
109
134
|
// Version from package.json. Reading it at runtime keeps a single source
|
|
@@ -165,18 +190,25 @@ function main() {
|
|
|
165
190
|
// ===========================================================================
|
|
166
191
|
program
|
|
167
192
|
.command('upgrade [version]')
|
|
168
|
-
.description('Update cgraphx
|
|
193
|
+
.description('Update cgraphx and refresh the current project (pull the package, then auto-run install)')
|
|
169
194
|
.option('--check', 'Check whether an update is available without installing')
|
|
170
195
|
.option('-f, --force', 'Reinstall even if already on the target version')
|
|
196
|
+
.option('--no-install', 'Only update the package; skip refreshing the current project')
|
|
171
197
|
.action(async (versionArg, options) => {
|
|
172
198
|
const up = await Promise.resolve().then(() => __importStar(require('./upgrade')));
|
|
199
|
+
const projectRoot = process.cwd();
|
|
173
200
|
const method = up.detectInstallMethod({
|
|
174
201
|
filename: __filename,
|
|
175
202
|
platform: process.platform,
|
|
176
|
-
cwd:
|
|
203
|
+
cwd: projectRoot,
|
|
177
204
|
});
|
|
178
205
|
const pin = versionArg || process.env.CGRAPHX_VERSION || undefined;
|
|
179
|
-
const code = await up.runUpgrade({
|
|
206
|
+
const code = await up.runUpgrade({
|
|
207
|
+
version: pin,
|
|
208
|
+
check: options.check,
|
|
209
|
+
force: options.force,
|
|
210
|
+
install: options.install,
|
|
211
|
+
}, {
|
|
180
212
|
currentVersion: packageJson.version,
|
|
181
213
|
method,
|
|
182
214
|
resolveLatest: () => up.resolveLatestVersion(),
|
|
@@ -185,6 +217,15 @@ function main() {
|
|
|
185
217
|
warn: (m) => console.log(chalk.yellow(m)),
|
|
186
218
|
error: (m) => console.error(chalk.red(m)),
|
|
187
219
|
platform: process.platform,
|
|
220
|
+
projectRoot,
|
|
221
|
+
unsafeRootReason: (dir) => (0, directory_1.unsafeIndexRootReason)(dir),
|
|
222
|
+
projectMarkerPresent: (dir) => fs.existsSync((0, directory_1.getCodeGraphDir)(dir)) ||
|
|
223
|
+
fs.existsSync(path.join(dir, '.claude')),
|
|
224
|
+
confirmInstall: confirmProjectInstall,
|
|
225
|
+
currentCliEntry: __filename,
|
|
226
|
+
nodeExecPath: process.execPath,
|
|
227
|
+
npmGlobalRoot: () => up.resolveNpmGlobalRoot(process.platform),
|
|
228
|
+
runInstall: up.defaultRunInstall,
|
|
188
229
|
});
|
|
189
230
|
process.exit(code);
|
|
190
231
|
});
|
|
@@ -204,17 +245,12 @@ function main() {
|
|
|
204
245
|
.command('install')
|
|
205
246
|
.description('Install cgraphx into the current project (skills, hooks, statusLine, .cgraphx/)')
|
|
206
247
|
.option('-t, --target <ids>', 'Target agent(s) (2.0 ships only Claude)')
|
|
207
|
-
.option('-y, --yes', 'Non-interactive: use defaults (
|
|
208
|
-
.option('--prompt-hook <bool>', 'Wire the front-load prompt hook (true) or skip it (false)')
|
|
248
|
+
.option('-y, --yes', 'Non-interactive: use defaults (all subsystems, no prompts)')
|
|
209
249
|
.action(async (opts) => {
|
|
210
250
|
const { runInstallerWithOptions } = await Promise.resolve().then(() => __importStar(require('./installer')));
|
|
211
|
-
const promptHook = opts.promptHook === undefined
|
|
212
|
-
? undefined
|
|
213
|
-
: opts.promptHook === 'true';
|
|
214
251
|
try {
|
|
215
252
|
await runInstallerWithOptions({
|
|
216
253
|
target: opts.target,
|
|
217
|
-
promptHook,
|
|
218
254
|
yes: opts.yes,
|
|
219
255
|
});
|
|
220
256
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAoC;AACpC,gDAAkC;AAClC,4CAA8B;AAE9B,8CAA4D;AAC5D,6CAAyD;AACzD,8CAAgE;AAChE,8CAAgE;AAChE,6CAA6C;AAC7C,oDAAoD;AACpD,gCAA4C;AAE5C,6DAA6E;AAC7E,mDAAuD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* the contract; the content is cgraphx's responsibility.
|
|
25
25
|
*
|
|
26
26
|
* Uninstall policy: the template files are NOT removed on uninstall —
|
|
27
|
-
* `cgraphx uninstall` only removes hooks / statusLine
|
|
27
|
+
* `cgraphx uninstall` only removes hooks / statusLine entries
|
|
28
28
|
* from settings.json. (Removing user files is destructive; a separate
|
|
29
29
|
* `--purge-claude-assets` flag is a later-stage decision.)
|
|
30
30
|
*/
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* the contract; the content is cgraphx's responsibility.
|
|
26
26
|
*
|
|
27
27
|
* Uninstall policy: the template files are NOT removed on uninstall —
|
|
28
|
-
* `cgraphx uninstall` only removes hooks / statusLine
|
|
28
|
+
* `cgraphx uninstall` only removes hooks / statusLine entries
|
|
29
29
|
* from settings.json. (Removing user files is destructive; a separate
|
|
30
30
|
* `--purge-claude-assets` flag is a later-stage decision.)
|
|
31
31
|
*/
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
* cgraphx Interactive Installer (2.0)
|
|
3
3
|
*
|
|
4
4
|
* Single target: Claude Code. Wires the bundled `.claude/` template
|
|
5
|
-
* (skills / agents / commands / hooks / plugins)
|
|
6
|
-
* hooks + statusLine
|
|
7
|
-
*
|
|
8
|
-
* dbquery / timeline subsystems.
|
|
5
|
+
* (skills / agents / commands / hooks / plugins) and the cgraphx-specific
|
|
6
|
+
* hooks + statusLine into the user's Claude Code configuration.
|
|
7
|
+
* Optionally registers the markdown / dbquery / timeline subsystems.
|
|
9
8
|
*
|
|
10
9
|
* 2.0 cut points versus 1.x: NO server config is written (no server in
|
|
11
10
|
* 2.0); NO usage stats are collected; the live graph watcher / git-sync-hook
|
|
@@ -26,10 +25,8 @@ export interface RunInstallerOptions {
|
|
|
26
25
|
* Comma-separated target list, or `auto` / `all` / `none`.
|
|
27
26
|
*/
|
|
28
27
|
target?: string;
|
|
29
|
-
/** Skip the prompt-hook prompt; use this value directly. */
|
|
30
|
-
promptHook?: boolean;
|
|
31
28
|
/**
|
|
32
|
-
* Skip every confirm and use defaults: location=local,
|
|
29
|
+
* Skip every confirm and use defaults: location=local, all subsystems.
|
|
33
30
|
* For scripting / CI.
|
|
34
31
|
*/
|
|
35
32
|
yes?: boolean;
|
|
@@ -86,10 +83,11 @@ export declare function uninstallTargets(targets: readonly AgentTarget[], locati
|
|
|
86
83
|
* which providers it hit.
|
|
87
84
|
*
|
|
88
85
|
* Removes what install wrote: the agent targets' hooks / statusLine /
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
86
|
+
* instructions block AND the package-owned `.claude/` assets (by manifest),
|
|
87
|
+
* plus the Developer Timeline hooks and any dead-hook leftovers (pre-0.8
|
|
88
|
+
* auto-sync / the 2.0-removed prompt-hook). Also removes the `.cgraphx/`
|
|
89
|
+
* data dir (the folded `uninit`) unless `--keep-data` — that's destructive,
|
|
90
|
+
* so it's confirmed interactively unless `--yes`.
|
|
93
91
|
*/
|
|
94
92
|
export declare function runUninstaller(opts: RunUninstallerOptions): Promise<void>;
|
|
95
93
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/installer/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/installer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AA0B7D,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2MtF;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,wEAAwE;IACxE,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,QAAQ,EAAE,QAAQ,GACjB,eAAe,EAAE,CAuBnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG/E;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,GAAG,SAAS,GAAG,gBAAgB,CAAC,CAiBvD"}
|
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
* cgraphx Interactive Installer (2.0)
|
|
4
4
|
*
|
|
5
5
|
* Single target: Claude Code. Wires the bundled `.claude/` template
|
|
6
|
-
* (skills / agents / commands / hooks / plugins)
|
|
7
|
-
* hooks + statusLine
|
|
8
|
-
*
|
|
9
|
-
* dbquery / timeline subsystems.
|
|
6
|
+
* (skills / agents / commands / hooks / plugins) and the cgraphx-specific
|
|
7
|
+
* hooks + statusLine into the user's Claude Code configuration.
|
|
8
|
+
* Optionally registers the markdown / dbquery / timeline subsystems.
|
|
10
9
|
*
|
|
11
10
|
* 2.0 cut points versus 1.x: NO server config is written (no server in
|
|
12
11
|
* 2.0); NO usage stats are collected; the live graph watcher / git-sync-hook
|
|
@@ -139,35 +138,13 @@ async function runInstallerWithOptions(opts) {
|
|
|
139
138
|
// Step 3: install location. 2.0 is project-local only — there is no global
|
|
140
139
|
// (~/.claude) install, so this is a constant, not a prompt.
|
|
141
140
|
const location = 'local';
|
|
142
|
-
// Step 4:
|
|
143
|
-
// installer prompt (default-yes): `true` writes it; `false` strips any
|
|
144
|
-
// prior install so opting out round-trips; `undefined` (the implicit
|
|
145
|
-
// default in the multi-target flow) leaves it untouched.
|
|
146
|
-
let promptHook;
|
|
147
|
-
if (opts.promptHook !== undefined) {
|
|
148
|
-
promptHook = opts.promptHook;
|
|
149
|
-
}
|
|
150
|
-
else if (useDefaults) {
|
|
151
|
-
promptHook = true;
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
const ans = await clack.confirm({
|
|
155
|
-
message: '⚠️ 是否启用 cgraphx 前置注入?(非常不建议 —— 仅对不会主动调工具的弱 agent 有用)',
|
|
156
|
-
initialValue: false,
|
|
157
|
-
});
|
|
158
|
-
if (clack.isCancel(ans)) {
|
|
159
|
-
clack.cancel('安装已取消。');
|
|
160
|
-
process.exit(0);
|
|
161
|
-
}
|
|
162
|
-
promptHook = ans;
|
|
163
|
-
}
|
|
164
|
-
// Step 5: per-target install loop.
|
|
141
|
+
// Step 4: per-target install loop.
|
|
165
142
|
for (const target of targets) {
|
|
166
143
|
if (!target.supportsLocation(location)) {
|
|
167
144
|
clack.log.warn(`${target.displayName}:已跳过 —— 不支持 --location=${location}。`);
|
|
168
145
|
continue;
|
|
169
146
|
}
|
|
170
|
-
const result = target.install(location, {
|
|
147
|
+
const result = target.install(location, {});
|
|
171
148
|
for (const file of result.files) {
|
|
172
149
|
const verb = file.action === 'unchanged'
|
|
173
150
|
? 'Unchanged'
|
|
@@ -181,7 +158,7 @@ async function runInstallerWithOptions(opts) {
|
|
|
181
158
|
clack.log.info(`${target.displayName}: ${note}`);
|
|
182
159
|
}
|
|
183
160
|
}
|
|
184
|
-
// Step
|
|
161
|
+
// Step 4¼: ensure the project's `.cgraphx/` data dir exists — the work the
|
|
185
162
|
// removed `cgraphx init` did, folded into install. Idempotent; an unsafe root
|
|
186
163
|
// ($HOME / filesystem root) is skipped with a warning so we never auto-create
|
|
187
164
|
// a data dir somewhere unintended. The `.claude` config above is unaffected.
|
|
@@ -204,7 +181,7 @@ async function runInstallerWithOptions(opts) {
|
|
|
204
181
|
clack.log.success(`已清理 1.x 代码图谱遗留表:${cleanup.dropped.join(', ')}`);
|
|
205
182
|
}
|
|
206
183
|
}
|
|
207
|
-
// Step
|
|
184
|
+
// Step 4½: optional subsystem setup — docs / db / timeline.
|
|
208
185
|
// Each is independent and runs only if the user keeps it checked.
|
|
209
186
|
// Skipped silently under --yes if their preconditions aren't met
|
|
210
187
|
// (e.g. docs needs docs/knowledge/ with .md files).
|
|
@@ -290,7 +267,7 @@ async function runInstallerWithOptions(opts) {
|
|
|
290
267
|
clack.log.warn(`timeline install 失败:${err instanceof Error ? err.message : String(err)}`);
|
|
291
268
|
}
|
|
292
269
|
}
|
|
293
|
-
// Step
|
|
270
|
+
// Step 5: next steps. install now initializes the data dir itself (the
|
|
294
271
|
// removed `cgraphx init` is folded in), so the only thing left is to restart
|
|
295
272
|
// the agent and, optionally, index an existing knowledge base.
|
|
296
273
|
clack.note('重启你的 agent 以加载新技能。\ncgraphx docs index # 可选:已有 docs/knowledge/ 时建知识库索引', '下一步');
|
|
@@ -339,10 +316,11 @@ function uninstallTargets(targets, location) {
|
|
|
339
316
|
* which providers it hit.
|
|
340
317
|
*
|
|
341
318
|
* Removes what install wrote: the agent targets' hooks / statusLine /
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
*
|
|
319
|
+
* instructions block AND the package-owned `.claude/` assets (by manifest),
|
|
320
|
+
* plus the Developer Timeline hooks and any dead-hook leftovers (pre-0.8
|
|
321
|
+
* auto-sync / the 2.0-removed prompt-hook). Also removes the `.cgraphx/`
|
|
322
|
+
* data dir (the folded `uninit`) unless `--keep-data` — that's destructive,
|
|
323
|
+
* so it's confirmed interactively unless `--yes`.
|
|
346
324
|
*/
|
|
347
325
|
async function runUninstaller(opts) {
|
|
348
326
|
const clack = await importESM('@clack/prompts');
|
|
@@ -379,7 +357,7 @@ async function runUninstaller(opts) {
|
|
|
379
357
|
}
|
|
380
358
|
}
|
|
381
359
|
// Step 4: mirror what `install` did beyond the agent targets.
|
|
382
|
-
// - install wires Developer Timeline hooks (Step
|
|
360
|
+
// - install wires Developer Timeline hooks (Step 4½) → remove them here.
|
|
383
361
|
// - install creates `.cgraphx/` (folded `init`) → remove it here (folded
|
|
384
362
|
// `uninit`) unless --keep-data. Destructive (timeline / docs index data),
|
|
385
363
|
// so confirm interactively unless --yes.
|