Files
AIPass/src/aipass/drone/README.md
T
AIPassand@devpulse e42f4ddeaf feat(system): feat(system): S82: all branch audit fixes + prax 100% + drone backup removed + seedgo --help + ai_mail cascade fix + memory rollover + spawn template_owners + flow fixes + Medic investigation (#210)
* feat(system): feat(system): S82: core 10 cleanup — AGENTS/GEMINI prompts, STATUS.local, sandbox + vision docs, branch fixes

Co-Authored-By: @devpulse <devpulse@aipass>

* feat(system): feat(system): S82: all branch audit fixes + prax 100% + drone backup removed + seedgo --help + ai_mail cascade fix + memory rollover + spawn template_owners + flow fixes + Medic investigation

Co-Authored-By: @devpulse <devpulse@aipass>

---------

Co-authored-by: @devpulse <devpulse@aipass>
2026-04-09 21:57:57 -07:00

6.8 KiB

← Back to AIPass

Drone

Purpose: Command router and symbolic addressing for AIPass. Resolves @branch names to paths at runtime via AIPASS_REGISTRY.json, routes commands to module entry points, and discovers available commands across the system. Module: aipass.drone Created: 2026-03-05


Overview

What I Do

  • Resolve @branch symbolic names to absolute paths via AIPASS_REGISTRY.json
  • Route commands to registered branches and internal modules
  • Discover available commands across the system
  • Provide drone systems introspection of all registered components

Commands / Usage

Drone provides a CLI for terminal use and a Python API for programmatic access.

CLI

drone systems                    # List all registered modules and branches
drone @seedgo audit aipass       # Route "audit aipass" to seedgo
drone @module --help             # Show help for any module
drone @git pr "description"      # Create a PR from current branch
drone @git status                # Git status scoped to branch directory
drone @git sync                  # Pull latest main with --rebase
drone @git lock / unlock         # Atomic branch lockfile
drone @git system-pr "desc"      # System-wide PR (devpulse only)
drone @git merge <PR#>           # Squash-merge a PR
drone @git smart-sync            # Fetch + detect divergence + rebase
drone @git fix                   # Auto-fix stuck rebase / detached HEAD
drone scan @branch               # Discover available commands in a branch
drone activate @branch           # Scan + register all commands from a branch
drone list                       # List registered custom command shortcuts
drone remove <name>              # Remove a custom command shortcut
drone --version                  # Show version
drone --help                     # Show usage information

Python API

from aipass.drone import resolve_branch, list_branches, route_command

# Resolve @name to absolute path
path = resolve_branch("@seedgo")

# List all registered branches
branches = list_branches()               # All branches
active = list_branches(status="active")  # Filter by status

# Route a command to a branch
result = route_command("@seedgo", "verify")
print(result.stdout)      # Command output
print(result.exit_code)   # 0 on success

Registry Management

from aipass.drone import set_registry_path, get_registry_path

# Use a custom registry location
set_registry_path("/path/to/AIPASS_REGISTRY.json")

# Or set via environment variable
# export AIPASS_REGISTRY_PATH=/path/to/registry.json

Error Handling

from aipass.drone import resolve_branch, BranchNotFoundError, CommandExecutionError

try:
    path = resolve_branch("@nonexistent")
except BranchNotFoundError:
    print("Branch not found in registry")

try:
    result = route_command("@seedgo", "audit", args=["aipass"], timeout=120)
except CommandExecutionError as e:
    print(f"Command failed: {e}")

Architecture

drone/
├── cli.py                 # pip entry point (drone command)
├── __init__.py            # Public API exports
├── apps/
│   ├── drone.py           # Core entry point
│   ├── modules/           # Business logic
│   │   ├── config.py      # Registry path resolution
│   │   ├── resolver.py    # Branch resolution (@name -> path)
│   │   ├── router.py      # Command routing via subprocess
│   │   ├── discovery.py   # Module and command discovery
│   │   ├── module_registry.py  # Internal module routing
│   │   ├── commands.py    # Custom command shortcut orchestrator
│   │   ├── git_module.py  # Git workflow (PR, status, sync, lock)
│   │   └── scan.py        # Branch command scanning
│   ├── handlers/          # Implementation
│   │   ├── executor.py    # Safe subprocess execution
│   │   ├── exceptions.py  # Exception hierarchy
│   │   ├── generic_adapter.py   # Centralized capture for external modules
│   │   ├── routing_config.json  # External module routing declarations
│   │   ├── json/          # Three-JSON Pattern handler
│   │   ├── scanning/      # Scan result formatting + discovery
│   │   ├── command_registry/  # Command shortcut CRUD + lookup
│   │   └── git/           # Git workflow handlers
│   │       ├── lock_handler.py    # Atomic lockfile (O_CREAT|O_EXCL)
│   │       ├── pr_handler.py      # 10-step PR workflow
│   │       ├── status_handler.py  # Scoped git status
│   │       └── sync_handler.py    # Safe main sync
│   └── plugins/           # Extensions beyond core routing
│       └── devpulse_ops/  # System-wide PR, merge, smart-sync, fix
├── docs/                  # Documentation
└── tests/                 # 513 tests, 19 test files

Interactive Commands

By default, drone captures subprocess output (capture_output=True) with a 30s timeout. This is safe for AI-to-AI routing but strips Rich colors, buffers progress bars, and kills long-running commands.

Commands in the interactive tuple bypass capture and inherit the terminal directly — enabling live Rich output, colors, and no timeout. Only add commands here when the user needs full terminal experience.

Per-command allowlist (in apps/drone.py):

Command Reason
monitor Prax real-time monitoring (live TUI)
audit Seedgo audit (Rich progress bars)

Per-branch allowlist — all commands from these branches get interactive mode:

Branch Reason
cli User-facing CLI with Rich formatted output

To add: edit interactive_commands or interactive_branches in _handle_target() in apps/drone.py.


Integration Points

Depends On

  • AIPASS_REGISTRY.json — Branch registry at repo root (read for resolution)
  • Python stdlib (pathlib, sys, subprocess, json)

Provides To

  • All modules — command routing via drone @target command
  • All modules — branch/module discovery via drone systems
  • aipass.seedgo — routed via drone @seedgo
  • aipass.spawn — routed via drone @spawn

External Project Support

Infrastructure modules (seedgo, cli, git) work from external AIPass projects without per-project registration. When subprocess routing fails (branch not in local registry), drone falls back to module routing automatically. Graceful degradation: Rich output from AIPass, functional output from external projects.


Last Updated: 2026-04-07


← Back to AIPass