@salesforce/afv-skills 1.10.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/skills/applying-cms-brand/SKILL.md +170 -0
- package/skills/implementing-ui-bundle-agentforce-conversation-client/SKILL.md +114 -198
- package/skills/implementing-ui-bundle-agentforce-conversation-client/references/agent-id-resolution.md +46 -0
- package/skills/implementing-ui-bundle-agentforce-conversation-client/references/style-tokens.md +18 -6
- package/skills/integrating-b2b-commerce-open-code-components/SKILL.md +166 -0
- package/skills/running-code-analyzer/SKILL.md +499 -0
- package/skills/running-code-analyzer/examples/README.md +38 -0
- package/skills/running-code-analyzer/examples/basic-scan-output.json +92 -0
- package/skills/running-code-analyzer/examples/command-variations.md +333 -0
- package/skills/running-code-analyzer/examples/fix-application-before-after.md +142 -0
- package/skills/running-code-analyzer/examples/large-scan-output.json +67 -0
- package/skills/running-code-analyzer/examples/security-focused-output.json +95 -0
- package/skills/running-code-analyzer/references/command-examples.md +27 -0
- package/skills/running-code-analyzer/references/engine-reference.md +34 -0
- package/skills/running-code-analyzer/references/error-handling.md +29 -0
- package/skills/running-code-analyzer/references/flag-reference.md +96 -0
- package/skills/running-code-analyzer/references/quick-start.md +28 -0
- package/skills/running-code-analyzer/references/special-behaviors.md +83 -0
- package/skills/running-code-analyzer/references/vendor-file-handling.md +239 -0
- package/skills/running-code-analyzer/scripts/apply-fixes.js +86 -0
- package/skills/running-code-analyzer/scripts/discover-fixes.js +34 -0
- package/skills/running-code-analyzer/scripts/filter-violations.js +405 -0
- package/skills/running-code-analyzer/scripts/parse-results.js +59 -0
- package/skills/running-code-analyzer/scripts/summarize-fixes.js +32 -0
- package/skills/running-code-analyzer/scripts/verify-execution.sh +28 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# Common Command Variations
|
|
2
|
+
|
|
3
|
+
Real-world command patterns with explanations. Use these as reference when building commands for specific scenarios.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Basic Scans
|
|
8
|
+
|
|
9
|
+
### 1. Scan Entire Workspace (Default)
|
|
10
|
+
```bash
|
|
11
|
+
sf code-analyzer run \
|
|
12
|
+
--rule-selector Recommended \
|
|
13
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
14
|
+
--include-fixes \
|
|
15
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
16
|
+
```
|
|
17
|
+
**When:** User says "scan my code" with no specifics.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
### 2. Security-Focused Scan
|
|
22
|
+
```bash
|
|
23
|
+
sf code-analyzer run \
|
|
24
|
+
--rule-selector "all:Security:(1,2)" \
|
|
25
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
26
|
+
--include-fixes \
|
|
27
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
28
|
+
```
|
|
29
|
+
**When:** User says "check for security issues", "find vulnerabilities", "AppExchange security review".
|
|
30
|
+
**Selector breakdown:** `all` = all engines, `:Security` = Security category only, `:(1,2)` = Critical and High severity only.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
### 3. Specific Engine
|
|
35
|
+
```bash
|
|
36
|
+
sf code-analyzer run \
|
|
37
|
+
--rule-selector "pmd" \
|
|
38
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
39
|
+
--include-fixes \
|
|
40
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
41
|
+
```
|
|
42
|
+
**When:** User says "run PMD", "check my Apex code".
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
### 4. Multiple Engines
|
|
47
|
+
```bash
|
|
48
|
+
sf code-analyzer run \
|
|
49
|
+
--rule-selector "(pmd,eslint)" \
|
|
50
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
51
|
+
--include-fixes \
|
|
52
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
53
|
+
```
|
|
54
|
+
**When:** User says "scan Apex and JavaScript", "run PMD and ESLint".
|
|
55
|
+
**Selector breakdown:** Parentheses + comma = OR logic.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Target-Specific Scans
|
|
60
|
+
|
|
61
|
+
### 5. Scan Specific File
|
|
62
|
+
```bash
|
|
63
|
+
sf code-analyzer run \
|
|
64
|
+
--rule-selector Recommended \
|
|
65
|
+
--target "force-app/main/default/classes/AccountService.cls" \
|
|
66
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
67
|
+
--include-fixes \
|
|
68
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
69
|
+
```
|
|
70
|
+
**When:** User says "scan AccountService.cls".
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
### 6. Scan Specific Folder
|
|
75
|
+
```bash
|
|
76
|
+
sf code-analyzer run \
|
|
77
|
+
--rule-selector Recommended \
|
|
78
|
+
--target "force-app/main/default/lwc" \
|
|
79
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
80
|
+
--include-fixes \
|
|
81
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
82
|
+
```
|
|
83
|
+
**When:** User says "scan my LWC components", "check the lwc folder".
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
### 7. Scan Multiple Paths
|
|
88
|
+
```bash
|
|
89
|
+
sf code-analyzer run \
|
|
90
|
+
--rule-selector Recommended \
|
|
91
|
+
--target "force-app/main/default/classes,force-app/main/default/triggers" \
|
|
92
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
93
|
+
--include-fixes \
|
|
94
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
95
|
+
```
|
|
96
|
+
**When:** User says "scan classes and triggers".
|
|
97
|
+
**Note:** Comma-separated paths in a single `--target` value.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### 8. Scan Using Glob Pattern
|
|
102
|
+
```bash
|
|
103
|
+
sf code-analyzer run \
|
|
104
|
+
--rule-selector Recommended \
|
|
105
|
+
--target "**/*.cls,**/*.trigger" \
|
|
106
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
107
|
+
--include-fixes \
|
|
108
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
109
|
+
```
|
|
110
|
+
**When:** User says "scan all Apex files", "check all classes and triggers".
|
|
111
|
+
**Note:** Glob patterns must match from workspace root.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Diff-Based Scans
|
|
116
|
+
|
|
117
|
+
### 9. Scan Changed Files (Git Diff)
|
|
118
|
+
**Step 1:** Get changed files
|
|
119
|
+
```bash
|
|
120
|
+
git diff --name-only main...HEAD
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Step 2:** Filter to scannable types (`.cls`, `.trigger`, `.js`, `.ts`, `.flow-meta.xml`, etc.)
|
|
124
|
+
|
|
125
|
+
**Step 3:** Pass as `--target`
|
|
126
|
+
```bash
|
|
127
|
+
sf code-analyzer run \
|
|
128
|
+
--rule-selector Recommended \
|
|
129
|
+
--target "force-app/main/default/classes/AccountService.cls,force-app/main/default/lwc/accountCard/accountCard.js" \
|
|
130
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
131
|
+
--include-fixes \
|
|
132
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
133
|
+
```
|
|
134
|
+
**When:** User says "scan my changes", "check what I modified", "analyze the diff".
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Advanced Scenarios
|
|
139
|
+
|
|
140
|
+
### 10. Deep Analysis with SFGE (Data Flow)
|
|
141
|
+
```bash
|
|
142
|
+
sf code-analyzer run \
|
|
143
|
+
--rule-selector "sfge" \
|
|
144
|
+
--workspace "force-app" \
|
|
145
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
146
|
+
--include-fixes \
|
|
147
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
148
|
+
```
|
|
149
|
+
**When:** User says "deep analysis", "data flow analysis", "path-based analysis", "find CRUD violations with certainty".
|
|
150
|
+
**Note:** Requires Java 11+. May take 10-20 minutes. Use `--workspace` to avoid compiling template files.
|
|
151
|
+
**Timeout:** Set to 1200000ms (20 minutes).
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
### 11. Find Code Duplicates (CPD)
|
|
156
|
+
```bash
|
|
157
|
+
sf code-analyzer run \
|
|
158
|
+
--rule-selector "cpd" \
|
|
159
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
160
|
+
--include-fixes \
|
|
161
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
162
|
+
```
|
|
163
|
+
**When:** User says "find duplicates", "check for copy-paste", "detect code clones".
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
### 12. Check Vulnerable Libraries (RetireJS)
|
|
168
|
+
```bash
|
|
169
|
+
sf code-analyzer run \
|
|
170
|
+
--rule-selector "retire-js" \
|
|
171
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
172
|
+
--include-fixes \
|
|
173
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
174
|
+
```
|
|
175
|
+
**When:** User says "check for vulnerable libraries", "scan dependencies", "find CVEs".
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
### 13. Analyze Flows
|
|
180
|
+
```bash
|
|
181
|
+
sf code-analyzer run \
|
|
182
|
+
--rule-selector "flow" \
|
|
183
|
+
--target "**/*.flow-meta.xml" \
|
|
184
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
185
|
+
--include-fixes \
|
|
186
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
187
|
+
```
|
|
188
|
+
**When:** User says "analyze my Flows", "check Flow best practices".
|
|
189
|
+
**Note:** Requires Python 3.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### 14. Performance Analysis (ApexGuru)
|
|
194
|
+
```bash
|
|
195
|
+
sf code-analyzer run \
|
|
196
|
+
--rule-selector "apexguru" \
|
|
197
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
198
|
+
--include-fixes \
|
|
199
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
200
|
+
```
|
|
201
|
+
**When:** User says "performance analysis", "find slow code", "check governor limits".
|
|
202
|
+
**Note:** Requires authenticated Salesforce org. See `references/special-behaviors.md` for auth setup.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Output Format Variations
|
|
207
|
+
|
|
208
|
+
### 15. HTML Report
|
|
209
|
+
```bash
|
|
210
|
+
sf code-analyzer run \
|
|
211
|
+
--rule-selector Recommended \
|
|
212
|
+
--output-file ./code-analyzer-results-20260519-101030.html \
|
|
213
|
+
--include-fixes \
|
|
214
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
215
|
+
```
|
|
216
|
+
**When:** User explicitly requests HTML format.
|
|
217
|
+
**Note:** Extension determines format. JSON is default.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
### 16. SARIF (GitHub/IDE Integration)
|
|
222
|
+
```bash
|
|
223
|
+
sf code-analyzer run \
|
|
224
|
+
--rule-selector Recommended \
|
|
225
|
+
--output-file ./code-analyzer-results-20260519-101030.sarif \
|
|
226
|
+
--include-fixes \
|
|
227
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
228
|
+
```
|
|
229
|
+
**When:** User says "SARIF format", "GitHub integration", "IDE integration".
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
### 17. CSV (Spreadsheet)
|
|
234
|
+
```bash
|
|
235
|
+
sf code-analyzer run \
|
|
236
|
+
--rule-selector Recommended \
|
|
237
|
+
--output-file ./code-analyzer-results-20260519-101030.csv \
|
|
238
|
+
--include-fixes \
|
|
239
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
240
|
+
```
|
|
241
|
+
**When:** User says "CSV format", "export to spreadsheet", "Excel format".
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Complex Rule Selectors
|
|
246
|
+
|
|
247
|
+
### 18. Multiple Categories
|
|
248
|
+
```bash
|
|
249
|
+
sf code-analyzer run \
|
|
250
|
+
--rule-selector "all:(Security,Performance):(1,2,3)" \
|
|
251
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
252
|
+
--include-fixes \
|
|
253
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
254
|
+
```
|
|
255
|
+
**Selector breakdown:** All engines, Security OR Performance categories, Severity 1-3 (Critical to Moderate).
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
### 19. Specific Rule by Name
|
|
260
|
+
```bash
|
|
261
|
+
sf code-analyzer run \
|
|
262
|
+
--rule-selector "pmd:ApexCRUDViolation" \
|
|
263
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
264
|
+
--include-fixes \
|
|
265
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
266
|
+
```
|
|
267
|
+
**When:** User says "check for ApexCRUDViolation", "run the CRUD rule".
|
|
268
|
+
**Note:** Must be exact full rule name. If uncertain, look up first: `sf code-analyzer rules --rule-selector all 2>&1 | grep -i "CRUD"`
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
### 20. Engine + Category + Severity
|
|
273
|
+
```bash
|
|
274
|
+
sf code-analyzer run \
|
|
275
|
+
--rule-selector "(pmd,eslint):Security:(1,2)" \
|
|
276
|
+
--output-file ./code-analyzer-results-20260519-101030.json \
|
|
277
|
+
--include-fixes \
|
|
278
|
+
2>&1 | tee ./code-analyzer-results-20260519-101030.log
|
|
279
|
+
```
|
|
280
|
+
**Selector breakdown:** (PMD OR ESLint) AND Security AND (Sev 1 OR Sev 2).
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Key Patterns
|
|
285
|
+
|
|
286
|
+
| Pattern | Meaning | Example |
|
|
287
|
+
|---------|---------|---------|
|
|
288
|
+
| `:` | AND | `pmd:Security` = PMD **and** Security |
|
|
289
|
+
| `,` | OR | `(pmd,eslint)` = PMD **or** ESLint |
|
|
290
|
+
| `()` | Grouping | `(pmd,eslint):Security` = (PMD or ESLint) and Security |
|
|
291
|
+
| `(1,2)` | Severity range | `:(1,2)` = Severity 1 or 2 |
|
|
292
|
+
| `--target <path>` | Specific files/folders | Comma-separated in single arg |
|
|
293
|
+
| `--workspace <path>` | Compilation scope (SFGE only) | Prevents compiling template files |
|
|
294
|
+
| `.json`, `.html`, `.sarif`, `.csv`, `.xml` | Output format | Extension of `--output-file` |
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Anti-Patterns (DO NOT USE)
|
|
299
|
+
|
|
300
|
+
### ❌ Using `--format` flag
|
|
301
|
+
```bash
|
|
302
|
+
# WRONG - v3 syntax, does not exist in v4+
|
|
303
|
+
sf code-analyzer run --format json
|
|
304
|
+
```
|
|
305
|
+
**Why:** The `--format` flag was removed in v4+. Use `--output-file` with extension instead.
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
### ❌ Using `$TIMESTAMP` variable in command
|
|
310
|
+
```bash
|
|
311
|
+
# WRONG - variable substitution fails in permission prompts
|
|
312
|
+
sf code-analyzer run --output-file "./results-${TIMESTAMP}.json"
|
|
313
|
+
```
|
|
314
|
+
**Why:** Generate timestamp first, then use literal string in command.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
### ❌ Running in background for long scans
|
|
319
|
+
```bash
|
|
320
|
+
# WRONG - loses output stream
|
|
321
|
+
sf code-analyzer run --rule-selector sfge &
|
|
322
|
+
```
|
|
323
|
+
**Why:** Use foreground with high timeout (1200000ms). Backgrounding loses the output.
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
### ❌ Partial rule names
|
|
328
|
+
```bash
|
|
329
|
+
# WRONG - returns 0 results
|
|
330
|
+
sf code-analyzer run --rule-selector "no-hardcoded-values"
|
|
331
|
+
```
|
|
332
|
+
**Why:** Rule names must be exact. Look up first: `sf code-analyzer rules --rule-selector all | grep -i "hardcoded"`
|
|
333
|
+
**Correct:** `--rule-selector "@salesforce-ux/slds/no-hardcoded-values-slds2"`
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Fix Application: Before & After
|
|
2
|
+
|
|
3
|
+
This example demonstrates engine-provided auto-fix behavior on a small codebase.
|
|
4
|
+
|
|
5
|
+
## Initial Scan Results
|
|
6
|
+
|
|
7
|
+
**Command:**
|
|
8
|
+
```bash
|
|
9
|
+
sf code-analyzer run --rule-selector Recommended --output-file ./results.json --include-fixes
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
**Summary:**
|
|
13
|
+
- Total violations: 248
|
|
14
|
+
- Fixable violations: 67 (27%)
|
|
15
|
+
|
|
16
|
+
### Fixable Rules
|
|
17
|
+
|
|
18
|
+
| Rule | Engine | Severity | Count |
|
|
19
|
+
|------|--------|----------|-------|
|
|
20
|
+
| no-var | eslint | 3 | 42 |
|
|
21
|
+
| prefer-const | eslint | 3 | 18 |
|
|
22
|
+
| @salesforce-ux/slds/no-hardcoded-values-slds2 | eslint | 4 | 5 |
|
|
23
|
+
| no-extra-boolean-cast | eslint | 3 | 2 |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Before Fix: Sample Violations
|
|
28
|
+
|
|
29
|
+
### Violation 1: no-var
|
|
30
|
+
**File:** `force-app/main/default/lwc/accountCard/accountCard.js:12`
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
export default class AccountCard extends LightningElement {
|
|
34
|
+
handleClick() {
|
|
35
|
+
var accountId = this.recordId; // ← violation
|
|
36
|
+
var data = this.fetchData(accountId); // ← violation
|
|
37
|
+
this.processData(data);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Violation 2: prefer-const
|
|
43
|
+
**File:** `force-app/main/default/lwc/utils/dataProcessor.js:8`
|
|
44
|
+
|
|
45
|
+
```javascript
|
|
46
|
+
export function processRecords(records) {
|
|
47
|
+
let result = []; // ← violation (never reassigned)
|
|
48
|
+
records.forEach(r => result.push(transform(r)));
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Violation 3: @salesforce-ux/slds/no-hardcoded-values-slds2
|
|
54
|
+
**File:** `force-app/main/default/lwc/accountCard/accountCard.css:4`
|
|
55
|
+
|
|
56
|
+
```css
|
|
57
|
+
.account-card {
|
|
58
|
+
border-radius: 4px; /* ← violation */
|
|
59
|
+
padding: 16px; /* ← violation */
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Apply Fixes
|
|
66
|
+
|
|
67
|
+
**Command:**
|
|
68
|
+
```bash
|
|
69
|
+
node <skill_dir>/scripts/apply-fixes.js ./results.json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Output:**
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"success": true,
|
|
76
|
+
"filesModified": 15,
|
|
77
|
+
"fixesApplied": 67,
|
|
78
|
+
"fixesSkipped": 0
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## After Fix: Corrected Code
|
|
85
|
+
|
|
86
|
+
### Fix 1: no-var → let
|
|
87
|
+
**File:** `force-app/main/default/lwc/accountCard/accountCard.js:12`
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
export default class AccountCard extends LightningElement {
|
|
91
|
+
handleClick() {
|
|
92
|
+
let accountId = this.recordId; // ✓ fixed
|
|
93
|
+
let data = this.fetchData(accountId); // ✓ fixed
|
|
94
|
+
this.processData(data);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Fix 2: let → const
|
|
100
|
+
**File:** `force-app/main/default/lwc/utils/dataProcessor.js:8`
|
|
101
|
+
|
|
102
|
+
```javascript
|
|
103
|
+
export function processRecords(records) {
|
|
104
|
+
const result = []; // ✓ fixed
|
|
105
|
+
records.forEach(r => result.push(transform(r)));
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Fix 3: Hardcoded values → SLDS tokens
|
|
111
|
+
**File:** `force-app/main/default/lwc/accountCard/accountCard.css:4`
|
|
112
|
+
|
|
113
|
+
```css
|
|
114
|
+
.account-card {
|
|
115
|
+
border-radius: var(--slds-c-card-radius-border); /* ✓ fixed */
|
|
116
|
+
padding: var(--slds-c-card-spacing-block); /* ✓ fixed */
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Verification Scan
|
|
123
|
+
|
|
124
|
+
**Command:**
|
|
125
|
+
```bash
|
|
126
|
+
sf code-analyzer run --rule-selector Recommended --output-file ./results-after.json --include-fixes
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Summary:**
|
|
130
|
+
- Total violations: 181 (↓ 67 from 248)
|
|
131
|
+
- Fixable violations: 0
|
|
132
|
+
|
|
133
|
+
**Result:** All 67 fixable violations resolved. Remaining 181 violations require manual fixes (e.g., ApexDoc comments, CRUD checks).
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Key Takeaways
|
|
138
|
+
|
|
139
|
+
1. **Engine-provided fixes are safe**: They're deterministic transformations, not AI-generated code.
|
|
140
|
+
2. **Apply, then verify**: Always re-scan after applying fixes to confirm no regressions.
|
|
141
|
+
3. **Not all violations are fixable**: Security issues like CRUD violations require manual code review.
|
|
142
|
+
4. **Files modified count ≠ fixes count**: Multiple violations in one file count as one file modification.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"metadata": {
|
|
3
|
+
"engine": "Recommended",
|
|
4
|
+
"executedAt": "2026-05-19T14:22:45.789Z",
|
|
5
|
+
"filesAnalyzed": 2818,
|
|
6
|
+
"violationCount": 69545
|
|
7
|
+
},
|
|
8
|
+
"violations": [
|
|
9
|
+
{
|
|
10
|
+
"rule": "@lwc/lwc/no-inner-html",
|
|
11
|
+
"engine": "eslint",
|
|
12
|
+
"severity": 2,
|
|
13
|
+
"message": "Disallow use of innerHTML",
|
|
14
|
+
"file": "StaticResourceSources/js/BDE_jqtablesorter.min.js",
|
|
15
|
+
"line": 3,
|
|
16
|
+
"column": 245,
|
|
17
|
+
"fix": null
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"rule": "@salesforce-ux/slds/no-hardcoded-values-slds2",
|
|
21
|
+
"engine": "eslint",
|
|
22
|
+
"severity": 4,
|
|
23
|
+
"message": "Replace hardcoded value with SLDS design token",
|
|
24
|
+
"file": "StaticResourceSources/Bootstrap/css/bootstrap-s1.css",
|
|
25
|
+
"line": 156,
|
|
26
|
+
"column": 12,
|
|
27
|
+
"fix": {
|
|
28
|
+
"range": [4521, 4527],
|
|
29
|
+
"text": "var(--slds-c-button-radius-border)"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"summary": {
|
|
34
|
+
"bySeverity": {
|
|
35
|
+
"1": 0,
|
|
36
|
+
"2": 6164,
|
|
37
|
+
"3": 24341,
|
|
38
|
+
"4": 30230,
|
|
39
|
+
"5": 8810
|
|
40
|
+
},
|
|
41
|
+
"byEngine": {
|
|
42
|
+
"eslint": 38542,
|
|
43
|
+
"pmd": 18234,
|
|
44
|
+
"regex": 12769
|
|
45
|
+
},
|
|
46
|
+
"topRules": [
|
|
47
|
+
{"rule": "@salesforce-ux/slds/no-hardcoded-values-slds2", "count": 18081},
|
|
48
|
+
{"rule": "no-var", "count": 9714},
|
|
49
|
+
{"rule": "NoTrailingWhitespace", "count": 8073},
|
|
50
|
+
{"rule": "ApexDoc", "count": 5533},
|
|
51
|
+
{"rule": "ApexUnitTestClassShouldHaveRunAs", "count": 3856},
|
|
52
|
+
{"rule": "NoMixedIndentation", "count": 3493},
|
|
53
|
+
{"rule": "AnnotationsNamingConventions", "count": 2418},
|
|
54
|
+
{"rule": "no-undef", "count": 1891},
|
|
55
|
+
{"rule": "AvoidOldSalesforceApiVersions", "count": 1336},
|
|
56
|
+
{"rule": "IfElseStmtsMustUseBraces", "count": 1112}
|
|
57
|
+
],
|
|
58
|
+
"topFiles": [
|
|
59
|
+
{"file": "StaticResourceSources/Bootstrap/css/bootstrap-namespaced-s1.css", "count": 1354},
|
|
60
|
+
{"file": "force-app/main/default/staticresources/CumulusStaticResources/Bootstrap/css/bootstrap-namespaced-s1.css", "count": 1354},
|
|
61
|
+
{"file": "StaticResourceSources/Bootstrap/css/bootstrap-s1.css", "count": 1349},
|
|
62
|
+
{"file": "StaticResourceSources/Bootstrap/css/bootstrap-s1.min.css", "count": 1349},
|
|
63
|
+
{"file": "force-app/main/default/staticresources/CumulusStaticResources/Bootstrap/css/bootstrap-s1.css", "count": 1349}
|
|
64
|
+
],
|
|
65
|
+
"fixableCount": 12298
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"metadata": {
|
|
3
|
+
"engine": "all:Security:(1,2)",
|
|
4
|
+
"executedAt": "2026-05-19T16:45:12.456Z",
|
|
5
|
+
"filesAnalyzed": 156,
|
|
6
|
+
"violationCount": 43
|
|
7
|
+
},
|
|
8
|
+
"violations": [
|
|
9
|
+
{
|
|
10
|
+
"rule": "ApexCRUDViolation",
|
|
11
|
+
"engine": "pmd",
|
|
12
|
+
"severity": 2,
|
|
13
|
+
"message": "Validate CRUD permission before SOQL/DML operation",
|
|
14
|
+
"file": "force-app/main/default/classes/AccountService.cls",
|
|
15
|
+
"line": 42,
|
|
16
|
+
"column": 9,
|
|
17
|
+
"fix": null
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"rule": "ApexSOQLInjection",
|
|
21
|
+
"engine": "pmd",
|
|
22
|
+
"severity": 1,
|
|
23
|
+
"message": "Avoid untrusted/unescaped variables in DML query",
|
|
24
|
+
"file": "force-app/main/default/classes/SearchController.cls",
|
|
25
|
+
"line": 18,
|
|
26
|
+
"column": 24,
|
|
27
|
+
"fix": null
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"rule": "@lwc/lwc/no-inner-html",
|
|
31
|
+
"engine": "eslint",
|
|
32
|
+
"severity": 2,
|
|
33
|
+
"message": "Disallow use of innerHTML (XSS risk)",
|
|
34
|
+
"file": "force-app/main/default/lwc/riskComponent/riskComponent.js",
|
|
35
|
+
"line": 28,
|
|
36
|
+
"column": 9,
|
|
37
|
+
"fix": null
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"rule": "ApexInsecureEndpoint",
|
|
41
|
+
"engine": "pmd",
|
|
42
|
+
"severity": 2,
|
|
43
|
+
"message": "Endpoint protocol should be https",
|
|
44
|
+
"file": "force-app/main/default/classes/ExternalApiClient.cls",
|
|
45
|
+
"line": 56,
|
|
46
|
+
"column": 20,
|
|
47
|
+
"fix": null
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"rule": "ApexOpenRedirect",
|
|
51
|
+
"engine": "pmd",
|
|
52
|
+
"severity": 2,
|
|
53
|
+
"message": "Potential open redirect from user-controlled input",
|
|
54
|
+
"file": "force-app/main/default/classes/RedirectController.cls",
|
|
55
|
+
"line": 34,
|
|
56
|
+
"column": 16,
|
|
57
|
+
"fix": null
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"rule": "ApexXSSFromEscapeFalse",
|
|
61
|
+
"engine": "pmd",
|
|
62
|
+
"severity": 2,
|
|
63
|
+
"message": "Avoid using escape=false in Visualforce pages",
|
|
64
|
+
"file": "force-app/main/default/pages/AccountDetail.page",
|
|
65
|
+
"line": 23,
|
|
66
|
+
"column": 45,
|
|
67
|
+
"fix": null
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"summary": {
|
|
71
|
+
"bySeverity": {
|
|
72
|
+
"1": 8,
|
|
73
|
+
"2": 35,
|
|
74
|
+
"3": 0,
|
|
75
|
+
"4": 0,
|
|
76
|
+
"5": 0
|
|
77
|
+
},
|
|
78
|
+
"byEngine": {
|
|
79
|
+
"pmd": 38,
|
|
80
|
+
"eslint": 5
|
|
81
|
+
},
|
|
82
|
+
"topRules": [
|
|
83
|
+
{"rule": "ApexCRUDViolation", "count": 18},
|
|
84
|
+
{"rule": "ApexInsecureEndpoint", "count": 9},
|
|
85
|
+
{"rule": "ApexSOQLInjection", "count": 8},
|
|
86
|
+
{"rule": "@lwc/lwc/no-inner-html", "count": 5},
|
|
87
|
+
{"rule": "ApexOpenRedirect", "count": 3}
|
|
88
|
+
],
|
|
89
|
+
"topFiles": [
|
|
90
|
+
{"file": "force-app/main/default/classes/AccountService.cls", "count": 12},
|
|
91
|
+
{"file": "force-app/main/default/classes/SearchController.cls", "count": 8},
|
|
92
|
+
{"file": "force-app/main/default/classes/ExternalApiClient.cls", "count": 7}
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Command Construction Examples
|
|
2
|
+
|
|
3
|
+
Full command examples for common scanning scenarios.
|
|
4
|
+
|
|
5
|
+
**Note:** All commands use `${TIMESTAMP}` which should be generated via `TIMESTAMP=$(date +%Y%m%d-%H%M%S)` before running the scan.
|
|
6
|
+
|
|
7
|
+
| User Request | Constructed Command |
|
|
8
|
+
|---|---|
|
|
9
|
+
| "Scan my code" | `sf code-analyzer run --rule-selector Recommended --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
10
|
+
| "Check for security issues" | `sf code-analyzer run --rule-selector Security --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
11
|
+
| "Run PMD on my Apex" | `sf code-analyzer run --rule-selector pmd --target "**/*.cls,**/*.trigger" --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
12
|
+
| "Check only my changed files" | `git diff --name-only main...HEAD \| grep -E '...' → sf code-analyzer run --target <files> --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
13
|
+
| "Find duplicate code" | `sf code-analyzer run --rule-selector cpd --output-file "./code-analyzer-results-${TIMESTAMP}.json"` |
|
|
14
|
+
| "Check vulnerable libraries" | `sf code-analyzer run --rule-selector retire-js --output-file "./code-analyzer-results-${TIMESTAMP}.json"` |
|
|
15
|
+
| "Run deep security analysis" | `sf code-analyzer run --rule-selector sfge --workspace "force-app" --target "force-app" --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
16
|
+
| "Critical PMD violations in this file" | `sf code-analyzer run --rule-selector "pmd:1" --target <file> --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
17
|
+
| "ESLint performance on LWC" | `sf code-analyzer run --rule-selector "eslint:Performance" --target "**/lwc/**" --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
18
|
+
| "AppExchange security review" | `sf code-analyzer run --rule-selector all --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
19
|
+
| "Generate HTML report" | `sf code-analyzer run --rule-selector Recommended --output-file "./code-analyzer-results-${TIMESTAMP}.html" --include-fixes` |
|
|
20
|
+
| "Scan with severity threshold 2" | `sf code-analyzer run --rule-selector Recommended --severity-threshold 2 --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
21
|
+
| "Run ApexCRUDViolation rule" | `sf code-analyzer run --rule-selector "pmd:ApexCRUDViolation" --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
22
|
+
| "Scan my Flows" | `sf code-analyzer run --rule-selector flow --output-file "./code-analyzer-results-${TIMESTAMP}.json"` |
|
|
23
|
+
| "Check ESLint recommended rules" | `sf code-analyzer run --rule-selector "eslint:Recommended" --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
24
|
+
| "Scan all with fail on high" | `sf code-analyzer run --rule-selector all --severity-threshold 2 --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
25
|
+
| "What rules are available for security?" | `sf code-analyzer rules --rule-selector Security --view detail` |
|
|
26
|
+
| "Scan this file for performance" | `sf code-analyzer run --rule-selector Performance --target <file> --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|
|
27
|
+
| "Run all rules, no suppressions" | `sf code-analyzer run --rule-selector all --no-suppressions --output-file "./code-analyzer-results-${TIMESTAMP}.json" --include-fixes` |
|