specline 1.3.4 → 2.0.0

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.
Files changed (82) hide show
  1. package/README.md +132 -125
  2. package/adapters/claude/deploy.json +12 -0
  3. package/adapters/claude/hooks/hooks.json +12 -0
  4. package/adapters/claude/hooks.json +12 -0
  5. package/adapters/claude/orchestration.md +17 -0
  6. package/adapters/codex/agent.toml.hbs +7 -0
  7. package/adapters/codex/deploy.json +12 -0
  8. package/adapters/codex/hooks.json +12 -0
  9. package/adapters/codex/orchestration.md +18 -0
  10. package/adapters/cursor/deploy.json +12 -0
  11. package/adapters/cursor/hooks.json +9 -0
  12. package/adapters/cursor/orchestration.md +17 -0
  13. package/adapters/opencode/deploy.json +12 -0
  14. package/adapters/opencode/orchestration.md +18 -0
  15. package/adapters/opencode/plugin.js +10 -0
  16. package/cli.mjs +161 -558
  17. package/core/agents/specline-backend-dev.yaml +45 -0
  18. package/core/agents/specline-code-reviewer.yaml +67 -0
  19. package/core/agents/specline-config-dev.yaml +50 -0
  20. package/core/agents/specline-config-reviewer.yaml +70 -0
  21. package/core/agents/specline-explore-assistant.yaml +79 -0
  22. package/core/agents/specline-frontend-dev.yaml +45 -0
  23. package/core/agents/specline-spec-creator.yaml +58 -0
  24. package/core/agents/specline-spec-reviewer.yaml +58 -0
  25. package/core/agents/specline-test-runner.yaml +62 -0
  26. package/core/agents/specline-test-writer.yaml +67 -0
  27. package/core/bootstrap/using-specline.md +14 -0
  28. package/core/gates/pipeline-gate-checks/a1-covers-ref.sh +125 -0
  29. package/core/gates/pipeline-gate-checks/a2-a3-reverse.sh +171 -0
  30. package/core/gates/pipeline-gate-checks/c1-exception.sh +71 -0
  31. package/core/gates/pipeline-gate-checks/c2-vague.sh +60 -0
  32. package/core/gates/pipeline-gate-checks/common.sh +68 -0
  33. package/core/gates/pipeline-gate-checks/d1-cycle.sh +149 -0
  34. package/core/gates/pipeline-gate-checks/d3-type-file.sh +260 -0
  35. package/core/gates/pipeline-gate.sh +1456 -0
  36. package/core/hooks/session-start.sh +259 -0
  37. package/core/skills/specline-apply-change/SKILL.md +197 -0
  38. package/core/skills/specline-archive-change/SKILL.md +173 -0
  39. package/core/skills/specline-explore/SKILL.md +504 -0
  40. package/core/skills/specline-knowledge/SKILL.md +539 -0
  41. package/core/skills/specline-pipeline/SKILL.md +604 -0
  42. package/core/skills/specline-pipeline/references/error-recovery-details.md +49 -0
  43. package/core/skills/specline-pipeline/references/event-log-spec.md +59 -0
  44. package/core/skills/specline-pipeline/references/pipeline-state-schema.md +87 -0
  45. package/core/skills/specline-pipeline/templates/subagent-prompts.md +397 -0
  46. package/core/skills/specline-propose/SKILL.md +186 -0
  47. package/core/skills/specline-quickfix/SKILL.md +289 -0
  48. package/core/templates/AGENTS.md.hbs +5 -0
  49. package/core/templates/specline/config.yaml +15 -0
  50. package/lib/deploy-claude.mjs +80 -0
  51. package/lib/deploy-codex.mjs +77 -0
  52. package/lib/deploy-opencode.mjs +93 -0
  53. package/lib/deploy.mjs +668 -0
  54. package/lib/gate.mjs +103 -0
  55. package/lib/hash.mjs +13 -0
  56. package/lib/hook.mjs +105 -0
  57. package/lib/init.mjs +122 -0
  58. package/lib/lock.mjs +99 -0
  59. package/lib/merge.mjs +184 -0
  60. package/lib/paths.mjs +40 -0
  61. package/lib/platforms.mjs +74 -0
  62. package/lib/render-agents.mjs +88 -0
  63. package/lib/render.mjs +126 -0
  64. package/lib/sync.mjs +253 -0
  65. package/lib/tty-select.mjs +89 -0
  66. package/package.json +4 -1
  67. package/templates/.cursor/README.md +18 -0
  68. package/templates/.cursor/agents/specline-code-reviewer.md +63 -4
  69. package/templates/.cursor/agents/specline-spec-creator.md +120 -1
  70. package/templates/.cursor/agents/specline-spec-reviewer.md +21 -2
  71. package/templates/.cursor/agents/specline-test-runner.md +10 -1
  72. package/templates/.cursor/agents/specline-test-writer.md +58 -7
  73. package/templates/.cursor/hooks/specline-pipeline-gate-checks/a2-a3-reverse.sh +1 -1
  74. package/templates/.cursor/hooks/specline-pipeline-gate.sh +118 -0
  75. package/templates/.cursor/skills/specline-apply-change/SKILL.md +26 -0
  76. package/templates/.cursor/skills/specline-archive-change/SKILL.md +24 -0
  77. package/templates/.cursor/skills/specline-explore/SKILL.md +17 -0
  78. package/templates/.cursor/skills/specline-knowledge/SKILL.md +539 -0
  79. package/templates/.cursor/skills/specline-pipeline/SKILL.md +102 -3
  80. package/templates/.cursor/skills/specline-pipeline/templates/subagent-prompts.md +32 -0
  81. package/templates/.cursor/skills/specline-propose/SKILL.md +34 -3
  82. package/templates/.cursor/skills/specline-quickfix/SKILL.md +26 -0
