@harness-engineering/linter-gen
v0.1.6
Published
Generate ESLint rules from YAML configuration
Readme
@harness-engineering/linter-gen
Generate ESLint rules from YAML configuration using extensible Handlebars templates.
Installation
pnpm add @harness-engineering/linter-genUsage
Configuration
Create harness-linter.yml:
version: 1
output: ./generated/eslint-rules
rules:
- name: no-ui-in-services
type: import-restriction
severity: error
config:
source: 'src/services/**'
forbiddenImports:
- 'react'
- 'src/ui/**'
message: 'Service layer cannot import UI code'CLI
# Generate rules
harness linter generate
# Generate with options
harness linter generate --config ./custom-config.yml --output ./rules --clean
# Validate config only
harness linter validateProgrammatic API
import { generate, validate } from '@harness-engineering/linter-gen';
// Generate rules
const result = await generate({
configPath: './harness-linter.yml',
outputDir: './generated',
clean: true,
});
if (result.success) {
console.log(`Generated ${result.rulesGenerated.length} rules`);
}
// Validate config
const validation = await validate({ configPath: './harness-linter.yml' });Built-in Templates
import-restriction
Block imports matching patterns in files matching a source pattern.
- name: no-react-in-services
type: import-restriction
config:
source: 'src/services/**'
forbiddenImports:
- 'react'
- 'react-dom'
message: 'Service files cannot import React'boundary-validation
Ensure files export Zod schemas for validation.
- name: api-must-validate
type: boundary-validation
config:
pattern: 'src/api/**/*.ts'
requireZodSchema: true
message: 'API endpoints must use Zod validation'dependency-graph
Detect circular import dependencies.
- name: no-cycles
type: dependency-graph
config:
entryPoints:
- 'src/index.ts'
exclude:
- '**/*.test.ts'
maxDepth: 20Custom Templates
Convention-based
Place templates in templates/ directory relative to config:
project/
├── harness-linter.yml
└── templates/
└── my-custom-type.ts.hbsExplicit paths
Specify template paths in config:
templates:
my-custom-type: ./custom-templates/my-rule.ts.hbsTemplate Context
Templates receive:
{
name: 'rule-name', // kebab-case
nameCamel: 'ruleName', // camelCase
namePascal: 'RuleName', // PascalCase
severity: 'error', // error | warn | off
config: { ... }, // Template-specific config
meta: {
generatedAt: '2026-03-13T...',
generatorVersion: '0.1.0',
configPath: '/path/to/config.yml',
}
}Handlebars Helpers
{{json value}}- JSON.stringify{{jsonPretty value}}- JSON.stringify with formatting{{camelCase "kebab-name"}}- Convert to camelCase{{pascalCase "kebab-name"}}- Convert to PascalCase
License
MIT
