/**
 * Build the semgrep-core `-targets` document for a set of RELATIVE file paths. This
 * is the internal ATD wire format semgrep-core expects (verified against the pinned
 * engine): a top-level variant ["Targets", [ ["CodeTarget", { path:{fpath,ppath},
 * analyzer, products }], … ]]. One entry per file we can map to a language; files
 * of other languages are dropped. EXPORTED for unit-testing the shape.
 */
export function buildSemgrepTargets(relFiles: any): (string | (string | {
    path: {
        fpath: string;
        ppath: string;
    };
    analyzer: any;
    products: string[];
})[][])[];
/**
 * Parse `semgrep-core … -json` output into the SAME finding shape as parseOxlint
 * ({ file, line, severity, rule, message }). The engine prints progress DOTS
 * (".\n") before the JSON object, so we start at the first '{'. Shape (verified
 * against semgrep-core 1.169.0): { results: [ { check_id, path, start:{line,col},
 * end, extra:{ message, severity? } } ], errors, paths }. Best-effort: empty /
 * unparseable → []. EXPORTED for direct unit-testing of the shape assumption.
 */
export function parseSemgrep(stdout: any): any;
/**
 * Parse `oxlint --format json` output. oxlint emits ONE JSON object:
 *   { diagnostics: [ { message, code:"eslint(no-cond-assign)", severity:"warning"|"error",
 *                      filename, help, url, labels:[ { span:{ offset, length, line, column } } ] } ],
 *     number_of_files, … }
 * The line comes from the first label's span. VERIFIED against oxlint 1.73.0.
 * EXPORTED for direct unit-testing of the shape assumption.
 */
export function parseOxlint(stdout: any): any;
/**
 * THE EXTENSION POINT. Each scanner is one self-contained entry:
 *   id      stable scanner id (labels its findings block)
 *   detect  (dir) => boolean — is this the repo's stack? (a marker file check)
 *   langs   file extensions this scanner handles
 *   bin     () => resolved binary path/name (env-overridable)
 *   args    (files) => string[] — argv (files are RELATIVE to the scanned dir)
 *   parse   (stdout, stderr, code) => [{ file, line, severity, rule, message }]
 * Adding a tool = ONE more entry here. NOTHING scanner-specific lives elsewhere.
 */
export const SCANNERS: {
    id: string;
    detect: (dir: any) => any;
    langs: string[];
    bin: () => any;
    args: (files: any, ctx?: {}) => any[];
    parse: typeof parseOxlint;
}[];
export namespace codeScanSkill {
    let id: string;
    let serverName: string;
    let meta: any;
    let allowedTools: string[];
    let description: string;
    let promptFragment: string;
    function resolve(): {
        command: any;
        args: any[];
        env: {};
        description: string;
        type?: undefined;
        alwaysLoad?: undefined;
    } | {
        type: string;
        command: string;
        args: any[];
        env: {};
        description: string;
        alwaysLoad: boolean;
    };
    function handleToolCall(name: any, args: any): Promise<string>;
    let tools: {
        name: string;
        description: string;
        input_schema: {
            type: string;
            properties: {
                dir: {
                    type: string;
                    description: string;
                };
                files: {
                    type: string;
                    items: {
                        type: string;
                    };
                    description: string;
                };
            };
        };
    }[];
}
