Multi-Agent Collaboration CLI with flock-based locking and event-driven workflow
Project description
Mai CLI
Multi-Agent Collaboration CLI — flock-based coordination, event-driven workflow, zero overhead.
Mai is a command-line tool that coordinates multiple AI agents working on a shared project. It provides atomic locking, queue-based issue routing, per-agent heartbeat timeouts, and an automated daily summary loop — all backed by a simple file-based store.
Features
- Atomic flock locks — race-condition-free claim/complete cycles via POSIX
fcntl - Queue-based routing — issues route to the right agent with configurable SLA per queue
- Heartbeat-aware guardian — stale locks auto-release after
heartbeat × 1.5minutes - Event-driven daily summary — ordered turn-taking with idempotent trigger/collect
- Async mirror —
.mai/internal store syncs toasync/for human visibility - Configurable via JSON — all rules externalized to
config.json; no code changes needed - Dual output format —
--format jsonfor machine consumption, text for humans - Dry-run mode —
--dry-runpreviews every mutation without side effects
Installation
pip install mai-cli
Or install from source:
git clone https://github.com/yourname/mai-cli.git
cd mai-cli
pip install -e .
Quick Start
Step 1 — Initialize a project
mai project init MyProject
Step 2 — Create an issue
mai --project MyProject issue new programmer-questions "How should we handle input buffering?"
Step 3 — Have the assigned agent claim it
mai --project MyProject issue claim REQ-001
Step 4 — Mark it done
mai --project MyProject issue complete REQ-001 "Decision: ring buffer, 60Hz polling"
Step 5 — Inspect queues
mai --project MyProject queue check
Architecture
.mai/ async/
├── queues/<queue>/ Issue files <queue>/ Human-visible mirror
├── locks/ flock files (internal only)
├── processing/ Active issues <queue>/
├── decisions/ Conclusion logs decisions/
├── history/ Audit logs history/
├── events/ Daily-summary triggers (internal only)
└── config.json All collaboration rules
Lock protocol: When an agent claims an issue, Mai acquires an flock(2)-based file lock. The lock expires after heartbeat × 1.5 minutes if the agent fails to heartbeat. The lock guardian cron command automatically releases stale locks.
Daily summary flow: trigger → each agent write in order → collect merges all summaries into a single report.
Command Reference
Issue
mai issue new <queue> <title> [--ref REQ-XXX]
mai issue amend <issue-id> <remark>
mai issue claim <issue-id>
mai issue complete <issue-id> <conclusion>
mai issue list [queue]
mai issue show <issue-id>
mai issue escalate <issue-id>
Queue
mai queue check [queue] [--overdue]
mai queue blockers
Lock
mai lock check <issue-id>
mai lock force-release <issue-id>
mai lock guardian
Log
mai log history [--date YYYY-MM-DD] [--agent NAME]
mai log write <agent> <type> <summary> [status]
Daily Summary
mai daily-summary trigger
mai daily-summary write <agent> <content...>
mai daily-summary read [<agent>|.|--all]
Escalation
mai escalation gen <issue-id>
Project
mai project init <project-name>
Configuration
Edit .mai/config.json in your project root:
{
"queues": {
"programmer-questions": {
"handler": "designer",
"sla_minutes": 120,
"id_prefix": "REQ"
}
},
"agents": {
"programmer": { "heartbeat_minutes": 17 },
"designer": { "heartbeat_minutes": 29 }
},
"daily_summary_order": ["programmer", "designer", "architect", "narrative", "techartist"]
}
Legacy field compatibility
owner → handler, sla_hours → sla_minutes are automatically converted.
Supported Platforms
- OS: Linux / macOS (POSIX required for
flock) - Python: 3.8, 3.9, 3.10, 3.11, 3.12
License
MIT License — see LICENSE for the full text.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mai_cli-1.2.0.tar.gz.
File metadata
- Download URL: mai_cli-1.2.0.tar.gz
- Upload date:
- Size: 22.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f4126ecef45ec64f87e7f88177c4d481e64c28dadd1fca03fb2b8e888490919
|
|
| MD5 |
136fc4175b4168d9235bca8b52145af0
|
|
| BLAKE2b-256 |
2cffe43e05ea7268b6669368aa305ff6372beb4001e05945c419f936f6333004
|
File details
Details for the file mai_cli-1.2.0-py3-none-any.whl.
File metadata
- Download URL: mai_cli-1.2.0-py3-none-any.whl
- Upload date:
- Size: 24.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0575576d8c6e79e30e309427e494cf510307993f9967b1811f9d61232280ea1
|
|
| MD5 |
e42b2088df070be43c684f19f5bd0aa9
|
|
| BLAKE2b-256 |
9c85a3e60e74b12ed34b908298d38ea8726faa006dbfd98c572a025941a20a80
|