@bovinphang/frontend-craft 2.8.0 → 2.9.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 (195) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +378 -339
  4. package/CHANGELOG.zh-CN.md +377 -338
  5. package/CONTRIBUTING.md +371 -361
  6. package/CONTRIBUTING.zh-CN.md +371 -361
  7. package/README.md +545 -493
  8. package/README.openclaw.md +359 -320
  9. package/README.openclaw.zh-CN.md +359 -320
  10. package/README.zh-CN.md +545 -493
  11. package/agents/fec-code-reviewer.md +24 -3
  12. package/agents/fec-debugger.md +1 -1
  13. package/agents/fec-doc-updater.md +1 -1
  14. package/agents/fec-e2e-runner.md +1 -1
  15. package/agents/fec-figma-implementer.md +1 -1
  16. package/agents/fec-performance-optimizer.md +1 -1
  17. package/agents/fec-refactor-cleaner.md +4 -1
  18. package/agents/fec-refactoring-expert.md +81 -0
  19. package/agents/fec-security-reviewer.md +17 -1
  20. package/agents/fec-test-planner.md +1 -1
  21. package/agents/fec-typescript-reviewer.md +24 -8
  22. package/agents/fec-ui-checker.md +11 -11
  23. package/commands/fec-debug.md +1 -1
  24. package/commands/fec-refactor-plan.md +17 -0
  25. package/commands/fec-refactor.md +18 -0
  26. package/commands/fec-review.md +40 -10
  27. package/commands/fec-scaffold.md +1 -1
  28. package/commands/fec-smell.md +17 -0
  29. package/commands/fec-tdd.md +6 -2
  30. package/dist/bin/frontend-craft.js +190 -38
  31. package/dist/hooks/fec-run-tests.js +5 -1
  32. package/dist/hooks/fec-session-start.js +1 -1
  33. package/docs/example-prompts.md +157 -140
  34. package/docs/ja-JP/README.md +534 -493
  35. package/docs/ko-KR/README.md +534 -493
  36. package/docs/project-structure.md +151 -131
  37. package/docs/refactoring/README.md +50 -0
  38. package/docs/refactoring/catalog.md +105 -0
  39. package/docs/refactoring/smell-refactoring-matrix.md +41 -0
  40. package/docs/review-and-diagram-workflows.md +39 -0
  41. package/docs/runtimes/antigravity.md +18 -10
  42. package/docs/runtimes/augment.md +18 -10
  43. package/docs/runtimes/claude.md +191 -177
  44. package/docs/runtimes/claude.zh-CN.md +189 -175
  45. package/docs/runtimes/cline.md +18 -10
  46. package/docs/runtimes/codebuddy.md +18 -10
  47. package/docs/runtimes/codex.md +18 -10
  48. package/docs/runtimes/compatibility.md +27 -0
  49. package/docs/runtimes/copilot.md +18 -10
  50. package/docs/runtimes/cursor.md +18 -10
  51. package/docs/runtimes/gemini.md +18 -10
  52. package/docs/runtimes/kilo.md +18 -10
  53. package/docs/runtimes/openclaw.md +18 -10
  54. package/docs/runtimes/opencode.md +18 -10
  55. package/docs/runtimes/qoder.md +18 -19
  56. package/docs/runtimes/trae.md +18 -10
  57. package/docs/runtimes/windsurf.md +18 -10
  58. package/docs/superpowers/plans/2026-09-26-content-integrity.md +145 -0
  59. package/docs/superpowers/plans/2026-09-26-diagram-quality.md +170 -0
  60. package/docs/superpowers/specs/2026-09-26-diagram-quality-design.md +77 -0
  61. package/docs/superpowers/specs/2026-09-26-project-optimization-design.md +95 -0
  62. package/docs/zh-CN/example-prompts.md +157 -140
  63. package/docs/zh-CN/project-structure.md +148 -128
  64. package/docs/zh-CN/review-and-diagram-workflows.md +39 -0
  65. package/docs/zh-TW/README.md +534 -493
  66. package/localized/zh-CN/agents/fec-code-reviewer.md +22 -3
  67. package/localized/zh-CN/agents/fec-refactor-cleaner.md +3 -0
  68. package/localized/zh-CN/agents/fec-refactoring-expert.md +53 -0
  69. package/localized/zh-CN/agents/fec-security-reviewer.md +16 -0
  70. package/localized/zh-CN/agents/fec-typescript-reviewer.md +23 -7
  71. package/localized/zh-CN/commands/fec-refactor-plan.md +15 -0
  72. package/localized/zh-CN/commands/fec-refactor.md +14 -0
  73. package/localized/zh-CN/commands/fec-review.md +40 -9
  74. package/localized/zh-CN/commands/fec-smell.md +13 -0
  75. package/localized/zh-CN/commands/fec-tdd.md +4 -0
  76. package/localized/zh-CN/skills/eval_queries.json +244 -0
  77. package/localized/zh-CN/skills/fec-code-review/SKILL.md +20 -1
  78. package/localized/zh-CN/skills/fec-code-review/references/report-template.md +11 -1
  79. package/localized/zh-CN/skills/fec-code-smells/SKILL.md +33 -0
  80. package/localized/zh-CN/skills/fec-code-smells/references/detection-guide.md +25 -0
  81. package/localized/zh-CN/skills/fec-code-smells/references/smell-catalog.md +817 -0
  82. package/localized/zh-CN/skills/fec-code-smells/references/smell-to-refactoring-map.md +265 -0
  83. package/localized/zh-CN/skills/fec-image-generation/SKILL.md +31 -1
  84. package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/README.md +14 -0
  85. package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/architecture.json +121 -0
  86. package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/invalid-explicit.json +41 -0
  87. package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/sequence.json +53 -0
  88. package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/sequence.mmd +21 -0
  89. package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/workflow.json +98 -0
  90. package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/workflow.mmd +7 -0
  91. package/localized/zh-CN/skills/fec-image-generation/references/diagram-workflows.md +10 -3
  92. package/localized/zh-CN/skills/fec-image-generation/references/html-technical-diagrams.md +8 -1
  93. package/localized/zh-CN/skills/fec-image-generation/references/png-qa-autofix.md +9 -2
  94. package/localized/zh-CN/skills/fec-image-generation/scripts/diagram-browser.mjs +90 -0
  95. package/localized/zh-CN/skills/fec-image-generation/scripts/diagram-layout.mjs +176 -0
  96. package/localized/zh-CN/skills/fec-image-generation/scripts/export-diagram.mjs +48 -80
  97. package/localized/zh-CN/skills/fec-image-generation/scripts/mermaid-render.mjs +64 -0
  98. package/localized/zh-CN/skills/fec-image-generation/scripts/png-qa.mjs +35 -4
  99. package/localized/zh-CN/skills/fec-image-generation/scripts/tech-diagram-render.mjs +193 -53
  100. package/localized/zh-CN/skills/fec-refactor-clean/SKILL.md +3 -0
  101. package/localized/zh-CN/skills/fec-refactoring/SKILL.md +83 -0
  102. package/localized/zh-CN/skills/fec-refactoring/references/principles.md +43 -0
  103. package/localized/zh-CN/skills/fec-refactoring/references/refactoring-vs-feature-change.md +25 -0
  104. package/localized/zh-CN/skills/fec-refactoring/references/when-to-refactor.md +17 -0
  105. package/localized/zh-CN/skills/fec-refactoring/references/workflow.md +59 -0
  106. package/localized/zh-CN/skills/fec-refactoring-api/SKILL.md +25 -0
  107. package/localized/zh-CN/skills/fec-refactoring-api/references/api-refactorings.md +496 -0
  108. package/localized/zh-CN/skills/fec-refactoring-catalog/SKILL.md +21 -0
  109. package/localized/zh-CN/skills/fec-refactoring-catalog/references/catalog-index.md +99 -0
  110. package/localized/zh-CN/skills/fec-refactoring-catalog/references/composition-guide.md +49 -0
  111. package/localized/zh-CN/skills/fec-refactoring-catalog/references/selection-guide.md +41 -0
  112. package/localized/zh-CN/skills/fec-refactoring-control/SKILL.md +25 -0
  113. package/localized/zh-CN/skills/fec-refactoring-control/references/conditional-refactorings.md +299 -0
  114. package/localized/zh-CN/skills/fec-refactoring-data/SKILL.md +25 -0
  115. package/localized/zh-CN/skills/fec-refactoring-data/references/data-refactorings.md +248 -0
  116. package/localized/zh-CN/skills/fec-refactoring-encapsulation/SKILL.md +25 -0
  117. package/localized/zh-CN/skills/fec-refactoring-encapsulation/references/encapsulation-refactorings.md +452 -0
  118. package/localized/zh-CN/skills/fec-refactoring-functions/SKILL.md +25 -0
  119. package/localized/zh-CN/skills/fec-refactoring-functions/references/function-refactorings.md +567 -0
  120. package/localized/zh-CN/skills/fec-refactoring-inheritance/SKILL.md +25 -0
  121. package/localized/zh-CN/skills/fec-refactoring-inheritance/references/inheritance-refactorings.md +550 -0
  122. package/localized/zh-CN/skills/fec-refactoring-move-features/SKILL.md +25 -0
  123. package/localized/zh-CN/skills/fec-refactoring-move-features/references/moving-refactorings.md +453 -0
  124. package/localized/zh-CN/skills/fec-refactoring-validation/SKILL.md +52 -0
  125. package/localized/zh-CN/skills/fec-refactoring-validation/references/behavior-preservation.md +15 -0
  126. package/localized/zh-CN/skills/fec-refactoring-validation/references/refactoring-test-checklist.md +25 -0
  127. package/localized/zh-CN/skills/fec-security-review/SKILL.md +16 -0
  128. package/localized/zh-CN/skills/fec-security-review/references/report-template.md +10 -0
  129. package/localized/zh-CN/skills/fec-tdd-workflow/SKILL.md +3 -0
  130. package/localized/zh-CN/skills/metadata.json +408 -50
  131. package/localized/zh-CN/skills/relations.json +271 -3
  132. package/localized/zh-CN/templates/shared/rules/fec-agent-workflow.md +1 -0
  133. package/openclaw.plugin.json +2 -3
  134. package/package.json +27 -17
  135. package/skills/eval_queries.json +244 -0
  136. package/skills/fec-code-review/SKILL.md +20 -1
  137. package/skills/fec-code-review/references/report-template.md +11 -1
  138. package/skills/fec-code-smells/SKILL.md +33 -0
  139. package/skills/fec-code-smells/references/detection-guide.md +25 -0
  140. package/skills/fec-code-smells/references/smell-catalog.md +861 -0
  141. package/skills/fec-code-smells/references/smell-to-refactoring-map.md +265 -0
  142. package/skills/fec-data-fetching/SKILL.md +1 -1
  143. package/skills/fec-image-generation/SKILL.md +31 -1
  144. package/skills/fec-image-generation/assets/quality-examples/README.md +14 -0
  145. package/skills/fec-image-generation/assets/quality-examples/architecture.json +121 -0
  146. package/skills/fec-image-generation/assets/quality-examples/invalid-explicit.json +41 -0
  147. package/skills/fec-image-generation/assets/quality-examples/sequence.json +53 -0
  148. package/skills/fec-image-generation/assets/quality-examples/sequence.mmd +21 -0
  149. package/skills/fec-image-generation/assets/quality-examples/workflow.json +98 -0
  150. package/skills/fec-image-generation/assets/quality-examples/workflow.mmd +7 -0
  151. package/skills/fec-image-generation/references/diagram-workflows.md +10 -3
  152. package/skills/fec-image-generation/references/html-technical-diagrams.md +8 -1
  153. package/skills/fec-image-generation/references/png-qa-autofix.md +9 -2
  154. package/skills/fec-image-generation/scripts/diagram-browser.mjs +90 -0
  155. package/skills/fec-image-generation/scripts/diagram-layout.mjs +176 -0
  156. package/skills/fec-image-generation/scripts/export-diagram.mjs +48 -80
  157. package/skills/fec-image-generation/scripts/mermaid-render.mjs +64 -0
  158. package/skills/fec-image-generation/scripts/png-qa.mjs +35 -4
  159. package/skills/fec-image-generation/scripts/tech-diagram-render.mjs +193 -53
  160. package/skills/fec-legacy-web-standard/SKILL.md +1 -1
  161. package/skills/fec-refactor-clean/SKILL.md +3 -0
  162. package/skills/fec-refactoring/SKILL.md +83 -0
  163. package/skills/fec-refactoring/references/principles.md +60 -0
  164. package/skills/fec-refactoring/references/refactoring-vs-feature-change.md +27 -0
  165. package/skills/fec-refactoring/references/when-to-refactor.md +31 -0
  166. package/skills/fec-refactoring/references/workflow.md +90 -0
  167. package/skills/fec-refactoring-api/SKILL.md +25 -0
  168. package/skills/fec-refactoring-api/references/api-refactorings.md +496 -0
  169. package/skills/fec-refactoring-catalog/SKILL.md +28 -0
  170. package/skills/fec-refactoring-catalog/references/catalog-index.md +99 -0
  171. package/skills/fec-refactoring-catalog/references/composition-guide.md +49 -0
  172. package/skills/fec-refactoring-catalog/references/selection-guide.md +47 -0
  173. package/skills/fec-refactoring-control/SKILL.md +25 -0
  174. package/skills/fec-refactoring-control/references/conditional-refactorings.md +299 -0
  175. package/skills/fec-refactoring-data/SKILL.md +25 -0
  176. package/skills/fec-refactoring-data/references/data-refactorings.md +248 -0
  177. package/skills/fec-refactoring-encapsulation/SKILL.md +25 -0
  178. package/skills/fec-refactoring-encapsulation/references/encapsulation-refactorings.md +452 -0
  179. package/skills/fec-refactoring-functions/SKILL.md +25 -0
  180. package/skills/fec-refactoring-functions/references/function-refactorings.md +567 -0
  181. package/skills/fec-refactoring-inheritance/SKILL.md +25 -0
  182. package/skills/fec-refactoring-inheritance/references/inheritance-refactorings.md +550 -0
  183. package/skills/fec-refactoring-move-features/SKILL.md +25 -0
  184. package/skills/fec-refactoring-move-features/references/moving-refactorings.md +453 -0
  185. package/skills/fec-refactoring-validation/SKILL.md +59 -0
  186. package/skills/fec-refactoring-validation/references/behavior-preservation.md +53 -0
  187. package/skills/fec-refactoring-validation/references/refactoring-test-checklist.md +42 -0
  188. package/skills/fec-security-review/SKILL.md +16 -0
  189. package/skills/fec-security-review/references/report-template.md +10 -0
  190. package/skills/fec-tdd-workflow/SKILL.md +5 -1
  191. package/skills/metadata.json +434 -71
  192. package/skills/relations.json +264 -0
  193. package/templates/shared/rules/fec-agent-workflow.md +1 -0
  194. package/docs/superpowers/plans/2026-05-29-fec-debug.md +0 -491
  195. package/docs/superpowers/specs/2026-05-29-fec-debug-design.md +0 -340
