Vulnetix SAST Skill
Use when
- Pre-commit / pre-merge: scan changed source files for SAST findings.
- Targeted rule check: "did we just write an XXE pattern?" via
--rule-id VNX-XXE-001. - CI gate: exit non-zero if SAST finds critical-severity issues.
- Audit a specific weakness class with
--paths <dir> --rule-id VNX-CWE-89-*. - Augment Vulnetix's rules with the repo's own Semgrep policy.
Don't use for
- Dependency vulnerability scanning — use
/vulnetix:sca-scan. - Secret detection — use
/vulnetix:secret-scan. - Container/IaC scanning — use
/vulnetix:container-scan//vulnetix:iac-scan.
Conventions
This skill follows _lib/contract.md: the Vulnetix CLI is auto-installed by hooks, .vulnetix/capabilities.yaml is always present, every vulnetix vdb call is piped through a verified jq filter from _lib/jq/, independent calls run in parallel as concurrent Bash tool calls, and trailing follow-ups are limited to one line. See the contract for output style, memory write rules, and cooldowns.
Static analysis on source code. Capability-aware: optionally augmented with the user's own Semgrep rules.
Step 1: Load capabilities
Read .vulnetix/capabilities.yaml. Note binaries.semgrep, repo.semgrep_config.
Step 2: Decide scope
If --paths given → scan those paths. Else scan files changed since git merge-base origin/main HEAD (or whole repo if not a git repo).
Step 3: Run scan
vulnetix sast --paths "$PATHS" -o json-sarif > .vulnetix/sast.${TIMESTAMP}.sarif
If --rule-id provided, pass through.
If --baseline, also run vulnetix scan --evaluate-sast --list-default-rules -o json to record the rule set used.
Step 4: Augment with local Semgrep (conditional)
If binaries.semgrep: true AND repo.semgrep_config: true:
semgrep --config .semgrep --json --quiet "$PATHS" > .vulnetix/sast.semgrep.${TIMESTAMP}.json
Merge findings into the SARIF report (de-duped by file:line:rule).
Step 5: Render
| Severity | Rule | File:Line | Message | Source |
Group by severity (critical → low). Suggest /vulnetix:secure-code-write for repeated rule violations.
Memory update
If running on a PR / branch, write a .vulnetix/sast/<branch>.summary.yaml with finding counts so /vulnetix:code-review-security can pick it up.
Edge cases & gotchas
- Scope defaults to files changed vs
origin/main; pass--pathsfor explicit scope. CWD without a manifest = empty results. - Output is SARIF — pipe through a SARIF viewer (VS Code SARIF Viewer extension) or render the JSON yourself.
- Semgrep augmentation requires
binaries.semgrep: trueANDrepo.semgrep_config: true. Otherwise the skill silently runs Vulnetix rules only. - Built-in rules are organisation-agnostic; rule IDs like
VNX-GQL-004(GraphQL injection) are not customisable per-repo. - Findings are deduped by
<file>:<line>:<rule_id>across both sources — same logical finding from Semgrep + Vulnetix appears once. - Performance: 10K+ file repos benefit from
--paths "src/**/*.ts"instead of full-repo scan.