Our review
This skill guides the addition of a new linting rule to the attgo-linter project, following a structured procedure.
Strengths
- Clear step-by-step instructions with ready-to-use templates
- Includes creation of tests and test fixtures
- Comprehensive checklist to ensure nothing is missed
- Automates registration in the plugin and configuration files
Limitations
- Specific to the attgo-linter project and its Go analysis framework
- Requires prior knowledge of static analysis in Go
- Does not handle advanced custom rules or input validation
When you need to add a new linting rule to the attgo-linter project, including all associated files, tests, and documentation.
For a different linting project or if you want to modify an existing rule instead of creating a new one.
Security analysis
SafeThe skill instructs adding linter rules via standard file creation, code edits, and running 'go test'. No destructive, exfiltrating, or obfuscated commands are present.
No concerns found
Examples
Add a new linter rule called 'no-global-vars' that warns about global variable declarations, with priority HIGH. Provide a bad example with a global var and a good example using local variables. Include configuration to allow a whitelist of package-level constants.Create a linting rule named 'forbid-println' that flags calls to fmt.Println and log.Println. Priority MEDIUM. Bad example: fmt.Println("hello"). Good example: using a structured logger. Include test fixtures and documentation.Add Rule Skill
This skill helps you add new rules to the attgo-linter project.
Usage
When asked to add a new linter rule, follow these steps:
1. Gather Information
Ask the user for:
- Rule name: e.g., "no-global-vars"
- Description: What the rule checks
- Priority: HIGH (enabled by default), MEDIUM, or LOW (disabled by default)
- Bad example: Code that should trigger the warning
- Good example: Code that passes the check
- Configuration options: Any customizable settings
2. Create Analyzer Package
Create the following files:
analyzers/{rulename}/
├── analyzer.go
└── analyzer_test.go
The analyzer name must use underscores (not hyphens): attgo_{rule_name}
3. Create Test Fixtures
analyzers/{rulename}/testdata/src/{rulename}/
└── {rulename}.go
Use // want \regex pattern`` comments for expected diagnostics.
4. Register in Plugin
Update plugin.go:
- Add import
- Add to
BuildAnalyzers()with config check
Update config.go:
- Add
Enable{RuleName}field toConfigstruct - Set default in
DefaultConfig()
Update plugin.go config handling:
- Add explicit check for the setting in
New()
5. Update Documentation
- Add rule section to
README.md - Create
docs/rules/attgo-{rule-name}.md - Update
CHANGELOG.md
6. Verify
Run tests:
go test ./...
Template: analyzer.go
// Copyright © 2026 Attestant Limited.
// Licensed under the Apache License, Version 2.0 (the "License");
// ...
// Package {rulename} provides an analyzer that {description}.
package {rulename}
import (
"golang.org/x/tools/go/analysis"
)
const (
analyzerName = "attgo_{rule_name}"
doc = `{short description}
{detailed explanation}
Bad:
{bad example}
Good:
{good example}`
)
// Analyzer is the {description} analyzer.
var Analyzer = &analysis.Analyzer{
Name: analyzerName,
Doc: doc,
Run: run,
}
func run(pass *analysis.Pass) (any, error) {
for _, file := range pass.Files {
// Implementation
}
return nil, nil
}
Template: analyzer_test.go
// Copyright © 2025 Attestant Limited.
// ...
package {rulename}_test
import (
"testing"
"github.com/attestantio/attgo-linter/analyzers/{rulename}"
"golang.org/x/tools/go/analysis/analysistest"
)
func TestAnalyzer(t *testing.T) {
testdata := analysistest.TestData()
analysistest.Run(t, testdata, {rulename}.Analyzer, "{rulename}")
}
Template: testdata
// Copyright © 2025 Attestant Limited.
// ...
package {rulename}
// Bad case.
var bad = something // want `expected error`
// Good case.
var good = something // No warning
Checklist
- [ ] Created
analyzers/{rulename}/analyzer.go - [ ] Created
analyzers/{rulename}/analyzer_test.go - [ ] Created
analyzers/{rulename}/testdata/src/{rulename}/{rulename}.go - [ ] Added import to
plugin.go - [ ] Added to
BuildAnalyzers()inplugin.go - [ ] Added config field to
config.go - [ ] Added default value in
DefaultConfig() - [ ] Added config handling in
New() - [ ] Tests pass:
go test ./... - [ ] Added documentation to
README.md - [ ] Updated
CHANGELOG.md
Next.js App Router Expert
Development
A skill that turns Claude into a Next.js App Router expert.
README Generator
Development
Creates professional and comprehensive README.md files for your projects.
API Documentation Writer
Development
Generates comprehensive API documentation in OpenAPI/Swagger format.