Testing
fish tests/run-tests.fishRuns before every push (and gates the documentation build in CI, so a broken config can’t get published). First it lints: every .fish file git does not ignore must pass a syntax check and an indent check, bare calls to shadowed commands must be declared, and every tracked function must be named by a test suite or listed with a reason in tests/coverage-allowlist.txt. Then it runs the tests/test-*.fish suites, each in a throwaway XDG sandbox. The sandbox is always a copy, never this checkout, because this checkout doubles as a real ~/.config/fish. One suite only warns: tests/test-startup-budget.fish prints a WARN line, never a failure, when interactive startup is slower than FISH_CONFIG_STARTUP_BUDGET_MS (default 200 ms).
To get exactly the result CI would, run the same checks in the CI container instead (needs Docker or Podman):
fish tests/run-ci-local.fishIt tests a pristine copy of your working tree (uncommitted changes included, git-ignored files such as Fisher-installed plugins left out) inside the fish-ci image CI uses, and runs both the test job and the docs checks. --tests-only skips the docs checks and --pull refreshes the image first.