Skip to content

ESLint plugin

@gspothq/eslint-plugin adds lint rules for code that AI coding agents often write. They flag files and functions that only forward a call, exports that only rename a value, and imports through index files. They also flag comments mixed into import blocks and private environment variables read in client code.

The gspot CLI sets this plugin up for you. Install it yourself only when you run ESLint without gspot.

You need Node.js 22.12 or newer and ESLint 9.38.0 or newer with a flat config file, such as eslint.config.mjs.

Package manager Command
npm npm install --save-dev @gspothq/eslint-plugin eslint
pnpm pnpm add --save-dev @gspothq/eslint-plugin eslint
Yarn yarn add --dev @gspothq/eslint-plugin eslint
Bun bun add --dev @gspothq/eslint-plugin eslint

Add a plugin config to eslint.config.mjs. recommended turns on gspot/no-client-env; all turns on every lint rule except gspot/require-server-only.

import gspot from '@gspothq/eslint-plugin';
export default [gspot.configs.all];

A finding looks like this:

src/orders.js
15:14 error getOrderTotal only renames orderTotal. Export the source value directly instead of an alias gspot/no-alias-exports

Turn on gspot/require-server-only for the files that hold server code:

import gspot from '@gspothq/eslint-plugin';
export default [{ files: ['src/server/**/*.js'], plugins: { gspot }, rules: { 'gspot/require-server-only': 'error' } }];

gspot/import-boundaries reads its folders relative to the working folder of ESLint. To use another root, set settings: { gspot: { root: import.meta.dirname } }.

Each rule page gives the options, defaults, and an example.

RuleConfigs that turn it onWhat it finds
gspot/import-boundariesallFinds relative imports that leave the nearest boundary folder.
gspot/no-alias-exportsallFinds an exported constant that only renames another value.
gspot/no-client-envrecommended, allFinds private environment reads in client modules, including process.env, Bun.env, Deno.env, and import.meta.env.
gspot/no-comments-in-importsallReports comments within or immediately after an import block.
gspot/no-index-importsallFinds an import that names an index file instead of the module that declares the value, including module paths in Vitest and Jest mocks.
gspot/no-trivial-filesallReports files containing only forwarding, aliases, re-exports, or trivial functions.
gspot/no-trivial-functionsallReports named functions with two statements or fewer at the default limit.
gspot/require-server-onlyNoneChecks that a selected server module imports "server-only" or declares "use server".

Install @typescript-eslint/parser and TypeScript 4.8.4 or newer and older than 6.1.0, then select your TypeScript files:

import gspot from '@gspothq/eslint-plugin';
import tsParser from '@typescript-eslint/parser';
export default [
{
...gspot.configs.all,
files: ['**/*.ts', '**/*.tsx'],
languageOptions: { parser: tsParser, parserOptions: { projectService: true } },
},
];

gspot/no-trivial-functions uses the type information from projectService to skip a method that an interface or a base class declares.