@bossmissing/agent-meta 0.1.0 → 0.2.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 (35) hide show
  1. package/README.md +46 -2
  2. package/assets/skills/ironbank/ironbank-citations/SKILL.md +195 -0
  3. package/assets/skills/ironbank/ironbank-docs-research/SKILL.md +205 -0
  4. package/assets/skills/ironbank/ironbank-mcp-reference/SKILL.md +413 -0
  5. package/dist/cli.js +72 -1
  6. package/dist/commands/config.d.ts +5 -0
  7. package/dist/commands/config.js +50 -0
  8. package/dist/commands/doctor.d.ts +14 -0
  9. package/dist/commands/doctor.js +187 -0
  10. package/dist/commands/init.d.ts +2 -0
  11. package/dist/commands/init.js +39 -1
  12. package/dist/commands/new-change.d.ts +12 -0
  13. package/dist/commands/new-change.js +125 -0
  14. package/dist/commands/new-domain.js +2 -0
  15. package/dist/commands/preflight.d.ts +14 -0
  16. package/dist/commands/preflight.js +103 -0
  17. package/dist/commands/review.d.ts +18 -0
  18. package/dist/commands/review.js +102 -0
  19. package/dist/core/checklist.d.ts +31 -0
  20. package/dist/core/checklist.js +43 -0
  21. package/dist/core/doc-scopes.d.ts +18 -0
  22. package/dist/core/doc-scopes.js +55 -0
  23. package/dist/core/frontmatter.d.ts +7 -0
  24. package/dist/core/frontmatter.js +35 -0
  25. package/dist/core/mcp-packs.d.ts +26 -0
  26. package/dist/core/mcp-packs.js +83 -0
  27. package/dist/generators/hook-generator.d.ts +14 -0
  28. package/dist/generators/hook-generator.js +55 -0
  29. package/dist/generators/mcp-generator.d.ts +9 -0
  30. package/dist/generators/mcp-generator.js +68 -0
  31. package/dist/templates/index.d.ts +7 -2
  32. package/dist/templates/index.js +125 -9
  33. package/dist/validators/domain-validator.js +30 -1
  34. package/dist/validators/openspec-validator.js +33 -4
  35. package/package.json +9 -15
package/README.md CHANGED
@@ -24,13 +24,18 @@ pnpm test # Vitest
24
24
 
25
25
  | 命令 | 用途 |
26
26
  | --- | --- |
27
- | `meta init` | 初始化 Agent Meta 基础结构(`--yes` 非交互,`--type`,`--dry-run`) |
27
+ | `meta init` | 初始化 Agent Meta 基础结构(`--yes` 非交互,`--type`,`--with-mcp <pack>`,`--dry-run`) |
28
28
  | `meta new-domain <name>` | 创建领域文档目录与局部 `AGENTS.md`(`--title` `--owner` `--with-state-machine` `--with-glossary` `--no-local-agents` `--force` `--dry-run`) |
29
29
  | `meta new-adr <slug>` | 自动编号创建 ADR(`--title` `--owner` `--status` `--path` `--dry-run`) |
30
30
  | `meta check` | 确定性元数据校验(`--strict` `--docs` `--adr` `--agents` `--openspec` `--json`) |
31
31
  | `meta audit` | 治理分析报告,不阻塞、不改文件(`--agents` `--docs` `--risk` `--json`) |
32
32
  | `meta sync` | 重建 `docs/domain` / `docs/adr` 索引,调用 `openspec update`(`--indexes` `--openspec` `--dry-run`) |
