All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Phase A skeleton: Go module, Cobra CLI with placeholder subcommands, Bubble Tea TUI placeholder, Driver interface + registry, errs package, config stub, Makefile, golangci-lint with depguard, CI workflow.
- Phase B Postgres walking skeleton:
backup,restore,sync,verify,inspect,dumps, andprofileworking end-to-end against PostgreSQL (shelling out topg_dump/pg_restore, pgx for inspect), SHA-256 dump checksums with sidecar metadata, named profiles withenv:secret refs, and POSIX exit-code taxonomy. - Phase C interactive TUI dashboard: multi-panel Bubble Tea UI (profiles · dumps · jobs) with live job-progress subscription, backup/restore modal forms, an error overlay, and golden snapshot tests.
- Phase D driver-layer hardening:
- Shared cross-driver test harness
RunDriverSuiteunderinternal/driver/_testing/, giving every driver four contract tests for free (connect/inspect, backup→restore round-trip, cancel propagation, bad-credentials sentinel). The Postgres integration test now runs on it. - Capability gating helper:
app.RequireCapabilityresolves a profile to its driver and rejects unsupported affordances with aCodeUsererror. The helper and theCapabilitiesflags are in place; verbs are wired to it only where the gated feature is implemented. Streaming (NativeStream) and parallel backup (Parallel) are deferred to Phase F, sosync --stream/backup --jobsare not yet gated — the wiring lands with those features. - Connection-probe retry on Postgres
Connect(3 attempts, exponential backoff) per spec §4.3; the genericRetryhelper moved tointernal/jobsto keep the driver layer free of an app-layer import. docs/DRIVERS.mdcontributor guide documenting the driver contract, registration, the test harness, capability flags, and error mapping.
- Shared cross-driver test harness
- Phase E MySQL + MariaDB drivers:
- Shared
internal/driver/_mysqlcommonpackage: DSN builder,mysqldump/mariadb-dumparg builder, fork detection, and a sharedConnimplementing the fulldriver.Conncontract (Inspect viainformation_schema, Backup by shelling to the dump tool, Restore by piping SQL into the client, sha256 Verify, bounded connect-probe retry). Backup/Restore pass the password viaMYSQL_PWDand stream through stdout/stdin. mysqlandmariadbdrivers as thin wrappers that inject the fork-specific binary names and declare capabilities honestly (Parallel: false— the dump tools are single-threaded). Registered via side-effect import ininternal/app/drivers.go.- Integration suites for both engines run on the Phase D
RunDriverSuiteharness via testcontainers (mysql:8.0,mariadb:11). - CI installs the Postgres/MySQL/MariaDB client tools and runs the full integration suite on the Ubuntu runner (where Docker is available); unit tests continue to run on Linux/macOS/Windows.
- Shared
- Phase F advanced-transfer machinery (some CLI paths gated pending follow-up wiring — see the
docs/INCREMENTAL.md,docs/CROSS_ENGINE.md,docs/CDC.mdStatus sections):- Working today: every dump is prefixed with a 4 KB
SIPHJSON envelope (type, base/parent IDs, WAL/binlog positions, checksum);restoreresolves the base→incremental chain and applies it in order, with--up-to <id>to stop early (cycle + broken-chain detection). Sync now streams through a boundedjobs.Stream(default 64×1 MB) instead ofio.Pipe, exposing aFillPercentbackpressure metric and propagating backup failures to the restore side viaCloseErr(no truncated dump committed as clean). - Machinery in place, CLI gated (follow-up): incremental backup capture (Postgres WAL replication slot + LSN; MySQL/MariaDB binlog position) —
backup --incrementalreturns a clear "not yet wired" error; cross-engine type-mapping (canonical schema + JSONL emit/consume with per-engine identifier quoting and placeholders) —sync --cross-engineis capability-gated off until typed schema introspection exists; CDC continuous mode (state-file persistence + resume + capability gating) ships as a polling scaffold, not real logical-replication streaming. - Known follow-up gates before incremental backup ships to users: Postgres orphan-replication-slot cleanup, validation of the
pg_receivewal/mysqlbinlogstreaming invocations against live servers (compile-checked only here).
- Working today: every dump is prefixed with a 4 KB