This is a rough draft (which works!) handling file composition for vim-projectionist.
Each of the *.json files live in ~/.projections, and projections lives somewhere in your $PATH. This uses jq to combine multiple JSON files into one. With navigation.zsh, we hook into cding into a directory, run projections, and if there's a 0 exit code, overwrite the output to .projections.json, which vim-projectionist then uses.
I've updated my ~/.gitignore to ignore .projections.json, so I'm not concerned about things messing up git.