33
+ | `meta new-change <name>` | 创建 OpenSpec 兼容变更目录(`--domain` `--schema` `--dry-run`),高风险领域自动附带 `risk-review.md` |
34
+ | `meta doctor` | 检查运行环境:Node、包管理器、配置、路径、Git Hook、OpenSpec(`--json`) |
35
+ | `meta review` | 定期仓库 review checklist:文档 / 代码 / 测试 / 安全,能机器判定的项实时给出 ✓/✗。文档按明确范围枚举(产品 / 架构 / 接口 / 领域 / ADR / 工程规范 / Runbooks / Agent 规则 / OpenSpec),附真实文件清单;`--pick-docs` 交互式让人类确认本轮整理哪些(`--json`) |
36
+ | `meta preflight` | 上线前 checklist:自动跑 `meta check --strict`,人工项含"人类已 review 代码";`--confirm` 逐项要求人类确认,未全部确认退出码 1(`--json`) |
33
37
  | `meta config list / set` | 查看与修改 `agent-meta.config.yaml` |
38
+ | `meta config hooks lefthook` | 生成/合并 `lefthook.yml`,在 pre-commit 运行 `meta check`(`--dry-run`) |
34
39
 
35
40
  ## 退出码
36
41
 
@@ -60,6 +65,38 @@ meta new-adr withdrawal-idempotency \
60
65
  meta check --strict
