@uoyo/mvtt 2.0.0-beta.4 → 2.0.0-beta.6

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 (86) hide show
  1. package/README.md +299 -64
  2. package/README.zh-CN.md +419 -0
  3. package/dist/commands/install.d.ts.map +1 -1
  4. package/dist/commands/install.js +27 -2
  5. package/dist/commands/install.js.map +1 -1
  6. package/dist/commands/uninstall.d.ts.map +1 -1
  7. package/dist/commands/uninstall.js +19 -7
  8. package/dist/commands/uninstall.js.map +1 -1
  9. package/dist/commands/update.d.ts.map +1 -1
  10. package/dist/commands/update.js +4 -2
  11. package/dist/commands/update.js.map +1 -1
  12. package/dist/fs/install-manifest.d.ts +4 -1
  13. package/dist/fs/install-manifest.d.ts.map +1 -1
  14. package/dist/fs/install-manifest.js +13 -1
  15. package/dist/fs/install-manifest.js.map +1 -1
  16. package/dist/fs/materialize.d.ts +2 -0
  17. package/dist/fs/materialize.d.ts.map +1 -1
  18. package/dist/fs/materialize.js +39 -9
  19. package/dist/fs/materialize.js.map +1 -1
  20. package/dist/fs/registry-merge.d.ts.map +1 -1
  21. package/dist/fs/registry-merge.js +72 -29
  22. package/dist/fs/registry-merge.js.map +1 -1
  23. package/dist/scripts/epic-update.cjs +7670 -0
  24. package/dist/scripts/plan-update.cjs +255 -82
  25. package/dist/scripts/session-update.cjs +84 -6
  26. package/dist/types/platform.d.ts +12 -0
  27. package/dist/types/platform.d.ts.map +1 -0
  28. package/dist/types/platform.js +24 -0
  29. package/dist/types/platform.js.map +1 -0
  30. package/dist/types/registry.d.ts +3 -24
  31. package/dist/types/registry.d.ts.map +1 -1
  32. package/install-manifest.yaml +4 -0
  33. package/package.json +1 -1
  34. package/registry.yaml +72 -198
  35. package/sources/defaults/config.yaml +8 -13
  36. package/sources/defaults/project-context.yaml +2 -5
  37. package/sources/defaults/session.yaml +14 -2
  38. package/sources/knowledge/core/manifest.yaml +1 -4
  39. package/sources/scripts/epic-update.js +512 -0
  40. package/sources/scripts/plan-update.js +614 -353
  41. package/sources/scripts/session-update.js +102 -2
  42. package/sources/sections/activation-load-config.md +1 -1
  43. package/sources/sections/activation-load-context.md +42 -13
  44. package/sources/sections/activation-preflight.md +1 -1
  45. package/sources/sections/footer-next-steps.md +3 -2
  46. package/sources/sections/session-update.md +41 -1
  47. package/sources/skills/mvt-analyze/business.md +46 -8
  48. package/sources/skills/mvt-analyze/manifest.yaml +5 -1
  49. package/sources/skills/mvt-analyze-code/business.md +18 -17
  50. package/sources/skills/mvt-analyze-code/manifest.yaml +3 -6
  51. package/sources/skills/mvt-check-context/business.md +13 -6
  52. package/sources/skills/mvt-check-context/manifest.yaml +0 -5
  53. package/sources/skills/mvt-cleanup/business.md +17 -2
  54. package/sources/skills/mvt-config/business.md +5 -5
  55. package/sources/skills/mvt-config/manifest.yaml +3 -6
  56. package/sources/skills/mvt-create-skill/business.md +2 -14
  57. package/sources/skills/mvt-create-skill/manifest.yaml +0 -5
  58. package/sources/skills/mvt-decompose/business.md +94 -0
  59. package/sources/skills/mvt-decompose/manifest.yaml +121 -0
  60. package/sources/skills/mvt-fix/business.md +21 -6
  61. package/sources/skills/mvt-fix/manifest.yaml +1 -1
  62. package/sources/skills/mvt-help/business.md +11 -9
  63. package/sources/skills/mvt-help/manifest.yaml +0 -5
  64. package/sources/skills/mvt-implement/business.md +51 -8
  65. package/sources/skills/mvt-init/business.md +23 -13
  66. package/sources/skills/mvt-init/manifest.yaml +1 -2
  67. package/sources/skills/mvt-manage-context/business.md +41 -14
  68. package/sources/skills/mvt-manage-context/manifest.yaml +2 -6
  69. package/sources/skills/mvt-plan-dev/business.md +17 -9
  70. package/sources/skills/mvt-quick-dev/business.md +22 -7
  71. package/sources/skills/mvt-quick-dev/manifest.yaml +0 -1
  72. package/sources/skills/mvt-refactor/business.md +32 -17
  73. package/sources/skills/mvt-refactor/manifest.yaml +0 -5
  74. package/sources/skills/mvt-resume/business.md +32 -12
  75. package/sources/skills/mvt-resume/manifest.yaml +3 -3
  76. package/sources/skills/mvt-review/business.md +24 -9
  77. package/sources/skills/mvt-status/business.md +37 -9
  78. package/sources/skills/mvt-status/manifest.yaml +2 -2
  79. package/sources/skills/mvt-sync-context/business.md +30 -16
  80. package/sources/skills/mvt-template/business.md +1 -1
  81. package/sources/skills/mvt-template/manifest.yaml +0 -5
  82. package/sources/skills/mvt-test/business.md +30 -15
  83. package/sources/skills/mvt-update-plan/business.md +41 -12
  84. package/sources/skills/mvt-update-plan/manifest.yaml +7 -7
  85. package/sources/templates/decompose-output/body.md +13 -0
  86. package/sources/templates/decompose-output/manifest.yaml +11 -0