@@ -0,0 +1,265 @@
1
+ # 坏味道到重构手法映射
2
+
3
+ 候选手法只用于辅助选择。必须结合实际成因、前置条件、风险和“最小安全变化”判断,不能按关键词机械套用。
4
+
5
+ ## SMELL-MYSTERIOUS-NAME — 神秘命名(Mysterious Name)
6
+
7
+ **主要/辅助候选**
8
+ - `RF-CHANGE-FUNCTION-DECLARATION`
9
+ - `RF-RENAME-VARIABLE`
10
+ - `RF-RENAME-FIELD`
11
+
12
+ **选择提示**
13
+ - 先确认“神秘命名”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
14
+
15
+ ## SMELL-DUPLICATED-CODE — 重复代码(Duplicated Code)
16
+
17
+ **主要/辅助候选**
18
+ - `RF-EXTRACT-FUNCTION`
19
+ - `RF-SLIDE-STATEMENTS`
20
+ - `RF-PULL-UP-METHOD`
21
+
22
+ **选择提示**
23
+ - 先确认“重复代码”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
24
+
25
+ ## SMELL-LONG-FUNCTION — 过长函数(Long Function)
26
+
27
+ **主要/辅助候选**
28
+ - `RF-EXTRACT-FUNCTION`
29
+ - `RF-REPLACE-TEMP-WITH-QUERY`
30
+ - `RF-INTRODUCE-PARAMETER-OBJECT`
31
+ - `RF-PRESERVE-WHOLE-OBJECT`
32
+ - `RF-REPLACE-FUNCTION-WITH-COMMAND`
33
+ - `RF-DECOMPOSE-CONDITIONAL`
34
+ - `RF-REPLACE-CONDITIONAL-WITH-POLYMORPHISM`
35
+ - `RF-SPLIT-LOOP`
36
+
37
+ **选择提示**
38
+ - 先确认“过长函数”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
39
+
40
+ ## SMELL-LONG-PARAMETER-LIST — 过长参数列表(Long Parameter List)
41
+
42
+ **主要/辅助候选**
43
+ - `RF-REPLACE-PARAMETER-WITH-QUERY`
44
+ - `RF-PRESERVE-WHOLE-OBJECT`
45
+ - `RF-INTRODUCE-PARAMETER-OBJECT`
46
+ - `RF-REMOVE-FLAG-ARGUMENT`
47
+ - `RF-COMBINE-FUNCTIONS-INTO-CLASS`
48
+
49
+ **选择提示**
50
+ - 先确认“过长参数列表”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
51
+
52
+ ## SMELL-GLOBAL-DATA — 全局数据(Global Data)
53
+
54
+ **主要/辅助候选**
55
+ - `RF-ENCAPSULATE-VARIABLE`
56
+
57
+ **选择提示**
58
+ - 先确认“全局数据”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
59
+
60
+ ## SMELL-MUTABLE-DATA — 可变数据(Mutable Data)
61
+
62
+ **主要/辅助候选**
63
+ - `RF-ENCAPSULATE-VARIABLE`
64
+ - `RF-SPLIT-VARIABLE`
65
+ - `RF-SLIDE-STATEMENTS`
66
+ - `RF-EXTRACT-FUNCTION`
67
+ - `RF-SEPARATE-QUERY-FROM-MODIFIER`
68
+ - `RF-REMOVE-SETTING-METHOD`
69
+ - `RF-REPLACE-DERIVED-VARIABLE-WITH-QUERY`
70
+ - `RF-COMBINE-FUNCTIONS-INTO-CLASS`
71
+ - `RF-COMBINE-FUNCTIONS-INTO-TRANSFORM`
72
+ - `RF-CHANGE-REFERENCE-TO-VALUE`
73
+
74
+ **选择提示**
75
+ - 先确认“可变数据”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
76
+
77
+ ## SMELL-DIVERGENT-CHANGE — 发散式变化(Divergent Change)
78
+
79
+ **主要/辅助候选**
80
+ - `RF-SPLIT-PHASE`
81
+ - `RF-MOVE-FUNCTION`
82
+ - `RF-EXTRACT-FUNCTION`
83
+ - `RF-EXTRACT-CLASS`
84
+
85
+ **选择提示**
86
+ - 先确认“发散式变化”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
87
+
88
+ ## SMELL-SHOTGUN-SURGERY — 霰弹式修改(Shotgun Surgery)
89
+
90
+ **主要/辅助候选**
91
+ - `RF-MOVE-FUNCTION`
92
+ - `RF-MOVE-FIELD`
93
+ - `RF-COMBINE-FUNCTIONS-INTO-CLASS`
94
+ - `RF-COMBINE-FUNCTIONS-INTO-TRANSFORM`
95
+ - `RF-SPLIT-PHASE`
96
+ - `RF-INLINE-FUNCTION`
97
+ - `RF-INLINE-CLASS`
98
+
99
+ **选择提示**
100
+ - 先确认“霰弹式修改”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
101
+
102
+ ## SMELL-FEATURE-ENVY — 依恋情结(Feature Envy)
103
+
104
+ **主要/辅助候选**
105
+ - `RF-MOVE-FUNCTION`
106
+ - `RF-EXTRACT-FUNCTION`
107
+
108
+ **选择提示**
109
+ - 先确认“依恋情结”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
110
+
111
+ ## SMELL-DATA-CLUMPS — 数据泥团(Data Clumps)
112
+
113
+ **主要/辅助候选**
114
+ - `RF-EXTRACT-CLASS`
115
+ - `RF-INTRODUCE-PARAMETER-OBJECT`
116
+ - `RF-PRESERVE-WHOLE-OBJECT`
117
+
118
+ **选择提示**
119
+ - 先确认“数据泥团”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
120
+
121
+ ## SMELL-PRIMITIVE-OBSESSION — 基本类型偏执(Primitive Obsession)
122
+
123
+ **主要/辅助候选**
124
+ - `RF-REPLACE-PRIMITIVE-WITH-OBJECT`
125
+ - `RF-REPLACE-TYPE-CODE-WITH-SUBCLASSES`
126
+ - `RF-REPLACE-CONDITIONAL-WITH-POLYMORPHISM`
127
+ - `RF-EXTRACT-CLASS`
128
+ - `RF-INTRODUCE-PARAMETER-OBJECT`
129
+
130
+ **选择提示**
131
+ - 先确认“基本类型偏执”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
132
+
133
+ ## SMELL-REPEATED-SWITCHES — 重复的 switch(Repeated Switches)
134
+
135
+ **主要/辅助候选**
136
+ - `RF-REPLACE-CONDITIONAL-WITH-POLYMORPHISM`
137
+
138
+ **选择提示**
139
+ - 先确认“重复的 switch”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
140
+
141
+ ## SMELL-LOOPS — 循环语句(Loops)
142
+
143
+ **主要/辅助候选**
144
+ - `RF-REPLACE-LOOP-WITH-PIPELINE`
145
+
146
+ **选择提示**
147
+ - 先确认“循环语句”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
148
+
149
+ ## SMELL-LAZY-ELEMENT — 冗赘的元素(Lazy Element)
150
+
151
+ **主要/辅助候选**
152
+ - `RF-INLINE-FUNCTION`
153
+ - `RF-INLINE-CLASS`
154
+ - `RF-COLLAPSE-HIERARCHY`
155
+
156
+ **选择提示**
157
+ - 先确认“冗赘的元素”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
158
+
159
+ ## SMELL-SPECULATIVE-GENERALITY — 夸夸其谈通用性(Speculative Generality)
160
+
161
+ **主要/辅助候选**
162
+ - `RF-COLLAPSE-HIERARCHY`
163
+ - `RF-INLINE-FUNCTION`
164
+ - `RF-INLINE-CLASS`
165
+ - `RF-CHANGE-FUNCTION-DECLARATION`
166
+ - `RF-REMOVE-DEAD-CODE`
167
+
168
+ **选择提示**
169
+ - 先确认“夸夸其谈通用性”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
170
+
171
+ ## SMELL-TEMPORARY-FIELD — 临时字段(Temporary Field)
172
+
173
+ **主要/辅助候选**
174
+ - `RF-EXTRACT-CLASS`
175
+ - `RF-MOVE-FUNCTION`
176
+ - `RF-INTRODUCE-SPECIAL-CASE`
177
+
178
+ **选择提示**
179
+ - 先确认“临时字段”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
180
+
181
+ ## SMELL-MESSAGE-CHAINS — 过长的消息链(Message Chains)
182
+
183
+ **主要/辅助候选**
184
+ - `RF-HIDE-DELEGATE`
185
+ - `RF-EXTRACT-FUNCTION`
186
+ - `RF-MOVE-FUNCTION`
187
+
188
+ **选择提示**
189
+ - 先确认“过长的消息链”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
190
+
191
+ ## SMELL-MIDDLE-MAN — 中间人(Middle Man)
192
+
193
+ **主要/辅助候选**
194
+ - `RF-REMOVE-MIDDLE-MAN`
195
+ - `RF-INLINE-FUNCTION`
196
+ - `RF-REPLACE-SUPERCLASS-WITH-DELEGATE`
197
+ - `RF-REPLACE-SUBCLASS-WITH-DELEGATE`
198
+
199
+ **选择提示**
200
+ - 先确认“中间人”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
201
+
202
+ ## SMELL-INSIDER-TRADING — 内幕交易(Insider Trading)
203
+
204
+ **主要/辅助候选**
205
+ - `RF-MOVE-FUNCTION`
206
+ - `RF-MOVE-FIELD`
207
+ - `RF-HIDE-DELEGATE`
208
+ - `RF-REPLACE-SUBCLASS-WITH-DELEGATE`
209
+ - `RF-REPLACE-SUPERCLASS-WITH-DELEGATE`
210
+
211
+ **选择提示**
212
+ - 先确认“内幕交易”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
213
+
214
+ ## SMELL-LARGE-CLASS — 过大的类(Large Class)
215
+
216
+ **主要/辅助候选**
217
+ - `RF-EXTRACT-CLASS`
218
+ - `RF-EXTRACT-SUPERCLASS`
219
+ - `RF-REPLACE-TYPE-CODE-WITH-SUBCLASSES`
220
+
221
+ **选择提示**
222
+ - 先确认“过大的类”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
223
+
224
+ ## SMELL-ALTERNATIVE-CLASSES-DIFFERENT-INTERFACES — 异曲同工的类(Alternative Classes with Different Interfaces)
225
+
226
+ **主要/辅助候选**
227
+ - `RF-CHANGE-FUNCTION-DECLARATION`
228
+ - `RF-MOVE-FUNCTION`
229
+ - `RF-EXTRACT-SUPERCLASS`
230
+
231
+ **选择提示**
232
+ - 先确认“异曲同工的类”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
233
+
234
+ ## SMELL-DATA-CLASS — 纯数据类(Data Class)
235
+
236
+ **主要/辅助候选**
237
+ - `RF-ENCAPSULATE-RECORD`
238
+ - `RF-REMOVE-SETTING-METHOD`
239
+ - `RF-MOVE-FUNCTION`
240
+ - `RF-EXTRACT-FUNCTION`
241
+ - `RF-SPLIT-PHASE`
242
+
243
+ **选择提示**
244
+ - 先确认“纯数据类”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
245
+
246
+ ## SMELL-REFUSED-BEQUEST — 被拒绝的遗赠(Refused Bequest)
247
+
248
+ **主要/辅助候选**
249
+ - `RF-PUSH-DOWN-METHOD`
250
+ - `RF-PUSH-DOWN-FIELD`
251
+ - `RF-REPLACE-SUBCLASS-WITH-DELEGATE`
252
+ - `RF-REPLACE-SUPERCLASS-WITH-DELEGATE`
253
+
254
+ **选择提示**
255
+ - 先确认“被拒绝的遗赠”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
256
+
257
+ ## SMELL-COMMENTS — 注释(Comments)
258
+
259
+ **主要/辅助候选**
260
+ - `RF-EXTRACT-FUNCTION`
261
+ - `RF-CHANGE-FUNCTION-DECLARATION`
262
+ - `RF-INTRODUCE-ASSERTION`
263
+
264
+ **选择提示**
265
+ - 先确认“注释”的真实成因,再从符合当前数据所有权、行为契约和前置条件的手法中选择最小安全变化。
@@ -14,7 +14,7 @@ description: 用于生成或编辑图表、图形资产、海报、UI 样机、
14
14
  1. 判断产物类型
