Skip to content

Commit 01e0bb2

Browse files
authored
feat: add skill-midway package and installers (#4549)
* add skill-midway package and installers * docs: 更新文档编辑链接和新增技能包博客 更新 Docusaurus 配置中文档的编辑 URL 指向 v4-next 分支,确保贡献者能正确提交更改到对应版本分支。新增技能包 @midwayjs/skill-midway 的介绍博客,详细说明其安装和使用方法,以帮助开发者利用 AI 工具提升 Midway 开发体验。 * chore: 将 @midwayjs/skill-midway 添加到强制发布列表 更新 lerna 配置,在 version 命令的 forcePublish 数组中新增 @midwayjs/skill-midway 包,以确保其在发布时版本号被强制更新。 * fix: 修复错误输出时堆栈与消息的括号优先级问题 * style(skill-midway): 格式化代码以符合项目代码风格 - 在 package.json 中添加 `lint` 脚本以检查代码风格 - 调整多行语句的括号和运算符换行以保持一致性 - 统一字符串模板和 YAML 前导符的引号使用 - 重构长行代码以提高可读性
1 parent b6dc50b commit 01e0bb2

56 files changed

Lines changed: 4563 additions & 9 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ midway_benchmark_app
2222
.env
2323
docs-api
2424
site/changelog
25+
site/.midway-skill
26+
packages/skill-midway/bundle
2527
.changelog
2628
**/test/*.txt
2729
.audit

lerna.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
]
2424
},
2525
"version": {
26-
"forcePublish": "@midwayjs/version"
26+
"forcePublish": [
27+
"@midwayjs/version",
28+
"@midwayjs/skill-midway"
29+
]
2730
}
2831
},
2932
"changelog": {
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
## Context
2+
Midway 主仓已经具备构建 agent 知识层的核心原材料:
3+
4+
- `site/docs``site/versioned_docs`:教程、组件、扩展、迁移文档
5+
- `site/versions.json` 与 Docusaurus 当前版本配置:版本边界
6+
- `api-typedoc.json`:结构化 API 符号与源码链接
7+
- `CHANGELOG.md`:版本演进
8+
- `packages/mcp`:Midway 自身的 MCP 承载能力
9+
- `@signalwire/docusaurus-plugin-llms-txt`:面向 LLM 的文本出口
10+
11+
当前缺口不在“有没有内容”,而在“有没有适合 agent 稳定查询的数据契约”。
12+
13+
## Goals / Non-Goals
14+
15+
- Goals:
16+
- 产出一套官方、版本化、可结构化查询的知识快照
17+
- 同时覆盖文档、API 符号、包维度和 changelog 语义
18+
- 为 skill、`@midwayjs/skill-midway`、MCP 提供统一数据源,而不是各自抓站点
19+
- 保持中英文信息与版本命中关系
20+
- 把“最新”明确落在当前文档版本与生成时间上
21+
22+
- Non-Goals:
23+
- 不在本 change 中实现向量搜索或复杂排序系统
24+
- 不让 skill 文件承载大量领域正文
25+
- 不把 consumer 绑定为单一命令行工具或单一 MCP 实现
26+
- 不引入非官方内容源
27+
28+
## Architecture Overview
29+
30+
整体分为 4 层:
31+
32+
### 1. Source Collection Layer
33+
输入源:
34+
35+
- `site/docs/**`
36+
- `site/i18n/en/docusaurus-plugin-content-docs/current/**`
37+
- `site/versioned_docs/version-*/**`
38+
- `site/.docusaurus/api-typedoc-default.json` 或对应 versioned `api-typedoc.json`
39+
- `site/versions.json`
40+
- `CHANGELOG.md`
41+
- 相关 `packages/*/package.json`
42+
43+
该层只负责收集,不负责面向 consumer 的查询逻辑。
44+
45+
### 2. Normalization Layer
46+
将多源内容转换为稳定记录:
47+
48+
- `DocRecord`
49+
- `ApiRecord`
50+
- `PackageRecord`
51+
- `ChangelogRecord`
52+
- `VersionRecord`
53+
54+
每条记录至少包含:
55+
56+
- `id`
57+
- `kind`
58+
- `version`
59+
- `locale`
60+
- `title`
61+
- `summary`
62+
- `sourcePath`
63+
- `sourceUrl`
64+
65+
其中 API 记录额外包含:
66+
67+
- `packageName`
68+
- `symbolName`
69+
- `symbolKind`
70+
- `qualifiedName`
71+
- `since`
72+
- `deprecated`
73+
74+
### 3. Bundle Distribution Layer
75+
知识快照输出为 transport-neutral bundle,建议拆分为:
76+
77+
```text
78+
midway-skill/
79+
manifest.json
80+
versions/
81+
4.0.0/
82+
docs.json
83+
api.json
84+
packages.json
85+
changelog.json
86+
3.0.0/
87+
docs.json
88+
api.json
89+
packages.json
90+
changelog.json
91+
```
92+
93+
其中 `manifest.json` 提供:
94+
95+
- 当前版本
96+
- 历史版本列表
97+
- 生成时间
98+
- 支持的 locale
99+
- 每个 bundle 文件的路径与摘要
100+
101+
### 4. Consumer Layer
102+
官方只冻结查询契约,不冻结唯一 transport。典型 consumer:
103+
104+
- 官方 skill
105+
- `@midwayjs/skill-midway`
106+
- 基于 `packages/mcp` 的参考 knowledge server
107+
- 站点调试工具页
108+
109+
## Query Contract
110+
111+
consumer 侧必须至少支持以下查询语义:
112+
113+
1. `resolveVersion(target)`
114+
- 输入:`current`、显式 semver、`latest`
115+
- 输出:`resolvedVersion``matchType`
116+
117+
2. `lookupDocs({ query, version, locale })`
118+
- 按主题、标题、slug、标题层级匹配文档
119+
120+
3. `lookupApi({ symbol, packageName?, version })`
121+
- 按导出名、限定名、包名查 API
122+
123+
4. `lookupPackages({ query, version })`
124+
- 按包名、关键词、分类查 Midway 包
125+
126+
5. `lookupChangelog({ fromVersion, toVersion?, packageName? })`
127+
- 返回变更条目和关联版本范围
128+
129+
所有查询返回都必须带:
130+
131+
- `resolvedVersion`
132+
- `sourceKind`
133+
- `sourcePath`
134+
- `sourceUrl`
135+
- `confidence``matchType`
136+
137+
## Skill Design
138+
139+
官方 skill 只定义 SOP,不直接复制知识正文。
140+
141+
最小要求:
142+
143+
1. 触发范围
144+
- Midway 框架、包、装饰器、配置、生命周期、命令行工具、MCP、部署、迁移相关问题
145+
146+
2. 默认流程
147+
- 先解析版本
148+
- 再查 knowledge bundle
149+
- 命中不足时回退到官方文档页面或源码位置
150+
151+
3. 输出约束
152+
- 必须说明命中的 Midway 版本
153+
- 必须优先引用官方来源
154+
- 推断内容要显式标注是推断
155+
156+
## Versioning Strategy
157+
158+
- `current` 对应站点当前文档版本标签
159+
- 历史版本来自 `site/versions.json`
160+
- 查询显式版本时优先 exact match
161+
- 无 exact match 时可回退到“同 major 下最近的已发布快照”,并向 consumer 暴露 `fallback=true`
162+
163+
## Freshness Strategy
164+
165+
知识快照生成应与文档/API 构建绑定,而不是独立手工维护。
166+
167+
最低要求:
168+
169+
- 文档构建时生成当前版本 bundle
170+
- 版本化文档构建时保留历史 bundle
171+
- 生成产物记录 `generatedAt`
172+
- CI 对以下情况给出失败信号:
173+
- 当前文档存在但当前 bundle 缺失
174+
- 当前 API typedoc 存在但 API bundle 缺失
175+
- 版本清单与 bundle 目录不一致
176+
177+
## Decisions
178+
179+
- Decision: 先做 bundle,再做 transport
180+
- 原因:`@midwayjs/skill-midway`、MCP、skill 共享同一份数据契约,避免重复抓取和重复解析。
181+
182+
- Decision: 以 docs + typedoc 为双主源
183+
- 原因:Midway 的“怎么用”主要在 docs,“能调什么”主要在 typedoc,两者缺一不可。
184+
185+
- Decision: `latest` 不直接指 npm registry
186+
- 原因:对 agent 来说,最可信的“最新”应是当前站点发布并完成 bundle 生成的版本,而不是尚未同步文档的包版本。
187+
188+
- Decision: skill 与数据分离
189+
- 原因:skill 的职责是强制 agent 查询官方源,而不是变成另一本维护成本极高的手册。
190+
191+
## Risks / Trade-offs
192+
193+
- 风险:docs 与 typedoc 的版本边界不完全一致
194+
- Mitigation:manifest 中显式记录每个 version 的 docs/api 可用性
195+
196+
- 风险:历史版本文档结构差异较大,归一化复杂
197+
- Mitigation:先定义最小公共字段,保留 `rawSourcePath` 作为兜底
198+
199+
- 风险:consumer 直接依赖站点内部生成文件路径,导致后续改动成本高
200+
- Mitigation:consumer 只依赖 manifest 和 bundle contract,不依赖 Docusaurus 内部目录细节
201+
202+
## Migration Plan
203+
204+
1.`site` 构建链路中加入 knowledge bundle 生成
205+
2. 为当前版本与历史版本产出统一 manifest
206+
3. 增加官方 skill 文件
207+
4.`@midwayjs/skill-midway` 与 MCP 等 consumer 消费该 bundle,而不是自行爬站点
208+
209+
## Open Questions
210+
211+
- 官方 skill 最终是保留在主仓,还是镜像发布到独立 skill 仓库?
212+
- bundle 是直接随站点静态文件发布,还是同步发布一个轻量 npm 数据包(首选名 `@midwayjs/skill-midway`)?
213+
- `lookupDocs` 是否需要在第一阶段支持全文倒排索引,还是先以标题/slug/heading 命中为主?
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Change: 提供 Midway 官方 Agent Knowledge Bundle 与 Skill
2+
3+
## Why
4+
当前 Midway 已经同时拥有三类对 agent 很有价值的官方信息源:
5+
6+
- `site/docs``site/versioned_docs` 中的版本化文档
7+
- Docusaurus/TypeDoc 生成的 API 元数据(如 `api-typedoc.json`
8+
- `CHANGELOG.md`、包清单、MCP 能力等运行时与发布信息
9+
10+
但这些内容仍然主要面向人类页面浏览,缺少一个“可版本化、可结构化、可被 agent 直接消费”的官方知识层。结果是:
11+
12+
1. agent 容易只基于记忆回答,无法稳定对齐 Midway 最新版本能力;
13+
2. MCP、skill、LLM 文档入口与潜在命令行消费者之间没有统一的数据契约;
14+
3. 文档更新后,即使站点已同步,agent 侧也没有官方“最新快照”可以消费。
15+
16+
`ant-design/antd-skill` 的有效点不在单个 `SKILL.md`,而在于“skill 只负责 SOP,真实数据由结构化 provider 提供”。Midway 也需要一套同类但更适合自身仓库结构的官方方案。
17+
18+
## What Changes
19+
- 新增 capability:`agent-knowledge`
20+
- 定义 Midway 官方 `Agent Knowledge Bundle`,从文档、TypeDoc API、版本信息、changelog 和包元数据生成结构化快照
21+
- 定义版本解析与回退规则,使 consumer 可以稳定查询 `current`、显式版本和历史版本
22+
- 定义 transport-neutral 查询契约,供未来的 `@midwayjs/skill-midway`、MCP server、站点调试页和其他 agent 工具共同消费
23+
- 定义 Midway 官方 skill 的最小 SOP:何时触发、先查什么、如何引用版本和来源、何时回退到站点页面
24+
- 定义更新与发布流程,确保文档/API 更新后知识快照同步刷新,而不是长期漂移
25+
26+
## Design Direction
27+
本 change 只冻结设计,不直接开始实现。整体方向如下:
28+
29+
1. **数据归一化优先**
30+
- 不手写知识库正文;
31+
- 直接复用 `site/docs``site/versioned_docs/*``api-typedoc.json``versions.json``CHANGELOG.md` 等已有官方资产。
32+
33+
2. **传输层后置**
34+
- 先统一 bundle 契约,再由 `@midwayjs/skill-midway`、MCP、静态文件或其他运行时去消费;
35+
- 避免把知识格式与某个单独工具强耦合。
36+
37+
3. **版本感知为第一原则**
38+
- `current` 代表站点当前版本;
39+
- 历史版本沿用 `site/versions.json`
40+
- 查询时必须返回“命中版本”与“是否回退”。
41+
42+
4. **skill 只做行为编排**
43+
- `SKILL.md` 不承载大量知识正文;
44+
- 由 skill 强制 agent 在 Midway 问题上优先查询官方 knowledge provider。
45+
46+
## Impact
47+
- Affected specs: `agent-knowledge`(新增)
48+
- Affected code(实施阶段预期):
49+
- `site/` 下文档构建与生成脚本
50+
- `site/docusaurus.config.js` 相关知识输出挂钩
51+
- `packages/mcp/*` 的参考接入方式或示例
52+
- Midway 官方 skill 文件及其分发脚本/目录
53+
- `@midwayjs/skill-midway` 包及其他 consumer 对该 bundle 的消费逻辑
54+
55+
## Scope Boundaries
56+
- 本提案不要求在当前仓库里实现完整搜索引擎。
57+
- 本提案不要求立即实现完整命令行工具;首选官方包名为 `@midwayjs/skill-midway`,而不是新的 `cli` 包。
58+
- 本提案不要求改变现有 Docusaurus 页面结构或 Typedoc 页面路由。
59+
- 本提案不纳入社区博客、第三方教程、Issue/Discussion 等非官方内容。
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
## ADDED Requirements
2+
3+
### Requirement: Versioned Official Knowledge Snapshots
4+
系统 SHALL 从 Midway 官方文档与 API 资产生成可版本化的 agent knowledge snapshots。
5+
6+
#### Scenario: 生成当前版本知识快照
7+
- **WHEN** 站点构建当前文档版本
8+
- **THEN** 系统生成对应当前版本的 knowledge snapshot
9+
- **AND** snapshot 记录生成时间、版本号和可用数据切片
10+
11+
#### Scenario: 保留历史版本知识快照
12+
- **WHEN** 仓库存在 `site/versioned_docs` 中的历史版本文档
13+
- **THEN** 系统为这些历史版本生成或保留对应 knowledge snapshot
14+
- **AND** consumer 可按显式版本查询这些快照
15+
16+
### Requirement: Unified Docs And API Knowledge Contract
17+
系统 SHALL 将文档、API 符号、包信息与 changelog 统一到同一知识契约中,而不是由 consumer 分别抓取不同源。
18+
19+
#### Scenario: 文档页被归一化为稳定记录
20+
- **WHEN** 系统处理 Midway 官方文档页面
21+
- **THEN** 每个页面至少包含稳定 `id`、标题、版本、locale、来源路径和来源 URL
22+
- **AND** consumer 无需理解 Docusaurus 内部文件结构即可消费
23+
24+
#### Scenario: API 符号被归一化为稳定记录
25+
- **WHEN** 系统处理 TypeDoc 生成的 API 元数据
26+
- **THEN** 每个 API 记录至少包含包名、符号名、符号类型、版本和来源信息
27+
- **AND** consumer 可按符号名或包名稳定查询
28+
29+
#### Scenario: Changelog 与包信息进入统一知识层
30+
- **WHEN** 系统处理 changelog 与包元数据
31+
- **THEN** consumer 可通过同一知识契约查询版本变更与相关包信息
32+
- **AND** 不要求 consumer 额外解析 `CHANGELOG.md` 或多个 `package.json`
33+
34+
### Requirement: Version-aware Query Resolution
35+
系统 SHALL 提供明确的版本解析与回退语义,避免 agent 在“当前版本”和“历史版本”之间混淆。
36+
37+
#### Scenario: 查询显式版本命中对应快照
38+
- **WHEN** consumer 传入一个存在的显式 Midway 版本
39+
- **THEN** 系统返回该版本的知识快照结果
40+
- **AND** 响应包含 `resolvedVersion`
41+
42+
#### Scenario: 查询不存在的精确版本时允许安全回退
43+
- **WHEN** consumer 传入一个不存在的显式版本
44+
- **THEN** 系统可回退到同 major 下最近的已发布快照
45+
- **AND** 响应必须标明发生了回退而不是伪装成 exact match
46+
47+
#### Scenario: 查询 current 或 latest
48+
- **WHEN** consumer 传入 `current``latest`
49+
- **THEN** 系统解析到当前官方文档版本
50+
- **AND** 不直接以外部 registry 中的最新包版本替代文档版本
51+
52+
### Requirement: Transport-neutral Consumer Contract
53+
系统 SHALL 定义不绑定特定 transport 的查询契约,以便 skill、`@midwayjs/skill-midway`、MCP 等 consumer 共用同一数据源。
54+
55+
#### Scenario: `@midwayjs/skill-midway` 复用统一查询契约
56+
- **WHEN** 官方 `@midwayjs/skill-midway` 包消费 Midway knowledge
57+
- **THEN** 该包通过统一查询契约访问 snapshot
58+
- **AND** 不需要自行重新解析站点页面
59+
60+
#### Scenario: MCP consumer 复用统一查询契约
61+
- **WHEN** 基于 Midway 的 MCP server 提供文档/API 查询能力
62+
- **THEN** 它复用同一知识契约
63+
- **AND** 不引入独立的第二套知识格式
64+
65+
### Requirement: Official Agent Skill Workflow
66+
系统 SHALL 提供 Midway 官方 skill,用于约束 agent 在 Midway 相关任务中优先查询官方 knowledge provider。
67+
68+
#### Scenario: 处理 Midway 技术问题时优先查官方 knowledge
69+
- **WHEN** agent 接到 Midway 框架、包、装饰器、配置、迁移或 MCP 相关任务
70+
- **THEN** 官方 skill 指导 agent 优先查询 knowledge provider
71+
- **AND** 不应在可查询时仅依赖记忆回答
72+
73+
#### Scenario: 输出带版本与来源
74+
- **WHEN** agent 使用官方 knowledge provider 回答 Midway 问题
75+
- **THEN** 输出包含命中的 Midway 版本与官方来源
76+
- **AND** 推断内容必须与直接来源区分
77+
78+
### Requirement: Freshness And Release Guard
79+
系统 SHALL 将知识快照更新纳入文档/API 发布流程,避免官方文档与 agent 知识层长期漂移。
80+
81+
#### Scenario: 当前文档更新时同步刷新 snapshot
82+
- **WHEN** 当前版本文档或 API 元数据发生变化
83+
- **THEN** 知识快照在构建或发布流程中同步刷新
84+
- **AND** 新 snapshot 的生成时间可被 consumer 感知
85+
86+
#### Scenario: 关键快照缺失时阻断发布
87+
- **WHEN** 当前版本存在官方 docs 或 API 资产但对应 snapshot 缺失
88+
- **THEN** CI 或发布流程给出失败信号
89+
- **AND** 不允许静默发布不完整的 knowledge bundle

0 commit comments

Comments
 (0)