Borrowing it
Nothing to install: this file belongs to yoheimuta/protolint. 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/yoheimuta/protolint/master/.claude/skills/add-lint-rule/SKILL.mdgit clone --depth 1 https://github.com/yoheimuta/protolintWrote 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/yoheimuta/protolint/add-lint-rule)<a href="https://agentmods.dev/skills/yoheimuta/protolint/add-lint-rule"><img src="https://agentmods.dev/badge/skills/yoheimuta/protolint/add-lint-rule/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/yoheimuta/protolint/add-lint-rule"><img src="https://agentmods.dev/badge/skills/yoheimuta/protolint/add-lint-rule.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
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.00052 | $0.00811 |
| Opus 5 | $0.00026 | $0.00405 |
| Sonnet 5 | $0.00010 | $0.00162 |
| Haiku 4.5 | $0.00005 | $0.00081 |
Grade A, and why
add-lint-rule 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 9d 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 — 79 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Adding a lint rule
A rule is not done when Apply works — it has to be registered, made
configurable, and documented, or it is invisible to users. Copy the closest
existing rule rather than starting from scratch.
Files to touch
| File | Always? | What goes in |
|---|---|---|
internal/addon/rules/<camelCase>Rule.go |
yes | the rule |
internal/addon/rules/<camelCase>Rule_test.go |
yes | table-driven tests |
internal/cmd/subcmds/rules.go |
yes | register in newAllInternalRules |
internal/linter/config/rulesOption.go |
yes | one field on RulesOption |
README.md |
yes | a row in the ## Rules table |
_example/config/.protolint.yaml |
yes | a commented example entry |
internal/linter/config/<name>Option.go (+ test) |
only if configurable | a dedicated option type |
_testdata/rules/<name>/*.proto |
when fixtures help | input protos |
Naming is mechanical: rule ID FIELD_NUMBERS_ORDER_ASCENDING → type
FieldNumbersOrderAscendingRule → file fieldNumbersOrderAscendingRule.go →
config key field_numbers_order_ascending.
The rule type
Embed RuleWithSeverity and implement:
ID() string—UPPER_SNAKE_CASE, uniquePurpose() string— one sentence; it is user-facing and goes in the README verbatimIsOfficial() bool— this decides whether the rule is on by default
Rules.Default() in internal/linter/rule/rules.go keeps only rules where
IsOfficial() is true. Return true only for rules from the
official style guide; anything
opinionated returns false and users opt in via .protolint.yaml.
Apply(proto *parser.Proto) ([]report.Failure, error) walks the AST with a
visitor from linter/visitor.
Fixable and auto-disable
Both are opt-in and both show up as columns in the README table.
- Fixable — build the visitor with
visitor.NewBaseFixableVisitorand take afixMode boolin the constructor. Users get it via-fix. - AutoDisable — take
autoDisableType autodisable.PlacementType. The constructor must forcefixMode = falsewhenautoDisableType != autodisable.Noop; the two cannot both apply. Users get it via-auto_disable.
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.
- 9d ago First seen · 79 lines · 52 tokens per session scan A 23fcd8133c10
add-lint-rule is a skill published in the GitHub repository yoheimuta/protolint (697 stars, last pushed 25d ago), licensed MIT. It adds 52 tokens to every session and 811 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
no-bare-casts
Writing as in TypeScript or TSX production code, modifying a file that contains a bare as cast, silencing a type error with a cast, encountering as unknown as, or reviewing a cast site.
performance-lint-rules
Performance review guidance for Oxc linter rule implementations. Use only when reviewing Rust rule code under crates/oxclinter/src/rules/ or when explicitly auditing those rules for performance improvements.
ultracite
Ultracite is a zero-config linting and formatting preset for JavaScript/TypeScript projects. Use when: (1) Setting up or initializing Ultracite in a project (ultracite init), (2) Running linting or formatting commands (check, fix, doctor), (3) Writing or reviewing JS/TS code in a project that uses Ultracite — to…
solid-principles
SOLID principles checklist with Java examples. Use when a class has too many responsibilities, an abstraction leaks, or a dependency points the wrong way, and when the user asks about Single Responsibility, Open/Closed, Liskov, Interface Segregation or Dependency Inversion. For naming, duplication and method length…
go-concurrency-safety
L1 supplement - audits Go-specific concurrency hazards in node client code: map iteration non-determinism, goroutine leaks, mutex ordering, panic boundaries, context cancellation.
ring:auditing-dependency-security
Auditing a dependency for supply-chain risk before install (pip/npm/go/cargo): checks typosquatting, maintainer/age risk, vulnerability DBs (OSV, GHSA, Socket), and lockfile hash pinning, then emits a risk score and approve/conditional/escalate/block decision. Use when adding or updating a dependency, reviewing a…