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.
Files changed (66) hide show
  1. package/dist/cli/index.js +1019 -1
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/mcp/server.d.ts.map +1 -1
  4. package/dist/mcp/server.js +206 -1
  5. package/dist/mcp/server.js.map +1 -1
  6. package/dist/skills/27-tech-debt.d.ts +3 -0
  7. package/dist/skills/27-tech-debt.d.ts.map +1 -0
  8. package/dist/skills/27-tech-debt.js +149 -0
  9. package/dist/skills/27-tech-debt.js.map +1 -0
  10. package/dist/skills/28-api-mock.d.ts +3 -0
  11. package/dist/skills/28-api-mock.d.ts.map +1 -0
  12. package/dist/skills/28-api-mock.js +272 -0
  13. package/dist/skills/28-api-mock.js.map +1 -0
  14. package/dist/skills/29-data-migration.d.ts +3 -0
  15. package/dist/skills/29-data-migration.d.ts.map +1 -0
  16. package/dist/skills/29-data-migration.js +331 -0
  17. package/dist/skills/29-data-migration.js.map +1 -0
  18. package/dist/skills/30-llm-feature.d.ts +3 -0
  19. package/dist/skills/30-llm-feature.d.ts.map +1 -0
  20. package/dist/skills/30-llm-feature.js +328 -0
  21. package/dist/skills/30-llm-feature.js.map +1 -0
  22. package/dist/skills/31-threat-model.d.ts +3 -0
  23. package/dist/skills/31-threat-model.d.ts.map +1 -0
  24. package/dist/skills/31-threat-model.js +240 -0
  25. package/dist/skills/31-threat-model.js.map +1 -0
  26. package/dist/skills/32-green-code.d.ts +3 -0
  27. package/dist/skills/32-green-code.d.ts.map +1 -0
  28. package/dist/skills/32-green-code.js +346 -0
  29. package/dist/skills/32-green-code.js.map +1 -0
  30. package/dist/skills/33-service-catalog.d.ts +3 -0
  31. package/dist/skills/33-service-catalog.d.ts.map +1 -0
  32. package/dist/skills/33-service-catalog.js +334 -0
  33. package/dist/skills/33-service-catalog.js.map +1 -0
  34. package/dist/skills/34-mobile-review.d.ts +3 -0
  35. package/dist/skills/34-mobile-review.d.ts.map +1 -0
  36. package/dist/skills/34-mobile-review.js +390 -0
  37. package/dist/skills/34-mobile-review.js.map +1 -0
  38. package/dist/skills/35-data-pipeline.d.ts +3 -0
  39. package/dist/skills/35-data-pipeline.d.ts.map +1 -0
  40. package/dist/skills/35-data-pipeline.js +392 -0
  41. package/dist/skills/35-data-pipeline.js.map +1 -0
  42. package/dist/skills/36-ml-experiment.d.ts +3 -0
  43. package/dist/skills/36-ml-experiment.d.ts.map +1 -0
  44. package/dist/skills/36-ml-experiment.js +415 -0
  45. package/dist/skills/36-ml-experiment.js.map +1 -0
  46. package/dist/skills/index.d.ts +10 -0
  47. package/dist/skills/index.d.ts.map +1 -1
  48. package/dist/skills/index.js +41 -1
  49. package/dist/skills/index.js.map +1 -1
  50. package/dist/skills/pipeline.d.ts.map +1 -1
  51. package/dist/skills/pipeline.js +35 -0
  52. package/dist/skills/pipeline.js.map +1 -1
  53. package/dist/skills/skills.test.js +3 -3
  54. package/dist/skills/skills.test.js.map +1 -1
  55. package/package.json +1 -1
  56. package/rules/claude-code/CLAUDE.md +2963 -3
  57. package/rules/cline/.clinerules +2805 -2
  58. package/rules/codebuddy/CODEBUDDY.md +2913 -2
  59. package/rules/continue/.continuerules +2805 -2
  60. package/rules/copilot/copilot-instructions.md +2883 -2
  61. package/rules/cursor/.cursorrules +2952 -2
  62. package/rules/cursor/smart-flow.mdc +2952 -2
  63. package/rules/jetbrains/smart-flow.md +2883 -2
  64. package/rules/lingma/smart-flow.md +2904 -3
  65. package/rules/windsurf/.windsurf/rules/smart-flow.md +2884 -3
  66. package/rules/zed/smart-flow.rules +2794 -1
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.llmFeatureSkill = void 0;
4
+ exports.llmFeatureSkill = {
5
+ id: 'llm-feature',
6
+ name: 'LLM 功能设计助手',
7
+ nameEn: 'llm_feature',
8
+ order: 30,
9
+ description: '设计 RAG/Agent/生成类 LLM 功能,输出 Prompt 模板、评估框架与降级方案',
10
+ descriptionEn: 'Design RAG/Agent/generation LLM features with prompt templates, evaluation framework and fallback strategies',
11
+ detailDescription: `将 LLM 集成到产品中远不止调用 API——需要精心的架构设计、Prompt 工程和评估体系。
12
+ 本 Skill 覆盖 LLM 功能设计全链路:从场景分类(RAG/Agent/生成/分类/提取)到 RAG 架构选型、
13
+ Prompt 工程规范,再到自动化评估框架和降级安全策略,
14
+ 让 AI 功能既好用又可靠,避免幻觉、成本失控和不当内容。`,
15
+ triggers: [
16
+ 'llm feature',
17
+ 'ai feature',
18
+ 'rag',
19
+ 'llm 功能',
20
+ 'ai 功能设计',
21
+ 'prompt design',
22
+ '大模型功能',
23
+ 'agent 设计',
24
+ '@ethan llm-feature',
25
+ '/llm-feature',
26
+ ],
27
+ steps: [
28
+ {
29
+ title: '1. LLM 功能定位与场景分类',
30
+ content: `明确 LLM 功能的类型和边界,选择合适的架构模式:
31
+
32
+ **五大 LLM 场景类型**
33
+
34
+ | 场景 | 描述 | 典型案例 | 推荐架构 |
35
+ |------|------|---------|---------|
36
+ | **RAG(检索增强生成)** | 基于私有知识库回答 | 内部文档问答、客服 | 向量检索 + LLM |
37
+ | **Agent(自主决策)** | 多步骤工具调用 | 代码 Agent、任务自动化 | LLM + Function Calling |
38
+ | **生成** | 创作/摘要/翻译 | 文案生成、会议纪要 | 直接调用 + 结构化输出 |
39
+ | **分类** | 意图/情感/标签 | 工单分类、评论分析 | Fine-tune 或 Few-shot |
40
+ | **提取** | 信息抽取/NER | 合同关键信息、表单填充 | Structured Output + JSON Schema |
41
+
42
+ **功能定位问卷**
43
+ \`\`\`
44
+ 1. 用户问题的答案在哪里?
45
+ - 模型已知知识 → 直接生成
46
+ - 私有文档/数据库 → RAG 架构
47
+ - 需要实时操作 → Agent 架构
48
+
49
+ 2. 需要多步推理吗?
50
+ - 是 → Agent(工具调用链)
51
+ - 否 → 单次 Prompt
52
+
53
+ 3. 输出格式是否严格?
54
+ - 是 → JSON Mode / Structured Output
55
+ - 否 → 自然语言生成
56
+
57
+ 4. 延迟要求?
58
+ - < 500ms → 小模型 + 缓存
59
+ - < 3s → 标准调用
60
+ - 可接受流式 → 流式输出
61
+ \`\`\`
62
+
63
+ **输出**:LLM 功能定位文档(场景类型 + 架构选型建议)`,
64
+ },
65
+ {
66
+ title: '2. RAG 架构设计',
67
+ content: `为知识库问答类功能设计高质量 RAG 架构:
68
+
69
+ **RAG 核心组件**
70
+ \`\`\`
71
+ 文档摄入管道:
72
+ Raw Docs → Chunking → Embedding → Vector Store
73
+
74
+ Metadata 过滤层(时间/来源/权限)
75
+
76
+ 查询管道:
77
+ User Query → Query 改写/扩展 → 向量检索 → Rerank → LLM 生成
78
+ \`\`\`
79
+
80
+ **Chunking 策略选型**
81
+ \`\`\`typescript
82
+ // 固定大小(适合均匀文本)
83
+ const CHUNK_SIZE = 512; // tokens
84
+ const CHUNK_OVERLAP = 50; // 上下文保留
85
+
86
+ // 语义分块(适合结构化文档,推荐)
87
+ // 按段落/标题边界切分
88
+ function semanticChunk(text: string): string[] {
89
+ return text.split(/\n#{1,3}\s/); // Markdown 标题分块
90
+ }
91
+
92
+ // 递归分块(LangChain RecursiveCharacterTextSplitter)
93
+ // 优先按段落 → 句子 → 词语拆分
94
+ \`\`\`
95
+
96
+ **向量库选型矩阵**
97
+ | 方案 | 适用规模 | 托管 | 特性 |
98
+ |------|---------|------|------|
99
+ | **Pinecone** | 100万+ | 云托管 | 生产级,自动扩容 |
100
+ | **Weaviate** | 中大型 | 自托管/云 | 混合搜索,GraphQL |
101
+ | **Chroma** | 开发/小型 | 本地 | 零配置,适合 PoC |
102
+ | **pgvector** | 中型 | PostgreSQL | 复用现有 DB |
103
+
104
+ **Rerank 优化**
105
+ \`\`\`typescript
106
+ // 两阶段检索:向量粗召回 → 精排重排序
107
+ const candidates = await vectorStore.search(query, { topK: 20 });
108
+ const reranked = await rerankModel.rank(query, candidates, { topN: 5 });
109
+ // 推荐:Cohere Rerank / BGE-Reranker
110
+ \`\`\`
111
+
112
+ **输出**:RAG 架构图 + Chunking 策略 + 向量库选型建议`,
113
+ },
114
+ {
115
+ title: '3. Prompt 工程规范',
116
+ content: `制定高质量 Prompt 的设计规范:
117
+
118
+ **System Prompt 黄金结构**
119
+ \`\`\`
120
+ [角色定义] 你是 {产品名} 的 {角色},专注于 {领域}。
121
+ [能力边界] 你可以 {能力列表}。你不能/不应该 {限制列表}。
122
+ [输出格式] 请按照以下格式回复:{格式规范}
123
+ [行为准则] {特定规则,如:始终用中文回复/引用来源}
124
+ \`\`\`
125
+
126
+ **System Prompt 模板**
127
+ \`\`\`typescript
128
+ const SYSTEM_PROMPT = \`
129
+ 你是 Acme Corp 的智能客服助手,专注于解答产品使用和技术支持问题。
130
+
131
+ ## 能力
132
+ - 查询订单状态、退换货政策、产品规格
133
+ - 引导用户完成常见操作流程
134
+ - 基于知识库提供准确答案
135
+
136
+ ## 限制
137
+ - 不讨论竞争对手产品
138
+ - 不提供具体价格承诺(引导至销售团队)
139
+ - 不确定时明确说明,不猜测
140
+
141
+ ## 输出规范
142
+ - 语言:与用户保持一致(中/英文)
143
+ - 长度:简洁清晰,避免超过 200 字
144
+ - 引用:若基于文档回答,在末尾标注 [来源:{文档名}]
145
+ \`.trim();
146
+ \`\`\`
147
+
148
+ **Few-shot 示例设计**
149
+ \`\`\`typescript
150
+ const FEW_SHOT_EXAMPLES = [
151
+ {
152
+ role: 'user',
153
+ content: '我的订单 #12345 什么时候发货?'
154
+ },
155
+ {
156
+ role: 'assistant',
157
+ content: '您好!根据订单信息,#12345 已于昨天完成备货,预计今日发出,3-5个工作日送达。[来源:订单管理文档]'
158
+ }
159
+ ];
160
+ \`\`\`
161
+
162
+ **关键参数建议**
163
+ \`\`\`typescript
164
+ // 不同场景的推荐参数
165
+ const PARAMS = {
166
+ factual_qa: { temperature: 0.1, max_tokens: 500 }, // 事实问答,低随机性
167
+ creative: { temperature: 0.8, max_tokens: 2000 }, // 创意生成
168
+ classification:{ temperature: 0, max_tokens: 50 }, // 分类,确定性输出
169
+ code_gen: { temperature: 0.2, max_tokens: 4000 }, // 代码生成
170
+ };
171
+ \`\`\`
172
+
173
+ **Token 预算管理**
174
+ \`\`\`
175
+ System Prompt: ~500 tokens (固定)
176
+ RAG Context: ~2000 tokens (动态,按相关度截断)
177
+ Conversation: ~1000 tokens (保留最近 N 轮)
178
+ User Query: ~200 tokens (预留)
179
+ Output: ~1000 tokens (max_tokens 控制)
180
+ 总计: ~4700 tokens < 8K context window
181
+ \`\`\`
182
+
183
+ **输出**:System Prompt 模板 + Few-shot 示例 + 参数配置建议`,
184
+ },
185
+ {
186
+ title: '4. LLM 评估方案',
187
+ content: `建立自动化 + 人工评估体系,持续监控 LLM 功能质量:
188
+
189
+ **三层评估框架**
190
+
191
+ **① 自动化 Evals(CI/CD 集成)**
192
+ \`\`\`typescript
193
+ // 评估维度
194
+ interface EvalResult {
195
+ accuracy: number; // 答案正确率(对比 Golden Set)
196
+ faithfulness: number; // 回答与上下文一致性(RAG 专用)
197
+ relevance: number; // 答案与问题相关度
198
+ latency_p95: number; // P95 响应时间(ms)
199
+ cost_per_query: number; // 平均 token 成本($)
200
+ }
201
+
202
+ // 自动评估示例(LLM-as-Judge)
203
+ async function evalWithLLM(question: string, answer: string, context: string) {
204
+ const judgePrompt = \`
205
+ 问题:\${question}
206
+ 检索上下文:\${context}
207
+ 模型回答:\${answer}
208
+
209
+ 请评估回答的准确性(0-1)和忠实度(0-1),返回 JSON:
210
+ {"accuracy": 0.x, "faithfulness": 0.x, "reason": "..."}
211
+ \`;
212
+ return await llm.json(judgePrompt);
213
+ }
214
+ \`\`\`
215
+
216
+ **② Golden Set 维护**
217
+ \`\`\`json
218
+ // evals/golden-set.json
219
+ [
220
+ {
221
+ "id": "Q001",
222
+ "question": "退货政策是什么?",
223
+ "expected_keywords": ["30天", "unopened", "退款"],
224
+ "expected_source": "return-policy.md",
225
+ "difficulty": "easy"
226
+ }
227
+ ]
228
+ \`\`\`
229
+
230
+ **③ 人工评分(A/B 测试)**
231
+ \`\`\`
232
+ 评分维度(1-5分):
233
+ - Helpful(有帮助): 回答解决了用户问题
234
+ - Accurate(准确): 信息与事实一致
235
+ - Safe(安全): 无有害/不当内容
236
+ - Concise(简洁): 无冗余信息
237
+ \`\`\`
238
+
239
+ **评估指标基准**
240
+ | 指标 | 可接受 | 良好 | 优秀 |
241
+ |------|--------|------|------|
242
+ | 准确率 | > 70% | > 85% | > 95% |
243
+ | 忠实度 | > 75% | > 90% | > 97% |
244
+ | P95 延迟 | < 5s | < 3s | < 1.5s |
245
+ | 幻觉率 | < 15% | < 5% | < 2% |
246
+
247
+ **输出**:评估脚本 + Golden Set 模板 + A/B 测试方案`,
248
+ },
249
+ {
250
+ title: '5. 降级与安全策略',
251
+ content: `为 LLM 功能设计完善的降级和安全机制:
252
+
253
+ **五大风险与对策**
254
+
255
+ **① 幻觉控制**
256
+ \`\`\`typescript
257
+ // RAG 置信度检查:若无相关文档,拒绝回答
258
+ const MIN_SIMILARITY = 0.75;
259
+ const docs = await vectorStore.search(query, { topK: 3 });
260
+ if (docs[0].score < MIN_SIMILARITY) {
261
+ return { answer: '抱歉,我没有找到相关信息,请联系人工客服。', sources: [] };
262
+ }
263
+ \`\`\`
264
+
265
+ **② Fallback 降级链**
266
+ \`\`\`typescript
267
+ async function robustLLMCall(prompt: string) {
268
+ try {
269
+ // 主模型(高质量)
270
+ return await gpt4o.complete(prompt, { timeout: 5000 });
271
+ } catch (primaryError) {
272
+ try {
273
+ // 降级到备用模型(更快更便宜)
274
+ return await gpt4oMini.complete(prompt, { timeout: 3000 });
275
+ } catch (fallbackError) {
276
+ // 最终降级:静态规则/人工兜底
277
+ return { answer: FALLBACK_MESSAGES[detectIntent(prompt)], fallback: true };
278
+ }
279
+ }
280
+ }
281
+ \`\`\`
282
+
283
+ **③ 内容过滤**
284
+ \`\`\`typescript
285
+ // 输入/输出双向过滤
286
+ const BLOCKED_PATTERNS = [/如何.*伤害/, /制作.*武器/];
287
+ function isSafe(text: string): boolean {
288
+ return !BLOCKED_PATTERNS.some(p => p.test(text));
289
+ }
290
+ // 推荐:使用 OpenAI Moderation API / Azure Content Safety
291
+ \`\`\`
292
+
293
+ **④ 成本限制**
294
+ \`\`\`typescript
295
+ // 每用户每日 Token 限额
296
+ const DAILY_TOKEN_LIMIT = 50000;
297
+ // 请求频率限制
298
+ const RATE_LIMIT = { requests: 10, window: '1m' };
299
+ // 输出截断
300
+ const MAX_OUTPUT_TOKENS = 1000;
301
+ \`\`\`
302
+
303
+ **⑤ 可观测性**
304
+ \`\`\`typescript
305
+ // 每次 LLM 调用必须记录
306
+ logger.info('llm_call', {
307
+ model, prompt_tokens, completion_tokens, latency_ms,
308
+ user_id, session_id, feature_flag,
309
+ is_fallback, safety_triggered,
310
+ });
311
+ \`\`\`
312
+
313
+ **输出**:降级策略代码模板 + 内容安全配置 + 成本控制方案 + 可观测性埋点`,
314
+ },
315
+ ],
316
+ outputFormat: 'LLM 功能定位文档 + RAG 架构图 + System Prompt 模板 + 评估框架(Golden Set + 自动 Evals)+ 降级与安全策略代码',
317
+ examples: [],
318
+ notes: [
319
+ '先从小模型(GPT-4o mini/Claude Haiku)开始验证,确认方案可行再升级到大模型降低成本',
320
+ 'RAG 的质量 80% 取决于 Chunking 策略和 Embedding 质量,而非 LLM 本身',
321
+ 'Golden Set 至少需要 100 条覆盖核心场景的问答对,建立前先做 10 条快速验证',
322
+ '幻觉是 RAG 的最大风险,必须设置相似度阈值,宁可说"不知道"也不要胡编',
323
+ '生产环境必须监控 Token 消耗和每次调用成本,防止费用失控',
324
+ ],
325
+ category: '需求侧',
326
+ nextSkill: 'system-design',
327
+ };
328
+ //# sourceMappingURL=30-llm-feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"30-llm-feature.js","sourceRoot":"","sources":["../../src/skills/30-llm-feature.ts"],"names":[],"mappings":";;;AAEa,QAAA,eAAe,GAAoB;IAC9C,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,gDAAgD;IAC7D,aAAa,EAAE,8GAA8G;IAC7H,iBAAiB,EAAE;;;8BAGS;IAC5B,QAAQ,EAAE;QACR,aAAa;QACb,YAAY;QACZ,KAAK;QACL,QAAQ;QACR,SAAS;QACT,eAAe;QACf,OAAO;QACP,UAAU;QACV,oBAAoB;QACpB,cAAc;KACf;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,kBAAkB;YACzB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAiCkB;SAC5B;QACD;YACE,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCA6CwB;SAClC;QACD;YACE,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAmEgC;SAC1C;QACD;YACE,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCA4DwB;SAClC;QACD;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA8D4B;SACtC;KACF;IACD,YAAY,EAAE,kFAAkF;IAChG,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE;QACL,uDAAuD;QACvD,qDAAqD;QACrD,gDAAgD;QAChD,uCAAuC;QACvC,iCAAiC;KAClC;IACD,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,eAAe;CAC3B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SkillDefinition } from './types';
2
+ export declare const threatModelSkill: SkillDefinition;
3
+ //# sourceMappingURL=31-threat-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"31-threat-model.d.ts","sourceRoot":"","sources":["../../src/skills/31-threat-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,gBAAgB,EAAE,eA2O9B,CAAC"}
@@ -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"}