@the-agenticflow/openflows 0.1.6 → 0.1.8-dev.236.2151055
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/openflows-dashboard.js +1 -1
- package/bin/openflows-setup.js +1 -1
- package/bin/openflows.js +4 -286
- package/package.json +3 -21
- package/scripts/install.js +59 -209
- package/.env.example +0 -60
- package/README.md +0 -217
- package/bin/LICENSE +0 -21
- package/bin/README.md +0 -535
- package/bin/agentflow-bin +0 -0
- package/bin/agentflow-dashboard-bin +0 -0
- package/bin/agentflow-doctor-bin +0 -0
- package/bin/agentflow-setup-bin +0 -0
- package/bin/orchestration/agent/agents/forge.agent.md +0 -110
- package/bin/orchestration/agent/agents/lore.agent.md +0 -27
- package/bin/orchestration/agent/agents/nexus.agent.md +0 -201
- package/bin/orchestration/agent/agents/sentinel.agent.md +0 -96
- package/bin/orchestration/agent/agents/vessel.agent.md +0 -38
- package/bin/orchestration/agent/registry.json +0 -10
- package/bin/orchestration/agent/standards/CODING.md +0 -22
- package/bin/orchestration/agent/standards/REVIEW.md +0 -15
- package/bin/orchestration/agent/standards/SECURITY.md +0 -72
- package/bin/orchestration/plugin/commands/assign.md +0 -45
- package/bin/orchestration/plugin/commands/check-ci.md +0 -26
- package/bin/orchestration/plugin/commands/document-pr.md +0 -32
- package/bin/orchestration/plugin/commands/gate-approve.md +0 -39
- package/bin/orchestration/plugin/commands/handoff.md +0 -75
- package/bin/orchestration/plugin/commands/merge.md +0 -47
- package/bin/orchestration/plugin/commands/plan.md +0 -66
- package/bin/orchestration/plugin/commands/segment-done.md +0 -50
- package/bin/orchestration/plugin/commands/status-check.md +0 -28
- package/bin/orchestration/plugin/commands/status.md +0 -94
- package/bin/orchestration/plugin/commands/update-changelog.md +0 -37
- package/bin/orchestration/plugin/hooks/forge/post_write_lint.sh +0 -76
- package/bin/orchestration/plugin/hooks/forge/pre_bash_guard.sh +0 -81
- package/bin/orchestration/plugin/hooks/forge/pre_compact_handoff.sh +0 -28
- package/bin/orchestration/plugin/hooks/forge/pre_write_check.sh +0 -77
- package/bin/orchestration/plugin/hooks/forge/session_start.sh +0 -59
- package/bin/orchestration/plugin/hooks/forge/stop_require_artifact.sh +0 -75
- package/bin/orchestration/plugin/hooks/lore/session-start.sh +0 -13
- package/bin/orchestration/plugin/hooks/nexus/init-session.sh +0 -23
- package/bin/orchestration/plugin/hooks/nexus/log-decision.sh +0 -10
- package/bin/orchestration/plugin/hooks/sentinel/post_write_validate.sh +0 -59
- package/bin/orchestration/plugin/hooks/sentinel/pre_bash_readonly_guard.sh +0 -107
- package/bin/orchestration/plugin/hooks/sentinel/session_start.sh +0 -74
- package/bin/orchestration/plugin/hooks/sentinel/stop_require_eval.sh +0 -57
- package/bin/orchestration/plugin/hooks/vessel/log-merge-status.sh +0 -7
- package/bin/orchestration/plugin/hooks/vessel/session-start.sh +0 -14
- package/bin/orchestration/plugin/mcp/mcp.json.template +0 -26
- package/bin/orchestration/plugin/plugin.json +0 -66
- package/bin/orchestration/plugin/skills/forge-algorithmic-art.md +0 -24
- package/bin/orchestration/plugin/skills/forge-canvas-design.md +0 -25
- package/bin/orchestration/plugin/skills/forge-coding.md +0 -161
- package/bin/orchestration/plugin/skills/forge-frontend-design.md +0 -30
- package/bin/orchestration/plugin/skills/forge-mcp-builder.md +0 -37
- package/bin/orchestration/plugin/skills/forge-planning.md +0 -102
- package/bin/orchestration/plugin/skills/forge-skill-creator.md +0 -25
- package/bin/orchestration/plugin/skills/forge-web-artifacts-builder.md +0 -29
- package/bin/orchestration/plugin/skills/lore-brand-guidelines.md +0 -33
- package/bin/orchestration/plugin/skills/lore-changelog.md +0 -69
- package/bin/orchestration/plugin/skills/lore-doc-coauthoring.md +0 -33
- package/bin/orchestration/plugin/skills/lore-documentation.md +0 -57
- package/bin/orchestration/plugin/skills/lore-docx.md +0 -20
- package/bin/orchestration/plugin/skills/lore-pdf.md +0 -20
- package/bin/orchestration/plugin/skills/lore-pptx.md +0 -23
- package/bin/orchestration/plugin/skills/lore-theme-factory.md +0 -20
- package/bin/orchestration/plugin/skills/lore-xlsx.md +0 -20
- package/bin/orchestration/plugin/skills/nexus-doc-coauthoring.md +0 -21
- package/bin/orchestration/plugin/skills/nexus-internal-comms.md +0 -28
- package/bin/orchestration/plugin/skills/nexus-orchestration.md +0 -63
- package/bin/orchestration/plugin/skills/nexus-skill-creator.md +0 -15
- package/bin/orchestration/plugin/skills/nexus-slack-gif-creator.md +0 -21
- package/bin/orchestration/plugin/skills/nexus-triage.md +0 -56
- package/bin/orchestration/plugin/skills/nexus-xlsx.md +0 -20
- package/bin/orchestration/plugin/skills/sentinel-algorithmic-art.md +0 -20
- package/bin/orchestration/plugin/skills/sentinel-criteria.md +0 -115
- package/bin/orchestration/plugin/skills/sentinel-frontend-design.md +0 -20
- package/bin/orchestration/plugin/skills/sentinel-review.md +0 -124
- package/bin/orchestration/plugin/skills/sentinel-web-artifacts-builder.md +0 -20
- package/bin/orchestration/plugin/skills/sentinel-webapp-testing.md +0 -34
- package/bin/orchestration/plugin/skills/shared-claude-api.md +0 -25
- package/bin/orchestration/plugin/skills/vessel-ci-gate.md +0 -68
- package/bin/orchestration/plugin/skills/vessel-internal-comms.md +0 -20
- package/bin/orchestration/plugin/skills/vessel-mcp-builder.md +0 -21
- package/bin/orchestration/plugin/skills/vessel-merge-protocol.md +0 -113
- package/bin/orchestration/plugin/skills/vessel-pdf.md +0 -20
- package/bin/orchestration/plugin/skills/vessel-webapp-testing.md +0 -34
package/bin/README.md
DELETED
|
@@ -1,535 +0,0 @@
|
|
|
1
|
-
# AgentFlow - Autonomous AI Development Team
|
|
2
|
-
|
|
3
|
-
> 🌐 Official site: [openflows.dev](https://openflows.dev)
|
|
4
|
-
|
|
5
|
-
An autonomous software development team composed of AI agents working in a unified Rust/Tokio flow. The team can take GitHub issues and turn them into working code with pull requests - all autonomously.
|
|
6
|
-
|
|
7
|
-

|
|
8
|
-
|
|
9
|
-
## Quick Start
|
|
10
|
-
|
|
11
|
-
### Option 1: One-Line Install (Recommended)
|
|
12
|
-
```bash
|
|
13
|
-
curl -fsSL https://raw.githubusercontent.com/The-AgenticFlow/AgentFlow/main/scripts/install.sh | bash
|
|
14
|
-
```
|
|
15
|
-
This installs all binaries to `~/.local/bin` and offers to run the setup wizard.
|
|
16
|
-
|
|
17
|
-
### Option 2: Homebrew (macOS)
|
|
18
|
-
```bash
|
|
19
|
-
brew tap The-AgenticFlow/openflows
|
|
20
|
-
brew install openflows
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
### Option 3: Docker
|
|
24
|
-
```bash
|
|
25
|
-
docker run -it --rm \
|
|
26
|
-
-v "$HOME/.agentflow:/home/openflows/.agentflow" \
|
|
27
|
-
-v "$(pwd):/workspace" \
|
|
28
|
-
-e ANTHROPIC_API_KEY=your_key \
|
|
29
|
-
-e GITHUB_PERSONAL_ACCESS_TOKEN=your_token \
|
|
30
|
-
ghcr.io/the-agenticflow/openflows:latest setup
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### Option 4: npm (Node.js Package Manager)
|
|
34
|
-
|
|
35
|
-
Install globally via npm for easy updates and cross-platform support:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
# Install the package globally (@the-agenticflow scope)
|
|
39
|
-
npm install -g @the-agenticflow/openflows
|
|
40
|
-
|
|
41
|
-
# Verify installation
|
|
42
|
-
openflows --version
|
|
43
|
-
|
|
44
|
-
# Run the interactive setup wizard
|
|
45
|
-
openflows-setup
|
|
46
|
-
|
|
47
|
-
# Start the autonomous orchestration
|
|
48
|
-
openflows
|
|
49
|
-
|
|
50
|
-
# Monitor with the dashboard (optional, separate terminal)
|
|
51
|
-
openflows-dashboard
|
|
52
|
-
|
|
53
|
-
# Diagnose issues
|
|
54
|
-
openflows-doctor
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**Updating via npm:**
|
|
58
|
-
```bash
|
|
59
|
-
npm update -g @the-agenticflow/openflows
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
**Uninstalling:**
|
|
63
|
-
```bash
|
|
64
|
-
npm uninstall -g @the-agenticflow/openflows
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Note:** The npm package includes platform-specific native binaries as optional dependencies. The correct binary for your platform (Linux x86_64/aarch64, macOS x86_64/Apple Silicon) is automatically downloaded during installation via the `postinstall` script.
|
|
68
|
-
|
|
69
|
-
### Option 5: Build from Source
|
|
70
|
-
```bash
|
|
71
|
-
git clone https://github.com/The-AgenticFlow/AgentFlow.git
|
|
72
|
-
cd AgentFlow
|
|
73
|
-
make release # or: cargo build --release -p openflows
|
|
74
|
-
make install # installs to ~/.local/bin
|
|
75
|
-
openflows-setup # Guided setup wizard
|
|
76
|
-
openflows # Start orchestration
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### Option 6: Cargo Install
|
|
80
|
-
```bash
|
|
81
|
-
cargo install openflows
|
|
82
|
-
openflows-setup
|
|
83
|
-
openflows
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### After Installation
|
|
87
|
-
|
|
88
|
-
#### Standard Commands (All Install Methods)
|
|
89
|
-
|
|
90
|
-
1. **Configure** — Run `openflows-setup` (or `agentflow-setup`) for the guided TUI wizard
|
|
91
|
-
2. **Verify** — Run `openflows-doctor` (or `agentflow-doctor`) to check your environment
|
|
92
|
-
3. **Run** — Run `openflows` (or `agentflow`) to start the autonomous team
|
|
93
|
-
4. **Monitor** — Run `openflows-dashboard` (or `agentflow-dashboard`) for live worker status
|
|
94
|
-
|
|
95
|
-
#### npm-Specific Workflow
|
|
96
|
-
|
|
97
|
-
If you installed via npm, you can also use npx without global installation:
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
# Run setup wizard without installing (uses @the-agenticflow scope)
|
|
101
|
-
npx @the-agenticflow/openflows-setup
|
|
102
|
-
|
|
103
|
-
# Start orchestration directly
|
|
104
|
-
npx @the-agenticflow/openflows
|
|
105
|
-
|
|
106
|
-
# Check status
|
|
107
|
-
npx @the-agenticflow/openflows-doctor
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**Using npx with specific versions:**
|
|
111
|
-
```bash
|
|
112
|
-
# Run a specific version
|
|
113
|
-
npx @the-agenticflow/openflows@0.1.2
|
|
114
|
-
|
|
115
|
-
# Run the latest version
|
|
116
|
-
npx @the-agenticflow/openflows@latest
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
**Package Scripts (if integrating into a Node.js project):**
|
|
120
|
-
|
|
121
|
-
Add to your `package.json`:
|
|
122
|
-
|
|
123
|
-
```json
|
|
124
|
-
{
|
|
125
|
-
"scripts": {
|
|
126
|
-
"agent:setup": "openflows-setup",
|
|
127
|
-
"agent:start": "openflows",
|
|
128
|
-
"agent:doctor": "openflows-doctor",
|
|
129
|
-
"agent:dashboard": "openflows-dashboard"
|
|
130
|
-
},
|
|
131
|
-
"devDependencies": {
|
|
132
|
-
"@the-agenticflow/openflows": "^0.1.2"
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
Or install as a dev dependency:
|
|
138
|
-
```bash
|
|
139
|
-
npm install --save-dev @the-agenticflow/openflows
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Then run:
|
|
143
|
-
```bash
|
|
144
|
-
npm run agent:setup # Configure the system
|
|
145
|
-
npm run agent:start # Start the orchestration
|
|
146
|
-
npm run agent:doctor # Check environment
|
|
147
|
-
npm run agent:dashboard # Monitor workers
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
**Programmatic API (Node.js):**
|
|
151
|
-
|
|
152
|
-
```javascript
|
|
153
|
-
const { spawn } = require('child_process');
|
|
154
|
-
const path = require('path');
|
|
155
|
-
|
|
156
|
-
// Run openflows commands programmatically
|
|
157
|
-
const openflows = spawn('openflows', ['--version'], {
|
|
158
|
-
stdio: 'inherit',
|
|
159
|
-
env: {
|
|
160
|
-
...process.env,
|
|
161
|
-
ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
|
|
162
|
-
GITHUB_PERSONAL_ACCESS_TOKEN: process.env.GITHUB_PERSONAL_ACCESS_TOKEN
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
openflows.on('exit', (code) => {
|
|
167
|
-
console.log(`OpenFlows exited with code ${code}`);
|
|
168
|
-
});
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
## Getting Started
|
|
172
|
-
|
|
173
|
-
### 📖 Complete Tutorial
|
|
174
|
-
**NEW: [TUTORIAL.md](TUTORIAL.md)** - Detailed walkthrough with:
|
|
175
|
-
- ✅ Step-by-step setup from zero
|
|
176
|
-
- ✅ Expected logs and outputs at each step
|
|
177
|
-
- ✅ File structure and locations explained
|
|
178
|
-
- ✅ Troubleshooting common issues
|
|
179
|
-
- ✅ How to inspect generated code and PRs
|
|
180
|
-
|
|
181
|
-
### 🚀 Live Flow Walkthrough
|
|
182
|
-
**[docs/demo.md](docs/demo.md)** - Step-by-step walkthrough of a live orchestration run with:
|
|
183
|
-
- What each log line means as NEXUS discovers issues and assigns work
|
|
184
|
-
- How the FORGE-SENTINEL pair communicates through the shared directory
|
|
185
|
-
- Where to find generated plans, evaluations, and code changes on disk
|
|
186
|
-
- Troubleshooting table for common failures
|
|
187
|
-
|
|
188
|
-
## The Team
|
|
189
|
-
|
|
190
|
-
| Agent | Role | Description |
|
|
191
|
-
|-------|------|-------------|
|
|
192
|
-
| **NEXUS** | Orchestrator | Scrum Master & Tech Lead. Assigns tickets, approves dangerous commands. |
|
|
193
|
-
| **FORGE** | Builder | Senior Engineer. Writes code, tests, opens PRs via Claude Code. |
|
|
194
|
-
| **SENTINEL** | Reviewer | Security auditor. Reviews PRs, ensures all logic is tested. |
|
|
195
|
-
| **VESSEL** | DevOps | Deployment expert. Manages CI/CD and rollbacks. |
|
|
196
|
-
| **LORE** | Writer | Documenter. Writes ADRs, maintains project history. |
|
|
197
|
-
|
|
198
|
-
## Registry System
|
|
199
|
-
|
|
200
|
-
The registry at [`orchestration/agent/registry.json`](orchestration/agent/registry.json) is the **single source of truth** for team membership, worker scaling, and per-agent routing. NEXUS reloads it on every poll cycle, so changes take effect without restarting the orchestration.
|
|
201
|
-
|
|
202
|
-
### Structure
|
|
203
|
-
|
|
204
|
-
```json
|
|
205
|
-
{
|
|
206
|
-
"team": [
|
|
207
|
-
{
|
|
208
|
-
"id": "forge",
|
|
209
|
-
"cli": "claude",
|
|
210
|
-
"active": true,
|
|
211
|
-
"instances": 2,
|
|
212
|
-
"model_backend": "accounts/fireworks/models/glm-5",
|
|
213
|
-
"routing_key": "forge-key",
|
|
214
|
-
"github_token_env": "AGENT_FORGE_GITHUB_TOKEN"
|
|
215
|
-
}
|
|
216
|
-
]
|
|
217
|
-
}
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
### Fields
|
|
221
|
-
|
|
222
|
-
| Field | Type | Description |
|
|
223
|
-
|-------|------|-------------|
|
|
224
|
-
| `id` | string | Agent name. Used in logs, worktree names (`forge-1`, `forge-2`), and branch names. |
|
|
225
|
-
| `cli` | string | CLI tool to spawn. Currently only `"claude"` (Claude Code) is supported. |
|
|
226
|
-
| `active` | bool | When `false`, the agent is excluded from orchestration entirely. |
|
|
227
|
-
| `instances` | int | Number of parallel worker slots. FORGE uses this directly (`forge-1`, `forge-2`, ...). Other agents with `instances > 1` get numbered slots (`vessel-1`, `vessel-2`). Agents with `instances == 1` use their bare ID (`nexus`, `sentinel`). |
|
|
228
|
-
| `model_backend` | string | Model identifier passed to the LLM client. Can be a direct provider path (`anthropic/claude-sonnet-4-5`) or a gateway path (`accounts/fireworks/models/glm-5`). |
|
|
229
|
-
| `routing_key` | string | LiteLLM proxy routing key. When `PROXY_URL` is set, this key is used to route requests to the correct backend model. When unset, the agent falls back to direct API access. |
|
|
230
|
-
| `github_token_env` | string | Environment variable name that holds the GitHub PAT for this agent. Falls back to `GITHUB_PERSONAL_ACCESS_TOKEN` if not set. Enables per-agent token rotation and scoping. |
|
|
231
|
-
|
|
232
|
-
### Worker Slots
|
|
233
|
-
|
|
234
|
-
The registry generates worker slot names that appear throughout the system (worktrees, branches, logs, `STATUS.json`):
|
|
235
|
-
|
|
236
|
-
```json
|
|
237
|
-
{
|
|
238
|
-
"team": [
|
|
239
|
-
{ "id": "nexus", "instances": 1 }, // → slot: "nexus"
|
|
240
|
-
{ "id": "forge", "instances": 2 }, // → slots: "forge-1", "forge-2"
|
|
241
|
-
{ "id": "sentinel", "instances": 1 }, // → slot: "sentinel"
|
|
242
|
-
{ "id": "vessel", "instances": 1 }, // → slot: "vessel"
|
|
243
|
-
{ "id": "lore", "instances": 1 } // → slot: "lore"
|
|
244
|
-
]
|
|
245
|
-
}
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
### Common Operations
|
|
249
|
-
|
|
250
|
-
**Scale FORGE workers** — change `instances` on the forge entry:
|
|
251
|
-
```json
|
|
252
|
-
{ "id": "forge", "instances": 4 } // → forge-1, forge-2, forge-3, forge-4
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
**Disable an agent** — set `active` to `false`:
|
|
256
|
-
```json
|
|
257
|
-
{ "id": "lore", "active": false } // LORE will not be invoked
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
**Rotate a GitHub token** — update the env var referenced by `github_token_env`:
|
|
261
|
-
```bash
|
|
262
|
-
export AGENT_FORGE_GITHUB_TOKEN=ghp_new_token_here
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
**Switch a model backend** — update `model_backend`:
|
|
266
|
-
```json
|
|
267
|
-
{ "id": "forge", "model_backend": "anthropic/claude-sonnet-4-5" }
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
### Per-Agent GitHub Tokens
|
|
271
|
-
|
|
272
|
-
Each agent can use a separate GitHub PAT. This is useful for:
|
|
273
|
-
- **Rate limit isolation** — one agent hitting rate limits doesn't block others
|
|
274
|
-
- **Scope restriction** — give VESSEL only `repo` scope, give FORGE `repo` + `workflow`
|
|
275
|
-
- **Token rotation** — rotate one agent's token without affecting the rest of the team
|
|
276
|
-
|
|
277
|
-
Set the env vars referenced in `github_token_env` before running:
|
|
278
|
-
```bash
|
|
279
|
-
export AGENT_NEXUS_GITHUB_TOKEN=ghp_nexus_token
|
|
280
|
-
export AGENT_FORGE_GITHUB_TOKEN=ghp_forge_token
|
|
281
|
-
export AGENT_SENTINEL_GITHUB_TOKEN=ghp_sentinel_token
|
|
282
|
-
export AGENT_VESSEL_GITHUB_TOKEN=ghp_vessel_token
|
|
283
|
-
export AGENT_LORE_GITHUB_TOKEN=ghp_lore_token
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
If any `github_token_env` variable is unset, the system falls back to `GITHUB_PERSONAL_ACCESS_TOKEN`.
|
|
287
|
-
|
|
288
|
-
## Architecture
|
|
289
|
-
|
|
290
|
-
```
|
|
291
|
-
AgentFlow/
|
|
292
|
-
|-- orchestration/agent/agents/ # Agent personas (nexus.agent.md, forge.agent.md)
|
|
293
|
-
|-- crates/
|
|
294
|
-
| |-- agent-nexus/ # Orchestrator node
|
|
295
|
-
| |-- agent-forge/ # Builder node (spawns Claude Code)
|
|
296
|
-
| |-- agent-client/ # LLM client + MCP integration
|
|
297
|
-
| |-- pair-harness/ # Worktree management, process spawning
|
|
298
|
-
| |-- pocketflow-core/ # Flow engine, shared store, routing
|
|
299
|
-
|
|
|
300
|
-
|-- binary/src/bin/
|
|
301
|
-
|-- agentflow.rs # Main entry point
|
|
302
|
-
|-- demo.rs # Mocked demonstration
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
## How It Works
|
|
306
|
-
|
|
307
|
-
```
|
|
308
|
-
GitHub Issues
|
|
309
|
-
|
|
|
310
|
-
v
|
|
311
|
-
+---------+
|
|
312
|
-
| NEXUS | ← Orchestrator: discovers issues, assigns work
|
|
313
|
-
+---------+
|
|
314
|
-
|
|
|
315
|
-
ACTION_WORK_ASSIGNED
|
|
316
|
-
|
|
|
317
|
-
v
|
|
318
|
-
+--------------------+
|
|
319
|
-
| FORGE-SENTINEL | ← Builder + Reviewer pair
|
|
320
|
-
| PAIR |
|
|
321
|
-
+--------------------+
|
|
322
|
-
| |
|
|
323
|
-
| PLAN.md | CONTRACT.md
|
|
324
|
-
| CODE | segment-N-eval.md
|
|
325
|
-
| STATUS.json | final-review.md
|
|
326
|
-
| |
|
|
327
|
-
v v
|
|
328
|
-
PR Opened CI Checks
|
|
329
|
-
|
|
|
330
|
-
v
|
|
331
|
-
+---------+
|
|
332
|
-
| VESSEL | ← DevOps: polls CI, resolves conflicts, merges
|
|
333
|
-
+---------+
|
|
334
|
-
|
|
|
335
|
-
ACTION_DEPLOYED
|
|
336
|
-
|
|
|
337
|
-
v
|
|
338
|
-
+---------+
|
|
339
|
-
| LORE | ← Writer: ADRs, changelogs, documentation
|
|
340
|
-
+---------+
|
|
341
|
-
|
|
|
342
|
-
ACTION_DOCS_COMPLETE
|
|
343
|
-
|
|
|
344
|
-
v
|
|
345
|
-
+---------+
|
|
346
|
-
| NEXUS | ← Loop: assigns next ticket or halts
|
|
347
|
-
+---------+
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
### The Orchestration Cycle
|
|
351
|
-
|
|
352
|
-
1. **NEXUS** fetches open GitHub issues and assigns them to available FORGE workers
|
|
353
|
-
2. **FORGE** creates an isolated worktree, writes PLAN.md, then implements code via Claude Code
|
|
354
|
-
3. **SENTINEL** reviews the plan (CONTRACT.md), evaluates each code segment, and performs final review
|
|
355
|
-
4. **FORGE** opens a PR once SENTINEL approves
|
|
356
|
-
5. **VESSEL** polls CI status, detects merge conflicts, attempts resolution, and squash-merges green PRs
|
|
357
|
-
6. **LORE** generates documentation: ADRs, changelogs, and project history updates
|
|
358
|
-
7. **NEXUS** loops back to assign the next ticket or halts when no work remains
|
|
359
|
-
|
|
360
|
-
### Shared State
|
|
361
|
-
|
|
362
|
-
All agents communicate through a **SharedStore** (in-memory or Redis):
|
|
363
|
-
|
|
364
|
-
| Key | Purpose |
|
|
365
|
-
|-----|---------|
|
|
366
|
-
| `tickets` | GitHub issues converted to internal work items |
|
|
367
|
-
| `worker_slots` | Available FORGE workers and their status |
|
|
368
|
-
| `pending_prs` | PRs awaiting CI completion |
|
|
369
|
-
|
|
370
|
-
### File Artifacts
|
|
371
|
-
|
|
372
|
-
Each FORGE-SENTINEL pair produces artifacts in two locations:
|
|
373
|
-
|
|
374
|
-
**Shared directory** (`~/.agentflow/workspaces/<repo>/orchestration/pairs/forge-<N>/shared/`):
|
|
375
|
-
|
|
376
|
-
| File | Written By | Purpose |
|
|
377
|
-
|------|-----------|---------|
|
|
378
|
-
| `TICKET.md` | NEXUS | GitHub issue details assigned to this pair |
|
|
379
|
-
| `TASK.md` | NEXUS | Task instructions and acceptance criteria |
|
|
380
|
-
| `PLAN.md` | FORGE | Implementation plan with segment breakdown |
|
|
381
|
-
| `CONTRACT.md` | SENTINEL | Plan review verdict (AGREED or CHANGES_REQUESTED) |
|
|
382
|
-
| `WORKLOG.md` | FORGE | Running log of segment implementation progress |
|
|
383
|
-
| `segment-N-eval.md` | SENTINEL | Evaluation result for segment N (APPROVED / CHANGES_REQUESTED) |
|
|
384
|
-
| `final-review.md` | SENTINEL | Final overall review verdict |
|
|
385
|
-
| `HANDOFF.md` | FORGE | Context reset request when context window is full |
|
|
386
|
-
| `STATUS.json` | FORGE | Terminal status: `PR_OPENED`, `BLOCKED`, or `FUEL_EXHAUSTED` |
|
|
387
|
-
|
|
388
|
-
**Worktree** (`~/.agentflow/workspaces/<repo>/worktrees/forge-<N>/`):
|
|
389
|
-
|
|
390
|
-
```
|
|
391
|
-
worktrees/forge-1/
|
|
392
|
-
├── src/ # Code changes on isolated branch
|
|
393
|
-
├── tests/ # Test files added/modified by FORGE
|
|
394
|
-
├── PLAN.md # Copy of implementation plan
|
|
395
|
-
├── WORKLOG.md # Copy of progress log
|
|
396
|
-
├── CONTRACT.md # Copy of SENTINEL-approved contract
|
|
397
|
-
├── segment-1-eval.md # Copy of segment evaluation
|
|
398
|
-
├── final-review.md # Copy of final review
|
|
399
|
-
└── STATUS.json # Copy of completion status
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
The `STATUS.json` structure:
|
|
403
|
-
|
|
404
|
-
```json
|
|
405
|
-
{
|
|
406
|
-
"status": "PR_OPENED",
|
|
407
|
-
"ticket_id": "T-001",
|
|
408
|
-
"pr_url": "https://github.com/owner/repo/pull/42",
|
|
409
|
-
"pr_number": 42,
|
|
410
|
-
"branch": "forge-1/T-001",
|
|
411
|
-
"files_changed": 5,
|
|
412
|
-
"segments_completed": [
|
|
413
|
-
{"segment": 1, "status": "APPROVED", "eval_file": "segment-1-eval.md"},
|
|
414
|
-
{"segment": 2, "status": "APPROVED", "eval_file": "segment-2-eval.md"}
|
|
415
|
-
],
|
|
416
|
-
"test_results": {"passed": 12, "failed": 0, "skipped": 0},
|
|
417
|
-
"sentinel_approved": true,
|
|
418
|
-
"context_resets": 0
|
|
419
|
-
}
|
|
420
|
-
```
|
|
421
|
-
|
|
422
|
-
## Key Files
|
|
423
|
-
|
|
424
|
-
| File | Purpose |
|
|
425
|
-
|------|---------|
|
|
426
|
-
| [`orchestration/agent/agents/nexus.agent.md`](orchestration/agent/agents/nexus.agent.md) | Orchestrator persona and workflow |
|
|
427
|
-
| [`orchestration/agent/agents/forge.agent.md`](orchestration/agent/agents/forge.agent.md) | Builder persona and instructions |
|
|
428
|
-
| [`orchestration/agent/registry.json`](orchestration/agent/registry.json) | Worker slot definitions |
|
|
429
|
-
| [`binary/src/bin/agentflow.rs`](binary/src/bin/agentflow.rs) | Main entry point |
|
|
430
|
-
| [`crates/agent-forge/src/lib.rs`](crates/agent-forge/src/lib.rs) | Forge node implementation |
|
|
431
|
-
|
|
432
|
-
## Documentation
|
|
433
|
-
|
|
434
|
-
- **[TUTORIAL.md](TUTORIAL.md)** - Complete tutorial with logs, file structure, and troubleshooting
|
|
435
|
-
- **[docs/demo.md](docs/demo.md)** - Live flow walkthrough: logs, file locations, and troubleshooting
|
|
436
|
-
- **[docs/setup-claude-cli.md](docs/setup-claude-cli.md)** - Claude CLI setup and troubleshooting
|
|
437
|
-
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - Development guidelines
|
|
438
|
-
- **[docs/forge-sentinel-arch.md](docs/forge-sentinel-arch.md)** - Architecture details
|
|
439
|
-
|
|
440
|
-
## Per-Agent LLM Routing (LiteLLM Proxy)
|
|
441
|
-
|
|
442
|
-
Each agent has different workload requirements. Instead of routing all agents through the same expensive model, AgentFlow supports per-agent model routing via a **LiteLLM proxy** — each agent uses the most cost-effective model for its task.
|
|
443
|
-
|
|
444
|
-
### Default Model Assignments
|
|
445
|
-
|
|
446
|
-
| Agent | Model | Why |
|
|
447
|
-
|-------|-------|-----|
|
|
448
|
-
| **FORGE** | `anthropic/claude-sonnet-4-5` | Primary coding agent, needs top-tier reasoning |
|
|
449
|
-
| **NEXUS** | `anthropic/claude-sonnet-4-5` | Orchestrator, needs reliable decision-making |
|
|
450
|
-
| **SENTINEL** | `gemini/gemini-2.5-pro` | Code review, strong reasoning at lower cost |
|
|
451
|
-
| **VESSEL** | `groq/llama-3.3-70b-versatile` | CI/CD scripting, fast and cheap (free tier) |
|
|
452
|
-
| **LORE** | `openai/gpt-4o-mini` | Documentation, lightweight task |
|
|
453
|
-
|
|
454
|
-
### How It Works
|
|
455
|
-
|
|
456
|
-
1. Claude Code supports `ANTHROPIC_BASE_URL` and `ANTHROPIC_API_KEY` env vars
|
|
457
|
-
2. A LiteLLM proxy receives all requests and routes based on the API key (routing key)
|
|
458
|
-
3. Each agent is spawned with its own routing key (e.g., `forge-key`, `sentinel-key`)
|
|
459
|
-
4. The proxy maps each routing key to the correct backend model via `litellm_config.yaml`
|
|
460
|
-
5. Fallback is configured — any provider failure falls back to `anthropic/claude-sonnet-4-5`
|
|
461
|
-
|
|
462
|
-
### Environment Variables
|
|
463
|
-
|
|
464
|
-
| Variable | Required | Description |
|
|
465
|
-
|----------|----------|-------------|
|
|
466
|
-
| `PROXY_URL` | Optional | LiteLLM proxy URL. When set, agents route through the proxy. When unset, agents use direct API access. |
|
|
467
|
-
| `PROXY_API_KEY` | Optional | API key for a **hosted** LiteLLM proxy. When set, `ANTHROPIC_API_KEY` is set to this value for auth. When unset, the routing key is used as `ANTHROPIC_API_KEY` (for self-hosted LiteLLM). |
|
|
468
|
-
| `ANTHROPIC_API_KEY` | Required* | Anthropic API key (used by FORGE, NEXUS, and as fallback) |
|
|
469
|
-
| `GEMINI_API_KEY` | Optional | Google Gemini API key (used by SENTINEL via proxy) |
|
|
470
|
-
| `OPENAI_API_KEY` | Optional | OpenAI API key (used by LORE via proxy) |
|
|
471
|
-
| `GROQ_API_KEY` | Optional | Groq API key (used by VESSEL via proxy, free tier available) |
|
|
472
|
-
| `GATEWAY_URL` | Optional | Remote OpenAI-compatible gateway URL. Used by the local Anthropic proxy to forward requests. Required only when the gateway doesn't support Anthropic protocol. |
|
|
473
|
-
| `GATEWAY_API_KEY` | Optional | API key for the remote gateway. Falls back to `PROXY_API_KEY` if unset. |
|
|
474
|
-
|
|
475
|
-
### Self-Hosted LiteLLM (Docker Compose)
|
|
476
|
-
|
|
477
|
-
```bash
|
|
478
|
-
# Start the proxy, Redis, and agent-team
|
|
479
|
-
docker compose up
|
|
480
|
-
|
|
481
|
-
# Or just the proxy for local dev
|
|
482
|
-
docker compose up proxy redis
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
The proxy runs on port 4000 with a health check. See `docker-compose.yml` and `litellm_config.yaml` for configuration.
|
|
486
|
-
|
|
487
|
-
### Hosted LiteLLM (e.g., LiteLLM Cloud)
|
|
488
|
-
|
|
489
|
-
```bash
|
|
490
|
-
# .env
|
|
491
|
-
PROXY_URL=https://your-litellm-instance.example.com
|
|
492
|
-
PROXY_API_KEY=sk-your-hosted-litellm-key
|
|
493
|
-
```
|
|
494
|
-
|
|
495
|
-
When using a hosted proxy, set `PROXY_API_KEY` to your proxy authentication key. The provider API keys (`ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, etc.) are configured on the proxy side, not in the AgentFlow `.env`.
|
|
496
|
-
|
|
497
|
-
### OpenAI-Only Gateways (Local Anthropic Proxy)
|
|
498
|
-
|
|
499
|
-
If your LLM gateway only supports the OpenAI Chat Completions format (`/v1/chat/completions`), Claude CLI will fail because it speaks Anthropic Messages API (`/v1/messages`). AgentFlow includes a local protocol translator:
|
|
500
|
-
|
|
501
|
-
```bash
|
|
502
|
-
# Terminal 1: Start the proxy (reads .env automatically)
|
|
503
|
-
./scripts/start_proxy.sh
|
|
504
|
-
|
|
505
|
-
# Terminal 2: Run orchestration
|
|
506
|
-
cargo run --bin agentflow
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
Configure `.env`:
|
|
510
|
-
```env
|
|
511
|
-
# Claude CLI and Nexus send Anthropic requests to the LOCAL proxy
|
|
512
|
-
PROXY_URL=http://localhost:8080/v1
|
|
513
|
-
PROXY_API_KEY=your-gateway-api-key
|
|
514
|
-
|
|
515
|
-
# The LOCAL proxy forwards OpenAI-format requests to the REMOTE gateway
|
|
516
|
-
GATEWAY_URL=https://api.ai.camer.digital/v1/
|
|
517
|
-
GATEWAY_API_KEY=your-gateway-api-key
|
|
518
|
-
```
|
|
519
|
-
|
|
520
|
-
When your provider adds native Anthropic support, change `PROXY_URL` to point directly to the gateway and remove `GATEWAY_*`.
|
|
521
|
-
|
|
522
|
-
### Disabling Proxy (Direct API Access)
|
|
523
|
-
|
|
524
|
-
If `PROXY_URL` is not set, all agents use direct API access with `ANTHROPIC_API_KEY` — this is the default behavior and requires no proxy setup.
|
|
525
|
-
|
|
526
|
-
## Requirements
|
|
527
|
-
|
|
528
|
-
- Rust 1.70+
|
|
529
|
-
- Node.js 18+ (for GitHub MCP server)
|
|
530
|
-
- **Claude Code CLI** - [Setup Guide](docs/setup-claude-cli.md)
|
|
531
|
-
- API keys: `ANTHROPIC_API_KEY` (required), `GITHUB_PERSONAL_ACCESS_TOKEN` (required), plus optional provider keys for proxy routing (`GEMINI_API_KEY`, `OPENAI_API_KEY`, `GROQ_API_KEY`)
|
|
532
|
-
|
|
533
|
-
## License
|
|
534
|
-
|
|
535
|
-
MIT
|
package/bin/agentflow-bin
DELETED
|
Binary file
|
|
Binary file
|
package/bin/agentflow-doctor-bin
DELETED
|
Binary file
|
package/bin/agentflow-setup-bin
DELETED
|
Binary file
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: forge
|
|
3
|
-
role: builder
|
|
4
|
-
cli: claude
|
|
5
|
-
active: true
|
|
6
|
-
github: forge-bot
|
|
7
|
-
slack: "@forge"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Persona
|
|
11
|
-
|
|
12
|
-
You are **FORGE**, a battle-hardened senior software engineer with fifteen years of shipping production systems. You are pragmatic, opinionated, and allergic to unnecessary complexity. When there are two ways to solve a problem, you always pick the simpler one — unless performance is non-negotiable, in which case you go deep without apology.
|
|
13
|
-
|
|
14
|
-
You think in systems, not files. Before writing a single line of code you understand the data flow, the failure modes, and the edge cases. You write code that is easy to delete, not hard to understand. You do not pad your estimates, you do not write code you haven't thought through, and you do not open a PR you would be embarrassed to explain.
|
|
15
|
-
|
|
16
|
-
You know that untested code is broken code. You treat `STATUS.json` as a contract with the rest of the team — writing it is your handshake, and you never sign off until the tests pass.
|
|
17
|
-
|
|
18
|
-
## Valid STATUS.json Status Values
|
|
19
|
-
|
|
20
|
-
When writing `STATUS.json`, you MUST use one of these exact status strings. Any other value will be treated as `BLOCKED` and waste your work.
|
|
21
|
-
|
|
22
|
-
| Status | When to use |
|
|
23
|
-
|---|---|
|
|
24
|
-
| `PR_OPENED` | Work complete and PR created (include `pr_url`, `pr_number`, `branch`) |
|
|
25
|
-
| `COMPLETE` | All work done but PR creation deferred to harness |
|
|
26
|
-
| `BLOCKED` | Cannot proceed (include `reason` and `blockers`) |
|
|
27
|
-
| `FUEL_EXHAUSTED` | Budget/tokens exhausted |
|
|
28
|
-
| `PENDING_REVIEW` | Work paused, waiting for review |
|
|
29
|
-
| `AWAITING_SENTINEL_REVIEW` | Segment done, waiting for SENTINEL evaluation |
|
|
30
|
-
| `APPROVED_READY` | Changes requested by SENTINEL have been addressed |
|
|
31
|
-
| `SEGMENT_N_DONE` | Segment N complete (e.g. `SEGMENT_1_DONE`) |
|
|
32
|
-
|
|
33
|
-
Do NOT invent status values like `AWAITING_REVIEW`, `REVIEW`, `DONE`, `SUCCESS`, `FINISHED`, `IMPLEMENTATION_COMPLETE`, or any other value. If you are unsure, use `PENDING_REVIEW` (you need review) or `BLOCKED` (you need help).
|
|
34
|
-
|
|
35
|
-
When you're stuck, you say so precisely: what you know, what you don't, and the exact question that unblocks you. You never spin your wheels silently.
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
# Capabilities
|
|
40
|
-
|
|
41
|
-
## Systems & Backend
|
|
42
|
-
- Async Rust (Tokio, Axum, actix-web), Python, TypeScript/Node.js
|
|
43
|
-
- REST API design and implementation, including versioning and deprecation strategy
|
|
44
|
-
- Database schema design, indexing strategy, and migrations (PostgreSQL, SQLite, Redis)
|
|
45
|
-
- gRPC services and Protobuf contract design
|
|
46
|
-
- Event-driven systems and message queue integration (Redis Streams, RabbitMQ, Kafka)
|
|
47
|
-
- Performance tuning: profiling, benchmarking, and memory optimization
|
|
48
|
-
|
|
49
|
-
## Frontend & Integration
|
|
50
|
-
- React and state management patterns (Zustand, Redux, Context API)
|
|
51
|
-
- API contract implementation and client SDK generation (OpenAPI)
|
|
52
|
-
- End-to-end form validation and error handling
|
|
53
|
-
- Integration with third-party services (Stripe, Auth0, Supabase, etc.)
|
|
54
|
-
|
|
55
|
-
## Testing
|
|
56
|
-
- Writing exhaustive unit tests with clear arrange/act/assert structure
|
|
57
|
-
- Integration tests that test code boundaries, not implementation details
|
|
58
|
-
- Test fixtures, factory helpers, and shared mocks
|
|
59
|
-
- Property-based testing for data-heavy logic
|
|
60
|
-
- Running test suites and interpreting coverage reports
|
|
61
|
-
|
|
62
|
-
## Architecture & Tooling
|
|
63
|
-
- Designing simple, evolvable data models
|
|
64
|
-
- Identifying and naming design patterns accurately in context
|
|
65
|
-
- Dependency management and version pinning
|
|
66
|
-
- Debugging production issues from logs and stack traces
|
|
67
|
-
- CI/CD pipeline debugging (failing builds, flaky tests)
|
|
68
|
-
|
|
69
|
-
## Code Quality
|
|
70
|
-
- Refactoring for clarity and testability without changing behaviour
|
|
71
|
-
- Naming variables, functions, and modules with precision
|
|
72
|
-
- Keeping diffs small and reviewable — one logical change per commit
|
|
73
|
-
- Reading and accurately interpreting others' code (including legacy code)
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
# Permissions
|
|
78
|
-
allow: [Read, Write, Bash, Edit, GitPush, MCP_Github]
|
|
79
|
-
deny: [Slack] # Human escalation goes only through NEXUS
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
# Non-negotiables
|
|
84
|
-
|
|
85
|
-
1. **Read the standards before coding.** Check `orchestration/agent/standards/CODING.md` at the start of every new ticket. Internalize it — don't just acknowledge it.
|
|
86
|
-
2. **Tests pass before STATUS.json is written.** Run `orchestration/agent/tooling/run-tests.sh`. If it fails, fix it or set `status=BLOCKED`. Never cheat this step.
|
|
87
|
-
3. **Propose dangerous commands.** Any shell command that deletes files, modifies permissions system-wide, or pushes with force must be proposed to NEXUS via the CommandGate before execution.
|
|
88
|
-
4. **No hallucinated context.** If the ticket is unclear, or you need a file not available in your scoped codebase, set `status=BLOCKED` with a specific, answerable question. Never invent requirements.
|
|
89
|
-
5. **One ticket, one branch, one PR.** Branch naming: `forge-{worker-id}/{ticket-id}`. Push via GitHub MCP. Do not open multiple PRs for one ticket.
|
|
90
|
-
6. **Never touch another worker's files.** Your working directory is your domain. You have no knowledge of what forge-2 (or any other slot) is doing.
|
|
91
|
-
7. **Commit messages tell a story.** Use conventional commit format: `feat(scope): what and why`, not `fix stuff`.
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
# Escalation Protocol
|
|
96
|
-
|
|
97
|
-
When you are blocked, write a `STATUS.json` with:
|
|
98
|
-
```json
|
|
99
|
-
{
|
|
100
|
-
"outcome": "blocked",
|
|
101
|
-
"blocker": {
|
|
102
|
-
"kind": "AmbiguousRequirement | DependencyNotMerged | FileLockConflict | Other",
|
|
103
|
-
"description": "Exact, specific description of what you need",
|
|
104
|
-
"files_written": ["src/..."],
|
|
105
|
-
"question_for_human": "Optional — only if NEXUS cannot resolve auto"
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Do not guess. Do not work around ambiguity with assumptions. Blocked and specific is infinitely better than shipped and wrong.
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: lore
|
|
3
|
-
role: documenter
|
|
4
|
-
cli: claude
|
|
5
|
-
active: true
|
|
6
|
-
github: lore-bot
|
|
7
|
-
slack: "@lore"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Persona
|
|
11
|
-
You are LORE, a patient and precise technical writer. You preserve the institutional memory of the team. Your goal is to ensure that every decision is documented and that the project's history is clear and accurate.
|
|
12
|
-
|
|
13
|
-
# Capabilities
|
|
14
|
-
- Technical documentation writing (ADRs, READMEs, Wiki)
|
|
15
|
-
- Changelog automation and sprint retrospective generation
|
|
16
|
-
- Documentation-as-code management
|
|
17
|
-
- Contextual memory retrieval from SharedStore history
|
|
18
|
-
|
|
19
|
-
# Permissions
|
|
20
|
-
allow: [Read, Write, Bash, DocCommit]
|
|
21
|
-
deny: [EditAppCode, EditInfraCode, Slack] # LORE only writes docs/
|
|
22
|
-
|
|
23
|
-
# Non-negotiables
|
|
24
|
-
- Write an ADR for every architectural decision recorded in the SharedStore.
|
|
25
|
-
- Update `CHANGELOG.md` for every successful deployment.
|
|
26
|
-
- Read SharedStore sprint history to ensure retrospectives are contextually accurate.
|
|
27
|
-
- Maintain a high bar for documentation clarity and formatting.
|