@@ -0,0 +1,419 @@
1
+ # My Virtual Tech Team (MVTT)
2
+
3
+ > **告别重复的上下文。功能端到端一气贯通。**
4
+ >
5
+ > 24 个专项 AI 技能,共享同一个持久化工作区 —— 覆盖从需求分析到测试交付的完整开发全流程。
6
+
7
+ [English](README.md) | **中文**
8
+
9
+ [![npm](https://img.shields.io/npm/v/@uoyo/mvtt)](https://www.npmjs.com/package/@uoyo/mvtt) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![GitHub stars](https://img.shields.io/github/stars/uoyoCsharp/My-Virtual-TechTeam)](https://github.com/uoyoCsharp/My-Virtual-TechTeam/stargazers)
10
+
11
+ ## 你正在面对的难题
12
+
13
+ 每次 Claude Code 会话都从零开始。昨天花心思搭起来的项目上下文 —— 架构、约定、领域知识 —— 今天又没了。
14
+
15
+ 在真实项目里,有三件事特别让人头疼:
16
+
17
+ - **上下文蒸发** —— 关闭 IDE、换台电脑、过一周再回来,AI 已经把什么都忘干净了。
18
+ - **每次都要重新交代** —— 解释技术栈、重述代码规范、描述业务领域。
19
+ - **没有职责分离** —— 需求分析、架构设计、写代码、测试,全挤在同一个对话里。
20
+
21
+ > **30 秒心智模型**:把 MVTT 想象成一支驻扎在你代码仓库里的精简工程团队 —— 分析师、架构师、开发、评审、测试 —— 共用同一本项目笔记。流程是标准化的,无论你是高级工程师还是新人,跑出来的效果都一样 —— AI 熟练度不再决定产出质量。这就是 MVTT。
22
+
23
+ ## 快速开始
24
+
25
+ ```bash
26
+ # 安装到任意项目
27
+ npx @uoyo/mvtt install
28
+
29
+ # 在 Claude Code 中运行:
30
+ /mvt-init # 检测技术栈,初始化上下文
31
+ /mvt-analyze # 从需求分析开始
32
+ ```
33
+
34
+ ## MVTT 适合谁
35
+
36
+ MVTT 适合那些用 Claude Code 做真实、长期项目的开发者 —— 不是写一次性脚本的人。
37
+
38
+ **适合 MVTT 的场景:**
39
+
40
+ - 维护一个中等规模代码库(5k+ 行),受够了上下文丢失的痛
41
+ - 即使单兵作战,也想走结构化流程 —— 分析、设计、实现、评审、测试
42
+ - 团队里 AI 熟练度参差不齐 —— MVTT 把流程标准化,让新人老人产出质量一致
43
+ - 中英双语项目:MVTT 完整支持中英文双语
44
+ - 想要一个能跟着仓库走、随团队共享的项目笔记(版本控制,团队可见)
45
+
46
+ **不太适合 MVTT 的场景:**
47
+
48
+ - 写一次性脚本(普通 Claude Code 更快)
49
+ - 需要企业级 CI/CD 流水线或基于角色的权限控制(这不是 MVTT 做的事)
50
+ - 偏好用一份 CLAUDE.md 凑合、自己组装 prompt
51
+
52
+ ## 工作原理
53
+
54
+ ### 随项目一起成长的持久化上下文
55
+
56
+ ```
57
+ .ai-agents/
58
+ ├── workspace/
59
+ │ ├── session.yaml # 谁做了什么、当前在做什么
60
+ │ ├── project-context.yaml # 技术栈、领域模型、约定
61
+ │ └── artifacts/ # 分析文档、设计稿、评审记录
62
+ └── knowledge/
63
+ ├── core/ # 框架原理
64
+ ├── principle/ # 团队代码规范
65
+ └── project/ # 领域知识
66
+ ```
67
+
68
+ 上下文在会话之间**永不丢失**。明天再开一个新的 Claude Code 会话,它会接着上次的地方继续 —— 领域模型、架构决策、进行中的任务、团队约定,全都在。
69
+
70
+ ### 保存、恢复与同步
71
+
72
+ | 能力 | 做法 |
73
+ |---|---|
74
+ | **自动保存进度** | 每个技能执行完都会自动更新 `session.yaml`,记录做了什么 |
75
+ | **任何地方都能恢复** | `/mvt-resume` 在新会话里恢复完整上下文 |
76
+ | **外部改动后同步** | `/mvt-sync-context` 在工作流之外改了代码时同步上下文 |
77
+ | **检查上下文健康度** | `/mvt-check-context` 分析 token 占用并给出优化建议 |
78
+
79
+ 关闭 IDE、换台电脑、隔几天再回来 —— 上下文都存在版本控制的文件里,跟着仓库走。
80
+
81
+ ### 同一份事实,零分歧
82
+
83
+ ```mermaid
84
+ flowchart LR
85
+ ctx["📚 共享上下文层"]
86
+
87
+ subgraph roles ["<b>👥 你的虚拟工程团队</b>"]
88
+ direction TB
89
+ a["🔍<br/><b>分析师</b><sub><br/>analyze</sub>"]
90
+ ar["🏗️<br/><b>架构师</b><br/><sub>design · plan-dev</sub>"]
91
+ d["⚙️<br/><b>开发</b><br/><sub>implement · fix</sub>"]
92
+ r["👀<br/><b>评审</b><br/><sub>review</sub>"]
93
+ t["🧪<br/><b>测试</b><br/><sub>test</sub>"]
94
+ end
95
+
96
+ a ~~~ r
97
+ ar ~~~ t
98
+ d ~~~ t
99
+
100
+ ctx ==> roles
101
+
102
+ style ctx fill:#6d4ad6,stroke:#4c1d95,stroke-width:3px,color:#ffffff,font-weight:bold,font-size:16px
103
+ style roles fill:#faf7ff,stroke:#a78bfa,stroke-width:1px,stroke-dasharray:4 3,color:#4c1d95
104
+
105
+ style a fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#78350f
106
+ style ar fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a
107
+ style d fill:#dcfce7,stroke:#22c55e,stroke-width:2px,color:#14532d
108
+ style r fill:#fce7f3,stroke:#ec4899,stroke-width:2px,color:#831843
109
+ style t fill:#e0e7ff,stroke:#6366f1,stroke-width:2px,color:#312e81
110
+ ```
111
+
112
+ 分析师发现新领域概念,架构师能看到。架构师做了设计决策,开发会照着做。没有任何技能能"我行我素",因为它们动手前都先读同一份事实。
113
+
114
+ ### 完整的开发全流程
115
+
116
+ MVTT 覆盖完整的工程流程 —— 不只是写代码:
117
+
118
+ ```mermaid
119
+ flowchart LR
120
+ A["🔎<br/><b>分析</b><br/><sub>提取领域概念</sub>"] ==> B["🏗️<br/><b>设计</b><br/><sub>定义架构</sub>"] ==> C["📋<br/><b>计划</b><br/><sub>拆解任务</sub>"] ==> D["⚡<br/><b>实现</b><br/><sub>写代码</sub>"] ==> E["🔍<br/><b>评审</b><br/><sub>检查质量</sub>"] ==> F["🧪<br/><b>测试</b><br/><sub>生成测试</sub>"]
121
+
122
+ A -.->|史诗级| G["🧩<br/><b>拆分</b><br/><sub>拆成子改动</sub>"]
123
+ G -.-> B
124
+
125
+ A -.->|小改| H["🚀<br/><b>快速开发</b><br/><sub>跳过繁文缛节</sub>"]
126
+
127
+ style A fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a,font-weight:bold
128
+ style B fill:#e0e7ff,stroke:#6366f1,stroke-width:2px,color:#312e81,font-weight:bold
129
+ style C fill:#ede9fe,stroke:#8b5cf6,stroke-width:2px,color:#4c1d95,font-weight:bold
130
+ style D fill:#fae8ff,stroke:#a855f7,stroke-width:2px,color:#581c87,font-weight:bold
131
+ style E fill:#fce7f3,stroke:#ec4899,stroke-width:2px,color:#831843,font-weight:bold
132
+ style F fill:#dcfce7,stroke:#22c55e,stroke-width:2px,color:#14532d,font-weight:bold
133
+ style G fill:#fef3c7,stroke:#f59e0b,stroke-width:1.5px,stroke-dasharray:5 5,color:#78350f
134
+ style H fill:#e0e7ff,stroke:#6366f1,stroke-width:1.5px,stroke-dasharray:5 5,color:#312e81
135
+
136
+ linkStyle 0 stroke:#6366f1,stroke-width:3px
137
+ linkStyle 1 stroke:#6366f1,stroke-width:3px
138
+ linkStyle 2 stroke:#6366f1,stroke-width:3px
139
+ linkStyle 3 stroke:#6366f1,stroke-width:3px
140
+ linkStyle 4 stroke:#6366f1,stroke-width:3px
141
+ ```
142
+
143
+ 史诗级需求先跑 `/mvt-decompose`,把需求拆成带 DAG 依赖的子改动,再走 `/mvt-analyze`。小改动则用 `/mvt-quick-dev`,直接跳过整个流程。
144
+
145
+ 上下文通过 `session.yaml` 和 `project-context.yaml` 在每个阶段流转 —— 上一步的产出就是下一步的输入。上下文在累积,不在重置。
146
+
147
+ ### 多项目与依赖感知
148
+
149
+ 现实中的仓库很少是单一项目。MVTT 都能应付。
150
+
151
+ **单仓库多项目。** monorepo、微服务、多应用仓库 —— MVTT 天然支持。一份 `project-context.yaml` 用 `projects[]` 数组追踪所有子项目,注册表按项目名路由知识。技能会自动聚焦到当前项目,也可以显式切换作用域。一个工作区,多个项目,上下文不串。
152
+
153
+ ```mermaid
154
+ flowchart TB
155
+ repo["🗂️<br/><b>工作区</b><br/><sub>.ai-agents/</sub>"]
156
+
157
+ subgraph projects ["<b>📦 多项目追踪</b>"]
158
+ direction LR
159
+ p1["📘<br/><b>项目 A</b><br/><sub>api-server</sub>"]
160
+ p2["📗<br/><b>项目 B</b><br/><sub>web-app</sub>"]
161
+ p3["📙<br/><b>项目 C</b><br/><sub>mobile-app</sub>"]
162
+ end
163
+
164
+ shared["🌐<br/><b>共享知识</b><br/><sub>core/ · principle/</sub>"]
165
+
166
+ repo ==> projects
167
+ repo ==> shared
168
+
169
+ style repo fill:#6d4ad6,stroke:#4c1d95,stroke-width:3px,color:#ffffff,font-weight:bold,font-size:16px
170
+ style projects fill:#faf7ff,stroke:#a78bfa,stroke-width:2px,stroke-dasharray:5 3,color:#4c1d95
171
+ style shared fill:#dcfce7,stroke:#22c55e,stroke-width:2px,color:#14532d,font-weight:bold
172
+
173
+ style p1 fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a,font-weight:bold
174
+ style p2 fill:#dcfce7,stroke:#22c55e,stroke-width:2px,color:#14532d,font-weight:bold
175
+ style p3 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#78350f,font-weight:bold
176
+
177
+ linkStyle 0 stroke:#a855f7,stroke-width:3px
178
+ linkStyle 1 stroke:#22c55e,stroke-width:3px
179
+ ```
180
+
181
+ **依赖感知的任务跟踪。** 真实功能有依赖关系 —— 有些任务阻塞别的任务,有些能并行跑。不用你拿脑子(或者 Excel)记,`/mvt-decompose` 生成子改动的 DAG,`/mvt-plan-dev` 把它镜像到 `plan.yaml`,`/mvt-update-plan` 带着你按正确的顺序走。关键路径和"现在能跑哪些"一目了然。
182
+
183
+ ```mermaid
184
+ flowchart LR
185
+ subgraph foundation ["<b>🏛️ 基础层</b>"]
186
+ direction LR
187
+ T1["🔐<br/><b>鉴权模块</b><br/><sub>T1</sub>"]
188
+ T2["🗄️<br/><b>数据库结构</b><br/><sub>T2</sub>"]
189
+ end
190
+
191
+ subgraph parallel ["<b>⚡ 并行任务</b>"]
192
+ direction LR
193
+ T3["🔌<br/><b>用户接口</b><br/><sub>T3</sub>"]
194
+ T4["📝<br/><b>日志</b><br/><sub>T4</sub>"]
195
+ end
196
+
197
+ subgraph integration ["<b>✅ 集成</b>"]
198
+ direction TB
199
+ T5["🧪<br/><b>测试</b><br/><sub>T5</sub>"]
200
+ end
201
+
202
+ T1 --> T3
203
+ T2 --> T3
204
+ T2 --> T4
205
+ T3 --> T5
206
+ T4 --> T5
207
+
208
+ style foundation fill:#faf7ff,stroke:#a78bfa,stroke-width:2px,stroke-dasharray:4 3,color:#4c1d95
209
+ style parallel fill:#fff7ed,stroke:#fb923c,stroke-width:2px,stroke-dasharray:4 3,color:#7c2d12
210
+ style integration fill:#f0fdf4,stroke:#22c55e,stroke-width:2px,stroke-dasharray:4 3,color:#14532d
211
+
212
+ style T1 fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a,font-weight:bold
213
+ style T2 fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a,font-weight:bold
214
+ style T3 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#78350f,font-weight:bold
215
+ style T4 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#78350f,font-weight:bold
216
+ style T5 fill:#dcfce7,stroke:#22c55e,stroke-width:2px,color:#14532d,font-weight:bold
217
+
218
+ linkStyle 0 stroke:#6366f1,stroke-width:2.5px
219
+ linkStyle 1 stroke:#6366f1,stroke-width:2.5px
220
+ linkStyle 2 stroke:#6366f1,stroke-width:2.5px
221
+ linkStyle 3 stroke:#a855f7,stroke-width:2.5px
222
+ linkStyle 4 stroke:#a855f7,stroke-width:2.5px
223
+ ```
224
+
225
+ 读法:`T3` 和 `T4` 并行跑(都只依赖 `T2`),`T5` 等它们都完成。计划自动跟踪这一切。
226
+
227
+ <!-- SCREENSHOT PLACEHOLDER #2:完整 lifecycle 的 30 秒 GIF(或 3 联截图),展示 analyze → design → test 的输出。建议尺寸:~1200x800。保存为 docs/assets/lifecycle.gif(或 .png),替换本注释为: ![MVTT 完整开发流程](docs/assets/lifecycle.gif) -->
228
+
229
+ ## 24 个技能如何像一个团队协作
230
+
231
+ MVTT 的 24 个技能不是 24 条互不相关的命令 —— 它们是**一个整体团队**,共用同一本项目笔记。每个技能的输出就是下一个技能的输入,上下文在叠加,不在蒸发。
232
+
233
+ ### 一个功能,六个技能,一气贯通
234
+
235
+ 端到端加一个新功能,流程长这样:
236
+
237
+ ```mermaid
238
+ flowchart LR
239
+ A["🔎<br/><b>/mvt-analyze</b><br/><sub>提取需求</sub>"] ==> B["🏗️<br/><b>/mvt-design</b><br/><sub>定义架构</sub>"] ==> C["📋<br/><b>/mvt-plan-dev</b><br/><sub>拆解任务</sub>"] ==> D["⚡<br/><b>/mvt-implement</b><br/><sub>写代码</sub>"] ==> E["🔍<br/><b>/mvt-review</b><br/><sub>检查质量</sub>"] ==> F["🧪<br/><b>/mvt-test</b><br/><sub>生成测试</sub>"]
240
+
241
+ style A fill:#dbeafe,stroke:#3b82f6,stroke-width:2.5px,color:#1e3a8a,font-weight:bold
242
+ style B fill:#e0e7ff,stroke:#6366f1,stroke-width:2.5px,color:#312e81,font-weight:bold
243
+ style C fill:#ede9fe,stroke:#8b5cf6,stroke-width:2.5px,color:#4c1d95,font-weight:bold
244
+ style D fill:#fae8ff,stroke:#a855f7,stroke-width:2.5px,color:#581c87,font-weight:bold
245
+ style E fill:#fce7f3,stroke:#ec4899,stroke-width:2.5px,color:#831843,font-weight:bold
246
+ style F fill:#dcfce7,stroke:#22c55e,stroke-width:2.5px,color:#14532d,font-weight:bold
247
+
248
+ linkStyle 0 stroke:#6366f1,stroke-width:3px
249
+ linkStyle 1 stroke:#8b5cf6,stroke-width:3px
250
+ linkStyle 2 stroke:#a855f7,stroke-width:3px
251
+ linkStyle 3 stroke:#ec4899,stroke-width:3px
252
+ linkStyle 4 stroke:#22c55e,stroke-width:3px
253
+ ```
254
+
255
+ 原本要开 6 次 Claude Code 会话(外加 6 轮重新解释项目背景),现在**一条流水线搞定** —— 同一份上下文,不用重复解释,不用复制粘贴。
256
+
257
+ ### 常用配方
258
+
259
+ 不是每次都要跑满 6 个。挑合适的就行:
260
+
261
+ | 任务 | 使用的技能 |
262
+ |------|-------------|
263
+ | 添加一个新功能 | `analyze` → `design` → `plan-dev` → `implement` → `review` → `test` |
264
+ | 排查疑似 bug | `bug-detect`(只读诊断) |
265
+ | 修一个已知 bug | `fix`(可选先跑 `bug-detect`) |
266
+ | 重构一个模块 | `analyze-code` → `refactor` → `review` → `test` |
267
+ | 史诗级改动 | `decompose` → `analyze`(每个子改动) → ... |
268
+ | 1–3 个文件的小修 | `quick-dev` |
269
+ | 接手一个已有代码库 | `analyze-code` |
270
+ | 隔了几天再回来 | `resume`(然后接着原流程跑) |
271
+ | 清理堆积的产物 | `cleanup` + `check-context` |
272
+
273
+ 每个配方都是**起点** —— `/mvt-help` 会根据项目实际状态推荐下一步,你也可以增删或重排技能。
274
+
275
+ ### 多技能协作为什么赢
276
+
277
+ - **上下文叠加** —— 分析师提取的领域概念喂给架构师;架构师的设计决策喂给开发。没有任何技能去重复造另一个技能已经学过的轮子。
278
+ - **专项 prompt** —— 每个技能都是为单个阶段打磨过的聚焦 prompt,而不是一个臃肿的"啥都干"prompt。聚焦带来更高质量。
279
+ - **内置交接** —— 一个技能的产物(分析文档、设计稿、plan.yaml)会被下一个技能显式读取。内容不会在对话里丢。
280
+ - **可中断** —— 流程跑到一半停下来,隔几天再回来,`/mvt-resume` 准确接上,状态完全恢复。
281
+
282
+ ## 24 个技能
283
+
284
+ ### Workflow —— 完整开发全流程
285
+
286
+ | 技能 | 使用场景 | 它做什么 |
287
+ |-------|-------------|--------------|
288
+ | `/mvt-analyze` | 拿到一份新的需求文档 | 提取领域概念、功能和验收标准 |
289
+ | `/mvt-decompose` | 需求是史诗级、跨多个领域 | 拆分成大小合适的子改动,带 DAG 依赖 |
290
+ | `/mvt-analyze-code` | 接手一个已有代码库 | 反向分析代码,生成结构化项目上下文 |
291
+ | `/mvt-design` | 需求已就绪,需要架构 | 定义模块、边界和数据流 |
292
+ | `/mvt-plan-dev` | 设计太大,单次实现不下来 | 生成带顺序的任务计划 |
293
+ | `/mvt-update-plan` | 一个任务刚完成,或范围变化 | 标记任务为完成/阻塞/跳过,自动推进 `current_tasks` |
294
+ | `/mvt-implement` | 设计和计划都就绪 | 按设计与计划写代码 |
295
+ | `/mvt-review` | 代码已写好 | 检查质量、规范与潜在问题 |
296
+ | `/mvt-test` | 实现已评审 | 生成验证行为的测试 |
297
+
298
+ ### Shortcuts —— 跳过繁文缛节
299
+
300
+ | 技能 | 使用场景 | 它做什么 |
301
+ |-------|-------------|--------------|
302
+ | `/mvt-bug-detect` | 怀疑有 bug,但想先诊断 | 调查根因和影响面,不动代码 |
303
+ | `/mvt-fix` | bug 已确认,准备修 | 带着完整上下文诊断并修复 |
304
+ | `/mvt-refactor` | 想重构,保持行为不变 | 带着架构决策意识做重构 |
305
+ | `/mvt-quick-dev` | 1–3 个文件的小改,范围明确、架构中性 | 直接实现,不走完整流程 |
306
+
307
+ ### Context Management —— 上下文管理
308
+
309
+ | 技能 | 使用场景 | 它做什么 |
310
+ |-------|-------------|--------------|
311
+ | `/mvt-init` | 第一次接触项目,或项目结构大变 | 检测技术栈,初始化工作区 |
312
+ | `/mvt-sync-context` | 工作流之外改了代码 | 把工作区与代码实际状态对齐 |
313
+ | `/mvt-resume` | 新会话,上次工作没做完 | 从 `session.yaml` 恢复完整上下文 |
314
+ | `/mvt-status` | "我走到流程哪一步了?" | 显示进度和已加载的上下文 |
315
+ | `/mvt-manage-context` | 想增删、整理知识条目 | 管理知识条目和注册表 |
316
+ | `/mvt-check-context` | 感觉 token 占用太高 | 分析占用,给出优化建议 |
317
+ | `/mvt-cleanup` | 工作区显得臃肿 | 归档过期产物,保持健康 |
318
+
319
+ ### Utility —— 工具
320
+
321
+ | 技能 | 使用场景 | 它做什么 |
322
+ |-------|-------------|--------------|
323
+ | `/mvt-help` | 新接触 MVTT,或不知道下一步做什么 | 展示技能、状态和流程指引 |
324
+ | `/mvt-config` | 想换语言或输出格式 | 修改框架设置 |
325
+ | `/mvt-create-skill` | 团队需要自定义工作流 | 交互式脚手架,生成新技能 |
326
+ | `/mvt-template` | 想自定义输出格式 | 查看并管理输出模板 |
327
+
328
+ ## 上下文如何保持同步
329
+
330
+ 一个常见的担心:"上下文会不会过时?" MVTT 从多个层面应对:
331
+
332
+ 1. **技能执行时自动更新** —— 每个技能都把结果写回 session 和 artifacts
333
+ 2. **显式同步** —— `/mvt-sync-context` 把上下文和代码实际状态对齐
334
+ 3. **健康度检查** —— `/mvt-check-context` 找出过时或臃肿的条目
335
+ 4. **产物清理** —— `/mvt-cleanup` 归档已不反映现实的旧 artifacts
336
+
337
+ 上下文被设计成**活文档**,不是快照。
338
+
339
+ ## CLI 命令
340
+
341
+ ```bash
342
+ mvtt install # 首次安装(交互式选择语言)
343
+ mvtt update [--check] # 升级到最新版(保留用户数据)
344
+ mvtt doctor # 检查安装健康度
345
+ mvtt uninstall # 移除生成的文件(保留用户数据)
346
+ ```
347
+
348
+ ## 扩展 MVTT
349
+
350
+ - **添加团队知识** —— 把 markdown 文件放进 `.ai-agents/knowledge/principle/`(团队代码规范)或 `project/`(领域知识),所有技能会自动加载。
351
+ - **创建自定义技能** —— `/mvt-create-skill` 以交互方式脚手架出项目专用技能(如 `/mvt-test-e2e`)。
352
+ - **自定义模板** —— 在 `.ai-agents/skills/_templates/custom/` 覆盖输出格式。
353
+
354
+ ## 配置
355
+
356
+ 编辑 `.ai-agents/config.yaml`,或使用 `/mvt-config`:
357
+
358
+ ```yaml
359
+ version: "2.0"
360
+ preferences:
361
+ interaction_language: zh-CN # en-US | zh-CN
362
+ document_output_language: zh-CN # 生成 artifact 的语言
363
+ output:
364
+ no_emojis: true
365
+ data_format: yaml # yaml | json
366
+ context_routing:
367
+ relevance_threshold: 70
368
+ ```
369
+
370
+ ## 常见问题
371
+
372
+ ### MVTT 和写一份好的 CLAUDE.md 有什么区别?
373
+
374
+ CLAUDE.md 给 Claude **指令**。MVTT 给 Claude **一个团队** —— 24 个专项技能,共享记忆、专用模板、交接协议。CLAUDE.md 是一份备忘,MVTT 是一张组织架构图。两者可以一起用,不冲突。
375
+
376
+ ### 它会不会让 token 消耗爆炸?
377
+
378
+ 不会。工作区存到文件里、按需加载。MVTT 只加载与当前技能相关的上下文(默认相关度阈值 70%)。跑 `/mvt-check-context` 就能看到 token 占用并优化。
379
+
380
+ ### 只支持英文吗?
381
+
382
+ 不是。把 `preferences.interaction_language` 设为 `zh-CN`,框架就切到中文 —— 对话和生成的 artifact 都是。双语项目是 MVTT 的一等公民。
383
+
384
+ ### 团队能一起用吗?
385
+
386
+ 能。`.ai-agents/` 工作区是版本控制的,跟着仓库走。团队所有人都看得到同一份上下文、同样的计划、同样的历史。唯一要求:把 `.ai-agents/` 提交进仓库(至少提交 `knowledge/` 和 `project-context.yaml`)。
387
+
388
+ ### 能用在已有的项目上吗?
389
+
390
+ 可以。`npx @uoyo/mvtt install` 把 MVTT 加到任意仓库,不改你的代码、git 历史、工作流 —— 是在上面叠一层结构。
391
+
392
+ ### 卸载后我的数据会怎样?
393
+
394
+ `mvtt uninstall` 会移除框架生成的文件,但保留你的 `.ai-agents/workspace/` 和 `.ai-agents/knowledge/`。你写的所有东西都不会丢。
395
+
396
+ ### 为什么是 24 个技能?会不会太多?
397
+
398
+ 大多数团队日常只用 5–8 个。剩下的 15–19 个是给特定场景准备的(史诗级拆分、上下文同步、输出模板等),不需要一开始全学。跑 `/mvt-help` 它会告诉你下一步该用哪个。
399
+
400
+ ## 社区与路线图
401
+
402
+ - **提 Issue**:[github.com/uoyoCsharp/My-Virtual-TechTeam/issues](https://github.com/uoyoCsharp/My-Virtual-TechTeam/issues)
403
+ - **讨论区**:[github.com/uoyoCsharp/My-Virtual-TechTeam/discussions](https://github.com/uoyoCsharp/My-Virtual-TechTeam/discussions)
404
+ - **路线图**:[open milestones](https://github.com/uoyoCsharp/My-Virtual-TechTeam/milestones)
405
+ - **顺手 Star** 如果 MVTT 帮你把功能做出来更快的话
406
+
407
+ ## 开发
408
+
409
+ ```bash
410
+ git clone https://github.com/uoyoCsharp/My-Virtual-TechTeam.git
411
+ cd My-Virtual-TechTeam
412
+ npm install
413
+ npm run build # 编译 TypeScript
414
+ npm test # 运行测试套件
415
+ ```
416
+
417
+ ## 许可证
418
+
419
+ MIT
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAcA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAiDpD"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAgBA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAoDpD"}
@@ -5,6 +5,7 @@ import { materializeProject } from "../fs/materialize.js";
5
5
  import { manifestPath, readInstallationManifest, writeInstallationManifest, } from "../fs/install-manifest.js";
6
6
  import { getPackageRoot, getVersion } from "./shared.js";
7
7
  import { color } from "../util/color.js";
8
+ import { PLATFORMS, DEFAULT_PLATFORMS } from "../types/platform.js";
8
9
  export async function installCommand() {
9
10
  const projectRoot = process.cwd();
10
11
  const packageRoot = getPackageRoot();
@@ -16,10 +17,12 @@ export async function installCommand() {
16
17
  }
17
18
  const interactionLanguage = await selectLanguage("interaction");
18
19
  const documentLanguage = await selectLanguage("document", interactionLanguage);
20
+ const platforms = await selectPlatforms();
19
21
  console.log(`Installing MVTT v${version} into ${projectRoot}...`);
20
22
  const materialized = materializeProject({
21
23
  packageRoot,
22
24
  projectRoot,
25
+ platforms,
23
26
  overwriteCreateOnce: false,
24
27
  });
25
28
  const configPath = path.resolve(projectRoot, ".ai-agents/config.yaml");
@@ -27,7 +30,7 @@ export async function installCommand() {
27
30
  config = config.replace(/interaction_language:\s*en-US/, `interaction_language: ${interactionLanguage}`);
28
31
  config = config.replace(/document_output_language:\s*en-US/, `document_output_language: ${documentLanguage}`);
29
32
  writeFileSync(configPath, config, "utf-8");
30
- writeInstallationManifest(projectRoot, version, materialized, null);
33
+ writeInstallationManifest(projectRoot, version, materialized, null, platforms);
31
34
  const generatedCount = materialized.filter((f) => f.category === "generated").length;
32
35
  const createOnceCount = materialized.filter((f) => f.category === "create_once").length;
33
36
  console.log(`\n${color.green("Installation complete:")}`);
@@ -35,9 +38,10 @@ export async function installCommand() {
35
38
  console.log(` ${createOnceCount} user-editable files`);
36
39
  console.log(` Interaction language: ${interactionLanguage}`);
37
40
  console.log(` Document output language: ${documentLanguage}`);
41
+ console.log(` Platforms: ${platforms.join(", ")}`);
38
42
  console.log(` Manifest: ${color.gray(path.relative(projectRoot, manifestPath(projectRoot)))}`);
39
43
  console.log(`\n${color.bold("Next steps:")}`);
40
- console.log(` Run ${color.cyan("/mvt-init")} in Claude Code to initialize the project`);
44
+ console.log(` Run ${color.cyan("/mvt-init")} in your AI IDE to initialize the project`);
41
45
  }
42
46
  async function selectLanguage(kind, fallback) {
43
47
  if (!process.stdin.isTTY)
@@ -64,4 +68,25 @@ async function selectLanguage(kind, fallback) {
64
68
  });
65
69
  return response.language;
66
70
  }
71
+ async function selectPlatforms() {
72
+ if (!process.stdin.isTTY)
73
+ return DEFAULT_PLATFORMS;
74
+ const response = await prompts({
75
+ type: "multiselect",
76
+ name: "platforms",
77
+ message: "Target AI platforms / 目标 AI 平台",
78
+ choices: PLATFORMS.map((p) => ({
79
+ title: `${p.dir} — ${p.description}`,
80
+ value: p.id,
81
+ selected: true,
82
+ })),
83
+ min: 1,
84
+ }, {
85
+ onCancel: () => {
86
+ throw new Error("Cancelled");
87
+ },
88
+ });
89
+ const selected = response.platforms;
90
+ return selected.length > 0 ? selected : DEFAULT_PLATFORMS;
91
+ }
67
92
  //# sourceMappingURL=install.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAKA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyCtD"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAMA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqDtD"}
@@ -1,7 +1,8 @@
1
1
  import { existsSync, readdirSync, rmSync, statSync, unlinkSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import prompts from "prompts";
4
- import { manifestPath, readInstallationManifest } from "../fs/install-manifest.js";
4
+ import { manifestPath, readInstallationManifest, readInstalledPlatforms } from "../fs/install-manifest.js";
5
+ import { PLATFORMS, getPlatformById } from "../types/platform.js";
5
6
  export async function uninstallCommand() {
6
7
  const projectRoot = process.cwd();
7
8
  const manifest = readInstallationManifest(projectRoot);
@@ -24,12 +25,23 @@ export async function uninstallCommand() {
24
25
  if (existsSync(abs))
25
26
  unlinkSync(abs);
26
27
  }
27
- const skillsRoot = path.resolve(projectRoot, ".claude/skills");
28
- if (existsSync(skillsRoot)) {
29
- for (const entry of readdirSync(skillsRoot)) {
30
- const entryPath = path.join(skillsRoot, entry);
31
- if (statSync(entryPath).isDirectory() && entry.startsWith("mvt-")) {
32
- rmSync(entryPath, { recursive: true, force: true });
28
+ // Clean up residual mvt-* directories across all known platforms.
29
+ // Fall back to all known platforms if manifest is unreadable.
30
+ const installedPlatforms = readInstalledPlatforms(projectRoot);
31
+ const platformIds = installedPlatforms.length > 0
32
+ ? installedPlatforms
33
+ : PLATFORMS.map((p) => p.id);
34
+ for (const platformId of platformIds) {
35
+ const platform = getPlatformById(platformId);
36
+ if (!platform)
37
+ continue;
38
+ const skillsRoot = path.resolve(projectRoot, platform.skillDir);
39
+ if (existsSync(skillsRoot)) {
40
+ for (const entry of readdirSync(skillsRoot)) {
41
+ const entryPath = path.join(skillsRoot, entry);
42
+ if (statSync(entryPath).isDirectory() && entry.startsWith("mvt-")) {
43
+ rmSync(entryPath, { recursive: true, force: true });
44
+ }
33
45
  }
34
46
  }
35
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,IAAI,CA8D/D"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,IAAI,CAgE/D"}
@@ -1,7 +1,7 @@
1
1
  import { existsSync, rmSync, readdirSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { materializeProject } from "../fs/materialize.js";
4
- import { readInstallationManifest, writeInstallationManifest, } from "../fs/install-manifest.js";
4
+ import { readInstallationManifest, readInstalledPlatforms, writeInstallationManifest, } from "../fs/install-manifest.js";
5
5
  import { hashFile } from "../fs/hash.js";
6
6
  import { getPackageRoot, getVersion } from "./shared.js";
7
7
  export function updateCommand(options = {}) {
@@ -48,9 +48,11 @@ export function updateCommand(options = {}) {
48
48
  console.warn(`These changes will be OVERWRITTEN by update.\n`);
49
49
  }
50
50
  console.log(`Updating MVTT from v${existing.mvtt_version} to v${version}...`);
51
+ const platforms = readInstalledPlatforms(existing);
51
52
  const materialized = materializeProject({
52
53
  packageRoot,
53
54
  projectRoot,
55
+ platforms,
54
56
  overwriteCreateOnce: false,
55
57
  });
56
58
  const removed = removeStaleGeneratedFiles(projectRoot, existing.files, materialized);
@@ -59,7 +61,7 @@ export function updateCommand(options = {}) {
59
61
  for (const f of removed)
60
62
  console.log(` - ${f}`);
61
63
  }
62
- writeInstallationManifest(projectRoot, version, materialized, existing);
64
+ writeInstallationManifest(projectRoot, version, materialized, existing, platforms);
63
65
  console.log(`\nUpdate complete: ${materialized.length} files processed.`);
64
66
  }
65
67
  function removeStaleGeneratedFiles(projectRoot, previousFiles, current) {
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { MaterializedFile } from "./materialize.js";
2
+ import type { PlatformId } from "../types/platform.js";
2
3
  export interface InstalledFileRecord {
3
4
  hash: string;
4
5
  category: "generated" | "create_once";
@@ -7,9 +8,11 @@ export interface InstallationManifest {
7
8
  mvtt_version: string;
8
9
  installed_at: string;
9
10
  last_updated_at: string;
11
+ platforms?: PlatformId[];
10
12
  files: Record<string, InstalledFileRecord>;
11
13
  }
12
14
  export declare function manifestPath(projectRoot: string): string;
13
15
  export declare function readInstallationManifest(projectRoot: string): InstallationManifest | null;
14
- export declare function writeInstallationManifest(projectRoot: string, version: string, files: MaterializedFile[], previous: InstallationManifest | null): InstallationManifest;
16
+ export declare function readInstalledPlatforms(projectOrManifest: string | InstallationManifest): PlatformId[];
17
+ export declare function writeInstallationManifest(projectRoot: string, version: string, files: MaterializedFile[], previous: InstallationManifest | null, platforms?: PlatformId[]): InstallationManifest;
15
18
  //# sourceMappingURL=install-manifest.d.ts.map