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.
RuleSet
Seção intitulada “RuleSet”/// <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> };RuleConfig
Seção intitulada “RuleConfig”Cada regra no registro deve estar em conformidade com a interface RuleConfig.
interface RuleConfig { description: string; severity?: Severity; check: (ctx: RuleContext) => Promise<void>;}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
description | string | Sim | Descrição legível exibida na saída de verificação |
severity | Severity | Não | Severidade padrão para violações. Padrão: "error" |
check | (ctx: RuleContext) => Promise<void> | Sim | Função assíncrona contendo a lógica da regra |
RuleContext
Seção intitulada “RuleContext”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;}Propriedades
Seção intitulada “Propriedades”projectRoot
Seção intitulada “projectRoot”projectRoot: string;Caminho absoluto para o diretório raiz do projeto (onde .archgate/ está localizado).
scopedFiles
Seção intitulada “scopedFiles”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
Seção intitulada “changedFiles”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.
Métodos
Seção intitulada “Métodos”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
Seção intitulada “grepFiles”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
Seção intitulada “readFile”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
Seção intitulada “readJSON”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>;};RuleReport
Seção intitulada “RuleReport”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;}violation
Seção intitulada “violation”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.
warning
Seção intitulada “warning”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.
ReportDetail
Seção intitulada “ReportDetail”O objeto de detalhe passado para violation, warning e info.
interface ReportDetail { message: string; file?: string; line?: number; endLine?: number; endColumn?: number; fix?: string;}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
message | string | Sim | Descrição legível do problema |
file | string | Não | Caminho do arquivo onde o problema foi encontrado |
line | number | Não | Número da linha inicial (base 1) |
endLine | number | Não | Número da linha final (base 1) — para destaque preciso no editor |
endColumn | number | Não | Número da coluna final (base 0) — para destaque preciso no editor |
fix | string | Não | Sugestã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.
GrepMatch
Seção intitulada “GrepMatch”Retornado por ctx.grep() e ctx.grepFiles().
interface GrepMatch { file: string; line: number; column: number; content: string;}| Campo | Tipo | Descrição |
|---|---|---|
file | string | Caminho absoluto do arquivo correspondente |
line | number | Número da linha da correspondência (base 1) |
column | number | Número da coluna da correspondência (base 1) |
content | string | Conteúdo completo da linha correspondente |
Severity
Seção intitulada “Severity”type Severity = "error" | "warning" | "info";| Valor | Impacto no código de saída | Descrição |
|---|---|---|
"error" | Causa saída 1 | Restrição rígida, bloqueia merges |
"warning" | Sem impacto | Orientação não bloqueante |
"info" | Sem impacto | Informativo, apenas sugestões |
ViolationDetail
Seção intitulada “ViolationDetail”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;}| Campo | Tipo | Descrição |
|---|---|---|
ruleId | string | ID da regra da chave do objeto rules |
adrId | string | ID do ADR do frontmatter |
message | string | Descrição legível |
file | string? | Caminho do arquivo onde o problema foi encontrado |
line | number? | Número da linha inicial (base 1) |
endLine | number? | Linha final (base 1) — para destaque preciso no editor |
endColumn | number? | Coluna final (base 0) — para destaque preciso no editor |
fix | string? | Sugestão de correção |
severity | Severity | Severidade efetiva desta violação |
RuleSet
Seção intitulada “RuleSet”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> };