Pular para o conteúdo

API de Regras

As regras do Archgate são arquivos TypeScript que exportam verificações automatizadas via defineRules(). Cada regra recebe um RuleContext com utilitários para buscar arquivos, ler conteúdo e reportar violações.

import { defineRules } from "archgate/rules";
export default defineRules({
"my-rule-id": {
description: "Human-readable description of what this rule checks",
severity: "error", // optional, defaults to "error"
async check(ctx) {
// Rule logic here
},
},
});

A função defineRules recebe um registro de configurações de regras indexadas 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 função retorna um objeto RuleSet.

function defineRules(rules: Record<string, RuleConfig>): RuleSet;

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;
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 no arquivo
fixstringNãoSugestão de correção ou ação de remediação

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;
fix?: string;
severity: Severity;
}
CampoTipoDescrição
ruleIdstringID da regra da chave de defineRules
adrIdstringID do ADR do frontmatter
messagestringDescrição legível
filestring?Caminho do arquivo onde o problema foi encontrado
linenumber?Número da linha no arquivo
fixstring?Sugestão de correção
severitySeveritySeveridade efetiva desta violação

O tipo de retorno de defineRules. Você não constrói isso diretamente.

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