export interface LintHit { readonly catalogId: string; readonly rule: string; readonly file: string; readonly line: number; readonly matchedText: string; } export interface SkillFile { readonly name: string; readonly path: string; readonly body: string; readonly lines: readonly string[]; } export declare function readSkillFiles(skillsRoot: string, names: readonly string[]): readonly SkillFile[]; /** Theme A — section structure. Returns lint hits (positive = rule * satisfied, so a missing heading fires the lint hit; downstream * audit service decides whether to WARN or pass). * * A11 of the 2026-09-15 diagnosis: the `Hard contracts` rule used to * match the *heading text* and stop there. `peaks-perf-audit/SKILL.md` * carries `## Hard contracts (BLOCKING)` — the word BLOCKING is in the * heading — while every bullet beneath it is unmarked prose, so the * audit counted a BLOCKING red line with no contract behind it. The * rule now also requires at least one marker line inside the section * body, which is what makes a contract visible to the classifier. */ export declare function lintSectionShape(skill: SkillFile): readonly LintHit[]; /** * ASCII wireframe section-order check (spec §5.4 line 647). * * The "ASCII wireframe" lint hint in the spec means: SKILL.md * follows a canonical section ordering. The first 5 sections * must appear in this fixed order: * * 1. Two-axis naming axiom (top-of-file naming convention callout) * 2. Hard contracts for browser/IO surface (when present) * 3. Mandatory per-request artifact * 4. Default runbook * 5. RD / QA gate index * * If both sections exist but appear in the wrong order, the * enforcer reports a wireframe-violation hit pointing at the * section that came too early. * * If a section is missing, the per-section enforcer (above) * already fires; this one only handles the **order** invariant * (the wireframe shape). */ export declare function lintSectionOrder(skill: SkillFile): readonly LintHit[]; /** Theme B — frontmatter shape. Same convention as Theme A. */ export declare function lintFrontmatterShape(skill: SkillFile): readonly LintHit[]; /** * Reference loadStrategy: scan every `references/*.md` in the * skill's references/ dir for a `loadStrategy: always | on-demand` * line. The audit is invoked per-skill, so this helper takes a * `referencesRoot` (the skill's `references/` dir). */ export declare function lintReferenceLoadStrategy(referencesRoot: string, refs: readonly string[]): readonly LintHit[];