人话: Skill 的任务含义保持不变,只在边界处翻译成目标 Host 或服务商需要的格式。
同一个问题需要发布到 GitHub、Jira 或 Linear。三家的请求格式不同,但问题的身份、标题和严重程度必须保持一致。
{
"target": "github",
"issue": {"id": "INC-42", "title": "Checkout failures", "severity": "high"}
}Mock Skill: 我们构造的 Skill 叫 multi-tracker-issue-publisher:
patterns/adapter/sample/
├── SKILL.md # canonical issue 入口
├── child-skills/
│ ├── github/SKILL.md # GitHub Adapter
│ ├── jira/SKILL.md # Jira Adapter
│ └── linear/SKILL.md # Linear Adapter
├── references/tracker-contracts.md
├── scripts/run_demo.py
└── tests/test_demo.py
sample/SKILL.md 的关键部分:
<!-- 只改变目标格式,不改变 issue 的身份和 severity 含义。 -->
1. validate one canonical issue
2. select `github`, `jira`, or `linear`
3. build that target's request descriptor
4. return the descriptor without a network call输入是一份 canonical issue,输出是对应平台的离线请求描述。
| 没有 Adapter | 使用 Adapter |
|---|---|
GitHub Skill: 自己定义 issue 语义Jira Skill: 再定义一套 issue 语义Linear Skill: 继续复制一套 issue 语义多份实现逐渐产生语义漂移。 |
canonical issue -> GitHub Adapter -> REST descriptor -> Jira Adapter -> REST + ADF descriptor -> Linear Adapter -> GraphQL descriptor规范 Skill 只维护一份,差异集中在边界绑定。 |
变化点: 核心任务语义保持一份,目标系统格式由 Adapter 局部翻译。
| 上游 Case Skill | 本地 Mock Skill |
|---|---|
gstack template同一模板生成不同 Host binding。 confirmed correspondence |
multi-tracker-issue-publisher同一 canonical issue 生成 GitHub/Jira/Linear 请求描述。 constructive |
Case Skill: gstack SKILL.md.tmpl、生成器 和 Host bindings。
它体现 Adapter 的地方:同一个 Skill 模板被翻译成 Claude、Codex 等 Host 需要的入口和 frontmatter。核心对应关系是:
canonical Skill template -> Claude binding
-> Codex binding
仓库把这个对应关系记录为 confirmed correspondence,具体路径见 correspondence.md。
| Adapter 角色 | Skillware 中的对应物 |
|---|---|
| Client | 任务调用者 |
| Target | canonical issue-publisher 契约 |
| Adapter | GitHub、Jira、Linear binding Skill |
| Adaptee | 各平台 REST 或 GraphQL 请求契约 |
判断重点是“边界翻译”,不是“有多个平台配置”。翻译前后的任务语义需要能够对照。
适合:同一个行为要接入多个不兼容的 Host 或服务商接口;平台差异可以局部翻译;新目标不应该复制整个根 Skill。
不适合:目标接口已经接受 canonical contract;翻译会改变任务本意;只有一个目标且没有兼容压力。
python3 sample/scripts/run_demo.py
python3 -m unittest discover -s sample/tests -v本地样例验证了三种请求描述的生成和 canonical 语义保留。gstack 证据支持源码层面的绑定关系,真实 Host 运行一致性仍需单独测试。