sage.el: AI Coding Assistant for Emacs
Table of Contents
Source: github.com/aygp-dr/sage.el
1. Executive Summary
sage.el is a modular AI coding assistant for Emacs that brings tool-calling capabilities to your editor. Unlike CLI-based assistants, sage.el is designed around Emacs' unique strengths: long-lived sessions, buffer persistence, and deep editor integration.
"The best AI assistant is one that feels native to your workflow."
1.1. Key Differentiators
| Feature | sage.el | Claude Code | Gemini CLI |
|---|---|---|---|
| Session continuation | Auto-continue | Explicit –continue | New each time |
| Editor integration | Native Emacs | Terminal | Terminal |
| Tool ecosystem | Extensible Elisp | Fixed set | Fixed set |
| org-mode support | First-class | None | None |
| Magit integration | Native | External | External |
2. Why sage.el?
2.1. The REPL Paradigm
Unlike CLI tools where each invocation is stateless, sage.el follows REPL semantics:
- Continuous Context: Your conversation accumulates naturally
- Visual History: See previous exchanges in the
*sage*buffer - Project Binding: Context is scoped to your project directory
2.2. Emacs-Native Design
sage.el leverages Emacs' unique capabilities:
- Buffer State: Conversations persist like any other buffer
- Mode Integration: Works with
project.el,projectile,magit - Org-mode: Export conversations, embed in documents
- Tool Extensibility: Write tools in Elisp, not shell scripts
3. Architecture
sage.el (Modular Architecture) ├── sage.el # Core REPL and user interface ├── sage-context.el # Context window management ├── sage-emacs.el # Emacs integration (buffers, files) ├── sage-log.el # Structured JSON logging ├── sage-memory.el # Conversation memory ├── sage-project.el # Project-scoped session storage ├── sage-queue.el # Request queue management ├── sage-ratelimit.el # API rate limiting ├── sage-reflect.el # Self-reflection and introspection ├── sage-session.el # UUID-based session management ├── sage-tools.el # Tool calling framework └── sage-tool-factory.el # Dynamic tool generation
3.1. Integration Modules
Optional Integrations ├── sage-magit.el # Git operations via Magit └── sage-org.el # Org-mode document support
4. Development Methodology
4.1. RFC-Driven Design
Major features go through a formal RFC process:
- Proposal: Write RFC document with motivation, design, alternatives
- Multi-Stakeholder Review: L7 (API), CTO (Architecture), Developer, Release
- Test Specification: Aggressive test plan before implementation
- Implementation: Phased rollout with backward compatibility
4.2. Parallel Agent Reviews
We use specialized "agent personas" for comprehensive code review:
| Agent | Focus | Concerns |
|---|---|---|
| L7 | API/Protocol | UUID collision, file locking, rate limiting |
| CTO | Architecture | Scalability, resource usage, migration path |
| Elisp Dev | Emacs conventions | Blocking I/O, defcustom usage, project.el integration |
| MELPA | Package quality | Byte-compilation, checkdoc, package-lint |
4.3. Beads Task Tracking
All development tasks are tracked using beads (bd):
bd list # See all open issues bd ready # Find unblocked work bd create "Feature" # Create new task bd close <id> # Complete task
Current bead: gemini-repl-010-5uh (Session Storage RFC)
5. Features
5.1. Tool Calling System
sage.el implements a comprehensive tool calling framework:
;; Register a custom tool (sage-tools-register "my-tool" :description "My custom tool" :parameters '((param1 . "string")) :handler #'my-tool-handler)
Built-in tools:
read_file,write_file,edit_filebash(command execution)search_files,list_filesproject_info,buffer_info
5.2. Session Persistence
Sessions are stored per-project with automatic continuation:
~/.emacs.d/sage/projects/<encoded-path>/ ├── <session-uuid>.jsonl # Session conversation ├── sessions.json # Session index └── history/ # Archived sessions
Key behaviors:
- Auto-continue: Restart Emacs and pick up where you left off
- Project-scoped: Different projects maintain separate contexts
- Exportable: JSONL format compatible with other TCAs
5.3. Rate Limiting
Intelligent rate limiting prevents API quota exhaustion:
(setq sage-ratelimit-requests-per-minute 60) (setq sage-ratelimit-tokens-per-minute 100000)
Features:
- Token counting with cl-100k-base estimation
- Exponential backoff on 429 errors
- Request queue with priority
5.4. Context Management
Automatic context window management:
(setq sage-context-max-tokens 128000) (setq sage-context-reserve-output 4096)
- Automatic truncation when approaching limits
- Preservation of system prompts and recent messages
- Token usage reporting via
/contextcommand
6. Interoperability
6.1. TCA Session Schema
sage.el follows the Tool Calling Agent (TCA) session schema for interoperability with other AI coding assistants:
{
"uuid": "msg-uuid",
"sessionId": "session-uuid",
"role": "user|assistant|system|tool",
"content": "message content",
"timestamp": "2026-01-11T22:00:00Z",
"tool_calls": [...]
}
Compatible with:
- Claude Code (~/.claude/projects/)
- Gemini CLI
- Future: Amp, Aider, Cursor
6.2. Storage Presets
;; Claude Code compatible format (setq sage-project-storage-preset 'claude-shared) ;; Emacs-native format (default) (setq sage-project-storage-preset 'emacs-native)
7. Quality Assurance
7.1. Test Coverage
Tests: 99 passed, 0 failed Modules tested: - sage-test.el: 9/9 passed - sage-context-test.el: 12/12 passed - sage-emacs-test.el: 9/9 passed - sage-memory-test.el: 18/18 passed - sage-project-test.el: 18/18 passed - sage-queue-test.el: 11/11 passed - sage-ratelimit-test.el: 22/22 passed
Run tests:
make test-all # Run all tests make test-session # Session-specific tests make test-coverage # With coverage report
7.2. CI/CD
GitHub Actions runs on every push:
- Byte compilation (Emacs 27.1, 28.1, 29.1)
- ERT test suite
- Checkdoc validation
- Package-lint compliance
8. Getting Started
8.1. Installation
;; With straight.el (straight-use-package '(sage :type git :host github :repo "aygp-dr/sage.el")) ;; With use-package (use-package sage :straight (:type git :host github :repo "aygp-dr/sage.el") :config (setq sage-provider 'ollama) (setq sage-model "llama3.2"))
8.2. Basic Usage
M-x sage ; Start REPL (auto-continues last session) C-u M-x sage ; Force new session ;; In sage buffer /help ; Show available commands /context ; Show context usage /session ; Show session info /reset ; Clear current session
8.3. Configuration
;; Provider selection (setq sage-provider 'gemini) ; or 'ollama, 'openai, 'anthropic (setq sage-model "gemini-2.0-flash") ;; Session behavior (setq sage-session-auto-continue t) ; Auto-continue (default) (setq sage-session-max-age-hours 24) ; Force new after 24h ;; Rate limiting (setq sage-ratelimit-requests-per-minute 60)
9. Roadmap
9.1. Phase 1: Core (Complete)
[X]Multi-provider support (Ollama, Gemini, OpenAI, Anthropic)[X]Tool calling framework[X]Session persistence[X]Rate limiting[X]Context management
9.2. Phase 2: Integration (In Progress)
[X]Magit integration[X]Org-mode support[ ]Project.el deep integration[ ]Dired tool support
9.3. Phase 3: Advanced (Planned)
[ ]Sub-agent spawning[ ]Cloud sync (optional)[ ]Voice input (whisper.el)[ ]Image understanding (multimodal)
9.4. Phase 4: Ecosystem (Future)
[ ]MELPA submission[ ]Emacs Wiki documentation[ ]Community tool repository
10. Contributing
See GitHub Repository for:
- Issue tracking
- Pull request guidelines
- RFC process documentation
11. References
12. License
MIT License - See repository for full license text.
13. Contact
- Author: Jason Walsh <j@wal.sh>
- GitHub: aygp-dr
- Mastodon: @jwalsh@emacs.ch