helpers/skills/security-alert/SKILL.md
Use this skill to filter a pre-fetched set of Hacker News stories down to those that report supply-chain security threats relevant to software developers — including malicious packages on npm or PyPI, compromised developer tooling, and attacks targeting source code repositories or CI/CD infrastructure. Reads stories from stories.json in the workspace, performs semantic analysis (fetching HN threads when the title alone is ambiguous), and writes the stories worth alerting on to findings.json.
npx skillsauth add opendatahub-io/ai-helpers security-alertInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Read a set of Hacker News stories and decide which ones are worth alerting on
— meaning they plausibly report a threat to the software supply chain or
developer infrastructure. Write those stories to findings.json.
The pipeline controls when this skill runs and has already built the candidate story list. The scope here is semantic analysis only — do not re-fetch or reorder the candidate list, manage state, check registries, or post to Slack. Fetching individual HN thread detail via the Algolia items API is permitted up to the cap in Step 2.
Run the steps below in order. At any early-exit point, stop and take no further action.
Read stories.json from the workspace:
if [ ! -f stories.json ]; then
echo '[]' > findings.json
exit 0
fi
cat stories.json
Each story in the array has:
| Field | Description |
|---|---|
| id | HN item ID (string) |
| title | Story headline |
| url | Linked article URL, or HN thread URL if no external link |
| hn_url | Direct HN thread link |
If the array is empty, stop here and write an empty findings array to
findings.json.
Read each story title. Decide whether it is reporting a threat relevant to software developers or the software supply chain. This is a judgment call — do not rely on keyword matching. A relevant story may use none of the obvious terms.
Include a story if it describes any of the following:
Package-level threats (npm / PyPI)
Developer tooling threats
Source code and repository threats
CI/CD and infrastructure threats
Exclude stories about:
The test: would a developer's build, publish, or dependency pipeline be compromised? If the answer is no — if the threat only affects them as an end-user of software — exclude it.
Fetch the HN thread for any story that is not immediately obvious noise (title makes it unambiguously unrelated). Cap total thread fetches at 15 per run — if you reach the cap, include remaining untouched stories in findings so they are not silently dropped.
curl -sf "https://hn.algolia.com/api/v1/items/<id>"
If this exits non-zero or returns no data (network error, timeout), decide based on the title alone and proceed — do not let a single fetch failure block the run.
While reading the thread:
article_summary.When uncertain, include the story. A false negative (missing a real threat) is worse than an extra alert that turns out to be nothing.
Write an array of the stories worth alerting on to findings.json. Write an
empty array if no stories were relevant.
Each object:
{
"hn_id": "<HN story ID>",
"package": "<named package or tool, or empty string if none>",
"registry": "npm" | "pypi" | "",
"versions_affected": "<version range, 'unknown', or empty>",
"article_summary": "<one sentence: what happened, what was compromised, who is affected>",
"hn_title": "<story headline>",
"hn_url": "<https://news.ycombinator.com/item?id=...>"
}
For stories without a specific npm/PyPI package (e.g. a compromised VSCode
extension, a GitHub breach, a CI/CD attack): leave package, registry, and
versions_affected as empty strings. The article_summary is the primary
signal — make it count.
Write the array to findings.json in the workspace and validate it:
cat > findings.json << 'EOF'
[
{ ... }
]
EOF
jq . findings.json >/dev/null
| Scenario | Behavior |
|---|---|
| stories.json missing | Write [] to findings.json; exit 0 |
| stories.json present but empty array | Write [] to findings.json; stop |
| Thread fetch fails (curl non-zero) | Decide on title alone; proceed |
| No stories are relevant | Write [] to findings.json; stop |
| Uncertain whether a story is relevant | Include it |
development
Run hexora static analysis on a Python package repository to detect suspicious code patterns, then triage findings with deterministic rules and AI reasoning to produce a structured risk report section.
development
Inspect recent git history of a Python package repository for suspicious commits touching supply-chain-sensitive files, then triage findings with AI reasoning to produce a structured risk report section.
development
Scan a Python package repository for compiled/binary files using Fromager-style detection and malcontent YARA analysis, then triage findings with deterministic rules and AI reasoning to produce a structured risk report section.
testing
Use this skill to identify non-Red Hat RPM packages installed in container images or on the local machine. For containers, pulls images across multiple architectures and release tags; for local scans, inspects the host directly. Extracts RPM signing metadata and reports packages not signed with the Red Hat GPG key as CSV output. Use when auditing compliance, checking supply-chain provenance, or scanning for third-party RPMs in RHOAI component images.