Part of the DEVIN ecosystem
Track: Build · Nature: product
For: Maintainers, AI engineers, Developers
Interface: CLI / Registry
Path: Developers · step 2/4 — afterdevin-devkit, beforedevin-internals-spec
devin-skill-catalog
Unofficial community project. Not affiliated with, endorsed by, or sponsored by Cognition AI. "Devin" is a trademark of Cognition AI.
Linux · Personal Windows · Corporate Windows
Part of the awesome-devin ecosystem: the curated hub for the devin-* tools.
devin-skill-catalog inventories, lints, quarantines and promotes the
SKILL.md skills and rules/*.md rules that live under .devin/ dirs —
workspace-level and user-level. It adds a lifecycle registry, a
per-workspace inventory diff, two offline evidence gates, and a portable
bundle format so approved items can move between machines through
quarantine instead of around it.
The problem
.devin/skills/ and .devin/rules/ accumulate content from everywhere —
hand-written, copied from other repos, pasted from a chat. Nothing
answers the basic questions: what is installed where? did this skill
change between my workspaces? does this rule contain injection phrasing
or a pasted API key? and which of these have I actually reviewed?
devin-skill-catalog is the inventory + supply-chain gate for that
content.
What it does
- Inventory — scans
.devin/skills/<name>/SKILL.mdand.devin/rules/*.md, hashes each item (sha256), annotates it with its registry state. - Lint — structural checks: frontmatter presence,
namematching the directory, a realdescription,#titles on rules. - Gates — two offline evidence gates (G1/G2, below) plus a G3
promotion gate driven by
g3-reportverdicts. G1/G2 are heuristics, not proof. - Lifecycle — a registry at
<config-dir>/.devin-ecosystem/skill-catalog.jsontracks every item throughproposed → quarantined → approved → active → retired. - Diff — content-hash comparison of the inventories of two dirs.
- Bundles — export
approveditems to a directory or.tar[.gz]with amanifest.json(items, per-file sha256, source profile); import verifies checksums and lands items quarantined — never directly active.
Install
Requires Python ≥ 3.10 and pipx or uv.
uv tool install devin-skill-catalog # or: pipx install devin-skill-catalog
Published on PyPI as devin-skill-catalog. The bundled DevKit manifest
still installs it from the GitHub source archive; profile installs and the
PyPI install produce the same CLI.
Commands
devin-skill-catalog scan [PATH ...] # inventory (read-only)
devin-skill-catalog lint [PATH ...] # structural findings
devin-skill-catalog diff A B # inventory diff by sha256
devin-skill-catalog gate g1 PATH # static hygiene gate
devin-skill-catalog gate g2 PATH [--packs-dir D] # grounding gate
devin-skill-catalog g3 ITEM --judge --evidence F [--out R.json]
# judge-produced g3-report
devin-skill-catalog quarantine ITEM [PATH ...] # snapshot → quarantined
devin-skill-catalog promote ITEM [--force] # quarantined → approved (G1 + G3 policy)
[--g3-report PATH]
[--g3-inconclusive-reason "…"]
devin-skill-catalog activate ITEM # approved → active
devin-skill-catalog retire ITEM # any state → retired
devin-skill-catalog export-bundle --out DIR # pack approved items
devin-skill-catalog import-bundle PATH # land items quarantined
ITEM is kind:name (skill:foo, rule:bar) or a bare name when it
resolves unambiguously. PATH accepts a workspace root, a .devin dir,
a skill dir or a single file.
Plan-first mutations. quarantine, promote, activate, retire
and import-bundle print a plan and write nothing unless --apply is
passed:
$ devin-skill-catalog quarantine skill:demo ./ws
plan:
quarantine skill:demo (currently proposed)
copy 1 file(s) ./ws/.devin/skills/demo
→ ~/.config/devin/.devin-ecosystem/skill-catalog/quarantine/skill/demo
registry: proposed → quarantined
note: the original files in .devin/ stay untouched — remove them
manually if the item must stop loading
nothing written — re-run with --apply to execute
Read-only scanned dirs. The tool never writes to a .devin/ dir.
The only write targets are the registry file and quarantine store under
the Devin config dir, plus whatever you point --out at. Quarantine
snapshots the item; removing the original from .devin/ is your call.
Lifecycle
proposed → quarantined → approved → active → retired
↑____________________| ↓
(approve can be rolled back; retired → proposed
retire works from any state) (re-propose)
quarantine— copies the item into the quarantine store (outside.devin/, so Devin never loads it) and marks itquarantined.promote— runs G1 on the stored copy and enforces the G3 promotion policy (below); a G1 FAIL refuses the promotion (--forceoverrides — but never aregressesverdict).quarantined → approved.activate— marks the itemactivein the catalog. Installing files into.devin/remains a manual step — this tool never writes there.retire— parks an item;retired → proposedis the only way back.
Unregistered items found on disk report as unregistered — the catalog does not pretend to have reviewed what it has never seen.
Gates
G1 — static hygiene
The lint checks plus heuristic scans over every text file of the item:
- prompt-injection phrasing (
ignore previous instructions,disregard previous, jailbreak openers,do not tell the user) - system-prompt exfiltration phrasing
- download-and-execute patterns (
curl … | sh) - destructive shell patterns (
rm -rf /, fork bombs) - secret-shaped strings — GitHub/Slack token prefixes,
sk-…keys,AKIA…, private-key markers, high-entropy runs, large base64 blobs
Secret findings print "possible secret at line N — value suppressed": the matched value is never printed, in text or JSON output.
promote --apply runs G1 on the quarantined copy and refuses on FAIL.
gate g1|g2 PATH --apply records per-item gate results in the registry.
G2 — offline evidence (grounding)
Does what the item claims line up with what exists?
- frontmatter-declared
files/scriptsmust exist next to the item (missing → FAIL) - inline code-span path references are resolved relative to the item (missing → WARN — the skill may create them)
- declared
commands/toolsare checked onPATH(missing → WARN) --packs-dir DIRverifies devin-evals rubric packs are loadable — noted, not executed (eval runs are devin-evals' job)
G3 — measured effect (promotion policy)
G3 is not a heuristic this tool runs — it is a promotion policy
consuming a g3-report/0.1 JSON produced elsewhere (an A/B eval run,
e.g. devin-evals). Pass it with promote --g3-report PATH:
| item | no report | improves / no-detectable-effect |
inconclusive |
regresses |
|---|---|---|---|---|
always-on rule (.devin/rules) |
refused | promoted | refused | refused |
skill (.devin/skills) |
promoted; registry records g3: "not-measured" |
promoted; records g3: "<verdict>" + report path |
promoted only with --g3-inconclusive-reason "…" (recorded) |
refused |
regressesis a hard block for every kind — a regressed artifact must not be promoted, and--forcedoes not override it (--forceonly lifts a G1 FAIL).- Promotion stays an explicit human decision:
--applyis still required; without it the plan prints what the verdict would do and writes nothing. - If the report's
candidate.sha256does not match the stored copy, promote prints a warning but proceeds — the report may legitimately describe a pre-fix artifact.
Producing a report with the judge (optional judge extra —
pip install "devin-skill-catalog[judge]" pulls
poordjaevin, a calibrated
"System One" decision layer):
devin-skill-catalog g3 rule:my-rule --judge --evidence eval-summary.txt --out g3.json
devin-skill-catalog promote rule:my-rule --g3-report g3.json --apply
g3 --judge asks the judge three concrete questions about the
--evidence text — is the evidence sufficient? does it show
improvement? does it show regression? — and maps the calibrated
probabilities to the verdict with a deterministic, fail-safe rule:
abstention, or insufficient/borderline evidence, is inconclusive; a
clear regression signal beats a clear improvement one. Without --out
the report JSON prints to stdout.
The judge backend is never hardcoded: POORDJAEVIN_BACKEND selects it
(nli / vscode-lm / acp, same convention as poordjaevin's own
CLI); unset means the default local NLI model — keyless, offline after
a one-time ~400 MB download. --calibrator PATH applies a fitted
poordjaevin calibrate output.
Adopting external skills
Adopting a third-party skill means a governed catalog entry pinned by SHA-256, not a code fork and not a bare pointer. Upstream URLs are provenance; the catalog governs a frozen local copy.
-
Vendor into a staging
.devindir that nothing loads — never straight into a live workspace or the user skills dir; files there load immediately, bypassing the gates. Any folder shaped like.devin/skills/works:<staging>/.devin/skills/<name>/ ← copy of the upstream skill dir -
Govern through the normal lifecycle:
devin-skill-catalog scan <staging>/.devin --no-user devin-skill-catalog quarantine skill:<name> <staging>/.devin --apply --note "vendor adopt: <upstream-url> @ <commit>" devin-skill-catalog gate g1 <staging>/.devin/skills/<name> devin-skill-catalog promote skill:<name> --apply --note "G1 pass" devin-skill-catalog activate skill:<name> --apply -
Install only what you want live, manually — copy the item dir into a live
skills/dir (create it first so the copy lands atskills/<name>/SKILL.md):.devin/skills/inside a workspace for project scope, or a user-level dir —~/.devin/skills/on any OS,${XDG_CONFIG_HOME:-~/.config}/devin/skills/on Linux,%APPDATA%\devin\skills\on Windows,~/Library/Application Support/devin/skills/on macOS.
Rules of the road:
- Keep a
VENDORS.mdnext to the staging dir: upstream URL, license, commit SHA, date. Keep the license file for MIT/CC-BY content. - A G1 FAIL on third-party content deserves a human read before
--force: skills that teach injection hygiene legitimately quote attack strings — that is a recorded false-positive, not a verdict. - Active-in-catalog ≠ loaded. Install into a live skills dir only what you actually want in sessions.
export-bundlepacks approved items only — bundle a reviewed set before activating it, or keep shipping copies viaimport-bundlequarantine on the receiving side.- On upstream changes, re-vendor by replacing the staged item dir (delete it, then copy) and re-quarantining from scratch — copying over the old tree leaves files upstream deleted, and the quarantine store merges rather than replaces, so stale files would survive the re-review.
Worked example: 25 skills from addyosmani/agent-skills (MIT), 6 from
DietrichGebert/ponytail (MIT) and a local graphify install were
governed this way on 2026-10-13 — 30 clean G1 passes and 2 documented
false-positives (quoted injection strings inside anti-injection
guidance), all promoted and activated.
Honest limitations
- Heuristic gates are not proof. G1 catches known-bad phrasing and token shapes; a cleverly worded injection or an unusual secret format will sail through, and benign text can false-positive. A clean G1/G2 run means "no red flags found", not "safe".
.devin/is never written. Quarantine marks + snapshots; it does not remove the original. Activation records intent; installing is manual.- Frontmatter is not YAML. The parser handles the common subset (scalars, lists, block scalars) and degrades gracefully on the rest.
- Registry ≠ audit log. It records transitions and gate outcomes for your own workflow; it is not tamper-evident.
- Bundle imports trust the manifest format, not the manifest's claims: checksums are verified, but items still land quarantined and must pass the gates to promote.
Development
pip install -e ".[dev]"
python -m pytest
Tests run entirely on synthetic .devin/ fixture trees — nothing real
is scanned.
Adapters (MCP server, Devin skill, plugin)
devin_skill_catalog.mcp_server exposes the read-only half of the CLI as MCP
tools via the devin-skill-catalog-mcp entry point
(pip install 'devin-skill-catalog[mcp]'). The write path stays CLI-only for a
human.
adapters/ is a self-contained Devin plugin root
(adapters/.devin-plugin/plugin.json +
adapters/skills/devin-skill-catalog/SKILL.md), installed with
devin plugins install Icaro0310/devin-devkit#packages/skill-catalog/adapters — it ships in the repo,
not inside the wheel. The manifest launches the server through
uvx --from 'devin-skill-catalog[mcp]' devin-skill-catalog-mcp, which resolves
from 0.1.1 on (the 0.1.0 wheel predates the console script).
The same stdio server registers in other MCP hosts:
Zed — context_servers in settings.json:
{
"context_servers": {
"devin-skill-catalog": { "command": { "path": "devin-skill-catalog-mcp", "args": [] } }
}
}
JetBrains — Settings → Tools → AI Assistant → Model Context Protocol → Add:
{ "mcpServers": { "devin-skill-catalog": { "command": "devin-skill-catalog-mcp" } } }
Antigravity — ~/.gemini/config/mcp_config.json:
{ "mcpServers": { "devin-skill-catalog": { "command": "devin-skill-catalog-mcp" } } }
When to use this
- You want to know which skills/rules exist across workspaces and user
dirs, and whether they drifted (
diff). - You are about to adopt a skill from somewhere else and want a
quarantine → gate → approve path instead of dropping it into
.devin/. - You want to move reviewed items between machines with checksum
verification (
export-bundle/import-bundle).
When NOT to use this
- You want a security scanner with guarantees — the gates are heuristics, not proof (see Honest limitations).
- You want the tool to modify
.devin/— it is deliberately read-only there; only the registry dir is writable. - You want rubric evals executed — that is devin-evals' job; G2 only verifies packs are loadable.
License
MIT — see LICENSE.
Metadata
Release files for devin-skill-catalog 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| devin_skill_catalog-0.1.1.tar.gz | 68.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| devin_skill_catalog-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 117.3 kB
Release files / devin_skill_catalog-0.1.1.tar.gz
| Download URL | devin_skill_catalog-0.1.1.tar.gz |
|---|---|
| Size | 68.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
43ec31f252cd2951b1a9e3916c103dbf352bf404045df1b9a08390d1fb32e9f0
|
|
BLAKE2b-256 checksum How to use checksums |
bd97605badf2865f64696b9ab5ab4867f86c8afd23fc6c6b507d93d8ab3dc1fe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / devin_skill_catalog-0.1.1-py3-none-any.whl
| Download URL | devin_skill_catalog-0.1.1-py3-none-any.whl |
|---|---|
| Size | 49.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ece40b8288fe0a31bfcd7d3a5c6b1c0e28649c8f442999ddbb787bfe799c61b3
|
|
BLAKE2b-256 checksum How to use checksums |
ac9c1553343e5d87c6865859346eac3f6b23604de1089ac6b8767b9fb20b0d6c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logSecurity for devin-skill-catalog 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for devin_skill_catalog-0.1.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.