Autonomous Multi-Forge Issue Agent
  • PHP 94%
  • Blade 5.8%
  • JavaScript 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Sébastien Denooz addb253d1a
All checks were successful
CI / checks (pull_request) Successful in 3m14s
CI / checks (push) Successful in 4m9s
test: drop no-op Closure imports from unnamespaced test files
PHP warns that a use statement with a non-compound name has no effect; in a parallel run Pest turns the warning into an error and stops the suite.
2026-11-04 02:56:12 +01:00
.forgejo/workflows ci: install Node.js before Forgejo actions and build assets before Pest 2026-09-27 19:23:54 +02:00
.github/workflows ci: install Node.js before Forgejo actions and build assets before Pest 2026-09-27 19:23:54 +02:00
app fix(scheduling): fail the run when its queue job fails 2026-11-04 02:55:23 +01:00
bootstrap feat(queue): install Laravel Horizon 2026-10-15 20:38:20 +02:00
config fix(scheduling): fail the run when its queue job fails 2026-11-04 02:55:23 +01:00
database feat: add a live activity page to follow a run's agent 2026-11-03 23:14:25 +01:00
docs fix(scheduling): fail the run when its queue job fails 2026-11-04 02:55:23 +01:00
lang feat(lifecycle): retry_once and retry_until_green after a CI block 2026-10-16 00:15:39 +02:00
public build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
resources feat: add a live activity page to follow a run's agent 2026-11-03 23:14:25 +01:00
routes feat: add a live activity page to follow a run's agent 2026-11-03 23:14:25 +01:00
scripts/ci ci: install Node.js before Forgejo actions and build assets before Pest 2026-09-27 19:23:54 +02:00
storage build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
tasks style(instance): give the forge CLI table the full width 2026-09-28 04:51:32 +02:00
tests test: drop no-op Closure imports from unnamespaced test files 2026-11-04 02:56:12 +01:00
.editorconfig build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
.env.example feat(sandbox): host run environment with a per-run home 2026-09-28 02:09:22 +02:00
.gitattributes build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
.gitignore ci(pipelines): run the quality gates on GitLab, GitHub and Forgejo 2026-09-26 09:38:50 +02:00
.gitlab-ci.yml ci: install Node.js before Forgejo actions and build assets before Pest 2026-09-27 19:23:54 +02:00
.npmrc build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
artisan build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
composer.json feat(queue): install Laravel Horizon 2026-10-15 20:38:20 +02:00
composer.lock feat(queue): install Laravel Horizon 2026-10-15 20:38:20 +02:00
LICENSE Initial commit 2026-09-25 22:59:06 +00:00
package-lock.json build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
package.json build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
phpstan.neon build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
phpunit.xml feat(security): encrypt secrets at rest with a rotatable master key 2026-09-26 09:53:12 +02:00
pint.json build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00
README.md Update README.md 2026-09-26 00:59:13 +00:00
vite.config.js build(scaffold): set up the Laravel 13 application and quality gates 2026-09-26 09:34:04 +02:00

Alfred

An autonomous issue agent for GitLab, GitHub and Forgejo.

Assign Alfred to an issue and it takes it from there: it analyzes the request, asks questions when something is unclear, proposes a plan, implements the change, opens a merge request, fixes failing pipelines and applies review feedback. Everything happens inside the forge, through labels, comments and merge requests. Unassign it and it stops immediately.

Status: early development.

How it works

flowchart LR
    A["Issue assigned<br/>to the bot"] --> B["Analysis<br/>and questions"]
    B --> P["Plan validation"]
    P --> D["Development<br/>branch + MR"]
    D --> C["CI"]
    C -- failed --> D
    C -- green --> R["Human review"]
    R -- feedback --> D
    R -- merged by a human --> E["Done"]

Alfred works through a real user account on each forge, and only on the issues that account is assigned to. A status label shows where each issue stands. Questions arrive as checkboxes with the recommended answer already ticked, so silence is an answer. You validate the plan with a label, review the merge request like any other, and merge it yourself.

Principles

  • It acts only when asked. Assignment starts the work; unassignment is an immediate stop.
  • It is a user like any other. No special permissions: what a developer cannot do, Alfred cannot do either.
  • The model never touches the forge. It proposes actions; Alfred validates them and is the only one to comment, commit and push.
  • Every run is sandboxed. The agent works in a disposable container that sees only the working copy.
  • Humans keep the last word. Alfred never merges, never approves, never signs a commit.

Under the hood

Alfred is a single Laravel application with a server-rendered administration interface (Blade and Tailwind CSS) for configuration, supervision and audit. The agent runs either through model provider APIs with laravel/ai, or through a local coding agent — Claude Code, OpenAI Codex, OpenCode, GitHub Copilot CLI or xAI Grok Build — chosen per organization, project and phase. Organizations are fully isolated, and every prompt, output and forge write is recorded.

Documentation

The full specification — architecture, workflow, configuration, security — lives in docs/specification.md