15
15
  - 文本、结构和连线准确性优先时,用 Mermaid、SVG、HTML/CSS、canvas 或图表库生成可编辑源,再导出 PNG。
16
16
  - 需要单文件浏览器打开、暗/亮主题和结构化 QA 的系统蓝图、架构图、部署拓扑、Agent runtime、memory flow、before-after architecture、流程、序列、数据流、生命周期、runbook、状态机或 PII/数据血缘图时,使用 HTML technical diagrams。
17
- - 流程地图、审批流、自动化运行、异常路径和循环运营流需要清晰的起止节点、决策、参与者、步骤编号和摘要,但不需要 diagrams.net 时,使用 HTML `workflow` 路线。
17
+ - 流程地图、审批流、自动化运行、异常路径和循环运营流需要清晰的起止节点、决策、参与者、步骤编号和摘要,但不需要 diagrams.net 时,在 Mermaid 不可用或明确需要浏览器泳道/主题交付时,使用兼容 HTML `workflow` 路线。
18
18
  - 系统、Agent、memory、数据或 tool-call 图需要语义节点形状、有含义的连线和可浏览器打开、可导出、可 QA 的源文件时,使用主题化 HTML technical diagrams。
19
19
  - 用户需要在本地浏览器里看到节点和连线实时出现,或需要在会话中拖拽、改标签、删除、缩放并快速导出草图时,使用交互式实时图表路线。
