No description
- Emacs Lisp 100%
| doc | ||
| role_instructions | ||
| .gitignore | ||
| COPYING | ||
| degudev-example-config.el | ||
| degudev-migrate-v2.el | ||
| degudev-migrate.el | ||
| degudev-pkg.el | ||
| degudev-roles.el | ||
| degudev.el | ||
| README.org | ||
degudev.el — Agentic AI development environment
Overview
An Emacs package for managing software projects with AI agents (e.g., Claude Code) running in Incus containers.
Each project uses three git repositories:
- Actual repo: the canonical source code (maintainer pushes)
- Developer repo: fork where the developer pushes code
- Communication repo: messages between reviewer and developer
Two actors in separate containers:
- Reviewer: reviews code, writes review messages
- Developer: implements issues, writes code
The project manager monitors via Emacs and merges approved code.
Access model
| Repo | Maintainer | Reviewer | Developer |
|---|---|---|---|
| Actual | push | pull | no access |
| Developer | push | pull | push |
| Communication | push | push | push |
Installation
From Git (package-install-file)
git clone https://git.degu.cl/daniel/incus.el ~/path/to/incus.el
git clone https://git.degu.cl/daniel/degudev.el ~/path/to/degudev.el
Then in Emacs (install dependency first):
M-x package-install-file RET ~/path/to/incus.el/ RET M-x package-install-file RET ~/path/to/degudev.el/ RET
With straight.el
(straight-use-package
'(incus :type git :repo "https://git.degu.cl/daniel/incus.el"))
(straight-use-package
'(degudev :type git :repo "https://git.degu.cl/daniel/degudev.el"))
With elpaca
(elpaca (incus :repo "https://git.degu.cl/daniel/incus.el"))
(elpaca (degudev :repo "https://git.degu.cl/daniel/degudev.el"))
Dependencies
incus.el(https://git.degu.cl/daniel/incus.el)
Configuration
See degudev-example-config.el for a complete example.
(setq degudev-projects
'(("my-project"
:container-prefix "myproj"
:repo-actual "ssh://git@git.example.com/user/project.git"
:repo-dev "ssh://git@git.example.com/user/project-dev.git"
:repo-comms "ssh://git@git.example.com/user/project-rev.git"
:setup-packages ("git" "curl" "build-essential")
:setup-commands ())))
Commands
| Command | Description |
|---|---|
degudev-register-project |
Register a new project (prompts for repos) |
degudev-create-containers |
Create and set up both containers (idempotent) |
degudev-show-keys |
Show SSH keys for adding to Forgejo repos |
degudev-destroy-containers |
Destroy both containers (with confirmation) |
degudev-list-projects |
List all configured projects |
degudev-start |
Start a container (reviewer or developer) |
degudev-stop |
Stop a container |
degudev-enter |
Open a vterm inside a container |
degudev-review-messages |
Pull and browse communication messages |
degudev-review-changes |
Pull and show developer's code changes |
Workflow
- Register project:
M-x degudev-register-project - Create containers:
M-x degudev-create-containers - Add SSH keys to Forgejo repos:
M-x degudev-show-keys - Enter developer container:
M-x degudev-enter(select dev) - Developer implements issues, pushes to dev repo
- Review messages:
M-x degudev-review-messages - Review code:
M-x degudev-review-changes - If approved, maintainer merges to actual repo
Message file naming
Messages in the communication repo follow this pattern:
{issue-id}-{YYYY-MM-DD}T{HH:MM}-{author}.org
Examples:
001-2026-04-12T14:30-reviewer.org 001-2026-04-12T15:45-developer.org
License
GPL-3.0-or-later