Xenodium's Emacs packages: chatgpt-shell, agent-shell, dwim-shell-command, and ACP integration for modern Emacs development.
"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
Part of: repl-commons. Family canonical: emacs.
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer