$npx -y skills add tobihagemann/turbo --skill review-toolingDetect what dev tooling infrastructure a project has and flag gaps across linters, formatters, pre-commit hooks, test runners, and CI/CD pipelines. Returns structured findings without applying changes. Use when the user asks to \"review tooling\", \"check project tooling\", \"wha
| 1 | # Review Tooling |
| 2 | |
| 3 | Detect dev tooling infrastructure and flag gaps. Analysis only. Does not install or configure tools. |
| 4 | |
| 5 | ## Scope |
| 6 | |
| 7 | Tooling review always operates at the project level since config files live at the project root. Scope parameters (diff commands, file lists) are accepted but ignored. |
| 8 | |
| 9 | When called standalone, use the git repository root as the project root (fall back to the current working directory if not in a git repo). |
| 10 | |
| 11 | ## Step 1: Detect Tooling |
| 12 | |
| 13 | Search for config files in the project root and subdirectories (exclude vendored directories like `node_modules/`, `vendor/`, `.build/`). Classify findings into five categories: |
| 14 | |
| 15 | ### Linters |
| 16 | |
| 17 | | Config file pattern | Tool | |
| 18 | |---|---| |
| 19 | | `.eslintrc*`, `eslint.config.*` | ESLint | |
| 20 | | `biome.json`, `biome.jsonc` | Biome (linter + formatter) | |
| 21 | | `deno.json`, `deno.jsonc` with `lint` config | Deno lint | |
| 22 | | `.swiftlint.yml` | SwiftLint | |
| 23 | | `ruff.toml`, `[tool.ruff]` in `pyproject.toml` | Ruff | |
| 24 | | `.pylintrc`, `pylintrc` | Pylint | |
| 25 | | `.flake8`, `[flake8]` in `setup.cfg` | Flake8 | |
| 26 | | `.rubocop.yml` | RuboCop | |
| 27 | | `.golangci.yml`, `.golangci.yaml` | golangci-lint | |
| 28 | | `clippy.toml`, `.clippy.toml` | Clippy | |
| 29 | | `ktlint*`, `.editorconfig` with `ktlint` | ktlint | |
| 30 | |
| 31 | ### Formatters |
| 32 | |
| 33 | | Config file pattern | Tool | |
| 34 | |---|---| |
| 35 | | `.prettierrc*`, `prettier.config.*` | Prettier | |
| 36 | | `biome.json`, `biome.jsonc` | Biome (linter + formatter) | |
| 37 | | `deno.json`, `deno.jsonc` with `fmt` config | Deno fmt | |
| 38 | | `.swift-format`, `.swiftformat` | swift-format / SwiftFormat | |
| 39 | | `[tool.black]` in `pyproject.toml`, `pyproject.toml` with `[tool.ruff.format]` | Black / Ruff formatter | |
| 40 | | `rustfmt.toml`, `.rustfmt.toml` | rustfmt | |
| 41 | | `gofmt` / `goimports` (check CI config or `Makefile` for usage) | gofmt | |
| 42 | | `.clang-format` | ClangFormat | |
| 43 | |
| 44 | ### Pre-commit Hooks |
| 45 | |
| 46 | | Config file pattern | Tool | |
| 47 | |---|---| |
| 48 | | `.husky/` directory | Husky | |
| 49 | | `.lintstagedrc*`, `lint-staged` key in `package.json` | lint-staged | |
| 50 | | `.pre-commit-config.yaml` | pre-commit framework | |
| 51 | | `.git/hooks/pre-commit` (non-sample) | Custom git hook | |
| 52 | | `.lefthook.yml`, `lefthook.yml` | Lefthook | |
| 53 | |
| 54 | ### Test Runners |
| 55 | |
| 56 | | Config file pattern | Tool | |
| 57 | |---|---| |
| 58 | | `jest.config.*`, `jest` key in `package.json` | Jest | |
| 59 | | `vitest.config.*` | Vitest | |
| 60 | | `pytest.ini`, `[tool.pytest]` in `pyproject.toml`, `conftest.py` | pytest | |
| 61 | | `Package.swift` with test targets, `*Tests/` directories | Swift Testing / XCTest | |
| 62 | | `_test.go` files | Go testing | |
| 63 | | `Cargo.toml` with `[dev-dependencies]`, `tests/` directory | Rust tests | |
| 64 | | `.rspec`, `spec/` directory | RSpec | |
| 65 | | `phpunit.xml*` | PHPUnit | |
| 66 | |
| 67 | ### CI/CD Pipelines |
| 68 | |
| 69 | | Config file pattern | Tool | |
| 70 | |---|---| |
| 71 | | `.github/workflows/*.yml` | GitHub Actions | |
| 72 | | `.gitlab-ci.yml` | GitLab CI | |
| 73 | | `Jenkinsfile` | Jenkins | |
| 74 | | `.circleci/config.yml` | CircleCI | |
| 75 | | `bitbucket-pipelines.yml` | Bitbucket Pipelines | |
| 76 | | `.travis.yml` | Travis CI | |
| 77 | | `azure-pipelines.yml` | Azure Pipelines | |
| 78 | |
| 79 | These tables are not exhaustive. If the project uses a tool not listed here, detect it by recognizing its config files. |
| 80 | |
| 81 | ## Step 2: Identify the Project Ecosystem |
| 82 | |
| 83 | Determine the primary language(s) and ecosystem from config files and source code. This informs which tooling gaps are relevant. A Go project without Prettier is not a gap. A Node.js project without a linter is. |
| 84 | |
| 85 | | Signal | Ecosystem | |
| 86 | |---|---| |
| 87 | | `package.json` | Node.js / JavaScript / TypeScript | |
| 88 | | `Package.swift`, `*.xcodeproj` | Swift / Apple | |
| 89 | | `pyproject.toml`, `setup.py`, `requirements.txt` | Python | |
| 90 | | `go.mod` | Go | |
| 91 | | `Cargo.toml` | Rust | |
| 92 | | `Gemfile` | Ruby | |
| 93 | | `pom.xml`, `build.gradle*` | Java / Kotlin | |
| 94 | | `deno.json`, `deno.jsonc` | Deno | |
| 95 | |
| 96 | ## Step 3: Analyze Gaps |
| 97 | |
| 98 | For each category, assess whether the project has adequate tooling for its ecosystem: |
| 99 | |
| 100 | - **Present and configured** — tool detected with config file |
| 101 | - **Partially configured** — tool detected but config appears minimal or default |
| 102 | - **Missing** — no tool detected for a category where one is standard for the ecosystem |
| 103 | |
| 104 | When assessing pre-commit hooks, also check whether detected linters and formatters are wired into the hooks. A project with ESLint and Prettier but no pre-commit hook means formatting issues can slip into commits. |
| 105 | |
| 106 | When assessing CI/CD, check whether the pipeline runs tests and linters. A CI config that only builds but never tests is a gap. |
| 107 | |
| 108 | ## Output Format |
| 109 | |
| 110 | Format each finding as: |
| 111 | |
| 112 | ``` |
| 113 | ### [P<N>] <title (imperative, <=80 chars)> |
| 114 | |
| 115 | **Category:** <Linters | Formatters | Pre-commit Hooks | Test Runners | CI/CD> |
| 116 | |
| 117 | <one paragraph: what is missing or misconfigured and why it matters for thi |