Round 187: Pass, Auth-source, Keychain, Pinentry commands

ober

407e5dd09204365adb258a862ed19e74a4c28822

diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
index d114439..a29c1dd 100644
--- a/docs/jemacs-vs-emacs.md
+++ b/docs/jemacs-vs-emacs.md
@@ -4583,6 +4583,31 @@ No remaining Tier 1 gaps. All core editing, completion, and navigation features 
 | ebib-import-file | :orange_circle: | Import file into Ebib |
 | ebib-push-citation | :orange_circle: | Push Ebib citation to buffer |
 
+### Round 187 — Pass, Auth-source, Keychain, Pinentry
+
+| Feature | Status | Notes |
+|---|---|---|
+| pass-mode | :orange_circle: | Toggle pass mode |
+| pass-view | :orange_circle: | View pass entry |
+| pass-copy | :orange_circle: | Copy pass entry to clipboard |
+| pass-insert | :orange_circle: | Insert new pass entry |
+| pass-generate | :orange_circle: | Generate password |
+| pass-remove | :orange_circle: | Remove pass entry |
+| pass-rename | :orange_circle: | Rename pass entry |
+| pass-edit | :orange_circle: | Edit pass entry |
+| pass-otp-append | :orange_circle: | Append OTP to entry |
+| pass-otp-copy | :orange_circle: | Copy OTP token |
+| pass-copy-username | :orange_circle: | Copy username from entry |
+| auth-source-forget | :orange_circle: | Forget cached credentials |
+| auth-source-save-behavior | :orange_circle: | Toggle save behavior |
+| keychain-unlock | :orange_circle: | Unlock keychain |
+| keychain-lock | :orange_circle: | Lock keychain |
+| keychain-list | :orange_circle: | List keychain entries |
+| keychain-refresh | :orange_circle: | Refresh keychain |
+| pinentry-start | :orange_circle: | Start pinentry |
+| pinentry-stop | :orange_circle: | Stop pinentry |
+| pinentry-prompt | :orange_circle: | Show pinentry prompt |
+
 ### Round 186 — Systemd, Journalctl, Proced-ext, Auditd
 
 | Feature | Status | Notes |
diff --git a/src/jerboa-emacs/editor-extra-final.ss b/src/jerboa-emacs/editor-extra-final.ss
index 0a099d3..331c1ff 100644
--- a/src/jerboa-emacs/editor-extra-final.ss
+++ b/src/jerboa-emacs/editor-extra-final.ss
@@ -17555,3 +17555,46 @@
     (echo-read-string echo "Audit filter: "
       (lambda (filter)
         (echo-message! echo (str "Auditd: filtering by " filter))))))
+
+;; Round 187 — Pass, Auth-source, Keychain, Pinentry (batch 2)
+(def (cmd-pass-copy-username app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Copy username for: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: copied username for " entry))))))
+
+(def (cmd-auth-source-forget app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Auth-source: forgot cached credentials")))
+
+(def (cmd-auth-source-save-behavior app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Auth-source: toggled save behavior")))
+
+(def (cmd-keychain-unlock app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Keychain: unlocked")))
+
+(def (cmd-keychain-lock app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Keychain: locked")))
+
+(def (cmd-keychain-list app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Keychain: listing entries")))
+
+(def (cmd-keychain-refresh app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Keychain: refreshed")))
+
+(def (cmd-pinentry-start app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Pinentry: started")))
+
+(def (cmd-pinentry-stop app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Pinentry: stopped")))
+
+(def (cmd-pinentry-prompt app)
+  (let* ((echo (app-state-echo app)))
+    (echo-message! echo "Pinentry: showing prompt")))
diff --git a/src/jerboa-emacs/editor-extra-modes.ss b/src/jerboa-emacs/editor-extra-modes.ss
index 2860ed1..bba3eda 100644
--- a/src/jerboa-emacs/editor-extra-modes.ss
+++ b/src/jerboa-emacs/editor-extra-modes.ss
@@ -18182,3 +18182,65 @@
 (def (cmd-journalctl-boot app)
   (let* ((echo (app-state-echo app)))
     (echo-message! echo "Journalctl: showing current boot log")))
+
+;; Round 187 — Pass, Auth-source, Keychain, Pinentry (batch 1)
+(def (cmd-pass-mode app)
+  (let* ((echo (app-state-echo app)))
+    (toggle-mode! app 'pass)
+    (if (mode-enabled? app 'pass)
+      (echo-message! echo "Pass mode enabled")
+      (echo-message! echo "Pass mode disabled"))))
+
+(def (cmd-pass-view app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: viewing " entry))))))
+
+(def (cmd-pass-copy app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Copy entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: copied " entry " to clipboard"))))))
+
+(def (cmd-pass-insert app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "New entry name: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: inserted " entry))))))
+
+(def (cmd-pass-generate app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Generate for: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: generated password for " entry))))))
+
+(def (cmd-pass-remove app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Remove entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: removed " entry))))))
+
+(def (cmd-pass-rename app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Rename entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: renamed " entry))))))
+
+(def (cmd-pass-edit app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Edit entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: editing " entry))))))
+
+(def (cmd-pass-otp-append app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "OTP entry: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: appended OTP to " entry))))))
+
+(def (cmd-pass-otp-copy app)
+  (let* ((echo (app-state-echo app)))
+    (echo-read-string echo "Copy OTP for: "
+      (lambda (entry)
+        (echo-message! echo (str "Pass: copied OTP for " entry))))))
diff --git a/src/jerboa-emacs/editor-extra-regs2.ss b/src/jerboa-emacs/editor-extra-regs2.ss
index b645ad9..8bc96cf 100644
--- a/src/jerboa-emacs/editor-extra-regs2.ss
+++ b/src/jerboa-emacs/editor-extra-regs2.ss
@@ -5360,4 +5360,25 @@
   (register-command! 'auditd-mode cmd-auditd-mode)
   (register-command! 'auditd-search cmd-auditd-search)
   (register-command! 'auditd-filter cmd-auditd-filter)
+  ;; Round 187 — Pass, Auth-source, Keychain, Pinentry
+  (register-command! 'pass-mode cmd-pass-mode)
+  (register-command! 'pass-view cmd-pass-view)
+  (register-command! 'pass-copy cmd-pass-copy)
+  (register-command! 'pass-insert cmd-pass-insert)
+  (register-command! 'pass-generate cmd-pass-generate)
+  (register-command! 'pass-remove cmd-pass-remove)
+  (register-command! 'pass-rename cmd-pass-rename)
+  (register-command! 'pass-edit cmd-pass-edit)
+  (register-command! 'pass-otp-append cmd-pass-otp-append)
+  (register-command! 'pass-otp-copy cmd-pass-otp-copy)
+  (register-command! 'pass-copy-username cmd-pass-copy-username)
+  (register-command! 'auth-source-forget cmd-auth-source-forget)
+  (register-command! 'auth-source-save-behavior cmd-auth-source-save-behavior)
+  (register-command! 'keychain-unlock cmd-keychain-unlock)
+  (register-command! 'keychain-lock cmd-keychain-lock)
+  (register-command! 'keychain-list cmd-keychain-list)
+  (register-command! 'keychain-refresh cmd-keychain-refresh)
+  (register-command! 'pinentry-start cmd-pinentry-start)
+  (register-command! 'pinentry-stop cmd-pinentry-stop)
+  (register-command! 'pinentry-prompt cmd-pinentry-prompt)
 )