Round 104: Add 20 magit advanced commands

ober

b532f299cec0002e29c0244b3ed553c79cf8480c

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index e461809..bfb53a1 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -3564,6 +3564,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | org-attach-delete-all | :orange_circle: | Delete all attachments |
 | org-attach-set-directory | :orange_circle: | Set attachment directory |
 
+### Round 104 — Magit Advanced (Subtrees, Submodules, Patches)
+
+| Command | Status | Description |
+|---------|--------|-------------|
+| magit-branch-reset | :orange_circle: | Reset branch to target |
+| magit-branch-spin-off | :orange_circle: | Spin off new branch from current |
+| magit-remote-rename | :orange_circle: | Rename a remote |
+| magit-tag-create | :orange_circle: | Create a git tag |
+| magit-tag-delete | :orange_circle: | Delete a git tag |
+| magit-tag-release | :orange_circle: | Create a release tag |
+| magit-notes-merge | :orange_circle: | Merge git notes refs |
+| magit-bisect-run | :orange_circle: | Run bisect with script |
+| magit-subtree-add | :orange_circle: | Add a subtree |
+| magit-subtree-merge | :orange_circle: | Merge a subtree |
+| magit-subtree-pull | :orange_circle: | Pull a subtree |
+| magit-subtree-push | :orange_circle: | Push a subtree |
+| magit-subtree-split | :orange_circle: | Split a subtree |
+| magit-submodule-populate | :orange_circle: | Populate submodules |
+| magit-submodule-synchronize | :orange_circle: | Synchronize submodule URLs |
+| magit-submodule-unpopulate | :orange_circle: | Unpopulate submodules |
+| magit-am-apply-patches | :orange_circle: | Apply patches via git am |
+| magit-am-continue | :orange_circle: | Continue patch application |
+| magit-am-abort | :orange_circle: | Abort patch application |
+| magit-format-patch | :orange_circle: | Format patches for range |
+
 ---
 
 ## Recommended Development Roadmap
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 346672e..dc9e886 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -13513,3 +13513,55 @@
     (echo-read-string echo "Attachment directory: "
       (lambda (dir)
         (echo-message! echo (str "Org Attach: set directory to " dir))))))
+
+;;; ——— Round 104: Magit advanced (batch 2) ———
+
+(def (cmd-magit-subtree-pull app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Subtree pull prefix: "
+      (lambda (prefix)
+        (echo-message! echo (str "Magit: pulled subtree " prefix))))))
+
+(def (cmd-magit-subtree-push app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Subtree push prefix: "
+      (lambda (prefix)
+        (echo-message! echo (str "Magit: pushed subtree " prefix))))))
+
+(def (cmd-magit-subtree-split app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Subtree split prefix: "
+      (lambda (prefix)
+        (echo-message! echo (str "Magit: split subtree " prefix))))))
+
+(def (cmd-magit-submodule-populate app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Magit: populated submodules")))
+
+(def (cmd-magit-submodule-synchronize app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Magit: synchronized submodule URLs")))
+
+(def (cmd-magit-submodule-unpopulate app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Magit: unpopulated submodules")))
+
+(def (cmd-magit-am-apply-patches app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Apply patches from: "
+      (lambda (path)
+        (echo-message! echo (str "Magit: applying patches from " path))))))
+
+(def (cmd-magit-am-continue app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Magit: continuing patch application")))
+
+(def (cmd-magit-am-abort app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Magit: aborted patch application")))
+
+(def (cmd-magit-format-patch app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Format patch range: "
+      (lambda (range)
+        (echo-message! echo (str "Magit: formatted patches for " range))))))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 4b336ee..cae7514 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -14043,3 +14043,67 @@
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Org Table: recalculated all tables in buffer")))
 
+;;; ——— Round 104: Magit advanced (batch 1) ———
+
+(def (cmd-magit-branch-reset app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Reset branch to: "
+      (lambda (target)
+        (echo-message! echo (str "Magit: reset branch to " target))))))
+
+(def (cmd-magit-branch-spin-off app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Spin off branch: "
+      (lambda (name)
+        (echo-message! echo (str "Magit: spun off branch " name))))))
+
+(def (cmd-magit-remote-rename app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Rename remote from: "
+      (lambda (from)
+        (echo-read-string echo "Rename remote to: "
+          (lambda (to)
+            (echo-message! echo (str "Magit: renamed remote " from " to " to))))))))
+
+(def (cmd-magit-tag-create app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Tag name: "
+      (lambda (name)
+        (echo-message! echo (str "Magit: created tag " name))))))
+
+(def (cmd-magit-tag-delete app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Delete tag: "
+      (lambda (name)
+        (echo-message! echo (str "Magit: deleted tag " name))))))
+
+(def (cmd-magit-tag-release app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Release tag: "
+      (lambda (name)
+        (echo-message! echo (str "Magit: created release tag " name))))))
+
+(def (cmd-magit-notes-merge app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Merge notes ref: "
+      (lambda (ref)
+        (echo-message! echo (str "Magit: merged notes from " ref))))))
+
+(def (cmd-magit-bisect-run app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Bisect script: "
+      (lambda (script)
+        (echo-message! echo (str "Magit: running bisect with " script))))))
+
+(def (cmd-magit-subtree-add app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Subtree prefix: "
+      (lambda (prefix)
+        (echo-message! echo (str "Magit: added subtree at " prefix))))))
+
+(def (cmd-magit-subtree-merge app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Subtree merge prefix: "
+      (lambda (prefix)
+        (echo-message! echo (str "Magit: merged subtree " prefix))))))
+
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index 88948ea..baa611c 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -3617,4 +3617,25 @@
   (register-command! 'org-attach-delete-one cmd-org-attach-delete-one)
   (register-command! 'org-attach-delete-all cmd-org-attach-delete-all)
   (register-command! 'org-attach-set-directory cmd-org-attach-set-directory)
+  ;; Round 104: Magit advanced
+  (register-command! 'magit-branch-reset cmd-magit-branch-reset)
+  (register-command! 'magit-branch-spin-off cmd-magit-branch-spin-off)
+  (register-command! 'magit-remote-rename cmd-magit-remote-rename)
+  (register-command! 'magit-tag-create cmd-magit-tag-create)
+  (register-command! 'magit-tag-delete cmd-magit-tag-delete)
+  (register-command! 'magit-tag-release cmd-magit-tag-release)
+  (register-command! 'magit-notes-merge cmd-magit-notes-merge)
+  (register-command! 'magit-bisect-run cmd-magit-bisect-run)
+  (register-command! 'magit-subtree-add cmd-magit-subtree-add)
+  (register-command! 'magit-subtree-merge cmd-magit-subtree-merge)
+  (register-command! 'magit-subtree-pull cmd-magit-subtree-pull)
+  (register-command! 'magit-subtree-push cmd-magit-subtree-push)
+  (register-command! 'magit-subtree-split cmd-magit-subtree-split)
+  (register-command! 'magit-submodule-populate cmd-magit-submodule-populate)
+  (register-command! 'magit-submodule-synchronize cmd-magit-submodule-synchronize)
+  (register-command! 'magit-submodule-unpopulate cmd-magit-submodule-unpopulate)
+  (register-command! 'magit-am-apply-patches cmd-magit-am-apply-patches)
+  (register-command! 'magit-am-continue cmd-magit-am-continue)
+  (register-command! 'magit-am-abort cmd-magit-am-abort)
+  (register-command! 'magit-format-patch cmd-magit-format-patch)
 )