ethan-skill 1.11.0 → 1.13.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.
Files changed (92) hide show
  1. package/CHANGELOG.md +272 -0
  2. package/README.md +84 -33
  3. package/dist/agents/index.d.ts +14 -0
  4. package/dist/agents/index.d.ts.map +1 -0
  5. package/dist/agents/index.js +37 -0
  6. package/dist/agents/index.js.map +1 -0
  7. package/dist/agents/orchestrator.d.ts +10 -0
  8. package/dist/agents/orchestrator.d.ts.map +1 -0
  9. package/dist/agents/orchestrator.js +233 -0
  10. package/dist/agents/orchestrator.js.map +1 -0
  11. package/dist/agents/orchestrator.test.d.ts +2 -0
  12. package/dist/agents/orchestrator.test.d.ts.map +1 -0
  13. package/dist/agents/orchestrator.test.js +151 -0
  14. package/dist/agents/orchestrator.test.js.map +1 -0
  15. package/dist/agents/presets.d.ts +16 -0
  16. package/dist/agents/presets.d.ts.map +1 -0
  17. package/dist/agents/presets.js +123 -0
  18. package/dist/agents/presets.js.map +1 -0
  19. package/dist/agents/types.d.ts +29 -0
  20. package/dist/agents/types.d.ts.map +1 -0
  21. package/dist/agents/types.js +7 -0
  22. package/dist/agents/types.js.map +1 -0
  23. package/dist/cli/index.js +1168 -1
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/loader/custom-agent-loader.d.ts +13 -0
  26. package/dist/loader/custom-agent-loader.d.ts.map +1 -0
  27. package/dist/loader/custom-agent-loader.js +120 -0
  28. package/dist/loader/custom-agent-loader.js.map +1 -0
  29. package/dist/mcp/server.d.ts.map +1 -1
  30. package/dist/mcp/server.js +278 -1
  31. package/dist/mcp/server.js.map +1 -1
  32. package/dist/skills/27-tech-debt.d.ts +3 -0
  33. package/dist/skills/27-tech-debt.d.ts.map +1 -0
  34. package/dist/skills/27-tech-debt.js +149 -0
  35. package/dist/skills/27-tech-debt.js.map +1 -0
  36. package/dist/skills/28-api-mock.d.ts +3 -0
  37. package/dist/skills/28-api-mock.d.ts.map +1 -0
  38. package/dist/skills/28-api-mock.js +272 -0
  39. package/dist/skills/28-api-mock.js.map +1 -0
  40. package/dist/skills/29-data-migration.d.ts +3 -0
  41. package/dist/skills/29-data-migration.d.ts.map +1 -0
  42. package/dist/skills/29-data-migration.js +331 -0
  43. package/dist/skills/29-data-migration.js.map +1 -0
  44. package/dist/skills/30-llm-feature.d.ts +3 -0
  45. package/dist/skills/30-llm-feature.d.ts.map +1 -0
  46. package/dist/skills/30-llm-feature.js +328 -0
  47. package/dist/skills/30-llm-feature.js.map +1 -0
  48. package/dist/skills/31-threat-model.d.ts +3 -0
  49. package/dist/skills/31-threat-model.d.ts.map +1 -0
  50. package/dist/skills/31-threat-model.js +240 -0
  51. package/dist/skills/31-threat-model.js.map +1 -0
  52. package/dist/skills/32-green-code.d.ts +3 -0
  53. package/dist/skills/32-green-code.d.ts.map +1 -0
  54. package/dist/skills/32-green-code.js +346 -0
  55. package/dist/skills/32-green-code.js.map +1 -0
  56. package/dist/skills/33-service-catalog.d.ts +3 -0
  57. package/dist/skills/33-service-catalog.d.ts.map +1 -0
  58. package/dist/skills/33-service-catalog.js +334 -0
  59. package/dist/skills/33-service-catalog.js.map +1 -0
  60. package/dist/skills/34-mobile-review.d.ts +3 -0
  61. package/dist/skills/34-mobile-review.d.ts.map +1 -0
  62. package/dist/skills/34-mobile-review.js +390 -0
  63. package/dist/skills/34-mobile-review.js.map +1 -0
  64. package/dist/skills/35-data-pipeline.d.ts +3 -0
  65. package/dist/skills/35-data-pipeline.d.ts.map +1 -0
  66. package/dist/skills/35-data-pipeline.js +392 -0
  67. package/dist/skills/35-data-pipeline.js.map +1 -0
  68. package/dist/skills/36-ml-experiment.d.ts +3 -0
  69. package/dist/skills/36-ml-experiment.d.ts.map +1 -0
  70. package/dist/skills/36-ml-experiment.js +415 -0
  71. package/dist/skills/36-ml-experiment.js.map +1 -0
  72. package/dist/skills/index.d.ts +10 -0
  73. package/dist/skills/index.d.ts.map +1 -1
  74. package/dist/skills/index.js +41 -1
  75. package/dist/skills/index.js.map +1 -1
  76. package/dist/skills/pipeline.d.ts.map +1 -1
  77. package/dist/skills/pipeline.js +35 -0
  78. package/dist/skills/pipeline.js.map +1 -1
  79. package/dist/skills/skills.test.js +3 -3
  80. package/dist/skills/skills.test.js.map +1 -1
  81. package/package.json +1 -1
  82. package/rules/claude-code/CLAUDE.md +2963 -3
  83. package/rules/cline/.clinerules +2805 -2
  84. package/rules/codebuddy/CODEBUDDY.md +2913 -2
  85. package/rules/continue/.continuerules +2805 -2
  86. package/rules/copilot/copilot-instructions.md +2883 -2
  87. package/rules/cursor/.cursorrules +2952 -2
  88. package/rules/cursor/smart-flow.mdc +2952 -2
  89. package/rules/jetbrains/smart-flow.md +2883 -2
  90. package/rules/lingma/smart-flow.md +2904 -3
  91. package/rules/windsurf/.windsurf/rules/smart-flow.md +2884 -3
  92. package/rules/zed/smart-flow.rules +2794 -1
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.threatModelSkill = void 0;
4
+ exports.threatModelSkill = {
5
+ id: 'threat-model',
6
+ name: '威胁建模',
7
+ nameEn: 'threat_model',
8
+ order: 31,
9
+ description: '运用 STRIDE 方法识别系统安全威胁,构建攻击树,制定缓解措施与残余风险评估',
10
+ descriptionEn: 'Apply STRIDE methodology to identify security threats, build attack trees, define mitigations and assess residual risks',
11
+ detailDescription: `安全设计不能只靠直觉——威胁建模是将安全思考系统化的核心方法论。
12
+ 本 Skill 引导团队完成完整的威胁建模流程:定义系统边界和数据流,
13
+ 用 STRIDE 框架逐一识别六类威胁(仿冒/篡改/否认/信息泄露/DoS/权限提升),
14
+ 构建攻击树量化风险,为每个威胁制定具体的安全控制措施,
15
+ 最终形成可追踪的安全设计文档。`,
16
+ triggers: [
17
+ '威胁建模',
18
+ 'threat model',
19
+ 'threat modeling',
20
+ 'stride',
21
+ '攻击面分析',
22
+ 'security design',
23
+ '安全设计',
24
+ '攻击树',
25
+ '@ethan threat-model',
26
+ '/threat-model',
27
+ ],
28
+ steps: [
29
+ {
30
+ title: '1. 系统边界定义',
31
+ content: `明确系统的信任边界、数据流和外部实体:
32
+
33
+ **系统分解步骤**
34
+
35
+ 1. **识别外部实体**(系统外部的人/系统)
36
+ - 终端用户(匿名用户、注册用户、管理员)
37
+ - 外部系统(第三方 API、支付网关、邮件服务)
38
+ - 内部其他服务(微服务间调用)
39
+
40
+ 2. **绘制数据流图(DFD Level 0)**
41
+ \`\`\`
42
+ [用户浏览器] ──HTTPS──> [Web 服务器] ──内网──> [应用服务器]
43
+
44
+ [数据库服务器]
45
+
46
+ [缓存 Redis]
47
+
48
+ 信任边界(虚线):
49
+ - 边界1:Internet / DMZ(用户浏览器 ↔ Web 服务器)
50
+ - 边界2:DMZ / 内网(Web 服务器 ↔ 应用服务器)
51
+ - 边界3:内网 / 数据层(应用服务器 ↔ DB/Cache)
52
+ \`\`\`
53
+
54
+ 3. **数据资产分类**
55
+ \`\`\`
56
+ 🔴 高度敏感:用户密码、信用卡信息、身份证号
57
+ 🟠 敏感: 邮箱、手机号、订单信息、行为数据
58
+ 🟡 普通: 商品信息、公开内容、系统配置
59
+ \`\`\`
60
+
61
+ 4. **威胁面列举**
62
+ - 对外 API 端点数量:___
63
+ - 需要认证的接口:___
64
+ - 数据库直连点:___
65
+ - 第三方 SDK 集成:___
66
+
67
+ **输出**:DFD 图 + 信任边界标注 + 数据资产清单`,
68
+ },
69
+ {
70
+ title: '2. STRIDE 威胁识别',
71
+ content: `用 STRIDE 框架对每个数据流逐一检查六类威胁:
72
+
73
+ **STRIDE 威胁矩阵**
74
+
75
+ | 威胁类型 | 缩写含义 | 核心问题 | 安全属性 |
76
+ |---------|---------|---------|---------|
77
+ | **Spoofing(仿冒)** | 攻击者伪装成合法用户/系统 | 系统如何验证身份? | 认证 |
78
+ | **Tampering(篡改)** | 恶意修改数据或代码 | 数据完整性如何保证? | 完整性 |
79
+ | **Repudiation(否认)** | 用户否认执行过某操作 | 是否有可信的操作记录? | 不可否认性 |
80
+ | **Information Disclosure(信息泄露)** | 敏感数据暴露给未授权方 | 数据在传输/存储中是否加密? | 机密性 |
81
+ | **Denial of Service(拒绝服务)** | 使系统无法响应合法请求 | 系统能承受多大压力? | 可用性 |
82
+ | **Elevation of Privilege(权限提升)** | 获得超出授权的权限 | 权限检查是否严格? | 授权 |
83
+
84
+ **针对登录接口的 STRIDE 分析示例**
85
+
86
+ \`\`\`
87
+ 接口:POST /api/auth/login(外部 → 应用服务器)
88
+
89
+ S - 仿冒:
90
+ 威胁:攻击者暴力破解或凭据填充(Credential Stuffing)
91
+ 影响:高(账号被盗)
92
+
93
+ T - 篡改:
94
+ 威胁:中间人攻击修改请求(非 HTTPS 场景)
95
+ 影响:高(凭据被劫持)
96
+
97
+ R - 否认:
98
+ 威胁:用户否认登录操作(无日志)
99
+ 影响:中(无法审计)
100
+
101
+ I - 信息泄露:
102
+ 威胁:错误信息泄露"用户不存在"vs"密码错误"
103
+ 影响:中(可枚举用户名)
104
+
105
+ D - 拒绝服务:
106
+ 威胁:大量登录请求耗尽服务器资源
107
+ 影响:高(服务不可用)
108
+
109
+ E - 权限提升:
110
+ 威胁:JWT 签名算法混淆(HS256 → None)
111
+ 影响:严重(绕过认证)
112
+ \`\`\`
113
+
114
+ **输出**:STRIDE 威胁识别矩阵(每个数据流 × 6 类威胁)`,
115
+ },
116
+ {
117
+ title: '3. 攻击树构建',
118
+ content: `为高风险威胁构建攻击树,量化攻击路径:
119
+
120
+ **攻击树符号**
121
+ \`\`\`
122
+ 目标(攻击根节点)
123
+ ├── AND: 所有子节点都需满足
124
+ └── OR: 任意子节点满足即可(默认)
125
+ \`\`\`
126
+
127
+ **示例:攻击者获取用户数据攻击树**
128
+ \`\`\`
129
+ [目标] 获取用户敏感数据
130
+ ├── OR
131
+ │ ├── [路径1] 突破 Web 层
132
+ │ │ ├── SQL 注入(概率: 中,影响: 严重)
133
+ │ │ │ └── 防御:参数化查询 ✓
134
+ │ │ └── XSS 窃取 Token(概率: 中,影响: 高)
135
+ │ │ └── 防御:CSP + HttpOnly Cookie ✓
136
+ │ ├── [路径2] 绕过认证
137
+ │ │ ├── 暴力破解(概率: 高,影响: 高)
138
+ │ │ │ └── 防御:Rate Limit + CAPTCHA ✓
139
+ │ │ └── Token 伪造(概率: 低,影响: 严重)
140
+ │ │ └── 防御:强签名算法(RS256)✓
141
+ │ └── [路径3] 内部威胁
142
+ │ └── 数据库直接访问(概率: 低,影响: 严重)
143
+ │ └── 防御:最小权限 + 审计日志 ✓
144
+ \`\`\`
145
+
146
+ **风险评分(DREAD 模型)**
147
+ \`\`\`
148
+ Damage(损害): 1-10
149
+ Reproducibility(复现): 1-10
150
+ Exploitability(利用难度): 1-10
151
+ Affected Users(影响用户): 1-10
152
+ Discoverability(发现难度): 1-10
153
+
154
+ 总分 = (D+R+E+A+D) / 5
155
+ 8-10:严重 6-7.9:高 4-5.9:中 < 4:低
156
+ \`\`\`
157
+
158
+ **输出**:攻击树图 + DREAD 风险评分表`,
159
+ },
160
+ {
161
+ title: '4. 安全控制措施',
162
+ content: `为每个已识别威胁制定具体的缓解控制措施:
163
+
164
+ **STRIDE → 控制措施对照表**
165
+
166
+ | 威胁 | 控制措施 | 实现示例 |
167
+ |------|---------|---------|
168
+ | **仿冒** | 多因素认证、OAuth 2.0 | \`TOTP + SMS OTP\` |
169
+ | **篡改** | HTTPS 全程加密、数字签名 | \`TLS 1.3 + HMAC 请求签名\` |
170
+ | **否认** | 不可篡改审计日志 | \`Append-only Log + 时间戳签名\` |
171
+ | **信息泄露** | 最小权限、数据脱敏、加密 | \`AES-256 静态加密 + 字段脱敏\` |
172
+ | **DoS** | 限流、WAF、自动扩容 | \`Rate Limit 10 req/s/IP + CDN\` |
173
+ | **权限提升** | RBAC、输入验证 | \`JWT RS256 + 接口级鉴权\` |
174
+
175
+ **优先级实现路线图**
176
+ \`\`\`
177
+ P0(立即实现,影响上线):
178
+ ✅ HTTPS 强制(HSTS)
179
+ ✅ SQL 参数化查询
180
+ ✅ 密码 bcrypt 哈希(cost factor ≥ 12)
181
+ ✅ JWT 算法锁定(禁用 none/HS256→RS256)
182
+
183
+ P1(首个 Sprint 内):
184
+ 🔲 API 限流(100 req/min/user)
185
+ 🔲 账号锁定(5次失败锁定15分钟)
186
+ 🔲 安全响应头(CSP/X-Frame-Options/HSTS)
187
+ 🔲 审计日志(登录/权限变更/数据访问)
188
+
189
+ P2(次个 Sprint 内):
190
+ 🔲 多因素认证(MFA)
191
+ 🔲 字段级数据脱敏(API 响应)
192
+ 🔲 依赖漏洞扫描(npm audit / Snyk)
193
+ 🔲 渗透测试(OWASP Top 10 覆盖)
194
+ \`\`\`
195
+
196
+ **输出**:安全控制措施清单 + 实现优先级路线图`,
197
+ },
198
+ {
199
+ title: '5. 残余风险评估',
200
+ content: `评估实施控制措施后的剩余风险,制定接受/处置策略:
201
+
202
+ **四种风险处置方式**
203
+ - **接受(Accept)**:风险可接受,记录并监控
204
+ - **降低(Mitigate)**:实施控制措施降低概率/影响
205
+ - **转移(Transfer)**:购买保险或外包给第三方(如 Cloudflare DDoS 防护)
206
+ - **规避(Avoid)**:不实现该功能/移除风险点
207
+
208
+ **残余风险登记册模板**
209
+ \`\`\`
210
+ | ID | 威胁描述 | 原始风险 | 控制措施 | 残余风险 | 处置策略 | 责任人 | 复查日期 |
211
+ |----|---------|---------|---------|---------|---------|--------|---------|
212
+ | T001 | 暴力破解密码 | 高(8) | Rate Limit + CAPTCHA | 低(2) | 接受 | @security | 2024-Q2 |
213
+ | T002 | SQL注入 | 严重(9) | 参数化查询 | 极低(1) | 接受 | @backend | 2024-Q2 |
214
+ | T003 | DDoS攻击 | 高(7) | Cloudflare | 低(3) | 转移 | @infra | 2024-Q2 |
215
+ | T004 | 0-day漏洞 | 未知 | WAF + 快速响应 | 中(5) | 监控 | @security | 月度 |
216
+ \`\`\`
217
+
218
+ **安全评审 Checklist**
219
+ - [ ] 所有 P0 控制措施已实现并测试
220
+ - [ ] 威胁模型已经过安全团队评审
221
+ - [ ] 高风险威胁已获得业务方正式接受签字
222
+ - [ ] 残余风险已录入风险登记册
223
+ - [ ] 设定下次威胁模型复审日期(建议每季度或重大变更后)
224
+
225
+ **输出**:残余风险登记册 + 风险接受声明 + 复审计划`,
226
+ },
227
+ ],
228
+ outputFormat: '威胁模型文档(DFD + 信任边界)+ STRIDE 威胁矩阵 + 攻击树图 + 安全控制措施路线图 + 残余风险登记册',
229
+ examples: [],
230
+ notes: [
231
+ '威胁建模应在设计阶段进行,而非开发完成后——越早发现安全问题修复成本越低',
232
+ 'STRIDE 不是一次性工作,每次重大功能变更(新 API、新数据流)都应更新威胁模型',
233
+ '攻击树帮助量化优先级,但不要追求完美——覆盖 OWASP Top 10 对大多数产品已足够',
234
+ '内部人员威胁(离职员工、权限滥用)往往被忽视,建议在威胁建模中专门分析',
235
+ '威胁建模输出文档应纳入安全合规证据库(SOC2/ISO27001 审计常见要求)',
236
+ ],
237
+ category: '质量侧',
238
+ nextSkill: 'security-review',
239
+ };
240
+ //# sourceMappingURL=31-threat-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"31-threat-model.js","sourceRoot":"","sources":["../../src/skills/31-threat-model.ts"],"names":[],"mappings":";;;AAEa,QAAA,gBAAgB,GAAoB;IAC/C,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,0CAA0C;IACvD,aAAa,EAAE,yHAAyH;IACxI,iBAAiB,EAAE;;;;gBAIL;IACd,QAAQ,EAAE;QACR,MAAM;QACN,cAAc;QACd,iBAAiB;QACjB,QAAQ;QACR,OAAO;QACP,iBAAiB;QACjB,MAAM;QACN,KAAK;QACL,qBAAqB;QACrB,eAAe;KAChB;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAoCgB;SAC1B;QACD;YACE,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCA2CqB;SAC/B;QACD;YACE,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAwCW;SACrB;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAkCY;SACtB;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;+BAyBgB;SAC1B;KACF;IACD,YAAY,EAAE,8DAA8D;IAC5E,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE;QACL,sCAAsC;QACtC,6CAA6C;QAC7C,+CAA+C;QAC/C,qCAAqC;QACrC,0CAA0C;KAC3C;IACD,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,iBAAiB;CAC7B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SkillDefinition } from './types';
2
+ export declare const greenCodeSkill: SkillDefinition;
3
+ //# sourceMappingURL=32-green-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"32-green-code.d.ts","sourceRoot":"","sources":["../../src/skills/32-green-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,cAAc,EAAE,eAqV5B,CAAC"}
@@ -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,3 @@
1
+ import type { SkillDefinition } from './types';
2
+ export declare const serviceCatalogSkill: SkillDefinition;
3
+ //# sourceMappingURL=33-service-catalog.d.ts.map
@@ -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"}