Xenodium's Emacs packages: chatgpt-shell, agent-shell, dwim-shell-command, and ACP integration for modern Emacs development.
/plugin marketplace add plurigrid/asi/plugin install plurigrid-asi-skills@plurigrid/asiThis skill inherits all available tools. When active, it can use any tool Claude has access to.
"The best UI is no UI. The second best UI is Emacs."
| Package | Stars | Description |
|---|---|---|
| chatgpt-shell | 1180⭐ | Multi-LLM Emacs shell (ChatGPT, Claude, DeepSeek, Gemini, Ollama) |
| agent-shell | 415⭐ | Native Emacs buffer for LLM agents via ACP |
| dwim-shell-command | 293⭐ | Save and apply shell commands with ease |
| acp.el | 109⭐ | Agent Client Protocol implementation |
| ob-swiftui | 87⭐ | SwiftUI in Org Babel blocks |
| sqlite-mode-extras | 58⭐ | Enhanced sqlite-mode |
(use-package chatgpt-shell
:custom
(chatgpt-shell-model-version "gpt-4o")
(chatgpt-shell-anthropic-key (getenv "ANTHROPIC_API_KEY"))
(chatgpt-shell-openai-key (getenv "OPENAI_API_KEY"))
:config
;; Switch between models
(setq chatgpt-shell-model-versions
'("gpt-4o" "gpt-4-turbo" "claude-3-5-sonnet" "gemini-pro")))
;; Key bindings
(global-set-key (kbd "C-c g") 'chatgpt-shell)
(global-set-key (kbd "C-c G") 'chatgpt-shell-send-region)
| Command | Description |
|---|---|
chatgpt-shell | Open interactive shell |
chatgpt-shell-send-region | Send selected region |
chatgpt-shell-describe-code | Explain code at point |
chatgpt-shell-refactor-code | Refactor with AI |
chatgpt-shell-generate-unit-test | Generate tests |
Agent Client Protocol enables structured agent workflows:
(use-package agent-shell
:after acp
:config
(setq agent-shell-default-agent "coding-assistant"))
;; Define custom agent
(acp-define-agent "music-topos-agent"
:system-prompt "You are a categorical music theory assistant..."
:tools '((:name "generate-color"
:description "Generate deterministic color from seed"
:parameters ((:name "seed" :type "integer")
(:name "index" :type "integer")))))
(use-package dwim-shell-command
:bind (("M-!" . dwim-shell-command)
("C-c !" . dwim-shell-command-on-marked-files)))
;; Define reusable commands
(dwim-shell-command-define
:name "Convert to WebP"
:command "cwebp -q 80 '<<f>>' -o '<<fne>>.webp'"
:utils "cwebp")
(dwim-shell-command-define
:name "FFmpeg to GIF"
:command "ffmpeg -i '<<f>>' -vf 'fps=10,scale=320:-1' '<<fne>>.gif'"
:utils "ffmpeg")
| Variable | Meaning |
|---|---|
<<f>> | Full file path |
<<fne>> | File path without extension |
<<e>> | File extension |
<<*>> | All marked files |
(use-package acp
:config
;; Register MCP servers
(acp-register-server
:name "gay-mcp"
:command '("julia" "--project=@gay" "-e" "using Gay; Gay.serve_mcp()")
:env '(("GAY_SEED" . "1069")))
(acp-register-server
:name "firecrawl"
:command '("npx" "-y" "firecrawl-mcp")))
(use-package sqlite-mode-extras
:after sqlite-mode
:hook (sqlite-mode . sqlite-mode-extras-minor-mode)
:bind (:map sqlite-mode-map
("n" . sqlite-mode-extras-next-row)
("p" . sqlite-mode-extras-prev-row)
("e" . sqlite-mode-extras-edit-cell)
("x" . sqlite-mode-extras-execute)))
(defun gay/chatgpt-shell-colorize-response ()
"Colorize chatgpt-shell responses with deterministic colors."
(let* ((response-count (length chatgpt-shell--conversation))
(color (gay-color-at gay-seed-default response-count))
(hex (gay-color-to-hex color)))
(put-text-property (point-min) (point-max)
'face `(:background ,hex))))
(add-hook 'chatgpt-shell-response-hook #'gay/chatgpt-shell-colorize-response)
(defun gay/agent-response-trit (response)
"Map agent response to trit based on sentiment/category."
(let* ((hash (sxhash response))
(color (gay-color-at gay-seed-default (mod hash 1000)))
(hue (plist-get color :H)))
(gay-hue-to-trit hue)))
(defun gay/verify-conversation-gf3 ()
"Verify GF(3) conservation across conversation."
(let ((trits (mapcar #'gay/agent-response-trit
chatgpt-shell--conversation)))
(gay-gf3-conserved-p trits)))
(require 'transient)
(transient-define-prefix gay-transient ()
"Gay.el color generation commands."
["Colors"
("p" "Generate palette" gay-generate-palette)
("c" "Check GF(3)" gay-check-gf3)
("h" "Color at index" gay-color-at-interactive)]
["Agents"
("s" "Spawn hierarchy" narya/spawn-hierarchy)
("d" "Demo" narya/demo)]
["Shell"
("g" "ChatGPT Shell" chatgpt-shell)
("a" "Agent Shell" agent-shell)])
(global-set-key (kbd "C-c C-g") 'gay-transient)
Xenodium's approach embodies xenomodernity through:
xenodium
│
┌──────────────┼──────────────┐
│ │ │
Emacs Lisp Modern LLMs Unix Tools
(1976) (2022+) (1970s)
│ │ │
└──────────────┴──────────────┘
│
Ironic Synthesis
(chatgpt-shell, acp.el)
just xenodium-setup # Install xenodium packages
just chatgpt-shell-demo # Run chatgpt-shell demo
just agent-shell-config # Configure agent-shell with MCP
just dwim-define # Create custom dwim-shell-command