/** * Structural lint rules (RFC-002 block C2) — the PLUGGABLE RULE PACK. * * Pattern: Strategy list — each rule is a plain `{ id, check }` object; * `defaultStructuralRules` is OUR pack, and consumers add / * remove / replace freely via `AnalyzeToolCatalogOptions.rules`. * Parameterizable rules ship as FACTORIES (`descriptionRule`, * `saysWhatNotWhenRule`, …) returning a configured `LintRule`. * Role: `src/lib/tool-lint/` leaf. Pure functions over `CatalogTool`; * no embedder, no I/O. * * Every rule encodes a FIELD FINDING from real catalogs (the Neo SAN * triage agent's 29-tool catalog was the seed corpus): * * 1. description-missing-or-short — the model can only guess from a name. * 2. says-what-not-when — describes WHAT the tool returns but gives the * model no cue for WHEN to pick it over a sibling (the #1 cause of * twin-tool confusion: 'get_fcns_database' vs 'influx_get_fcns_database'). * 3. enum-in-prose — string params whose legal values are listed in prose * ("avg_iops | peak_iops | mbps") instead of a JSON-Schema `enum` the * model (and validators, see #9 tool-args validation) can act on. * 4. optional-param-undocumented — optional params whose omission has * meaning (fabric-wide sweep vs one switch) but whose schema never * says so; the model can't reason about leaving them out. * * Honest claim: these are token/regex HEURISTICS. They flag review * prompts, not certainties — expect (rare) false positives and tune via * the factory options instead of deleting the rule. */ import type { LintRule } from './types.js'; export interface DescriptionRuleOptions { /** Descriptions shorter than this (in chars) get a `warn`. Default 40. */ readonly minChars?: number; } /** * Missing description → `error` (the model can only guess from the * name). Present but shorter than `minChars` → `warn` (too short to * differentiate from siblings). */ export declare function descriptionRule(options?: DescriptionRuleOptions): LintRule; /** RFC-002 C2 heuristic cue list — temporal/conditional words whose * presence suggests the description says WHEN to use the tool. */ export declare const DEFAULT_WHEN_CUES: readonly string[]; export interface SaysWhatNotWhenRuleOptions { /** Cue tokens (whole-word, case-insensitive). Default `DEFAULT_WHEN_CUES`. */ readonly cueTokens?: readonly string[]; } /** * A description with NO temporal/conditional cue token usually describes * WHAT the tool returns but never WHEN to pick it — the #1 cause of * twin-tool confusion. Heuristic by design: tune `cueTokens` rather than * dropping the rule. Skips tools with no description (rule 1's finding). */ export declare function saysWhatNotWhenRule(options?: SaysWhatNotWhenRuleOptions): LintRule; /** * A string param whose description enumerates its legal values in prose * (pipe-separated literals, or comma lists behind "one of"/"allowed * values") should declare a JSON-Schema `enum` instead — the model picks * reliably from enums, and arg validators (#9) can enforce them. The * field case: Neo's `influx_get_port_ranking.metric` = * `"avg_iops | peak_iops | mbps"`. */ export declare function enumInProseRule(): LintRule; /** Words that signal the description DOES say what omission means. */ export declare const DEFAULT_OMISSION_CUES: readonly string[]; export interface OptionalParamRuleOptions { /** Cue tokens that satisfy the rule. Default `DEFAULT_OMISSION_CUES`. */ readonly omissionCues?: readonly string[]; } /** * An optional param's omission usually MEANS something (Neo: * `influx_get_interface_counters` without `switch_name` = fabric-wide * sweep) — but the model can only reason about leaving a param out if * the description says so. No description at all, or one with no * omission cue, gets a `warn`. */ export declare function optionalParamRule(options?: OptionalParamRuleOptions): LintRule; /** * OUR rule pack, built with default options. Compose your own: * * rules: [...defaultStructuralRules, myRule] // add * rules: defaultStructuralRules.filter(r => r.id !== '…') // remove * rules: [descriptionRule({ minChars: 80 }), …] // re-tune */ export declare const defaultStructuralRules: readonly LintRule[]; //# sourceMappingURL=rules.d.ts.map