agent-forge-installer 0.1.0__tar.gz
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.
- agent_forge_installer-0.1.0/PKG-INFO +305 -0
- agent_forge_installer-0.1.0/README.md +273 -0
- agent_forge_installer-0.1.0/pyproject.toml +54 -0
- agent_forge_installer-0.1.0/setup.cfg +4 -0
- agent_forge_installer-0.1.0/src/agent_forge_installer.egg-info/PKG-INFO +305 -0
- agent_forge_installer-0.1.0/src/agent_forge_installer.egg-info/SOURCES.txt +32 -0
- agent_forge_installer-0.1.0/src/agent_forge_installer.egg-info/dependency_links.txt +1 -0
- agent_forge_installer-0.1.0/src/agent_forge_installer.egg-info/entry_points.txt +2 -0
- agent_forge_installer-0.1.0/src/agent_forge_installer.egg-info/requires.txt +14 -0
- agent_forge_installer-0.1.0/src/agent_forge_installer.egg-info/top_level.txt +1 -0
- agent_forge_installer-0.1.0/src/agentforge/__init__.py +1 -0
- agent_forge_installer-0.1.0/src/agentforge/__main__.py +6 -0
- agent_forge_installer-0.1.0/src/agentforge/claude_runner.py +158 -0
- agent_forge_installer-0.1.0/src/agentforge/cli/__init__.py +266 -0
- agent_forge_installer-0.1.0/src/agentforge/cli/agent.py +202 -0
- agent_forge_installer-0.1.0/src/agentforge/cli/init.py +165 -0
- agent_forge_installer-0.1.0/src/agentforge/cli/service.py +144 -0
- agent_forge_installer-0.1.0/src/agentforge/cli/sync.py +168 -0
- agent_forge_installer-0.1.0/src/agentforge/cli/update.py +242 -0
- agent_forge_installer-0.1.0/src/agentforge/config.py +125 -0
- agent_forge_installer-0.1.0/src/agentforge/http_client.py +55 -0
- agent_forge_installer-0.1.0/src/agentforge/memory_manager.py +157 -0
- agent_forge_installer-0.1.0/src/agentforge/message_router.py +80 -0
- agent_forge_installer-0.1.0/src/agentforge/migrations/0001_version_tracking.py +25 -0
- agent_forge_installer-0.1.0/src/agentforge/migrations/__init__.py +157 -0
- agent_forge_installer-0.1.0/src/agentforge/telegram_adapter.py +727 -0
- agent_forge_installer-0.1.0/src/agentforge/updater.py +363 -0
- agent_forge_installer-0.1.0/src/agentforge/vault.py +440 -0
- agent_forge_installer-0.1.0/src/agentforge/voice.py +55 -0
- agent_forge_installer-0.1.0/tests/test_config.py +100 -0
- agent_forge_installer-0.1.0/tests/test_memory_manager.py +96 -0
- agent_forge_installer-0.1.0/tests/test_message_router.py +118 -0
- agent_forge_installer-0.1.0/tests/test_migrations.py +122 -0
- agent_forge_installer-0.1.0/tests/test_vault.py +162 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agent-forge-installer
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: AgentForge — multi-agent Telegram bot framework powered by Claude Code
|
|
5
|
+
Author: Martin Rancourt
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Martin-Rancourt/agentforge
|
|
8
|
+
Project-URL: Repository, https://github.com/Martin-Rancourt/agentforge
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/Martin-Rancourt/agentforge/issues
|
|
10
|
+
Keywords: telegram,bot,ai,claude,multi-agent,framework
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: Communications :: Chat
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
Provides-Extra: http
|
|
23
|
+
Requires-Dist: requests>=2.28; extra == "http"
|
|
24
|
+
Provides-Extra: voice
|
|
25
|
+
Requires-Dist: faster-whisper>=1.0; extra == "voice"
|
|
26
|
+
Provides-Extra: full
|
|
27
|
+
Requires-Dist: requests>=2.28; extra == "full"
|
|
28
|
+
Requires-Dist: faster-whisper>=1.0; extra == "full"
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
32
|
+
|
|
33
|
+
# AgentForge
|
|
34
|
+
|
|
35
|
+
A reusable framework for building multi-agent Telegram bots powered by Claude AI.
|
|
36
|
+
|
|
37
|
+
**Zero dependencies** by default — runs on Python 3.10+ stdlib. Optional extras for voice transcription and faster HTTP.
|
|
38
|
+
|
|
39
|
+
## Quick Start
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Clone and install
|
|
43
|
+
git clone https://github.com/Martin-Rancourt/AgentForge.git
|
|
44
|
+
cd AgentForge
|
|
45
|
+
./install.sh
|
|
46
|
+
|
|
47
|
+
# Configure
|
|
48
|
+
nano .env # Add your Telegram bot token
|
|
49
|
+
nano bot/config.json # Add your chat IDs
|
|
50
|
+
|
|
51
|
+
# Create agents
|
|
52
|
+
agentforge agent create assistant --model sonnet --thread-id 11
|
|
53
|
+
agentforge agent create researcher --model opus --thread-id 12
|
|
54
|
+
|
|
55
|
+
# Run
|
|
56
|
+
agentforge bot
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## How It Works
|
|
60
|
+
|
|
61
|
+
AgentForge turns a **Telegram Supergroup with Forum Topics** into a multi-agent workspace. Each topic routes to a different Claude-powered agent with its own identity, model, and memory.
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
Telegram Topic (thread_id: 12)
|
|
65
|
+
→ telegram_adapter.py (long-polling)
|
|
66
|
+
→ message_router.py (resolve agent config)
|
|
67
|
+
→ claude_runner.py (invoke Claude CLI with agent's soul.md)
|
|
68
|
+
→ Response sent back to Telegram
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Message Flow
|
|
72
|
+
|
|
73
|
+
1. Bot polls Telegram for new messages
|
|
74
|
+
2. `message_thread_id` determines which agent handles the message
|
|
75
|
+
3. Conversation history is loaded from SQLite (configurable context window)
|
|
76
|
+
4. Claude Code CLI is invoked with the agent's `soul.md` as system prompt
|
|
77
|
+
5. Response is stored in SQLite and sent back to Telegram
|
|
78
|
+
|
|
79
|
+
## Architecture
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
agentforge/
|
|
83
|
+
├── src/agentforge/
|
|
84
|
+
│ ├── telegram_adapter.py # Main bot — polling, routing, sending
|
|
85
|
+
│ ├── claude_runner.py # Claude Code CLI subprocess wrapper
|
|
86
|
+
│ ├── message_router.py # Thread → agent config resolution
|
|
87
|
+
│ ├── config.py # Typed config loader (dataclasses)
|
|
88
|
+
│ ├── memory_manager.py # SQLite + FTS5 conversation database
|
|
89
|
+
│ ├── vault.py # Structured memory store (per-agent)
|
|
90
|
+
│ ├── voice.py # Voice note transcription (optional)
|
|
91
|
+
│ ├── http_client.py # Dual-stack: requests or urllib
|
|
92
|
+
│ └── cli/ # CLI commands (bot, agent, memory, init, vault)
|
|
93
|
+
├── scripts/ # Bash utilities
|
|
94
|
+
│ ├── telegram_send.sh # Send messages to topics (with dedup)
|
|
95
|
+
│ ├── heartbeat.sh # Proactive task runner (cron)
|
|
96
|
+
│ ├── healthcheck.sh # Daily system health check
|
|
97
|
+
│ ├── agent_task.sh # Cross-agent task delegation
|
|
98
|
+
│ ├── log_action.sh # Action logging (Google Sheets + local)
|
|
99
|
+
│ └── memory_consolidation.sh # Weekly memory merge
|
|
100
|
+
├── tests/ # Pytest suite (49 tests)
|
|
101
|
+
├── install.sh # One-liner bootstrap
|
|
102
|
+
└── pyproject.toml # Package metadata
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## CLI Reference
|
|
106
|
+
|
|
107
|
+
### `agentforge bot`
|
|
108
|
+
|
|
109
|
+
Start the Telegram bot.
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
agentforge bot [--config path/to/config.json]
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### `agentforge agent`
|
|
116
|
+
|
|
117
|
+
Manage agents declaratively.
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# Create — scaffolds soul.md, memory.md, daily/ directory
|
|
121
|
+
agentforge agent create <name> --model <model> --thread-id <id>
|
|
122
|
+
|
|
123
|
+
# List all configured agents
|
|
124
|
+
agentforge agent list
|
|
125
|
+
|
|
126
|
+
# Remove an agent (--keep-files to preserve files on disk)
|
|
127
|
+
agentforge agent remove <name> [--keep-files]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Models:** `sonnet` (fast, balanced), `opus` (strongest reasoning), `haiku` (fastest, cheapest)
|
|
131
|
+
|
|
132
|
+
### `agentforge memory`
|
|
133
|
+
|
|
134
|
+
Query the conversation database.
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
agentforge memory search "deployment error" # Full-text search (FTS5)
|
|
138
|
+
agentforge memory recent 50 # Last 50 messages
|
|
139
|
+
agentforge memory stats # Database statistics
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### `agentforge vault`
|
|
143
|
+
|
|
144
|
+
Structured memory store — facts, preferences, and knowledge per agent.
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
agentforge vault write --agent victor --category knowledge --title "API design" --content "..."
|
|
148
|
+
agentforge vault search "deployment"
|
|
149
|
+
agentforge vault list --agent archie
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### `agentforge init`
|
|
153
|
+
|
|
154
|
+
Bootstrap a new instance from scratch.
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
agentforge init [--dir /path/to/instance]
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Creates: `bot/`, `agents/`, `data/`, `logs/`, `memory/`, `skills/`, `config.json`, `.env`
|
|
161
|
+
|
|
162
|
+
## Configuration
|
|
163
|
+
|
|
164
|
+
### `bot/config.json`
|
|
165
|
+
|
|
166
|
+
```jsonc
|
|
167
|
+
{
|
|
168
|
+
"telegram": {
|
|
169
|
+
"token_env_var": "AGENTFORGE_TELEGRAM_TOKEN", // env var name holding the token
|
|
170
|
+
"allowed_chat_ids": [123456789], // whitelist
|
|
171
|
+
"group_chat_id": -100123456789, // supergroup ID
|
|
172
|
+
"topics": { // named topic shortcuts
|
|
173
|
+
"general": 11,
|
|
174
|
+
"dev": 12
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"claude": {
|
|
178
|
+
"model": "sonnet", // default model
|
|
179
|
+
"max_budget_usd": 1.0 // per-invocation spend cap
|
|
180
|
+
},
|
|
181
|
+
"memory": {
|
|
182
|
+
"context_messages": 10 // messages included as context
|
|
183
|
+
},
|
|
184
|
+
"threads": {
|
|
185
|
+
"11": { "name": "assistant", "model": "sonnet", "context_messages": 10 },
|
|
186
|
+
"12": { "name": "researcher", "model": "opus", "context_messages": 15 }
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### `.env`
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
AGENTFORGE_TELEGRAM_TOKEN=your_bot_token_here
|
|
195
|
+
AGENTFORGE_ROOT=/path/to/instance # defaults to /home/clawdia
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Multi-Agent System
|
|
199
|
+
|
|
200
|
+
Each agent gets its own identity via a `soul.md` file:
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
agents/
|
|
204
|
+
├── victor/
|
|
205
|
+
│ ├── soul.md # Personality, role, instructions
|
|
206
|
+
│ ├── memory.md # Long-term consolidated memory
|
|
207
|
+
│ └── daily/ # Daily learnings (YYYY-MM-DD.md)
|
|
208
|
+
├── archie/
|
|
209
|
+
└── catherine/
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
The `soul.md` is passed as `--system-prompt` to Claude, completely overriding the default identity. Agents can:
|
|
213
|
+
|
|
214
|
+
- Have different Claude models (opus for complex reasoning, haiku for quick tasks)
|
|
215
|
+
- Maintain separate conversation histories and context windows
|
|
216
|
+
- Store per-agent structured memory in the vault
|
|
217
|
+
- Delegate tasks to each other via `agent_task.sh`
|
|
218
|
+
|
|
219
|
+
### Project Topics
|
|
220
|
+
|
|
221
|
+
Beyond agent topics, you can configure **project topics** where multiple agents collaborate:
|
|
222
|
+
|
|
223
|
+
```json
|
|
224
|
+
"project_topics": {
|
|
225
|
+
"42": {
|
|
226
|
+
"label": "🏗 Dev",
|
|
227
|
+
"agents": ["victor", "archie"],
|
|
228
|
+
"default_agent": "victor"
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Use `@agentname` mentions to address a specific agent in a shared topic.
|
|
234
|
+
|
|
235
|
+
## Scripts
|
|
236
|
+
|
|
237
|
+
| Script | Purpose | Trigger |
|
|
238
|
+
|--------|---------|---------|
|
|
239
|
+
| `telegram_send.sh` | Send messages to topics | Manual / cross-agent |
|
|
240
|
+
| `heartbeat.sh` | Run proactive tasks from `heartbeat.md` | Cron |
|
|
241
|
+
| `healthcheck.sh` | System health report | Cron (daily) |
|
|
242
|
+
| `agent_task.sh` | Delegate tasks between agents | Inter-agent |
|
|
243
|
+
| `log_action.sh` | Log external actions to Sheets + file | After side-effects |
|
|
244
|
+
| `memory_consolidation.sh` | Merge daily logs → `memory.md` | Cron (weekly) |
|
|
245
|
+
|
|
246
|
+
### Dedup
|
|
247
|
+
|
|
248
|
+
`telegram_send.sh` has built-in deduplication: identical messages to the same topic within 60 seconds are silently dropped.
|
|
249
|
+
|
|
250
|
+
## Memory System
|
|
251
|
+
|
|
252
|
+
AgentForge provides three layers of memory:
|
|
253
|
+
|
|
254
|
+
| Layer | Storage | Purpose |
|
|
255
|
+
|-------|---------|---------|
|
|
256
|
+
| **Conversations** | SQLite + FTS5 | Full message history, searchable |
|
|
257
|
+
| **Vault** | SQLite + FTS5 | Structured facts/preferences per agent |
|
|
258
|
+
| **Files** | Markdown | `soul.md` (identity), `memory.md` (long-term), `daily/` (learnings) |
|
|
259
|
+
|
|
260
|
+
The weekly `memory_consolidation.sh` script merges daily learnings into each agent's `memory.md`.
|
|
261
|
+
|
|
262
|
+
## Dependencies
|
|
263
|
+
|
|
264
|
+
**Core:** Python 3.10+ stdlib only (no pip install required for basic operation)
|
|
265
|
+
|
|
266
|
+
**Optional extras:**
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
pip install agentforge[full] # requests + faster-whisper
|
|
270
|
+
pip install agentforge[dev] # pytest + pytest-cov
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
| Extra | Package | Purpose |
|
|
274
|
+
|-------|---------|---------|
|
|
275
|
+
| `full` | `requests>=2.28` | Faster HTTP client (falls back to urllib) |
|
|
276
|
+
| `full` | `faster-whisper>=1.0` | Voice note transcription |
|
|
277
|
+
| `dev` | `pytest>=7` | Test runner |
|
|
278
|
+
| `dev` | `pytest-cov` | Coverage reports |
|
|
279
|
+
|
|
280
|
+
## External Requirements
|
|
281
|
+
|
|
282
|
+
- **Claude Code CLI** — must be installed at `$AGENTFORGE_ROOT/.local/bin/claude`
|
|
283
|
+
- **Telegram Bot** — create one via [@BotFather](https://t.me/BotFather), enable Forum Topics in your supergroup
|
|
284
|
+
|
|
285
|
+
## Testing
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
pip install -e ".[dev]"
|
|
289
|
+
pytest # Run all 49 tests
|
|
290
|
+
pytest --cov=agentforge # With coverage
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
Tests cover: config validation, message routing, memory manager, vault operations.
|
|
294
|
+
|
|
295
|
+
## Releases
|
|
296
|
+
|
|
297
|
+
This project uses [release-please](https://github.com/googleapis/release-please) for automated releases:
|
|
298
|
+
|
|
299
|
+
1. Use **conventional commits** (`feat:`, `fix:`, `docs:`, `chore:`, etc.)
|
|
300
|
+
2. Release-please accumulates changes and opens a **Release PR** with version bump + changelog
|
|
301
|
+
3. Merge the Release PR → GitHub Release + git tag created automatically
|
|
302
|
+
|
|
303
|
+
## License
|
|
304
|
+
|
|
305
|
+
MIT
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# AgentForge
|
|
2
|
+
|
|
3
|
+
A reusable framework for building multi-agent Telegram bots powered by Claude AI.
|
|
4
|
+
|
|
5
|
+
**Zero dependencies** by default — runs on Python 3.10+ stdlib. Optional extras for voice transcription and faster HTTP.
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Clone and install
|
|
11
|
+
git clone https://github.com/Martin-Rancourt/AgentForge.git
|
|
12
|
+
cd AgentForge
|
|
13
|
+
./install.sh
|
|
14
|
+
|
|
15
|
+
# Configure
|
|
16
|
+
nano .env # Add your Telegram bot token
|
|
17
|
+
nano bot/config.json # Add your chat IDs
|
|
18
|
+
|
|
19
|
+
# Create agents
|
|
20
|
+
agentforge agent create assistant --model sonnet --thread-id 11
|
|
21
|
+
agentforge agent create researcher --model opus --thread-id 12
|
|
22
|
+
|
|
23
|
+
# Run
|
|
24
|
+
agentforge bot
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## How It Works
|
|
28
|
+
|
|
29
|
+
AgentForge turns a **Telegram Supergroup with Forum Topics** into a multi-agent workspace. Each topic routes to a different Claude-powered agent with its own identity, model, and memory.
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Telegram Topic (thread_id: 12)
|
|
33
|
+
→ telegram_adapter.py (long-polling)
|
|
34
|
+
→ message_router.py (resolve agent config)
|
|
35
|
+
→ claude_runner.py (invoke Claude CLI with agent's soul.md)
|
|
36
|
+
→ Response sent back to Telegram
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Message Flow
|
|
40
|
+
|
|
41
|
+
1. Bot polls Telegram for new messages
|
|
42
|
+
2. `message_thread_id` determines which agent handles the message
|
|
43
|
+
3. Conversation history is loaded from SQLite (configurable context window)
|
|
44
|
+
4. Claude Code CLI is invoked with the agent's `soul.md` as system prompt
|
|
45
|
+
5. Response is stored in SQLite and sent back to Telegram
|
|
46
|
+
|
|
47
|
+
## Architecture
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
agentforge/
|
|
51
|
+
├── src/agentforge/
|
|
52
|
+
│ ├── telegram_adapter.py # Main bot — polling, routing, sending
|
|
53
|
+
│ ├── claude_runner.py # Claude Code CLI subprocess wrapper
|
|
54
|
+
│ ├── message_router.py # Thread → agent config resolution
|
|
55
|
+
│ ├── config.py # Typed config loader (dataclasses)
|
|
56
|
+
│ ├── memory_manager.py # SQLite + FTS5 conversation database
|
|
57
|
+
│ ├── vault.py # Structured memory store (per-agent)
|
|
58
|
+
│ ├── voice.py # Voice note transcription (optional)
|
|
59
|
+
│ ├── http_client.py # Dual-stack: requests or urllib
|
|
60
|
+
│ └── cli/ # CLI commands (bot, agent, memory, init, vault)
|
|
61
|
+
├── scripts/ # Bash utilities
|
|
62
|
+
│ ├── telegram_send.sh # Send messages to topics (with dedup)
|
|
63
|
+
│ ├── heartbeat.sh # Proactive task runner (cron)
|
|
64
|
+
│ ├── healthcheck.sh # Daily system health check
|
|
65
|
+
│ ├── agent_task.sh # Cross-agent task delegation
|
|
66
|
+
│ ├── log_action.sh # Action logging (Google Sheets + local)
|
|
67
|
+
│ └── memory_consolidation.sh # Weekly memory merge
|
|
68
|
+
├── tests/ # Pytest suite (49 tests)
|
|
69
|
+
├── install.sh # One-liner bootstrap
|
|
70
|
+
└── pyproject.toml # Package metadata
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## CLI Reference
|
|
74
|
+
|
|
75
|
+
### `agentforge bot`
|
|
76
|
+
|
|
77
|
+
Start the Telegram bot.
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
agentforge bot [--config path/to/config.json]
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `agentforge agent`
|
|
84
|
+
|
|
85
|
+
Manage agents declaratively.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Create — scaffolds soul.md, memory.md, daily/ directory
|
|
89
|
+
agentforge agent create <name> --model <model> --thread-id <id>
|
|
90
|
+
|
|
91
|
+
# List all configured agents
|
|
92
|
+
agentforge agent list
|
|
93
|
+
|
|
94
|
+
# Remove an agent (--keep-files to preserve files on disk)
|
|
95
|
+
agentforge agent remove <name> [--keep-files]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Models:** `sonnet` (fast, balanced), `opus` (strongest reasoning), `haiku` (fastest, cheapest)
|
|
99
|
+
|
|
100
|
+
### `agentforge memory`
|
|
101
|
+
|
|
102
|
+
Query the conversation database.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
agentforge memory search "deployment error" # Full-text search (FTS5)
|
|
106
|
+
agentforge memory recent 50 # Last 50 messages
|
|
107
|
+
agentforge memory stats # Database statistics
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### `agentforge vault`
|
|
111
|
+
|
|
112
|
+
Structured memory store — facts, preferences, and knowledge per agent.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
agentforge vault write --agent victor --category knowledge --title "API design" --content "..."
|
|
116
|
+
agentforge vault search "deployment"
|
|
117
|
+
agentforge vault list --agent archie
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### `agentforge init`
|
|
121
|
+
|
|
122
|
+
Bootstrap a new instance from scratch.
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
agentforge init [--dir /path/to/instance]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Creates: `bot/`, `agents/`, `data/`, `logs/`, `memory/`, `skills/`, `config.json`, `.env`
|
|
129
|
+
|
|
130
|
+
## Configuration
|
|
131
|
+
|
|
132
|
+
### `bot/config.json`
|
|
133
|
+
|
|
134
|
+
```jsonc
|
|
135
|
+
{
|
|
136
|
+
"telegram": {
|
|
137
|
+
"token_env_var": "AGENTFORGE_TELEGRAM_TOKEN", // env var name holding the token
|
|
138
|
+
"allowed_chat_ids": [123456789], // whitelist
|
|
139
|
+
"group_chat_id": -100123456789, // supergroup ID
|
|
140
|
+
"topics": { // named topic shortcuts
|
|
141
|
+
"general": 11,
|
|
142
|
+
"dev": 12
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"claude": {
|
|
146
|
+
"model": "sonnet", // default model
|
|
147
|
+
"max_budget_usd": 1.0 // per-invocation spend cap
|
|
148
|
+
},
|
|
149
|
+
"memory": {
|
|
150
|
+
"context_messages": 10 // messages included as context
|
|
151
|
+
},
|
|
152
|
+
"threads": {
|
|
153
|
+
"11": { "name": "assistant", "model": "sonnet", "context_messages": 10 },
|
|
154
|
+
"12": { "name": "researcher", "model": "opus", "context_messages": 15 }
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### `.env`
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
AGENTFORGE_TELEGRAM_TOKEN=your_bot_token_here
|
|
163
|
+
AGENTFORGE_ROOT=/path/to/instance # defaults to /home/clawdia
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Multi-Agent System
|
|
167
|
+
|
|
168
|
+
Each agent gets its own identity via a `soul.md` file:
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
agents/
|
|
172
|
+
├── victor/
|
|
173
|
+
│ ├── soul.md # Personality, role, instructions
|
|
174
|
+
│ ├── memory.md # Long-term consolidated memory
|
|
175
|
+
│ └── daily/ # Daily learnings (YYYY-MM-DD.md)
|
|
176
|
+
├── archie/
|
|
177
|
+
└── catherine/
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
The `soul.md` is passed as `--system-prompt` to Claude, completely overriding the default identity. Agents can:
|
|
181
|
+
|
|
182
|
+
- Have different Claude models (opus for complex reasoning, haiku for quick tasks)
|
|
183
|
+
- Maintain separate conversation histories and context windows
|
|
184
|
+
- Store per-agent structured memory in the vault
|
|
185
|
+
- Delegate tasks to each other via `agent_task.sh`
|
|
186
|
+
|
|
187
|
+
### Project Topics
|
|
188
|
+
|
|
189
|
+
Beyond agent topics, you can configure **project topics** where multiple agents collaborate:
|
|
190
|
+
|
|
191
|
+
```json
|
|
192
|
+
"project_topics": {
|
|
193
|
+
"42": {
|
|
194
|
+
"label": "🏗 Dev",
|
|
195
|
+
"agents": ["victor", "archie"],
|
|
196
|
+
"default_agent": "victor"
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Use `@agentname` mentions to address a specific agent in a shared topic.
|
|
202
|
+
|
|
203
|
+
## Scripts
|
|
204
|
+
|
|
205
|
+
| Script | Purpose | Trigger |
|
|
206
|
+
|--------|---------|---------|
|
|
207
|
+
| `telegram_send.sh` | Send messages to topics | Manual / cross-agent |
|
|
208
|
+
| `heartbeat.sh` | Run proactive tasks from `heartbeat.md` | Cron |
|
|
209
|
+
| `healthcheck.sh` | System health report | Cron (daily) |
|
|
210
|
+
| `agent_task.sh` | Delegate tasks between agents | Inter-agent |
|
|
211
|
+
| `log_action.sh` | Log external actions to Sheets + file | After side-effects |
|
|
212
|
+
| `memory_consolidation.sh` | Merge daily logs → `memory.md` | Cron (weekly) |
|
|
213
|
+
|
|
214
|
+
### Dedup
|
|
215
|
+
|
|
216
|
+
`telegram_send.sh` has built-in deduplication: identical messages to the same topic within 60 seconds are silently dropped.
|
|
217
|
+
|
|
218
|
+
## Memory System
|
|
219
|
+
|
|
220
|
+
AgentForge provides three layers of memory:
|
|
221
|
+
|
|
222
|
+
| Layer | Storage | Purpose |
|
|
223
|
+
|-------|---------|---------|
|
|
224
|
+
| **Conversations** | SQLite + FTS5 | Full message history, searchable |
|
|
225
|
+
| **Vault** | SQLite + FTS5 | Structured facts/preferences per agent |
|
|
226
|
+
| **Files** | Markdown | `soul.md` (identity), `memory.md` (long-term), `daily/` (learnings) |
|
|
227
|
+
|
|
228
|
+
The weekly `memory_consolidation.sh` script merges daily learnings into each agent's `memory.md`.
|
|
229
|
+
|
|
230
|
+
## Dependencies
|
|
231
|
+
|
|
232
|
+
**Core:** Python 3.10+ stdlib only (no pip install required for basic operation)
|
|
233
|
+
|
|
234
|
+
**Optional extras:**
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
pip install agentforge[full] # requests + faster-whisper
|
|
238
|
+
pip install agentforge[dev] # pytest + pytest-cov
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
| Extra | Package | Purpose |
|
|
242
|
+
|-------|---------|---------|
|
|
243
|
+
| `full` | `requests>=2.28` | Faster HTTP client (falls back to urllib) |
|
|
244
|
+
| `full` | `faster-whisper>=1.0` | Voice note transcription |
|
|
245
|
+
| `dev` | `pytest>=7` | Test runner |
|
|
246
|
+
| `dev` | `pytest-cov` | Coverage reports |
|
|
247
|
+
|
|
248
|
+
## External Requirements
|
|
249
|
+
|
|
250
|
+
- **Claude Code CLI** — must be installed at `$AGENTFORGE_ROOT/.local/bin/claude`
|
|
251
|
+
- **Telegram Bot** — create one via [@BotFather](https://t.me/BotFather), enable Forum Topics in your supergroup
|
|
252
|
+
|
|
253
|
+
## Testing
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
pip install -e ".[dev]"
|
|
257
|
+
pytest # Run all 49 tests
|
|
258
|
+
pytest --cov=agentforge # With coverage
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Tests cover: config validation, message routing, memory manager, vault operations.
|
|
262
|
+
|
|
263
|
+
## Releases
|
|
264
|
+
|
|
265
|
+
This project uses [release-please](https://github.com/googleapis/release-please) for automated releases:
|
|
266
|
+
|
|
267
|
+
1. Use **conventional commits** (`feat:`, `fix:`, `docs:`, `chore:`, etc.)
|
|
268
|
+
2. Release-please accumulates changes and opens a **Release PR** with version bump + changelog
|
|
269
|
+
3. Merge the Release PR → GitHub Release + git tag created automatically
|
|
270
|
+
|
|
271
|
+
## License
|
|
272
|
+
|
|
273
|
+
MIT
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "agent-forge-installer"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "AgentForge — multi-agent Telegram bot framework powered by Claude Code"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Martin Rancourt" },
|
|
14
|
+
]
|
|
15
|
+
keywords = ["telegram", "bot", "ai", "claude", "multi-agent", "framework"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 3 - Alpha",
|
|
18
|
+
"Intended Audience :: Developers",
|
|
19
|
+
"License :: OSI Approved :: MIT License",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Topic :: Communications :: Chat",
|
|
25
|
+
"Topic :: Software Development :: Libraries :: Application Frameworks",
|
|
26
|
+
]
|
|
27
|
+
dependencies = []
|
|
28
|
+
# All core dependencies are Python stdlib (json, sqlite3, subprocess, threading, etc.)
|
|
29
|
+
# External dependencies are optional — see [project.optional-dependencies] below.
|
|
30
|
+
|
|
31
|
+
[project.urls]
|
|
32
|
+
Homepage = "https://github.com/Martin-Rancourt/agentforge"
|
|
33
|
+
Repository = "https://github.com/Martin-Rancourt/agentforge"
|
|
34
|
+
"Bug Tracker" = "https://github.com/Martin-Rancourt/agentforge/issues"
|
|
35
|
+
|
|
36
|
+
[project.optional-dependencies]
|
|
37
|
+
# Faster HTTP client (falls back to urllib.request if not installed)
|
|
38
|
+
http = ["requests>=2.28"]
|
|
39
|
+
# Voice note transcription support
|
|
40
|
+
voice = ["faster-whisper>=1.0"]
|
|
41
|
+
# Full install: all optional runtime deps
|
|
42
|
+
full = ["requests>=2.28", "faster-whisper>=1.0"]
|
|
43
|
+
# Dev/test tools
|
|
44
|
+
dev = ["pytest>=7", "pytest-cov"]
|
|
45
|
+
|
|
46
|
+
[project.scripts]
|
|
47
|
+
agentforge = "agentforge.cli:main"
|
|
48
|
+
|
|
49
|
+
[tool.setuptools.packages.find]
|
|
50
|
+
where = ["src"]
|
|
51
|
+
|
|
52
|
+
[tool.pytest.ini_options]
|
|
53
|
+
testpaths = ["tests"]
|
|
54
|
+
filterwarnings = ["error::DeprecationWarning"]
|