linter — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited linter (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are in AUTONOMOUS MODE. Do NOT ask questions. Do NOT pause for confirmation. Execute every phase below in sequence, making decisions based on what you find.
============================================================ PHASE 0 — INPUT ============================================================
$ARGUMENTS may contain:
--tool=TOOL — force a specific linter: eslint, biome, ruff, golangci-lint, rubocop, clippy--fix — auto-fix all fixable violations after setup (default: setup only)--strict — enable stricter rule sets (recommended for new projects)--no-format — skip formatter setup, configure linter only--migrate — migrate from one tool to another (e.g., ESLint → Biome, flake8 → Ruff)If no arguments, auto-detect the stack and set up the appropriate tools.
============================================================ PHASE 1 — STACK DETECTION ============================================================
Detect the language and existing lint/format tooling:
JavaScript / TypeScript:
.eslintrc.*, eslint.config.* (flat config), biome.json, biome.jsonc.prettierrc*, .prettierignore, biome.jsonjsx), Vue (.vue), Svelte (.svelte), Angulartsconfig.json present → enable type-aware lint rulesPython:
ruff.toml, pyproject.toml [tool.ruff], .flake8, setup.cfg [flake8], pylintrcpyproject.toml [tool.black], ruff.toml [format]mypy.ini, pyproject.toml [tool.mypy], pyrightconfig.jsonGo:
.golangci.yml, .golangci.yamlgofmt / goimports (built-in)Rust:
clippy.toml, .clippy.tomlrustfmt.toml, .rustfmt.tomlRuby:
.rubocop.ymlFlutter / Dart:
analysis_options.yamldart format (built-in)Record: language, existing tools, missing tools, framework-specific needs.
============================================================ PHASE 2 — CONFIGURE LINTER ============================================================
2.1 — JavaScript / TypeScript:
If no linter exists OR --migrate from legacy ESLint:
Prefer ESLint 9 flat config for new setups:
npm install --save-dev eslint @eslint/js typescript-eslint globalsAdd framework plugins:
eslint-plugin-react, eslint-plugin-react-hooks@next/eslint-plugin-nexteslint-plugin-vueeslint.config.js: import js from '@eslint/js';
import tseslint from 'typescript-eslint';
import globals from 'globals';
export default tseslint.config(
js.configs.recommended,
...tseslint.configs.recommended,
{
languageOptions: {
globals: { ...globals.node }
},
rules: {
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
'@typescript-eslint/no-explicit-any': 'warn',
}
},
{ ignores: ['dist/', 'node_modules/', 'coverage/'] }
);package.json: "lint": "eslint ."If Biome is preferred or requested:
npm install --save-dev --exact @biomejs/biomebiome.json: {
"$schema": "https://biomejs.dev/schemas/1.9.0/schema.json",
"organizeImports": { "enabled": true },
"linter": {
"enabled": true,
"rules": { "recommended": true }
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2
}
}"lint": "biome check .", "lint:fix": "biome check --write ."If --strict: enable tseslint.configs.strictTypeChecked or Biome "all" rules with selected disables.
2.2 — Python:
Prefer Ruff (replaces flake8, isort, black, pyflakes, pycodestyle):
pyproject.toml: [tool.ruff]
target-version = "py312"
line-length = 88
[tool.ruff.lint]
select = ["E", "F", "W", "I", "N", "UP", "B", "A", "SIM", "TCH"]
ignore = []
[tool.ruff.format]
quote-style = "double"If --strict: add "S" (bandit security), "D" (docstrings), "ANN" (type annotations).
If migrating from flake8/pylint/isort:
2.3 — Go:
Configure golangci-lint:
.golangci.yml: linters:
enable:
- errcheck
- gosimple
- govet
- ineffassign
- staticcheck
- unused
- gocritic
- gofumpt
- misspell
- revive
linters-settings:
gocritic:
enabled-tags: [diagnostic, style, performance]
gofumpt:
extra-rules: true
issues:
max-issues-per-linter: 0
max-same-issues: 0If --strict: add exhaustive, nilnil, wrapcheck, errorlint.
2.4 — Rust:
Clippy is built-in. Create clippy.toml for custom config if needed:
cognitive-complexity-threshold = 25Add to CI: cargo clippy -- -D warnings
Create rustfmt.toml:
edition = "2021"
max_width = 100
use_field_init_shorthand = true2.5 — Ruby:
Configure RuboCop:
gem install rubocop (or add to Gemfile).rubocop.yml with project-appropriate rules2.6 — Flutter / Dart:
Configure or update analysis_options.yaml:
include: package:flutter_lints/flutter.yaml
linter:
rules:
prefer_const_constructors: true
prefer_const_declarations: true
avoid_print: true
prefer_single_quotes: true============================================================ PHASE 3 — CONFIGURE FORMATTER ============================================================
Skip if --no-format.
JavaScript / TypeScript (if not using Biome):
npm install --save-dev prettier.prettierrc: {
"semi": true,
"singleQuote": true,
"trailingComma": "all",
"printWidth": 100,
"tabWidth": 2
}.prettierignore: dist
node_modules
coverage
pnpm-lock.yaml"format": "prettier --write .", "format:check": "prettier --check ."Python (if not using Ruff format):
Go: gofmt / goimports — no config needed, built into Go toolchain.
Rust: rustfmt — configured via rustfmt.toml in Phase 2.
Create .editorconfig if it does not exist:
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{py,rs}]
indent_size = 4
[*.go]
indent_style = tab
[Makefile]
indent_style = tab============================================================ PHASE 4 — EDITOR INTEGRATION ============================================================
Create or update .vscode/settings.json (merge with existing):
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit"
}
}Add language-specific settings:
"editor.defaultFormatter": "dbaeumer.vscode-eslint" for JS/TS files"editor.defaultFormatter": "biomejs.biome" for JS/TS files"editor.defaultFormatter": "esbenp.prettier-vscode" for JS/TS/JSON/MD"[python]": { "editor.defaultFormatter": "charliermarsh.ruff" }"[go]": { "editor.defaultFormatter": "golang.go" }"[rust]": { "editor.defaultFormatter": "rust-lang.rust-analyzer" }Create or update .vscode/extensions.json with recommended extensions:
{
"recommendations": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"EditorConfig.EditorConfig"
]
}============================================================ PHASE 5 — FIX EXISTING VIOLATIONS ============================================================
If --fix was passed:
npx eslint . --fixnpx biome check --write .npx prettier --write .ruff check --fix . && ruff format .golangci-lint run --fixcargo clippy --fix --allow-dirtydart fix --apply && dart format .--fixstyle: auto-fix lint and format violationsIf --fix was NOT passed, still report the violation count so the user knows the current state.
============================================================ SELF-HEALING VALIDATION (max 2 iterations) ============================================================
After completing, validate the output was produced correctly:
IF VALIDATION FAILS:
============================================================ OUTPUT ============================================================
Print a summary:
## Linter Setup Complete
### Stack: {language} / {framework}
### Tools Configured
- Linter: {ESLint 9 | Biome | Ruff | golangci-lint | Clippy | RuboCop}
- Formatter: {Prettier | Biome | Ruff | gofmt | rustfmt}
- Editor: VS Code format-on-save enabled
### Current State
- Auto-fixable violations: {N} (fixed with --fix)
- Remaining violations: {N} (require manual review)
- Clean files: {N}/{total}
### Files Created/Modified
- {list of files}============================================================ NEXT STEPS ============================================================
/git-hooks to enforce lint on every commitnpm run lint / ruff check ./github-actions to generate CI workflow============================================================ SELF-EVOLUTION TELEMETRY ============================================================
After producing output, record execution metadata for the /evolve pipeline.
Check if a project memory directory exists:
~/.claude/projects/skill-telemetry.md in that memory directoryEntry format:
### /linter — {{YYYY-MM-DD}}
- Outcome: {{SUCCESS | PARTIAL | FAILED}}
- Self-healed: {{yes — what was healed | no}}
- Iterations used: {{N}} / {{N max}}
- Bottleneck: {{phase that struggled or "none"}}
- Suggestion: {{one-line improvement idea for /evolve, or "none"}}Only log if the memory directory exists. Skip silently if not found. Keep entries concise — /evolve will parse these for skill improvement signals.
============================================================ DO NOT ============================================================
.eslintrc.json) for new setups — use flat config (eslint.config.js)no-unused-vars removing code)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.