fix: auto-init repo on negotiate so first push can succeed Mirrors getHead's empty-repo handling: an authenticated client negotiating against a non-existent panproto-vcs store means it's about to push everything. open_or_init creates the FsStore so the push can proceed instead of bailing with a 500.

Author: Aaron Steven White
Commit 613ec8ea29bb6eedde1a5b1cf9378e070647582b
Parent: 3da89680e7
Structural diff unavailable

These commits were pushed via plain git push, so no pre-parsed schemas are available. Install git-remote-cospan and re-push via panproto:// to see scope-level changes, breaking change detection, and semantic diffs.

brew install panproto/tap/git-remote-cospan
1 file changed +3 -1
@@ -28,8 +28,10 @@ pub async fn negotiate(
2828     Json(input): Json<NegotiateInput>,
2929 ) -> Result<Json<serde_json::Value>, NodeError> {
3030     let store = state.store.lock().await;
31+    // Auto-init on first push: an authenticated client negotiating against
32+    // a not-yet-existing repo means "I'm about to push you everything".
3133     let fs_store = store
32-        .open(&input.did, &input.repo)
34+        .open_or_init(&input.did, &input.repo)
3335         .map_err(|e| NodeError::Internal(format!("store error: {e}")))?;
3436 
3537     // Build set of objects the client already has
cospan · schematic version control on atproto built on AT Protocol