Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

ci: GitHub → knot mirror workflow

Fires on every push to main and re-pushes HEAD to
knot.aesthetic.computer:aesthetic.computer/core, so any commit
that lands on GitHub (PR merges, bot pushes, etc.) shows up on
knot within ~30 seconds.

Knot is production for lith; without this, a PR merged on
GitHub would never reach lith until someone local compushed.

Requires repo secret TANGLED_KNOT_SSH_KEY (set via vault's
home/.ssh/tangled private key, authorized on the knot repo).

Reverse direction (knot → GitHub) still relies on the dual-
pushurl convention in the local git config — Tangled knot
doesn't expose post-receive hooks for us to install on.

Also replaces the .github symlink (pointing to a local-only
path /home/me/aesthetic-computer/modes that broke GitHub
Actions) with a real directory.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

+48 -1
-1
.github
··· 1 - /home/me/aesthetic-computer/modes
+48
.github/workflows/mirror-to-knot.yml
··· 1 + name: Mirror main to knot (Tangled) 2 + 3 + # Keeps knot.aesthetic.computer:aesthetic.computer/core in sync with GitHub's main. 4 + # Fires on every push to main (including PR merges and bot commits). knot is the 5 + # production source for lith; keeping it mirrored means lith doesn't miss 6 + # anything landed via GitHub. 7 + # 8 + # Opposite direction (knot → GitHub) can't be automated the same way (knot is 9 + # a managed Tangled instance, no hooks). Relies on the user pushing locally 10 + # via the dual-pushurl remote to cover direct-knot cases. 11 + 12 + on: 13 + push: 14 + branches: [main] 15 + workflow_dispatch: 16 + 17 + concurrency: 18 + group: mirror-to-knot 19 + cancel-in-progress: false 20 + 21 + jobs: 22 + mirror: 23 + runs-on: ubuntu-latest 24 + steps: 25 + - name: Checkout main (full history, no LFS) 26 + uses: actions/checkout@v4 27 + with: 28 + fetch-depth: 0 29 + persist-credentials: false 30 + 31 + - name: Configure SSH for knot 32 + env: 33 + KNOT_KEY: ${{ secrets.TANGLED_KNOT_SSH_KEY }} 34 + run: | 35 + install -d -m 700 ~/.ssh 36 + printf '%s\n' "$KNOT_KEY" > ~/.ssh/knot 37 + chmod 600 ~/.ssh/knot 38 + # Pin knot's host keys (from ssh-keyscan on knot.aesthetic.computer). 39 + cat >> ~/.ssh/known_hosts <<'EOF' 40 + knot.aesthetic.computer ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM37FhiGAdqdW6e3YA05JDFpgmu0xRDGUo5CUYJPn6CO 41 + EOF 42 + chmod 600 ~/.ssh/known_hosts 43 + 44 + - name: Push to knot 45 + run: | 46 + git remote add knot git@knot.aesthetic.computer:aesthetic.computer/core 47 + GIT_SSH_COMMAND='ssh -i ~/.ssh/knot -o IdentitiesOnly=yes' \ 48 + git push knot HEAD:refs/heads/main