Releases: sylvanld/airfs
Release list
v0.2.0 — a workspace in one command 🚀
You no longer need a file before you can mount anything. Until now, trying
airfsat all meant opening an editor, writing asources.txt, saving it in the right place, and only then mounting. That is a lot of ceremony to answer "what does this thing actually do?" — so now you can say what your layers are on the command line and be looking at the result a second later.
- ⚡
airfs mount -s, once per layer.airfs mount --target ~/scratch-ws -s ~/ai/personal -s ~/ai/projectcreates the target, writes itssources.txt, and serves the view. The order you pass the flags in is the precedence order, most general first — same rule as the file, because it is the file. - ✍️ What you typed is what gets written.
~/ai/personalstays~/ai/personalin the file instead of being frozen into/home/you/..., so the configuration you end up with is one you would have written by hand and can keep editing that way. - 🛑 A typo cannot cost you your configuration.
-sreplaces the file whole rather than appending to it — but the new list has to resolve first. Name a directory that is not there and you get exit2and the configuration you already had, untouched.
It replaces, it does not add. 💥 Every layer you want has to be on the command line; whatever the file said before, comments and ordering included, is gone, and there is no backup. That is deliberate — a flag that appended would build a precedence order nobody wrote — but point it at a workspace you care about only once you have read Declaring layers.
v0.1.0 — hello, world 🪄
Many sources, one read-only view, no copies. Your AI capabilities are scattered across repositories — personal, work, one per project — and every tool wants a single folder. Copy them together and each copy starts drifting from the day you made it.
airfsgives you the folder without the copies.
You write down which repositories a workspace is made of, in order. airfs shows them to you as one directory 📂. Nothing moves, nothing is duplicated, and editing a skill in the repository that owns it changes what every workspace layering it sees — right away, with no sync step to remember. 🔄
- 🥇 Order decides.
sources.txtis one path per line, most general first. Two layers both shipping acommitskill? The one declared last wins — and it wins whole, never half of yours stitched onto half of theirs. - 🕵️ Nothing gets shadowed behind your back.
airfs sourcesprints the resolved list and names every entry that lost, right next to the one that beat it. A workspace you cannot explain is a workspace you cannot trust. - 🚪 One mount per kind.
airfs mountservesagents/,skills/,commands/, andscripts/together — in the foreground, or with--detachwhen you want your terminal back.airfs statussays what is being served, andairfs umounttakes it down, stale leftovers included. - 🛡️ Read-only, with the kernel enforcing it. No tool, no agent, and no stray
mvcan write back into one of your source repositories through the view. - 🐹 Pure Go, so installing is one command. It speaks FUSE over
/dev/fuseby itself: no C library, nomergerfsto hunt down, nothing to unpack by hand. - 🩺
airfs doctorbefore you file a bug. Mounting needs/dev/fuseand a setuidfusermount3, which no unprivileged process can conjure up.doctorchecks both and names the package that provides the missing one. - 📦 A Go library first, a CLI second.
sdk/layerfsis anfs.FS, so your own program can read the merged view in process — no mount, no subprocess, nothing to parse — andfs.WalkDirand friends just work on it.
It is a first release, so: Linux for the mount 🐧 — mounting is Linux-only for now; the Go SDK is plain
fs.FSand runs anywhere. Best next step is Get started — about five minutes, ending with a workspace you can keep. 🚀