Gå til innholdet

Rule API

Archgate-regler er TypeScript-filer som eksporterer et vanlig objekt typet med satisfies RuleSet. Hver regel mottar en RuleContext med verktøy for å søke i filer, lese innhold og rapportere brudd.

/// <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;

En regelfil eksporterer som standard et vanlig objekt med en rules-post indeksert etter regel-ID. Nøklene blir regel-ID-ene som vises i sjekkutdata og bruddrapporter. Annotasjonen satisfies RuleSet gir typekontroll uten å pakke inn i et funksjonskall.

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

Hver regel i posten må samsvare med RuleConfig-grensesnittet.

interface RuleConfig {
description: string;
severity?: Severity;
check: (ctx: RuleContext) => Promise<void>;
}
FeltTypePåkrevdBeskrivelse
descriptionstringJaLesbar beskrivelse som vises i sjekkutdata
severitySeverityNeiStandard alvorlighetsgrad for brudd. Standard er "error"
check(ctx: RuleContext) => Promise<void>JaAsynkron funksjon som inneholder regellogikken

check-funksjonen mottar et RuleContext-objekt med prosjekttilstand og hjelpemetoder.

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>;
ast(path: string, language: AstLanguage): Promise<AstNode>;
report: RuleReport;
}
projectRoot: string;

Absolutt sti til prosjektets rotkatalog (der .archgate/ ligger).

scopedFiles: string[];

Filer som matcher ADR-ens files-globmønstre fra frontmatter. Hvis ADR-en ikke har et files-felt, inneholder denne alle prosjektfiler. Bruk denne som den primære fillisten for regelkontrollene dine.

changedFiles: string[];

Filer som har blitt endret ifølge git. Som standard fylles denne automatisk med branch-diffen mot den detekterte basisgrenen (f.eks. origin/main) pluss eventuelle ikke-committede endringer i arbeidstreet (stagede, ustagede og usporede ikke-ignorerte filer). Når --staged brukes, inneholder den kun stagede filer. Når --base <ref> brukes, inneholder den alle filer som er endret siden den referansen pluss ikke-committede endringer i arbeidstreet. Tom når basisdeteksjon feiler eller ingen endringer finnes. Bruk denne til å bygge regler for avhengigheter mellom filer (f.eks. “hvis fil A endret seg, må fil B også endres”).

report: RuleReport;

Rapporteringsgrensesnittet for å registrere brudd, advarsler og informasjonsmeldinger. Se RuleReport nedenfor.

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

Finn filer som matcher et globmønster relativt til prosjektroten. Returnerer en matrise med filstier. Filer som ignoreres av .gitignore er ekskludert som standard. Sett respectGitignore: false i ADR-ens frontmatter for å inkludere dem.

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

Søk i en enkelt fil etter linjer som matcher et regulært uttrykk. Returnerer en matrise med GrepMatch-objekter med filsti, linjenummer, kolonne og matchet innhold.

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

Søk i flere filer som matcher et globmønster etter linjer som matcher et regulært uttrykk. Kombinerer glob og grep i ett enkelt kall. Filer som ignoreres av .gitignore er ekskludert som standard. Sett respectGitignore: false i ADR-ens frontmatter for å inkludere dem.

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

Les innholdet i en fil som en streng. Stien er relativ til prosjektroten.

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

Les og parse en JSON-fil. Stien er relativ til prosjektroten. Returnerer den parsede verdien som unknown — cast til forventet type i regelen din.

const pkg = (await ctx.readJSON("package.json")) as {
dependencies?: Record<string, string>;
};
ast(
path: string,
language: "typescript" | "javascript" | "python" | "ruby"
): Promise<AstNode>;

Parse en kildefil til dens språknative AST. Stien er relativ til prosjektroten og går gjennom samme sandkasse som readFile. TypeScript og JavaScript parses i prosessen; Python og Ruby parses ved å starte systemtolkens egen AST-fasilitet fra standardbiblioteket som en underprosess. Formen på det returnerte treet varierer per språk — se AstNode.

const program = await ctx.ast("src/cli.ts", "typescript");
for (const node of program.body) {
console.log(node.type);
}

ast() kaster ved feil — den returnerer aldri null:

  • Parsefeil: filen kan ikke parses som det forespurte språket. Feilmeldingen inkluderer parserens diagnostikk.
  • Manglende tolk (kun python/ruby): ingen egnet tolk ble funnet på PATH.
  • Usannsynlig input: filens filendelse samsvarer ikke med det forespurte språket (f.eks. kaster ctx.ast("config.json", "python") før noen tolk startes).

En kastet feil er isolert til regelen som feiler: andre regler og ADR-er i samme sjekk-kjøring fortsetter som normalt, og feilen vises som en regelkjøringsfeil med avslutningskode 2 (til forskjell fra avslutningskode 1 for brudd). De to kastetilfellene kan skilles fra hverandre på meldingsteksten, slik at sjekkutdataene skiller “dette miljøet kan ikke kjøre denne regelen” fra “denne filen har en syntaksfeil”.


Rapporteringsgrensesnittet for å registrere sjekkresultater. Hver metode aksepterer et detalobjekt som beskriver problemet.

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

Rapporter et regelbrudd. Brudd får sjekken til å feile med avslutningskode 1. Bruk for harde begrensninger som ikke skal merges.

