cgraphx 1.4.0 → 1.4.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.
@@ -0,0 +1,149 @@
1
+ # cgraphx 怎么用
2
+
3
+ 本地优先的代码智能 · 给 AI agent 用的代码图谱
4
+
5
+ 最后更新:2026-07-16
6
+
7
+ ---
8
+
9
+ ## 安装流程
10
+
11
+ - `npm install -g cgraphx` 装 CLI(Node ≥ 20 且 < 25)
12
+
13
+ ### 项目级 · 每项目一次
14
+
15
+ - 项目目录内执行 `cgraphx init` 建 `.cgraphx/` 代码图谱索引和配置文件
16
+ - 项目目录内执行 `cgraphx install` 写 MCP 配置 + 部署 skills 模板到项目 `.claude/`
17
+ - 一定要先 `cgraphx init`, `cgraphx init` 执行的同时可以执行 `cgraphx install`
18
+
19
+ ### 卸载 · 可选
20
+
21
+ - `npm uninstall -g cgraphx`
22
+ - 删项目目录下 `.cgraphx/` 清索引数据
23
+
24
+ ---
25
+
26
+ ## 使用流程
27
+
28
+ ### 开发流程
29
+
30
+ 做需求的主线。
31
+
32
+ - 必经 `/clarify-requirements` 澄清意图、业务边界、技术边界
33
+ - 可选 `/write-prd` 写业务文档(给业务方 / 领导确认)
34
+ - 核心 `/write-spec` 写技术规格(归档业务行为 / 规则 / 接口 / 数据)
35
+ - 可选 `/write-plan` 拆执行计划(给 agent 执行)
36
+ - 必经 `/implementation` 实现(简单任务)或 `/subagent-implement`(复杂多任务)
37
+
38
+ > 日常默认 2 步:澄清 + 实现。复杂需求按需补 prd / spec / plan。cgraphx 在背后自动同步代码图谱,你不需要主动跑命令。
39
+
40
+ ---
41
+
42
+ ### 接口测试流程
43
+
44
+ **需求开发完成后**
45
+
46
+ - `/write-api` 基于 spec 或已有代码生成 bruno 测试接口(.bru + 测试规格 + 多环境配置)
47
+ - `/run-api-test` 跑接口测试 + 核实写接口 DB 副作用 + 出报告 —— write-api 后执行;写接口必须查 DB 验数据
48
+
49
+ > 产物落在 `docs/bruno/`(接口定义)+ `docs/features/<前缀>/`(测试规格 + 报告)。两个 skill 顺序依赖,但 run-api-test 也可独立跑(针对已有 .bru)。
50
+
51
+ ---
52
+
53
+ ### 单元测试流程
54
+
55
+ 和开发流程平行,共享 spec 作为输入,时序任意(典型是代码先行、测试补充)。
56
+
57
+ - `/write-unit-test-spec` 基于 spec 产出单元测试规格文档(零代码依赖,该测哪些路径/边界/异常)—— 可选,write-spec 后任意时机
58
+ - `/write-unit-test-code` 基于测试规格 + 已有实现,填实测试代码 + 跑测试 + 出报告 —— 找不到测试规格则退出要求先跑 write-unit-test-spec
59
+
60
+ ```
61
+ ┌──→ /write-plan → /implementation 开发流程 · 写代码
62
+
63
+ /clarify-requirements → /write-spec ──┤
64
+
65
+ └──→ /write-unit-test-spec → /write-unit-test-code 单元测试 · 写测试
66
+ ```
67
+
68
+ > 两条独立线路:开发流程写代码,单元测试流程写测试。产物落在 `docs/features/<前缀>/`(测试规格 + 报告)+ 项目测试目录(.test.ts)。
69
+
70
+ ---
71
+
72
+ ### 知识库管理
73
+
74
+ 沉淀业务决策、概念定义、历史教训到跨需求共享的知识库。
75
+
76
+ - `/code-impact-markdown` 任何有价值的会话都可以触发沉淀 —— 你只需要关注这一个指令
77
+ - `/code-impact-init` 新项目起步时批量探索 + 写知识库 —— 可选,接手陌生项目时跑
78
+ - `knowledge-recall` 聊业务 / 不懂术语 / 对齐黑话时,派子 agent 召回相关概念 —— agent 自动触发
79
+ - `code-impact-api` 已知概念名,精确查知识库 —— agent 自动触发
80
+
81
+ > 产物落在 `docs/knowledge/*.md`。写文件前必须过 `cgraphx docs validate` 校验,非法文件会被索引跳过。
82
+
83
+ ---
84
+
85
+ ### 模型知识库管理
86
+
87
+ 数据库 schema 的 DDL 快照 + 探索补充,让 AI 理解表结构和业务语义。
88
+
89
+ - `/export-table-ddl` 按 profile 批量导出项目用到的表的 CREATE TABLE DDL,按工程分目录 —— 项目接入时跑一次,schema 变了重跑
90
+ - `db-query` 查数据时读本地 DDL 文件(首选),文件不存在才连 DB 兜底;探索发现的隐式关系/含义/陷阱 append 到对应表的 DISCOVERED 块 —— agent 自动触发
91
+
92
+ > 产物落在 `docs/schema-knowledge/<工程>/`(INDEX.md + ddl/<table>.sql + pending-comments.sql)。重 dump 时 DISCOVERED 块自动保留,积累不丢。
93
+
94
+ ---
95
+
96
+ ## docs/ 目录速查
97
+
98
+ 翻文档时知道去哪儿找 —— 哪个目录由哪个 skill 自动维护。
99
+
100
+ **图例**:`必有` = 必有 | `可选` = 可选(按需) | `本地测试相关`
101
+
102
+ ```
103
+ docs/ 文档工程 # 必有
104
+ ├── bruno/ API接口目录 # write-api + run-api-test 维护; bruno app 可以直接打开这个目录识别为接口列表
105
+ │ ├── bruno.json
106
+ │ ├── environments/
107
+ │ │ ├── local.bru
108
+ │ │ ├── staging.bru
109
+ │ │ └── production.bru
110
+ │ ├── common/
111
+ │ │ └── <接口名>/<场景>.bru
112
+ │ └── <服务名>/
113
+ │ └── <需求前缀>/
114
+ │ └── <接口名>/
115
+ │ ├── <场景1>.bru
116
+ │ └── <场景2>.bru
117
+
118
+ ├── features/ 需求目录
119
+ │ └── <日期>-<编号>-<前缀>/ # 如 2026-07-03-CRM-req19230-号百商品详情查询接口
120
+ │ ├── <前缀>-spec.md /write-spec 必选 clarify 后执行
121
+ │ ├── <前缀>-需求文档.md /write-prd 可选 需要需求文档时,spec 之后
122
+ │ ├── plan/ /write-plan 可选 大需求,spec/prd 后
123
+ │ ├── <前缀>-单元测试-spec.md /write-unit-test-spec 可选 spec 后任意时机
124
+ │ ├── <前缀>-单元测试报告.md /write-unit-test-code 可选 spec+开发完成后
125
+ │ ├── <前缀>-api-spec.md /write-api 可选 接口测试,开发完成后
126
+ │ ├── <前缀>-测试报告.md /run-api-test 可选 write-api 后自动产出
127
+ │ ├── <前缀>-测试验证.jsonl /run-api-test 可选 自动产出
128
+ │ └── <前缀>-设计文档.md /code-impact-docgen 可选 功能稳定后执行
129
+
130
+ ├── knowledge/ 知识库目录 /code-impact-markdown 任何有价值的会话都可以触发沉淀;
131
+ │ /code-impact-init 新项目起步可以批量写 [可选]
132
+
133
+
134
+ ├── schema-knowledge/ 模型知识库目录 /export-table-ddl 批量初始化工程模型, 按工程分目录
135
+ │ ├── xw-inst /db-query 自动读文件内的模型, 兜底连接数据库获取数据, 经验回写到对应的 ddl文件
136
+ │ │ ├── INDEX.md # 表名 + 表注释,agent 进目录第一件事读
137
+ │ │ ├── pending-comments.sql # DBA 待执行 COMMENT SQL(action 队列,执行一条删一条)
138
+ │ │ └── ddl/
139
+ │ │ ├── <table>.sql # 完整 DDL + 末尾 DISCOVERED 块(db-query 探索补充的隐式关系/含义/陷阱)
140
+ │ │ └── <table>.sql
141
+ │ ├── xw-order # 结构同 xw-inst
142
+ │ └── xw-so # 结构同 xw-inst
143
+ ```
144
+
145
+ > **两个核心目录** —— `docs/features/` 是单次需求工作目录(必须有 spec.md),`docs/knowledge/` 是跨需求共享的业务知识库。**bruno/ 和 schema-knowledge/ 按需出现**,只在跑接口测试 / 查 DB 时产生。
146
+
147
+ ---
148
+
149
+ cgraphx 使用说明 · 2026-07-16
@@ -31,38 +31,39 @@ description: 用户给一段话描述(模糊想法/领导式指令/产品想法/
31
31
 
32
32
  ## 流程
33
33
  你必须为下列每一项创建一个任务,并按顺序完成:
34
- 1. **探索上下文**
34
+ 1. **知识库召回**
35
+ - 必须问用户是否需要 `knowledge-recall skill`, 用户确认后按 `knowledge-recall skill`流程,派出subagent探索知识库. 用于理解项目内行业俗语和黑话
36
+
37
+ 2. **探索上下文**
35
38
  - 按需读项目结构、文档、代码、测试、schema、路由、模型、API、UI、既有约定
36
39
  - 项目里有这些工具可作为上下文补充, 对于符合的场景,必须使用:
37
- - `code-impact-api skill` — 查 历史决策、业务概念、项目经验时必须使用
38
40
  - `db-query skill` — 查数据库、查 DDL 时必须使用
39
41
  - `codegraph_explore` MCP 工具 / `cgraphx query` / `cgraphx affected` CLI — 查代码调用关系、影响半径时必须使用
40
- - `developer-timeline skill` — 查用户最近做了什么(回顾开发历史) 时必须使用
41
42
  - 调用前明确告诉用户"我需要先查 X 来理解背景"。收集完简要陈述发现,不要大段贴原文
42
43
  - 在假设任务形态之前,先识别当前行为和既有约束
43
44
 
44
- 2. **分类任务**
45
+ 3. **分类任务**
45
46
  - 选一个主任务类型
46
47
  - 只在严重影响澄清时加次任务类型
47
48
  - 任务类型不清楚时,先问一个简短的分类问题再继续
48
49
 
49
- 3. **确认初步理解** ← 循环式复述的核心
50
+ 4. **确认初步理解** ← 循环式复述的核心
50
51
  - 复述你理解的意图
51
52
  - 点出怀疑的目标、受影响的区域、初步范围
52
53
  - 用结构化清单复述,然后明确问:"**这是你的意思吗?有什么要补充或纠正的?**"
53
54
  - **铁律:用户明确说"没补充/没纠正/理解对了"之前,不进第 4 步。** 这一步的循环是整个 skill 的核心价值——agent 不知道用户脑中还有哪些观点没抛出来;理解偏差是后续所有返工的最大来源
54
55
 
55
- 4. **澄清业务边界**
56
+ 5. **澄清业务边界**
56
57
  - 确认业务目标、参与者、场景、包含范围、排除范围、数据归属、权限、异常、成功标准
57
58
  - 对需要领导/业务方拍板的规则、口径、优先级、例外、验收标准明确标记为"业务决策"
58
59
 
59
- 5. **澄清技术方案边界**
60
+ 6. **澄清技术方案边界**
60
61
  - 确认受影响的层和主要技术选择,**不展开成完整设计 spec**
61
62
  - **技术方案涉及既有代码改动时,做影响分析**——把 blast radius、直接调用方、受影响流程、风险等级(LOW/MEDIUM/HIGH/CRITICAL)报告给用户。HIGH/CRITICAL 风险必须先警告用户,再决定是否继续
62
63
  - 当目标清楚但方案未定时,给 2-3 个可行方案 + 权衡 + 推荐方案;用户确认前不得把推荐方案写成已锁定技术方向
63
64
  - 判断哪些技术决策必须在 spec/plan 前锁定,哪些可以留给后续实现做局部工程适配
64
65
 
65
- 6. **总结并停止**
66
+ 7. **总结并停止**
66
67
  - 输出简洁的澄清总结(见「最终输出」)
67
68
  - 提一句可能的下一步(写 PRD/spec/plan/实现),作为用户控制的选择,不自动继续
68
69
  - 总结指向"实现"时,**根据任务规模推荐 `/implementation` 或 `/subagent-implement`**(见「下游实现 skill 选择」)
@@ -710,6 +710,7 @@ $CODEGRAPH docs find --q="{name}" --limit=5 --json
710
710
  7. source_type 填 ai_session
711
711
  8. related_code 填实际探索过的文件路径(cgraphx query / impact 输出已有,直接复制)
712
712
  9. 文档正文必须包含:Summary, Context, Findings, Evidence, Impact For Future Changes
713
+ 10. **Write 后必须 `cgraphx docs validate <file>` 校验通过**(code-impact-markdown skill 的强制步骤);非法则修 frontmatter 再 Write 再校验,直到合法
713
714
 
714
715
  完成后只返回以下 JSON(不要返回文档内容):
715
716
  {
@@ -778,6 +779,8 @@ frontmatter:
778
779
  - related_code 填 codegraph_impact MCP 报告里 affected symbols 涉及的高中心性文件
779
780
  - concepts 填此核心 concept + 关联 concept
780
781
 
782
+ **Write 后必须 `cgraphx docs validate <file>` 校验通过**(同知识文档流程步骤 10)。
783
+
781
784
  完成后返回 JSON:
782
785
  {
783
786
  "document_path": "docs/knowledge/xxx.md",
@@ -36,8 +36,9 @@ docs/knowledge/
36
36
  5. 如果是更新已有的 Markdown 文件,先读取并保留当前 frontmatter。
37
37
  6. 编写简洁的 frontmatter,使文档可被图谱解析。
38
38
  7. 正文必须包含 `## Summary`(唯一进索引的章节),其他章节按 `document_type` 选模板自由组织。
39
- 8. 检查是否已有文档覆盖了相同主题。当三个合并条件全部满足时(见文档合并检查),提示用户是否合并。
40
- 9. 编辑后询问是否触发扫描。**未经确认不要运行扫描**。
39
+ 8. **Write 后立刻 `cgraphx docs validate <file>` 校验**(见下节),非法则修 frontmatter 再 Write 再校验,直到合法。
40
+ 9. 检查是否已有文档覆盖了相同主题。当三个合并条件全部满足时(见文档合并检查),提示用户是否合并。
41
+ 10. 编辑后询问是否触发扫描。**未经确认不要运行扫描**。
41
42
 
42
43
  ## 查询已有词汇
43
44
 
@@ -62,9 +63,16 @@ cgraphx docs find --concept=Redis # 按 concept 精确过滤
62
63
  grep -rl "concepts:" docs/knowledge/ --include="*.md"
63
64
  ```
64
65
 
65
- ## 校验 frontmatter(本地自查)
66
+ ## 校验 frontmatter(写文件前必跑)
66
67
 
67
- cgraphx 无服务端校验端点。**编辑后自查 7 必填字段是否齐全且合法**:
68
+ cgraphx 提供 `docs validate` 子命令,写文件前**必须**跑一遍校验,通过才保存:
69
+
70
+ ```bash
71
+ cgraphx docs validate <file> # 文本输出,exit 0 合法 / 2 非法
72
+ cgraphx docs validate <file> --json # JSON 输出 {valid, skipReason, detail}
73
+ ```
74
+
75
+ 校验内容(规则与 `cgraphx docs index` 扫描时一致,单一事实源 `src/markdown/validator.ts`):
68
76
 
69
77
  | 字段 | 校验 |
70
78
  |---|---|
@@ -76,7 +84,7 @@ cgraphx 无服务端校验端点。**编辑后自查 7 必填字段是否齐全
76
84
  | `source_type` | 7 枚举之一(见下) |
77
85
  | `updated` | `YYYY-MM-DD` 格式 |
78
86
 
79
- 任一字段缺失或非法 → cgraphx 扫描时**整个文件被跳过**,记入 skip 日志(可用 `cgraphx docs index` 输出查看跳过原因)。
87
+ **流程**:Write 文件 `cgraphx docs validate <file>` → 非法则**修 frontmatter 再 Write 再校验**,直到合法才告知用户文件已保存。非法文件即使写了,`cgraphx docs index` 扫描时也会整个跳过 —— 所以校验前置不是可选,是必须。
80
88
 
81
89
  ## 命名规则
82
90
 
@@ -69,13 +69,13 @@ profiles 文件结构:每个 profile 含 `type`(mysql/postgres)、连接参数
69
69
  → "你期望这条 SQL 返回什么样的业务实体?"
70
70
  → 用户也不知道时,**每一步试错都报告用户**,让用户决定继续还是换思路
71
71
 
72
- 4. 探索完成(用户告知或谨慎试错得到结论)后,沉淀到 per-table DDL 文件:
73
- a. 定位文件 docs/schema-knowledge/<project>/ddl/<table>.sql(不存在 先跑 export-table-ddl 建基线)
74
- b. append 到文件末尾的 DISCOVERED (格式见下)
75
- c. 若是 DB 注释缺失导致的含义不明 另生成 COMMENT SQL 提示用户执行(执行后 DB 注释固化,DISCOVERED 块里那条可删)
72
+ 4. 探索完成(用户告知或谨慎试错得到结论)后,按"给谁看"分两类落点:
73
+ - **给 agent 看(知识)** → append 到 `ddl/<table>.sql` DISCOVERED 块(格式见下)。这是 agent 读路径上的必经节点,知识必须留在这。
74
+ - **给 DBA 执行(action)** → 若 DB 的 COMMENT/字段注释缺失,生成 `ALTER TABLE ... COMMENT '...'`(MySQL)或 `COMMENT ON COLUMN/TABLE ... IS '...'`(PG),append 到 `<project>/pending-comments.sql`。这是 DBA 的任务队列 —— 执行一条删一条,不在 agent 读路径上,所以放独立文件没问题。
75
+ - 落点口诀:**知识进 DDL 文件,action 进 pending-comments.sql**。两者不混 —— DISCOVERED 块只放"agent 现在要知道的",pending-comments.sql 只放"等 DBA 固化进 DB 的暂存区"。
76
76
  ```
77
77
 
78
- **长期目标**:DB 注释逐渐健全(用户/DBA 执行了 COMMENT SQL)后,`schema --mode ddl` 直接返回业务含义,DISCOVERED 块逐渐退役。DB 自带注释是单一事实源,任何工具/任何人查 DDL 都受益。
78
+ **长期目标**:DB 注释逐渐健全(DBA 执行了 pending-comments.sql)后,`schema --mode ddl` 直接返回业务含义,DISCOVERED 块里对应的 `[字段含义]` 行可删(已被 DB 固化),pending-comments.sql 也 drain 完。DB 自带注释是单一事实源,任何工具/任何人查 DDL 都受益。
79
79
 
80
80
  ## DISCOVERED 块格式(append 到 ddl/<table>.sql 末尾)
81
81
 
@@ -104,6 +104,28 @@ agent 的访问路径是 `INDEX.md → ddl/<table>.sql`,**基本不会主动读
104
104
 
105
105
  工程级 meta(profile 对应哪个服务、整体架构一句话)可以放 `INDEX.md` 顶部(agent 进目录第一件事就是读它),但不要沉淀到表级以下的独立文件。
106
106
 
107
+ ### pending-comments.sql —— 唯一允许的独立文件(DBA action 队列)
108
+
109
+ `<project>/pending-comments.sql` 是上述"绝不建独立文件"规则的**唯一例外**,因为它服务的不是 agent 而是 DBA:
110
+
111
+ - **内容**:待执行的 `ALTER TABLE ... COMMENT '...'`(MySQL) / `COMMENT ON COLUMN/TABLE ... IS '...'`(PG)语句,补 DB 缺失的字段/表注释。
112
+ - **为什么可以独立**:agent 读路径是 `INDEX.md → ddl/<table>.sql`,**不经过 pending-comments.sql** —— 它不在路径上,放独立文件不会"埋"任何 agent 需要的知识。它只是 DBA 的任务队列。
113
+ - **格式**:纯 SQL,按表分组,每组前一行 `-- <table>` 注释。DBA 跑一条删一条(drain 语义)。
114
+ - **和 DISCOVERED 块的分工**:同一个字段含义,DISCOVERED 块写"agent 现在要知道的"(立即生效),pending-comments.sql 写"等 DBA 固化进 DB 的"(异步执行)。DBA 执行后:删 pending-comments.sql 里那条 + 删 DISCOVERED 里对应的 `[字段含义]` 行(DB 已固化,文件副本冗余)。
115
+ - **重 dump 不动它**:`export-table-ddl` 脚本只写 `INDEX.md` 和 `ddl/*.sql`,不碰 pending-comments.sql。
116
+
117
+ ```sql
118
+ -- pending-comments.sql for order-svc
119
+ -- 待执行的 COMMENT SQL — DBA 跑完一条删一条,跑完后对应 DISCOVERED [字段含义] 行也可删
120
+
121
+ -- work_order (MySQL)
122
+ ALTER TABLE work_order MODIFY COLUMN status TINYINT NOT NULL COMMENT '0=待派单 1=处理中 2=已完成 3=取消';
123
+ ALTER TABLE work_order MODIFY COLUMN assignee_id VARCHAR(64) COMMENT '处理人工号,关联 users.staff_code';
124
+
125
+ -- users (PG)
126
+ COMMENT ON COLUMN users.tenant_id IS '租户隔离字段,所有查询必须带这个过滤';
127
+ ```
128
+
107
129
  ## 何时派子 agent(让上下文更干净)
108
130
 
109
131
  主 agent **直接调 cgraphx db 工具时,大段原文(DDL 字段列表、SELECT 输出、表关系推断过程)会进自己的上下文**,挤占决策与待办的空间。本 skill 工具适合精确查询,但**模糊意图的重探索型任务**适合派子 agent 在隔离上下文里跑。
@@ -145,14 +167,19 @@ agent 的访问路径是 `INDEX.md → ddl/<table>.sql`,**基本不会主动读
145
167
  ```
146
168
  docs/schema-knowledge/
147
169
  <工程A>/
148
- INDEX.md # 表名 + 表注释,一眼扫完
170
+ INDEX.md # 表名 + 表注释,一眼扫完(agent 入口)
171
+ pending-comments.sql # DBA 待执行的 COMMENT SQL(action 队列,不在 agent 读路径上)
149
172
  ddl/
150
- users.sql # 完整 DDL + 末尾 DISCOVERED 块(db-query 探索补充)
173
+ users.sql # 完整 DDL + 末尾 DISCOVERED 块(agent 读路径)
151
174
  work_order.sql
152
175
  <工程B>/
153
176
  ...
154
177
  ```
155
178
 
179
+ **两类落点,各服务不同对象**:
180
+ - **给 agent 看(知识)** → `ddl/<table>.sql` 的 DISCOVERED 块。agent 读路径必经。
181
+ - **给 DBA 执行(action)** → `pending-comments.sql`。DBA 任务队列,不在 agent 读路径上。
182
+
156
183
  **两张表的 DDL 文件示例**(work_order.sql):
157
184
 
158
185
  ```sql
@@ -170,10 +197,10 @@ CREATE TABLE `work_order` (
170
197
  ```
171
198
 
172
199
  **闭环工作流**:
173
- 1. `export-table-ddl` 跑一次 → 建基线(DDL + 注释 + 索引,无 DISCOVERED )
174
- 2. 日常 `db-query` 查数据踩坑 → 发现隐式关系/含义/陷阱 → append 到对应 `ddl/<table>.sql` 的 DISCOVERED
175
- 3. 重跑 `export-table-ddl`(schema 变了)→ DISCOVERED 块保留,新 DDL 接上
176
- 4. DB 注释健全后 → DISCOVERED 块里对应的行可删(DB 已固化)
200
+ 1. `export-table-ddl` 跑一次 → 建基线(DDL + 注释 + 索引,无 DISCOVERED 块,无 pending-comments.sql)
201
+ 2. 日常 `db-query` 查数据踩坑 → 发现隐式关系/含义/陷阱 → 知识进 `ddl/<table>.sql` 的 DISCOVERED 块;DB 注释缺失则 action 进 `pending-comments.sql`
202
+ 3. 重跑 `export-table-ddl`(schema 变了)→ DISCOVERED 块保留,新 DDL 接上;pending-comments.sql 不动
203
+ 4. DBA 执行 pending-comments.sql 里的语句 → DB 注释固化删 pending-comments.sql 里那条 + 删 DISCOVERED 里对应的 `[字段含义]` 行(DB 已是单一事实源,文件副本冗余)
177
204
 
178
205
  ## 期望错误(CLI 退出码语义)
179
206
 
@@ -118,17 +118,20 @@
118
118
  <h2>1. 共享的目录结构(知识库本体)</h2>
119
119
  <div class="tree">docs/schema-knowledge/
120
120
  ├── order-svc/
121
- │ ├── <span class="hl">INDEX.md</span> ← agent 进目录第一件事读(表清单+注释)
121
+ │ ├── <span class="hl">INDEX.md</span> ← agent 进目录第一件事读(表清单+注释)
122
+ │ ├── pending-comments.sql ← DBA 待执行 COMMENT SQL(action 队列,不在 agent 读路径)
122
123
  │ └── ddl/
123
124
  │ ├── work_order.sql ← DDL + <span class="hlo">DISCOVERED 块</span>(积累的隐式关系/含义/陷阱)
124
125
  │ ├── users.sql ← DDL + DISCOVERED 块
125
126
  │ └── payment.sql
126
127
  └── cust-svc/
127
128
  ├── INDEX.md
129
+ ├── pending-comments.sql
128
130
  └── ddl/...</div>
129
131
  <p style="font-size:14px;color:var(--gray);">
130
132
  <b style="color:var(--green)">绿色</b> = agent 必经节点(INDEX.md 是入口,ddl/&lt;table&gt;.sql 是详情);
131
- <b style="color:var(--orange)">橙色</b> = db-query 探索补充的部分,export 重 dump 时会保留。
133
+ <b style="color:var(--orange)">橙色</b> = db-query 探索补充的部分,export 重 dump 时会保留;
134
+ <b style="color:var(--gray)">灰色</b> pending-comments.sql = DBA action 队列,不在 agent 读路径上(所以可以独立文件)。
132
135
  </p>
133
136
 
134
137
  <h2>2. 时序:知识怎么积累起来</h2>
@@ -143,11 +146,18 @@
143
146
  </div>
144
147
  <div class="tl-item write">
145
148
  <div class="tl-title">T1 续 · 发现 work_order.assignee_id 实际对应 users.staff_code</div>
146
- <div class="tl-body">append 到 <code>ddl/work_order.sql</code> 和 <code>ddl/users.sql</code> 的 DISCOVERED 块(双向)</div>
149
+ <div class="tl-body">
150
+ 知识 → append 到 <code>ddl/work_order.sql</code> 和 <code>ddl/users.sql</code> 的 DISCOVERED 块(双向)<br>
151
+ DB 注释缺失 → action 进 <code>pending-comments.sql</code>(DBA 待执行)
152
+ </div>
147
153
  </div>
148
154
  <div class="tl-item init">
149
155
  <div class="tl-title">T2 · DBA 改了 schema,重跑 export-table-ddl</div>
150
- <div class="tl-body">DDL 部分刷新(拿新结构),<b style="color:var(--orange)">DISCOVERED 块自动保留</b>(不覆盖)</div>
156
+ <div class="tl-body">DDL 部分刷新(拿新结构),<b style="color:var(--orange)">DISCOVERED 块自动保留</b>(不覆盖);pending-comments.sql 不动</div>
157
+ </div>
158
+ <div class="tl-item write">
159
+ <div class="tl-title">T2 续 · DBA 执行 pending-comments.sql 里的 COMMENT</div>
160
+ <div class="tl-body">DB 注释固化 → 删 pending-comments.sql 里那条 + 删 DISCOVERED 对应的 <code>[字段含义]</code> 行(DB 已是单一事实源)</div>
151
161
  </div>
152
162
  <div class="tl-item read">
153
163
  <div class="tl-title">T3 · 下一次 db-query 读 work_order</div>
@@ -123,6 +123,26 @@ description: 用户要求根据已确认的 plan、spec、任务清单、实现
123
123
  - 如果存在 plan,最终能说明 `PLAN_FOLLOWED` / `PLAN_ADAPTED` / `PLAN_CONFLICT` 的状态。
124
124
  - 最终回复清楚列出变更和验证结果。
125
125
 
126
+ ## 知识沉淀提示(实现结束后)
127
+
128
+ 汇报完变更和验证结果后,**主动评估本次会话是否产生了值得沉淀的知识**。不是每次都问 —— 只在本次实现中确实出现了下面任一情况时,提示用户:
129
+
130
+ - 踩了一个非显而易见的坑 / 陷阱(读代码看不出来,下次还会踩)
131
+ - 发现一个隐式约束或业务规则(代码里没写明,但影响实现)
132
+ - 做了一个有取舍的技术决策(存在替代方案,为什么选这个)
133
+ - 跨系统 / 跨文件的依赖关系,单看代码看不出来
134
+ - 历史背景 / 遗留约束解释了代码为什么是现在这样
135
+
136
+ 满足时,在汇报末尾加一句:
137
+
138
+ ```text
139
+ 本次实现中 [简述发现],是否需要用 code-impact-markdown skill 沉淀到 docs/knowledge/?
140
+ ```
141
+
142
+ 用户同意 → 调 `code-impact-markdown` skill 走它的完整流程(查已有概念 → 写文件 → `docs validate` 校验 → 合并检查 → 询问扫描)。用户拒绝或没有值得沉淀的内容 → 不提,正常结束。
143
+
144
+ **不要自己造沉淀流程** —— 必须走 `code-impact-markdown` skill,它有 frontmatter 规范、校验、合并检查、命名规则。直接 Write 一个 .md 不校验不查重,等于往知识库灌坏文件。
145
+
126
146
  ## 遇到阻塞
127
147
 
128
148
  遇到以下情况时暂停并向用户说明:
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: knowledge-recall
3
+ description: 从项目 markdown 知识库召回业务概念 — 当用户聊业务/遇到不懂的术语/需要对齐项目黑话/提到一个名词想确认项目里有没有沉淀过时,强制派子 agent 在隔离上下文里加载全量 concept 列表做语义匹配,主 agent 只拿命中的概念(名+文档路径+一行说明),不直接看到全量表。Use when 聊业务/不懂这个术语/这个词什么意思/对齐黑话/项目黑话/业务概念/行业术语/这个名词/沉淀过/之前记录过/有没有相关文档/这个业务词.
4
+ ---
5
+
6
+ ## 这个 skill 解决什么
7
+
8
+ 用户和 AI 聊业务时,AI 往往不会主动查项目已沉淀的概念,导致:用错行业黑话、重复问已记录过的问题、不知道有相关决策文档。本 skill 强制把"加载全量 concept + 匹配"这件事放进子 agent 的隔离上下文,主 agent 只收命中结果 —— 全量表(几十到几百个概念)不进主上下文,避免挤占决策空间。
9
+
10
+ ## 流程
11
+
12
+ 1. **Agent tool 调用**(专用子 agent,指令已内置在 agent 定义里):
13
+ ```
14
+ Agent({
15
+ subagent_type: "knowledge-recall",
16
+ prompt: "当前任务: " + <用户原话或你的转述>
17
+ })
18
+ ```
19
+ 2. **直接采纳** 子 agent 返回的命中概念列表 —— 不要再自己调 `cgraphx docs concepts/find` 重新查(那是浪费,且会把全量表拉进主上下文)
20
+ 3. 拿到命中概念后,主 agent 决定下一步:
21
+ - 概念够清晰,直接回答用户
22
+ - 需要细节 → `Read` 子 agent 返回的文档 path
23
+ - 需要精确查某个概念的其他文档 → 调 `code-impact-api` skill
24
+ - 子 agent 说"没有命中"→ 告诉用户项目里没沉淀这个概念,问要不要记录
@@ -0,0 +1,136 @@
1
+ ---
2
+ name: write-unit-test-code
3
+ description: 基于 write-unit-test-spec 产出的测试规格文档 + 已有实现代码,填实单元测试代码 + 跑测试 + 出报告。读测试规格派生场景 → 读实现代码定位被测目标(函数/类/模块)→ 产出 .test.ts(断言填实,能真跑)→ 跑测试 → 出 <前缀>-单元测试报告.md。被测代码缺失的场景用 it.skip + TODO 占位。依赖测试规格文档存在 —— 找不到时报错退出,要求先跑 /write-unit-test-spec。Use when 想填实测试代码 / 写单元测试 / 跑单元测试 / write-unit-test-code. 不写业务实现代码、不修实现 bug、不假装通过.
4
+ ---
5
+
6
+ # Write Unit Test Code
7
+
8
+ ## 定位
9
+
10
+ **测试填实 + 验证 skill**:消费 `write-unit-test-spec` 产出的测试规格文档,基于已有实现代码填实测试代码,跑测试验证,出测试报告。
11
+
12
+ **和 write-unit-test-spec 的分工**:
13
+ - write-unit-test-spec:产**测试规格文档**(该测哪些场景,基于 spec,零代码依赖)
14
+ - 本 skill(write-unit-test-code):基于测试规格 + 已有实现,填实测试代码 + 跑 + 出报告
15
+
16
+ 两个 skill 顺序依赖:本 skill 找不到测试规格文档时报错退出。
17
+
18
+ **和 implementation 的关系**:平行线路。implementation 写业务实现代码,本 skill 写测试代码。本 skill 假设被测代码已存在(典型场景:用户跑完 implementation 后回来补测试);代码缺失的场景用 `it.skip` + TODO 占位。
19
+
20
+ ## HARD-GATE
21
+
22
+ - **不写业务实现代码** —— 本 skill 只写测试代码 + 测试报告,业务实现是 implementation 的事
23
+ - **依赖测试规格文档** —— 当前 feature 没有 `<前缀>-单元测试-spec.md` 时,报错退出:"找不到测试规格,请先跑 /write-unit-test-spec"。不自己现场派生测试场景(那是 write-unit-test-spec 的职责)
24
+ - **不编造被测目标** —— 测试里 import 的函数/类/模块必须**已存在**。不存在 → 对应场景用 `it.skip` + `// TODO: 实现提供后填实` 占位,不自己造签名
25
+ - **不修实现代码** —— 测试失败时如实报告,不替用户改业务代码
26
+ - **不假装通过** —— 测试断言不调到"假绿"。失败就是失败,如实标在报告里
27
+
28
+ ## Trigger
29
+
30
+ **使用此 skill 当**:
31
+ - 用户跑完 `/write-unit-test-spec`,想填实测试代码
32
+ - 用户跑完 implementation,想基于测试规格补测试
33
+ - 用户明确说"填实测试 / 写单元测试代码 / 跑单元测试 / write-unit-test-code"
34
+
35
+ **不要使用此 skill 当**:
36
+ - 没有测试规格文档 —— 先跑 `/write-unit-test-spec`
37
+ - 想写业务实现 —— 用 `/implementation`
38
+ - 想产测试规格(不填实)—— 用 `/write-unit-test-spec`
39
+ - 纯文档 / 配置 / 无行为变更的需求 —— 无可测代码
40
+
41
+ ## 流程
42
+
43
+ ### 1. 前置检查
44
+
45
+ - 确认 `docs/features/<feature-id>/<前缀>-单元测试-spec.md` 存在。**不存在 → 报错退出**:"找不到测试规格,请先跑 /write-unit-test-spec"。不现场派生场景。
46
+ - 复用测试规格的 feature-id 和文件前缀,推导出测试文件路径和报告文件名。
47
+
48
+ ### 2. 读测试规格文档
49
+
50
+ 读 `<前缀>-单元测试-spec.md`,拿到:
51
+ - 必测场景清单(主路径 / 边界 / 异常,每条标 spec 依据)
52
+ - 测试骨架映射(测试文件该放哪、框架、命名)
53
+
54
+ ### 3. 读已有实现代码
55
+
56
+ 根据测试规格描述的被测目标,在代码库定位已有实现(用 `codegraph_explore` MCP / `cgraphx query` CLI / grep / Read):
57
+ - 读函数签名、参数、返回值、抛错行为、依赖关系
58
+ - 如果测试规格里的某个场景**代码里还没实现**:
59
+ - 对应测试用 `it.skip` + `// TODO: 实现提供后填实` 占位
60
+ - 记入"实现缺失场景清单",汇报时告诉用户"有 N 个场景因实现缺失跳过"
61
+ - **不自己造签名**
62
+ - 如果实现和 spec 不一致(测试规格基于 spec,但代码偏离了 spec):
63
+ - 在测试报告里标注"实现与 spec 偏差:X(spec 说 A,代码实际 B)"
64
+ - 测试按**代码实际行为**写(要能跑过)
65
+ - 偏差记录留给用户决定(改代码 / 改 spec / 接受现状)
66
+
67
+ ### 4. 产出测试文件(断言填实)
68
+
69
+ 写到 `<项目测试目录>/<feature-id>.test.ts`(或项目约定的命名/后缀,从测试规格的"骨架映射"节读取)。形态:
70
+
71
+ - 实现已就绪的场景 → `describe` + `it`(含真实断言,基于读到的签名写,能真跑)
72
+ - 实现缺失的场景 → `it.skip` + `// TODO: 实现提供后填实` 占位
73
+ - import 被目标(已存在的模块直接 import;不存在的标 TODO 注释,不强行 import)
74
+ - 框架(vitest/jest/...)和文件后缀按项目约定
75
+ - 已有同模块测试文件 → 文件名加后缀避免覆盖(如 `<feature-id>.补充.test.ts`),在报告里提示"已有 X,是否合并由用户判断"
76
+
77
+ **AI 自己发挥的空间**:fixture / mock 怎么组织、describe 嵌套多深、断言写多细,agent 按既有测试风格判断,不强加模板。
78
+
79
+ ### 5. 跑测试验证 + 产出测试报告
80
+
81
+ 跑一次项目的测试命令(如 `npm test`),确认新写的测试能跑(通过或失败都行,失败说明实现有 bug 或测试断言写错)。
82
+
83
+ **产出单元测试报告**,写到 `docs/features/<feature-id>/<前缀>-单元测试报告.md`。结构轻量,至少包含:
84
+
85
+ - 测试概况:总数 / 通过 / 失败 / 跳过(it.skip 占位)/ 时长
86
+ - 逐场景结果:每个 `it` 的通过/失败/跳过 + 失败原因(如有)
87
+ - 实现与 spec 偏差小结
88
+ - 待确认项汇总(实现缺失 / spec 不够细等)
89
+ - 下一步建议(失败 → 建议改实现 / 改测试 / 改 spec;跳过多 → 建议先补实现再回来跑)
90
+
91
+ **报告原则**:
92
+ - 通过 → 报告"测试已就绪,N 个场景覆盖"
93
+ - 失败 → 报告如实标失败 + 原因分类(测试写错 / 实现有 bug / spec 和实现偏差),**不修实现,不假装通过**
94
+ - 全部跳过(实现都没写)→ 报告标"无可跑测试,所有场景待实现",建议用户先跑 implementation
95
+
96
+ ### 6. 汇报 + 不自动继续
97
+
98
+ 告诉用户:
99
+ - 测试文件路径
100
+ - **单元测试报告路径** + 报告里的关键数字(通过/失败/跳过数)
101
+ - 实现与 spec 的偏差(如有)
102
+ - 待确认项(如有)
103
+
104
+ **不调用 implementation / write-unit-test-spec / run-api-test**,由用户决定下一步。
105
+
106
+ ## 产物
107
+
108
+ | 产物 | 路径 | 形态 |
109
+ |---|---|---|
110
+ | 测试文件 | `<项目测试目录>/<feature-id>.test.ts` | describe + `it`(断言填实) / `it.skip`(实现待补) |
111
+ | 单元测试报告 | `docs/features/<feature-id>/<前缀>-单元测试报告.md` | 测试概况 + 逐场景结果 + 偏差小结 + 下一步建议 |
112
+
113
+ ## 边界场景
114
+
115
+ - **找不到测试规格文档** → 报错退出,要求先跑 `/write-unit-test-spec`。不现场派生场景。
116
+ - **实现代码缺失** → 对应场景 `it.skip` + TODO 占位,汇报时告诉用户。不造签名。
117
+ - **已有同模块测试文件** → 文件名加后缀避免覆盖,报告里提示用户。不主动改既有测试。
118
+ - **跨语言项目** → 按测试规格文档里标注的语言约定产出。一次调用不产多语言测试。
119
+ - **实现与 spec 偏差** → 测试按代码实际行为写(要能跑过),偏差记录在报告里,汇报时提示用户。
120
+ - **纯文档/配置需求** → 检测到测试规格无可测场景 → 提示"规格里无可测场景,不建议继续"并退出。
121
+
122
+ ## 不做的事
123
+
124
+ - 不写业务实现代码(那是 implementation 的事)
125
+ - 不现场派生测试场景(那是 write-unit-test-spec 的事,本 skill 找不到规格就退出)
126
+ - 不修实现代码(失败如实报告)
127
+ - 不假装通过(断言不调到假绿)
128
+ - 不引入硬 gate(precommit hook / 提交拦截)
129
+ - 不假设测试框架(从测试规格的骨架映射读,或运行时探测)
130
+ - 不改 write-unit-test-spec / implementation / write-plan(它们对本 skill 零依赖)
131
+
132
+ ## 和其他 skill 的关系
133
+
134
+ - **write-unit-test-spec**:上游,提供测试规格文档。本 skill 找不到它就退出。
135
+ - **implementation**:平行线路,写业务实现。本 skill 读它的产物(代码),但不调它。
136
+ - **run-api-test**:不同类型的测试(接口测试 vs 单元测试),互不干涉。