/** * The installer's file operations on the server. * * Each one is a single command that both coreutils and BusyBox understand. * Two spots where a mistake costs the most: * * 1. Renaming always uses `-T`. Plain `mv` of a directory onto an existing * directory nests it INSIDE and reports success, on both toolsets. * Deleting the live path first and renaming into the gap would open a * window where a dropped connection loses the data for good. * 2. A path's kind is determined starting with `test -L`. A broken symlink * is invisible to both `-e` and `-d`: without this check the installer * would think the path was free and fail on the replacement with an * unexplained error. */ import type { PathOps } from './installer.js'; import type { SSHExecutor } from './ssh-executor.js'; import type { SSHConfig } from '../utils/ssh-config.js'; export interface RemoteOpsContext { executor: SSHExecutor; config: SSHConfig; sudo?: boolean; } export declare function remotePathOps(context: RemoteOpsContext): PathOps;