@teamix-evo/mcp 0.3.0 → 0.4.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.
- package/README.md +1 -1
- package/dist/cli.js +161 -162
- package/dist/cli.js.map +1 -1
- package/dist/data/adr/0001-three-layer-alignment.md +54 -0
- package/dist/data/adr/0002-package-naming.md +50 -0
- package/dist/data/adr/0003-update-strategy-tri-state.md +62 -0
- package/dist/data/adr/0004-cli-command-structure.md +61 -0
- package/dist/data/adr/0005-ui-no-variant.md +67 -0
- package/dist/data/adr/0006-ui-upgrade-no-baseline.md +67 -0
- package/dist/data/adr/0007-governance-docs-at-root.md +62 -0
- package/dist/data/adr/0008-eslint-visual-rules-warn-baseline.md +110 -0
- package/dist/data/adr/0009-registry-mcp-protocol-layer.md +87 -0
- package/dist/data/adr/0010-design-default-and-variants.md +319 -0
- package/dist/data/adr/0011-mcp-single-package-multi-group.md +169 -0
- package/dist/data/adr/0012-lint-shared-core.md +215 -0
- package/dist/data/adr/0013-skills-source-mirror.md +154 -0
- package/dist/data/adr/0014-ui-biz-ui-templates-tier.md +274 -0
- package/dist/data/adr/0015-skill-description-trigger-contract.md +122 -0
- package/dist/data/adr/0016-design-md-brand-charter.md +93 -0
- package/dist/data/adr/0017-mcp-design-group.md +107 -0
- package/dist/data/adr/0018-ai-context-routing.md +112 -0
- package/dist/data/adr/0019-project-upgrade-flow.md +156 -0
- package/dist/data/adr/0020-design-to-tokens-skill-fusion.md +139 -0
- package/dist/data/adr/README.md +70 -0
- package/dist/data/adr/_template.md +36 -0
- package/dist/index.d.ts +64 -59
- package/dist/index.js +168 -170
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# 0004. CLI 命令结构:资源前置 `teamix-evo <package> <action> [variant]`
|
|
2
|
+
|
|
3
|
+
- **Status**: Accepted
|
|
4
|
+
- **Date**: 2026-05-13
|
|
5
|
+
- **Region**: 0100–0999 协议与工具
|
|
6
|
+
- **Related ADR**: [0010 design 默认+变体](0010-design-default-and-variants.md)(`design init --variant`)/ [0011 mcp 单包单 bin 多 group](0011-mcp-single-package-multi-group.md)(`teamix-evo-mcp` bin)/ [0013 Skills source-mirror](0013-skills-source-mirror.md)(`skills sync` / `skills doctor`)/ [0014 ui/biz-ui/templates 三层](0014-ui-biz-ui-templates-tier.md)(`biz-ui add --variant` / `templates add --variant`)
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
teamix-evo CLI 需要操作多种资产(design / skills / ui),每种资产有多种动作(init / update / add / list)。命令结构有几种风格:
|
|
11
|
+
|
|
12
|
+
- `teamix-evo init`(动作前置,后续 prompt 选包)
|
|
13
|
+
- `teamix-evo design init`(资源前置)
|
|
14
|
+
- `teamix-evo init design opentrek`(动作前置 + 多参数)
|
|
15
|
+
|
|
16
|
+
同时 design 包未来会有多 variant(opentrek / minimal / 等),命令结构需要为多 variant 留位。
|
|
17
|
+
|
|
18
|
+
## Options Considered
|
|
19
|
+
|
|
20
|
+
| 选项 | 优点 | 缺点 |
|
|
21
|
+
| ---- | ---- | ---- |
|
|
22
|
+
| 动作前置 `teamix-evo <action> <package>` | 与传统 CLI(npm install / yarn add)风格一致 | 资源前置时让用户少打字时不直观 |
|
|
23
|
+
| **资源前置 `teamix-evo <package> <action> [variant]`(本决策)** | 资源边界清晰,子命令组织好;variant 可扩展 | 与传统 CLI 风格略不同,首次接触有学习成本 |
|
|
24
|
+
| 单一命令 + 子命令矩阵(`teamix-evo design:init`) | 全 flat | 命名长、变体多时混乱 |
|
|
25
|
+
|
|
26
|
+
## Decision
|
|
27
|
+
|
|
28
|
+
命令结构采用**资源前置**:
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
teamix-evo <package> <action> [variant]
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
例:
|
|
35
|
+
|
|
36
|
+
- `npx teamix-evo@latest design init opentrek`
|
|
37
|
+
- `npx teamix-evo@latest design update`
|
|
38
|
+
- `npx teamix-evo@latest skills add teamix-evo-manage`
|
|
39
|
+
- `npx teamix-evo@latest ui add button`
|
|
40
|
+
|
|
41
|
+
附属决策:
|
|
42
|
+
|
|
43
|
+
- **多 variant 命名**:用包名作 key(`design: "opentrek"`),**不引入 brand 抽象**
|
|
44
|
+
- **业务项目侧目录**:`packages/design/library/<variant>/`
|
|
45
|
+
- **模板研发态目录**:`packages/design/_template/`(下划线前缀,避免被 variant 扫描器收录)
|
|
46
|
+
|
|
47
|
+
## Consequences
|
|
48
|
+
|
|
49
|
+
- **Positive**:
|
|
50
|
+
- 命令结构可预期(packageName 是第一参数)
|
|
51
|
+
- 多 variant 可扩展(无需新引入抽象)
|
|
52
|
+
- 子命令分布清晰,与 monorepo 包结构对齐
|
|
53
|
+
- **Negative**:
|
|
54
|
+
- 子命令深度 +1(`teamix-evo design init opentrek` 而非 `teamix-evo init`)
|
|
55
|
+
- 与 `npm install` 等传统 CLI 风格不同,首次使用有学习成本
|
|
56
|
+
- **Trade-off**:
|
|
57
|
+
- 用"+1 词的输入"换"资源边界清晰 + 多 variant 可扩展"
|
|
58
|
+
|
|
59
|
+
## Source
|
|
60
|
+
|
|
61
|
+
[`PLAN.md`](../../PLAN.md) §1.B
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 0005. UI 包不分 variant,所有视觉差异通过 design tokens 实现
|
|
2
|
+
|
|
3
|
+
- **Status**: Accepted
|
|
4
|
+
- **Date**: 2026-05-14
|
|
5
|
+
- **Region**: 0100–0999 协议与工具
|
|
6
|
+
- **Related ADR**: [0001 三层对齐](0001-three-layer-alignment.md) / [0006 UI 升级机制无 baseline](0006-ui-upgrade-no-baseline.md) / [0010 design 默认+变体](0010-design-default-and-variants.md) / [0014 ui/biz-ui/templates 三层](0014-ui-biz-ui-templates-tier.md)
|
|
7
|
+
- **Scope**: 本 ADR 决策**仅适用于 `@teamix-evo/ui` 包**(纯能力 / generic component + block)。同仓的 `@teamix-evo/biz-ui` 与 `@teamix-evo/templates` 因为绑业务规则 / 变体专属合成,**必须分 variant** — 见 [ADR 0014](0014-ui-biz-ui-templates-tier.md)。这是"ui 不绑 / biz-ui 必绑 / templates 必绑"三种边界对称表达,不是矛盾。
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
`@teamix-evo/design` 已经按 variant 切分(`opentrek` 是首个,未来会有 `minimal` 等)。一个自然的问题是:`@teamix-evo/ui` 是否也要按 variant 切分?
|
|
12
|
+
|
|
13
|
+
如果切分:
|
|
14
|
+
|
|
15
|
+
- 每个 variant 一套组件源码;
|
|
16
|
+
- 业务侧装组件时要先选 variant;
|
|
17
|
+
- 多 variant 增加时,组件维护成本线性增长。
|
|
18
|
+
|
|
19
|
+
如果不切分:
|
|
20
|
+
|
|
21
|
+
- 一套组件源码吃所有 variant;
|
|
22
|
+
- 视觉差异全部走 design tokens(CSS vars);
|
|
23
|
+
- 风险点:variant 间的语义命名必须严格对齐(`primary` / `foreground` 等)。
|
|
24
|
+
|
|
25
|
+
## Options Considered
|
|
26
|
+
|
|
27
|
+
| 选项 | 优点 | 缺点 |
|
|
28
|
+
| ---- | ---- | ---- |
|
|
29
|
+
| UI 按 variant 切分 | 单 variant 内组件可深度定制视觉 | 维护成本随 variant 数量线性增长;同步问题 |
|
|
30
|
+
| **UI 不分 variant,靠 token(本决策)** | 一套组件吃所有 variant;切换 variant 仅改 design 包 | 强依赖 semantic 命名稳定;variant 间语义集合必须严格对齐 |
|
|
31
|
+
|
|
32
|
+
## Decision
|
|
33
|
+
|
|
34
|
+
`@teamix-evo/ui` **不分 variant**:
|
|
35
|
+
|
|
36
|
+
- 一套组件源码服务所有 design variant
|
|
37
|
+
- 组件 className 走 **shadcn semantic 集**:`bg-primary` / `text-primary-foreground` / `border-border` / `text-destructive` / `text-muted-foreground` 等
|
|
38
|
+
- 底层 CSS vars(`--primary` / `--foreground` 等)由 design 包注入到 `globals.css` / `@theme` 块
|
|
39
|
+
- design 包的 semantic 层命名**必须严格对齐 shadcn 集**——这是跨 variant 的不变量,UI 包源码依赖它
|
|
40
|
+
- 业务侧切换 variant = 切 design 包,组件零改动
|
|
41
|
+
|
|
42
|
+
className 与 token 的两层关系:
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
组件源码 className="bg-primary"
|
|
46
|
+
↓ Tailwind 编译
|
|
47
|
+
编译产物 background-color: hsl(var(--primary))
|
|
48
|
+
↓ 浏览器读取
|
|
49
|
+
Token 层 --primary: oklch(...) ← design 包注入
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Consequences
|
|
53
|
+
|
|
54
|
+
- **Positive**:
|
|
55
|
+
- 组件维护成本不随 variant 增加
|
|
56
|
+
- 业务侧切换 variant 仅需切 design 包,组件零改动
|
|
57
|
+
- 升级 ui 包对所有 variant 用户同时生效
|
|
58
|
+
- **Negative**:
|
|
59
|
+
- **semantic 命名不再可改**:design 必须严格对齐 shadcn 集,任何 variant 引入新 semantic 都需所有上游同步
|
|
60
|
+
- 业务侧自定义业务 token(如 `revenue-up`)需要二步走:`tokens.overrides.css` 加 CSS var + `tailwind.config` 加 utility 映射
|
|
61
|
+
- **Trade-off**:
|
|
62
|
+
- 用"semantic 命名稳定性约束"换"组件维护成本不增长"
|
|
63
|
+
- 这条决策对组件研发顺序至关重要:design 必须先稳定 semantic 集,UI 才能基于它写组件
|
|
64
|
+
|
|
65
|
+
## Source
|
|
66
|
+
|
|
67
|
+
[`PLAN.md`](../../PLAN.md) §10.1 / §10.3
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 0006. UI 升级机制不预埋 baseline,依靠 AI + skill 做语义合并
|
|
2
|
+
|
|
3
|
+
- **Status**: Accepted
|
|
4
|
+
- **Date**: 2026-05-14
|
|
5
|
+
- **Region**: 0100–0999 协议与工具
|
|
6
|
+
- **Related ADR**: [0003 资源升级三态语义](0003-update-strategy-tri-state.md) / [0005 UI 包不分 variant](0005-ui-no-variant.md) / [0013 Skills source-mirror 模型](0013-skills-source-mirror.md)(skills upgrade 同型动作:同样无 baseline,靠语义合并 + skill 引导)
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
UI 包采用源码注入分发(`teamix-evo ui add <id>` 把组件源码写到业务项目 `src/components/ui/`),组件源码归用户。这就引出一个核心问题:**当上游 ui 包升级时,如何处理用户已修改的组件?**
|
|
11
|
+
|
|
12
|
+
业界已有几种范式:
|
|
13
|
+
|
|
14
|
+
- 三方合并(git-merge 风格):需要 baseline(上次安装的原始版本)→ 比较 baseline / current / incoming
|
|
15
|
+
- 完全覆盖:简单粗暴,丢失所有定制
|
|
16
|
+
- 不覆盖:升级失效
|
|
17
|
+
- 静默生成 patch 文件给用户解决:用户负担重
|
|
18
|
+
|
|
19
|
+
`updateStrategy: frozen`(ADR 0003)只解决了"不主动覆盖",没解决"如何主动同步上游修复 / 新功能到用户已修改的代码"。
|
|
20
|
+
|
|
21
|
+
## Options Considered
|
|
22
|
+
|
|
23
|
+
| 选项 | 优点 | 缺点 |
|
|
24
|
+
| ---- | ---- | ---- |
|
|
25
|
+
| 三方合并 + baseline | 精确 | baseline 必须随 ui add 一起落地到业务项目(污染),且需历史快照管理 |
|
|
26
|
+
| 完全覆盖 | 简单 | 丢用户定制 |
|
|
27
|
+
| **AI 语义合并 + skill 引导(本决策)** | 不污染、简化、AI 兜底语义判断 | 比三方合并精确度差,大改时仍需人介入 |
|
|
28
|
+
|
|
29
|
+
## Decision
|
|
30
|
+
|
|
31
|
+
不预埋 baseline,靠 **AI + skill** 做"两方语义合并":
|
|
32
|
+
|
|
33
|
+
### 流程
|
|
34
|
+
|
|
35
|
+
1. `teamix-evo ui upgrade <id>` 触发
|
|
36
|
+
2. CLI 把上游最新版组件源码下载到 `.teamix-evo/ui/incoming/<id>.tsx`(临时缓存)
|
|
37
|
+
3. CLI 输出指引,提示业务侧 AI 调用 skill `teamix-evo-ui-upgrade`
|
|
38
|
+
4. AI 通过 skill 读两个文件:
|
|
39
|
+
- 用户当前的 `src/components/ui/<id>.tsx`(可能含定制)
|
|
40
|
+
- `.teamix-evo/ui/incoming/<id>.tsx`(上游最新)
|
|
41
|
+
5. AI 做"两方语义合并":
|
|
42
|
+
- 判断 incoming 改动属于:bug 修复 / 新功能 / 重构
|
|
43
|
+
- 判断 current 改动属于:业务定制 / 覆盖 upstream
|
|
44
|
+
- 在 current 上移植 incoming 的新行为,**保留用户的所有显式定制**
|
|
45
|
+
6. AI 完成 merge,**删除 `.teamix-evo/ui/incoming/<id>.tsx` 缓存**
|
|
46
|
+
|
|
47
|
+
### Skill 关键引导词
|
|
48
|
+
|
|
49
|
+
> 你拿到的是两个文件:用户当前版本(可能含业务定制)和上游最新版本(刚下载,还没合并)。**没有基线**,所以你要靠语义判断:上游的改动看起来是 bug 修复 / 新功能 / 重构哪一类?用户的改动看起来是业务定制还是覆盖了上游?**保留用户的所有显式定制,移植上游的新行为**。合并完成后删除 `.teamix-evo/ui/incoming/<id>.tsx` 缓存。
|
|
50
|
+
|
|
51
|
+
## Consequences
|
|
52
|
+
|
|
53
|
+
- **Positive**:
|
|
54
|
+
- 不污染用户项目(无历史快照在业务侧)
|
|
55
|
+
- 简化(无 baseline 同步问题)
|
|
56
|
+
- AI 的语义理解适合"小改 + 上游修复"场景
|
|
57
|
+
- **Negative**:
|
|
58
|
+
- 比三方合并精确性差(无 baseline,只有两方文件)
|
|
59
|
+
- 上游大改时 AI 容易出错,仍需人介入审查
|
|
60
|
+
- 依赖业务侧 IDE 装了对应 skill(`teamix-evo-manage` 引导)
|
|
61
|
+
- **Trade-off**:
|
|
62
|
+
- 用"AI 语义判断的精确度损失"换"工程简化(无 baseline)"
|
|
63
|
+
- 大改本来就需要人介入,baseline 帮助有限——这是放弃 baseline 的核心论证
|
|
64
|
+
|
|
65
|
+
## Source
|
|
66
|
+
|
|
67
|
+
[`PLAN.md`](../../PLAN.md) §10.9
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# 0007. 仓库治理文档放在根目录,与 `packages/docs/`(产品文档)分离
|
|
2
|
+
|
|
3
|
+
- **Status**: Accepted
|
|
4
|
+
- **Date**: 2026-05-17
|
|
5
|
+
- **Region**: 0001–0099 工程哲学(目录布局即 identity 决策)
|
|
6
|
+
- **Related ADR**: [0002 包命名方案](0002-package-naming.md)
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
仓库已有 `packages/docs/`(VitePress 产品文档站,装机后给业务消费方看的"怎么用")。在 P0-1 启动 ADR 流程时,新建了根目录 `docs/adr/`。这引出疑问:**为什么 ADR 不放进 `packages/docs/adr/`,与产品文档统一管理?根目录多一个 `docs/` 是否破坏 monorepo 集中性?**
|
|
11
|
+
|
|
12
|
+
这个疑问会反复出现(每个新 maintainer / AI agent 看到都会问),如果不显式锁定,会在未来某次"清理"中被错误地搬走。
|
|
13
|
+
|
|
14
|
+
## Options Considered
|
|
15
|
+
|
|
16
|
+
| 选项 | 优点 | 缺点 |
|
|
17
|
+
| ---- | ---- | ---- |
|
|
18
|
+
| A. 治理文档全部进 `packages/docs/` | monorepo 字面统一 | ADR 会被 VitePress 打包发布(本不应该);PLAN.md / AGENTS.md / CLAUDE.md 也得同步搬,扰动巨大 |
|
|
19
|
+
| **B. 治理文档放根目录,产品文档放 `packages/docs/`(本决策)** | 边界清晰;符合业界惯例(adr-tools / Spotify / Microsoft / ThoughtWorks);ADR 不被发布 | 根目录有 `docs/` 与 `packages/docs/` 字面相似,首次接触者会问 |
|
|
20
|
+
| C. 治理文档改名 `meta/` 或 `governance/` 避免与 `packages/docs/` 同名 | 字面无歧义 | 与业界惯例(`docs/adr/`)割裂;adr-tools 等工具默认路径失效 |
|
|
21
|
+
| D. ADR 移到 `.adr/`(类似 `.changeset/`) | 暗示"工具元数据" | 点开头被多数 IDE 默认隐藏;ADR 是给人读的,不该藏 |
|
|
22
|
+
|
|
23
|
+
## Decision
|
|
24
|
+
|
|
25
|
+
**仓库治理文档(governance docs)放在仓库根目录;产品文档(product docs)放在 `packages/docs/`。**
|
|
26
|
+
|
|
27
|
+
边界清单(可扩展):
|
|
28
|
+
|
|
29
|
+
| 类别 | 位置 | 读者 | 发布吗? |
|
|
30
|
+
| ---- | ---- | ---- | -------- |
|
|
31
|
+
| ADR(架构决策记录) | `docs/adr/` | maintainer + reviewer subagent | ❌ 不发布 |
|
|
32
|
+
| PLAN.md(路线图) | 根目录 | maintainer | ❌ 不发布 |
|
|
33
|
+
| AGENTS.md(AI 协作入口) | 根目录 + `packages/*/AGENTS.md` | AI 编码助手 | ❌ 不发布 |
|
|
34
|
+
| CLAUDE.md(Claude Code 指针) | 根目录 + `packages/*/CLAUDE.md` | Claude Code | ❌ 不发布 |
|
|
35
|
+
| CONTRIBUTING.md(贡献指南) | 根目录 | 外部贡献者 | ❌ 不发布(GitHub 自动渲染) |
|
|
36
|
+
| README.md | 根目录 + 各 package | 所有人 | ✅ 随包发布(各包自己的 README) |
|
|
37
|
+
| VitePress 产品文档 | `packages/docs/` | 业务消费方(装机后) | ✅ 部署到文档站 |
|
|
38
|
+
| API 参考(未来) | `packages/docs/api/` | 业务消费方 | ✅ 部署到文档站 |
|
|
39
|
+
|
|
40
|
+
`packages/docs/` 的 VitePress sidebar 可以**链接**到根目录 ADR(`../../docs/adr/`),让消费方点链接进入查看;但 ADR 文件本身不被 VitePress 编译/打包/部署。
|
|
41
|
+
|
|
42
|
+
## Consequences
|
|
43
|
+
|
|
44
|
+
- **Positive**:
|
|
45
|
+
- 治理 vs 产品边界清晰,每类文档读者明确
|
|
46
|
+
- ADR 不会被错误地随产品文档发布
|
|
47
|
+
- 与 [adr.github.io](https://adr.github.io/) 列出的 ~15 个 ADR 工具默认路径兼容(adr-tools / log4brains / madr / dendron-adr 等)
|
|
48
|
+
- 未来加 [`docs/principles.md`](../principles.md) / [`docs/architecture.md`](../architecture.md) / `docs/slo/` 时位置一致
|
|
49
|
+
- **Negative**:
|
|
50
|
+
- 根目录有 `docs/`(治理)与 `packages/docs/`(产品)字面相似,新人首次接触会问
|
|
51
|
+
- 需要在 README / AGENTS.md 显式说明边界
|
|
52
|
+
- **Trade-off**:
|
|
53
|
+
- 用"字面相似带来的解释成本"换"语义清晰 + 业界惯例一致 + 不污染发布产物"
|
|
54
|
+
|
|
55
|
+
## Implementation note
|
|
56
|
+
|
|
57
|
+
- 根 `AGENTS.md` 的"快速导航"表已含"架构与决策记录 → PLAN.md";v0.5 阶段一并入演进时会同步加一条"决策记录(ADR)→ docs/adr/"
|
|
58
|
+
- `packages/docs/` 的 VitePress 配置在 v1.0 升级时,sidebar 加一条"决策档案"指向 `../../docs/adr/README.md`,**只读链接,不复制**
|
|
59
|
+
|
|
60
|
+
## Source
|
|
61
|
+
|
|
62
|
+
2026-05-17 用户对 P0-1 产物的目录布局质疑;本 ADR 把当时讨论的判断锁定为可引用决策。
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# 0008. ESLint 视觉规则暂为 `warn` 级,等待 `@teamix-evo/design` 补齐状态色与布局尺寸 token
|
|
2
|
+
|
|
3
|
+
- **Status**: Accepted (2026-05-17) → **还款已完成 2026-05-19**(三规则升至 `error`,见文末 §Implementation note 落地记录)
|
|
4
|
+
- **Date**: 2026-05-17
|
|
5
|
+
- **Region**: 0100–0999 协议与工具
|
|
6
|
+
- **Related ADR**: [0001 三层对齐](0001-three-layer-alignment.md) / [0005 UI 包不分 variant](0005-ui-no-variant.md) / [0010 design 默认+变体](0010-design-default-and-variants.md)(token 补全落 `default/foundations/tokens/`)/ [0012 lint-core 共享内核](0012-lint-shared-core.md)(token-allowlist 单点维护;v0.6 ratchet 一并落地)
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
P0-2 在 [`@teamix-evo/eslint-config`](../../packages/eslint-config/) 中实现了 6 条 token-discipline 规则,接入 `packages/ui/` 后**首次**对全量 ~50 个组件源码执行 lint,得到:
|
|
11
|
+
|
|
12
|
+
| 规则 | 违规数 | 性质 |
|
|
13
|
+
| --- | ---: | --- |
|
|
14
|
+
| `no-relative-ui-import` | 40 → **0**(本轮已机械修) | 工程契约 |
|
|
15
|
+
| `icon-from-lucide` | 0 | 工程契约 |
|
|
16
|
+
| `no-large-radius` | 0 | 视觉刻度 |
|
|
17
|
+
| `no-arbitrary-tw-value` | 68 | 视觉/布局 |
|
|
18
|
+
| `no-raw-color-scale` | 59 | 视觉/状态色 |
|
|
19
|
+
| `no-color-literal` | 23 | 视觉/遮罩 |
|
|
20
|
+
|
|
21
|
+
后三条规则的违规**不是开发者随手写**,而是 [`@teamix-evo/design`](../../packages/design/library/opentrek/tokens/semantic.tokens.json) 当前的语义 token 集合**没有覆盖**这些用例:
|
|
22
|
+
|
|
23
|
+
| 缺失维度 | 现状 | 真实违规来源 |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| 状态色(success / warning / info) | 只有 `destructive` / `error` | `bg-emerald-500` / `bg-amber-500` / `text-blue-700` 等 ~59 处(timeline、typography、tag、badge、alert 等) |
|
|
26
|
+
| 布局尺寸(dialog-md、min-w-menu、 max-w-prose 等) | 无 | `w-[600px]` / `w-[720px]` / `min-w-[8rem]` 等 ~30 处(dialog、drawer、menu、command 等) |
|
|
27
|
+
| 辅助字号(`text-xxs`、相对 em) | 无 | `text-[10px]` × 6 / `text-[0.875em]` × 2(kbd、typography) |
|
|
28
|
+
| 半透明遮罩(overlay-bg) | 无 | `rgba(0,0,0,0.5)` 等 ~15 处(watermark、tour) |
|
|
29
|
+
|
|
30
|
+
如果把这三条规则强制为 `error`,150+ 违规会**立刻把 CI 卡死**——但根因在 design,不在代码作者;粗暴 fail 等于把责任错置。
|
|
31
|
+
|
|
32
|
+
## Options Considered
|
|
33
|
+
|
|
34
|
+
| 选项 | 优点 | 缺点 |
|
|
35
|
+
| --- | --- | --- |
|
|
36
|
+
| A. 把三条规则保持 `error`,强制立即修代码 | 短期严格 | 把"design 系统不完整"伪装成"组件作者疏忽";代码作者只能继续 hack(改回 emerald)或加大量 `eslint-disable` 注释,知识进一步隐匿 |
|
|
37
|
+
| B. 把三条规则置 `off`,等 v0.6 再开 | 简单 | 失去违规可见性;新增违规也无人察觉,熵增不可控 |
|
|
38
|
+
| **C. 三条规则降为 `warn`,显式 ADR 锁定 + v0.6 补 token 计划(本决策)** | CI 不阻塞,但违规可见在 PR diff / 编辑器红波浪;新增违规走 `warn` 也提示作者;v0.6 ratchet 升回 `error` | 短期内 CI 不能阻挡新视觉违规;依赖 reviewer 看 lint 报告 |
|
|
39
|
+
| D. 给现存 150 处加 `// eslint-disable-next-line + TODO(v0.6: ...)` | 显式豁免 | 150 处注释污染代码;每处需要 reviewer 判断 TODO 文本;实际上无新增可见性收益 |
|
|
40
|
+
|
|
41
|
+
## Decision
|
|
42
|
+
|
|
43
|
+
采用**方案 C**:
|
|
44
|
+
|
|
45
|
+
1. **`@teamix-evo/eslint-config/presets/ui`** 与 `presets/consumer` 中:
|
|
46
|
+
- **error 级(立即阻塞)**:`no-relative-ui-import` / `icon-from-lucide` / `no-large-radius`
|
|
47
|
+
- **warn 级(暂时不阻塞)**:`no-color-literal` / `no-raw-color-scale` / `no-arbitrary-tw-value`
|
|
48
|
+
2. **v0.6(根据 PLAN §12.5)的工作内容必须包含**:
|
|
49
|
+
- design 包加状态色 semantic token:`feedback.success` / `feedback.warning` / `feedback.info` 与对应 `*-foreground` / `*-subtle` / `*-border`
|
|
50
|
+
- design 包加布局尺寸 semantic token:`layout.dialog-sm/md/lg/xl`、`layout.menu-min-width`、`layout.popover-max-width` 等
|
|
51
|
+
- design 包加辅助字号:`typography.size-xxs`、`typography.size-sm-em`(相对父元素)
|
|
52
|
+
- design 包加遮罩 token:`overlay.scrim`、`overlay.watermark`(允许半透明黑/白)
|
|
53
|
+
3. **v0.6 收尾**:三条规则 ratchet 升回 `error`;一并清理掉这一阶段堆积的 `warn`(预计 150 处全部修)。
|
|
54
|
+
4. **v0.6 之前的新代码**:仍走 `warn`,不阻塞 CI,但 reviewer subagent(规划于 v0.7)在 PR 时可以引用本 ADR 拒绝"再增加新违规"。
|
|
55
|
+
|
|
56
|
+
## Consequences
|
|
57
|
+
|
|
58
|
+
- **Positive**:
|
|
59
|
+
- P0-2 ESLint 接入完整(6 条规则 + 包 + 测试),不在"完不成"和"暴力修"之间二选一
|
|
60
|
+
- 现存 150 处违规可见(IDE 红波浪 + lint 报告),不被忽略
|
|
61
|
+
- design 系统的真实 gap 被显式记录,v0.6 有明确的"补哪些 token"清单
|
|
62
|
+
- `no-relative-ui-import` 已经 ratchet 起作用——任何新跨组件 import 必须用 `@/` 别名,违反阻塞 CI
|
|
63
|
+
- **Negative**:
|
|
64
|
+
- v0.5 阶段 CI 不会因新视觉违规失败,依赖 reviewer 警觉 / 编辑器红波浪
|
|
65
|
+
- v0.6 落地前 design tokens 不完整,业务消费方装 `@teamix-evo/design` 后做"成功状态"也没 token 可用(同样问题,但消费方先发现)
|
|
66
|
+
- **Trade-off**:
|
|
67
|
+
- 用"短期 visual CI 兜底缺口"换"design 系统正确补完整 + 不污染代码 150 处 disable 注释 + 不让作者继续 hack"
|
|
68
|
+
- 这是有意识的债务,有明确还款计划(v0.6),不是默认遮蔽
|
|
69
|
+
|
|
70
|
+
## Implementation note (本 ADR 落地的具体动作)
|
|
71
|
+
|
|
72
|
+
- [`packages/eslint-config/src/presets/ui.ts`](../../packages/eslint-config/src/presets/ui.ts):三条规则改为 `warn`,文件级注释引用本 ADR
|
|
73
|
+
- [`packages/eslint-config/src/presets/consumer.ts`](../../packages/eslint-config/src/presets/consumer.ts):同上
|
|
74
|
+
- [`packages/ui/eslint.config.js`](../../packages/ui/eslint.config.js):接入 `presets/ui`(已完成)
|
|
75
|
+
- [`PLAN.md §12.5 v0.6 任务清单`](../../PLAN.md#125-v06--闸层补强--协议层雏形12-18-人日):需补一行"design 状态色 / 布局尺寸 / 遮罩 token + 视觉规则 ratchet 升回 error"
|
|
76
|
+
- 本 ADR 在 v0.6 完成时改 `Status: Superseded by NNNN`,新 ADR 记录 ratchet 之后的状态
|
|
77
|
+
|
|
78
|
+
### 还款落地记录(2026-05-19)
|
|
79
|
+
|
|
80
|
+
**design token 补全**(`packages/design/default/foundations/tokens/`):
|
|
81
|
+
|
|
82
|
+
- 状态色 × 4 变体:`success` / `warning` / `info` × `{base, foreground, subtle, border}` = 12 颗 color token
|
|
83
|
+
- 布局尺寸:`layout-dialog-{sm,md,lg,xl}` / `layout-panel-{sm,md}` / `layout-submenu` / `layout-menu-{min,md}` / `layout-popover-max` / `layout-listbox-max` / `layout-counter` / `layout-notification` / `layout-textarea-min` / `layout-image-preview-max-{w,h}` 共 16 颗 dimension token
|
|
84
|
+
- 遮罩:`overlay-scrim`(rgba(0,0,0,0.5)) / `overlay-watermark`(rgba(0,0,0,0.15))
|
|
85
|
+
- 辅助字号:`text-xxs`(0.625rem) / `text-xs-cal`(0.8rem)
|
|
86
|
+
- Radix passthrough:`{w,h}-radix-nav-viewport` / `{h,min-w}-radix-select-trigger`
|
|
87
|
+
- 同步落到 `base.tokens.json` / `semantic.tokens.json` / `tokens.generated.css` / `tokens.theme.css` / `tailwind.preset.ts` 五处。
|
|
88
|
+
|
|
89
|
+
**lint-core 同步**(`packages/lint-core/src/data/token-allowlist.ts`):取消 v0.6 注释占位 + 加 16 个 layout token 名,共 33 个新 token 入 allowlist。
|
|
90
|
+
|
|
91
|
+
**packages/ui/ 修代码**(115 处违规):
|
|
92
|
+
|
|
93
|
+
- 11 类机械替换:`bg-emerald-*` → `bg-success-*` / `bg-amber-*` → `bg-warning-*` / `bg-blue-*` → `bg-info-*`(成功 / 警告 / 提示三色 × subtle / border / foreground 等变体 = ~70 处);`w-[600px]` 等 → `w-dialog-md` 等(layout dimension = ~30 处);`text-[10px]` → `text-xxs` 等(typography = ~8 处);`left-[50%]` → `left-1/2`(Tailwind 内置)。
|
|
94
|
+
- 4 处合法一次性 `eslint-disable-next-line` + 原因注释:`color-picker.tsx` defaultValue API 需 hex 字面量;`watermark.tsx` 渲染走 canvas API 不支持 CSS var();`drawer.tsx` 拖拽手柄宽 100px 是视觉常量;`kbd.tsx` 键帽内阴影 / `masonry.tsx` 运行时 var / `navigation-menu.tsx` indicator 60% 锚点 / `timeline.tsx` calc() 连接线 / `typography.tsx` em-relative inline code 同理。
|
|
95
|
+
- 1 处 SVG attr 改用 `var(--overlay-scrim)`:`tour.tsx` SVG `<rect fill>`。
|
|
96
|
+
|
|
97
|
+
**ratchet**(`packages/eslint-config/src/presets/`):
|
|
98
|
+
|
|
99
|
+
- `ui.ts` + `consumer.ts` 三条视觉规则:`warn` → `error`。
|
|
100
|
+
- `ui.ts` 内 stories / tests override 块**保留** `warn`(per ADR 0008 §Implementation note "research artifacts" 立场;demo 用临时尺寸 / 演示色板不阻塞 CI)。
|
|
101
|
+
|
|
102
|
+
**最终状态**:`pnpm --filter @teamix-evo/ui lint` = 0 errors / 47 warnings(全部在 stories 内,符合 design intent)。全仓 350 测试 / 11 包 typecheck 全绿。
|
|
103
|
+
|
|
104
|
+
**ADR 状态**:本 ADR 无需 Supersede(还款已是预定动作,落地后债务清零;留作 v0.6 历史记录)。后续视觉规则若再发现 gap,按 ADR 模板再起新条目即可。
|
|
105
|
+
|
|
106
|
+
## Source
|
|
107
|
+
|
|
108
|
+
- 2026-05-17 P0-2 (b) 接入 ESLint 后首次 lint 输出(`pnpm --filter @teamix-evo/ui lint`)
|
|
109
|
+
- [`PLAN.md §12.11 风险与不该做的事`](../../PLAN.md#1211-风险与不该做的事) 第一条预案:"第一批只上 6 条**红线级**规则;'建议级'用 `warn` 不阻塞 CI"——本 ADR 是该预案的具体应用
|
|
110
|
+
- [`packages/design/library/opentrek/tokens/semantic.tokens.json`](../../packages/design/library/opentrek/tokens/semantic.tokens.json):当前语义 token 集合,无 success / warning / info / 布局尺寸 / 遮罩
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# 0009. `@teamix-evo/registry-mcp` 作为 AI 协议层的第一个 MCP server
|
|
2
|
+
|
|
3
|
+
- **Status**: Superseded in part by [0011](0011-mcp-single-package-multi-group.md)(2026-05-18)— 原"包形态 / bin 名 / `.mcp.json` 条目名"被 0011 取代;**核心决策(MCP 作为协议层 / stdio / 三个 registry tool)依然有效**
|
|
4
|
+
- **Date**: 2026-05-17
|
|
5
|
+
- **Region**: 0100–0999 协议与工具
|
|
6
|
+
- **Related ADR**: [0001 三层对齐](0001-three-layer-alignment.md) / [0005 UI 不分 variant](0005-ui-no-variant.md) / [0011 mcp 单包单 bin 多 group](0011-mcp-single-package-multi-group.md)
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
teamix-evo MVP 阶段 ([Phase 0–10](../../PLAN.md#5-研发计划分阶段)) 把 `@teamix-evo/ui` 的 `manifest.json` 设计为静态 JSON(56KB,89 entries),业务侧 AI 编辑器(Cursor / Claude Code / Cline)通过 RAG 把它分块塞进上下文。这个机制有三个问题:
|
|
11
|
+
|
|
12
|
+
1. **副本漂移**——每个消费方拿一份 snapshot,与上游 `@teamix-evo/ui` 升级后必然脱节
|
|
13
|
+
2. **AI 处理 56KB 困难**——chunking + RAG 的召回率差,模型经常报"组件不存在"或挑错版本
|
|
14
|
+
3. **缺乏受控查询面**——无法表达"找一个支持异步搜索 + 分页的组件",只能被动读
|
|
15
|
+
|
|
16
|
+
这是 [PLAN §12.3 P0-4](../../PLAN.md#123-p0-紧急清单下个-sprint--12-人日) 要解决的核心问题:把静态 JSON 升级为可被 AI 主动调用的 Model Context Protocol (MCP) server。
|
|
17
|
+
|
|
18
|
+
## Options Considered
|
|
19
|
+
|
|
20
|
+
| 选项 | 优点 | 缺点 |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| A. 维持静态 manifest.json + 在 AGENTS.md 引导 AI 用 grep | 零工程成本 | 副本漂移、56KB 处理低效、查询表达力差(本节 Context 已述) |
|
|
23
|
+
| B. 自定义 HTTP 接口 + 让 AI 调 `fetch()` | 灵活 | 不是任何 IDE 的事实标准;Cursor / Claude Code / Cline 各有自家"工具调用"协议,需写 4 套适配 |
|
|
24
|
+
| **C. MCP server(本决策)** | Anthropic 推、OpenAI 跟、Cursor / Claude Code / Cline / Aider 均原生支持;一份代码,所有 AI 编辑器可用;运行时直接读 manifest 单一来源 | 引入 `@modelcontextprotocol/sdk` 依赖;协议本身仍在演进(当前 1.x);需要每个消费方在 IDE 配置中接入 |
|
|
25
|
+
|
|
26
|
+
## Decision
|
|
27
|
+
|
|
28
|
+
新建 [`@teamix-evo/registry-mcp`](../../packages/registry-mcp/) 包,作为 teamix-evo 的**第一个**协议层 MCP server。
|
|
29
|
+
|
|
30
|
+
### 形态
|
|
31
|
+
|
|
32
|
+
- **stdio transport**(MCP 默认):零网络配置,每次 IDE 启动 server 子进程,通信通过 stdin/stdout 的 JSON-RPC 2.0 帧
|
|
33
|
+
- **零静态副本**——server 直接读 `@teamix-evo/ui/manifest.json` 的物理文件(用 `require.resolve` 解析,fallback 到环境变量与父目录回溯)
|
|
34
|
+
- **bin 入口**:`teamix-evo-registry-mcp`(消费方通过 `npx @teamix-evo/registry-mcp` 调用)
|
|
35
|
+
|
|
36
|
+
### 暴露的 Tools(MVP,3 个)
|
|
37
|
+
|
|
38
|
+
| Tool | 输入 | 输出 |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| `list_components` | `status?: 'stable' \| 'experimental' \| 'deprecated'` | 全量组件简表(id / name / description / status / registryDependencies) |
|
|
41
|
+
| `get_component_meta` | `id: string` | 完整 `UiEntry` + 解析后的 `meta.md`(frontmatter + body) |
|
|
42
|
+
| `find_components` | `query: string`, `limit?: number` | 子串匹配 id / name / description 的命中列表 |
|
|
43
|
+
|
|
44
|
+
### v0.7 升级路径
|
|
45
|
+
|
|
46
|
+
`find_components` 当前是**子串匹配**——直白、可调试、零额外依赖。v0.7 升级为**语义搜索**(向量化 description + meta.md,余弦相似度 top-k),但**不引入新工具名**——同一个 `find_components` 工具,实现替换;客户端代码零改动。
|
|
47
|
+
|
|
48
|
+
### IDE 配置(消费方侧)
|
|
49
|
+
|
|
50
|
+
提供根目录 [`.mcp.json`](../../.mcp.json) 模板,业务侧装机后由 `create-teamix-evo` preset 复制并填入。Cursor / Claude Code / Cline 各自的 MCP 配置位置不同,但 server 命令一致。
|
|
51
|
+
|
|
52
|
+
### 单元测试
|
|
53
|
+
|
|
54
|
+
`packages/registry-mcp/tests/`(将随 [ADR 0011](0011-mcp-single-package-multi-group.md) 改名 → `packages/mcp/tests/groups/registry/`):
|
|
55
|
+
|
|
56
|
+
- `manifest-loader.test.ts` — 校验 manifest 解析、frontmatter 解析、env / 父目录回溯三层路径解析
|
|
57
|
+
- `server.test.ts` — 直接 invoke MCP `tools/call` 处理函数,跨 fixture 验证 3 个工具的正确性
|
|
58
|
+
|
|
59
|
+
## Consequences
|
|
60
|
+
|
|
61
|
+
- **Positive**:
|
|
62
|
+
- **副本漂移消除** —— server 每次响应都直接读上游 manifest,与 [`@teamix-evo/ui`](../../packages/ui/) 同步
|
|
63
|
+
- **AI 协同体验跃升** —— 模型从"扫 56KB 寻找"变成"主动调用 `find_components`",上下文消耗下降一个数量级
|
|
64
|
+
- **跨 IDE 复用** —— 一份 server 代码,Cursor / Claude Code / Cline / Aider / 未来所有 MCP 客户端都用得上,不需要按 IDE 写适配
|
|
65
|
+
- **协议层可扩展** —— 后续 `tokens-mcp` / `scenario-mcp` / `adr-mcp` 可复用本包的 manifest-loader / fixture / test 模式(见 [PLAN §12.5/12.6/12.7](../../PLAN.md#12-五层模型驱动的演进规划v05))
|
|
66
|
+
- **status 字段(ADR 0003 续)立即变现** —— `list_components` 已支持按 `status` 过滤,deprecation 信号通过 `replacedBy` 字段直接传给 AI
|
|
67
|
+
- **Negative**:
|
|
68
|
+
- 消费方需在 IDE 的 MCP 配置中加一段(每个 IDE 配置位置不同,需要文档明示)
|
|
69
|
+
- `@modelcontextprotocol/sdk` 处于 1.x 早期阶段,可能在 2026 年内出现破坏性变更
|
|
70
|
+
- stdio transport 启动时延 ~50–200ms(每次 IDE 启动 server 子进程),对超大 manifest 不算瓶颈,但需注意
|
|
71
|
+
- 子串搜索的召回率有限(中英文混合查询、同义词不命中),v0.7 才解决
|
|
72
|
+
- **Trade-off**:
|
|
73
|
+
- 用"协议依赖 + IDE 配置成本"换"副本漂移消失 + 跨 IDE 复用 + AI 上下文效率"
|
|
74
|
+
- 用"v0.1 子串搜索的有限召回"换"零向量库依赖 + 实现简单 + 接入快"
|
|
75
|
+
|
|
76
|
+
## Implementation note
|
|
77
|
+
|
|
78
|
+
- `packages/registry-mcp/src/cli.ts` 是 bin 入口;直接通过 `node ./dist/cli.js` 启动 stdio server
|
|
79
|
+
- Manifest 解析顺序在 [`manifest-loader.ts`](../../packages/registry-mcp/src/manifest-loader.ts) 中:`TEAMIX_EVO_UI_MANIFEST` env > `<cwd>/node_modules/@teamix-evo/ui/manifest.json` > 父目录回溯
|
|
80
|
+
- 测试通过 MCP 内部 `_requestHandlers` map 直接调用工具处理函数,绕过 transport 层(单元测试不需要 stdio 真启动)
|
|
81
|
+
- Smoke 测试已验证:`echo '{...}' | node ./dist/cli.js` 三轮 JSON-RPC 调用(initialize / tools/list / tools/call find_components)在真实 packages/ui/manifest.json 上正确返回 `table` + `data-table`
|
|
82
|
+
|
|
83
|
+
## Source
|
|
84
|
+
|
|
85
|
+
- [PLAN.md §12.3 P0-4](../../PLAN.md#123-p0-紧急清单下个-sprint--12-人日):"第一版 registry-mcp,暴露 list_components / get_component_meta / find_similar 三个工具"
|
|
86
|
+
- [`packages/eslint-config` ADR 0008](0008-eslint-visual-rules-warn-baseline.md) 已展示"把约束从文字下沉为机器规则"的同型动作;本 ADR 是协议层的同型动作("把 56KB JSON 下沉为可调用工具")
|
|
87
|
+
- [Model Context Protocol 官方规范](https://modelcontextprotocol.io)
|