ethan-skill 1.0.0 → 1.1.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 (136) hide show
  1. package/dist/cli/config.d.ts +26 -0
  2. package/dist/cli/config.d.ts.map +1 -0
  3. package/dist/cli/config.js +74 -0
  4. package/dist/cli/config.js.map +1 -0
  5. package/dist/cli/index.d.ts +1 -1
  6. package/dist/cli/index.js +363 -62
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/cli/update-check.d.ts +11 -0
  9. package/dist/cli/update-check.d.ts.map +1 -0
  10. package/dist/cli/update-check.js +128 -0
  11. package/dist/cli/update-check.js.map +1 -0
  12. package/dist/context/detector.d.ts +25 -0
  13. package/dist/context/detector.d.ts.map +1 -0
  14. package/dist/context/detector.js +230 -0
  15. package/dist/context/detector.js.map +1 -0
  16. package/dist/ethan-skill-1.0.0.vsix +0 -0
  17. package/dist/ethan-skill-1.1.0.vsix +0 -0
  18. package/dist/loader/custom-skill-loader.d.ts +15 -0
  19. package/dist/loader/custom-skill-loader.d.ts.map +1 -0
  20. package/dist/loader/custom-skill-loader.js +158 -0
  21. package/dist/loader/custom-skill-loader.js.map +1 -0
  22. package/dist/server/dashboard.d.ts +2 -0
  23. package/dist/server/dashboard.d.ts.map +1 -0
  24. package/dist/server/dashboard.js +272 -0
  25. package/dist/server/dashboard.js.map +1 -0
  26. package/dist/skills/01-requirement.d.ts.map +1 -1
  27. package/dist/skills/01-requirement.js +4 -0
  28. package/dist/skills/01-requirement.js.map +1 -1
  29. package/dist/skills/02-task-breakdown.d.ts.map +1 -1
  30. package/dist/skills/02-task-breakdown.js +4 -0
  31. package/dist/skills/02-task-breakdown.js.map +1 -1
  32. package/dist/skills/03-design.d.ts.map +1 -1
  33. package/dist/skills/03-design.js +4 -0
  34. package/dist/skills/03-design.js.map +1 -1
  35. package/dist/skills/04-implementation.d.ts.map +1 -1
  36. package/dist/skills/04-implementation.js +4 -0
  37. package/dist/skills/04-implementation.js.map +1 -1
  38. package/dist/skills/05-progress-tracking.d.ts.map +1 -1
  39. package/dist/skills/05-progress-tracking.js +4 -0
  40. package/dist/skills/05-progress-tracking.js.map +1 -1
  41. package/dist/skills/06-task-report.d.ts.map +1 -1
  42. package/dist/skills/06-task-report.js +4 -0
  43. package/dist/skills/06-task-report.js.map +1 -1
  44. package/dist/skills/07-weekly-report.d.ts.map +1 -1
  45. package/dist/skills/07-weekly-report.js +3 -0
  46. package/dist/skills/07-weekly-report.js.map +1 -1
  47. package/dist/skills/08-code-review.d.ts.map +1 -1
  48. package/dist/skills/08-code-review.js +2 -0
  49. package/dist/skills/08-code-review.js.map +1 -1
  50. package/dist/skills/09-debug.d.ts.map +1 -1
  51. package/dist/skills/09-debug.js +3 -0
  52. package/dist/skills/09-debug.js.map +1 -1
  53. package/dist/skills/10-tech-research.d.ts.map +1 -1
  54. package/dist/skills/10-tech-research.js +4 -0
  55. package/dist/skills/10-tech-research.js.map +1 -1
  56. package/dist/skills/types.d.ts +4 -0
  57. package/dist/skills/types.d.ts.map +1 -1
  58. package/dist/templates/copilot-md.template.d.ts.map +1 -1
  59. package/dist/templates/copilot-md.template.js +107 -26
  60. package/dist/templates/copilot-md.template.js.map +1 -1
  61. package/dist/vscode/router/trigger-router.d.ts +16 -0
  62. package/dist/vscode/router/trigger-router.d.ts.map +1 -0
  63. package/dist/vscode/router/trigger-router.js +45 -0
  64. package/dist/vscode/router/trigger-router.js.map +1 -0
  65. package/dist/vscode/skills/01-requirement.d.ts +3 -0
  66. package/dist/vscode/skills/01-requirement.d.ts.map +1 -0
  67. package/dist/vscode/skills/01-requirement.js +104 -0
  68. package/dist/vscode/skills/01-requirement.js.map +1 -0
  69. package/dist/vscode/skills/02-task-breakdown.d.ts +3 -0
  70. package/dist/vscode/skills/02-task-breakdown.d.ts.map +1 -0
  71. package/dist/vscode/skills/02-task-breakdown.js +86 -0
  72. package/dist/vscode/skills/02-task-breakdown.js.map +1 -0
  73. package/dist/vscode/skills/03-design.d.ts +3 -0
  74. package/dist/vscode/skills/03-design.d.ts.map +1 -0
  75. package/dist/vscode/skills/03-design.js +84 -0
  76. package/dist/vscode/skills/03-design.js.map +1 -0
  77. package/dist/vscode/skills/04-implementation.d.ts +3 -0
  78. package/dist/vscode/skills/04-implementation.d.ts.map +1 -0
  79. package/dist/vscode/skills/04-implementation.js +81 -0
  80. package/dist/vscode/skills/04-implementation.js.map +1 -0
  81. package/dist/vscode/skills/05-progress-tracking.d.ts +3 -0
  82. package/dist/vscode/skills/05-progress-tracking.d.ts.map +1 -0
  83. package/dist/vscode/skills/05-progress-tracking.js +82 -0
  84. package/dist/vscode/skills/05-progress-tracking.js.map +1 -0
  85. package/dist/vscode/skills/06-task-report.d.ts +3 -0
  86. package/dist/vscode/skills/06-task-report.d.ts.map +1 -0
  87. package/dist/vscode/skills/06-task-report.js +79 -0
  88. package/dist/vscode/skills/06-task-report.js.map +1 -0
  89. package/dist/vscode/skills/07-weekly-report.d.ts +3 -0
  90. package/dist/vscode/skills/07-weekly-report.d.ts.map +1 -0
  91. package/dist/vscode/skills/07-weekly-report.js +104 -0
  92. package/dist/vscode/skills/07-weekly-report.js.map +1 -0
  93. package/dist/vscode/skills/08-code-review.d.ts +3 -0
  94. package/dist/vscode/skills/08-code-review.d.ts.map +1 -0
  95. package/dist/vscode/skills/08-code-review.js +138 -0
  96. package/dist/vscode/skills/08-code-review.js.map +1 -0
  97. package/dist/vscode/skills/09-debug.d.ts +3 -0
  98. package/dist/vscode/skills/09-debug.d.ts.map +1 -0
  99. package/dist/vscode/skills/09-debug.js +154 -0
  100. package/dist/vscode/skills/09-debug.js.map +1 -0
  101. package/dist/vscode/skills/10-tech-research.d.ts +3 -0
  102. package/dist/vscode/skills/10-tech-research.d.ts.map +1 -0
  103. package/dist/vscode/skills/10-tech-research.js +145 -0
  104. package/dist/vscode/skills/10-tech-research.js.map +1 -0
  105. package/dist/vscode/skills/index.d.ts +18 -0
  106. package/dist/vscode/skills/index.d.ts.map +1 -0
  107. package/dist/vscode/skills/index.js +51 -0
  108. package/dist/vscode/skills/index.js.map +1 -0
  109. package/dist/vscode/skills/pipeline.d.ts +15 -0
  110. package/dist/vscode/skills/pipeline.d.ts.map +1 -0
  111. package/dist/vscode/skills/pipeline.js +55 -0
  112. package/dist/vscode/skills/pipeline.js.map +1 -0
  113. package/dist/vscode/skills/types.d.ts +64 -0
  114. package/dist/vscode/skills/types.d.ts.map +1 -0
  115. package/dist/vscode/skills/types.js +7 -0
  116. package/dist/vscode/skills/types.js.map +1 -0
  117. package/dist/vscode/vscode/commands.d.ts +63 -0
  118. package/dist/vscode/vscode/commands.d.ts.map +1 -0
  119. package/dist/vscode/vscode/commands.js +428 -0
  120. package/dist/vscode/vscode/commands.js.map +1 -0
  121. package/dist/vscode/vscode/extension.d.ts +4 -0
  122. package/dist/vscode/vscode/extension.d.ts.map +1 -0
  123. package/dist/vscode/vscode/extension.js +103 -0
  124. package/dist/vscode/vscode/extension.js.map +1 -0
  125. package/package.json +7 -3
  126. package/rules/claude-code/CLAUDE.md +12 -12
  127. package/rules/cline/.clinerules +3 -3
  128. package/rules/codebuddy/CODEBUDDY.md +12 -12
  129. package/rules/continue/.continuerules +3 -3
  130. package/rules/copilot/copilot-instructions.md +12 -12
  131. package/rules/cursor/.cursorrules +12 -12
  132. package/rules/cursor/smart-flow.mdc +12 -12
  133. package/rules/jetbrains/smart-flow.md +12 -12
  134. package/rules/lingma/smart-flow.md +2 -2
  135. package/rules/windsurf/.windsurf/rules/smart-flow.md +12 -12
  136. package/rules/zed/smart-flow.rules +1 -1
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.codeReviewSkill = void 0;
4
+ exports.codeReviewSkill = {
5
+ id: 'code-review',
6
+ name: '代码审查',
7
+ nameEn: 'code_review',
8
+ order: 8,
9
+ description: '系统性审查代码变更,分级输出 Blocker/Major/Minor 问题,提升代码质量',
10
+ descriptionEn: 'Systematic code review with Blocker/Major/Minor classification',
11
+ detailDescription: `对代码变更进行系统性审查,覆盖正确性、安全性、性能、可维护性和规范性五个维度,
12
+ 按 Blocker/Major/Minor 三级分类输出问题,并给出具体改进建议。`,
13
+ triggers: [
14
+ '代码审查',
15
+ 'code review',
16
+ 'CR',
17
+ '帮我 review',
18
+ '帮我看看代码',
19
+ '审查代码',
20
+ 'review 一下',
21
+ '代码 review',
22
+ '/代码审查',
23
+ '@ethan review',
24
+ '@ethan code-review',
25
+ ],
26
+ steps: [
27
+ {
28
+ title: '1. 理解变更意图',
29
+ content: `- 阅读 PR 描述或变更说明,明确本次改动的**业务目标**
30
+ - 识别变更范围:新功能 / Bug 修复 / 重构 / 性能优化 / 配置调整
31
+ - 确认是否有对应的需求文档、设计文档或 Issue
32
+ - 了解测试覆盖情况(单测/集成测试)`,
33
+ },
34
+ {
35
+ title: '2. 逐层审查',
36
+ content: `按以下五个维度逐一检查:
37
+
38
+ **✅ 正确性**
39
+ - 逻辑是否正确,边界条件是否处理(null/undefined/空数组/越界)
40
+ - 并发/异步场景是否有竞态条件
41
+ - 错误处理是否完备
42
+
43
+ **🔒 安全性**
44
+ - 是否存在 SQL 注入、XSS、CSRF 等 OWASP Top 10 风险
45
+ - 敏感信息(密钥、密码)是否硬编码
46
+ - 权限校验是否完整
47
+
48
+ **⚡ 性能**
49
+ - 是否有 N+1 查询、不必要的全量加载
50
+ - 循环内是否有重复计算或 DOM 操作
51
+ - 是否缺少必要的缓存或索引
52
+
53
+ **🔧 可维护性**
54
+ - 函数/类职责是否单一
55
+ - 命名是否清晰表达意图
56
+ - 是否有重复代码(DRY 原则)
57
+ - 复杂逻辑是否有注释说明
58
+
59
+ **📏 规范性**
60
+ - 是否符合项目代码风格(命名、格式、文件结构)
61
+ - 是否有缺失的测试用例
62
+ - API 变更是否更新了文档`,
63
+ },
64
+ {
65
+ title: '3. 按级别分类问题',
66
+ content: `将发现的问题按以下三级分类:
67
+
68
+ - 🚫 **Blocker**:必须修复才能合并(功能错误、安全漏洞、数据丢失风险)
69
+ - ⚠️ **Major**:强烈建议修复(性能问题、可维护性严重不足、测试缺失)
70
+ - 💡 **Minor**:建议改进(代码风格、命名优化、注释补充)
71
+
72
+ 每个问题标注:文件名 + 行号 + 问题描述 + 改进建议`,
73
+ },
74
+ {
75
+ title: '4. 输出审查报告',
76
+ content: `按以下格式输出:
77
+
78
+ \`\`\`markdown
79
+ ## Code Review 报告
80
+
81
+ ### 总体评价
82
+ [1-3 句话概述代码质量和主要问题]
83
+
84
+ ### 🚫 Blocker(必须修复)
85
+ - [ ] \`file.ts:42\` 未校验用户输入直接拼接 SQL,存在注入风险
86
+ 建议:使用参数化查询
87
+
88
+ ### ⚠️ Major(建议修复)
89
+ - [ ] \`service.ts:88\` N+1 查询:循环内调用数据库
90
+ 建议:改用批量查询 + Map 映射
91
+
92
+ ### 💡 Minor(可选优化)
93
+ - [ ] \`utils.ts:15\` 变量名 \`d\` 含义不清晰
94
+ 建议:改为 \`duration\`
95
+
96
+ ### ✅ 做得好的地方
97
+ - [值得肯定的设计或实现]
98
+
99
+ ### 总结
100
+ Blocker: X 个 | Major: Y 个 | Minor: Z 个
101
+ \`\`\``,
102
+ },
103
+ {
104
+ title: '5. 跟进确认',
105
+ content: `- 如果有 Blocker,明确告知不应合并,等修复后重新 Review
106
+ - 如果只有 Minor,可以 Approve 并备注"建议改进但不阻塞"
107
+ - 对于设计层面的分歧,建议另开会议讨论,不在 PR 中反复拉锯`,
108
+ },
109
+ ],
110
+ outputFormat: 'Markdown 审查报告,含总体评价、分级问题列表(Blocker/Major/Minor)、亮点肯定和合并建议',
111
+ examples: [
112
+ {
113
+ input: '帮我 review 这个登录接口的实现',
114
+ output: `## Code Review 报告
115
+
116
+ ### 总体评价
117
+ 逻辑基本正确,但存在一个安全 Blocker(明文存储密码)和两个 Major 问题。
118
+
119
+ ### 🚫 Blocker(必须修复)
120
+ - [ ] \`auth.ts:23\` 密码未加密直接存储数据库
121
+ 建议:使用 bcrypt 或 argon2 做哈希处理
122
+
123
+ ### ⚠️ Major(建议修复)
124
+ - [ ] \`auth.ts:45\` 登录失败未做次数限制,易受暴力破解
125
+ 建议:引入 rate limiting 或账号锁定机制
126
+
127
+ ### 总结
128
+ Blocker: 1 个 | Major: 1 个 | Minor: 0 个`,
129
+ },
130
+ ],
131
+ notes: [
132
+ 'Review 的目的是提升代码质量,不是否定作者,保持建设性语气',
133
+ 'Blocker 必须明确标注,避免重要问题被忽视',
134
+ '超过 400 行的 PR 建议拆分后分批 Review',
135
+ ],
136
+ category: '质量侧',
137
+ };
138
+ //# sourceMappingURL=08-code-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"08-code-review.js","sourceRoot":"","sources":["../../../src/skills/08-code-review.ts"],"names":[],"mappings":";;;AAEa,QAAA,eAAe,GAAoB;IAC9C,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,8CAA8C;IAC3D,aAAa,EAAE,gEAAgE;IAC/E,iBAAiB,EAAE;0CACqB;IACxC,QAAQ,EAAE;QACR,MAAM;QACN,aAAa;QACb,IAAI;QACJ,WAAW;QACX,QAAQ;QACR,MAAM;QACN,WAAW;QACX,WAAW;QACX,OAAO;QACP,eAAe;QACf,oBAAoB;KACrB;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;oBAGK;SACf;QACD;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;gBA0BC;SACX;QACD;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;;;8BAMe;SACzB;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;OAyBR;SACF;QACD;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;;iCAEkB;SAC5B;KACF;IACD,YAAY,EACV,2DAA2D;IAC7D,QAAQ,EAAE;QACR;YACE,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE;;;;;;;;;;;;;;uCAcyB;SAClC;KACF;IACD,KAAK,EAAE;QACL,kCAAkC;QAClC,0BAA0B;QAC1B,6BAA6B;KAC9B;IACD,QAAQ,EAAE,KAAK;CAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SkillDefinition } from './types';
2
+ export declare const debugSkill: SkillDefinition;
3
+ //# sourceMappingURL=09-debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"09-debug.d.ts","sourceRoot":"","sources":["../../../src/skills/09-debug.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,UAAU,EAAE,eAsJxB,CAAC"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.debugSkill = void 0;
4
+ exports.debugSkill = {
5
+ id: 'debug',
6
+ name: '故障排查',
7
+ nameEn: 'debug',
8
+ order: 9,
9
+ description: '系统性排查故障,通过假设验证和 5 Why 定位根因,输出临时/永久/预防三层方案',
10
+ descriptionEn: 'Hypothesis-driven debugging with 5-Why root cause analysis',
11
+ detailDescription: `采用结构化方法排查故障:先描述现象建立假设,再逐一验证缩小范围,
12
+ 用 5 Why 挖掘根本原因,最终输出涵盖临时缓解、永久修复和预防措施的完整排查报告。`,
13
+ triggers: [
14
+ '故障排查',
15
+ 'debug',
16
+ '线上故障',
17
+ '报错了',
18
+ '排查问题',
19
+ '定位 bug',
20
+ '为什么报错',
21
+ '程序崩溃',
22
+ '/故障排查',
23
+ '@ethan debug',
24
+ 'troubleshoot',
25
+ '@ethan troubleshoot',
26
+ ],
27
+ steps: [
28
+ {
29
+ title: '1. 现象描述',
30
+ content: `用结构化方式描述故障现象:
31
+
32
+ - **错误信息**:完整的报错信息或日志(不要截断)
33
+ - **影响范围**:哪些用户/请求/功能受影响,影响比例
34
+ - **发生时间**:首次发现时间,是否有规律(特定时间/特定操作触发)
35
+ - **复现步骤**:能否稳定复现?复现率?
36
+ - **环境信息**:生产/测试/本地?最近是否有上线或配置变更?`,
37
+ },
38
+ {
39
+ title: '2. 建立假设',
40
+ content: `根据现象,列出所有可能的原因假设:
41
+
42
+ - 按**可能性**从高到低排序(先排查最常见的)
43
+ - 每个假设标注**验证方式**(查日志/加断点/查数据库/还原操作)
44
+ - 格式:「假设 [X] 导致,验证方式:[Y]」
45
+
46
+ 常见假设方向:
47
+ - 代码逻辑错误(边界条件、空指针、类型错误)
48
+ - 配置/环境问题(环境变量、连接字符串、版本不兼容)
49
+ - 数据问题(脏数据、数据迁移遗漏、外键约束)
50
+ - 依赖服务故障(数据库、缓存、第三方 API 超时)
51
+ - 资源耗尽(内存溢出、连接池耗尽、磁盘满)`,
52
+ },
53
+ {
54
+ title: '3. 逐一验证',
55
+ content: `按假设列表逐一排查:
56
+
57
+ - 每个假设用最小代价验证(优先查日志,再加调试代码)
58
+ - 验证结果:✅ 确认 / ❌ 排除 / ❓ 待进一步确认
59
+ - 找到最可能的原因后,**缩小范围**继续深挖
60
+ - 保留所有验证过程(方便写报告和复盘)
61
+
62
+ 排查工具:
63
+ - 日志分析:关键字检索 + 时间范围过滤
64
+ - 数据库:慢查询日志、EXPLAIN 分析
65
+ - 网络:curl 测试接口、抓包分析
66
+ - 内存/CPU:top、heap dump、火焰图`,
67
+ },
68
+ {
69
+ title: '4. 5 Why 根因分析',
70
+ content: `找到直接原因后,用 5 Why 追溯根本原因:
71
+
72
+ \`\`\`
73
+ 现象:接口超时
74
+ Why 1: 为什么超时?→ 数据库查询慢
75
+ Why 2: 为什么查询慢?→ 缺少索引
76
+ Why 3: 为什么缺索引?→ 上线时未执行迁移脚本
77
+ Why 4: 为什么迁移未执行?→ 发布流程没有自动执行 migration
78
+ Why 5: 为什么没有自动化?→ CI/CD 流程中没有这个步骤
79
+ 根因:CI/CD 缺少数据库迁移步骤
80
+ \`\`\`
81
+
82
+ 连续追问直到找到**可操作的系统性原因**(不是"人的失误")`,
83
+ },
84
+ {
85
+ title: '5. 输出排查报告',
86
+ content: `按以下格式输出完整报告:
87
+
88
+ \`\`\`markdown
89
+ ## 故障排查报告
90
+
91
+ ### 故障概述
92
+ - **影响范围**:[描述]
93
+ - **发生时间**:[时间]
94
+ - **根本原因**:[一句话总结]
95
+
96
+ ### 时间线
97
+ - HH:MM 发现异常
98
+ - HH:MM 开始排查
99
+ - HH:MM 定位原因
100
+ - HH:MM 完成修复
101
+
102
+ ### 根因分析(5 Why)
103
+ [5 Why 链条]
104
+
105
+ ### 解决方案
106
+
107
+ #### 🚑 临时缓解(立即执行)
108
+ - [临时措施,如回滚、降级、重启]
109
+
110
+ #### 🔧 永久修复(计划排期)
111
+ - [根本性解决方案]
112
+
113
+ #### 🛡️ 预防措施(长期改进)
114
+ - [流程/监控/测试改进,防止复发]
115
+
116
+ ### 经验教训
117
+ [本次故障暴露的流程/技术缺陷]
118
+ \`\`\``,
119
+ },
120
+ ],
121
+ outputFormat: 'Markdown 排查报告,含故障概述、时间线、5 Why 根因分析、临时缓解/永久修复/预防措施三层方案和经验教训',
122
+ examples: [
123
+ {
124
+ input: '线上接口 500 报错,日志显示 NullPointerException at UserService:89',
125
+ output: `## 故障排查报告
126
+
127
+ ### 故障概述
128
+ - **影响范围**:所有调用 /api/user/profile 的请求,约 100% 失败率
129
+ - **根本原因**:用户登录态中 userId 为 null 时未做保护,直接传入数据库查询
130
+
131
+ ### 根因分析(5 Why)
132
+ Why 1: NPE 在哪里?→ UserService:89 user.getId() 调用时
133
+ Why 2: 为什么 user 为 null?→ Session 中取出 userId=null 后未校验
134
+ Why 3: 为什么 userId 是 null?→ 昨天的发布修改了 Session key 名称
135
+ 根因:发布时未同步更新 Session 读取代码,且缺少非空校验
136
+
137
+ ### 🚑 临时缓解
138
+ - 回滚昨天的发布版本
139
+
140
+ ### 🔧 永久修复
141
+ - 统一 Session key,添加非空保护逻辑
142
+
143
+ ### 🛡️ 预防措施
144
+ - 发布前添加冒烟测试覆盖登录流程`,
145
+ },
146
+ ],
147
+ notes: [
148
+ '先稳定服务(临时缓解),再追根因,避免长时间故障影响用户',
149
+ '5 Why 要追到系统/流程层面,"人员失误"不是根因',
150
+ '排查过程保留完整记录,方便事后复盘',
151
+ ],
152
+ category: '质量侧',
153
+ };
154
+ //# sourceMappingURL=09-debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"09-debug.js","sourceRoot":"","sources":["../../../src/skills/09-debug.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAoB;IACzC,EAAE,EAAE,OAAO;IACX,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,2CAA2C;IACxD,aAAa,EAAE,4DAA4D;IAC3E,iBAAiB,EAAE;4CACuB;IAC1C,QAAQ,EAAE;QACR,MAAM;QACN,OAAO;QACP,MAAM;QACN,KAAK;QACL,MAAM;QACN,QAAQ;QACR,OAAO;QACP,MAAM;QACN,OAAO;QACP,cAAc;QACd,cAAc;QACd,qBAAqB;KACtB;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;;;;;;kCAMmB;SAC7B;QACD;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;;;;;;;;;;;uBAWQ;SAClB;QACD;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;;;;;;;;;;;2BAWY;SACtB;QACD;YACE,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE;;;;;;;;;;;;gCAYiB;SAC3B;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCR;SACF;KACF;IACD,YAAY,EACV,4DAA4D;IAC9D,QAAQ,EAAE;QACR;YACE,KAAK,EAAE,yDAAyD;YAChE,MAAM,EAAE;;;;;;;;;;;;;;;;;;;kBAmBI;SACb;KACF;IACD,KAAK,EAAE;QACL,8BAA8B;QAC9B,6BAA6B;QAC7B,mBAAmB;KACpB;IACD,QAAQ,EAAE,KAAK;CAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SkillDefinition } from './types';
2
+ export declare const techResearchSkill: SkillDefinition;
3
+ //# sourceMappingURL=10-tech-research.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"10-tech-research.d.ts","sourceRoot":"","sources":["../../../src/skills/10-tech-research.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,iBAAiB,EAAE,eA6I/B,CAAC"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.techResearchSkill = void 0;
4
+ exports.techResearchSkill = {
5
+ id: 'tech-research',
6
+ name: '技术调研',
7
+ nameEn: 'tech_research',
8
+ order: 10,
9
+ description: '结构化技术选型:问题定义→方案收集→加权评分矩阵→POC 验证→明确结论',
10
+ descriptionEn: 'Weighted scoring matrix + POC validation for tech selection',
11
+ detailDescription: `通过标准化流程完成技术调研:先明确问题和评估标准,再收集候选方案,
12
+ 用加权评分矩阵量化对比,必要时进行 POC 验证,最终输出有据可查的选型结论。`,
13
+ triggers: [
14
+ '技术调研',
15
+ '技术选型',
16
+ 'POC',
17
+ '对比方案',
18
+ '选哪个好',
19
+ '方案对比',
20
+ '调研一下',
21
+ '技术评估',
22
+ '/技术调研',
23
+ '@ethan 调研',
24
+ 'tech research',
25
+ 'tech selection',
26
+ '@ethan research',
27
+ ],
28
+ steps: [
29
+ {
30
+ title: '1. 问题定义',
31
+ content: `明确调研的边界和目标:
32
+
33
+ - **核心问题**:用一句话描述要解决什么技术问题
34
+ - **约束条件**:
35
+ - 技术栈约束(语言、框架、云平台)
36
+ - 团队约束(学习曲线、现有技能)
37
+ - 资源约束(成本上限、时间窗口)
38
+ - 合规约束(开源协议、数据合规)
39
+ - **评估维度**:列出 5-8 个评估标准,并为每个标准分配**权重**(权重之和为 100)
40
+ - 常用维度:功能完整性、性能、稳定性/成熟度、社区活跃度、学习成本、运维成本、License`,
41
+ },
42
+ {
43
+ title: '2. 方案收集',
44
+ content: `系统收集候选方案:
45
+
46
+ - 通过文档、GitHub、技术博客、同行推荐收集 **3-5 个**候选方案
47
+ - 每个方案记录:
48
+ - 官网/仓库链接
49
+ - 版本/发布日期
50
+ - Stars/下载量(活跃度指标)
51
+ - 核心特性概述(3-5 条)
52
+ - 已知局限性
53
+ - 去掉明显不满足约束条件的方案,保留 2-4 个进入深度对比`,
54
+ },
55
+ {
56
+ title: '3. 对比矩阵(加权评分)',
57
+ content: `用加权评分矩阵量化对比:
58
+
59
+ - 每个维度打分 1-5(1=很差,5=很好)
60
+ - 加权得分 = Σ(各维度得分 × 权重)
61
+ - 用 Markdown 表格呈现:
62
+
63
+ \`\`\`markdown
64
+ | 评估维度 | 权重 | 方案 A | 方案 B | 方案 C |
65
+ |---------|------|--------|--------|--------|
66
+ | 功能完整性 | 30% | 4 (1.2) | 5 (1.5) | 3 (0.9) |
67
+ | 性能 | 25% | 5 (1.25) | 3 (0.75) | 4 (1.0) |
68
+ | 学习成本 | 20% | 3 (0.6) | 4 (0.8) | 5 (1.0) |
69
+ | 社区活跃度 | 15% | 5 (0.75) | 4 (0.6) | 2 (0.3) |
70
+ | 运维成本 | 10% | 3 (0.3) | 4 (0.4) | 5 (0.5) |
71
+ | **加权总分** | 100% | **4.1** | **4.05** | **3.7** |
72
+ \`\`\`
73
+
74
+ 标注每个分数的**简短依据**(不要只给数字)`,
75
+ },
76
+ {
77
+ title: '4. POC 验证',
78
+ content: `对得分接近的候选方案(差距 < 0.5 分),通过 POC 验证关键风险:
79
+
80
+ - **POC 范围**:只验证最有风险的 1-2 个假设,不做完整功能
81
+ - **POC 时间盒**:限定在 1-3 天内完成
82
+ - **验证清单**:
83
+ - [ ] 核心功能可用性(Happy Path)
84
+ - [ ] 性能基准测试(如果性能是关键维度)
85
+ - [ ] 与现有技术栈的集成难度
86
+ - [ ] 边界场景和错误处理
87
+ - 记录 POC 结果(代码片段 + 关键指标数据)`,
88
+ },
89
+ {
90
+ title: '5. 明确结论',
91
+ content: `输出有据可查的选型结论:
92
+
93
+ \`\`\`markdown
94
+ ## 技术调研结论
95
+
96
+ ### 推荐方案
97
+ **[方案名称]**
98
+
99
+ ### 推荐理由
100
+ 1. [主要优势 1]
101
+ 2. [主要优势 2]
102
+ 3. [评分最高/POC 验证通过]
103
+
104
+ ### 已知风险和缓解措施
105
+ - 风险:[描述] → 缓解:[措施]
106
+
107
+ ### 放弃其他方案的原因
108
+ - [方案 B]:[原因]
109
+ - [方案 C]:[原因]
110
+
111
+ ### 后续行动
112
+ - [ ] [下一步行动]
113
+ \`\`\``,
114
+ },
115
+ ],
116
+ outputFormat: 'Markdown 调研报告,含问题定义、候选方案概述、加权评分矩阵、POC 结果(如有)和最终选型结论',
117
+ examples: [
118
+ {
119
+ input: '调研前端状态管理方案,在 Redux、Zustand、Jotai 中选一个',
120
+ output: `## 技术调研结论
121
+
122
+ ### 推荐方案
123
+ **Zustand**
124
+
125
+ ### 推荐理由
126
+ 1. API 极简,学习曲线最低(团队约束关键因素)
127
+ 2. 无 boilerplate,代码量减少约 60%
128
+ 3. 加权总分 4.2,领先 Redux (3.6) 和 Jotai (3.9)
129
+
130
+ ### 已知风险
131
+ - 大型应用的 devtools 支持弱于 Redux → 缓解:配合 zustand/middleware 使用
132
+
133
+ ### 放弃原因
134
+ - Redux:boilerplate 过多,不适合中小项目
135
+ - Jotai:原子化模型对团队学习成本较高`,
136
+ },
137
+ ],
138
+ notes: [
139
+ '评估维度权重要在调研开始前确定,避免"为结论找理由"的逆向推导',
140
+ 'POC 代码要保留在仓库中,方便团队评审',
141
+ '选型结论要包含"不选其他方案的原因",方便后续追溯决策依据',
142
+ ],
143
+ category: '需求侧',
144
+ };
145
+ //# sourceMappingURL=10-tech-research.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"10-tech-research.js","sourceRoot":"","sources":["../../../src/skills/10-tech-research.ts"],"names":[],"mappings":";;;AAEa,QAAA,iBAAiB,GAAoB;IAChD,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,eAAe;IACvB,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,sCAAsC;IACnD,aAAa,EAAE,6DAA6D;IAC5E,iBAAiB,EAAE;wCACmB;IACtC,QAAQ,EAAE;QACR,MAAM;QACN,MAAM;QACN,KAAK;QACL,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,WAAW;QACX,eAAe;QACf,gBAAgB;QAChB,iBAAiB;KAClB;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;;;;;;;;;kDASmC;SAC7C;QACD;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;;;;;;;;;gCASiB;SAC3B;QACD;YACE,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE;;;;;;;;;;;;;;;;;wBAiBS;SACnB;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;2BASY;SACtB;QACD;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;OAsBR;SACF;KACF;IACD,YAAY,EACV,qDAAqD;IACvD,QAAQ,EAAE;QACR;YACE,KAAK,EAAE,uCAAuC;YAC9C,MAAM,EAAE;;;;;;;;;;;;;;;uBAeS;SAClB;KACF;IACD,KAAK,EAAE;QACL,iCAAiC;QACjC,sBAAsB;QACtB,+BAA+B;KAChC;IACD,QAAQ,EAAE,KAAK;CAChB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 单一数据源入口
3
+ * 构建脚本和运行时均从此文件取数据
4
+ */
5
+ export { requirementSkill } from './01-requirement';
6
+ export { taskBreakdownSkill } from './02-task-breakdown';
7
+ export { designSkill } from './03-design';
8
+ export { implementationSkill } from './04-implementation';
9
+ export { progressTrackingSkill } from './05-progress-tracking';
10
+ export { taskReportSkill } from './06-task-report';
11
+ export { weeklyReportSkill } from './07-weekly-report';
12
+ export { codeReviewSkill } from './08-code-review';
13
+ export { debugSkill } from './09-debug';
14
+ export { techResearchSkill } from './10-tech-research';
15
+ export type { SkillDefinition, SkillStep, SkillExample, Platform, BuildContext, PipelineDefinition } from './types';
16
+ /** 所有 Skill 按顺序排列 */
17
+ export declare const ALL_SKILLS: import("./types").SkillDefinition[];
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAapH,qBAAqB;AACrB,eAAO,MAAM,UAAU,qCAWtB,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * 单一数据源入口
4
+ * 构建脚本和运行时均从此文件取数据
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ALL_SKILLS = exports.techResearchSkill = exports.debugSkill = exports.codeReviewSkill = exports.weeklyReportSkill = exports.taskReportSkill = exports.progressTrackingSkill = exports.implementationSkill = exports.designSkill = exports.taskBreakdownSkill = exports.requirementSkill = void 0;
8
+ var _01_requirement_1 = require("./01-requirement");
9
+ Object.defineProperty(exports, "requirementSkill", { enumerable: true, get: function () { return _01_requirement_1.requirementSkill; } });
10
+ var _02_task_breakdown_1 = require("./02-task-breakdown");
11
+ Object.defineProperty(exports, "taskBreakdownSkill", { enumerable: true, get: function () { return _02_task_breakdown_1.taskBreakdownSkill; } });
12
+ var _03_design_1 = require("./03-design");
13
+ Object.defineProperty(exports, "designSkill", { enumerable: true, get: function () { return _03_design_1.designSkill; } });
14
+ var _04_implementation_1 = require("./04-implementation");
15
+ Object.defineProperty(exports, "implementationSkill", { enumerable: true, get: function () { return _04_implementation_1.implementationSkill; } });
16
+ var _05_progress_tracking_1 = require("./05-progress-tracking");
17
+ Object.defineProperty(exports, "progressTrackingSkill", { enumerable: true, get: function () { return _05_progress_tracking_1.progressTrackingSkill; } });
18
+ var _06_task_report_1 = require("./06-task-report");
19
+ Object.defineProperty(exports, "taskReportSkill", { enumerable: true, get: function () { return _06_task_report_1.taskReportSkill; } });
20
+ var _07_weekly_report_1 = require("./07-weekly-report");
21
+ Object.defineProperty(exports, "weeklyReportSkill", { enumerable: true, get: function () { return _07_weekly_report_1.weeklyReportSkill; } });
22
+ var _08_code_review_1 = require("./08-code-review");
23
+ Object.defineProperty(exports, "codeReviewSkill", { enumerable: true, get: function () { return _08_code_review_1.codeReviewSkill; } });
24
+ var _09_debug_1 = require("./09-debug");
25
+ Object.defineProperty(exports, "debugSkill", { enumerable: true, get: function () { return _09_debug_1.debugSkill; } });
26
+ var _10_tech_research_1 = require("./10-tech-research");
27
+ Object.defineProperty(exports, "techResearchSkill", { enumerable: true, get: function () { return _10_tech_research_1.techResearchSkill; } });
28
+ const _01_requirement_2 = require("./01-requirement");
29
+ const _02_task_breakdown_2 = require("./02-task-breakdown");
30
+ const _03_design_2 = require("./03-design");
31
+ const _04_implementation_2 = require("./04-implementation");
32
+ const _05_progress_tracking_2 = require("./05-progress-tracking");
33
+ const _06_task_report_2 = require("./06-task-report");
34
+ const _07_weekly_report_2 = require("./07-weekly-report");
35
+ const _08_code_review_2 = require("./08-code-review");
36
+ const _09_debug_2 = require("./09-debug");
37
+ const _10_tech_research_2 = require("./10-tech-research");
38
+ /** 所有 Skill 按顺序排列 */
39
+ exports.ALL_SKILLS = [
40
+ _01_requirement_2.requirementSkill,
41
+ _02_task_breakdown_2.taskBreakdownSkill,
42
+ _03_design_2.designSkill,
43
+ _04_implementation_2.implementationSkill,
44
+ _05_progress_tracking_2.progressTrackingSkill,
45
+ _06_task_report_2.taskReportSkill,
46
+ _07_weekly_report_2.weeklyReportSkill,
47
+ _08_code_review_2.codeReviewSkill,
48
+ _09_debug_2.debugSkill,
49
+ _10_tech_research_2.techResearchSkill,
50
+ ];
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/skills/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,oDAAoD;AAA3C,mHAAA,gBAAgB,OAAA;AACzB,0DAAyD;AAAhD,wHAAA,kBAAkB,OAAA;AAC3B,0CAA0C;AAAjC,yGAAA,WAAW,OAAA;AACpB,0DAA0D;AAAjD,yHAAA,mBAAmB,OAAA;AAC5B,gEAA+D;AAAtD,8HAAA,qBAAqB,OAAA;AAC9B,oDAAmD;AAA1C,kHAAA,eAAe,OAAA;AACxB,wDAAuD;AAA9C,sHAAA,iBAAiB,OAAA;AAC1B,oDAAmD;AAA1C,kHAAA,eAAe,OAAA;AACxB,wCAAwC;AAA/B,uGAAA,UAAU,OAAA;AACnB,wDAAuD;AAA9C,sHAAA,iBAAiB,OAAA;AAI1B,sDAAoD;AACpD,4DAAyD;AACzD,4CAA0C;AAC1C,4DAA0D;AAC1D,kEAA+D;AAC/D,sDAAmD;AACnD,0DAAuD;AACvD,sDAAmD;AACnD,0CAAwC;AACxC,0DAAuD;AAEvD,qBAAqB;AACR,QAAA,UAAU,GAAG;IACxB,kCAAgB;IAChB,uCAAkB;IAClB,wBAAW;IACX,wCAAmB;IACnB,6CAAqB;IACrB,iCAAe;IACf,qCAAiB;IACjB,iCAAe;IACf,sBAAU;IACV,qCAAiB;CAClB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Pipeline 定义(链式 Skill 组合)
3
+ * ⚠️ 此文件只能被 cli/index.ts 和 mcp/server.ts 导入
4
+ * index.ts 不得导入此文件(防循环依赖)
5
+ */
6
+ import type { PipelineDefinition, SkillDefinition } from './types';
7
+ export declare const PIPELINES: PipelineDefinition[];
8
+ /**
9
+ * 根据 pipeline id 解析出 pipeline 定义和对应的 Skill 列表
10
+ */
11
+ export declare function resolvePipeline(id: string): {
12
+ pipeline: PipelineDefinition;
13
+ skills: SkillDefinition[];
14
+ } | null;
15
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/skills/pipeline.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGnE,eAAO,MAAM,SAAS,EAAE,kBAAkB,EA+BzC,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,GACT;IAAE,QAAQ,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,GAAG,IAAI,CASpE"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * Pipeline 定义(链式 Skill 组合)
4
+ * ⚠️ 此文件只能被 cli/index.ts 和 mcp/server.ts 导入
5
+ * index.ts 不得导入此文件(防循环依赖)
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.PIPELINES = void 0;
9
+ exports.resolvePipeline = resolvePipeline;
10
+ const index_1 = require("./index");
11
+ exports.PIPELINES = [
12
+ {
13
+ id: 'dev-workflow',
14
+ name: '开发工作流',
15
+ description: '完整的需求开发流程:需求理解 → 任务拆解 → 方案设计 → 执行实现',
16
+ skillIds: [
17
+ 'requirement-understanding',
18
+ 'task-breakdown',
19
+ 'solution-design',
20
+ 'implementation',
21
+ ],
22
+ },
23
+ {
24
+ id: 'reporting',
25
+ name: '汇报工作流',
26
+ description: '完整的汇报流程:进度跟踪 → 任务报告 → 周报生成',
27
+ skillIds: [
28
+ 'progress-tracking',
29
+ 'task-report',
30
+ 'weekly-report',
31
+ ],
32
+ },
33
+ {
34
+ id: 'quality-workflow',
35
+ name: '质量保障工作流',
36
+ description: '代码质量和问题处理流程:代码审查 → 故障排查',
37
+ skillIds: [
38
+ 'code-review',
39
+ 'debug',
40
+ ],
41
+ },
42
+ ];
43
+ /**
44
+ * 根据 pipeline id 解析出 pipeline 定义和对应的 Skill 列表
45
+ */
46
+ function resolvePipeline(id) {
47
+ const pipeline = exports.PIPELINES.find((p) => p.id === id);
48
+ if (!pipeline)
49
+ return null;
50
+ const skills = pipeline.skillIds
51
+ .map((skillId) => index_1.ALL_SKILLS.find((s) => s.id === skillId))
52
+ .filter((s) => s !== undefined);
53
+ return { pipeline, skills };
54
+ }
55
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/skills/pipeline.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAyCH,0CAWC;AAjDD,mCAAqC;AAExB,QAAA,SAAS,GAAyB;IAC7C;QACE,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,qCAAqC;QAClD,QAAQ,EAAE;YACR,2BAA2B;YAC3B,gBAAgB;YAChB,iBAAiB;YACjB,gBAAgB;SACjB;KACF;IACD;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,4BAA4B;QACzC,QAAQ,EAAE;YACR,mBAAmB;YACnB,aAAa;YACb,eAAe;SAChB;KACF;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,yBAAyB;QACtC,QAAQ,EAAE;YACR,aAAa;YACb,OAAO;SACR;KACF;CACF,CAAC;AAEF;;GAEG;AACH,SAAgB,eAAe,CAC7B,EAAU;IAEV,MAAM,QAAQ,GAAG,iBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ;SAC7B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;SAC1D,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC"}