Borrowing it
Nothing to install: this file belongs to zernie/vigiles. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/zernie/vigiles/main/.claude/skills/add-a-linter/SKILL.mdgit clone --depth 1 https://github.com/zernie/vigilesWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/zernie/vigiles/add-a-linter)<a href="https://agentmods.dev/skills/zernie/vigiles/add-a-linter"><img src="https://agentmods.dev/badge/skills/zernie/vigiles/add-a-linter/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/zernie/vigiles/add-a-linter"><img src="https://agentmods.dev/badge/skills/zernie/vigiles/add-a-linter.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00053 | $0.01722 |
| Opus 5 | $0.00026 | $0.00861 |
| Sonnet 5 | $0.00011 | $0.00344 |
| Haiku 4.5 | $0.00005 | $0.00172 |
Grade A, and why
add-a-linter scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 12d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 110 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Add a linter to vigiles's cross-referencing engine (the enforce("eslint/...")
moat). This is a contributor task, not a third-party extension point: the
LINTERS registry is a Record<BuiltinLinter, LinterAdapter> — a closed
set baked into core — so a linter is added by editing vigiles itself, and the
type system + the conformance test make the parity un-forgettable.
The whole reason this skill exists: a linter used to be smeared across ~7
scattered sites (existence check, config checker, CLI-tool map, suggestion
enumerator, generate-types discoverer, docs, site) with nothing enforcing
that you touched all of them — miss one and it failed silently. Now tsc fails
if the registry entry is missing, and src/core/linter-contract.test.ts fails
if the docs table or the marketing site drifts. Follow the steps; let the
gates catch what you forget. See research/linter-adapter-architecture.md.
The one invariant
A linter is one LinterAdapter in one registry. Everything else —
existence, config-enabled, suggestions, type-gen, docs, site — is a field or a
method on that adapter, cross-checked by the conformance test. You never again
hunt for "the other place this linter is registered."
Steps
Work in this order — each step's gate tells you the next is needed.
-
Name it (the single source). Add the lowercase name to
BUILTIN_LINTERSinsrc/core/spec.ts.BuiltinLinterderives from this array, so the moment you save,tscfails onLINTERSinlinters.tswith "property<name>is missing" — that error is your to-do list. -
Pick the existence-check kind (
LinterCapabilities.existenceCheckinsrc/core/linter-adapter.ts) — this decides which helper builds the adapter:node-api— the rule set is resolved from an installed npm package (eslint, stylelint). UsenodeApiAdapter(name, resolver, configEnabled, discover).cli— a real command asks the tool whether a rule exists (ruff, clippy, pylint, rubocop, detekt, ktlint, checkstyle, golangci-lint). UsecliAdapter(name, cliTool, checkExists, configEnabled, discover, enumerate?).filesystem— presence in a project file counts, no tool (cedar). Write a literal adapter (see cedar inlinters.ts).format-only— only the reference shape is validated, no tool exists to list rules (ktlint's catalog is unlistable). Still acliadapter, just omit theenumeratearg; the existence check is the qualified-shape rule.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 12d ago First seen · 110 lines · 53 tokens per session scan A 08aba024300e
add-a-linter is a skill published in the GitHub repository zernie/vigiles (15 stars, last pushed yesterday), licensed MIT. It adds 53 tokens to every session and 1,722 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
link-check
Verify @file references in AIWG skills and agents against the linking contract — per-file or corpus-wide, with optional auto-fix.
activity-log
Query and manage the unified .aiwg/activity.log chronological record of AIWG-managed workflow operations.
hook-enable
Enable the AIWG context hook in platform context files without re-deploying.
mention-lint
Lint @-mentions for style consistency and correctness.
validate-metadata
Validate AIWG extension definitions against the metadata schema and report errors with field names, line numbers, and remediation hints.
eval-agent
Run evaluation tests against an agent to assess quality and archetype resistance.