7.9 KiB
Post-Scan Workflows
After presenting initial scan results (Step 5), the user may ask follow-up questions to explore results or understand violations. This reference covers three post-scan workflows:
- Result Querying — filter/drill into existing results without re-scanning
- Rule Description — explain what a rule does and how to fix violations
- Rule Listing — browse available rules without running a scan
Result Querying (Step 7)
When to Use
Trigger this workflow when the user asks to explore existing results:
- "Show me just the security violations"
- "What's in AccountService.cls?"
- "Show only PMD issues"
- "Filter to severity 1 and 2"
- "What ESLint rules fired?"
- "Show violations in the lwc folder"
- "Top 20 by file"
How It Works
The query-results.js script re-filters the SAME results JSON file (from Step 4) with different criteria. No re-scan is needed — it is instant.
Script Reference
node "<skill_dir>/scripts/query-results.js" "<results-file.json>" [options]
Filter options (combine any):
| Option | Description | Example |
|---|---|---|
--engine <name> |
Filter by engine | --engine pmd |
--severity <n> |
Filter by severity (comma-separated) | --severity 1,2 |
--category <tag> |
Filter by category/tag | --category Security |
--rule <name> |
Filter by exact rule name | --rule ApexCRUDViolation |
--file <substring> |
Filter by file path substring | --file AccountService |
--top <n> |
Return top N results (default: 10) | --top 20 |
--sort <field> |
Sort by: severity, rule, engine, file | --sort file |
--sort-dir <dir> |
Sort direction: asc, desc | --sort-dir desc |
--summary |
Show only counts (no individual violations) | --summary |
Options can be combined freely:
# Security violations in PMD, top 5
node "<skill_dir>/scripts/query-results.js" "./results.json" --engine pmd --category Security --top 5
# All Critical+High in a specific file
node "<skill_dir>/scripts/query-results.js" "./results.json" --severity 1,2 --file AccountService.cls
# Summary of ESLint issues only
node "<skill_dir>/scripts/query-results.js" "./results.json" --engine eslint --summary
Output Format
The script outputs JSON with this structure:
{
"query": { "engine": "pmd", "severity": [1,2], ... },
"totalViolations": 500,
"totalMatches": 23,
"severityCounts": { "1": 5, "2": 18, "3": 0, "4": 0, "5": 0 },
"topRules": [{ "rule": "ApexCRUDViolation", "engine": "pmd", "count": 12 }, ...],
"topFiles": [{ "file": "AccountService.cls", "count": 8 }, ...],
"violations": [
{ "rule": "...", "engine": "...", "severity": 1, "message": "...", "file": "...", "startLine": 42, "tags": [...] },
...
]
}
When --summary is used, the violations array is omitted.
Presentation Rules
Present query results using the same format as Step 5, but with a header indicating the active filter:
## Filtered Results: [description of filter]
**X matches** out of Y total violations.
| Severity | Count |
|----------|-------|
| Critical (1) | X |
| High (2) | X |
| ... |
### Matching Violations
| # | Rule | Engine | Sev | File | Line |
|---|------|--------|-----|------|------|
| 1 | ... | ... | ... | ... | ... |
### Top Rules (within filter)
| Rule | Engine | Count |
|------|--------|-------|
| ... | ... | ... |
Full results: `<original-results-file>`
Follow-Up Offers
After presenting filtered results, offer:
- "Want me to narrow further?" (add more filters)
- "Want me to explain any of these rules?" (→ Step 8)
- "Want me to apply fixes for these?" (→ Step 6, scoped to matched rules)
Rule Description (Step 8)
When to Use
Trigger this workflow when the user asks about a specific rule:
- "What is ApexCRUDViolation?"
- "Explain this rule"
- "What does no-var mean?"
- "How do I fix OperationWithLimitsInLoop?"
- "Tell me about the ApexSOQLInjection rule"
- "Why is this flagged?"
How It Works
The describe-rule.js script calls sf code-analyzer rules with a targeted selector to extract rule metadata including description and documentation links.
Script Reference
node "<skill_dir>/scripts/describe-rule.js" "<rule-name>" [--engine <engine>]
Arguments:
| Argument | Description | Example |
|---|---|---|
<rule-name> |
The rule name to look up | ApexCRUDViolation |
--engine <engine> |
Narrow to a specific engine (optional) | --engine pmd |
Examples:
node "<skill_dir>/scripts/describe-rule.js" "ApexCRUDViolation" --engine pmd
node "<skill_dir>/scripts/describe-rule.js" "no-var" --engine eslint
node "<skill_dir>/scripts/describe-rule.js" "OperationWithLimitsInLoop"
Output Format
Success — single rule found:
{
"status": "success",
"rule": {
"name": "ApexCRUDViolation",
"engine": "pmd",
"severity": "2 (High)",
"tags": ["Security", "Recommended", "Apex"],
"description": "Validates that CRUD and FLS checks are performed before DML operations...",
"resources": ["https://pmd.github.io/latest/pmd_rules_apex_security.html#apexcrudviolation"]
}
}
Multiple matches (partial name):
{
"status": "multiple_matches",
"message": "Rule \"CRUD\" not found as exact match. Found 3 potential matches:",
"candidates": [
{ "name": "ApexCRUDViolation", "engine": "pmd", "severity": "2", "tags": "Security, Recommended" },
...
]
}
Not found:
{
"status": "not_found",
"message": "Rule \"FakeRule\" not found. Verify the rule name with: sf code-analyzer rules ..."
}
Presentation Rules
For a successful lookup, present:
## Rule: ApexCRUDViolation
| Property | Value |
|----------|-------|
| Engine | pmd |
| Severity | 2 (High) |
| Tags | Security, Recommended, Apex |
### Description
Validates that CRUD and FLS checks are performed before DML operations. Without these
checks, data may be accessed or modified without proper user permissions, violating
the Salesforce security model.
### How to Fix
[Provide actionable fix guidance based on the description. If the description mentions
a fix pattern, elaborate. If resources are available, include the link.]
### Resources
- [PMD Documentation](https://pmd.github.io/...)
---
Want me to show all violations of this rule in your scan results?
For multiple matches, present:
I found multiple rules matching "CRUD":
| # | Rule | Engine | Severity |
|---|------|--------|----------|
| 1 | ApexCRUDViolation | pmd | 2 (High) |
| 2 | ... | ... | ... |
Which rule would you like details on?
For not found, present:
I couldn't find a rule named "FakeRule". Would you like me to:
- Search for similar rules? (I'll grep the full rule list)
- List all rules for a specific engine or category?
After Describing a Rule
Offer next steps:
- "Want me to show all violations of this rule in your results?" (→ Step 7 with
--rule) - "Want me to apply the engine fix for this rule?" (→ Step 6)
- "Want me to explain another rule?"
Rule Listing (Step 9)
Presentation Rules
Present available rules in this format:
## Available Rules: Security
**Found X rules** across Y engines.
| Engine | Count |
|--------|-------|
| pmd | 12 |
| eslint | 6 |
| Severity | Count |
|----------|-------|
| Critical (1) | 3 |
| High (2) | 15 |
### Rules (top 25)
| # | Rule | Engine | Severity | Tags |
|---|------|--------|----------|------|
| 1 | ApexCRUDViolation | pmd | 2 (High) | Security, Recommended |
| 2 | ApexSOQLInjection | pmd | 1 (Critical) | Security, Recommended |
| ... |
Want me to explain any of these rules? Or run a scan with this selector?
Follow-Up Offers
After listing rules:
- "Want me to explain any of these?" (→ Step 8)
- "Want me to scan with this selector?" (→ Steps 1-5 with the same selector)
- "Narrow to just high severity?" (re-run with
--severity 1,2)