@aibyzero/byz 0.1.1 → 0.1.2
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/CHANGELOG.md +10 -0
- package/README.md +13 -25
- package/dist/cli.js +3 -12
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +1864 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +78 -0
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/theme/dark.json +90 -0
- package/dist/modes/interactive/theme/light.json +89 -0
- package/dist/modes/interactive/theme/theme-schema.json +352 -0
- package/dist/runtime/bundle/chunks/{chunk-CCRJHU72.js → chunk-Q4KIHSRR.js} +1 -1
- package/dist/runtime/bundle/chunks/github-copilot.js +1 -1
- package/dist/runtime/bundle/cli.js +1 -1
- package/dist/runtime/bundle/index.js +1 -1
- package/dist/runtime/bundle/rpc-entry.js +1 -1
- package/dist/workflows.js +4 -131
- package/package.json +2 -1
- package/workflows/cm-plugin/LICENSE +21 -0
- package/workflows/cm-plugin/README.md +195 -0
- package/workflows/cm-plugin/VERSION +1 -0
- package/workflows/cm-plugin/agents/cm-plugin-backend-agent.md +34 -0
- package/workflows/cm-plugin/agents/cm-plugin-extension-agent.md +35 -0
- package/workflows/cm-plugin/agents/cm-plugin-ui-agent.md +34 -0
- package/workflows/cm-plugin/commands/cm-plugin-ai-nodes/N1-init.md +60 -0
- package/workflows/cm-plugin/commands/cm-plugin-ai-nodes/N2-enter-feature.md +51 -0
- package/workflows/cm-plugin/commands/cm-plugin-ai-nodes/N3-execute-task.md +32 -0
- package/workflows/cm-plugin/commands/cm-plugin-ai-nodes/N4-review.md +58 -0
- package/workflows/cm-plugin/commands/cm-plugin-ai-nodes/N5-mark-done.md +80 -0
- package/workflows/cm-plugin/commands/cm-plugin-ai-nodes/N6-qa-eval.md +69 -0
- package/workflows/cm-plugin/commands/cm-plugin-ai-nodes/N7-context.md +23 -0
- package/workflows/cm-plugin/commands/cm-plugin-ai-nodes/N8-finish.md +61 -0
- package/workflows/cm-plugin/commands/cm-plugin-prd-modes/brownfield.md +13 -0
- package/workflows/cm-plugin/commands/cm-plugin-prd-modes/change-mode.md +130 -0
- package/workflows/cm-plugin/commands/cm-plugin-prd-modes/greenfield.md +82 -0
- package/workflows/cm-plugin/commands/cm-plugin:ai.md +75 -0
- package/workflows/cm-plugin/commands/cm-plugin:check.md +66 -0
- package/workflows/cm-plugin/commands/cm-plugin:fix.md +100 -0
- package/workflows/cm-plugin/commands/cm-plugin:idea.md +29 -0
- package/workflows/cm-plugin/commands/cm-plugin:init.md +145 -0
- package/workflows/cm-plugin/commands/cm-plugin:prd.md +403 -0
- package/workflows/cm-plugin/commands/cm-plugin:refactor.md +147 -0
- package/workflows/cm-plugin/commands/cm-plugin:rewrite.md +90 -0
- package/workflows/cm-plugin/commands/cm-plugin:scout.md +202 -0
- package/workflows/cm-plugin/docs//346/265/213/350/257/225/346/214/207/345/274/225-/345/277/253/351/200/237/344/270/212/346/211/213.md +189 -0
- package/workflows/cm-plugin/docs//351/207/215/346/236/204/346/265/201/347/250/213/350/256/276/350/256/241/README.md +17 -0
- package/workflows/cm-plugin/docs//351/207/215/346/236/204/346/265/201/347/250/213/350/256/276/350/256/241/refactor-flow.excalidraw +3650 -0
- package/workflows/cm-plugin/docs//351/207/215/346/236/204/346/265/201/347/250/213/350/256/276/350/256/241/refactor-flow.mp4 +0 -0
- package/workflows/cm-plugin/docs//351/207/215/346/236/204/346/265/201/347/250/213/350/256/276/350/256/241/refactor-flow.png +0 -0
- package/workflows/cm-plugin/docs//351/207/215/346/236/204/346/265/201/347/250/213/350/256/276/350/256/241/refactor-flow.spec.json +223 -0
- package/workflows/cm-plugin/package.json +33 -0
- package/workflows/cm-plugin/skills/cm-plugin-backend-engineer/SKILL.md +100 -0
- package/workflows/cm-plugin/skills/cm-plugin-devops-engineer/NOTICE.md +14 -0
- package/workflows/cm-plugin/skills/cm-plugin-devops-engineer/SKILL.md +120 -0
- package/workflows/cm-plugin/skills/cm-plugin-devops-engineer/references/cws-ci-cd.md +139 -0
- package/workflows/cm-plugin/skills/cm-plugin-devops-engineer/references/cws-submission-checklist.md +87 -0
- package/workflows/cm-plugin/skills/cm-plugin-doc-syncer/SKILL.md +149 -0
- package/workflows/cm-plugin/skills/cm-plugin-extension-engineer/SKILL.md +105 -0
- package/workflows/cm-plugin/skills/cm-plugin-product-manager/SKILL.md +83 -0
- package/workflows/cm-plugin/skills/cm-plugin-qa-engineer/NOTICE.md +14 -0
- package/workflows/cm-plugin/skills/cm-plugin-qa-engineer/SKILL.md +134 -0
- package/workflows/cm-plugin/skills/cm-plugin-qa-engineer/references/cws-scan-checklist.md +136 -0
- package/workflows/cm-plugin/skills/cm-plugin-qa-engineer/references/cws-violation-codes.md +68 -0
- package/workflows/cm-plugin/skills/cm-plugin-ui-engineer/SKILL.md +94 -0
- package/workflows/cm-plugin/skills/codebase-context/SKILL.md +489 -0
- package/workflows/cm-plugin/skills/darwin-skill/NOTICE.md +24 -0
- package/workflows/cm-plugin/skills/darwin-skill/README.md +272 -0
- package/workflows/cm-plugin/skills/darwin-skill/SKILL.md +492 -0
- package/workflows/cm-plugin/skills/darwin-skill/references/runtime-neutrality.md +68 -0
- package/workflows/cm-plugin/skills/darwin-skill/references/skilllens-evidence.md +142 -0
- package/workflows/cm-plugin/skills/darwin-skill/scripts/screenshot.mjs +71 -0
- package/workflows/cm-plugin/skills/darwin-skill/templates/result-card-dark.html +698 -0
- package/workflows/cm-plugin/skills/darwin-skill/templates/result-card-white.html +444 -0
- package/workflows/cm-plugin/skills/darwin-skill/templates/result-card.html +616 -0
- package/workflows/cm-plugin/skills/idea-to-prd/SKILL.md +289 -0
- package/workflows/cm-plugin/skills/idea-to-prd/references/domains/trading.md +97 -0
- package/workflows/cm-plugin/skills/idea-to-prd/references/example-prd.md +92 -0
- package/workflows/cm-plugin/templates/arch-reference.md +55 -0
- package/workflows/cm-plugin/templates/auto-update/cm-announce.sh +19 -0
- package/workflows/cm-plugin/templates/auto-update/cm-update.sh +251 -0
- package/workflows/cm-plugin/templates/dashboard/dashboard.html +153 -0
- package/workflows/cm-plugin/templates/dashboard/serve.sh +10 -0
- package/workflows/cm-plugin/templates/e2e/extension-harness.ts +110 -0
- package/workflows/cm-plugin/templates/e2e/smoke.spec.example.ts +51 -0
- package/workflows/cm-plugin/templates/hooks/pre-commit-cm-task-check +33 -0
- package/workflows/cm-plugin/templates/pixel/cm-pixel.html +388 -0
- package/workflows/cm-plugin/templates/pixel/cm-pixel.sh +212 -0
- package/workflows/cm-plugin/templates/pixel/dev/README.md +20 -0
- package/workflows/cm-plugin/templates/pixel/dev/atlas-preview.png +0 -0
- package/workflows/cm-plugin/templates/pixel/dev/build.py +55 -0
- package/workflows/cm-plugin/templates/pixel/dev/sheets/roguelikeChar_transparent.png +0 -0
- package/workflows/cm-plugin/templates/pixel/dev/sheets/roguelikeCity_tilemap.png +0 -0
- package/workflows/cm-plugin/templates/pixel/dev/sheets/roguelikeIndoor_transparent.png +0 -0
- package/workflows/cm-plugin/templates/pixel/dev/template.html +388 -0
- package/workflows/cm-plugin/templates/pixel/serve.sh +12 -0
- package/workflows/cm-plugin/templates/refactor/cm-refactor-denies.json +14 -0
- package/workflows/cm-plugin/templates/rules/backend-api.md +36 -0
- package/workflows/cm-plugin/templates/rules/chrome-extension.md +53 -0
- package/workflows/cm-plugin/templates/rules/coding-style.md +44 -0
- package/workflows/cm-plugin/templates/rules/frontend.md +32 -0
- package/workflows/cm-plugin/templates/rules/git-workflow.md +25 -0
- package/workflows/cm-plugin/templates/rules/security.md +31 -0
- package/workflows/cm-plugin/templates/rules/testing.md +36 -0
- package/workflows/cm-plugin/templates/scripts/cm-plugin-codex.sh +52 -0
- package/workflows/cm-plugin/templates/scripts/cm-plugin-log.sh +41 -0
- package/workflows/cm-plugin/templates/scripts/cm-plugin-preflight.sh +60 -0
- package/workflows/cm-plugin/templates/statusline/cm-plugin-statusline.sh +73 -0
- package/workflows.lock.json +4 -3
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
{
|
|
2
|
+
"layout": "graph",
|
|
3
|
+
"direction": "right",
|
|
4
|
+
"style": "default",
|
|
5
|
+
"animation": "flow",
|
|
6
|
+
"canvas": {
|
|
7
|
+
"fps": 20,
|
|
8
|
+
"frames": 60
|
|
9
|
+
},
|
|
10
|
+
"title": {
|
|
11
|
+
"prefix": "cm-workflow",
|
|
12
|
+
"highlight": "重构流程总体设计",
|
|
13
|
+
"subtitle": "小闭环纪律 × Anthropic 迁移方法论 —— 修规则,不修产物"
|
|
14
|
+
},
|
|
15
|
+
"nodes": [
|
|
16
|
+
{
|
|
17
|
+
"id": "req",
|
|
18
|
+
"label": "重构诉求",
|
|
19
|
+
"icon": "ingest",
|
|
20
|
+
"icon_style": "illustrated",
|
|
21
|
+
"color": "#48e0c2"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "route",
|
|
25
|
+
"label": "分流门",
|
|
26
|
+
"kind": "decision"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "fix",
|
|
30
|
+
"label": "/cm-plugin:fix",
|
|
31
|
+
"icon": "tool-call",
|
|
32
|
+
"body": "缺陷闭环(不夹带修复)",
|
|
33
|
+
"color": "#ff7ab6"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "prd",
|
|
37
|
+
"label": "/cm-plugin:prd --change",
|
|
38
|
+
"kind": "terminal",
|
|
39
|
+
"accent": "muted"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "g0",
|
|
43
|
+
"label": "G0 可行性",
|
|
44
|
+
"icon": "human",
|
|
45
|
+
"icon_style": "illustrated",
|
|
46
|
+
"body": "动机量化·不重构合法",
|
|
47
|
+
"color": "#f4b64e"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "judge",
|
|
51
|
+
"label": "判官自验证",
|
|
52
|
+
"icon": "guardrail",
|
|
53
|
+
"icon_style": "hero",
|
|
54
|
+
"icon_size": "hero",
|
|
55
|
+
"body": "原码必绿·坏码必红",
|
|
56
|
+
"color": "#7bb8ff"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "scale",
|
|
60
|
+
"label": "规模门",
|
|
61
|
+
"kind": "decision"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": "lite",
|
|
65
|
+
"label": "轻量道·小闭环",
|
|
66
|
+
"icon": "loop",
|
|
67
|
+
"icon_style": "illustrated",
|
|
68
|
+
"body": "基线→重构→等价 一次跑完",
|
|
69
|
+
"color": "#48e0c2"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "rule",
|
|
73
|
+
"label": "规则手册",
|
|
74
|
+
"icon": "plan",
|
|
75
|
+
"icon_style": "hero",
|
|
76
|
+
"icon_size": "hero",
|
|
77
|
+
"body": "分歧即入册·依赖图定序",
|
|
78
|
+
"color": "#b78bff"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "pilot",
|
|
82
|
+
"label": "压力测试",
|
|
83
|
+
"icon": "sandbox",
|
|
84
|
+
"icon_style": "illustrated",
|
|
85
|
+
"body": "试点产物可弃·只留修订",
|
|
86
|
+
"color": "#f4b64e"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "fan",
|
|
90
|
+
"label": "批量执行",
|
|
91
|
+
"icon": "subagent",
|
|
92
|
+
"icon_style": "illustrated",
|
|
93
|
+
"body": "队列=磁盘·配置禁令",
|
|
94
|
+
"color": "#b78bff"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "mech",
|
|
98
|
+
"label": "机械裁决",
|
|
99
|
+
"icon": "compare",
|
|
100
|
+
"icon_style": "illustrated",
|
|
101
|
+
"body": "裁判价格定位",
|
|
102
|
+
"color": "#7bb8ff"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "eq",
|
|
106
|
+
"label": "行为等价",
|
|
107
|
+
"icon": "score",
|
|
108
|
+
"icon_style": "illustrated",
|
|
109
|
+
"body": "全绿+差分一致",
|
|
110
|
+
"color": "#48e0c2"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "rev",
|
|
114
|
+
"label": "审查凭证",
|
|
115
|
+
"icon": "audit",
|
|
116
|
+
"icon_style": "illustrated",
|
|
117
|
+
"body": "对抗审查·凭证落盘",
|
|
118
|
+
"color": "#ff7ab6"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "done",
|
|
122
|
+
"label": "收口",
|
|
123
|
+
"icon": "checkpoint",
|
|
124
|
+
"icon_style": "illustrated",
|
|
125
|
+
"body": "档案·METRICS·缺陷转/cm-plugin:fix",
|
|
126
|
+
"accent": "green"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"edges": [
|
|
130
|
+
{
|
|
131
|
+
"from": "req",
|
|
132
|
+
"to": "route"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"from": "route",
|
|
136
|
+
"to": "fix",
|
|
137
|
+
"label": "有缺陷"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"from": "route",
|
|
141
|
+
"to": "prd",
|
|
142
|
+
"label": "要改行为"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"from": "route",
|
|
146
|
+
"to": "g0",
|
|
147
|
+
"label": "结构问题·行为保持"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"from": "g0",
|
|
151
|
+
"to": "judge",
|
|
152
|
+
"label": "人签核"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"from": "judge",
|
|
156
|
+
"to": "scale",
|
|
157
|
+
"label": "无判官不开工"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"from": "scale",
|
|
161
|
+
"to": "lite",
|
|
162
|
+
"label": "单文件"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"from": "scale",
|
|
166
|
+
"to": "rule",
|
|
167
|
+
"label": "跨模块批量"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"from": "lite",
|
|
171
|
+
"to": "rev",
|
|
172
|
+
"label": "同款审查纪律"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"from": "rule",
|
|
176
|
+
"to": "pilot"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"from": "pilot",
|
|
180
|
+
"to": "fan",
|
|
181
|
+
"label": "规则定稿·人签核"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"from": "fan",
|
|
185
|
+
"to": "mech"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"from": "mech",
|
|
189
|
+
"to": "eq"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"from": "eq",
|
|
193
|
+
"to": "rev"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"from": "rev",
|
|
197
|
+
"to": "done"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"from": "pilot",
|
|
201
|
+
"to": "rule",
|
|
202
|
+
"kind": "loop",
|
|
203
|
+
"label": "修订排队·批间应用",
|
|
204
|
+
"accent": "purple"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"from": "mech",
|
|
208
|
+
"to": "rule",
|
|
209
|
+
"kind": "loop",
|
|
210
|
+
"label": "三次重复=规则bug·重生成",
|
|
211
|
+
"accent": "amber"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"from": "eq",
|
|
215
|
+
"to": "fan",
|
|
216
|
+
"kind": "loop",
|
|
217
|
+
"label": "行为差异=回滚重做",
|
|
218
|
+
"accent": "pink"
|
|
219
|
+
}
|
|
220
|
+
],
|
|
221
|
+
"footer": "门在阶段之间,签核=踢下一阶段 | 纪律写进配置,不写进请求 | 判官没被验证过,就不配当判官",
|
|
222
|
+
"signature": "@cm-workflow"
|
|
223
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aibyzero/cm-plugin-workflow",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Spec-driven workflow for Chrome extension development",
|
|
5
|
+
"private": true,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/kingxiaozhe/cm-plugin-workflow.git"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"pi-package",
|
|
14
|
+
"coding-agent",
|
|
15
|
+
"chrome-extension",
|
|
16
|
+
"workflow",
|
|
17
|
+
"skills"
|
|
18
|
+
],
|
|
19
|
+
"files": [
|
|
20
|
+
"VERSION",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE",
|
|
23
|
+
"agents",
|
|
24
|
+
"commands",
|
|
25
|
+
"docs",
|
|
26
|
+
"skills",
|
|
27
|
+
"templates"
|
|
28
|
+
],
|
|
29
|
+
"pi": {
|
|
30
|
+
"skills": ["./skills"],
|
|
31
|
+
"prompts": ["./commands"]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cm-plugin-backend-engineer
|
|
3
|
+
description: 后端 API 工程师 Skill,执行服务端 API 层开发(路由、业务逻辑、鉴权中间件、缓存、队列),自动适配语言和框架
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# cm-plugin-backend-engineer — 后端 API 工程师
|
|
7
|
+
|
|
8
|
+
执行服务端 API 层开发任务。自动识别语言和框架。
|
|
9
|
+
|
|
10
|
+
## 职责边界
|
|
11
|
+
|
|
12
|
+
- **管**:路由/控制器、业务逻辑、鉴权与权限中间件、缓存策略、消息队列、数据库 schema 与 migration、对外接口说明;扩展场景下的专属关注:**扩展侧调用的 CORS 允许来源(`chrome-extension://{id}`)与鉴权方案(扩展里无传统 cookie 会话,走 token)**、API 密钥代理层(密钥只在服务端)
|
|
13
|
+
- **不管**:扩展本体代码(→ cm-plugin-extension-engineer)、测试补全与 E2E(→ cm-plugin-qa-engineer)
|
|
14
|
+
|
|
15
|
+
## 触发条件
|
|
16
|
+
|
|
17
|
+
由 `/cm-plugin:ai` 自动调用,当 task 涉及后端 API 开发时触发。
|
|
18
|
+
|
|
19
|
+
## 工作流程
|
|
20
|
+
|
|
21
|
+
### 1. 识别技术栈
|
|
22
|
+
|
|
23
|
+
自动检测,不做硬编码假设:
|
|
24
|
+
|
|
25
|
+
- **语言/运行时**:Node.js / Python / Go / Java / Rust
|
|
26
|
+
- **框架**:Express / Fastify / Hono / NestJS / FastAPI / Django / Gin / Spring 等
|
|
27
|
+
- **鉴权方案**:JWT / Session / OAuth2 / BetterAuth 等(读现有中间件与依赖判断)
|
|
28
|
+
- **接口风格**:REST / GraphQL / tRPC / gRPC(读路由与已有接口定义判断)
|
|
29
|
+
|
|
30
|
+
### 2. 读取上下文
|
|
31
|
+
|
|
32
|
+
- `.claude/rules/backend-api.md`、`.claude/rules/security.md`(如存在)
|
|
33
|
+
- design.md 中的**接口契约**——本 skill 的最高约束
|
|
34
|
+
- 现有路由组织、错误处理约定、中间件链
|
|
35
|
+
|
|
36
|
+
### 3. 契约纪律(本 skill 核心)
|
|
37
|
+
|
|
38
|
+
design.md 的接口契约是前后端并行的生命线,执行**三级协议**:
|
|
39
|
+
|
|
40
|
+
1. **执行者只报不改**:实现中发现契约不合理或不完整 → **不得静默偏离、不得直接修改 design.md**,将偏差和理由写入完成汇报的「契约相关」栏
|
|
41
|
+
2. **主流程小改留痕**:字段增补等小偏差由主流程更新 design.md 并标注版本(对齐 `[CHANGED]` 惯例)
|
|
42
|
+
3. **大改必须问人**:偏差影响**已完成任务**所依赖的契约(会引发返工)→ 强制暂停人工确认
|
|
43
|
+
|
|
44
|
+
实现完成后逐条核对:路径、方法、请求/响应字段、错误码与契约一致。
|
|
45
|
+
|
|
46
|
+
### 4. 开发
|
|
47
|
+
|
|
48
|
+
**接口实现:**
|
|
49
|
+
|
|
50
|
+
- 遵循项目已有的路由组织和分层(controller/service/repository 等按项目实际)
|
|
51
|
+
- 错误处理统一:错误码、错误体结构跟随项目约定,无约定则建立一处并全局复用
|
|
52
|
+
- 输入验证在边界层完成,校验库跟随项目已有选择
|
|
53
|
+
- 幂等性:写操作考虑重复提交(幂等键/去重),支付类接口强制
|
|
54
|
+
|
|
55
|
+
**鉴权与权限:**
|
|
56
|
+
|
|
57
|
+
- 复用项目已有的鉴权中间件,不另起炉灶
|
|
58
|
+
- 权限检查靠近资源(handler 层),不散落各处
|
|
59
|
+
- 敏感操作留审计日志
|
|
60
|
+
|
|
61
|
+
**性能与可靠性**(以下为默认值,`.claude/rules/` 有规定时**以 rules 为准**):
|
|
62
|
+
|
|
63
|
+
- 外部调用必须有超时,默认 5s
|
|
64
|
+
- 列表接口必须分页,默认页大小 20
|
|
65
|
+
- 高频读考虑缓存、写路径考虑队列削峰——是否引入新基础设施以 design.md 为准,不擅自添加
|
|
66
|
+
|
|
67
|
+
### 5. 安全检查
|
|
68
|
+
|
|
69
|
+
- 密钥/连接串一律环境变量,绝不硬编码
|
|
70
|
+
- 注入防护:参数化查询、模板转义(与 database skill 双保险)
|
|
71
|
+
- 鉴权绕过自查:逐条核对本次新增路由是否漏挂鉴权中间件
|
|
72
|
+
- 日志不输出密码、token、证件号等敏感字段
|
|
73
|
+
|
|
74
|
+
### 6. 验证
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# 根据项目实际命令执行
|
|
78
|
+
npm run lint && npm run typecheck
|
|
79
|
+
npm run build
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
启动服务,对本 task 涉及的接口逐个实测(curl/httpie):正常流 + 至少一个异常流(4xx)。
|
|
83
|
+
|
|
84
|
+
## 常见坑
|
|
85
|
+
|
|
86
|
+
| 问题 | 处理 |
|
|
87
|
+
| ---- | ---- |
|
|
88
|
+
| 新路由漏挂鉴权中间件 | 按路由分组统一挂载,逐条核对本次新增路由 |
|
|
89
|
+
| 外部调用无超时导致雪崩 | 统一封装 HTTP client,强制超时与重试上限 |
|
|
90
|
+
| 错误体结构不一致,前端难处理 | 全局错误处理器统一出口,禁止 handler 内裸造错误体 |
|
|
91
|
+
| 时间/时区序列化不一致 | 统一 UTC + ISO 8601 出参,入参解析集中处理 |
|
|
92
|
+
| 阻塞事件循环(大 JSON / 同步加密) | 大计算移 worker 或队列,序列化分页 |
|
|
93
|
+
| 分页游标与排序不稳定 | 排序键唯一化(时间戳+id),游标编码含排序上下文 |
|
|
94
|
+
|
|
95
|
+
## 输出
|
|
96
|
+
|
|
97
|
+
- 创建/修改的文件列表
|
|
98
|
+
- 验证结果(lint / build / 接口实测)
|
|
99
|
+
- **契约实现情况**:逐条列出实现的接口,标注与 design.md 的偏差(无偏差则写"完全一致")
|
|
100
|
+
- 需要其他工种配合的事项(如前端可替换 mock 的接口清单、需要数据库配合的字段)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# NOTICE — 第三方收编素材
|
|
2
|
+
|
|
3
|
+
本 skill 的 `references/` 下两个文件收编自外部开源仓库:
|
|
4
|
+
|
|
5
|
+
- 来源:[quangpl/browser-extension-skills](https://github.com/quangpl/browser-extension-skills)(MIT License, Copyright (c) 2026 quangpl)
|
|
6
|
+
- 收编日期:2026-07-18
|
|
7
|
+
- 文件与改动:
|
|
8
|
+
|
|
9
|
+
| 本仓库文件 | 上游文件 | 改动 |
|
|
10
|
+
| ---- | ---- | ---- |
|
|
11
|
+
| `references/cws-submission-checklist.md` | `skills/extension-publish/references/submission-checklist.md` | 仅重命名,内容未改动 |
|
|
12
|
+
| `references/cws-ci-cd.md` | `skills/extension-publish/references/ci-cd-automation.md` | 仅重命名,内容未改动 |
|
|
13
|
+
|
|
14
|
+
上游许可为 MIT,允许再分发;本文件即为许可与来源声明的履约载体。
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cm-plugin-devops-engineer
|
|
3
|
+
description: 发布/运维工程师 Skill,执行扩展打包、商店提审准备、配套后端部署、冒烟验证与发布记录;商店提审与生产发布强制人工确认
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# cm-plugin-devops-engineer — 发布/运维工程师
|
|
7
|
+
|
|
8
|
+
执行打包、发布与部署任务,把审查通过的代码送到用户手里并验证。**把关型角色:串行执行,不做 agent。**
|
|
9
|
+
|
|
10
|
+
发布对象有两类,通道完全不同:**扩展本体**(打包 zip → Chrome Web Store 提审,结果异步)和**配套后端**(常规服务端部署,如有)。
|
|
11
|
+
|
|
12
|
+
## 触发条件
|
|
13
|
+
|
|
14
|
+
- `/cm-plugin:ai` N3 派发**打包/发布/部署类任务**时触发(由 /cm-plugin:prd 模板生成)
|
|
15
|
+
- N8 收尾时编制**发布待决清单**(只编制,不执行)
|
|
16
|
+
|
|
17
|
+
## 三条硬闸(不可违反)
|
|
18
|
+
|
|
19
|
+
1. **无回滚预案的发布不执行**——扩展本体的"回滚"很特殊:商店不支持一键回滚旧版,预案 = 保留上一版可提审的打包产物 + 明确降版重提流程;后端照常写清代码与迁移回退
|
|
20
|
+
2. **Chrome Web Store 提审(含权限变更的版本更新)与生产后端部署强制人工确认**;本地打包、内测分发(unlisted / trusted testers)及 staging 后端可自动
|
|
21
|
+
3. **新开或变更基础设施强制人工确认**:新商店开发者账号、新域名与证书、新数据库/实例、付费套餐变更。常规发布到**已有通道**不触发此闸
|
|
22
|
+
|
|
23
|
+
## 工作流程
|
|
24
|
+
|
|
25
|
+
### 1. 识别发布栈
|
|
26
|
+
|
|
27
|
+
自动检测,不做硬编码假设:
|
|
28
|
+
|
|
29
|
+
- **扩展本体**:脚手架(WXT `wxt zip` / Plasmo `plasmo package` / 自建 zip 脚本)、目标商店(Chrome Web Store;含 Edge Add-ons / Firefox AMO 时通道分列)、是否配置 CI 自动打包
|
|
30
|
+
- **配套后端**(如有):Docker/K8s / Serverless / 静态托管 / 传统主机,检测 Dockerfile / serverless.yml / vercel.json / wrangler.toml / CI 配置
|
|
31
|
+
- **CI/CD**:识别已有流水线(bootstrap T-003 所建),优先复用而非另建
|
|
32
|
+
|
|
33
|
+
### 2. 发布前检查(全部通过才执行)
|
|
34
|
+
|
|
35
|
+
- [ ] 回滚预案已写明(硬闸 1,含上一版产物的留存位置)
|
|
36
|
+
- [ ] **版本号已递增**且 manifest 版本与 package.json / 发布记录一致
|
|
37
|
+
- [ ] **权限 diff 核对**:对比上一发布版 manifest——新增 permission / host_permission 逐项有用途理由;有权限扩张 → 显式标注"本次提审将触发商店重点审核",走硬闸 2 人工确认
|
|
38
|
+
- [ ] **商店合规自查**(提审前最后一道):单一用途描述与实际功能一致、隐私政策链接有效且覆盖实际收集的数据项、无远程代码、商店素材(截图/描述)与当前版本一致——发现问题回流 `cm-plugin-qa-engineer` 商店合规检查单逐项过
|
|
39
|
+
- [ ] **提审材料齐备**:按 `references/cws-submission-checklist.md`(MIT 收编素材,见 NOTICE.md)逐项核对——manifest 字段上限(name ≤45 字符 / description ≤132 字符)、图标四尺寸、截图规格(1280×800 或 640×400 精确尺寸)、敏感权限逐项 justification、Privacy practices 数据披露表
|
|
40
|
+
- [ ] 构建产物来自已通过 N4 审查的代码(不发布未审查内容)
|
|
41
|
+
- [ ] 后端(如有):环境变量核对、迁移先备份点先兼容后清理、**后端先于扩展发布**(老版本扩展会在商店审核期继续调用线上 API,接口只能加不能破坏)
|
|
42
|
+
|
|
43
|
+
### 3. 执行发布
|
|
44
|
+
|
|
45
|
+
- **扩展本体**:用脚手架既有打包命令出 zip → 本地以解包形式加载 zip 解出的产物做最终冒烟 → 内测通道(unlisted / trusted testers)可直接分发;**公开提审过硬闸 2**,人确认后上传并提交审核
|
|
46
|
+
- **商店无 staging 轨道**——staging 对应物 = 第二个 unlisted 的 extension ID(`main` 分支推 staging ID,打 tag 才发生产 ID);CI 自动上传用 `chrome-webstore-upload-cli`,凭证配置、双轨 GitHub Actions 模板与灰度发布(trustedTesters target)见 `references/cws-ci-cd.md`(bootstrap T-003 搭 CI 时直接取用)
|
|
47
|
+
- **后端**:用项目既有部署命令/流水线部署 staging,不发明新方式
|
|
48
|
+
- 动作与输出全程记录(时间、版本/commit、通道、执行的迁移)
|
|
49
|
+
|
|
50
|
+
### 4. 冒烟验证
|
|
51
|
+
|
|
52
|
+
- 打包产物在干净浏览器 profile 加载:manifest 无报错、service worker 注册、本次 feature 关键流程各走一次
|
|
53
|
+
- 后端(如有):健康检查 + 本 feature 关键接口正常流
|
|
54
|
+
- **失败处理(3 轮上限)**:冒烟不过 → 不提审/执行回滚 → 失败项按 bug 回流开发。**最多 3 轮,3 轮不过暂停问人**
|
|
55
|
+
|
|
56
|
+
### 5. 发布记录落盘
|
|
57
|
+
|
|
58
|
+
追加到 `{SPECS_DIR}/RELEASES.md`(审计链延伸到商店与线上):
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
## {日期} — {feature 名} → {通道}
|
|
62
|
+
- 版本: {manifest version + commit sha;NO_GIT 模式记打包时间戳 + no-git 备注}
|
|
63
|
+
- 通道: {本地内测 / unlisted / Chrome Web Store 提审 / 后端 staging / 后端生产}
|
|
64
|
+
- 权限 diff: {新增/移除的权限及理由,无则"无变化"}
|
|
65
|
+
- 迁移: {后端 migration 列表,无则"无"}
|
|
66
|
+
- 冒烟: {通过 / 第 N 轮通过}
|
|
67
|
+
- 商店审核状态: {未提审 / 审核中(提交时间) / 已过审 / 被拒(原因)}
|
|
68
|
+
- 回滚预案: {上一版产物位置 + 后端回退命令}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 商店审核期纪律(提审后)
|
|
72
|
+
|
|
73
|
+
- 审核结果异步(数小时到数周),**作为待决项跟踪,不阻塞后续 feature 开发**
|
|
74
|
+
- **被拒处理**:拒审邮件里的违规码先对照 `cm-plugin-qa-engineer` 的 `references/cws-violation-codes.md` 定性,原因原文记入 RELEASES.md → 按 bug 回流正常任务流程修复 → 修完提交申诉(Developer Dashboard,注明改动点,典型 1-3 个工作日);权限类拒审必须回到 /cm-plugin:prd 层面重新确认权限方案,不得在发布层"换个说法再试"
|
|
75
|
+
- 审核期内不叠加提交新版本(会重置排队),紧急修复除外并记录理由
|
|
76
|
+
|
|
77
|
+
## 发布待决清单(N8 调用,只编制不执行)
|
|
78
|
+
|
|
79
|
+
```markdown
|
|
80
|
+
# 发布待决清单 — {日期}
|
|
81
|
+
- 已通过验证待提审的版本: {manifest version + 包含的 feature 列表}
|
|
82
|
+
- 权限 diff 与提审风险: {权限扩张项及理由;无则"无——常规审核"}
|
|
83
|
+
- 商店材料就绪情况: {描述/截图/隐私政策/单一用途说明 各项状态}
|
|
84
|
+
- {如有后端} 生产部署清单: {迁移顺序含备份点、新增环境变量 key 列表}
|
|
85
|
+
- 回滚预案位置: {上一版产物路径 + 后端回退命令}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
商店提审与生产部署由**人**决策触发;人下达指令后按本 skill 流程执行(硬闸 1 仍然生效)。
|
|
89
|
+
|
|
90
|
+
## 上线后验证(发布执行完毕的强制收尾)
|
|
91
|
+
|
|
92
|
+
发布"执行完"不等于"活着"——结果追加 RELEASES.md:
|
|
93
|
+
|
|
94
|
+
- **过审后**:从商店真实安装(或更新到)新版本,按本次 feature 的波及面清单逐项冒烟;重点验证**老用户升级路径**(存量 chrome.storage 数据在新 schema 下正常)
|
|
95
|
+
- 后端生产发布 → 真实域名关键流验证
|
|
96
|
+
- 记录格式:`线上验证: 通过({N}项) / 异常({具体项})`——异常立即执行回滚预案并按 bug 回流
|
|
97
|
+
- **不做上线后验证的发布记录视为未完成**
|
|
98
|
+
|
|
99
|
+
## 凭证纪律
|
|
100
|
+
|
|
101
|
+
- 商店 API 凭证(client_id/refresh_token)与服务器凭证只从环境变量 / 密钥管理读取
|
|
102
|
+
- **不得要求用户在对话中粘贴密钥,不得将凭证写入任何文件或日志**
|
|
103
|
+
|
|
104
|
+
## 常见坑
|
|
105
|
+
|
|
106
|
+
| 问题 | 处理 |
|
|
107
|
+
| ---- | ---- |
|
|
108
|
+
| 提审被拒第一大原因:权限缺理由或过宽 | 发布前权限 diff 核对,扩张项提前过人工确认 |
|
|
109
|
+
| 商店审核期扩展旧版仍在调新后端 | 后端接口只加不破坏;破坏性变更等商店过审铺开后再清理 |
|
|
110
|
+
| zip 里带了 sourcemap/开发文件 | 打包用脚手架官方命令,产物列表过一眼再上传 |
|
|
111
|
+
| 版本号忘递增导致上传被拒 | 发布前检查含版本号核对,CI 里加校验 |
|
|
112
|
+
| 升级后老用户数据"丢失" | storage schema 变更必须带迁移逻辑,上线后验证含升级路径 |
|
|
113
|
+
| 隐私政策链接失效/未覆盖新收集项 | 商店合规自查逐项对照实际数据流 |
|
|
114
|
+
|
|
115
|
+
## 输出
|
|
116
|
+
|
|
117
|
+
- 发布结果(通道、版本、权限 diff、迁移执行情况)
|
|
118
|
+
- 冒烟与上线后验证结果(通过项 / 失败项及处理)
|
|
119
|
+
- RELEASES.md 追加记录
|
|
120
|
+
- 需人工决策的事项(商店提审、生产部署、基础设施变更)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# CI/CD Automation
|
|
2
|
+
|
|
3
|
+
## chrome-webstore-upload Setup
|
|
4
|
+
|
|
5
|
+
### Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install --save-dev chrome-webstore-upload-cli
|
|
9
|
+
# or global
|
|
10
|
+
npm install -g chrome-webstore-upload-cli
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Get API Credentials
|
|
14
|
+
|
|
15
|
+
1. Go to [Google Cloud Console](https://console.cloud.google.com)
|
|
16
|
+
2. Create project → Enable **Chrome Web Store API**
|
|
17
|
+
3. Create OAuth 2.0 Client ID (Desktop app type)
|
|
18
|
+
4. Download `client_id` and `client_secret`
|
|
19
|
+
5. Get refresh token (one-time):
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx chrome-webstore-upload-cli get-refresh-token \
|
|
23
|
+
--client-id $CLIENT_ID \
|
|
24
|
+
--client-secret $CLIENT_SECRET
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
6. Store all three as CI secrets: `CWS_CLIENT_ID`, `CWS_CLIENT_SECRET`, `CWS_REFRESH_TOKEN`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## GitHub Actions Workflow
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
# .github/workflows/publish.yml
|
|
35
|
+
name: Publish to Chrome Web Store
|
|
36
|
+
|
|
37
|
+
on:
|
|
38
|
+
push:
|
|
39
|
+
tags:
|
|
40
|
+
- 'v*'
|
|
41
|
+
|
|
42
|
+
jobs:
|
|
43
|
+
publish:
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@v4
|
|
47
|
+
|
|
48
|
+
- uses: actions/setup-node@v4
|
|
49
|
+
with:
|
|
50
|
+
node-version: '20'
|
|
51
|
+
|
|
52
|
+
- name: Install dependencies
|
|
53
|
+
run: npm ci
|
|
54
|
+
|
|
55
|
+
- name: Run tests
|
|
56
|
+
run: npm test
|
|
57
|
+
|
|
58
|
+
- name: Build extension
|
|
59
|
+
run: npm run build
|
|
60
|
+
|
|
61
|
+
- name: Package extension
|
|
62
|
+
run: |
|
|
63
|
+
cd dist
|
|
64
|
+
zip -r ../extension.zip . --exclude "*.map"
|
|
65
|
+
|
|
66
|
+
- name: Upload to Chrome Web Store
|
|
67
|
+
run: |
|
|
68
|
+
npx chrome-webstore-upload-cli upload \
|
|
69
|
+
--source extension.zip \
|
|
70
|
+
--extension-id ${{ secrets.CWS_EXTENSION_ID }} \
|
|
71
|
+
--client-id ${{ secrets.CWS_CLIENT_ID }} \
|
|
72
|
+
--client-secret ${{ secrets.CWS_CLIENT_SECRET }} \
|
|
73
|
+
--refresh-token ${{ secrets.CWS_REFRESH_TOKEN }}
|
|
74
|
+
|
|
75
|
+
- name: Publish to users
|
|
76
|
+
run: |
|
|
77
|
+
npx chrome-webstore-upload-cli publish \
|
|
78
|
+
--extension-id ${{ secrets.CWS_EXTENSION_ID }} \
|
|
79
|
+
--client-id ${{ secrets.CWS_CLIENT_ID }} \
|
|
80
|
+
--client-secret ${{ secrets.CWS_CLIENT_SECRET }} \
|
|
81
|
+
--refresh-token ${{ secrets.CWS_REFRESH_TOKEN }}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Versioning Automation
|
|
87
|
+
|
|
88
|
+
Auto-bump version from git tag:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# scripts/bump-version.sh
|
|
92
|
+
TAG=${GITHUB_REF#refs/tags/v} # e.g., "1.2.3"
|
|
93
|
+
jq --arg v "$TAG" '.version = $v' manifest.json > tmp.json
|
|
94
|
+
mv tmp.json manifest.json
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Add to workflow before build step:
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
- name: Bump version from tag
|
|
101
|
+
run: bash scripts/bump-version.sh
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Staging vs Production Tracks
|
|
107
|
+
|
|
108
|
+
Chrome Web Store has no staging track — use separate extension IDs:
|
|
109
|
+
|
|
110
|
+
| Track | Extension ID | Visibility |
|
|
111
|
+
|-------|-------------|------------|
|
|
112
|
+
| Staging | `$STAGING_EXT_ID` | Unlisted |
|
|
113
|
+
| Production | `$PROD_EXT_ID` | Public |
|
|
114
|
+
|
|
115
|
+
Workflow strategy:
|
|
116
|
+
|
|
117
|
+
```yaml
|
|
118
|
+
on:
|
|
119
|
+
push:
|
|
120
|
+
branches: [main] # → upload to staging (unlisted)
|
|
121
|
+
tags: ['v*'] # → upload + publish to production
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Use `--trusted-testers` flag or `unlisted` visibility for staging builds.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Rollout Control
|
|
129
|
+
|
|
130
|
+
Publish to percentage of users (via API, not CLI):
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
curl -X POST \
|
|
134
|
+
"https://www.googleapis.com/chromewebstore/v1.1/items/$EXT_ID/publish" \
|
|
135
|
+
-H "Authorization: Bearer $ACCESS_TOKEN" \
|
|
136
|
+
-H "Content-Type: application/json" \
|
|
137
|
+
-d '{"target": "trustedTesters"}'
|
|
138
|
+
# target: "default" = all users, "trustedTesters" = testers only
|
|
139
|
+
```
|