How it works
What sync removes
sync only removes a file it recorded writing. Never a guess, never a
whole directory swept clean — one path, remembered, removed once the
plan stops writing it.
Two kinds of file, one rule
A workspace’s routes and a package’s extends both write into sites.d,
and sync removes both the same way: it keeps a list of exactly what it
wrote, and takes away whatever is no longer on that list.
- Routes come from
expose. See why a published site lives in the configuration. - Extension files come from
extends: caddy.sites.d: <file>, a package’s way of adding to a place another package opened.syncrecords every extension file’s path in the lock, per machine, and removes one once the package that wrote it drops out of the plan.
Why not a glob
sites.d can hold files nothing in the configuration wrote — one dropped
in by hand, one from before this feature existed. A glob over the
directory would delete those too, so sync only removes a path it
remembers writing itself.
The first-run caveat
The list of extension paths lives in the lock. A lock from before this
feature has no such list, so the first sync after upgrading removes
nothing — there is nothing yet to compare against. A file left by a
package removed before this version never enters the tracked list
either, so no later sync catches it. Remove it by hand with devmachine run; see Troubleshooting.