@@ -0,0 +1,539 @@
1
+ ---
2
+ name: specline-knowledge
3
+ description: >-
4
+ 面向 AI 的项目知识库管理。检测 AGENTS.md 入口文件,追踪引用的知识文件链,
5
+ 对比代码自行判断新鲜度,按需生成/更新六类知识文件(术语表/架构/约定/决策/参考/操作指南)。
6
+ Use when the user wants to check, generate, or update AI-oriented project knowledge files.
7
+ ---
8
+
9
+ # /specline-knowledge 知识库管理 Skill
10
+
11
+ ---
12
+
13
+ ## Layer 1: 速览与定位
14
+
15
+ **一句话定位**:管理面向 AI 的项目知识库——找入口、查新鲜度、按需生成六类知识文件。
16
+
17
+ **入口**:`/specline-knowledge [可选: 文件名]`
18
+
19
+ **你做**:
20
+
21
+ - 定位 AGENTS.md(或 CLAUDE.md / CURSOR.md)
22
+ - 解析入口文件中的知识文件引用链
23
+ - 读取源文件,自行对比判断每个知识文件的新鲜度
24
+ - 按用户选择生成/更新六类知识文件
25
+
26
+ **你不做**:
27
+
28
+ - 往知识文件中添加任何元数据(哈希、时间戳、front matter)
29
+ - 与 pipeline / quickfix 自动联动
30
+ - 修改项目源代码
31
+
32
+ **核心原则**:知识文件是 AI 的速览地图,不是完整文档。新鲜度由 AI 阅读理解判断,不由时间戳驱动。
33
+
34
+ ---
35
+
36
+ ## Layer 2: Happy Path
37
+
38
+ ### Step 1: 定位入口文件
39
+
40
+ 按优先级搜索项目根目录:
41
+
42
+ ```text
43
+ AGENTS.md → CLAUDE.md → CURSOR.md → .cursor/rules/
44
+ ```
45
+
46
+ **找到入口文件**:
47
+
48
+ - 读取内容,提取其中的 markdown 链接 `[text](path)` 作为知识文件引用链
49
+ - 进入 Step 2
50
+
51
+ **未找到任何入口文件**:
52
+
53
+ - 提示用户:「未找到 AGENTS.md 或其他入口文件。是否需要我创建一个?入口文件是知识库的导航地图,记录所有知识文件的位置。」
54
+ - 用户确认 → 使用下方 `agents-entry-template` 创建 AGENTS.md(只创建入口文件,不立即生成子知识文件)
55
+ - 用户拒绝 → 结束,提示可随时再次调用
56
+
57
+ **多个入口文件并存**:
58
+
59
+ - 列出所有存在的入口文件及其位置
60
+ - 询问用户以哪个为主入口
61
+
62
+ ---
63
+
64
+ ### Step 2: 解析知识文件
65
+
66
+ 如果用户传入了文件名参数(如 `/specline-knowledge architecture.md`),只检查该文件。
67
+
68
+ 否则,扫描入口文件中的引用链 + `docs/knowledge/` 目录:
69
+
70
+ **引用链解析**:
71
+
72
+ - 提取入口文件中所有 `[text](相对路径)` 格式的链接
73
+ - 过滤出指向知识文件类型的链接(`.md` 文件)
74
+ - 逐文件追踪引用(如果被引用的文件内部又有链接,递归追踪)
75
+
76
+ **目录扫描**:
77
+
78
+ - 检查 `docs/knowledge/` 目录下所有 `.md` 文件
79
+ - 如果文件存在但入口文件无引用 → 标记为「孤儿知识文件」
80
+
81
+ **展示给用户**:
82
+
83
+ ```text
84
+ 知识库状态:
85
+ ✅ docs/knowledge/glossary.md — 新鲜
86
+ ⚠️ docs/knowledge/architecture.md — 部分过时(src/auth/ 路径已变更)
87
+ ⚠️ docs/knowledge/reference.md — 缺失(入口引用了但文件不存在)
88
+
89
+ 孤儿文件(未被入口引用):
90
+ 📄 docs/knowledge/old-notes.md — 存在但不在 AGENTS.md 中
91
+ ```
92
+
93
+ ---
94
+
95
+ ### Step 3: 判断新鲜度
96
+
97
+ **不做任何额外的技术检测**——不加哈希、不加时间戳、不加 front matter。
98
+
99
+ 做法:
100
+
101
+ 1. 读取知识文件的内容
102
+ 2. 找出文件中描述的核心模块/文件/概念
103
+ 3. 直接读取对应的源代码文件
104
+ 4. AI 自行对比:知识描述和实际代码还匹配吗?
105
+
106
+ **标记规则**:
107
+
108
+ | 标记 | 含义 | 触发条件 |
109
+ |------|------|---------|
110
+ | ✅ 新鲜 | 描述与代码一致 | 提到的模块存在、结构正确、接口匹配 |
111
+ | ⚠️ 部分过时 | 部分内容不准确 | 路径变了、函数重命名了、部分描述不对 |
112
+ | ❌ 严重过时 | 大部分不匹配 | 被引用的文件不存在、架构发生根本变化 |
113
+
114
+ **新鲜度判断提示词**(每次判断时在脑中执行):
115
+
116
+ > 这个知识文件中描述的模块路径、接口签名、概念定义,和我刚读完的源代码还一致吗?如果不一致,差异有多大?
117
+
118
+ ---
119
+
120
+ ### Step 4: 生成/更新知识文件
121
+
122
+ **展示可选列表**,让用户勾选需要的类型:
123
+
124
+ ```text
125
+ 可生成的知识文件:
126
+ [ ] GLOSSARY — 从代码中推断术语定义
127
+ [ ] ARCHITECTURE — 从目录结构和 import 关系分析
128
+ [ ] CONVENTIONS — 从代码风格和配置中提取约定
129
+ [ ] DECISIONS — 从已归档 change 的 design.md 提取
130
+ [ ] REFERENCE — 从导出函数、CLI 参数提取关键接口
131
+ [ ] HOWTOS — 从 scripts/ 和常见模式提取操作指南
132
+
133
+ 默认路径:docs/knowledge/
134
+ ```
135
+
136
+ **用户选择后**,按下方模板为每种类型生成内容。
137
+
138
+ **生成原则**:
139
+ - 知识文件是纯 Markdown,无 front matter / 元数据
140
+ - 只基于代码中真实存在的内容推断
141
+ - 不确定的地方加上 `<!-- UNVERIFIED: 描述 -->` 注释
142
+ - 每个关键陈述尽量暗示推断来源
143
+ - 内容控制在给 AI 速览的粒度,不写成完整文档
144
+
145
+ **更新策略**:
146
+ - 已有文件被判定为 ⚠️ 或 ❌ → 询问「保留手写版本 / 用 AI 重新生成 / 跳过」
147
+ - 目标文件不存在 → 直接生成
148
+
149
+ ---
150
+
151
+ ### Step 5: 更新入口文件
152
+
153
+ 生成/更新知识文件后,检查 AGENTS.md 是否包含对应的引用:
154
+
155
+ - 无需引用的文件 → 追加引用到 AGENTS.md 的对应章节
156
+ - 已有引用 → 确认路径是否正确
157
+
158
+ ```markdown
159
+ # AGENTS.md 中追加的格式:
160
+
161
+ ## 系统架构
162
+ - [架构说明](docs/knowledge/architecture.md)
163
+ ```
164
+
165
+ **冲突处理**:
166
+
167
+ | 场景 | 处理 |
168
+ |------|------|
169
+ | AGENTS.md 已有内容(非 Specline 创建) | 追加知识索引段落到末尾,不覆盖原有内容 |
170
+ | 知识文件存在但 AGENTS 无引用 | 提示「孤儿文件」,询问是否纳入管理 |
171
+ | 用户手动删了引用 | 不自动恢复,下次扫描时提示 |
172
+
173
+ ---
174
+
175
+ ## Layer 3: 六类知识文件详解
176
+
177
+ ### 术语表 (GLOSSARY)
178
+
179
+ **文件**:`docs/knowledge/glossary.md`
180
+
181
+ **推断来源**:
182
+ - `type` / `interface` / `class` / `enum` 定义
183
+ - README 中的概念说明
184
+ - spec 文档中的术语
185
+
186
+ **生成内容**:
187
+
188
+ ```markdown
189
+ # 术语表
190
+
191
+ <!-- 以下术语从项目代码中推断,基于类型定义和文档中出现的概念 -->
192
+
193
+ ## <概念名>
194
+ - **是什么**:一句话定义
195
+ - **在哪里**:定义位置(文件:行号)
196
+ - **相关术语**:关联的其他概念
197
+ ```
198
+
199
+ **示例**(以本项目为例):
200
+
201
+ ```markdown
202
+ # 术语表
203
+
204
+ ## Template
205
+ - **是什么**:Specline 的源文件目录(templates/.cursor/),npm 发布时打包
206
+ - **在哪里**:项目根目录 templates/
207
+ - **相关术语**:.cursor/(运行时副本)、sync(同步机制)
208
+
209
+ ## Change
210
+ - **是什么**:Specline 中的一次变更单元,包含 proposal/design/tasks/specs
211
+ - **在哪里**:specline/changes/<name>/
212
+ - **相关术语**:Pipeline、Archive、Gate
213
+ ```
214
+
215
+ ---
216
+
217
+ ### 系统架构 (ARCHITECTURE)
218
+
219
+ **文件**:`docs/knowledge/architecture.md`
220
+
221
+ **推断来源**:
222
+ - 顶级目录结构
223
+ - 模块间 import 关系
224
+ - package.json / requirements.txt / go.mod 依赖
225
+ - tsconfig / 项目配置中的模块映射
226
+
227
+ **生成内容**:
228
+
229
+ ```markdown
230
+ # 系统架构
231
+
232
+ ## 模块地图
233
+
234
+ ### <模块路径> — <模块名>
235
+ <一句话职责描述>
236
+ - 入口: <入口文件>
237
+ - 依赖: <依赖的模块>
238
+ - 被依赖: <哪些模块依赖它>
239
+
240
+ ## 依赖关系图
241
+
242
+ \`\`\`
243
+ <ASCII 依赖图>
244
+ \`\`\`
245
+ ```
246
+
247
+ ---
248
+
249
+ ### 编码约定 (CONVENTIONS)
250
+
251
+ **文件**:`docs/knowledge/conventions.md`
252
+
253
+ **推断来源**:
254
+ - `.eslintrc` / `.prettierrc` / `pyproject.toml` 等配置
255
+ - 代码风格的一致性模式
256
+ - 已有的 `.cursor/rules/` 中的规则
257
+ - 错误处理模式、命名约定等
258
+
259
+ **生成内容**:
260
+
261
+ ```markdown
262
+ # 编码约定
263
+
264
+ ## 代码风格
265
+ - <从配置文件提取的规则>
266
+
267
+ ## 命名约定
268
+ - <从代码模式推断的命名习惯>
269
+
270
+ ## 错误处理
271
+ - <从代码推断的错误处理模式>
272
+
273
+ ## 已有规则
274
+ - <引用 .cursor/rules/ 中的规则文件>
275
+ ```
276
+
277
+ ---
278
+
279
+ ### 设计决策 (DECISIONS)
280
+
281
+ **文件**:`docs/knowledge/decisions/<YYYY-MM-DD-<title>>.md`
282
+
283
+ **推断来源**:
284
+ - `specline/changes/archive/` 中已归档 change 的 `design.md`
285
+ - 如果项目不使用 Specline → 跳过此类
286
+
287
+ **生成内容**:
288
+
289
+ ```markdown
290
+ # <决策标题>
291
+
292
+ - **日期**:YYYY-MM-DD
293
+ - **状态**:已采纳
294
+ - **决策**:<我们做了什么选择>
295
+ - **理由**:<为什么这么选>
296
+ - **替代方案**:<考虑过但放弃的方案及其被放弃的原因>
297
+ - **来源**:<从哪个 change 的 design.md 提取>
298
+ ```
299
+
300
+ ---
301
+
302
+ ### API 参考 (REFERENCE)
303
+
304
+ **文件**:`docs/knowledge/reference.md`
305
+
306
+ **推断来源**:
307
+ - 导出函数/类/接口的签名
308
+ - CLI 参数定义
309
+ - 配置文件 schema
310
+ - 关键常量和枚举
311
+
312
+ **生成内容**:
313
+
314
+ ```markdown
315
+ # 关键接口参考
316
+
317
+ ## <函数名 / 类名>
318
+ - **签名**:\`functionName(param: Type) => ReturnType\`
319
+ - **用途**:一句话描述
320
+ - **位置**:文件:行号
321
+ ```
322
+
323
+ **示例**:
324
+
325
+ ```markdown
326
+ # 关键接口参考
327
+
328
+ ## specline-pipeline-gate.sh
329
+ - **入口**:\`specline-pipeline-gate.sh <action> [--change <name>]\`
330
+ - **支持动作**:list / bind / unbind / new / artifacts / check
331
+ - **位置**:.cursor/hooks/specline-pipeline-gate.sh
332
+ ```
333
+
334
+ ---
335
+
336
+ ### 操作指南 (HOWTOS)
337
+
338
+ **文件**:`docs/knowledge/howtos/<主题>.md`
339
+
340
+ **推断来源**:
341
+ - `scripts/` 目录下的脚本
342
+ - package.json 中的 npm scripts
343
+ - README 中的操作说明
344
+
345
+ **生成内容**:
346
+
347
+ ```markdown
348
+ # <操作名称>
349
+
350
+ ## 背景
351
+ <什么时候需要做这个操作>
352
+
353
+ ## 步骤
354
+
355
+ ### 1. <步骤名称>
356
+ \`\`\`bash
357
+ <命令>
358
+ \`\`\`
359
+ <预期输出>
360
+
361
+ ### 2. <步骤名称>
362
+ ...
363
+ ```
364
+
365
+ ---
366
+
367
+ ## Layer 4: 模板
368
+
369
+ 以下模板在生成对应文件时使用。
370
+
371
+ ### AGENTS.md 入口模板
372
+
373
+ ```markdown
374
+ # Project Knowledge Index
375
+
376
+ > 本文件是面向 AI 的项目知识库导航地图。每个 AI agent 应首先阅读本文件以了解项目上下文。
377
+ > 由 specline-knowledge 管理。
378
+
379
+ ## 系统架构
380
+ - [架构说明](docs/knowledge/architecture.md)
381
+
382
+ ## 术语表
383
+ - [术语定义](docs/knowledge/glossary.md)
384
+
385
+ ## 编码约定
386
+ - [代码约定](docs/knowledge/conventions.md)
387
+
388
+ ## 设计决策
389
+ - [决策记录](docs/knowledge/decisions/)
390
+
391
+ ## API 参考
392
+ - [关键接口](docs/knowledge/reference.md)
393
+
394
+ ## 操作指南
395
+ - [操作指南](docs/knowledge/howtos/)
396
+ ```
397
+
398
+ ### 术语表模板
399
+
400
+ ```markdown
401
+ # 术语表
402
+
403
+ <!-- 以下术语从项目代码中推断生成 -->
404
+
405
+ ## <概念名>
406
+ - **是什么**:<一句话定义>
407
+ - **在哪定义**:<文件路径:行号>
408
+ - **相关术语**:<关联概念>
409
+ ```
410
+
411
+ ### 架构模板
412
+
413
+ ```markdown
414
+ # 系统架构
415
+
416
+ <!-- 以下架构从目录结构和 import 关系推断 -->
417
+
418
+ ## 项目结构
419
+
420
+ \`\`\`
421
+ <顶级目录树>
422
+ \`\`\`
423
+
424
+ ## 模块地图
425
+
426
+ ### <模块路径> — <模块名称>
427
+ <职责描述>
428
+ - **入口**:<文件>
429
+ - **依赖**:<列表>
430
+ ```
431
+
432
+ ### 约定模板
433
+
434
+ ```markdown
435
+ # 编码约定
436
+
437
+ <!-- 以下约定从代码风格、配置文件和一致性模式中推断 -->
438
+
439
+ ## 代码风格
440
+ - <规则>
441
+
442
+ ## 命名约定
443
+ - <约定>
444
+
445
+ ## 错误处理
446
+ - <模式>
447
+ ```
448
+
449
+ ### 决策记录模板
450
+
451
+ ```markdown
452
+ # <决策标题>
453
+
454
+ - **日期**:YYYY-MM-DD
455
+ - **状态**:已采纳
456
+ - **决策**:<内容>
457
+ - **理由**:<原因>
458
+ - **替代方案**:<被放弃的方案及理由>
459
+ - **来源**:<源文档路径>
460
+ ```
461
+
462
+ ### 参考模板
463
+
464
+ ```markdown
465
+ # 关键接口参考
466
+
467
+ <!-- 以下接口从代码导出中提取 -->
468
+
469
+ ## <名称>
470
+ - **签名**:\`<signature>\`
471
+ - **用途**:<描述>
472
+ - **位置**:<文件:行号>
473
+ ```
474
+
475
+ ### 操作指南模板
476
+
477
+ ```markdown
478
+ # <操作名称>
479
+
480
+ ## 背景
481
+ <何时需要此操作>
482
+
483
+ ## 步骤
484
+ 1. \`\`\`bash
485
+ <命令>
486
+ \`\`\`
487
+
488
+ ## 常见问题
489
+ - <问题及解决>
490
+ ```
491
+
492
+ ---
493
+
494
+ ## Layer 5: 异常与边界
495
+
496
+ ### 边界判断
497
+
498
+ | 情况 | 处理方式 |
499
+ |------|---------|
500
+ | 入口文件不存在且用户拒绝创建 | 结束,提示可随时再次调用 |
501
+ | 入口文件存在但无任何引用链接 | 提示「入口文件未包含任何知识文件引用」,询问是否扫描 `docs/knowledge/` 目录 |
502
+ | 知识文件全部新鲜 | 报告「所有知识文件均为最新 ✓」,结束 |
503
+ | 用户传入的文件参数不存在 | 提示「文件 X 不在入口文件的引用链中」,列出已引用的文件供选择 |
504
+ | AGENTS.md 已有非 specline-knowledge 内容 | 追加知识索引段落,不覆盖原有内容 |
505
+ | 知识文件存在但缺少入口引用 | 标记为孤儿文件,询问是否纳入管理 |
506
+ | 用户手写了知识文件(无 AI 生成标记) | AI 仍可判断新鲜度(读代码对比),更新时询问保留/替换/合并 |
507
+ | 用户项目不使用 Specline(无 changes/archive/) | DECISIONS 类型自动跳过,提示原因 |
508
+ | 项目无 package.json / 无显式模块结构 | ARCHITECTURE 类型降级为目录树 + 文件说明 |
509
+ | 项目代码量极小(< 10 源文件) | 提示「项目规模较小,知识文件可能收益有限」,仍允许生成 |
510
+
511
+ ---
512
+
513
+ ## Anti-Rationalization 表格
514
+
515
+ | 借口 | 现实 |
516
+ |------|------|
517
+ | 「AI 直接读代码就行,不需要知识文件」 | 代码能告诉你"是什么",但"为什么"和"全局关系"散落在各处。知识文件给 AI 一张速览地图,节省每次重新扫描的 token 和时间。 |
518
+ | 「新鲜度让用户自己判断吧」 | 用户很难记住「glossary.md 引用了哪几个源文件,那些文件改了没」。AI 并行读取对比是自然优势。 |
519
+ | 「ALL 知识文件都生成一遍,一步到位」 | 不同项目需要不同类型的知识。小型脚本可能只需要 GLOSSARY,大型 monorepo 需要全部六类。让用户选择,别替用户决定。 |
520
+ | 「判断新鲜度时保守一点,不确定就标记 ⚠️」 | 频繁的假过期警报会让用户不信任标记。只有确实发现不一致时才标记 ⚠️,无法判断就说「无法判断」。 |
521
+ | 「给知识文件加上时间戳/hash 更精确」 | 额外的元数据增加认知负担和维护成本。AI 阅读对比代码已经足够好,简单方案就是好方案。 |
522
+ | 「这个文件和 AGENTS.md 的链接断了,自动修」 | AGENTS.md 是用户的主入口文件。自动修改可能覆盖用户的手动编排意图。提示用户,让用户决定。 |
523
+
524
+ ---
525
+
526
+ ## Verification Checklist
527
+
528
+ 技能实现完成后,自查:
529
+
530
+ - [ ] 入口文件检测优先级正确:AGENTS.md → CLAUDE.md → CURSOR.md → .cursor/rules/
531
+ - [ ] 能正确解析 markdown 链接 `[text](path)` 作为引用链
532
+ - [ ] 新鲜度判断仅靠 AI 阅读理解对比,不添加任何元数据
533
+ - [ ] 六类知识文件(GLOSSARY/ARCHITECTURE/CONVENTIONS/DECISIONS/REFERENCE/HOWTOS)全部支持
534
+ - [ ] 生成的知识文件为纯 Markdown,无 front matter / 元数据
535
+ - [ ] 不确定的内容标记了 `<!-- UNVERIFIED -->`
536
+ - [ ] 与 pipeline/quickfix 无联动,纯手动触发
537
+ - [ ] 支持按需检查(指定文件名)和全量扫描两种模式
538
+ - [ ] 冲突处理覆盖:已有入口文件、已有同名知识文件、孤儿文件
539
+ - [ ] 未覆盖/不适用的情况有降级策略(代码量极小、无模块结构等)
@@ -72,6 +72,73 @@ Session 通过 `specline-pipeline-gate.sh bind <session_id> <change>` 绑定到
72
72
 
