Complete implementation of a plugin-based code standards checker. Core Framework: - CheckResult/CheckItem/Severity data models - Three-source plugin discovery (builtin, entry_points, local) - Config system (.seedgo/config.json) with profiles and overrides - Severity-weighted scoring (errors block, warnings degrade, info reports) CLI: - seedgo init — create project config - seedgo check — run all enabled plugins - seedgo list — show available plugins - Three output formats: human, json, github (CI annotations) 5 Starter Plugins: - no-bare-except, type-hints-required, docstring-coverage - function-length (no linter equivalent) - file-structure (no linter equivalent) 354 tests, all passing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
224 lines
5.9 KiB
Markdown
224 lines
5.9 KiB
Markdown
# AIPass Framework
|
|
|
|
<!--  -->
|
|
|
|
Orchestration framework for autonomous AI agent ecosystems.
|
|
|
|
## What is this?
|
|
|
|
AIPass provides routing, workflow management, inter-agent messaging, and monitoring for autonomous AI agent ecosystems. It coordinates multiple agents working together across branches, plans, and tasks. [Trinity Pattern](https://github.com/AIOSAI/Trinity-Pattern) serves as the memory layer.
|
|
|
|
## Install
|
|
|
|
```bash
|
|
pip install aipass
|
|
```
|
|
|
|
> **Note:** This package is not yet published to PyPI. This repo is in early development.
|
|
|
|
## Features
|
|
|
|
### Routing & Discovery (v1.0)
|
|
|
|
Symbolic addressing for multi-agent systems. Instead of hard-coded paths, agents use `@branch` symbolic names that resolve to actual locations at runtime.
|
|
|
|
**Quick Start:**
|
|
|
|
```python
|
|
from aipass.routing import initialize_registry, register_branch, resolve_branch
|
|
|
|
# Initialize registry (first time only)
|
|
initialize_registry()
|
|
|
|
# Register your agents
|
|
register_branch("my_agent", "/path/to/agents/my_agent", branch_type="agent")
|
|
register_branch("researcher", "/path/to/agents/researcher", branch_type="agent")
|
|
register_branch("monitor", "/path/to/services/monitor", branch_type="service")
|
|
|
|
# Resolve symbolic names to paths
|
|
agent_path = resolve_branch("@my_agent")
|
|
# Returns: "/path/to/agents/my_agent"
|
|
|
|
# Works with or without @ prefix
|
|
researcher_path = resolve_branch("researcher")
|
|
# Returns: "/path/to/agents/researcher"
|
|
```
|
|
|
|
**Discovery:**
|
|
|
|
```python
|
|
from aipass.routing import list_branches, branch_exists, get_branch_info
|
|
|
|
# Check if a branch exists
|
|
if branch_exists("@my_agent"):
|
|
print("Agent found!")
|
|
|
|
# List all registered branches
|
|
all_branches = list_branches()
|
|
# Returns: ["@my_agent", "@researcher", "@monitor"]
|
|
|
|
# List branches by type
|
|
agents_only = list_branches(branch_type="agent")
|
|
# Returns: ["@my_agent", "@researcher"]
|
|
|
|
# Get full branch metadata
|
|
info = get_branch_info("@my_agent")
|
|
# Returns: {
|
|
# "name": "my_agent",
|
|
# "path": "/path/to/agents/my_agent",
|
|
# "type": "agent",
|
|
# "status": "active",
|
|
# "created": "2026-03-01T10:00:00Z"
|
|
# }
|
|
```
|
|
|
|
**Configuration:**
|
|
|
|
By default, the registry is stored at `~/.aipass/BRANCH_REGISTRY.json`. You can customize this:
|
|
|
|
```python
|
|
from aipass.routing import set_registry_path
|
|
|
|
# Set custom registry location
|
|
set_registry_path("/custom/path/to/registry.json")
|
|
```
|
|
|
|
Or via environment variable:
|
|
|
|
```bash
|
|
export AIPASS_REGISTRY_PATH=/custom/path/to/registry.json
|
|
```
|
|
|
|
**Integration with Trinity Pattern:**
|
|
|
|
```python
|
|
from trinity_pattern import Agent
|
|
from aipass.routing import resolve_branch
|
|
|
|
# Before: hard-coded paths
|
|
agent = Agent(directory="/home/user/agents/my_agent")
|
|
|
|
# After: symbolic addressing
|
|
agent_dir = resolve_branch("@my_agent")
|
|
agent = Agent(directory=agent_dir)
|
|
```
|
|
|
|
**Error Handling:**
|
|
|
|
```python
|
|
from aipass.routing import resolve_branch, BranchNotFoundError
|
|
|
|
try:
|
|
path = resolve_branch("@nonexistent")
|
|
except BranchNotFoundError as e:
|
|
print(f"Branch not found: {e}")
|
|
```
|
|
|
|
## Seed Go
|
|
|
|
> Linters enforce language rules. Seed Go enforces yours.
|
|
|
|
A portable, plugin-based code standards checker. Define your team's conventions
|
|
as simple Python functions — function length limits, docstring coverage, file
|
|
structure rules — and run them like any other linter. Zero external dependencies.
|
|
No API keys. Deterministic results.
|
|
|
|
### Quick Start
|
|
|
|
```bash
|
|
# Install
|
|
pip install aipass[seedgo]
|
|
|
|
# Initialize config in your project
|
|
seedgo init
|
|
|
|
# Run all enabled plugins
|
|
seedgo check
|
|
|
|
# List available plugins
|
|
seedgo list
|
|
```
|
|
|
|
### Write a Plugin in 60 Seconds
|
|
|
|
```python
|
|
# .seedgo/plugins/my_plugin.py
|
|
import re
|
|
from seedgo import CheckResult, CheckItem, Severity
|
|
|
|
PLUGIN_NAME = "no-bare-except"
|
|
PLUGIN_DESCRIPTION = "Flag bare except: clauses."
|
|
FILE_TYPES = ["*.py"]
|
|
|
|
_BARE_EXCEPT = re.compile(r"^\s*except\s*:\s*(#.*)?$")
|
|
|
|
def check(file_path: str, config: dict | None = None) -> CheckResult:
|
|
lines = open(file_path).readlines()
|
|
violations = [
|
|
CheckItem(
|
|
name="bare-except",
|
|
passed=False,
|
|
message=f"Bare except: at line {i+1}",
|
|
severity=Severity.WARNING,
|
|
line=i + 1,
|
|
fix_hint="Use `except Exception:` instead.",
|
|
)
|
|
for i, line in enumerate(lines)
|
|
if _BARE_EXCEPT.match(line)
|
|
]
|
|
return CheckResult(
|
|
plugin=PLUGIN_NAME,
|
|
passed=not violations,
|
|
checks=violations or [CheckItem(name="bare-except", passed=True,
|
|
message="No bare excepts found.",
|
|
severity=Severity.WARNING)],
|
|
file_path=file_path,
|
|
)
|
|
```
|
|
|
|
### Starter Plugins (5 Built-in)
|
|
|
|
| Plugin | What it checks | Linter equivalent? |
|
|
|---|---|---|
|
|
| `no-bare-except` | Bare `except:` clauses | ruff E722 (but with fix hints) |
|
|
| `type-hints-required` | Missing type annotations | mypy (but project-configurable) |
|
|
| `docstring-coverage` | Missing module/function docstrings | pydocstyle (but simpler) |
|
|
| `function-length` | Functions exceeding N lines | **No linter equivalent** |
|
|
| `file-structure` | Forbidden files in root/dirs | **No linter equivalent** |
|
|
|
|
Two of the five check things no standard linter can enforce.
|
|
|
|
### vs. Pre-Commit
|
|
|
|
Seed Go is complementary to pre-commit, not a replacement. Run it as a hook:
|
|
|
|
```yaml
|
|
# .pre-commit-config.yaml
|
|
- repo: local
|
|
hooks:
|
|
- id: seedgo
|
|
name: Seed Go standards check
|
|
entry: seedgo check
|
|
language: system
|
|
pass_filenames: false
|
|
```
|
|
|
|
Or standalone in CI:
|
|
|
|
```bash
|
|
seedgo check --format github # GitHub Actions annotations
|
|
seedgo check --format json # machine-readable output
|
|
```
|
|
|
|
### Honest About What It Is
|
|
|
|
- Deterministic checks — same input always produces same output
|
|
- No AI in the validation loop — no API keys, no network calls
|
|
- Plugin contract is stable: `check(file_path, config) -> CheckResult`
|
|
- Scores are weighted: errors block (weight 1.0), warnings degrade (0.5),
|
|
info is reported only (0.0). Threshold is configurable (default: 75/100).
|
|
|
|
## License
|
|
|
|
MIT
|