vigiles API reference
    Preparing search index...

    Variable ADAPTERSConst

    ADAPTERS: readonly [
        {
            dialect: HarnessDialect;
            harnessTestDriver: () => Promise<HarnessTestDriver>;
            harnessTesting: true;
            hookProtocol: HookProtocol;
            layout: PluginLayout;
            liveDriver: () => Promise<HarnessLiveDriver>;
            modelMock: ModelMock;
            name: "claude-code";
            runtime: HarnessRuntime;
            shellHooks: true;
            subagents: true;
            advisories(read: InstallReader): readonly string[];
            claims(path: string): boolean;
            detect(exists: (repoRelative: string) => boolean): DetectSignal;
        },
        {
            dialect: HarnessDialect;
            harnessTestDriver: () => Promise<HarnessTestDriver>;
            harnessTesting: true;
            hookProtocol: HookProtocol;
            layout: PluginLayout;
            liveDriver: () => Promise<HarnessLiveDriver>;
            modelMock: ModelMock;
            name: "codex";
            runtime: HarnessRuntime;
            shellHooks: true;
            subagents: false;
            advisories(): readonly string[];
            claims(path: string): boolean;
            detect(exists: (repoRelative: string) => boolean): DetectSignal;
        },
    ] = ...

    All registered adapters. detect() specificity (not order) breaks ties.

    🔴 as const satisfies, NOT a readonly HarnessAdapter[] ANNOTATION, and the difference is the whole of HarnessName. An annotation widens name: "claude-code" to string, so the registry cannot say which names exist and every consumer that needed to know had to write the list out again — which is how ProbeHarness = "claude-code" | "codex" and the lint rule's DEFAULT_NAMES came to be hand-maintained copies of this array. satisfies keeps the literal types while still checking each element against the port.