73
73
  ---
74
74
 
75
+ ## Core Operating Behaviors
76
+
77
+ 以下守则对编排者自身和所有派发的子 Agent 均生效。编排者在决策(跳过 Gate、手动修复、忽略警告)时同样接受这些守则的约束。
78
+
79
+ ### 1. Surface Assumptions
80
+
81
+ 执行任何非平凡操作前,显式列出假设:
82
+
83
+ ```
84
+ ASSUMPTIONS I'M MAKING:
85
+ 1. [关于需求的假设]
86
+ 2. [关于架构的假设]
87
+ 3. [关于范围的假设]
88
+ → 现在纠正,否则我将按这些假设继续。
89
+ ```
90
+
91
+ 不要默默填补模糊需求。错误的假设是最昂贵的返工来源。
92
+
93
+ ### 2. Manage Confusion Actively
94
+
95
+ 遇到矛盾、冲突需求或模糊规范时:
96
+
97
+ 1. **STOP** — 不要猜
98
+ 2. 明确命名具体困惑点
99
+ 3. 呈现权衡或提出澄清问题
100
+ 4. 等待解决后再继续
101
+
102
+ **错误做法**:默默选择一种解释,祈祷它是正确的。
103
+ **正确做法**:"Spec 说 X 但现有代码是 Y。以哪个为准?"
104
+
105
+ ### 3. Push Back When Warranted
106
+
107
+ 你不是应声虫。当一个方案有明显问题时:
108
+
109
+ - 直接指出问题
110
+ - 解释具体代价(量化:"这会增加 ~200ms 延迟",而非"可能变慢")
111
+ - 提出替代方案
112
+ - 如果用户在有完整信息的情况下仍然坚持,接受决定
113
+
114
+ 谄媚是失败模式。"当然可以!"然后实现一个糟糕的方案对谁都没好处。
115
+
116
+ ### 4. Enforce Simplicity
117
+
118
+ 主动抵抗复杂化的自然倾向。完成任何实现前问自己:
119
+
120
+ - 可以用更少的行数实现吗?
121
+ - 这些抽象真的值得它们的复杂度吗?
122
+ - 一个资深工程师看了会说"你为什么不直接……"吗?
123
+
124
+ 1000 行能做的事用了 100 行是成功,100 行能做的事用了 1000 行是失败。
125
+
126
+ ### 5. Maintain Scope Discipline
127
+
128
+ 只碰你被要求碰的。不:
129
+ - "清理"与你任务无关的代码
130
+ - 顺便重构相邻系统
131
+ - 删除看起来没用的代码(未经明确批准)
132
+ - 添加 Spec 中没有的"看起来有用"的功能
133
+
134
+ 你的工作是外科手术式精确修改,不是主动翻新。
135
+
136
+ ### 6. Verify, Don't Assume
137
+
138
+ "看起来对"永远不够——必须有证据(通过的测试、构建输出、运行时数据)。编排者自身在 Gate 决策中也不例外:Gate 脚本的 exit code 是唯一判断依据,"看着应该通过了"不算数。
139
+
140
+ ---
141
+
75
142
  ## Layer 2: Happy Path — 新建流水线
