shuntkit is a rewrite, not a git fork, of plugins/shunt in
spotify/portal-ai-plugins.
The code shares no lines with upstream, so git merge upstream/main is not
meaningful. What we track instead are behavioural changes: hook
heuristics, threshold defaults, skill wording, prompt text, and eval cases.
upstream/UPSTREAM.lockrecords the upstream commit whoseplugins/shuntdirectory this repo was last reviewed against.scripts/sync-upstream.shfetches upstream and shows the diff ofplugins/shuntbetween the locked commit and upstreammain..github/workflows/upstream-watch.ymlruns that check weekly and opens (or updates) an issue titled "Upstream shunt changed" with the diff summary when there is something new.
- Run
scripts/sync-upstream.sh(or read the issue the workflow opened). - For each upstream change decide: port it, skip it, or port with a deliberate difference. Record deliberate differences in the README's "Differences from upstream" table.
- Port the change with tests. Upstream's
evals/*.jsoncases map ontotests/test_read_hook.pyandtests/test_bash_hook.py. - Run
scripts/sync-upstream.sh --updateto move the lock to the reviewed commit, and mention it inCHANGELOG.mdunder "Upstream". - Close the issue.
For convenience the repo keeps upstream as a plain git remote so the diff command works offline once fetched:
git remote add upstream https://github.com/spotify/portal-ai-plugins.git
git fetch upstream
git diff $(cat upstream/UPSTREAM.lock | head -1)..upstream/main -- plugins/shuntscripts/sync-upstream.sh does exactly this and adds the remote if missing.