61
66
  ```
62
67
 
68
+ ## 硬限制(Hard Constraints)
69
+
70
+ 硬限制是不可违反的约束(安全、数据一致性、API 契约、性能预算、兼容性、合规);没有显式声明的限制,AI 会当成可协商的。声明位置只有两处:
71
+
72
+ - 领域级:`docs/domain/<domain>/rules.md` 的 `## 硬限制(不可违反)` 章节
73
+ - 项目级:`docs/engineering/constraints.md`
74
+
75
+ 工具链全生命周期支持:`meta init` 生成容器与 AGENTS.md 规则;`meta new-change --domain <d>` 把该领域已声明的硬限制原文打印进上下文;`meta check` 对高风险领域校验硬限制非空(`HIGH_RISK_DOMAIN_MISSING_HARD_CONSTRAINTS`,warning 级,`--strict` 下阻塞);`meta review` 实测声明完整性并提醒排查漂移;`meta preflight` 上线前列出全部硬限制声明文件供人工核对。
76
+
77
+ ## MCP 工具包
78
+
79
+ `meta init` 可选安装工具包(交互式多选,或 `--with-mcp <pack>[,<pack>]` 非交互指定)。安装内容全部是项目级的,与"默认不使用全局工具"的 AGENTS.md 规则配套:
80
+
81
+ - `.mcp.json` — 项目级 MCP server 配置(合并写入,绝不覆盖已有条目)
82
+ - `.claude/settings.json` — Claude Code 插件配置(marketplace + enabledPlugins,已有值绝不覆盖)
83
+ - `.claude/skills/` — 配套 skills(已存在的文件跳过)
84
+ - `AGENTS.md` — pack 附带的使用规则(仅注入新生成的 AGENTS.md)
85
+
86
+ 当前可用的 pack:
87
+
88
+ | Pack | 安装内容 | 附带 |
89
+ | --- | --- | --- |
90
+ | `ironbank` | MCP:`https://test-ib-mcp.hillinsight.tech/mcp` | skills:ironbank-mcp-reference / ironbank-citations / ironbank-docs-research |
91
+ | `playwright` | MCP:`npx @playwright/mcp@latest`([microsoft/playwright-mcp](https://github.com/microsoft/playwright-mcp),浏览器自动化) | — |
92
+ | `superpowers` | Claude Code 插件([obra/superpowers](https://github.com/obra/superpowers),planning/TDD/debugging skills) | AGENTS.md 规则:默认不使用 brainstorming,除非人类明确要求 |
93
+
94
+ ```bash
95
+ meta init --yes --with-mcp ironbank,playwright,superpowers
96
+ ```
97
+
98
+ 安装后请提交 `.mcp.json`、`.claude/settings.json` 和 `.claude/skills/`,团队成员即可获得相同的工具配置。
99
+
63
100
  ## 模板覆盖
64
101
 
65
102
  在项目内创建 `templates/agent-meta/<name>.tmpl` 可覆盖内置模板(仅支持 `{{variable}}` 替换):
@@ -81,7 +118,7 @@ templates/agent-meta/agents.md.tmpl
81
118
  - run: pnpm exec meta check --strict
82
119
  ```
83
120
 
84
- Git Hook(lefthook):
121
+ Git Hook(lefthook)— 由 `meta config hooks lefthook` 自动生成或合并:
85
122
 
86
123
  ```yaml
87
124
  pre-commit:
@@ -89,3 +126,10 @@ pre-commit:
89
126
  meta-check:
90
127
  run: pnpm exec meta check
91
128
  ```
129
+
130
+ 环境自检:
131
+
132
+ ```bash
133
+ meta doctor # Node / 包管理器 / 配置 / 路径 / Git Hook / OpenSpec
134
+ meta doctor --json
135
+ ```
@@ -0,0 +1,195 @@
1
+ ---
2
+ name: ironbank-citations
3
+ description: |
4
+ 为 IronBank 搜索 / 检索结果提供类似 Claude Web Search 风格的内联引用注解。当用户询问任何与 IronBank 相关的问题时(包括公司内部文档、知识库、任务、笔记等),必须强制启用此 skill。触发条件:用户提问涉及 IronBank 内容(文档检索、笔记检索、任务查找等)、用户明确要求"引用来源"或"标注出处"、用户使用以下任一工具获取信息后进行问答:
5
+ - ironbank_search_all (跨内容全文 / 关键词检索)
6
+ - ironbank_docs_search (docs 文件向量检索)
7
+ - ironbank_docs_search_single (单文档向量检索)
8
+ - ironbank_docs_get_chunk (docs chunk 原文)
9
+ - ironbank_docs_get_summary (docs 文档摘要)
10
+ - ironbank_notes_search (notes / note_file 向量检索)
11
+ - ironbank_notes_search_single (单 note 文档向量检索)
12
+ - ironbank_notes_get_chunk (notes chunk 原文)
13
+ - ironbank_get_board_list
14
+ - ironbank_get_channels
15
+ - ironbank_get_channel_info
16
+ - ironbank_get_channel_activities
17
+ - ironbank_get_note_comments
18
+ - ironbank_get_note_detail (含 Markdown 正文 + 附件/元数据)
19
+ - ironbank_get_notes
20
+ - ironbank_list_recent_notes (跨任务 board 级笔记列表,可按 update_time 时间窗筛选)
21
+ - ironbank_get_recent_tasks
22
+ - ironbank_get_task_info
23
+ - ironbank_get_task_relations
24
+ - ironbank_get_tasks_by_board
25
+ 只要回答内容来源于以上任一工具的结果,就必须使用本 skill 的引用格式。即使用户没有明确要求引用,只要数据来自 IronBank,也要自动附加引用。
26
+ ---
27
+
28
+ # IronBank Citations Skill — Web Search 风格内联引用
29
+
30
+ ## 目标
31
+
32
+ 模仿 Claude Web Search 的 `` 内联引用体验,让 IronBank 搜索结果的每个关键信息点都有可点击、可追溯的来源标注。
33
+
34
+ > **强制规则**:只要回答中的信息来源于 IronBank 搜索 / 检索类工具(含 `ironbank_search_all`、`ironbank_docs_*`、`ironbank_notes_*`、`ironbank_get_note_*` 等),就必须使用本 skill 的引用格式,无需用户额外请求。
35
+
36
+ ---
37
+
38
+ ## 核心工作流
39
+
40
+ ### Step 1:搜索 / 检索 IronBank
41
+
42
+ 根据用户问题,调用合适的工具:
43
+
44
+ - **跨内容关键词搜索**:`ironbank_search_all` — 词法 / 全文检索任务、笔记、文件
45
+ - **docs 网盘语义检索**:`ironbank_docs_search` → `ironbank_docs_search_single` → `ironbank_docs_get_chunk`(向量相似 / RAG)
46
+ - **notes 笔记语义检索**:`ironbank_notes_search` → `ironbank_notes_search_single` → `ironbank_notes_get_chunk`(向量相似 / RAG,覆盖 note 与 note_file)
47
+ - **笔记正文回读**:`ironbank_get_note_detail`(含 Markdown 正文)/ `ironbank_get_note_comments`
48
+ - **笔记发现**:`ironbank_get_notes`(按频道)/ `ironbank_list_recent_notes`(按看板和时间窗)
49
+ - **任务和频道上下文**:`ironbank_get_task_info` / `ironbank_get_task_relations` / `ironbank_get_recent_tasks` / `ironbank_get_channel_info` / `ironbank_get_channel_activities`
50
+
51
+ 搜索时注意:
52
+ 1. 使用精准的关键词,必要时多次搜索以覆盖不同角度
53
+ 2. 关键词检索(search_all)擅长找具体 ID / 名字;语义检索(docs/notes_search)擅长找概念 / 释义
54
+ 3. 记录每条结果的 **id / document_id / chunk_id**、**title** 和 **snippet / content_preview**
55
+ 4. 为每条结果分配一个引用索引号(从 1 开始)
56
+
57
+ ### Step 2:构建引用索引
58
+
59
+ 将搜索结果组织为引用源列表,格式:
60
+
61
+ ```
62
+ SOURCE_1: { id: "doc_id_xxx", title: "文档标题", snippet: "搜索结果摘要..." }
63
+ SOURCE_2: { id: "doc_id_yyy", title: "另一个文档", snippet: "相关内容..." }
64
+ ```
65
+
66
+ ### Step 3:撰写带引用的回答
67
+
68
+ **引用格式规则(最关键):**
69
+
70
+ 使用上标数字角标 `[¹]` `[²]` 等标记引用,在回答末尾附上引用来源列表。
71
+
72
+ **上标字符对照表(必须严格使用以下字符,禁止使用 ④⑤⑥ 等圆圈数字):**
73
+
74
+ | 序号 | 正文角标 | 来源列表 |
75
+ |------|---------|---------|
76
+ | 1 | `[¹]` | `¹` |
77
+ | 2 | `[²]` | `²` |
78
+ | 3 | `[³]` | `³` |
79
+ | 4 | `[⁴]` | `⁴` |
80
+ | 5 | `[⁵]` | `⁵` |
81
+ | 6 | `[⁶]` | `⁶` |
82
+ | 7 | `[⁷]` | `⁷` |
83
+ | 8 | `[⁸]` | `⁸` |
84
+
85
+ **格式示例:**
86
+
87
+ ```
88
+ 根据内部文档,该项目的截止日期为3月15日[¹],负责人为张三[²]。技术方案采用了微服务架构[¹],预计需要4个开发人员参与[³]。
89
+
90
+ ---
91
+ **来源**
92
+ - ¹ **项目计划书.pdf** — "截止日期3月15日,微服务架构"
93
+ - ² **团队分工表.xlsx** — "负责人:张三"
94
+ - ³ **资源评估报告.md** — "预计4名开发人员"
95
+ ```
96
+
97
+ ### 引用粒度规则
98
+
99
+ | 情况 | 引用方式 |
100
+ |------|---------|
101
+ | 单一来源的事实 | 句末标 `[¹]` |
102
+ | 多个来源支撑同一论点 | 句末标 `[¹][³]` |
103
+ | 综合推断 | 标注所有依据,注明"综合自..." |
104
+ | 非 IronBank 来源 | 标注 `[通用知识]` 或说明来源 |
105
+ | 搜索无结果 | 明确告知用户未找到相关文档 |
106
+
107
+ ---
108
+
109
+ ## 输出格式规范
110
+
111
+ ### 来源列表格式(强制)
112
+
113
+ > **必须使用 Markdown 列表格式(每条前加 `- `)**,确保渲染时正确换行。
114
+ > 每条摘要**控制在 20 字以内**。
115
+ > 每次回答的引用来源**最多 8 条**,优先保留最相关的来源。
116
+
117
+ ### 标准回答格式
118
+
119
+ ```markdown
120
+ [回答正文,每个关键事实后附上标角标引用]
121
+
122
+ ---
123
+ **来源**
124
+ - ¹ **文档标题** — "摘要(≤20字)"
125
+ - ² **文档标题** — "摘要(≤20字)"
126
+ ```
127
+
128
+ ### 简短回答(1-2个信息点)
129
+
130
+ > 该功能的上线日期为2月28日[¹]。
131
+ >
132
+ > ---
133
+ > **来源**
134
+ > - ¹ **发布计划.pdf** — "v2.0 计划2月28日上线"
135
+
136
+ ### 复杂回答(多个信息点)
137
+
138
+ > **背景**
139
+ > 该项目于2024年Q3启动[¹],目标是重构现有支付系统[²]。
140
+ >
141
+ > **进展**
142
+ > 目前已完成第一阶段开发[³],测试覆盖率达到85%[³]。第二阶段预计Q1完成[¹]。
143
+ >
144
+ > **风险**
145
+ > 主要风险包括第三方API兼容性问题[⁴]和人员变动[²]。
146
+ >
147
+ > ---
148
+ > **来源**
149
+ > - ¹ **项目立项书.pdf** — "Q3立项,二阶段Q1完成"
150
+ > - ² **团队周报-W48.md** — "支付重构,人员调整风险"
151
+ > - ³ **测试报告-v1.pdf** — "一阶段完成,覆盖率85%"
152
+ > - ⁴ **技术评审记录.md** — "第三方API兼容性风险"
153
+
154
+ ---
155
+
156
+ ## 特殊场景
157
+
158
+ ### 搜索无结果
159
+
160
+ ```
161
+ 我在 IronBank 文档中没有找到关于"XXX"的相关信息。
162
+
163
+ 建议:
164
+ - 尝试使用不同的关键词搜索
165
+ - 确认文档是否已上传到 IronBank
166
+ - 我可以基于通用知识回答,但无法提供内部文档来源
167
+ ```
168
+
169
+ ### 结果之间有冲突
170
+
171
+ ```
172
+ ⚠️ 注意:关于此问题,不同文档存在差异:
173
+ - **文档A**[¹]: "...表述1..."
174
+ - **文档B**[²]: "...表述2..."
175
+
176
+ 建议以更新日期较近的文档为准。
177
+ ```
178
+
179
+ ### 混合来源(IronBank + 通用知识)
180
+
181
+ IronBank 来源的信息使用角标引用,通用知识部分标注 `[通用知识]` 或不加引用但明确说明。
182
+
183
+ ---
184
+
185
+ ## 注意事项
186
+
187
+ 1. **不要伪造引用**:只引用实际搜索到的内容,找不到就说找不到
188
+ 2. **引用要精确**:角标对应的来源摘要必须是搜索结果中的真实内容
189
+ 3. **保持可读性**:引用是辅助信息,不能喧宾夺主,正文要流畅自然
190
+ 4. **优先 IronBank**:如果 IronBank 有相关内容,优先引用内部文档
191
+ 5. **保持原文语言**:引用摘要保持搜索结果的原始语言
192
+ 6. **角标连续编号**:每次回答中的角标从 ¹ 开始连续编号,不跳号
193
+ 7. **来源列表用 Markdown 列表**:每条来源前必须加 `- `,确保换行渲染正确
194
+ 8. **引用数量上限 8 条**:超过时合并或保留最相关的来源
195
+ 9. **摘要精简**:每条摘要控制在 20 字以内,不要冗长
@@ -0,0 +1,205 @@
1
+ ---
2
+ name: ironbank-docs-search
3
+ description: 在 IronBank Docs(网盘 / 知识库文件)或 IronBank Notes(笔记 + 笔记附件)中做深度检索与证据收集时必须使用此 skill。触发场景包括:用户要求"去文档里找""搜一下 docs / notes""看看某份文档讲了什么""帮我搜笔记内容""确认文档 / 笔记里有没有某个细节""提取某个表格/段落/原文"。本 skill 覆盖两组并列工具——docs 四件套(全局搜索、文档摘要、单文档检索、chunk 精读)与 notes 三件套(全局搜索、单文档检索、chunk 精读,没有 summary),并给出它们之间的协作策略与选用规则。
4
+ ---
5
+
6
+ # IronBank 深度检索 Skill(Docs + Notes)
7
+
8
+ ## 目标
9
+
10
+ 在 IronBank 的两类 RAG 索引中(**Docs** = 网盘里的文件;**Notes** = 笔记本体 + 笔记附件 note_file),从"找资源"一路推进到"拿到可引用的原文证据",并根据用户问题决定先看摘要、还是直接下钻到 chunk。
11
+
12
+ ## 何时用 Docs,何时用 Notes
13
+
14
+ - **Docs**(`ironbank_docs_*`)→ 用户问的是上传到 IronBank 网盘 / 知识库的文件内容(PDF、Word、Excel 等),或不区分来源时
15
+ - **Notes**(`ironbank_notes_*`)→ 用户明确说"笔记""note""note_file",或想搜某条笔记里的内容、笔记下挂的附件内容
16
+ - 不确定时,可以**并行**调两条线的 search,再汇总比较哪一边命中更相关
17
+
18
+ ## 工具分工(Docs 四件套)
19
+
20
+ - `ironbank_docs_search`
21
+ 作用:全局搜索网盘文件,找到候选 `document_id`
22
+ - `ironbank_docs_get_summary`
23
+ 作用:对 1-3 个候选文档做快速预读,帮助判断哪篇最值得继续深挖
24
+ - `ironbank_docs_search_single`
25
+ 作用:在单篇文档内搜索相关 chunk,定位具体证据
26
+ - `ironbank_docs_get_chunk`
27
+ 作用:读取指定 chunk 的完整内容,并通过 `prev_no` / `next_no` 继续扩展上下文
28
+
29
+ ## 工具分工(Notes 三件套)
30
+
31
+ - `ironbank_notes_search`
32
+ 作用:跨用户全部 note + note_file 做向量检索,可选 `board_id` 限定范围;返回的每条命中带 `source_type`(note / note_file)、`note_id`、`document_id`
33
+ - `ironbank_notes_search_single`
34
+ 作用:在单个 note / note_file 内搜索相关 chunk,定位具体证据
35
+ - `ironbank_notes_get_chunk`
36
+ 作用:读取指定 note / note_file chunk 的完整内容,并通过 `prev_no` / `next_no` 扩展上下文
37
+
38
+
39
+ ## 推荐主流程
40
+
41
+ ### Flow A:默认流程
42
+
43
+ 适用场景:用户只给主题,还不知道具体是哪篇文档。
44
+
45
+ 1. 先用 `ironbank_docs_search` 做全局搜索,拿到候选文档
46
+ 2. 对最相关的 1-3 篇文档调用 `ironbank_docs_get_summary`
47
+ 3. 选定最值得继续读的文档后,用 `ironbank_docs_search_single` 找相关 chunk
48
+ 4. 对命中的锚点调用 `ironbank_docs_get_chunk` 读取完整内容和前后上下文
49
+ 5. 整理答案并标注来源
50
+
51
+ ### Flow B:快速概览流程
52
+
53
+ 适用场景:用户要“这篇文档主要讲什么”“先给我一个概要”。
54
+
55
+ 1. 如果用户已提供 `document_id`,直接调用 `ironbank_docs_get_summary`
56
+ 2. 如果用户只给主题,先 `ironbank_docs_search`,再对候选文档调用 `ironbank_docs_get_summary`
57
+ 3. 只有当用户继续追问细节、原文、表格、精确数字时,再进入 `search_single -> get_chunk`
58
+
59
+ ### Flow C:精确取证流程
60
+
61
+ 适用场景:用户要具体表述、表格、数字、条款、前后文、可引用原文。
62
+
63
+ 1. 已知文档时,直接从 `ironbank_docs_search_single` 开始
64
+ 2. 未知文档时,先 `ironbank_docs_search`,必要时跳过 `summary`
65
+ 3. 一旦定位到相关 chunk,立刻调用 `ironbank_docs_get_chunk`
66
+ 4. 需要上下文时,基于 `prev_no` / `next_no` 继续读取邻近 chunk
67
+
68
+ ## 何时使用 `ironbank_docs_get_summary`
69
+
70
+ 优先使用 `summary` 的情况:
71
+
72
+ - `ironbank_docs_search` 返回多个候选文档,单靠 snippet 很难判断哪篇更相关
73
+ - 用户要的是“概览”“摘要”“这篇文档大概讲什么”
74
+ - 需要先快速筛掉不相关文档,再决定是否投入 chunk 级检索
75
+
76
+ 跳过 `summary` 的情况:
77
+
78
+ - 用户明确要求精确原文、表格、数字、条款或上下文
79
+ - 已经知道目标文档,而且问题是文档内某个具体细节
80
+ - 需要可验证证据,而不是高层概述
81
+
82
+ 工作规则:
83
+
84
+ - `summary` 是“文档级预读工具”,通常放在 `docs_search` 和 `docs_search_single` 之间
85
+ - `summary` 不能替代 chunk 原文;它只负责帮助筛选和建立理解
86
+ - 最终回答若需要证据或引用,必须回到 `search_single` / `get_chunk`
87
+
88
+ ## 检索与下钻策略
89
+
90
+ ### Step 1:全局搜索
91
+
92
+ 使用 `ironbank_docs_search` 找候选文档。
93
+
94
+ 要点:
95
+
96
+ - 关键词尽量短而准,优先 2-5 个词
97
+ - 第一次无结果时,换同义词、缩短关键词、拆成两个问题重搜
98
+ - 记录最相关的 `document_id`
99
+
100
+ ### Step 2:摘要筛选
101
+
102
+ 使用 `ironbank_docs_get_summary` 对 1-3 个候选文档做预读。
103
+
104
+ 要点:
105
+
106
+ - 用 summary 判断“是不是这篇”“值不值得继续读”
107
+ - 如果多个 summary 都相关,再分别进入单文档检索
108
+ - 如果 summary 很泛或不足以支持结论,不要停在这里,继续下钻
109
+
110
+ ### Step 3:单文档内定位
111
+
112
+ 使用 `ironbank_docs_search_single` 在目标文档中找相关 chunk。
113
+
114
+ 要点:
115
+
116
+ - 这里可以用更具体的二级关键词
117
+ - 选最相关的 1-3 个命中作为锚点
118
+ - 记录结果中的 `chunk_id`
119
+ - snippet 只能用于定位,不能默认当作完整证据
120
+
121
+ ### Step 4:读取完整 chunk 与邻近上下文
122
+
123
+ 使用 `ironbank_docs_get_chunk` 读取锚点 chunk 的完整内容。
124
+
125
+ 正确方式:
126
+
127
+ 1. 先用 `chunk_id` 读取锚点 chunk
128
+ 2. 查看返回结果中的 `prev_no` 和 `next_no`
129
+ 3. 如需上下文,再用 `chunk_no = prev_no` 或 `chunk_no = next_no` 继续读取邻近 chunk
130
+
131
+ 重要规则:
132
+
133
+ - 不要假设 `chunk_id` 是顺序编号
134
+ - 不要对 `chunk_id` 做 `+1` / `-1`
135
+ - 邻近扩展要依赖 `prev_no` / `next_no`
136
+
137
+ 停止扩展的条件:
138
+
139
+ - 已经拿到完整答案
140
+ - 前后文开始明显偏题
141
+ - 已经覆盖完整表格、完整条款、完整定义或完整论述
142
+
143
+ ## 结构化数据与截断处理
144
+
145
+ 对表格、列表、财务数据、长段落要更谨慎:
146
+
147
+ - 只看到表格前半段时,不要急着回答
148
+ - 列表逻辑上应有更多项时,不要默认结果完整
149
+ - 缺少合计行、结论行、尾部注释时,要继续读取相邻 chunk
150
+
151
+ 建议做法:
152
+
153
+ 1. 用 `ironbank_docs_search_single` 找到锚点
154
+ 2. 立刻用 `ironbank_docs_get_chunk` 读取完整 chunk
155
+ 3. 如果结果仍像是中途截断,继续用 `prev_no` / `next_no` 扩展
156
+
157
+ ## 回答策略
158
+
159
+ 回答时优先做到三件事:
160
+
161
+ 1. 先直接回答用户问题
162
+ 2. 再给出支撑该结论的文档证据
163
+ 3. 如果信息仍不完整,明确说明还缺什么
164
+
165
+ 建议的引用方式:
166
+
167
+ - 来源:[文档标题](document_id: xxx)
168
+ - 来源:[文档标题] - chunk_id: xxx
169
+ - 若上下文是通过 `chunk_no` 扩展得到,也可补充 `chunk_no`
170
+
171
+ ## 常见决策规则
172
+
173
+ - 搜索结果很多且 snippet 脏乱:先用 `ironbank_docs_get_summary`
174
+ - 搜索结果已经明显指向唯一文档,但用户要细节:跳过 summary,直接 `search_single`
175
+ - 用户要摘要:优先 `get_summary`
176
+ - 用户要原文、数字、表格、条款:优先 `search_single -> get_chunk`
177
+ - 一个文档不够回答:对多个文档并行执行“summary 或 single search”流程,再汇总
178
+
179
+ ## 不要这样做
180
+
181
+ - 不要把 `summary` 当成最终证据
182
+ - 不要只看全局搜索 snippet 就下结论
183
+ - 不要假设 `chunk_id` 是 `c12`、`c13` 这种连续编号
184
+ - 不要通过手动增减 `chunk_id` 去读相邻内容
185
+ - 不要在需要原文证据时停留在文档摘要层
186
+
187
+ ## Notes 链路的特别说明
188
+
189
+ Notes 系(`ironbank_notes_*`)整体策略与 Docs 完全一致,但有几个差异要注意:
190
+
191
+ 1. **没有 summary 工具**:上面所有"先看 summary,再决定是否下钻"的步骤,对 notes 链路要直接跳过。判断要不要继续读,只能基于 `ironbank_notes_search` 返回的 `snippet` / `content_preview` / `similarity`
192
+ 2. **结果含两类来源**:每条命中通过 `source_type` 区分
193
+ - `source_type = "note"` → 命中的是某条笔记本身
194
+ - `source_type = "note_file"` → 命中的是笔记下挂的附件文件
195
+ - 两类都用同样的 `document_id` 进入 `ironbank_notes_search_single` / `ironbank_notes_get_chunk`,不需要分流处理
196
+ 3. **board_id 限定(可选)**:`ironbank_notes_search` 支持 `board_id` 入参,可把语义检索范围限定在某个看板下的笔记 — 适合"在 XX 项目的笔记里找"这种场景
197
+ 4. **chunk 扩展规则一样**:从 `ironbank_notes_get_chunk` 拿到 `prev_no` / `next_no` 后,照样用 `chunk_no` 继续读邻近内容;不要对 `chunk_id` 做 `+1` / `-1`
198
+ 5. **拿到 note 后想要正文**:如果用户后续问"这条笔记完整说了什么",可以转去 `ironbank_get_note_detail`(来自 `ironbank-mcp-reference` skill)拿整篇 Markdown 正文(在 `content.content` 字段),不必继续在 chunk 层拼接
199
+
200
+ 何时优先 Notes vs Docs:
201
+
202
+ - 用户明确说"笔记""note":优先 Notes
203
+ - 找用户自己写过的内容、讨论、会议记录、个人收藏:优先 Notes
204
+ - 找上传到知识库的正式文档、PDF、Excel:优先 Docs
205
+ - 都不确定:并行调两边的 search,看哪边 `similarity` 更高