ethan-skill 1.11.0 → 1.12.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/dist/cli/index.js +1019 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +206 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/27-tech-debt.d.ts +3 -0
- package/dist/skills/27-tech-debt.d.ts.map +1 -0
- package/dist/skills/27-tech-debt.js +149 -0
- package/dist/skills/27-tech-debt.js.map +1 -0
- package/dist/skills/28-api-mock.d.ts +3 -0
- package/dist/skills/28-api-mock.d.ts.map +1 -0
- package/dist/skills/28-api-mock.js +272 -0
- package/dist/skills/28-api-mock.js.map +1 -0
- package/dist/skills/29-data-migration.d.ts +3 -0
- package/dist/skills/29-data-migration.d.ts.map +1 -0
- package/dist/skills/29-data-migration.js +331 -0
- package/dist/skills/29-data-migration.js.map +1 -0
- package/dist/skills/30-llm-feature.d.ts +3 -0
- package/dist/skills/30-llm-feature.d.ts.map +1 -0
- package/dist/skills/30-llm-feature.js +328 -0
- package/dist/skills/30-llm-feature.js.map +1 -0
- package/dist/skills/31-threat-model.d.ts +3 -0
- package/dist/skills/31-threat-model.d.ts.map +1 -0
- package/dist/skills/31-threat-model.js +240 -0
- package/dist/skills/31-threat-model.js.map +1 -0
- package/dist/skills/32-green-code.d.ts +3 -0
- package/dist/skills/32-green-code.d.ts.map +1 -0
- package/dist/skills/32-green-code.js +346 -0
- package/dist/skills/32-green-code.js.map +1 -0
- package/dist/skills/33-service-catalog.d.ts +3 -0
- package/dist/skills/33-service-catalog.d.ts.map +1 -0
- package/dist/skills/33-service-catalog.js +334 -0
- package/dist/skills/33-service-catalog.js.map +1 -0
- package/dist/skills/34-mobile-review.d.ts +3 -0
- package/dist/skills/34-mobile-review.d.ts.map +1 -0
- package/dist/skills/34-mobile-review.js +390 -0
- package/dist/skills/34-mobile-review.js.map +1 -0
- package/dist/skills/35-data-pipeline.d.ts +3 -0
- package/dist/skills/35-data-pipeline.d.ts.map +1 -0
- package/dist/skills/35-data-pipeline.js +392 -0
- package/dist/skills/35-data-pipeline.js.map +1 -0
- package/dist/skills/36-ml-experiment.d.ts +3 -0
- package/dist/skills/36-ml-experiment.d.ts.map +1 -0
- package/dist/skills/36-ml-experiment.js +415 -0
- package/dist/skills/36-ml-experiment.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +41 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/pipeline.d.ts.map +1 -1
- package/dist/skills/pipeline.js +35 -0
- package/dist/skills/pipeline.js.map +1 -1
- package/dist/skills/skills.test.js +3 -3
- package/dist/skills/skills.test.js.map +1 -1
- package/package.json +1 -1
- package/rules/claude-code/CLAUDE.md +2963 -3
- package/rules/cline/.clinerules +2805 -2
- package/rules/codebuddy/CODEBUDDY.md +2913 -2
- package/rules/continue/.continuerules +2805 -2
- package/rules/copilot/copilot-instructions.md +2883 -2
- package/rules/cursor/.cursorrules +2952 -2
- package/rules/cursor/smart-flow.mdc +2952 -2
- package/rules/jetbrains/smart-flow.md +2883 -2
- package/rules/lingma/smart-flow.md +2904 -3
- package/rules/windsurf/.windsurf/rules/smart-flow.md +2884 -3
- package/rules/zed/smart-flow.rules +2794 -1
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.greenCodeSkill = void 0;
|
|
4
|
+
exports.greenCodeSkill = {
|
|
5
|
+
id: 'green-code',
|
|
6
|
+
name: '绿色编码实践',
|
|
7
|
+
nameEn: 'green_code',
|
|
8
|
+
order: 32,
|
|
9
|
+
description: '识别代码能耗热点,优化算法复杂度与云资源效率,估算并降低软件碳排放',
|
|
10
|
+
descriptionEn: 'Identify code energy hotspots, optimize algorithm complexity and cloud resource efficiency, estimate and reduce software carbon footprint',
|
|
11
|
+
detailDescription: `软件系统的碳排放已成为不可忽视的环境责任——全球 IT 行业贡献了约 2-4% 的碳排放。
|
|
12
|
+
本 Skill 提供务实的绿色编码方法:从识别 CPU 密集、无效轮询、内存泄漏等能耗热点,
|
|
13
|
+
到算法复杂度优化和云资源 Right-sizing,再到前端绿色实践和碳排放量化,
|
|
14
|
+
让工程师在不牺牲性能的前提下写出更节能的代码。`,
|
|
15
|
+
triggers: [
|
|
16
|
+
'绿色编码',
|
|
17
|
+
'green code',
|
|
18
|
+
'green software',
|
|
19
|
+
'carbon footprint',
|
|
20
|
+
'能耗优化',
|
|
21
|
+
'sustainable code',
|
|
22
|
+
'碳排放',
|
|
23
|
+
'节能',
|
|
24
|
+
'@ethan green-code',
|
|
25
|
+
'/green-code',
|
|
26
|
+
],
|
|
27
|
+
steps: [
|
|
28
|
+
{
|
|
29
|
+
title: '1. 能耗热点识别',
|
|
30
|
+
content: `扫描代码库,定位高能耗模式:
|
|
31
|
+
|
|
32
|
+
**六大能耗反模式**
|
|
33
|
+
|
|
34
|
+
| 反模式 | 表现 | 能耗级别 |
|
|
35
|
+
|--------|------|---------|
|
|
36
|
+
| **无效轮询** | \`while(true) { check(); sleep(100) }\` | 🔴 极高 |
|
|
37
|
+
| **CPU 密集循环** | 嵌套循环处理大数据集 | 🔴 极高 |
|
|
38
|
+
| **内存泄漏** | 对象无法被 GC 回收 | 🟠 高 |
|
|
39
|
+
| **冗余网络请求** | 重复请求相同资源 | 🟠 高 |
|
|
40
|
+
| **过度序列化** | 频繁 JSON.stringify 大对象 | 🟡 中 |
|
|
41
|
+
| **阻塞 I/O** | 同步文件读写阻塞主线程 | 🟡 中 |
|
|
42
|
+
|
|
43
|
+
**识别工具命令**
|
|
44
|
+
\`\`\`bash
|
|
45
|
+
# Node.js — CPU Profile
|
|
46
|
+
node --prof app.js
|
|
47
|
+
node --prof-process isolate-*.log > profile.txt
|
|
48
|
+
|
|
49
|
+
# 内存快照(Node.js)
|
|
50
|
+
node --heap-prof app.js
|
|
51
|
+
|
|
52
|
+
# 前端 — Chrome DevTools
|
|
53
|
+
# Performance 面板 → Record → 分析 Long Tasks(>50ms)
|
|
54
|
+
|
|
55
|
+
# Python — cProfile
|
|
56
|
+
python -m cProfile -o output.prof app.py
|
|
57
|
+
python -m pstats output.prof # 查看热点函数
|
|
58
|
+
\`\`\`
|
|
59
|
+
|
|
60
|
+
**无效轮询重构**
|
|
61
|
+
\`\`\`typescript
|
|
62
|
+
// ❌ 能耗高:每 100ms 轮询
|
|
63
|
+
while (true) {
|
|
64
|
+
const status = await checkJobStatus(jobId);
|
|
65
|
+
if (status === 'done') break;
|
|
66
|
+
await sleep(100);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ✅ 绿色:指数退避 + 最大间隔
|
|
70
|
+
async function pollWithBackoff(jobId: string) {
|
|
71
|
+
let delay = 500;
|
|
72
|
+
const MAX_DELAY = 30000;
|
|
73
|
+
while (true) {
|
|
74
|
+
const status = await checkJobStatus(jobId);
|
|
75
|
+
if (status === 'done') return;
|
|
76
|
+
await sleep(Math.min(delay, MAX_DELAY));
|
|
77
|
+
delay *= 1.5;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ✅ 更绿色:WebSocket / SSE(服务端推送,零轮询)
|
|
82
|
+
const ws = new WebSocket('/api/jobs/status');
|
|
83
|
+
ws.onmessage = (e) => handleUpdate(JSON.parse(e.data));
|
|
84
|
+
\`\`\`
|
|
85
|
+
|
|
86
|
+
**输出**:能耗热点清单(位置 + 类型 + 估算影响)`,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
title: '2. 算法复杂度优化',
|
|
90
|
+
content: `用低复杂度算法替换高能耗实现:
|
|
91
|
+
|
|
92
|
+
**复杂度对碳排放的影响(1M 数据量对比)**
|
|
93
|
+
\`\`\`
|
|
94
|
+
O(n²) → 10^12 操作 → 约 100W CPU 秒 🔴
|
|
95
|
+
O(n log n) → 2×10^7 操作 → 约 20ms 🟢
|
|
96
|
+
O(n) → 10^6 操作 → 约 1ms 🟢
|
|
97
|
+
O(1) → 1 操作 → 即时 🟢
|
|
98
|
+
\`\`\`
|
|
99
|
+
|
|
100
|
+
**常见优化模式**
|
|
101
|
+
|
|
102
|
+
**① 嵌套循环 → 哈希查找**
|
|
103
|
+
\`\`\`typescript
|
|
104
|
+
// ❌ O(n²) — 大数据量极度消耗 CPU
|
|
105
|
+
function findMatches(users: User[], orders: Order[]) {
|
|
106
|
+
return orders.filter(order =>
|
|
107
|
+
users.some(user => user.id === order.userId) // O(n) per order
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ✅ O(n) — 预建索引
|
|
112
|
+
function findMatchesOptimized(users: User[], orders: Order[]) {
|
|
113
|
+
const userMap = new Map(users.map(u => [u.id, u])); // 一次性 O(n)
|
|
114
|
+
return orders.filter(order => userMap.has(order.userId)); // O(1) per order
|
|
115
|
+
}
|
|
116
|
+
\`\`\`
|
|
117
|
+
|
|
118
|
+
**② 重复计算 → 缓存/记忆化**
|
|
119
|
+
\`\`\`typescript
|
|
120
|
+
// ❌ 每次调用重新计算
|
|
121
|
+
function expensiveCalc(n: number) { /* O(2^n) */ }
|
|
122
|
+
|
|
123
|
+
// ✅ 记忆化缓存
|
|
124
|
+
const memo = new Map<number, number>();
|
|
125
|
+
function cachedCalc(n: number): number {
|
|
126
|
+
if (memo.has(n)) return memo.get(n)!;
|
|
127
|
+
const result = expensiveCalc(n);
|
|
128
|
+
memo.set(n, result);
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
\`\`\`
|
|
132
|
+
|
|
133
|
+
**③ 大列表操作 → 流式处理**
|
|
134
|
+
\`\`\`typescript
|
|
135
|
+
// ❌ 全量加载到内存
|
|
136
|
+
const allRecords = await db.findAll(); // 可能 100MB
|
|
137
|
+
processAll(allRecords);
|
|
138
|
+
|
|
139
|
+
// ✅ 流式分批处理
|
|
140
|
+
const BATCH = 1000;
|
|
141
|
+
for await (const batch of db.findInBatches(BATCH)) {
|
|
142
|
+
await processBatch(batch);
|
|
143
|
+
}
|
|
144
|
+
\`\`\`
|
|
145
|
+
|
|
146
|
+
**输出**:算法优化建议 + 重构前后复杂度对比`,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
title: '3. 云资源效率优化',
|
|
150
|
+
content: `减少云资源浪费,降低运行能耗:
|
|
151
|
+
|
|
152
|
+
**云资源三大浪费来源**
|
|
153
|
+
\`\`\`
|
|
154
|
+
1. Over-provisioning(过度配置):实际 CPU 利用率 < 20%,却购买了大型实例
|
|
155
|
+
2. 僵尸资源:停止的 EC2、未挂载的 EBS 卷、空闲的 NAT 网关
|
|
156
|
+
3. 低效架构:长时间运行的大实例 vs. Serverless 按需执行
|
|
157
|
+
\`\`\`
|
|
158
|
+
|
|
159
|
+
**Right-sizing 实践**
|
|
160
|
+
\`\`\`bash
|
|
161
|
+
# AWS — 查看 CPU 利用率趋势(CloudWatch)
|
|
162
|
+
aws cloudwatch get-metric-statistics \
|
|
163
|
+
--metric-name CPUUtilization \
|
|
164
|
+
--dimensions Name=InstanceId,Value=i-xxxx \
|
|
165
|
+
--start-time 2024-01-01T00:00:00 \
|
|
166
|
+
--end-time 2024-01-31T00:00:00 \
|
|
167
|
+
--period 86400 --statistics Average
|
|
168
|
+
|
|
169
|
+
# 建议:平均 CPU < 20% → 降低一档实例类型
|
|
170
|
+
# m5.xlarge (4 vCPU) → m5.large (2 vCPU) = 节省 50% 成本和能耗
|
|
171
|
+
\`\`\`
|
|
172
|
+
|
|
173
|
+
**自动伸缩配置(节能关键)**
|
|
174
|
+
\`\`\`yaml
|
|
175
|
+
# Kubernetes HPA — 按 CPU 自动伸缩
|
|
176
|
+
apiVersion: autoscaling/v2
|
|
177
|
+
kind: HorizontalPodAutoscaler
|
|
178
|
+
metadata:
|
|
179
|
+
name: api-server
|
|
180
|
+
spec:
|
|
181
|
+
minReplicas: 1 # 低峰期缩减到 1 个副本
|
|
182
|
+
maxReplicas: 10
|
|
183
|
+
metrics:
|
|
184
|
+
- type: Resource
|
|
185
|
+
resource:
|
|
186
|
+
name: cpu
|
|
187
|
+
target:
|
|
188
|
+
type: Utilization
|
|
189
|
+
averageUtilization: 60
|
|
190
|
+
\`\`\`
|
|
191
|
+
|
|
192
|
+
**Serverless 适用场景**
|
|
193
|
+
\`\`\`
|
|
194
|
+
适合 Serverless(事件驱动,闲时零消耗):
|
|
195
|
+
✅ 图片处理、文件转换
|
|
196
|
+
✅ 定时任务、数据同步
|
|
197
|
+
✅ Webhook 处理器
|
|
198
|
+
|
|
199
|
+
不适合 Serverless(冷启动延迟不可接受):
|
|
200
|
+
❌ 实时游戏服务器
|
|
201
|
+
❌ 高频低延迟 API(< 100ms SLA)
|
|
202
|
+
\`\`\`
|
|
203
|
+
|
|
204
|
+
**输出**:云资源优化建议(Right-sizing + 自动伸缩 + 架构选型)`,
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
title: '4. 前端绿色实践',
|
|
208
|
+
content: `减少前端资源消耗,降低设备端能耗:
|
|
209
|
+
|
|
210
|
+
**前端能耗五大优化**
|
|
211
|
+
|
|
212
|
+
**① JavaScript Bundle 瘦身**
|
|
213
|
+
\`\`\`bash
|
|
214
|
+
# 分析 Bundle 大小
|
|
215
|
+
npx webpack-bundle-analyzer stats.json
|
|
216
|
+
npx vite-bundle-visualizer
|
|
217
|
+
|
|
218
|
+
# 目标:首屏 JS < 150KB (gzipped)
|
|
219
|
+
\`\`\`
|
|
220
|
+
|
|
221
|
+
\`\`\`typescript
|
|
222
|
+
// ✅ Tree-shaking(只导入用到的函数)
|
|
223
|
+
import { debounce } from 'lodash-es'; // 不要 import _ from 'lodash'
|
|
224
|
+
|
|
225
|
+
// ✅ 动态导入(按需加载非关键模块)
|
|
226
|
+
const HeavyChart = lazy(() => import('./HeavyChart'));
|
|
227
|
+
|
|
228
|
+
// ✅ 外部化大型库(CDN 缓存复用)
|
|
229
|
+
// vite.config.ts
|
|
230
|
+
build: { rollupOptions: { external: ['react', 'react-dom'] } }
|
|
231
|
+
\`\`\`
|
|
232
|
+
|
|
233
|
+
**② 图片优化**
|
|
234
|
+
\`\`\`html
|
|
235
|
+
<!-- ✅ 现代格式 + 响应式 -->
|
|
236
|
+
<picture>
|
|
237
|
+
<source srcset="hero.avif" type="image/avif">
|
|
238
|
+
<source srcset="hero.webp" type="image/webp">
|
|
239
|
+
<img src="hero.jpg" width="800" height="600"
|
|
240
|
+
loading="lazy" decoding="async" alt="...">
|
|
241
|
+
</picture>
|
|
242
|
+
<!-- WebP 比 JPEG 小 30%,AVIF 比 JPEG 小 50% -->
|
|
243
|
+
\`\`\`
|
|
244
|
+
|
|
245
|
+
**③ CSS 精简**
|
|
246
|
+
\`\`\`bash
|
|
247
|
+
# PurgeCSS — 移除未使用的 CSS
|
|
248
|
+
npx purgecss --css dist/*.css --content dist/*.html dist/*.js --output dist/
|
|
249
|
+
\`\`\`
|
|
250
|
+
|
|
251
|
+
**④ 减少不必要的动画**
|
|
252
|
+
\`\`\`css
|
|
253
|
+
/* 尊重用户的省电模式偏好 */
|
|
254
|
+
@media (prefers-reduced-motion: reduce) {
|
|
255
|
+
*, *::before, *::after {
|
|
256
|
+
animation-duration: 0.01ms !important;
|
|
257
|
+
transition-duration: 0.01ms !important;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
\`\`\`
|
|
261
|
+
|
|
262
|
+
**⑤ 高效 DOM 操作**
|
|
263
|
+
\`\`\`typescript
|
|
264
|
+
// ❌ 频繁触发 Reflow
|
|
265
|
+
items.forEach(item => {
|
|
266
|
+
item.style.width = container.offsetWidth + 'px'; // 每次读写触发 Reflow
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// ✅ 批量读后批量写
|
|
270
|
+
const width = container.offsetWidth; // 一次读取
|
|
271
|
+
items.forEach(item => { item.style.width = width + 'px'; }); // 批量写
|
|
272
|
+
\`\`\`
|
|
273
|
+
|
|
274
|
+
**输出**:前端绿色实践清单 + Bundle 分析建议`,
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
title: '5. 碳排放估算',
|
|
278
|
+
content: `用 SCI(Software Carbon Intensity)公式量化软件碳排放:
|
|
279
|
+
|
|
280
|
+
**SCI 公式**
|
|
281
|
+
\`\`\`
|
|
282
|
+
SCI = (E × I) + M
|
|
283
|
+
|
|
284
|
+
E = 软件消耗的电能(kWh)
|
|
285
|
+
I = 电网碳强度(gCO₂eq/kWh)— 取决于服务器所在地区
|
|
286
|
+
M = 硬件制造碳排放(均摊到使用寿命)
|
|
287
|
+
\`\`\`
|
|
288
|
+
|
|
289
|
+
**各地区电网碳强度参考**
|
|
290
|
+
\`\`\`
|
|
291
|
+
地区 碳强度 (gCO₂eq/kWh)
|
|
292
|
+
─────────────────────────────────
|
|
293
|
+
西欧 / Nordic ~150-300 (可再生能源占比高)
|
|
294
|
+
us-east-1 ~350-400
|
|
295
|
+
ap-northeast-1 ~450-500 (日本,主要火电)
|
|
296
|
+
cn-north-1 ~550-600 (中国,煤电为主)
|
|
297
|
+
AWS GovCloud ~200 (承诺使用清洁能源)
|
|
298
|
+
\`\`\`
|
|
299
|
+
|
|
300
|
+
**API 服务碳排放估算示例**
|
|
301
|
+
\`\`\`
|
|
302
|
+
假设:
|
|
303
|
+
- API 服务器:4 vCPU,平均 40% 利用率
|
|
304
|
+
- TDP(热设计功耗):100W(4 vCPU 服务器)
|
|
305
|
+
- 实际功耗:100W × 40% × PUE(1.2) = 48W
|
|
306
|
+
- 每月运行:48W × 730h = 35 kWh
|
|
307
|
+
- 碳排放(us-east-1,380 gCO₂/kWh):
|
|
308
|
+
35 × 380 = 13,300 gCO₂ = 13.3 kg CO₂/月
|
|
309
|
+
|
|
310
|
+
优化后(CPU 利用率从 40% 优化到 20% 后缩容):
|
|
311
|
+
12W × 730h × 380 / 1000 = 3.3 kg CO₂/月
|
|
312
|
+
节省:10 kg CO₂/月(减少 75%)
|
|
313
|
+
\`\`\`
|
|
314
|
+
|
|
315
|
+
**绿色目标设定**
|
|
316
|
+
\`\`\`
|
|
317
|
+
当前基准: ___ gCO₂/1000 API 请求
|
|
318
|
+
目标(3个月): 降低 30%
|
|
319
|
+
目标(1年): 迁移到低碳区域(or 可再生能源数据中心)
|
|
320
|
+
\`\`\`
|
|
321
|
+
|
|
322
|
+
**Carbon.txt 声明**(向用户公示绿色承诺)
|
|
323
|
+
\`\`\`
|
|
324
|
+
# /carbon.txt
|
|
325
|
+
We are committed to reducing our software's carbon footprint.
|
|
326
|
+
Hosting: AWS us-west-2 (powered by renewable energy)
|
|
327
|
+
Current SCI: 15g CO₂eq per 1000 requests
|
|
328
|
+
Target: < 10g CO₂eq per 1000 requests by 2025
|
|
329
|
+
\`\`\`
|
|
330
|
+
|
|
331
|
+
**输出**:碳排放基准报告 + SCI 计算表 + 减碳路线图`,
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
outputFormat: '能耗热点报告 + 算法优化建议 + 云资源 Right-sizing 方案 + 前端绿色实践 Checklist + 碳排放估算(SCI)',
|
|
335
|
+
examples: [],
|
|
336
|
+
notes: [
|
|
337
|
+
'绿色编码和性能优化高度重合——节能的代码往往也是更快的代码,两者并不冲突',
|
|
338
|
+
'将服务器迁移到使用可再生能源的区域(如 AWS us-west-2 Oregon)是降低碳排放最立竿见影的方式',
|
|
339
|
+
'前端优化对碳排放影响巨大:每减少 1KB JS,每百万用户每年可节省约 0.5 kg CO₂',
|
|
340
|
+
'SCI 指标建议纳入团队 KPI,每季度度量,与其他工程指标(性能/可用性)并列追踪',
|
|
341
|
+
'使用 AWS Customer Carbon Footprint Tool 或 Google Cloud Carbon Footprint 获取真实数据',
|
|
342
|
+
],
|
|
343
|
+
category: '质量侧',
|
|
344
|
+
nextSkill: 'performance',
|
|
345
|
+
};
|
|
346
|
+
//# sourceMappingURL=32-green-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"32-green-code.js","sourceRoot":"","sources":["../../src/skills/32-green-code.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAoB;IAC7C,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,mCAAmC;IAChD,aAAa,EAAE,2IAA2I;IAC1J,iBAAiB,EAAE;;;wBAGG;IACtB,QAAQ,EAAE;QACR,MAAM;QACN,YAAY;QACZ,gBAAgB;QAChB,kBAAkB;QAClB,MAAM;QACN,kBAAkB;QAClB,KAAK;QACL,IAAI;QACJ,mBAAmB;QACnB,aAAa;KACd;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAwDe;SACzB;QACD;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAwDW;SACrB;QACD;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAsD4B;SACtC;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAkEe;SACzB;QACD;YACE,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAqDkB;SAC5B;KACF;IACD,YAAY,EAAE,uEAAuE;IACrF,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE;QACL,sCAAsC;QACtC,yDAAyD;QACzD,gDAAgD;QAChD,4CAA4C;QAC5C,8EAA8E;KAC/E;IACD,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,aAAa;CACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"33-service-catalog.d.ts","sourceRoot":"","sources":["../../src/skills/33-service-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,mBAAmB,EAAE,eAyUjC,CAAC"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serviceCatalogSkill = void 0;
|
|
4
|
+
exports.serviceCatalogSkill = {
|
|
5
|
+
id: 'service-catalog',
|
|
6
|
+
name: '服务目录管理',
|
|
7
|
+
nameEn: 'service_catalog',
|
|
8
|
+
order: 33,
|
|
9
|
+
description: '建立标准化服务目录,生成 Backstage 兼容的 catalog-info.yaml,可视化服务依赖与健康评分',
|
|
10
|
+
descriptionEn: 'Build standardized service catalog, generate Backstage-compatible catalog-info.yaml, visualize service dependencies and health scores',
|
|
11
|
+
detailDescription: `在微服务架构中,服务蔓延(Service Sprawl)让工程师不知道"谁拥有哪个服务"。
|
|
12
|
+
本 Skill 帮助团队建立标准化的服务目录:采集服务元数据、生成 Backstage/IDP 兼容的 catalog-info.yaml、
|
|
13
|
+
绘制服务依赖关系图、建立服务健康评分体系,
|
|
14
|
+
让每个工程师都能快速找到服务的 Owner、SLA、依赖关系和运行状态。`,
|
|
15
|
+
triggers: [
|
|
16
|
+
'服务目录',
|
|
17
|
+
'service catalog',
|
|
18
|
+
'service registry',
|
|
19
|
+
'backstage',
|
|
20
|
+
'内部开发者平台',
|
|
21
|
+
'idp',
|
|
22
|
+
'服务注册',
|
|
23
|
+
'@ethan service-catalog',
|
|
24
|
+
'/service-catalog',
|
|
25
|
+
],
|
|
26
|
+
steps: [
|
|
27
|
+
{
|
|
28
|
+
title: '1. 服务元数据采集',
|
|
29
|
+
content: `系统化收集每个服务的关键元数据:
|
|
30
|
+
|
|
31
|
+
**服务元数据清单**
|
|
32
|
+
|
|
33
|
+
\`\`\`yaml
|
|
34
|
+
# 必填字段
|
|
35
|
+
name: 服务唯一标识(小写 + 连字符)
|
|
36
|
+
display_name: 人类可读名称
|
|
37
|
+
owner: 团队/个人(GitHub Team 或 email)
|
|
38
|
+
tech_stack: 主要技术栈(Node.js/Go/Java 等)
|
|
39
|
+
type: 服务类型(service/library/website/pipeline)
|
|
40
|
+
|
|
41
|
+
# 运维信息
|
|
42
|
+
tier: 重要性等级(tier-1/tier-2/tier-3)
|
|
43
|
+
sla: 可用性目标(99.9%/99.95%/99.99%)
|
|
44
|
+
on_call: 值班联系方式(PagerDuty/Slack channel)
|
|
45
|
+
runbook: 运维手册 URL
|
|
46
|
+
|
|
47
|
+
# 依赖关系
|
|
48
|
+
dependencies: 依赖的其他服务列表
|
|
49
|
+
consumers: 消费本服务的上游列表
|
|
50
|
+
databases: 使用的数据库(类型 + 库名)
|
|
51
|
+
external_apis: 调用的外部 API(如 Stripe/SendGrid)
|
|
52
|
+
|
|
53
|
+
# 文档与质量
|
|
54
|
+
docs: 文档链接(Confluence/Notion)
|
|
55
|
+
api_spec: OpenAPI/AsyncAPI 规范文件路径
|
|
56
|
+
test_coverage: 当前测试覆盖率
|
|
57
|
+
deployment_frequency: 发布频率(daily/weekly/monthly)
|
|
58
|
+
\`\`\`
|
|
59
|
+
|
|
60
|
+
**批量采集脚本**
|
|
61
|
+
\`\`\`bash
|
|
62
|
+
#!/bin/bash
|
|
63
|
+
# 扫描所有服务目录,检查是否有 catalog-info.yaml
|
|
64
|
+
for dir in services/*/; do
|
|
65
|
+
if [ ! -f "$dir/catalog-info.yaml" ]; then
|
|
66
|
+
echo "❌ Missing: $dir/catalog-info.yaml"
|
|
67
|
+
else
|
|
68
|
+
echo "✅ Found: $dir/catalog-info.yaml"
|
|
69
|
+
fi
|
|
70
|
+
done
|
|
71
|
+
\`\`\`
|
|
72
|
+
|
|
73
|
+
**输出**:服务元数据采集表(所有服务 + 完整度评分)`,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
title: '2. 生成 catalog-info.yaml',
|
|
77
|
+
content: `生成 Backstage/内部开发者平台兼容的服务定义文件:
|
|
78
|
+
|
|
79
|
+
**完整 catalog-info.yaml 模板**
|
|
80
|
+
\`\`\`yaml
|
|
81
|
+
# services/order-service/catalog-info.yaml
|
|
82
|
+
apiVersion: backstage.io/v1alpha1
|
|
83
|
+
kind: Component
|
|
84
|
+
metadata:
|
|
85
|
+
name: order-service
|
|
86
|
+
title: 订单服务
|
|
87
|
+
description: 处理订单创建、支付和履约的核心服务
|
|
88
|
+
tags:
|
|
89
|
+
- nodejs
|
|
90
|
+
- postgresql
|
|
91
|
+
- kafka
|
|
92
|
+
- tier-1
|
|
93
|
+
annotations:
|
|
94
|
+
# GitHub 集成
|
|
95
|
+
github.com/project-slug: myorg/order-service
|
|
96
|
+
# 监控集成
|
|
97
|
+
prometheus.io/alert: 'order-service-alerts'
|
|
98
|
+
grafana.com/dashboard: 'https://grafana.internal/d/orders'
|
|
99
|
+
# 文档
|
|
100
|
+
backstage.io/techdocs-ref: dir:.
|
|
101
|
+
# PagerDuty
|
|
102
|
+
pagerduty.com/service-id: P123456
|
|
103
|
+
links:
|
|
104
|
+
- url: https://runbook.internal/order-service
|
|
105
|
+
title: Runbook
|
|
106
|
+
icon: book
|
|
107
|
+
- url: https://grafana.internal/d/orders
|
|
108
|
+
title: Dashboard
|
|
109
|
+
icon: dashboard
|
|
110
|
+
|
|
111
|
+
spec:
|
|
112
|
+
type: service
|
|
113
|
+
lifecycle: production # experimental | production | deprecated
|
|
114
|
+
owner: group:backend-team
|
|
115
|
+
system: ecommerce-platform
|
|
116
|
+
|
|
117
|
+
# 依赖声明
|
|
118
|
+
dependsOn:
|
|
119
|
+
- component:user-service
|
|
120
|
+
- component:inventory-service
|
|
121
|
+
- resource:orders-postgres
|
|
122
|
+
- resource:payment-kafka-topic
|
|
123
|
+
|
|
124
|
+
# 对外提供的 API
|
|
125
|
+
providesApis:
|
|
126
|
+
- order-api-v2
|
|
127
|
+
\`\`\`
|
|
128
|
+
|
|
129
|
+
**API 定义(关联)**
|
|
130
|
+
\`\`\`yaml
|
|
131
|
+
# order-api.yaml
|
|
132
|
+
apiVersion: backstage.io/v1alpha1
|
|
133
|
+
kind: API
|
|
134
|
+
metadata:
|
|
135
|
+
name: order-api-v2
|
|
136
|
+
description: 订单服务 REST API v2
|
|
137
|
+
spec:
|
|
138
|
+
type: openapi
|
|
139
|
+
lifecycle: production
|
|
140
|
+
owner: group:backend-team
|
|
141
|
+
definition:
|
|
142
|
+
$text: ./openapi/order-api-v2.yaml
|
|
143
|
+
\`\`\`
|
|
144
|
+
|
|
145
|
+
**Resource 定义(数据库/队列)**
|
|
146
|
+
\`\`\`yaml
|
|
147
|
+
apiVersion: backstage.io/v1alpha1
|
|
148
|
+
kind: Resource
|
|
149
|
+
metadata:
|
|
150
|
+
name: orders-postgres
|
|
151
|
+
description: 订单主数据库(PostgreSQL 14)
|
|
152
|
+
spec:
|
|
153
|
+
type: database
|
|
154
|
+
owner: group:dba-team
|
|
155
|
+
system: ecommerce-platform
|
|
156
|
+
\`\`\`
|
|
157
|
+
|
|
158
|
+
**输出**:catalog-info.yaml + API 定义文件 + Resource 定义文件`,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
title: '3. 服务依赖关系图',
|
|
162
|
+
content: `可视化服务间的上下游依赖关系:
|
|
163
|
+
|
|
164
|
+
**Mermaid 依赖图生成**
|
|
165
|
+
\`\`\`typescript
|
|
166
|
+
// scripts/gen-dependency-graph.ts
|
|
167
|
+
function generateMermaid(services: Service[]): string {
|
|
168
|
+
const lines = ['graph LR'];
|
|
169
|
+
|
|
170
|
+
for (const service of services) {
|
|
171
|
+
for (const dep of service.dependencies) {
|
|
172
|
+
lines.push(\` \${service.name} --> \${dep}\`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return lines.join('\\n');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// 输出示例:
|
|
180
|
+
// graph LR
|
|
181
|
+
// order-service --> user-service
|
|
182
|
+
// order-service --> inventory-service
|
|
183
|
+
// order-service --> payment-service
|
|
184
|
+
// api-gateway --> order-service
|
|
185
|
+
// api-gateway --> user-service
|
|
186
|
+
\`\`\`
|
|
187
|
+
|
|
188
|
+
**关键依赖分析**
|
|
189
|
+
\`\`\`
|
|
190
|
+
依赖分析报告
|
|
191
|
+
════════════
|
|
192
|
+
|
|
193
|
+
高扇入服务(被依赖最多,故障影响最广):
|
|
194
|
+
user-service 被 8 个服务依赖 ⚠️ 单点风险
|
|
195
|
+
auth-service 被 12 个服务依赖 🔴 关键路径
|
|
196
|
+
|
|
197
|
+
高扇出服务(依赖最多,级联失败风险):
|
|
198
|
+
order-service 依赖 6 个服务 ⚠️ 需熔断保护
|
|
199
|
+
report-service 依赖 9 个服务 🔴 脆弱性高
|
|
200
|
+
|
|
201
|
+
循环依赖检测:
|
|
202
|
+
✅ 未发现循环依赖
|
|
203
|
+
|
|
204
|
+
孤立服务(无依赖/无被依赖):
|
|
205
|
+
legacy-batch-job ⚠️ 是否可下线?
|
|
206
|
+
\`\`\`
|
|
207
|
+
|
|
208
|
+
**依赖健康度 Checklist**
|
|
209
|
+
- [ ] 高扇入服务(>5个依赖)配备了熔断器(Circuit Breaker)
|
|
210
|
+
- [ ] 高扇出服务对所有依赖设置了超时(Timeout)
|
|
211
|
+
- [ ] 关键路径服务有冗余/多活部署
|
|
212
|
+
- [ ] 无循环依赖
|
|
213
|
+
|
|
214
|
+
**输出**:服务依赖关系图(Mermaid/DOT)+ 风险分析报告`,
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
title: '4. 服务健康评分',
|
|
218
|
+
content: `建立多维度服务健康评分体系,量化技术质量:
|
|
219
|
+
|
|
220
|
+
**服务健康评分卡(满分 100)**
|
|
221
|
+
|
|
222
|
+
\`\`\`
|
|
223
|
+
维度 权重 评分标准
|
|
224
|
+
─────────────────────────────────────────
|
|
225
|
+
📄 文档完整性 20分
|
|
226
|
+
catalog-info.yaml 5分 (存在且完整)
|
|
227
|
+
README.md 5分 (含部署、接口说明)
|
|
228
|
+
API 规范 5分 (OpenAPI/AsyncAPI)
|
|
229
|
+
Runbook 5分 (含常见故障处理)
|
|
230
|
+
|
|
231
|
+
🧪 测试质量 25分
|
|
232
|
+
单元测试覆盖率 >80% 15分
|
|
233
|
+
集成测试存在 10分
|
|
234
|
+
|
|
235
|
+
🚀 部署规范 25分
|
|
236
|
+
CI/CD 流水线完整 10分
|
|
237
|
+
容器化(Dockerfile) 5分
|
|
238
|
+
健康检查接口 5分
|
|
239
|
+
优雅关闭实现 5分
|
|
240
|
+
|
|
241
|
+
📊 可观测性 20分
|
|
242
|
+
Metrics 暴露 8分 (/metrics endpoint)
|
|
243
|
+
结构化日志 7分 (JSON 格式 + trace ID)
|
|
244
|
+
告警规则配置 5分
|
|
245
|
+
|
|
246
|
+
🔒 安全合规 10分
|
|
247
|
+
依赖漏洞扫描通过 5分 (npm audit/Snyk 0 High)
|
|
248
|
+
密钥未硬编码 5分
|
|
249
|
+
\`\`\`
|
|
250
|
+
|
|
251
|
+
**评分等级**
|
|
252
|
+
- 🟢 **优秀(90-100)**:可作为黄金路径参考
|
|
253
|
+
- 🟡 **良好(70-89)**:有改进空间,下季度计划
|
|
254
|
+
- 🟠 **待改进(50-69)**:需要专项提升
|
|
255
|
+
- 🔴 **高风险(< 50)**:必须立即改进
|
|
256
|
+
|
|
257
|
+
**批量评分脚本示例**
|
|
258
|
+
\`\`\`bash
|
|
259
|
+
#!/bin/bash
|
|
260
|
+
# 检查服务健康评分关键项
|
|
261
|
+
check_service() {
|
|
262
|
+
local dir=$1
|
|
263
|
+
local score=0
|
|
264
|
+
|
|
265
|
+
[ -f "$dir/catalog-info.yaml" ] && score=$((score+5))
|
|
266
|
+
[ -f "$dir/README.md" ] && score=$((score+5))
|
|
267
|
+
[ -f "$dir/Dockerfile" ] && score=$((score+5))
|
|
268
|
+
[ -f "$dir/.github/workflows/ci.yml" ] && score=$((score+10))
|
|
269
|
+
|
|
270
|
+
echo "$dir: $score / 25 (快速检查)"
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
for dir in services/*/; do check_service "$dir"; done
|
|
274
|
+
\`\`\`
|
|
275
|
+
|
|
276
|
+
**输出**:服务健康评分卡 + 改进优先级清单`,
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
title: '5. 服务生命周期管理',
|
|
280
|
+
content: `建立服务从孵化到下线的标准生命周期流程:
|
|
281
|
+
|
|
282
|
+
**四阶段生命周期**
|
|
283
|
+
\`\`\`
|
|
284
|
+
孵化(Experimental)→ 成熟(Production)→ 维护(Maintenance)→ 下线(Deprecated)
|
|
285
|
+
\`\`\`
|
|
286
|
+
|
|
287
|
+
**各阶段定义与要求**
|
|
288
|
+
|
|
289
|
+
| 阶段 | lifecycle 值 | 要求 | 颜色标记 |
|
|
290
|
+
|------|-------------|------|---------|
|
|
291
|
+
| 孵化 | experimental | 开发中,不可用于生产 | 🟡 |
|
|
292
|
+
| 成熟 | production | 满足健康评分 ≥ 80 | 🟢 |
|
|
293
|
+
| 维护 | maintenance | 仅修复 Bug,不加新功能 | 🟠 |
|
|
294
|
+
| 下线 | deprecated | 已有替代服务,设定截止日 | 🔴 |
|
|
295
|
+
|
|
296
|
+
**服务下线流程**
|
|
297
|
+
\`\`\`
|
|
298
|
+
Day 0: 更新 lifecycle: deprecated,添加 deprecation notice
|
|
299
|
+
通知所有已知消费者(来自 catalog 的 consumers 列表)
|
|
300
|
+
|
|
301
|
+
Day 30: 确认所有消费者已迁移
|
|
302
|
+
关闭新注册/新依赖
|
|
303
|
+
|
|
304
|
+
Day 60: 停止接受新请求(返回 410 Gone)
|
|
305
|
+
保留 Read-only 访问用于历史数据查询
|
|
306
|
+
|
|
307
|
+
Day 90: 完全下线,数据归档
|
|
308
|
+
从 catalog 中标记 archived: true
|
|
309
|
+
\`\`\`
|
|
310
|
+
|
|
311
|
+
**服务晋升 Checklist(Experimental → Production)**
|
|
312
|
+
- [ ] 服务健康评分 ≥ 80
|
|
313
|
+
- [ ] 通过 Load Test(目标 TPS 的 150% 压力)
|
|
314
|
+
- [ ] 完成安全扫描(0 个 High/Critical 漏洞)
|
|
315
|
+
- [ ] Runbook 已编写并通过演练
|
|
316
|
+
- [ ] 监控告警已配置并验证(OnCall 团队确认)
|
|
317
|
+
- [ ] 至少经过 2 周 Canary 发布观察
|
|
318
|
+
|
|
319
|
+
**输出**:服务生命周期文档 + 下线流程 + 晋升 Checklist`,
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
outputFormat: 'catalog-info.yaml 文件 + 服务依赖关系图(Mermaid)+ 服务健康评分卡 + 生命周期管理规范',
|
|
323
|
+
examples: [],
|
|
324
|
+
notes: [
|
|
325
|
+
'服务目录的价值在于"被发现"——确保 catalog-info.yaml 提交到代码库并与 Backstage/IDP 自动同步',
|
|
326
|
+
'从高 Tier(Tier-1 核心服务)开始建立目录,而非试图一次性覆盖所有服务',
|
|
327
|
+
'服务健康评分应作为季度技术评审的固定议题,驱动持续改进',
|
|
328
|
+
'依赖关系图定期更新至关重要——过时的依赖图比没有图更危险',
|
|
329
|
+
'Backstage 是目前最成熟的开源 IDP,推荐中大型团队直接采用;小团队可用 catalog-info.yaml 文件 + 简单脚本代替',
|
|
330
|
+
],
|
|
331
|
+
category: '执行侧',
|
|
332
|
+
nextSkill: 'deployment',
|
|
333
|
+
};
|
|
334
|
+
//# sourceMappingURL=33-service-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"33-service-catalog.js","sourceRoot":"","sources":["../../src/skills/33-service-catalog.ts"],"names":[],"mappings":";;;AAEa,QAAA,mBAAmB,GAAoB;IAClD,EAAE,EAAE,iBAAiB;IACrB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,2DAA2D;IACxE,aAAa,EAAE,uIAAuI;IACtJ,iBAAiB,EAAE;;;qCAGgB;IACnC,QAAQ,EAAE;QACR,MAAM;QACN,iBAAiB;QACjB,kBAAkB;QAClB,WAAW;QACX,SAAS;QACT,KAAK;QACL,MAAM;QACN,wBAAwB;QACxB,kBAAkB;KACnB;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BA4Ce;SACzB;QACD;YACE,KAAK,EAAE,yBAAyB;YAChC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDAiFqC;SAC/C;QACD;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAoDqB;SAC/B;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA0DU;SACpB;QACD;YACE,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAuCuB;SACjC;KACF;IACD,YAAY,EAAE,6DAA6D;IAC3E,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE;QACL,kEAAkE;QAClE,0CAA0C;QAC1C,6BAA6B;QAC7B,8BAA8B;QAC9B,yEAAyE;KAC1E;IACD,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,YAAY;CACxB,CAAC"}
|