@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.
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +378 -339
- package/CHANGELOG.zh-CN.md +377 -338
- package/CONTRIBUTING.md +371 -361
- package/CONTRIBUTING.zh-CN.md +371 -361
- package/README.md +545 -493
- package/README.openclaw.md +359 -320
- package/README.openclaw.zh-CN.md +359 -320
- package/README.zh-CN.md +545 -493
- package/agents/fec-code-reviewer.md +24 -3
- package/agents/fec-debugger.md +1 -1
- package/agents/fec-doc-updater.md +1 -1
- package/agents/fec-e2e-runner.md +1 -1
- package/agents/fec-figma-implementer.md +1 -1
- package/agents/fec-performance-optimizer.md +1 -1
- package/agents/fec-refactor-cleaner.md +4 -1
- package/agents/fec-refactoring-expert.md +81 -0
- package/agents/fec-security-reviewer.md +17 -1
- package/agents/fec-test-planner.md +1 -1
- package/agents/fec-typescript-reviewer.md +24 -8
- package/agents/fec-ui-checker.md +11 -11
- package/commands/fec-debug.md +1 -1
- package/commands/fec-refactor-plan.md +17 -0
- package/commands/fec-refactor.md +18 -0
- package/commands/fec-review.md +40 -10
- package/commands/fec-scaffold.md +1 -1
- package/commands/fec-smell.md +17 -0
- package/commands/fec-tdd.md +6 -2
- package/dist/bin/frontend-craft.js +190 -38
- package/dist/hooks/fec-run-tests.js +5 -1
- package/dist/hooks/fec-session-start.js +1 -1
- package/docs/example-prompts.md +157 -140
- package/docs/ja-JP/README.md +534 -493
- package/docs/ko-KR/README.md +534 -493
- package/docs/project-structure.md +151 -131
- package/docs/refactoring/README.md +50 -0
- package/docs/refactoring/catalog.md +105 -0
- package/docs/refactoring/smell-refactoring-matrix.md +41 -0
- package/docs/review-and-diagram-workflows.md +39 -0
- package/docs/runtimes/antigravity.md +18 -10
- package/docs/runtimes/augment.md +18 -10
- package/docs/runtimes/claude.md +191 -177
- package/docs/runtimes/claude.zh-CN.md +189 -175
- package/docs/runtimes/cline.md +18 -10
- package/docs/runtimes/codebuddy.md +18 -10
- package/docs/runtimes/codex.md +18 -10
- package/docs/runtimes/compatibility.md +27 -0
- package/docs/runtimes/copilot.md +18 -10
- package/docs/runtimes/cursor.md +18 -10
- package/docs/runtimes/gemini.md +18 -10
- package/docs/runtimes/kilo.md +18 -10
- package/docs/runtimes/openclaw.md +18 -10
- package/docs/runtimes/opencode.md +18 -10
- package/docs/runtimes/qoder.md +18 -19
- package/docs/runtimes/trae.md +18 -10
- package/docs/runtimes/windsurf.md +18 -10
- package/docs/superpowers/plans/2026-09-26-content-integrity.md +145 -0
- package/docs/superpowers/plans/2026-09-26-diagram-quality.md +170 -0
- package/docs/superpowers/specs/2026-09-26-diagram-quality-design.md +77 -0
- package/docs/superpowers/specs/2026-09-26-project-optimization-design.md +95 -0
- package/docs/zh-CN/example-prompts.md +157 -140
- package/docs/zh-CN/project-structure.md +148 -128
- package/docs/zh-CN/review-and-diagram-workflows.md +39 -0
- package/docs/zh-TW/README.md +534 -493
- package/localized/zh-CN/agents/fec-code-reviewer.md +22 -3
- package/localized/zh-CN/agents/fec-refactor-cleaner.md +3 -0
- package/localized/zh-CN/agents/fec-refactoring-expert.md +53 -0
- package/localized/zh-CN/agents/fec-security-reviewer.md +16 -0
- package/localized/zh-CN/agents/fec-typescript-reviewer.md +23 -7
- package/localized/zh-CN/commands/fec-refactor-plan.md +15 -0
- package/localized/zh-CN/commands/fec-refactor.md +14 -0
- package/localized/zh-CN/commands/fec-review.md +40 -9
- package/localized/zh-CN/commands/fec-smell.md +13 -0
- package/localized/zh-CN/commands/fec-tdd.md +4 -0
- package/localized/zh-CN/skills/eval_queries.json +244 -0
- package/localized/zh-CN/skills/fec-code-review/SKILL.md +20 -1
- package/localized/zh-CN/skills/fec-code-review/references/report-template.md +11 -1
- package/localized/zh-CN/skills/fec-code-smells/SKILL.md +33 -0
- package/localized/zh-CN/skills/fec-code-smells/references/detection-guide.md +25 -0
- package/localized/zh-CN/skills/fec-code-smells/references/smell-catalog.md +817 -0
- package/localized/zh-CN/skills/fec-code-smells/references/smell-to-refactoring-map.md +265 -0
- package/localized/zh-CN/skills/fec-image-generation/SKILL.md +31 -1
- package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/README.md +14 -0
- package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/architecture.json +121 -0
- package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/invalid-explicit.json +41 -0
- package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/sequence.json +53 -0
- package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/sequence.mmd +21 -0
- package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/workflow.json +98 -0
- package/localized/zh-CN/skills/fec-image-generation/assets/quality-examples/workflow.mmd +7 -0
- package/localized/zh-CN/skills/fec-image-generation/references/diagram-workflows.md +10 -3
- package/localized/zh-CN/skills/fec-image-generation/references/html-technical-diagrams.md +8 -1
- package/localized/zh-CN/skills/fec-image-generation/references/png-qa-autofix.md +9 -2
- package/localized/zh-CN/skills/fec-image-generation/scripts/diagram-browser.mjs +90 -0
- package/localized/zh-CN/skills/fec-image-generation/scripts/diagram-layout.mjs +176 -0
- package/localized/zh-CN/skills/fec-image-generation/scripts/export-diagram.mjs +48 -80
- package/localized/zh-CN/skills/fec-image-generation/scripts/mermaid-render.mjs +64 -0
- package/localized/zh-CN/skills/fec-image-generation/scripts/png-qa.mjs +35 -4
- package/localized/zh-CN/skills/fec-image-generation/scripts/tech-diagram-render.mjs +193 -53
- package/localized/zh-CN/skills/fec-refactor-clean/SKILL.md +3 -0
- package/localized/zh-CN/skills/fec-refactoring/SKILL.md +83 -0
- package/localized/zh-CN/skills/fec-refactoring/references/principles.md +43 -0
- package/localized/zh-CN/skills/fec-refactoring/references/refactoring-vs-feature-change.md +25 -0
- package/localized/zh-CN/skills/fec-refactoring/references/when-to-refactor.md +17 -0
- package/localized/zh-CN/skills/fec-refactoring/references/workflow.md +59 -0
- package/localized/zh-CN/skills/fec-refactoring-api/SKILL.md +25 -0
- package/localized/zh-CN/skills/fec-refactoring-api/references/api-refactorings.md +496 -0
- package/localized/zh-CN/skills/fec-refactoring-catalog/SKILL.md +21 -0
- package/localized/zh-CN/skills/fec-refactoring-catalog/references/catalog-index.md +99 -0
- package/localized/zh-CN/skills/fec-refactoring-catalog/references/composition-guide.md +49 -0
- package/localized/zh-CN/skills/fec-refactoring-catalog/references/selection-guide.md +41 -0
- package/localized/zh-CN/skills/fec-refactoring-control/SKILL.md +25 -0
- package/localized/zh-CN/skills/fec-refactoring-control/references/conditional-refactorings.md +299 -0
- package/localized/zh-CN/skills/fec-refactoring-data/SKILL.md +25 -0
- package/localized/zh-CN/skills/fec-refactoring-data/references/data-refactorings.md +248 -0
- package/localized/zh-CN/skills/fec-refactoring-encapsulation/SKILL.md +25 -0
- package/localized/zh-CN/skills/fec-refactoring-encapsulation/references/encapsulation-refactorings.md +452 -0
- package/localized/zh-CN/skills/fec-refactoring-functions/SKILL.md +25 -0
- package/localized/zh-CN/skills/fec-refactoring-functions/references/function-refactorings.md +567 -0
- package/localized/zh-CN/skills/fec-refactoring-inheritance/SKILL.md +25 -0
- package/localized/zh-CN/skills/fec-refactoring-inheritance/references/inheritance-refactorings.md +550 -0
- package/localized/zh-CN/skills/fec-refactoring-move-features/SKILL.md +25 -0
- package/localized/zh-CN/skills/fec-refactoring-move-features/references/moving-refactorings.md +453 -0
- package/localized/zh-CN/skills/fec-refactoring-validation/SKILL.md +52 -0
- package/localized/zh-CN/skills/fec-refactoring-validation/references/behavior-preservation.md +15 -0
- package/localized/zh-CN/skills/fec-refactoring-validation/references/refactoring-test-checklist.md +25 -0
- package/localized/zh-CN/skills/fec-security-review/SKILL.md +16 -0
- package/localized/zh-CN/skills/fec-security-review/references/report-template.md +10 -0
- package/localized/zh-CN/skills/fec-tdd-workflow/SKILL.md +3 -0
- package/localized/zh-CN/skills/metadata.json +408 -50
- package/localized/zh-CN/skills/relations.json +271 -3
- package/localized/zh-CN/templates/shared/rules/fec-agent-workflow.md +1 -0
- package/openclaw.plugin.json +2 -3
- package/package.json +27 -17
- package/skills/eval_queries.json +244 -0
- package/skills/fec-code-review/SKILL.md +20 -1
- package/skills/fec-code-review/references/report-template.md +11 -1
- package/skills/fec-code-smells/SKILL.md +33 -0
- package/skills/fec-code-smells/references/detection-guide.md +25 -0
- package/skills/fec-code-smells/references/smell-catalog.md +861 -0
- package/skills/fec-code-smells/references/smell-to-refactoring-map.md +265 -0
- package/skills/fec-data-fetching/SKILL.md +1 -1
- package/skills/fec-image-generation/SKILL.md +31 -1
- package/skills/fec-image-generation/assets/quality-examples/README.md +14 -0
- package/skills/fec-image-generation/assets/quality-examples/architecture.json +121 -0
- package/skills/fec-image-generation/assets/quality-examples/invalid-explicit.json +41 -0
- package/skills/fec-image-generation/assets/quality-examples/sequence.json +53 -0
- package/skills/fec-image-generation/assets/quality-examples/sequence.mmd +21 -0
- package/skills/fec-image-generation/assets/quality-examples/workflow.json +98 -0
- package/skills/fec-image-generation/assets/quality-examples/workflow.mmd +7 -0
- package/skills/fec-image-generation/references/diagram-workflows.md +10 -3
- package/skills/fec-image-generation/references/html-technical-diagrams.md +8 -1
- package/skills/fec-image-generation/references/png-qa-autofix.md +9 -2
- package/skills/fec-image-generation/scripts/diagram-browser.mjs +90 -0
- package/skills/fec-image-generation/scripts/diagram-layout.mjs +176 -0
- package/skills/fec-image-generation/scripts/export-diagram.mjs +48 -80
- package/skills/fec-image-generation/scripts/mermaid-render.mjs +64 -0
- package/skills/fec-image-generation/scripts/png-qa.mjs +35 -4
- package/skills/fec-image-generation/scripts/tech-diagram-render.mjs +193 -53
- package/skills/fec-legacy-web-standard/SKILL.md +1 -1
- package/skills/fec-refactor-clean/SKILL.md +3 -0
- package/skills/fec-refactoring/SKILL.md +83 -0
- package/skills/fec-refactoring/references/principles.md +60 -0
- package/skills/fec-refactoring/references/refactoring-vs-feature-change.md +27 -0
- package/skills/fec-refactoring/references/when-to-refactor.md +31 -0
- package/skills/fec-refactoring/references/workflow.md +90 -0
- package/skills/fec-refactoring-api/SKILL.md +25 -0
- package/skills/fec-refactoring-api/references/api-refactorings.md +496 -0
- package/skills/fec-refactoring-catalog/SKILL.md +28 -0
- package/skills/fec-refactoring-catalog/references/catalog-index.md +99 -0
- package/skills/fec-refactoring-catalog/references/composition-guide.md +49 -0
- package/skills/fec-refactoring-catalog/references/selection-guide.md +47 -0
- package/skills/fec-refactoring-control/SKILL.md +25 -0
- package/skills/fec-refactoring-control/references/conditional-refactorings.md +299 -0
- package/skills/fec-refactoring-data/SKILL.md +25 -0
- package/skills/fec-refactoring-data/references/data-refactorings.md +248 -0
- package/skills/fec-refactoring-encapsulation/SKILL.md +25 -0
- package/skills/fec-refactoring-encapsulation/references/encapsulation-refactorings.md +452 -0
- package/skills/fec-refactoring-functions/SKILL.md +25 -0
- package/skills/fec-refactoring-functions/references/function-refactorings.md +567 -0
- package/skills/fec-refactoring-inheritance/SKILL.md +25 -0
- package/skills/fec-refactoring-inheritance/references/inheritance-refactorings.md +550 -0
- package/skills/fec-refactoring-move-features/SKILL.md +25 -0
- package/skills/fec-refactoring-move-features/references/moving-refactorings.md +453 -0
- package/skills/fec-refactoring-validation/SKILL.md +59 -0
- package/skills/fec-refactoring-validation/references/behavior-preservation.md +53 -0
- package/skills/fec-refactoring-validation/references/refactoring-test-checklist.md +42 -0
- package/skills/fec-security-review/SKILL.md +16 -0
- package/skills/fec-security-review/references/report-template.md +10 -0
- package/skills/fec-tdd-workflow/SKILL.md +5 -1
- package/skills/metadata.json +434 -71
- package/skills/relations.json +264 -0
- package/templates/shared/rules/fec-agent-workflow.md +1 -0
- package/docs/superpowers/plans/2026-05-29-fec-debug.md +0 -491
- package/docs/superpowers/specs/2026-05-29-fec-debug-design.md +0 -340
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
# Moving Feature Refactorings
|
|
2
|
+
|
|
3
|
+
These cards transform the supplied standard catalog into concise operational guidance for frontend agents. Standard IDs/names are preserved; examples and framework adaptations are original.
|
|
4
|
+
|
|
5
|
+
## RF-MOVE-FUNCTION — Move Function
|
|
6
|
+
|
|
7
|
+
### Intent
|
|
8
|
+
Move behavior to the module that owns most of the data it uses or the responsibility it represents.
|
|
9
|
+
|
|
10
|
+
### Typical Signals
|
|
11
|
+
- A function depends more on another module’s data than its current home.
|
|
12
|
+
|
|
13
|
+
### Avoid When
|
|
14
|
+
- Do not move orchestration merely because it calls several collaborators; coordination may be its responsibility.
|
|
15
|
+
|
|
16
|
+
### Preconditions
|
|
17
|
+
- Current observable behavior and affected callers are understood.
|
|
18
|
+
- The target scope is inside a declared diff budget and can be verified after this one primary transformation.
|
|
19
|
+
|
|
20
|
+
### Mechanics
|
|
21
|
+
1. Identify data ownership and change responsibility.
|
|
22
|
+
2. Create/copy the function at the destination with a narrow interface.
|
|
23
|
+
3. Delegate from the old location while migrating callers.
|
|
24
|
+
4. Remove the old location only when dependencies and public contracts permit.
|
|
25
|
+
|
|
26
|
+
### Behavior-Preservation Checkpoints
|
|
27
|
+
- Compare inputs, outputs, exceptions, side effects, ordering, and public contracts before/after the step.
|
|
28
|
+
- For frontend code, also check UI state, events, focus, network behavior, lifecycle/state transitions, and relevant identity semantics.
|
|
29
|
+
|
|
30
|
+
### Related Code Smells
|
|
31
|
+
- `SMELL-DIVERGENT-CHANGE`
|
|
32
|
+
- `SMELL-SHOTGUN-SURGERY`
|
|
33
|
+
- `SMELL-FEATURE-ENVY`
|
|
34
|
+
- `SMELL-TEMPORARY-FIELD`
|
|
35
|
+
- `SMELL-MESSAGE-CHAINS`
|
|
36
|
+
- `SMELL-INSIDER-TRADING`
|
|
37
|
+
- `SMELL-ALTERNATIVE-CLASSES-DIFFERENT-INTERFACES`
|
|
38
|
+
- `SMELL-DATA-CLASS`
|
|
39
|
+
|
|
40
|
+
### Composes Well With
|
|
41
|
+
- Combine only with a separately justified next transformation; no fixed sequence is required.
|
|
42
|
+
|
|
43
|
+
### JavaScript Notes
|
|
44
|
+
- Module initialization order, circular imports, closures, and dynamic imports can make a textual move behavior-changing.
|
|
45
|
+
|
|
46
|
+
### TypeScript Notes
|
|
47
|
+
- Preserve exported types, path aliases, package boundaries, and type-only/runtime import distinctions.
|
|
48
|
+
|
|
49
|
+
### React Notes
|
|
50
|
+
- Check Hook rules, Server/Client boundaries, lazy components, Suspense, router behavior, and event ordering when moving code.
|
|
51
|
+
|
|
52
|
+
### Vue Notes
|
|
53
|
+
- Check composable lifecycle, Pinia ownership, async setup, route guards, and auto-import conventions.
|
|
54
|
+
|
|
55
|
+
### Frontend-Craft Adaptation
|
|
56
|
+
- Place behavior with the data/change responsibility it serves, not merely in a “utilities” folder; prove dead code with the specialized cleanup lane.
|
|
57
|
+
|
|
58
|
+
### Example Transformation
|
|
59
|
+
Before: a component-local mailbox quota calculation mostly reads account policy data. After: move it to the account policy module and keep UI code declarative.
|
|
60
|
+
|
|
61
|
+
## RF-MOVE-FIELD — Move Field
|
|
62
|
+
|
|
63
|
+
### Intent
|
|
64
|
+
Move data to the object/module that conceptually owns it and changes with it.
|
|
65
|
+
|
|
66
|
+
### Typical Signals
|
|
67
|
+
- A field is read/updated mainly by another owner or repeatedly travels with another data cluster.
|
|
68
|
+
|
|
69
|
+
### Avoid When
|
|
70
|
+
- Avoid moving a public serialized field without a compatibility plan.
|
|
71
|
+
|
|
72
|
+
### Preconditions
|
|
73
|
+
- Current observable behavior and affected callers are understood.
|
|
74
|
+
- The target scope is inside a declared diff budget and can be verified after this one primary transformation.
|
|
75
|
+
|
|
76
|
+
### Mechanics
|
|
77
|
+
1. Identify the real owner and all reads/writes.
|
|
78
|
+
2. Add storage/access at the destination.
|
|
79
|
+
3. Redirect reads and writes incrementally.
|
|
80
|
+
4. Remove old storage after state synchronization is no longer required.
|
|
81
|
+
|
|
82
|
+
### Behavior-Preservation Checkpoints
|
|
83
|
+
- Compare inputs, outputs, exceptions, side effects, ordering, and public contracts before/after the step.
|
|
84
|
+
- For frontend code, also check UI state, events, focus, network behavior, lifecycle/state transitions, and relevant identity semantics.
|
|
85
|
+
|
|
86
|
+
### Related Code Smells
|
|
87
|
+
- `SMELL-SHOTGUN-SURGERY`
|
|
88
|
+
- `SMELL-INSIDER-TRADING`
|
|
89
|
+
|
|
90
|
+
### Composes Well With
|
|
91
|
+
- Combine only with a separately justified next transformation; no fixed sequence is required.
|
|
92
|
+
|
|
93
|
+
### JavaScript Notes
|
|
94
|
+
- Module initialization order, circular imports, closures, and dynamic imports can make a textual move behavior-changing.
|
|
95
|
+
|
|
96
|
+
### TypeScript Notes
|
|
97
|
+
- Preserve exported types, path aliases, package boundaries, and type-only/runtime import distinctions.
|
|
98
|
+
|
|
99
|
+
### React Notes
|
|
100
|
+
- Check Hook rules, Server/Client boundaries, lazy components, Suspense, router behavior, and event ordering when moving code.
|
|
101
|
+
|
|
102
|
+
### Vue Notes
|
|
103
|
+
- Check composable lifecycle, Pinia ownership, async setup, route guards, and auto-import conventions.
|
|
104
|
+
|
|
105
|
+
### Frontend-Craft Adaptation
|
|
106
|
+
- Place behavior with the data/change responsibility it serves, not merely in a “utilities” folder; prove dead code with the specialized cleanup lane.
|
|
107
|
+
|
|
108
|
+
### Example Transformation
|
|
109
|
+
Before: a view controller owns `quotaLimit` though policy service controls it. After: policy owns the field and UI reads through the policy boundary.
|
|
110
|
+
|
|
111
|
+
## RF-MOVE-STATEMENTS-INTO-FUNCTION — Move Statements into Function
|
|
112
|
+
|
|
113
|
+
### Intent
|
|
114
|
+
Move statements that always accompany a function call into that function so the shared operation is complete.
|
|
115
|
+
|
|
116
|
+
### Typical Signals
|
|
117
|
+
- The same setup/teardown statement appears around many calls and belongs to the called operation.
|
|
118
|
+
|
|
119
|
+
### Avoid When
|
|
120
|
+
- Do not move caller-specific policy into a generic function.
|
|
121
|
+
|
|
122
|
+
### Preconditions
|
|
123
|
+
- Current observable behavior and affected callers are understood.
|
|
124
|
+
- The target scope is inside a declared diff budget and can be verified after this one primary transformation.
|
|
125
|
+
|
|
126
|
+
### Mechanics
|
|
127
|
+
1. Find repeated adjacent statements around the call.
|
|
128
|
+
2. Move one shared statement into the callee.
|
|
129
|
+
3. Verify callers and ordering.
|
|
130
|
+
4. Repeat only for behavior truly common to all callers.
|
|
131
|
+
|
|
132
|
+
### Behavior-Preservation Checkpoints
|
|
133
|
+
- Compare inputs, outputs, exceptions, side effects, ordering, and public contracts before/after the step.
|
|
134
|
+
- For frontend code, also check UI state, events, focus, network behavior, lifecycle/state transitions, and relevant identity semantics.
|
|
135
|
+
|
|
136
|
+
### Related Code Smells
|
|
137
|
+
- No single code smell required; select from concrete structural evidence.
|
|
138
|
+
|
|
139
|
+
### Composes Well With
|
|
140
|
+
- Combine only with a separately justified next transformation; no fixed sequence is required.
|
|
141
|
+
|
|
142
|
+
### JavaScript Notes
|
|
143
|
+
- Module initialization order, circular imports, closures, and dynamic imports can make a textual move behavior-changing.
|
|
144
|
+
|
|
145
|
+
### TypeScript Notes
|
|
146
|
+
- Preserve exported types, path aliases, package boundaries, and type-only/runtime import distinctions.
|
|
147
|
+
|
|
148
|
+
### React Notes
|
|
149
|
+
- Check Hook rules, Server/Client boundaries, lazy components, Suspense, router behavior, and event ordering when moving code.
|
|
150
|
+
|
|
151
|
+
### Vue Notes
|
|
152
|
+
- Check composable lifecycle, Pinia ownership, async setup, route guards, and auto-import conventions.
|
|
153
|
+
|
|
154
|
+
### Frontend-Craft Adaptation
|
|
155
|
+
- Place behavior with the data/change responsibility it serves, not merely in a “utilities” folder; prove dead code with the specialized cleanup lane.
|
|
156
|
+
|
|
157
|
+
### Example Transformation
|
|
158
|
+
Before: every caller formats a draft ID immediately before `saveDraft`. After: `saveDraft` owns canonical ID formatting if it is always required.
|
|
159
|
+
|
|
160
|
+
## RF-MOVE-STATEMENTS-TO-CALLERS — Move Statements to Callers
|
|
161
|
+
|
|
162
|
+
### Intent
|
|
163
|
+
Move behavior out of a function when only some callers need it or its policy varies by context.
|
|
164
|
+
|
|
165
|
+
### Typical Signals
|
|
166
|
+
- A formerly common step is now caller-specific.
|
|
167
|
+
|
|
168
|
+
### Avoid When
|
|
169
|
+
- Avoid duplicating logic when the behavior is still a stable invariant of every caller.
|
|
170
|
+
|
|
171
|
+
### Preconditions
|
|
172
|
+
- Current observable behavior and affected callers are understood.
|
|
173
|
+
- The target scope is inside a declared diff budget and can be verified after this one primary transformation.
|
|
174
|
+
|
|
175
|
+
### Mechanics
|
|
176
|
+
1. Identify the statement whose policy varies.
|
|
177
|
+
2. Expose or split the callee so callers can perform the varying step.
|
|
178
|
+
3. Move the statement to one caller at a time.
|
|
179
|
+
4. Verify ordering and shared invariants.
|
|
180
|
+
|
|
181
|
+
### Behavior-Preservation Checkpoints
|
|
182
|
+
- Compare inputs, outputs, exceptions, side effects, ordering, and public contracts before/after the step.
|
|
183
|
+
- For frontend code, also check UI state, events, focus, network behavior, lifecycle/state transitions, and relevant identity semantics.
|
|
184
|
+
|
|
185
|
+
### Related Code Smells
|
|
186
|
+
- No single code smell required; select from concrete structural evidence.
|
|
187
|
+
|
|
188
|
+
### Composes Well With
|
|
189
|
+
- Combine only with a separately justified next transformation; no fixed sequence is required.
|
|
190
|
+
|
|
191
|
+
### JavaScript Notes
|
|
192
|
+
- Module initialization order, circular imports, closures, and dynamic imports can make a textual move behavior-changing.
|
|
193
|
+
|
|
194
|
+
### TypeScript Notes
|
|
195
|
+
- Preserve exported types, path aliases, package boundaries, and type-only/runtime import distinctions.
|
|
196
|
+
|
|
197
|
+
### React Notes
|
|
198
|
+
- Check Hook rules, Server/Client boundaries, lazy components, Suspense, router behavior, and event ordering when moving code.
|
|
199
|
+
|
|
200
|
+
### Vue Notes
|
|
201
|
+
- Check composable lifecycle, Pinia ownership, async setup, route guards, and auto-import conventions.
|
|
202
|
+
|
|
203
|
+
### Frontend-Craft Adaptation
|
|
204
|
+
- Place behavior with the data/change responsibility it serves, not merely in a “utilities” folder; prove dead code with the specialized cleanup lane.
|
|
205
|
+
|
|
206
|
+
### Example Transformation
|
|
207
|
+
Before: `loadMessages` always shows a toast, but background refresh must not. After: callers decide whether to notify after loading.
|
|
208
|
+
|
|
209
|
+
## RF-REPLACE-INLINE-CODE-WITH-FUNCTION-CALL — Replace Inline Code with Function Call
|
|
210
|
+
|
|
211
|
+
### Intent
|
|
212
|
+
Use an existing function instead of duplicating equivalent inline logic.
|
|
213
|
+
|
|
214
|
+
### Typical Signals
|
|
215
|
+
- Inline logic already has a trustworthy named implementation elsewhere.
|
|
216
|
+
|
|
217
|
+
### Avoid When
|
|
218
|
+
- Do not replace merely similar logic when semantics or edge cases differ.
|
|
219
|
+
|
|
220
|
+
### Preconditions
|
|
221
|
+
- Current observable behavior and affected callers are understood.
|
|
222
|
+
- The target scope is inside a declared diff budget and can be verified after this one primary transformation.
|
|
223
|
+
|
|
224
|
+
### Mechanics
|
|
225
|
+
1. Prove equivalence between inline code and the existing function.
|
|
226
|
+
2. Replace one occurrence with the call.
|
|
227
|
+
3. Verify result, error, and evaluation semantics.
|
|
228
|
+
4. Remove any now-unused local helpers.
|
|
229
|
+
|
|
230
|
+
### Behavior-Preservation Checkpoints
|
|
231
|
+
- Compare inputs, outputs, exceptions, side effects, ordering, and public contracts before/after the step.
|
|
232
|
+
- For frontend code, also check UI state, events, focus, network behavior, lifecycle/state transitions, and relevant identity semantics.
|
|
233
|
+
|
|
234
|
+
### Related Code Smells
|
|
235
|
+
- No single code smell required; select from concrete structural evidence.
|
|
236
|
+
|
|
237
|
+
### Composes Well With
|
|
238
|
+
- Combine only with a separately justified next transformation; no fixed sequence is required.
|
|
239
|
+
|
|
240
|
+
### JavaScript Notes
|
|
241
|
+
- Module initialization order, circular imports, closures, and dynamic imports can make a textual move behavior-changing.
|
|
242
|
+
|
|
243
|
+
### TypeScript Notes
|
|
244
|
+
- Preserve exported types, path aliases, package boundaries, and type-only/runtime import distinctions.
|
|
245
|
+
|
|
246
|
+
### React Notes
|
|
247
|
+
- Check Hook rules, Server/Client boundaries, lazy components, Suspense, router behavior, and event ordering when moving code.
|
|
248
|
+
|
|
249
|
+
### Vue Notes
|
|
250
|
+
- Check composable lifecycle, Pinia ownership, async setup, route guards, and auto-import conventions.
|
|
251
|
+
|
|
252
|
+
### Frontend-Craft Adaptation
|
|
253
|
+
- Place behavior with the data/change responsibility it serves, not merely in a “utilities” folder; prove dead code with the specialized cleanup lane.
|
|
254
|
+
|
|
255
|
+
### Example Transformation
|
|
256
|
+
Before: an inline loop checks whether a folder is special. After: call the existing `isSpecialFolder(id)` helper when semantics match exactly.
|
|
257
|
+
|
|
258
|
+
## RF-SLIDE-STATEMENTS — Slide Statements
|
|
259
|
+
|
|
260
|
+
### Intent
|
|
261
|
+
Reorder statements so related code is adjacent and a later extraction or simplification becomes possible.
|
|
262
|
+
|
|
263
|
+
### Typical Signals
|
|
264
|
+
- Statements that belong together are separated by unrelated work.
|
|
265
|
+
|
|
266
|
+
### Avoid When
|
|
267
|
+
- Do not reorder across side effects, awaits, exceptions, subscriptions, or reads/writes whose order is observable.
|
|
268
|
+
|
|
269
|
+
### Preconditions
|
|
270
|
+
- Current observable behavior and affected callers are understood.
|
|
271
|
+
- The target scope is inside a declared diff budget and can be verified after this one primary transformation.
|
|
272
|
+
|
|
273
|
+
### Mechanics
|
|
274
|
+
1. Map dependencies and side effects between statements.
|
|
275
|
+
2. Move the smallest statement across only independent operations.
|
|
276
|
+
3. Verify after each move.
|
|
277
|
+
4. Stop when the intended cluster is adjacent.
|
|
278
|
+
|
|
279
|
+
### Behavior-Preservation Checkpoints
|
|
280
|
+
- Compare inputs, outputs, exceptions, side effects, ordering, and public contracts before/after the step.
|
|
281
|
+
- For frontend code, also check UI state, events, focus, network behavior, lifecycle/state transitions, and relevant identity semantics.
|
|
282
|
+
|
|
283
|
+
### Related Code Smells
|
|
284
|
+
- `SMELL-DUPLICATED-CODE`
|
|
285
|
+
- `SMELL-MUTABLE-DATA`
|
|
286
|
+
|
|
287
|
+
### Composes Well With
|
|
288
|
+
- Combine only with a separately justified next transformation; no fixed sequence is required.
|
|
289
|
+
|
|
290
|
+
### JavaScript Notes
|
|
291
|
+
- Module initialization order, circular imports, closures, and dynamic imports can make a textual move behavior-changing.
|
|
292
|
+
|
|
293
|
+
### TypeScript Notes
|
|
294
|
+
- Preserve exported types, path aliases, package boundaries, and type-only/runtime import distinctions.
|
|
295
|
+
|
|
296
|
+
### React Notes
|
|
297
|
+
- Check Hook rules, Server/Client boundaries, lazy components, Suspense, router behavior, and event ordering when moving code.
|
|
298
|
+
|
|
299
|
+
### Vue Notes
|
|
300
|
+
- Check composable lifecycle, Pinia ownership, async setup, route guards, and auto-import conventions.
|
|
301
|
+
|
|
302
|
+
### Frontend-Craft Adaptation
|
|
303
|
+
- Place behavior with the data/change responsibility it serves, not merely in a “utilities” folder; prove dead code with the specialized cleanup lane.
|
|
304
|
+
|
|
305
|
+
### Example Transformation
|
|
306
|
+
Before: two normalization statements are separated by an unrelated analytics call. After: move only if analytics timing and data dependencies are unchanged.
|
|
307
|
+
|
|
308
|
+
## RF-SPLIT-LOOP — Split Loop
|
|
309
|
+
|
|
310
|
+
### Intent
|
|
311
|
+
Separate a loop that performs multiple independent tasks into focused passes.
|
|
312
|
+
|
|
313
|
+
### Typical Signals
|
|
314
|
+
- One loop computes unrelated results with separate accumulators.
|
|
315
|
+
|
|
316
|
+
### Avoid When
|
|
317
|
+
- Avoid when the extra pass is materially expensive or iteration order/side effects couple the tasks.
|
|
318
|
+
|
|
319
|
+
### Preconditions
|
|
320
|
+
- Current observable behavior and affected callers are understood.
|
|
321
|
+
- The target scope is inside a declared diff budget and can be verified after this one primary transformation.
|
|
322
|
+
|
|
323
|
+
### Mechanics
|
|
324
|
+
1. Identify independent loop responsibilities.
|
|
325
|
+
2. Duplicate the iteration and keep one responsibility in each pass.
|
|
326
|
+
3. Verify outputs/order/performance.
|
|
327
|
+
4. Then extract or pipeline individual loops if useful.
|
|
328
|
+
|
|
329
|
+
### Behavior-Preservation Checkpoints
|
|
330
|
+
- Compare inputs, outputs, exceptions, side effects, ordering, and public contracts before/after the step.
|
|
331
|
+
- For frontend code, also check UI state, events, focus, network behavior, lifecycle/state transitions, and relevant identity semantics.
|
|
332
|
+
|
|
333
|
+
### Related Code Smells
|
|
334
|
+
- `SMELL-LONG-FUNCTION`
|
|
335
|
+
|
|
336
|
+
### Composes Well With
|
|
337
|
+
- Combine only with a separately justified next transformation; no fixed sequence is required.
|
|
338
|
+
|
|
339
|
+
### JavaScript Notes
|
|
340
|
+
- Module initialization order, circular imports, closures, and dynamic imports can make a textual move behavior-changing.
|
|
341
|
+
|
|
342
|
+
### TypeScript Notes
|
|
343
|
+
- Preserve exported types, path aliases, package boundaries, and type-only/runtime import distinctions.
|
|
344
|
+
|
|
345
|
+
### React Notes
|
|
346
|
+
- Check Hook rules, Server/Client boundaries, lazy components, Suspense, router behavior, and event ordering when moving code.
|
|
347
|
+
|
|
348
|
+
### Vue Notes
|
|
349
|
+
- Check composable lifecycle, Pinia ownership, async setup, route guards, and auto-import conventions.
|
|
350
|
+
|
|
351
|
+
### Frontend-Craft Adaptation
|
|
352
|
+
- Place behavior with the data/change responsibility it serves, not merely in a “utilities” folder; prove dead code with the specialized cleanup lane.
|
|
353
|
+
|
|
354
|
+
### Example Transformation
|
|
355
|
+
Before: one loop both counts unread messages and builds attachment names. After: split into two focused passes when collection size and order permit.
|
|
356
|
+
|
|
357
|
+
## RF-REPLACE-LOOP-WITH-PIPELINE — Replace Loop with Pipeline
|
|
358
|
+
|
|
359
|
+
### Intent
|
|
360
|
+
Express a collection transformation as a sequence of named filter/map/reduce-style operations.
|
|
361
|
+
|
|
362
|
+
### Typical Signals
|
|
363
|
+
- An imperative loop mostly filters, maps, or accumulates data and bookkeeping hides intent.
|
|
364
|
+
|
|
365
|
+
### Avoid When
|
|
366
|
+
- Keep loops for early exits, complex mutation, tight performance constraints, or async sequencing when clearer.
|
|
367
|
+
|
|
368
|
+
### Preconditions
|
|
369
|
+
- Current observable behavior and affected callers are understood.
|
|
370
|
+
- The target scope is inside a declared diff budget and can be verified after this one primary transformation.
|
|
371
|
+
|
|
372
|
+
### Mechanics
|
|
373
|
+
1. Identify the element-level transformation stages.
|
|
374
|
+
2. Replace one stage with an equivalent collection operation.
|
|
375
|
+
3. Preserve ordering and callback semantics.
|
|
376
|
+
4. Verify empty inputs, errors, and performance-sensitive paths.
|
|
377
|
+
|
|
378
|
+
### Behavior-Preservation Checkpoints
|
|
379
|
+
- Compare inputs, outputs, exceptions, side effects, ordering, and public contracts before/after the step.
|
|
380
|
+
- For frontend code, also check UI state, events, focus, network behavior, lifecycle/state transitions, and relevant identity semantics.
|
|
381
|
+
|
|
382
|
+
### Related Code Smells
|
|
383
|
+
- `SMELL-LOOPS`
|
|
384
|
+
|
|
385
|
+
### Composes Well With
|
|
386
|
+
- Combine only with a separately justified next transformation; no fixed sequence is required.
|
|
387
|
+
|
|
388
|
+
### JavaScript Notes
|
|
389
|
+
- Module initialization order, circular imports, closures, and dynamic imports can make a textual move behavior-changing.
|
|
390
|
+
|
|
391
|
+
### TypeScript Notes
|
|
392
|
+
- Preserve exported types, path aliases, package boundaries, and type-only/runtime import distinctions.
|
|
393
|
+
|
|
394
|
+
### React Notes
|
|
395
|
+
- Check Hook rules, Server/Client boundaries, lazy components, Suspense, router behavior, and event ordering when moving code.
|
|
396
|
+
|
|
397
|
+
### Vue Notes
|
|
398
|
+
- Check composable lifecycle, Pinia ownership, async setup, route guards, and auto-import conventions.
|
|
399
|
+
|
|
400
|
+
### Frontend-Craft Adaptation
|
|
401
|
+
- Place behavior with the data/change responsibility it serves, not merely in a “utilities” folder; prove dead code with the specialized cleanup lane.
|
|
402
|
+
|
|
403
|
+
### Example Transformation
|
|
404
|
+
Before: push matching attachment names into an array inside a loop. After: `attachments.filter(isVisible).map(a => a.name)` when behavior matches.
|
|
405
|
+
|
|
406
|
+
## RF-REMOVE-DEAD-CODE — Remove Dead Code
|
|
407
|
+
|
|
408
|
+
### Intent
|
|
409
|
+
Remove code proven to have no reachable runtime or supported-tooling use.
|
|
410
|
+
|
|
411
|
+
### Typical Signals
|
|
412
|
+
- A function, export, branch, asset, style, route, or dependency has no legitimate references.
|
|
413
|
+
|
|
414
|
+
### Avoid When
|
|
415
|
+
- Do not infer deadness from grep alone when dynamic imports, routes, Storybook, i18n, Tailwind classes, runtime templates, or external consumers may reference it.
|
|
416
|
+
|
|
417
|
+
### Preconditions
|
|
418
|
+
- Current observable behavior and affected callers are understood.
|
|
419
|
+
- The target scope is inside a declared diff budget and can be verified after this one primary transformation.
|
|
420
|
+
|
|
421
|
+
### Mechanics
|
|
422
|
+
1. Prove unused status across static and dynamic reference channels.
|
|
423
|
+
2. Classify risk before deletion.
|
|
424
|
+
3. Use the dedicated cleanup workflow for actual removal.
|
|
425
|
+
4. Run relevant build/tests after deletion.
|
|
426
|
+
|
|
427
|
+
### Behavior-Preservation Checkpoints
|
|
428
|
+
- Compare inputs, outputs, exceptions, side effects, ordering, and public contracts before/after the step.
|
|
429
|
+
- For frontend code, also check UI state, events, focus, network behavior, lifecycle/state transitions, and relevant identity semantics.
|
|
430
|
+
|
|
431
|
+
### Related Code Smells
|
|
432
|
+
- `SMELL-SPECULATIVE-GENERALITY`
|
|
433
|
+
|
|
434
|
+
### Composes Well With
|
|
435
|
+
- Combine only with a separately justified next transformation; no fixed sequence is required.
|
|
436
|
+
|
|
437
|
+
### JavaScript Notes
|
|
438
|
+
- Module initialization order, circular imports, closures, and dynamic imports can make a textual move behavior-changing.
|
|
439
|
+
|
|
440
|
+
### TypeScript Notes
|
|
441
|
+
- Preserve exported types, path aliases, package boundaries, and type-only/runtime import distinctions.
|
|
442
|
+
|
|
443
|
+
### React Notes
|
|
444
|
+
- Check Hook rules, Server/Client boundaries, lazy components, Suspense, router behavior, and event ordering when moving code.
|
|
445
|
+
|
|
446
|
+
### Vue Notes
|
|
447
|
+
- Check composable lifecycle, Pinia ownership, async setup, route guards, and auto-import conventions.
|
|
448
|
+
|
|
449
|
+
### Frontend-Craft Adaptation
|
|
450
|
+
- Place behavior with the data/change responsibility it serves, not merely in a “utilities” folder; prove dead code with the specialized cleanup lane.
|
|
451
|
+
|
|
452
|
+
### Example Transformation
|
|
453
|
+
Before: an obsolete component appears unused. After: route actual proof and deletion through `fec-refactor-clean`, including dynamic-reference checks.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fec-refactoring-validation
|
|
3
|
+
description: Use when proving that a frontend refactoring preserved existing behavior, selecting an appropriate safety net, validating each structural step, or assigning a PASS, PARTIAL, or NOT PROVEN preservation verdict.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: Refactoring Validation
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Define the observable contract and the smallest credible evidence needed to prove that structural edits preserved existing frontend behavior.
|
|
11
|
+
|
|
12
|
+
## Procedure
|
|
13
|
+
|
|
14
|
+
1. Record the relevant behavior contract before substantial edits.
|
|
15
|
+
2. Classify safety-net coverage as A, B, or C.
|
|
16
|
+
3. Run and record the pre-change baseline.
|
|
17
|
+
4. Match verification to the current refactoring risk and affected boundary.
|
|
18
|
+
5. After every structural step, run the narrowest sufficient check immediately.
|
|
19
|
+
6. If a newly introduced failure appears, revert that step before broader repair.
|
|
20
|
+
7. At the end, run the broad gates justified by the affected surface.
|
|
21
|
+
8. Assign PASS, PARTIAL, or NOT PROVEN from evidence, not optimism.
|
|
22
|
+
|
|
23
|
+
Pure structural work uses **GREEN → REFACTOR → GREEN**.
|
|
24
|
+
|
|
25
|
+
## Safety-Net Levels
|
|
26
|
+
|
|
27
|
+
| Level | Evidence | Execution guidance |
|
|
28
|
+
| --- | --- | --- |
|
|
29
|
+
| A — Strong | Existing tests cover relevant behavior | Use tests as the primary safety net |
|
|
30
|
+
| B — Partial | Important behavior is only partly covered | Add focused characterization of current behavior before risky steps |
|
|
31
|
+
| C — None | No useful automated behavior coverage | Do not auto-install a framework; keep CAUTION/DANGER plan-only unless a minimal safety net is authorized |
|
|
32
|
+
|
|
33
|
+
## Frontend Contract Checklist
|
|
34
|
+
|
|
35
|
+
Check relevant items, not every item mechanically:
|
|
36
|
+
|
|
37
|
+
- function inputs, outputs, exceptions, and error mapping;
|
|
38
|
+
- DOM structure that consumers depend on, visible states, focus, keyboard flow, and accessibility semantics;
|
|
39
|
+
- props, emits, slots, hook/composable return values, and event ordering;
|
|
40
|
+
- requests, payloads, cancellation, retries, cache keys, and loading/error transitions;
|
|
41
|
+
- store state, persistence, object identity, memoization, refs/reactivity, and lifecycle timing;
|
|
42
|
+
- routes, URLs, guards, package exports, serialized fields, and backend-facing DTOs.
|
|
43
|
+
|
|
44
|
+
## References
|
|
45
|
+
|
|
46
|
+
- Load [behavior-preservation.md](references/behavior-preservation.md) for contract construction and proof levels.
|
|
47
|
+
- Load [refactoring-test-checklist.md](references/refactoring-test-checklist.md) for targeted verification by frontend risk.
|
|
48
|
+
|
|
49
|
+
## Constraints
|
|
50
|
+
|
|
51
|
+
- Passing unrelated tests does not prove preservation.
|
|
52
|
+
- A green test written only after the change is weaker evidence than a pre-change baseline or characterization test.
|
|
53
|
+
- Do not rewrite expected values simply because the refactor changed behavior.
|
|
54
|
+
- Do not hide missing proof behind a PASS label.
|
|
55
|
+
- Do not install a new test framework without explicit authorization.
|
|
56
|
+
|
|
57
|
+
## Expected Output
|
|
58
|
+
|
|
59
|
+
A behavior-preservation record containing baseline status, safety-net level, per-step checks, final validation, unresolved coverage gaps, and a PASS/PARTIAL/NOT PROVEN verdict.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Behavior Preservation
|
|
2
|
+
|
|
3
|
+
## Build the Contract
|
|
4
|
+
|
|
5
|
+
Before changing structure, identify which observations must remain stable. Use the smallest contract that fully covers the affected boundary.
|
|
6
|
+
|
|
7
|
+
### Functional contract
|
|
8
|
+
|
|
9
|
+
- accepted inputs and normalization;
|
|
10
|
+
- return values and output ordering;
|
|
11
|
+
- errors, exceptions, and fallback behavior;
|
|
12
|
+
- side effects and significant ordering.
|
|
13
|
+
|
|
14
|
+
### UI contract
|
|
15
|
+
|
|
16
|
+
- rendered states and user-visible text/data;
|
|
17
|
+
- enabled/disabled behavior;
|
|
18
|
+
- focus and keyboard transitions;
|
|
19
|
+
- event/callback ordering;
|
|
20
|
+
- accessibility relationships that users or tests rely on.
|
|
21
|
+
|
|
22
|
+
### State and async contract
|
|
23
|
+
|
|
24
|
+
- store transitions and persistence;
|
|
25
|
+
- request count, URL, method, payload, cancellation, retry, and error mapping;
|
|
26
|
+
- loading/error/empty state timing;
|
|
27
|
+
- React identity/memoization and hook dependency semantics;
|
|
28
|
+
- Vue `ref`, `reactive`, `computed`, `watch`, and lifecycle identity/timing.
|
|
29
|
+
|
|
30
|
+
### Public contract
|
|
31
|
+
|
|
32
|
+
- exported symbols and call signatures;
|
|
33
|
+
- routes and URL parameters;
|
|
34
|
+
- serialized fields and API DTOs;
|
|
35
|
+
- extension, plugin, template, or runtime registration points.
|
|
36
|
+
|
|
37
|
+
## Characterization Tests
|
|
38
|
+
|
|
39
|
+
When behavior is important but weakly covered, write a narrow test that captures current behavior before a risky structural edit. It may pass immediately because it records the existing contract. Do not broaden it into a new requirement.
|
|
40
|
+
|
|
41
|
+
## Verdicts
|
|
42
|
+
|
|
43
|
+
### PASS
|
|
44
|
+
|
|
45
|
+
Use only when the relevant contract is well identified, the before/after baseline is comparable, and all required checks pass.
|
|
46
|
+
|
|
47
|
+
### PARTIAL
|
|
48
|
+
|
|
49
|
+
Use when checks pass but meaningful paths remain untested or only static/manual evidence covers an important boundary.
|
|
50
|
+
|
|
51
|
+
### NOT PROVEN
|
|
52
|
+
|
|
53
|
+
Use when dependencies cannot be installed, required tools cannot run, the baseline is ambiguous, or the safety net cannot credibly distinguish preservation from accidental behavior change.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Refactoring Test Checklist
|
|
2
|
+
|
|
3
|
+
## Local Function or Module
|
|
4
|
+
|
|
5
|
+
- targeted unit tests for inputs, outputs, and errors;
|
|
6
|
+
- typecheck of affected package/module;
|
|
7
|
+
- callers compile with unchanged contracts;
|
|
8
|
+
- no public export change unless planned.
|
|
9
|
+
|
|
10
|
+
## React
|
|
11
|
+
|
|
12
|
+
- hook order and dependency arrays remain valid;
|
|
13
|
+
- stale closure behavior is not introduced;
|
|
14
|
+
- controlled/uncontrolled ownership remains stable;
|
|
15
|
+
- memoization or referential equality assumptions are preserved;
|
|
16
|
+
- effect cleanup, request cancellation, and event order remain stable;
|
|
17
|
+
- Server/Client boundaries and hydration behavior are unchanged when relevant.
|
|
18
|
+
|
|
19
|
+
## Vue
|
|
20
|
+
|
|
21
|
+
- `ref`/`reactive` identity and unwrapping semantics remain stable;
|
|
22
|
+
- computed values stay derived rather than duplicated mutable state;
|
|
23
|
+
- watchers keep intended source, flush timing, and cleanup;
|
|
24
|
+
- props, emits, slots, and expose contracts remain stable;
|
|
25
|
+
- Pinia store ownership and persistence remain stable.
|
|
26
|
+
|
|
27
|
+
## API and Data
|
|
28
|
+
|
|
29
|
+
- request shape, headers, auth refresh, cancellation, retry, and errors remain stable;
|
|
30
|
+
- field renames do not cross DTO, storage, query-string, or backend contracts unintentionally;
|
|
31
|
+
- sorting/filtering transformations preserve order, duplicates, and edge cases;
|
|
32
|
+
- reference-to-value or value-to-reference changes preserve required identity semantics.
|
|
33
|
+
|
|
34
|
+
## Routing and Runtime Registration
|
|
35
|
+
|
|
36
|
+
- route names/paths/guards remain stable;
|
|
37
|
+
- dynamic imports and lazy registrations remain discoverable;
|
|
38
|
+
- Storybook, i18n, CSS/Tailwind dynamic classes, runtime templates, and generated metadata are not broken by search-only reasoning.
|
|
39
|
+
|
|
40
|
+
## Final Ladder
|
|
41
|
+
|
|
42
|
+
Run available checks from narrowest to broadest: targeted tests -> affected integration tests -> lint/typecheck -> full tests -> build -> E2E/SSR/visual/a11y/performance specialty gates when the refactoring touches those risks.
|
|
@@ -5,6 +5,22 @@ description: Use when reviewing frontend security risks such as XSS, CSRF, sensi
|
|
|
5
5
|
|
|
6
6
|
# Front-end security review
|
|
7
7
|
|
|
8
|
+
## Review modes and coverage
|
|
9
|
+
|
|
10
|
+
User-specified scope takes precedence over the default. Use the following three review modes:
|
|
11
|
+
|
|
12
|
+
- **Change review**: only when recent changes, current edits, staged changes, a PR or a commit are explicitly requested or clearly established by the active task, review those changes and necessary context. For local changes, inspect staged and unstaged diffs and relevant untracked project files within the requested scope; a staged-only request reviews only staged changes. If there are no changes, report that there is nothing to review; do not switch to recent commits or expand scope automatically.
|
|
13
|
+
- **Targeted review**: when files or directories are specified, inventory and review existing code in that scope, including unchanged code; no Git diff is required.
|
|
14
|
+
- **Project review (default)**: when no scope or change context is specified, or when the entire project is requested, inventory project-owned frontend code, related tests, configuration and dependency declarations, then review in module batches, including unchanged code; no Git diff is required.
|
|
15
|
+
|
|
16
|
+
Select scope before collecting diffs. A file/directory alone means full review of that scope; a path combined with an explicit change request restricts incremental review to that path. An unqualified invocation defaults to project review even if Git changes exist. At review start, state the selected mode and target scope. When automatically delegating review after edits, pass the current change scope explicitly; do not trigger project review merely because the reviewer was called.
|
|
17
|
+
|
|
18
|
+
Exclude dependency directories, build outputs, caches, generated files and third-party code by default, and record exclusions. Keep the frontend responsibility boundary; this is not a backend audit. A nonexistent target or a scope with no relevant files must be reported explicitly, not replaced with another scope.
|
|
19
|
+
|
|
20
|
+
Merge findings with the same root cause across batches. Report **review mode, target scope, reviewed files/modules, exclusions, unreviewed files/modules, completion status and verification commands/results**. If context or execution limits prevent completion, mark the review partial and list remaining modules; never claim complete project coverage. Reading callers for context or running project-wide lint/typecheck does not count as manual review of those files.
|
|
21
|
+
|
|
22
|
+
Change reviews retain merge recommendations. Targeted and project reviews use a risk assessment (Low / Medium / High, with blocking findings), not a claim of merge readiness. Preserve severity levels, evidence requirements and report filenames. Output reports only unless repairs are explicitly requested.
|
|
23
|
+
|
|
8
24
|
## Purpose
|
|
9
25
|
|
|
10
26
|
Identify client-side security risks in front-end code and recommend actionable fixes.
|
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
> Generation time: YYYY-MM-DD HH:mm
|
|
7
7
|
> Review tool: frontend-craft
|
|
8
8
|
|
|
9
|
+
> Review mode: change / targeted / project
|
|
10
|
+
> Target scope: paths or PR/commit
|
|
11
|
+
> Reviewed: file or module inventory
|
|
12
|
+
> Exclusions: paths and reasons
|
|
13
|
+
> Unreviewed: remaining files or modules (state none if complete)
|
|
14
|
+
> Completion: complete / partial
|
|
15
|
+
> Verification: commands, results and reasons for skipped checks
|
|
16
|
+
|
|
9
17
|
## CRITICAL / HIGH RISK (N items)
|
|
10
18
|
- **[File:line number]** Risk description -> Repair suggestions
|
|
11
19
|
|
|
@@ -25,3 +33,5 @@
|
|
|
25
33
|
```
|
|
26
34
|
|
|
27
35
|
After the review is completed, save the report to `reports/security-review-YYYY-MM-DD-HHmmss.md` and inform the user of the report path.
|
|
36
|
+
|
|
37
|
+
Retain merge recommendations for change review; use risk assessments for targeted and project reviews. For partial reviews, conclusions apply only to reviewed scope and do not establish project-wide approval.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fec-tdd-workflow
|
|
3
|
-
description: Use when implementing new frontend behavior
|
|
3
|
+
description: Use when implementing new observable frontend behavior or fixing a behavior-changing bug where a failing test can describe the missing or incorrect behavior first. Apply to components, hooks/composables, utilities, API clients, route guards, or user workflows; pure behavior-preserving refactoring uses an already-green contract instead.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Front-end TDD workflow
|
|
@@ -23,6 +23,10 @@ Use the rhythm of "write failing tests first, then implement the minimum code, a
|
|
|
23
23
|
7. Fix bugs and retain regression tests that can reproduce the problem.
|
|
24
24
|
8. Only one observable behavior is expanded in each round; new requirements, new boundaries and new abnormal paths enter the next round respectively.
|
|
25
25
|
|
|
26
|
+
## Pure Refactoring Boundary
|
|
27
|
+
|
|
28
|
+
Pure behavior-preserving refactoring does not manufacture a failing test. If existing behavior is already correct and the goal is structural only, establish or add characterization coverage that passes for the current behavior, then keep it green through each refactoring step. Use RED → GREEN → REFACTOR for new behavior or a behavior-changing defect fix; use GREEN → REFACTOR → GREEN for pure refactoring.
|
|
29
|
+
|
|
26
30
|
## Prove-It Pattern
|
|
27
31
|
|
|
28
32
|
When fixing a defect, make the test fail first, then make it pass. If it cannot fail first, it means that the test does not cover the original problem, and the input, assertion or test level needs to be narrowed.
|