20
20
  - 审美、质感、照片、插画、漫画、产品图或品牌氛围优先时,用图片生成或编辑工具,再把最终资产保存到项目或报告目录。
@@ -78,3 +78,33 @@ description: 用于生成或编辑图表、图形资产、海报、UI 样机、
78
78
  ## 预期输出
79
79
 
80
80
  产出可编辑源、最终 PNG 或编辑后图片,并附带生成路线与 QA 结果。图表应结构清晰、标签不截断、连线不混乱;视觉资产应匹配用途、尺寸、品牌语气和交付路径。
81
+
82
+
83
+ ## 技术图质量与工具路由
84
+
85
+ 标准时序图、流程图优先使用本地 Mermaid;架构图需长期手工编辑时复用 fec-drawio-studio;大型拓扑可选本地 Graphviz。工具不可用时明确记录并使用兼容的 JSON/HTML 路线,不自动安装、下载或使用 CDN。示意图保留完整文字与所有节点、连接关系;显式尺寸、坐标和 waypoints 不静默重排。
86
+
87
+ ```sh
88
+ node skills/fec-image-generation/scripts/mermaid-render.mjs --input sequence.mmd --output sequence.svg --report sequence.render.json
89
+ node skills/fec-image-generation/scripts/export-diagram.mjs --input diagram.html --format png --output diagram.png --theme light --scale 2 --manifest diagram.layout.json --output-manifest diagram.actual.json
90
+ node skills/fec-image-generation/scripts/png-qa.mjs --png diagram.png --manifest diagram.actual.json --format json
91
+ ```
92
+
93
+ PNG QA 使用导出后的 actual manifest;原始 manifest 是 SVG 坐标与估算边界,2x 导出不能直接复用。浏览器等待字体并测量真实文字边界;独立 SVG 内嵌主题样式。渲染成功、静态估算和自动检测通过都不等于人工视觉验收;检查最终 PNG 后记录工具版本、主题、缩放、修复轮次、未解决问题及部分验收状态。提高分辨率不会修复文字截断或布局冲突。
94
+
95
+ 技能内部模块与可复现样例:
96
+ - [mermaid-render.mjs](scripts/mermaid-render.mjs)
97
+ - [diagram-layout.mjs](scripts/diagram-layout.mjs)
98
+ - [diagram-browser.mjs](scripts/diagram-browser.mjs)
99
+ - [quality examples](assets/quality-examples/README.md)
100
+ - [sequence.json](assets/quality-examples/sequence.json)
101
+ - [workflow.json](assets/quality-examples/workflow.json)
102
+ - [architecture.json](assets/quality-examples/architecture.json)
103
+ - [sequence.mmd](assets/quality-examples/sequence.mmd)
104
+ - [workflow.mmd](assets/quality-examples/workflow.mmd)
105
+
106
+ 内置 sequence 仅支持参与者和有序消息;activation、alt、loop、par、复杂 async 片段请使用 Mermaid,不把这些语义悄悄简化成直线消息。可选 ELK 仅在本机 Mermaid 版本确实支持时启用,否则使用兼容默认布局。
107
+
108
+ - [invalid-explicit.json](assets/quality-examples/invalid-explicit.json)
109
+
110
+ - [png-qa.mjs](scripts/png-qa.mjs)
@@ -0,0 +1,14 @@
1
+ # 技术图质量样例
2
+
3
+ JSON 样例覆盖时序自调用、流程决策回环、架构分组和双向连接。Mermaid 源用于标准时序与流程图;修改布局时保留全部文字和连接关系。
4
+
5
+ ```sh
6
+ node skills/fec-image-generation/scripts/tech-diagram-render.mjs --input skills/fec-image-generation/assets/quality-examples/workflow.json --type workflow --output workflow.html --manifest workflow.layout.json
7
+ node skills/fec-image-generation/scripts/export-diagram.mjs --input workflow.html --format png --output workflow.png --theme light --scale 2 --manifest workflow.layout.json --output-manifest workflow.actual.json
8
+ node skills/fec-image-generation/scripts/png-qa.mjs --png workflow.png --manifest workflow.actual.json --format json
9
+ node skills/fec-image-generation/scripts/mermaid-render.mjs --input skills/fec-image-generation/assets/quality-examples/sequence.mmd --output sequence.svg --report sequence.render.json
10
+ ```
11
+
12
+ PNG 需要本地 Chromium,可用 FEC_BROWSER_PATH 指定路径。Mermaid 需要已安装的 mmdc,不自动安装或使用 CDN;缺失时明确记录并使用 JSON/HTML。需要手工编辑的架构图复用 fec-drawio-studio,大型拓扑可选 Graphviz。
13
+
14
+ 按交付阅读尺寸检查 1x 和 2x 图片,检查形状内部文字、标签和箭头、分支返回、回环、分组及明暗主题对比。几何 QA 不能替代看图。显式尺寸不足或 waypoints 受阻时报告问题,在源级修复且保留意图。默认最多修复两轮,用户要求时最多五轮,未解决则报告部分验收。
@@ -0,0 +1,121 @@
1
+ {
2
+ "schema_version": 1,
3
+ "diagram_type": "architecture",
4
+ "meta": {
5
+ "title": "业务平台分层与信任边界"
6
+ },
7
+ "visual": {
8
+ "style": "minimal"
9
+ },
10
+ "groups": [
11
+ {
12
+ "id": "private",
13
+ "label": "内部可信网络 / 业务与数据服务",
14
+ "x": 360,
15
+ "y": 70,
16
+ "width": 920,
17
+ "height": 470,
18
+ "type": "security"
19
+ }
20
+ ],
21
+ "nodes": [
22
+ {
23
+ "id": "web",
24
+ "label": "用户浏览器应用",
25
+ "sublabel": "外部入口",
26
+ "type": "browser",
27
+ "x": 70,
28
+ "y": 160,
29
+ "width": 200,
30
+ "height": 112
31
+ },
32
+ {
33
+ "id": "gateway",
34
+ "label": "统一身份验证与请求路由网关",
35
+ "type": "gateway",
36
+ "x": 420,
37
+ "y": 150,
38
+ "width": 220,
39
+ "height": 112,
40
+ "group": "private"
41
+ },
42
+ {
43
+ "id": "service",
44
+ "label": "订单查询与审批业务服务",
45
+ "type": "backend",
46
+ "x": 760,
47
+ "y": 150,
48
+ "width": 220,
49
+ "height": 112,
50
+ "group": "private"
51
+ },
52
+ {
53
+ "id": "cache",
54
+ "label": "短期查询结果缓存",
55
+ "type": "memory",
56
+ "x": 420,
57
+ "y": 370,
58
+ "width": 220,
59
+ "height": 112,
60
+ "group": "private"
61
+ },
62
+ {
63
+ "id": "db",
64
+ "label": "订单与审批记录数据库",
65
+ "type": "database",
66
+ "x": 760,
67
+ "y": 370,
68
+ "width": 220,
69
+ "height": 112,
70
+ "group": "private"
71
+ },
72
+ {
73
+ "id": "queue",
74
+ "label": "异步任务与消息通知队列",
75
+ "type": "queue",
76
+ "x": 1060,
77
+ "y": 370,
78
+ "width": 180,
79
+ "height": 112,
80
+ "group": "private"
81
+ }
82
+ ],
83
+ "connections": [
84
+ {
85
+ "from": "web",
86
+ "to": "gateway",
87
+ "label": "鉴权请求",
88
+ "flow": "control"
89
+ },
90
+ {
91
+ "from": "gateway",
92
+ "to": "service",
93
+ "label": "已验证请求",
94
+ "flow": "control"
95
+ },
96
+ {
97
+ "from": "service",
98
+ "to": "gateway",
99
+ "label": "查询响应",
100
+ "flow": "data"
101
+ },
102
+ {
103
+ "from": "service",
104
+ "to": "cache",
105
+ "label": "读取缓存",
106
+ "flow": "read"
107
+ },
108
+ {
109
+ "from": "service",
110
+ "to": "db",
111
+ "label": "查询记录",
112
+ "flow": "read"
113
+ },
114
+ {
115
+ "from": "service",
116
+ "to": "queue",
117
+ "label": "提交通知任务",
118
+ "flow": "async"
119
+ }
120
+ ]
121
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "schema_version": 1,
3
+ "diagram_type": "architecture",
4
+ "meta": {
5
+ "title": "预期失败诊断样例"
6
+ },
7
+ "nodes": [
8
+ {
9
+ "id": "tiny",
10
+ "label": "A complete long label that cannot fit explicit size",
11
+ "x": -12,
12
+ "y": 40,
13
+ "width": 48,
14
+ "height": 24
15
+ },
16
+ {
17
+ "id": "overlap",
18
+ "label": "Overlap",
19
+ "x": 20,
20
+ "y": 44,
21
+ "width": 100,
22
+ "height": 60
23
+ }
24
+ ],
25
+ "connections": [
26
+ {
27
+ "from": "tiny",
28
+ "to": "overlap",
29
+ "waypoints": [
30
+ [
31
+ 30,
32
+ 50
33
+ ],
34
+ [
35
+ 800,
36
+ -20
37
+ ]
38
+ ]
39
+ }
40
+ ]
41
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "schema_version": 1,
3
+ "diagram_type": "sequence",
4
+ "meta": {
5
+ "title": "订单查询与缓存回填"
6
+ },
7
+ "participants": [
8
+ {
9
+ "id": "client",
10
+ "label": "用户浏览器客户端",
11
+ "type": "frontend"
12
+ },
13
+ {
14
+ "id": "api",
15
+ "label": "订单服务接口",
16
+ "type": "backend"
17
+ },
18
+ {
19
+ "id": "db",
20
+ "label": "持久化数据库",
21
+ "type": "database"
22
+ }
23
+ ],
24
+ "messages": [
25
+ {
26
+ "from": "client",
27
+ "to": "api",
28
+ "label": "查询订单详细信息与当前支付状态"
29
+ },
30
+ {
31
+ "from": "api",
32
+ "to": "api",
33
+ "label": "验证身份与订单访问权限"
34
+ },
35
+ {
36
+ "from": "api",
37
+ "to": "db",
38
+ "label": "缓存未命中,读取订单记录"
39
+ },
40
+ {
41
+ "from": "db",
42
+ "to": "api",
43
+ "label": "返回订单记录与支付状态",
44
+ "variant": "return"
45
+ },
46
+ {
47
+ "from": "api",
48
+ "to": "client",
49
+ "label": "返回查询结果并更新页面",
50
+ "variant": "return"
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,21 @@
1
+ sequenceDiagram
2
+ participant Web as 用户浏览器客户端
3
+ participant API as 订单服务接口
4
+ participant DB as 持久化数据库
5
+ Web->>API: 查询订单详细信息与当前支付状态
6
+ API->>API: 验证身份与订单访问权限
7
+ API->>DB: 缓存未命中,读取订单记录
8
+ DB-->>API: 返回订单记录与支付状态
9
+ API-->>Web: 返回查询结果并更新页面
10
+
11
+ activate API
12
+ alt 缓存命中
13
+ API-->>Web: 返回缓存结果
14
+ else 缓存未命中
15
+ loop 重试失败查询
16
+ API->>DB: 读取记录
17
+ DB-->>API: 返回结果
18
+ end
19
+ end
20
+ API-)Web: 异步更新通知
21
+ deactivate API
@@ -0,0 +1,98 @@
1
+ {
2
+ "schema_version": 1,
3
+ "diagram_type": "workflow",
4
+ "meta": {
5
+ "title": "订单审批与异常回退"
6
+ },
7
+ "lanes": [
8
+ {
9
+ "id": "user",
10
+ "label": "用户提交"
11
+ },
12
+ {
13
+ "id": "ops",
14
+ "label": "审批与处理"
15
+ },
16
+ {
17
+ "id": "sys",
18
+ "label": "系统执行"
19
+ }
20
+ ],
21
+ "nodes": [
22
+ {
23
+ "id": "start",
24
+ "lane": "user",
25
+ "col": 0,
26
+ "label": "提交订单申请",
27
+ "type": "start"
28
+ },
29
+ {
30
+ "id": "check",
31
+ "lane": "ops",
32
+ "col": 1,
33
+ "label": "检查订单信息是否完整且符合审核条件",
34
+ "type": "decision"
35
+ },
36
+ {
37
+ "id": "approve",
38
+ "lane": "ops",
39
+ "col": 2,
40
+ "label": "人工审批并记录处理意见",
41
+ "type": "backend"
42
+ },
43
+ {
44
+ "id": "retry",
45
+ "lane": "user",
46
+ "col": 1,
47
+ "label": "补充缺失材料后重新提交",
48
+ "type": "waiting"
49
+ },
50
+ {
51
+ "id": "save",
52
+ "lane": "sys",
53
+ "col": 3,
54
+ "label": "保存审批结果并异步通知申请人",
55
+ "type": "database"
56
+ },
57
+ {
58
+ "id": "done",
59
+ "lane": "sys",
60
+ "col": 4,
61
+ "label": "处理完成",
62
+ "type": "success"
63
+ }
64
+ ],
65
+ "edges": [
66
+ {
67
+ "from": "start",
68
+ "to": "check",
69
+ "label": "提交审核"
70
+ },
71
+ {
72
+ "from": "check",
73
+ "to": "approve",
74
+ "label": "信息完整"
75
+ },
76
+ {
77
+ "from": "check",
78
+ "to": "retry",
79
+ "label": "需要补充",
80
+ "variant": "dashed"
81
+ },
82
+ {
83
+ "from": "retry",
84
+ "to": "check",
85
+ "label": "重新审核"
86
+ },
87
+ {
88
+ "from": "approve",
89
+ "to": "save",
90
+ "label": "审批通过"
91
+ },
92
+ {
93
+ "from": "save",
94
+ "to": "done",
95
+ "label": "通知成功"
96
+ }
97
+ ]
98
+ }
@@ -0,0 +1,7 @@
1
+ flowchart TD
2
+ A([提交订单申请]) --> B{检查订单信息是否完整且符合审核条件}
3
+ B -->|信息完整| C[人工审批并记录处理意见]
4
+ B -->|需要补充| D[补充缺失材料后重新提交]
5
+ D -->|重新审核| B
6
+ C -->|审批通过| E[(保存审批结果并异步通知申请人)]
7
+ E -->|通知成功| F([处理完成])