type SettingType = 'string' | 'number' | 'boolean' | 'json';
type SettingTypeValue<T extends SettingType> = T extends 'boolean' ? boolean : T extends 'string' ? string : T extends 'number' ? number : T extends 'json' ? unknown : never;
type SettingDef<T extends SettingType, S = {}> = {
    type: T;
    description: string;
    required?: boolean;
    default?: SettingTypeValue<T>;
} & S;
type BooleanArgDef = SettingDef<'boolean'>;
type StringArgDef = SettingDef<'string', {
    trimWhiteSpace?: boolean;
}>;
type NumberArgDef = SettingDef<'number'>;
type JSONArgDef = SettingDef<'json'>;
type SettingsDef = Record<string, BooleanArgDef | StringArgDef | NumberArgDef | JSONArgDef>;
type ParsedSettings<T extends SettingsDef> = {
    [K in keyof T]: T[K]['required'] extends true ? SettingTypeValue<T[K]['type']> : T[K]['default'] extends SettingTypeValue<T[K]['type']> ? SettingTypeValue<T[K]['type']> : SettingTypeValue<T[K]['type']> | undefined;
};
type MetaDef = {
    name: string;
    version?: string;
    description?: string;
};
type CommandDef<T extends SettingsDef> = {
    meta: MetaDef;
    settings: T;
    run: (ctx: {
        settings: ParsedSettings<T>;
    }) => void | Promise<void>;
};

declare function runPlugin<T extends SettingsDef>(options: CommandDef<T>): Promise<void>;

export { type BooleanArgDef, type CommandDef, type JSONArgDef, type MetaDef, type NumberArgDef, type ParsedSettings, type SettingDef, type SettingType, type SettingTypeValue, type SettingsDef, type StringArgDef, runPlugin };
