Pular para o conteúdo

API de Regras

As regras do Archgate são arquivos TypeScript que exportam um objeto simples tipado com satisfies RuleSet. Cada regra recebe um RuleContext com utilitários para buscar arquivos, ler conteúdo e reportar violações.

/// <reference path="../rules.d.ts" />
export default {
rules: {
"my-rule-id": {
description: "Human-readable description of what this rule checks",
severity: "error", // optional, defaults to "error"
async check(ctx) {
// Rule logic here
},
},
},
} satisfies RuleSet;

Um arquivo de regras exporta por padrão um objeto simples com um registro rules indexado por ID de regra. As chaves se tornam os IDs das regras que aparecem na saída de verificação e nos relatórios de violação. A anotação satisfies RuleSet fornece verificação de tipos sem envolver em uma chamada de função.

type RuleSet = { rules: Record<string, RuleConfig> };

Cada regra no registro deve estar em conformidade com a interface RuleConfig.

interface RuleConfig {
description: string;
severity?: Severity;
check: (ctx: RuleContext) => Promise<void>;
}
CampoTipoObrigatórioDescrição
descriptionstringSimDescrição legível exibida na saída de verificação
severitySeverityNãoSeveridade padrão para violações. Padrão: "error"
check(ctx: RuleContext) => Promise<void>SimFunção assíncrona contendo a lógica da regra

A função check recebe um objeto RuleContext com o estado do projeto e métodos utilitários.

interface RuleContext {
projectRoot: string;
scopedFiles: string[];
changedFiles: string[];
glob(pattern: string): Promise<string[]>;
grep(file: string, pattern: RegExp): Promise<GrepMatch[]>;
grepFiles(pattern: RegExp, fileGlob: string): Promise<GrepMatch[]>;
readFile(path: string): Promise<string>;
readJSON(path: string): Promise<unknown>;
report: RuleReport;
}
projectRoot: string;

Caminho absoluto para o diretório raiz do projeto (onde .archgate/ está localizado).

scopedFiles: string[];

Arquivos que correspondem aos padrões glob de files do frontmatter do ADR. Se o ADR não tiver o campo files, contém todos os arquivos do projeto. Use esta lista como a lista principal de arquivos para suas verificações de regra.

changedFiles: string[];

Arquivos que foram modificados de acordo com o git. Quando --staged é usado, contém apenas arquivos no stage. Quando executado sem --staged, contém todos os arquivos alterados (staged e unstaged). Vazio quando nenhuma alteração git é detectada.

report: RuleReport;

A interface de relatório para registrar violações, avisos e mensagens informativas. Veja RuleReport abaixo.

glob(pattern: string): Promise<string[]>;

Encontra arquivos correspondentes a um padrão glob relativo à raiz do projeto. Retorna um array de caminhos absolutos de arquivo.

const testFiles = await ctx.glob("tests/**/*.test.ts");
grep(file: string, pattern: RegExp): Promise<GrepMatch[]>;

Busca em um único arquivo por linhas correspondentes a uma expressão regular. Retorna um array de objetos GrepMatch com caminho do arquivo, número da linha, coluna e conteúdo correspondente.

const matches = await ctx.grep(file, /console\.error\(/);
grepFiles(pattern: RegExp, fileGlob: string): Promise<GrepMatch[]>;

Busca em múltiplos arquivos correspondentes a um padrão glob por linhas que correspondam a uma expressão regular. Combina glob e grep em uma única chamada.

const matches = await ctx.grepFiles(/TODO:/i, "src/**/*.ts");
readFile(path: string): Promise<string>;

Lê o conteúdo de um arquivo como string. O caminho é relativo à raiz do projeto.

const content = await ctx.readFile("src/config.ts");
readJSON(path: string): Promise<unknown>;

Lê e faz o parse de um arquivo JSON. O caminho é relativo à raiz do projeto. Retorna o valor parseado como unknown — faça o cast para o tipo esperado na sua regra.

const pkg = (await ctx.readJSON("package.json")) as {
dependencies?: Record<string, string>;
};

A interface de relatório para registrar resultados de verificação. Cada método aceita um objeto de detalhe descrevendo o problema.

interface RuleReport {
violation(detail: ReportDetail): void;
warning(detail: ReportDetail): void;
info(detail: ReportDetail): void;
}
report.violation(detail: ReportDetail): void;

Reporta uma violação de regra. Violações fazem a verificação falhar com código de saída 1. Use para restrições rígidas que não devem ser mergeadas.

report.warning(detail: ReportDetail): void;

Reporta um aviso. Avisos aparecem na saída de verificação mas não fazem a verificação falhar. Use para orientações não bloqueantes.

report.info(detail: ReportDetail): void;

Reporta uma mensagem informativa. Não afeta o código de saída da verificação. Use para sugestões ou notas.

O objeto de detalhe passado para violation, warning e info.

interface ReportDetail {
message: string;
file?: string;
line?: number;
endLine?: number;
endColumn?: number;
fix?: string;
}
CampoTipoObrigatórioDescrição
messagestringSimDescrição legível do problema
filestringNãoCaminho do arquivo onde o problema foi encontrado
linenumberNãoNúmero da linha inicial (base 1)
endLinenumberNãoNúmero da linha final (base 1) — para destaque preciso no editor
endColumnnumberNãoNúmero da coluna final (base 0) — para destaque preciso no editor
fixstringNãoSugestão de correção ou ação de remediação

Quando endLine e endColumn são fornecidos, editores (VS Code, Cursor) podem destacar a expressão exata que viola a regra, em vez da linha inteira. Se omitidos, a linha completa em line é destacada.


Retornado por ctx.grep() e ctx.grepFiles().

interface GrepMatch {
file: string;
line: number;
column: number;
content: string;
}
CampoTipoDescrição
filestringCaminho absoluto do arquivo correspondente
linenumberNúmero da linha da correspondência (base 1)
columnnumberNúmero da coluna da correspondência (base 1)
contentstringConteúdo completo da linha correspondente

type Severity = "error" | "warning" | "info";
ValorImpacto no código de saídaDescrição
"error"Causa saída 1Restrição rígida, bloqueia merges
"warning"Sem impactoOrientação não bloqueante
"info"Sem impactoInformativo, apenas sugestões

A representação interna de um problema reportado, usada na saída de verificação e nos resultados JSON.

interface ViolationDetail {
ruleId: string;
adrId: string;
message: string;
file?: string;
line?: number;
endLine?: number;
endColumn?: number;
fix?: string;
severity: Severity;
}
CampoTipoDescrição
ruleIdstringID da regra da chave do objeto rules
adrIdstringID do ADR do frontmatter
messagestringDescrição legível
filestring?Caminho do arquivo onde o problema foi encontrado
linenumber?Número da linha inicial (base 1)
endLinenumber?Linha final (base 1) — para destaque preciso no editor
endColumnnumber?Coluna final (base 0) — para destaque preciso no editor
fixstring?Sugestão de correção
severitySeveritySeveridade efetiva desta violação

O tipo usado com satisfies para verificar a tipagem do seu objeto de regras. Exporte um objeto simples que esteja em conformidade com esta forma.

type RuleSet = { rules: Record<string, RuleConfig> };