76
143
 
77
144
  ### Phase 1: SPEC
@@ -149,7 +216,7 @@ Human Gate 1 具体交互:使用 `AskUserQuestion`,title="确认 Spec 和任
149
216
 
150
217
  ### Phase 2: CODING
151
218
 
152
- > **并行加速**:Human Gate 1 通过后,**同时**启动 coding 和 specline-test-writer。specline-test-writer 是黑盒的——只需要 Spec 文档,不需要实现代码。两者并行可节省 specline-test-writer 的编写时间。
219
+ > **并行加速**:Human Gate 1 通过后,**同时**启动 coding 和 specline-test-writer。specline-test-writer 是黑盒的——读取 Spec(验收标准)和 design.md(对外接口契约),不需要实现代码。两者并行可节省 specline-test-writer 的编写时间。
153
220
 
154
221
  #### Step 6: 并行启动(test-writer + DAG 构建)
155
222
 
@@ -171,7 +238,7 @@ Track A 和 Track B 同时启动,互不阻塞。test-writer 在 Coding 全部
171
238
 
172
239
  **6a. 启动 specline-test-writer(与 Coding 阶段 Agent 同时启动)**:
173
240
 
174
- 使用 Task 工具,subagent_type="specline-test-writer",prompt 中包含 changeName/Spec/Tasks 路径和黑盒约束。specline-test-writer 只编写 tests/integration/** 和 tests/e2e/** 下的测试,产出 test-code-result.json。
241
+ 使用 Task 工具,subagent_type="specline-test-writer",prompt 中包含 changeName/Spec/Design/Tasks 路径和黑盒约束。test-writer 从 `design.md` 的「对外接口契约」章节获取 CLI 命令/HTTP 端点/模块导出签名(若章节不存在则在 prompt 中注明无需契约),从 spec.md 获取行为验收标准(WHEN/THEN)。specline-test-writer 只编写 tests/integration/** 和 tests/e2e/** 下的测试,产出 test-code-result.json。
175
242
 
176
243
  **6b. 解析 tasks.md,构建任务 DAG**:
177
244
 
@@ -246,6 +313,10 @@ sed -i '' "s/^## ${task_id}\. \[ \]/## ${task_id}. [x]/" specline/changes/<name>
246
313
  Build Gate 校验内容:
247
314
  - 编译/语法检查(原有逻辑)
248
315
  - **单元测试文件存在性检查**(新增):对 Testable=true 的任务,检查其 `tests/unit/` 和 `tests/models/` 下的单元测试文件是否存在且语法正确。如果 Testable=true 的任务未产出对应测试文件,Build Gate 失败
316
+ - **对外接口契约签名检查**(新增):以 tasks.md 为决策源头——仅当 tasks.md 末尾「测试文件归属」表格中存在 specline-test-writer 负责的测试时,才检查 design.md 的「对外接口契约」章节:
317
+ - 有 test-writer 任务但缺契约章节 → 阻断(报错:缺契约)
318
+ - 有契约 → 逐项检查 CLI 命令注册、HTTP 路径注册、模块导出声明是否存在(只检查签名存在性,不检查语义正确性)
319
+ - 无 test-writer 任务 → 跳过
249
320
 
250
321
  exit code 0 = 通过,进入 Phase 3。失败处理见 [Layer 3: Build Gate 失败处理](#build-gate-失败处理)。
251
322
 
@@ -309,7 +380,7 @@ specline-test-writer 已在 Phase 2(Step 6a)与 Coding 并行启动。进入
309
380
 
310
381
  > `test_framework` 写入状态文件后,后续 `specline-pipeline-gate.sh` 的 test gate 会自动读取并选择正确的测试命令(Jest/pytest/go test 等)。
311
382
 
312
- > **黑盒约束回顾**:specline-test-writer 只能基于 Spec 文档编写测试,不能读取任何实现源代码。specline-test-writer 会自动检测项目测试框架(Jest/pytest/go test 等),按项目实际语言编写测试。
383
+ > **黑盒约束回顾**:specline-test-writer 只能基于 Spec 文档(验收标准)和 design.md 的「对外接口契约」章节(接口签名)编写测试,不能读取任何实现源代码。specline-test-writer 会自动检测项目测试框架(Jest/pytest/go test 等),按项目实际语言编写测试。
313
384
 
314
385
  #### Step 13: 测试门禁链(串行)
315
386
 
@@ -353,6 +424,7 @@ specline-pipeline-gate.sh archive --execute --change "<name>"
353
424
  4. **Gate 重置**:`jq '...gate.passed = null' "$STATE_FILE"`
354
425
  5. **特殊规则**:
355
426
  - `spec_ambiguity` → 暂停流水线展示模糊点(minimal/none 策略下降级为 WARNING)
427
+ - `contract_mismatch` → 优先回 coding agent 按契约修正(最多 2 次);2 次后仍不一致 → 暂停并报告用户确认
356
428
  - 接口不兼容 → 只重置受影响的下游任务(保留未受影响任务的状态)
357
429
  - Hook 阻断 → 先诊断原因 → 与用户沟通(AskUserQuestion)→ 修复后重试 → 绝不静默降级
358
430
  - 测试失败优先级:单元测试优先于集成/E2E
@@ -375,6 +447,7 @@ specline-pipeline-gate.sh archive --execute --change "<name>"
375
447
  - **集成/E2E 测试失败**(`tests/integration/` / `tests/e2e/`):先判断是测试代码还是实现代码问题
376
448
  - 测试代码问题 → specline-test-writer 自修(最多 2 次)
377
449
  - 实现代码问题 → Covers 追溯定位 → 回 coding agent 修复 → 用影响范围算法重置受影响 Gate
450
+ - **契约不一致** (`contract_mismatch`):实现代码的对外接口与 design.md 契约不一致 → 优先回 coding agent 按契约修正代码(最多 2 次);若 2 次后仍不一致,暂停并报告用户确认以 design.md 契约为准还是以代码为准
378
451
  - Gate 重置:`.phases.test.sub_phases.integration.gates.test_integration_gate.passed = null | .phases.test.sub_phases.e2e.gates.test_e2e_gate.passed = null`
379
452
  - **优先级**:单元测试失败优先修复;代码修复后所有测试 Gate 全部重置
380
453
 
@@ -515,3 +588,29 @@ AskUserQuestion({
515
588
  - State Schema → 详见 `references/pipeline-state-schema.md`
516
589
  - Event Log → 详见 `references/event-log-spec.md`
517
590
  - Hook & Constraints → 详见 `references/error-recovery-details.md`
591
+
592
+ ---
593
+
594
+ ## Anti-Rationalization 表格
595
+
596
+ 编排者在运作流水线时会找借口跳过步骤。以下是常见借口及其反驳:
597
+
598
+ | 借口 | 现实 |
599
+ |------|------|
600
+ | "这需求太简单了,不需要 Spec" | 简单需求也有隐含假设。Spec 的价值在于暴露假设,与复杂度无关。 |
601
+ | "Gate 跳过一次没关系" | Gate 是确定性脚本,跳过意味着自动化防线失效。一次跳过会变成习惯。 |
602
+ | "手工改一下比回子 Agent 修复快" | 手工改绕过了 Covers 追溯链和影响范围算法,下次断点续跑会丢失上下文。 |
603
+ | "测试最后一起跑" | Bug 会复合。阶段 1 的 Bug 让阶段 2-5 的产出都不可靠。每个阶段验证,不是事后验证。 |
604
+ | "HG 确认我替用户点了吧" | Human Gate 存在是因为这些决策需要人的判断。替用户确认等于架空人机门禁。 |
605
+ | "Build 失败看起来是子 Agent 的问题,我先继续往下" | 错误会传播。修复当前阶段再向下,否则下游建立在错误的基座上。 |
606
+ | "影响范围看起来不大,全重置就行" | 接口不兼容只应重置受影响的下游任务。全重置浪费已完成的工作,且破坏断点续跑的状态完整性。 |
607
+
608
+ ## Verification Checklist
609
+
610
+ 每阶段完成后,编排者自查:
611
+
612
+ - [ ] **SPEC 阶段**:4 Artifact 齐全(proposal/design/tasks/specs);Spec Gate 通过;HG1 已确认;spec-review.json status=approved
613
+ - [ ] **CODING 阶段**:全部批次完成;每个 task 产出报告存在;tasks.md checkbox 全部 [x];Build Gate 通过(含契约签名检查);Testable=true 任务的 test_files 非空
614
+ - [ ] **CODE REVIEW 阶段**:code-review.json 存在;error 计数 = 0;Lint Gate 通过;HG2 已处理
615
+ - [ ] **TEST 阶段**:test_framework 已写入状态文件;test-unit/integration/e2e Gate 全绿
616
+ - [ ] **ARCHIVE 阶段**:HG3 已确认;归档目录已创建;session 绑定已解除;Delta spec sync 决策已完成