git.lucas.co / cce
cce workspace root: member list, lockfile and dependency pins
git clone https://git.lucas.co/cce.git

commit90d0d44891e53c2d2cfa4e35ffd429d530f04537
parent7545b996a4
authorLucas Galante <[email protected]>
date2026-09-21 12:46
Pins, patch keys and the guide follow origin to GitHub

git.lucas.co is a read-only hourly mirror of GitHub now, not a
publishing step, and the ~/git bare repos are gone. The [patch] keys
and bump-revs.sh match the crates' new GitHub pins; the guide no longer
describes the bare-repo chain.

Co-Authored-By: Claude Fable 5.1 <[email protected]>

 CLAUDE.md    |  6 ++++--
 Cargo.toml   | 17 +++++++++++------
 bump-revs.sh | 12 ++++++------
 3 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/CLAUDE.md b/CLAUDE.md
index 367e9eb..6ded5e2 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -24,8 +24,10 @@ of them before reading the guide does damage that is annoying to undo:
   changes inside the relevant crate — the root repo tracks only the workspace
   files listed above, and its `.gitignore` keeps every crate out. Remember that
   **committing is not publishing** —
-  `origin` is a pushable bare repo under `~/git/`, and gitsite mirrors from
-  there, so an unpushed commit is not on the site.
+  every crate's `origin` is GitHub (`github.com/lsgalante/<crate>`), and a
+  post-commit hook pushes each commit there; git.lucas.co is only an hourly
+  mirror of GitHub. A commit that did not push (hook missing, network down)
+  is on no remote at all.
 - **`ccebuild` is the build/install entry point** (`ccebuild install`,
   `restart`, `status`, `prune`). Do not hand-roll a loop over the crates, and
   never add a binary name to a Makefile — `cargo metadata` already knows it, and
diff --git a/Cargo.toml b/Cargo.toml
index 0662569..869ed55 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -34,15 +34,20 @@ members = [
 ]
 
 # Every app declares cce-ui (and cce-compositor also cce-window-manager) as a git
-# dependency so a standalone clone of one app resolves without sibling
-# checkouts -- that is what makes a single app installable on its own. Inside
-# this workspace those git sources are redirected back to the local crates, so
+# dependency on GitHub -- the crates' origin, the one place a push lands -- so a
+# standalone clone of one app resolves without sibling checkouts; that is what
+# makes a single app installable on its own. (Until 2026-09-21 the pins named
+# git.lucas.co, which is only an hourly mirror of GitHub now: a rev pinned right
+# after a push was not fetchable from there for up to an hour.) Inside this
+# workspace those git sources are redirected back to the local crates, so
 # workspace builds compile the working tree and cross-crate edits stay live.
 # The pinned revs only affect builds that happen outside this workspace, which
 # means they can go stale without any build here failing: after pushing cce-ui
-# or cce-window-manager, bump the rev in the crates that depend on them.
-[patch."https://git.lucas.co/cce-ui.git"]
+# or cce-window-manager, run ./bump-revs.sh to repin the crates that depend on
+# them. The patch keys must match the pins' URL exactly, or the patch is unused
+# and every crate silently builds a fetched copy of the toolkit.
+[patch."https://github.com/lsgalante/cce-ui.git"]
 cce-ui = { path = "cce-ui" }
 
-[patch."https://git.lucas.co/cce-window-manager.git"]
+[patch."https://github.com/lsgalante/cce-window-manager.git"]
 cce-window-manager = { path = "cce-window-manager" }
diff --git a/bump-revs.sh b/bump-revs.sh
index ffbf0ff..c473e0b 100755
--- a/bump-revs.sh
+++ b/bump-revs.sh
@@ -2,7 +2,7 @@
 # Bump the pinned revs that let a single crate be installed on its own.
 #
 # Each app declares its workspace-internal dependencies as git dependencies on
-# git.lucas.co, pinned to an exact rev, while the workspace root patches those
+# GitHub (the crates' origin), pinned to an exact rev, while the workspace root patches those
 # sources back to the local crates. That split is what lets one app be cloned
 # and built alone -- and it is also exactly why the pins rot silently: inside
 # this workspace the [patch] block always wins, so a stale rev never fails a
@@ -25,9 +25,9 @@
 # An origin ahead of the work tree is fine and is pinned as-is -- it is what
 # others can actually fetch.
 #
-# The pins themselves name git.lucas.co, which mirrors GitHub hourly, so a rev
-# pinned immediately after a push is correct but not yet fetchable from the
-# site. That resolves itself and is not an error.
+# The pins name GitHub directly (since 2026-09-21; before that git.lucas.co,
+# which only mirrors GitHub hourly, so a fresh pin was unfetchable for up to an
+# hour), so a rev pinned right after a push resolves at once.
 #
 # A manifest that should have changed but did not fails the run. Silently
 # skipping is what let 21 repos sit unpushed for a day; the same rule applies
@@ -63,7 +63,7 @@ say() { printf '%s\n' "$*"; }
 pins() {
     for m in "$ROOT"/*/Cargo.toml; do
         crate=$(basename "$(dirname "$m")")
-        sed -n 's|^\([a-z0-9-]*\) = { git = "https://git\.lucas\.co/\1\.git", rev = "\([0-9a-f]\{40\}\)" }$|'"$crate"' \1 \2|p' "$m"
+        sed -n 's|^\([a-z0-9-]*\) = { git = "https://github\.com/lsgalante/\1\.git", rev = "\([0-9a-f]\{40\}\)" }$|'"$crate"' \1 \2|p' "$m"
     done
 }
 
@@ -151,7 +151,7 @@ for t in $TARGETS; do
                 m="$ROOT/$crate/Cargo.toml"
                 say "    $crate"
                 if [ -z "$DRY" ]; then
-                    sed -i "s|^$dep = { git = \"https://git.lucas.co/$dep.git\", rev = \"$old\" }$|$dep = { git = \"https://git.lucas.co/$dep.git\", rev = \"$new\" }|" "$m"
+                    sed -i "s|^$dep = { git = \"https://github.com/lsgalante/$dep.git\", rev = \"$old\" }$|$dep = { git = \"https://github.com/lsgalante/$dep.git\", rev = \"$new\" }|" "$m"
                     grep -q "rev = \"$new\"" "$m" || {
                         say "!! $crate: manifest did not change -- pin format drifted?"; exit 1; }
                 else