report.warning(detail: ReportDetail): void;

Rapporter en advarsel. Advarsler vises i sjekkutdata, men får ikke sjekken til å feile. Bruk for ikke-blokkerende veiledning.

report.info(detail: ReportDetail): void;

Rapporter en informasjonsmelding. Påvirker ikke avslutningskoden for sjekken. Bruk for forslag eller notater.

Detalobjektet som sendes til violation, warning og info.

interface ReportDetail {
message: string;
file?: string;
line?: number;
endLine?: number;
endColumn?: number;
fix?: string;
}
FeltTypePåkrevdBeskrivelse
messagestringJaLesbar beskrivelse av problemet
filestringNeiFilsti der problemet ble funnet
linenumberNeiStartlinjenummer (1-basert)
endLinenumberNeiSluttlinjenummer (1-basert) — for presis uthevning av område i editoren
endColumnnumberNeiSluttkolonnenummer (0-basert) — for presis uthevning av område i editoren
fixstringNeiForeslått rettelse eller utbedringstiltak

Når endLine og endColumn er oppgitt, kan editorer (VS Code, Cursor) utheve det nøyaktige uttrykket som bryter regelen, i stedet for hele linjen. Hvis de utelates, utheves hele linjen ved line.


Returnert av ctx.grep() og ctx.grepFiles().

interface GrepMatch {
file: string;
line: number;
column: number;
content: string;
}
FeltTypeBeskrivelse
filestringProsjektrelativ sti til den matchede filen
linenumberLinjenummer for treffet (1-basert)
columnnumberKolonnenummer for treffet (1-basert)
contentstringFullt innhold av den matchede linjen

Returnert av ctx.ast(). Formen er språknativ og bevisst ikke enhetlig på tvers av språk — hvert språk returnerer sitt eget standard AST-vokabular, så en regel som inspiserer Python-kode jobber mot en annen grammatikk enn en som inspiserer TypeScript.

type AstLanguage = "typescript" | "javascript" | "python" | "ruby";
type AstNode = Record<string, unknown> | unknown[];
SpråkUnderliggende parserReturnert form
typescriptmeriyah, i prosessen, etter at TypeScript er transpilert bort med Bun.TranspilerESTree Program med loc-posisjonsinfo. Typenivå-syntaks (interface, typealiaser, export type { ... } from) fjernes før parsing — en fil som bare inneholder setninger på typenivå parses til en tom Program-body. loc-posisjoner refererer til det transpilerte resultatet, ikke den opprinnelige .ts-filen — fjernede typenivå-setninger, kommentarer og tomme linjer gjør at linjenumrene forskyves, så finn konstruksjonen på nytt i den opprinnelige kildekoden (f.eks. ctx.readFile() pluss indexOf) før du rapporterer en line, eller utelat line helt; loc er nøyaktig mot kildekoden bare for javascript
javascriptmeriyah, i prosessenESTree Program med loc-posisjonsinfo
pythonPythons ast-modul fra standardbiblioteket, via systemtolkenJSON-serialiserte ast-noder: { "_type": "Module", "body": [...] } — hver node har _type, nodens egne felt og posisjonene lineno / col_offset
rubyRubys Ripper fra standardbiblioteket, via systemtolkenNestede Ripper.sexp-matriser: ["program", [["command", ...]]] med [line, column]-posisjonspar innebygd i token-oppføringene

Se Strukturelle sjekker med ctx.ast() for et komplett eksempel på en regel per språk.


type Severity = "error" | "warning" | "info";
VerdiPåvirkning på avslutningskodeBeskrivelse
"error"Forårsaker avslutningskode 1Hard begrensning, blokkerer sammenslåinger
"warning"Ingen påvirkningIkke-blokkerende veiledning
"info"Ingen påvirkningInformasjon, kun forslag

Den interne representasjonen av et rapportert problem, brukt i sjekkutdata og JSON-resultater.

interface ViolationDetail {
ruleId: string;
adrId: string;
message: string;
file?: string;
line?: number;
endLine?: number;
endColumn?: number;
fix?: string;
severity: Severity;
}
FeltTypeBeskrivelse
ruleIdstringRegel-ID fra rules-objektnøkkelen
adrIdstringADR-ID fra frontmatter
messagestringLesbar beskrivelse
filestring?Filsti der problemet ble funnet
linenumber?Startlinjenummer (1-basert)
endLinenumber?Sluttlinje (1-basert) — for presis uthevning i editoren
endColumnnumber?Sluttkolonne (0-basert) — for presis uthevning i editoren
fixstring?Foreslått rettelse
severitySeverityEffektiv alvorlighetsgrad for dette bruddet

Brudd kan undertrykkes i kildekoden ved hjelp av archgate-ignore-kommentarer. Motoren håndterer dette automatisk. Regler trenger ingen spesiell logikk.

// archgate-ignore ARCH-006/no-unapproved-deps legacy-avhengighet, migrering planlagt
import chalk from "chalk";

En begrunnelse er påkrevd. Filnivå-undertrykkelse bruker archgate-ignore-file. Stable flere kommentarer for å undertrykke mer enn én regel på samme linje. Se Opt-out-direktiver for fullstendige detaljer og egendefinerte direktivmønstre.