obsidian-agent-fleet 0.4.2 → 0.4.3
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/README.md +350 -168
- package/package.json +1 -1
- package/plugin/main.js +49 -2
- package/plugin/styles.css +2 -0
package/README.md
CHANGED
|
@@ -1,157 +1,286 @@
|
|
|
1
1
|
# Agent Fleet for Obsidian
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Turn Obsidian into an AI-powered command center. Create autonomous agents, schedule tasks, chat in real-time, connect via Slack, and hook into any MCP service — all from your vault.**
|
|
4
4
|
|
|
5
|
-
Agent Fleet
|
|
5
|
+

|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
---
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- **Session Persistence** — conversations survive panel close and Obsidian restarts via Claude CLI `--resume`
|
|
11
|
-
- **Task Scheduling** — cron-based recurring tasks, one-shot runs, and manual execution
|
|
12
|
-
- **Skill System** — reusable skill libraries that agents can share
|
|
13
|
-
- **Agent Memory** — persistent context across runs via `[REMEMBER]...[/REMEMBER]` tags
|
|
14
|
-
- **Live Dashboard** — overview with charts, run history, kanban board, and approval workflow
|
|
15
|
-
- **Lucide Icon Picker** — searchable icon selector for agent avatars (1,400+ icons)
|
|
16
|
-
- **18 Built-in Skills** — PDF, PPTX, DOCX, XLSX, Claude API, MCP Builder, Frontend Design, and more
|
|
17
|
-
- **Run Output** — rendered markdown with collapsible tool call summaries
|
|
9
|
+
## What is Agent Fleet?
|
|
18
10
|
|
|
19
|
-
|
|
11
|
+
Agent Fleet is an Obsidian plugin that lets you build, configure, and run AI agents directly from your vault. Agents are powered by **Claude Code CLI** — works with a Claude Max/Pro subscription or Anthropic API key. Every agent, skill, task, and run log is a markdown file. If the plugin disappears, your knowledge stays.
|
|
20
12
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
13
|
+
### Core Capabilities
|
|
14
|
+
|
|
15
|
+
🤖 **AI Agents** — Create specialized agents with system prompts, skills, permissions, heartbeat schedules, and memory. Each agent is a folder of markdown files you fully own and control.
|
|
16
|
+
|
|
17
|
+
💬 **Interactive Chat** — Dock a chat panel anywhere in Obsidian. Switch between agents. Attach documents and images. Send follow-up messages while the agent works.
|
|
18
|
+
|
|
19
|
+
📡 **Slack Channels** — Chat with your agents from Slack. Multi-agent routing via `@agent-name` prefix. Native "is thinking..." indicator via Slack Assistants API. Session persistence across restarts.
|
|
28
20
|
|
|
29
|
-
|
|
21
|
+
💓 **Heartbeat** — Autonomous periodic agent runs. Define what an agent does when no one is asking — monitoring, reports, health checks — with results posted to Slack.
|
|
30
22
|
|
|
31
|
-
|
|
23
|
+
📋 **Task Board** — Kanban view with scheduling, priority, real-time progress tracking, and abort. Tasks run on cron schedules or on-demand.
|
|
32
24
|
|
|
33
|
-
|
|
34
|
-
2. Open BRAT settings → **Add Beta Plugin**
|
|
35
|
-
3. Paste: `denberek/obsidian-agent-fleet`
|
|
36
|
-
4. Enable **Agent Fleet** in Settings → Community Plugins
|
|
25
|
+
🔌 **MCP Integration** — Discover, authenticate, and inspect MCP servers. One-click OAuth 2.1 authentication. Assign MCP tools to specific agents.
|
|
37
26
|
|
|
38
|
-
|
|
27
|
+
🧠 **Agent Memory** — Agents persist context across sessions using `[REMEMBER]` tags stored as markdown.
|
|
39
28
|
|
|
40
|
-
|
|
41
|
-
|
|
29
|
+
📊 **Dashboard** — Overview with run charts, success rates, token/cost tracking, activity timeline, fleet status, and streaming output from active agents.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Quick Start
|
|
34
|
+
|
|
35
|
+
### Install
|
|
36
|
+
|
|
37
|
+
**Via npm (recommended):**
|
|
38
|
+
```bash
|
|
39
|
+
npm install -g obsidian-agent-fleet
|
|
40
|
+
```
|
|
41
|
+
The installer automatically finds your Obsidian vaults and copies the plugin files.
|
|
42
|
+
|
|
43
|
+
**Via BRAT:**
|
|
44
|
+
1. Install the [BRAT plugin](https://github.com/TfTHacker/obsidian42-brat)
|
|
45
|
+
2. Add beta plugin: `denberek/obsidian-agent-fleet`
|
|
46
|
+
3. Enable Agent Fleet in Settings → Community Plugins
|
|
47
|
+
|
|
48
|
+
**Manual:**
|
|
49
|
+
1. Download `main.js`, `manifest.json`, `styles.css` from the [latest release](https://github.com/denberek/obsidian-agent-fleet/releases)
|
|
50
|
+
2. Create `<vault>/.obsidian/plugins/agent-fleet/`
|
|
42
51
|
3. Copy the 3 files into that folder
|
|
43
|
-
4. Restart Obsidian →
|
|
52
|
+
4. Restart Obsidian → Enable Agent Fleet
|
|
53
|
+
|
|
54
|
+
### Requirements
|
|
55
|
+
|
|
56
|
+
- **Obsidian** 1.6.0+ (desktop only)
|
|
57
|
+
- **[Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code)** — the engine behind all agent execution:
|
|
58
|
+
```bash
|
|
59
|
+
npm install -g @anthropic-ai/claude-code
|
|
60
|
+
claude # authenticate on first run
|
|
61
|
+
```
|
|
62
|
+
- **Claude subscription** (Max or Pro) or **Anthropic API key** — Claude Code works with your existing subscription, no separate API costs. If you're already paying for Claude, you're ready to go.
|
|
44
63
|
|
|
45
|
-
|
|
64
|
+
### First Launch
|
|
46
65
|
|
|
47
|
-
On first launch, Agent Fleet creates a `_fleet/` folder in your vault
|
|
66
|
+
On first launch, Agent Fleet creates a `_fleet/` folder in your vault:
|
|
48
67
|
|
|
49
68
|
```
|
|
50
69
|
_fleet/
|
|
51
70
|
├── agents/
|
|
52
|
-
│ └── fleet-orchestrator/ ← default agent (
|
|
71
|
+
│ └── fleet-orchestrator/ ← default agent (manages the fleet)
|
|
53
72
|
├── skills/ ← 18 built-in skills
|
|
54
73
|
├── tasks/
|
|
74
|
+
├── channels/
|
|
55
75
|
├── runs/
|
|
56
76
|
└── memory/
|
|
57
77
|
```
|
|
58
78
|
|
|
59
|
-
The **Fleet Orchestrator** agent is ready
|
|
79
|
+
The **Fleet Orchestrator** agent is ready — click Chat to ask it to create new agents, tasks, skills, or channels.
|
|
80
|
+
|
|
81
|
+
### Update
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npm update -g obsidian-agent-fleet
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Or via BRAT: settings → check for updates.
|
|
88
|
+
|
|
89
|
+
---
|
|
60
90
|
|
|
61
|
-
##
|
|
91
|
+
## Features
|
|
62
92
|
|
|
63
93
|
### Agents
|
|
64
94
|
|
|
65
|
-
Each agent is a folder in `_fleet/agents
|
|
95
|
+
Agents are AI assistants with specific personalities, capabilities, and permissions. Each agent is a folder in `_fleet/agents/` containing markdown files:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
agents/my-agent/
|
|
99
|
+
├── agent.md ← Identity: name, description, system prompt
|
|
100
|
+
├── config.md ← Runtime: model, timeout, permissions
|
|
101
|
+
├── SKILLS.md ← Agent-specific skills
|
|
102
|
+
├── CONTEXT.md ← Project context
|
|
103
|
+
└── HEARTBEAT.md ← Autonomous periodic run instruction (optional)
|
|
104
|
+
```
|
|
66
105
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
|
70
|
-
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
|
|
|
106
|
+
**What you can configure:**
|
|
107
|
+
|
|
108
|
+
| Setting | Description |
|
|
109
|
+
|---------|-------------|
|
|
110
|
+
| **Name & Description** | Identity shown in the dashboard |
|
|
111
|
+
| **Avatar** | Lucide icon picker (1,400+ icons) or emoji |
|
|
112
|
+
| **System Prompt** | Core instructions that define the agent's behavior |
|
|
113
|
+
| **Model** | Claude Opus 4.6, Sonnet 4.6, Haiku 4.5, Bedrock models, or custom |
|
|
114
|
+
| **Adapter** | Claude Code (more adapters coming soon) |
|
|
115
|
+
| **Working Directory** | Where the agent operates (defaults to vault root) |
|
|
116
|
+
| **Timeout** | Max execution time in seconds |
|
|
117
|
+
| **Permission Mode** | bypassPermissions, dontAsk, acceptEdits, or plan |
|
|
118
|
+
| **Allow/Deny Lists** | Fine-grained tool control (e.g., allow `Bash(curl *)`, deny `Bash(rm -rf *)`) |
|
|
119
|
+
| **Skills** | Shared skills from the skill library |
|
|
120
|
+
| **MCP Servers** | Which MCP servers the agent can access |
|
|
121
|
+
| **Memory** | Persistent context across sessions via `[REMEMBER]` tags |
|
|
122
|
+
| **Heartbeat** | Autonomous periodic run with schedule and instruction |
|
|
123
|
+
|
|
124
|
+
**Permission Modes:**
|
|
125
|
+
|
|
126
|
+
| Mode | Behavior |
|
|
127
|
+
|------|----------|
|
|
128
|
+
| `bypassPermissions` | Auto-runs everything except deny list |
|
|
129
|
+
| `dontAsk` | Only allow-listed commands run |
|
|
130
|
+
| `acceptEdits` | File edits auto-approved, bash blocked unless allowed |
|
|
131
|
+
| `plan` | Read-only — no writes, no commands |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
### Heartbeat
|
|
136
|
+
|
|
137
|
+
A heartbeat gives an agent autonomous behavior — what it does when no one is asking. Think periodic monitoring, daily reports, health checks, or trend analysis.
|
|
138
|
+
|
|
139
|
+
**Setup:** Create a `HEARTBEAT.md` file in the agent's folder, or configure it in the dashboard's agent edit page:
|
|
74
140
|
|
|
75
|
-
**Example `agent.md`:**
|
|
76
141
|
```yaml
|
|
77
142
|
---
|
|
78
|
-
name: site-monitor
|
|
79
|
-
description: Checks website uptime and alerts on failures
|
|
80
|
-
avatar: globe
|
|
81
143
|
enabled: true
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
144
|
+
schedule: "0 */6 * * *" # every 6 hours
|
|
145
|
+
notify: true # Obsidian notice on completion
|
|
146
|
+
channel: my-slack # post results to Slack (optional)
|
|
85
147
|
---
|
|
86
148
|
|
|
87
|
-
|
|
88
|
-
|
|
149
|
+
Check all monitored endpoints for availability and response time.
|
|
150
|
+
Compare with previous checks using your memory. Report anomalies.
|
|
151
|
+
If everything is healthy, respond with a one-line "all clear".
|
|
89
152
|
```
|
|
90
153
|
|
|
91
|
-
|
|
154
|
+
**Key behaviors:**
|
|
155
|
+
- The **"Run Now" button** on any agent with a heartbeat uses the heartbeat instruction (no more generic fallback)
|
|
156
|
+
- **Agent memory integration** — heartbeats can use `[REMEMBER]` tags to track trends across runs
|
|
157
|
+
- **Slack delivery** — results automatically posted to a configured Slack channel
|
|
158
|
+
- **Dashboard** — heartbeat status shown on the agent's Overview tab with enable/disable toggle, schedule, and next run time
|
|
92
159
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
| File | Purpose |
|
|
96
|
-
|------|---------|
|
|
97
|
-
| `skill.md` | Core instructions and description |
|
|
98
|
-
| `tools.md` | CLI/API tool documentation (optional) |
|
|
99
|
-
| `references.md` | Background docs, conventions (optional) |
|
|
100
|
-
| `examples.md` | Few-shot examples (optional) |
|
|
160
|
+
---
|
|
101
161
|
|
|
102
|
-
|
|
162
|
+
### Slack Channels
|
|
103
163
|
|
|
104
|
-
|
|
164
|
+
Chat with your agents from Slack — every message flows through the same Claude CLI session pipeline, with full tool use, session persistence, and agent memory.
|
|
105
165
|
|
|
106
|
-
|
|
166
|
+
**Setup:**
|
|
167
|
+
1. Create a Slack app at [api.slack.com](https://api.slack.com/apps) with Socket Mode + Agents & AI Apps enabled
|
|
168
|
+
2. Add credentials in Settings → Agent Fleet → Channel Credentials
|
|
169
|
+
3. Create `_fleet/channels/my-slack.md` with agent binding + user allowlist
|
|
170
|
+
4. DM the bot from Slack
|
|
107
171
|
|
|
108
172
|
```yaml
|
|
109
173
|
---
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
174
|
+
name: my-slack
|
|
175
|
+
type: slack
|
|
176
|
+
default_agent: fleet-orchestrator
|
|
177
|
+
allowed_agents:
|
|
178
|
+
- fleet-orchestrator
|
|
179
|
+
- site-monitor
|
|
180
|
+
- code-reviewer
|
|
114
181
|
enabled: true
|
|
182
|
+
credential_ref: my-slack-creds
|
|
183
|
+
allowed_users:
|
|
184
|
+
- U0AQW6P37N1
|
|
185
|
+
per_user_sessions: true
|
|
186
|
+
channel_context: |
|
|
187
|
+
You are being contacted via Slack. Keep replies concise.
|
|
115
188
|
---
|
|
116
|
-
|
|
117
|
-
Check https://example.com — report status code and response time.
|
|
118
189
|
```
|
|
119
190
|
|
|
120
|
-
**
|
|
121
|
-
-
|
|
122
|
-
-
|
|
123
|
-
- `
|
|
191
|
+
**Features:**
|
|
192
|
+
- **Socket Mode** — outbound WebSocket, works behind NAT/firewalls, no public URL needed
|
|
193
|
+
- **Slack Assistants API** — native "is thinking..." indicator, threaded conversations, thread titles
|
|
194
|
+
- **Multi-agent routing** — type `@agent-name: message` to switch agents mid-thread. Each agent gets its own isolated session. `/agents` slash command lists available agents.
|
|
195
|
+
- **Session persistence** — conversations survive Obsidian restarts via `claude --resume`
|
|
196
|
+
- **Idle hibernation** — subprocess eviction after configurable idle time, transparent resume on next message
|
|
197
|
+
- **Allowlist** — only approved Slack users (by user ID) can reach the bot
|
|
198
|
+
- **Rate limiting** — per-conversation sliding window to prevent budget burn
|
|
199
|
+
- **Markdown → mrkdwn** — automatic formatting conversion with fence-aware chunking for long replies
|
|
124
200
|
|
|
125
|
-
|
|
201
|
+
**Important:** Obsidian must be running for channels to work. When Obsidian is closed, the bot goes offline.
|
|
126
202
|
|
|
127
|
-
|
|
203
|
+
---
|
|
128
204
|
|
|
129
|
-
|
|
130
|
-
- **Markdown rendering** — headers, lists, code blocks, tables render properly
|
|
131
|
-
- **Tool activity indicator** — shows what the agent is doing ("Working… (Read)")
|
|
132
|
-
- **Collapsible tool summary** — "🔧 12 tool calls" after each response
|
|
133
|
-
- **Session persistence** — close and reopen, your conversation is still there
|
|
134
|
-
- **`--resume` sessions** — Claude CLI maintains full tool context between turns
|
|
135
|
-
- **New Chat** button to start fresh
|
|
205
|
+
### Interactive Chat
|
|
136
206
|
|
|
137
|
-
|
|
207
|
+
The chat panel is a first-class Obsidian view — dock it in the sidebar, center, or any split.
|
|
138
208
|
|
|
139
|
-
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
209
|
+
**Features:**
|
|
210
|
+
- **Agent Switcher** — dropdown to switch between agents instantly. Each agent has its own conversation.
|
|
211
|
+
- **Session Persistence** — conversations survive Obsidian restarts via Claude CLI `--resume`
|
|
212
|
+
- **Bidirectional Streaming** — send follow-up messages while the agent is working. Steer it mid-task.
|
|
213
|
+
- **Document Attachment** — click + to attach the active document. Agent gets the full content; you see a compact pill.
|
|
214
|
+
- **Image Paste & Drop** — paste from clipboard or drag images into chat. Saved to vault, passed to Claude.
|
|
215
|
+
- **Stop Button** — + button becomes ■ while agent works. Click to abort.
|
|
216
|
+
- **Streaming Markdown** — responses render in real-time with syntax highlighting
|
|
217
|
+
- **Code Block Copy** — hover any code block for a copy button
|
|
218
|
+
- **Tool Activity** — see which tools the agent is using in real-time
|
|
144
219
|
|
|
145
|
-
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
### Task Board
|
|
223
|
+
|
|
224
|
+
A kanban view for managing agent tasks with five columns:
|
|
225
|
+
|
|
226
|
+
| Column | Description |
|
|
227
|
+
|--------|-------------|
|
|
228
|
+
| **Backlog** | Tasks with no schedule, waiting to be run manually |
|
|
229
|
+
| **Scheduled** | Tasks with a cron schedule, enabled and waiting |
|
|
230
|
+
| **Running** | Currently executing — shows real-time progress bar tied to timeout |
|
|
231
|
+
| **Done** | Completed today |
|
|
232
|
+
| **Failed** | Failed, timed out, or cancelled today |
|
|
233
|
+
|
|
234
|
+
**Task features:**
|
|
235
|
+
- **Priority** — low / medium / high / critical (color-coded left border)
|
|
236
|
+
- **Real-time Progress** — progress bar shows elapsed time vs timeout, updates every second
|
|
237
|
+
- **Stop Button** — red ■ on running cards to abort (shows as "Cancelled", not "Failed")
|
|
238
|
+
- **Cron Scheduling** — human-friendly picker (daily, weekdays, weekly, monthly, custom)
|
|
239
|
+
- **Catch Up If Missed** — auto-run overdue tasks when Obsidian opens
|
|
240
|
+
- **Run Now** — execute any task immediately regardless of schedule
|
|
241
|
+
- **Drag & Drop** — move tasks between backlog and scheduled columns
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
### MCP Servers
|
|
246
|
+
|
|
247
|
+
Discover and manage all MCP (Model Context Protocol) servers configured in Claude Code.
|
|
248
|
+
|
|
249
|
+
**Discovery:**
|
|
250
|
+
- **stdio servers** — spawned and probed directly via JSON-RPC (~1-2s)
|
|
251
|
+
- **HTTP/SSE servers** — probed with OAuth tokens for full tool schemas
|
|
252
|
+
- **Plugin metadata** — descriptions from Claude's plugin directory
|
|
253
|
+
|
|
254
|
+
**OAuth 2.1 Authentication:**
|
|
255
|
+
|
|
256
|
+
One-click browser-based auth for MCP servers:
|
|
257
|
+
1. Click "Authenticate" on any server card
|
|
258
|
+
2. Plugin discovers OAuth endpoints automatically
|
|
259
|
+
3. Registers via Dynamic Client Registration
|
|
260
|
+
4. Opens browser for approval (PKCE flow)
|
|
261
|
+
5. Tokens stored in plugin settings, auto-refresh
|
|
262
|
+
|
|
263
|
+
**Server Management:**
|
|
264
|
+
- Enable/disable toggle per server (writes to Claude's settings)
|
|
265
|
+
- Server cards show status, tool count, type, description
|
|
266
|
+
- Detail slideover with full tool list, descriptions, input schemas, parameters
|
|
267
|
+
- Assign MCP servers to specific agents in the agent editor
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
### Skills
|
|
272
|
+
|
|
273
|
+
Reusable instruction sets that agents share. Each skill is a folder:
|
|
146
274
|
|
|
147
|
-
When `memory: true` in config, agents can persist context using:
|
|
148
275
|
```
|
|
149
|
-
|
|
276
|
+
skills/my-skill/
|
|
277
|
+
├── skill.md ← Core instructions
|
|
278
|
+
├── tools.md ← CLI/API tool documentation
|
|
279
|
+
├── references.md ← Background docs
|
|
280
|
+
└── examples.md ← Few-shot examples
|
|
150
281
|
```
|
|
151
282
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
## Built-in Skills
|
|
283
|
+
**18 Built-in Skills:**
|
|
155
284
|
|
|
156
285
|
| Skill | Description |
|
|
157
286
|
|-------|-------------|
|
|
@@ -168,21 +297,77 @@ These entries are appended to `_fleet/memory/<agent-name>.md` and included in fu
|
|
|
168
297
|
| `pptx` | Create, read, edit PowerPoint (.pptx) files |
|
|
169
298
|
| `skill-creator` | Create, evaluate, and optimize skills |
|
|
170
299
|
| `slack-gif-creator` | Animated GIFs optimized for Slack |
|
|
171
|
-
| `
|
|
172
|
-
| `
|
|
173
|
-
|
|
|
174
|
-
|
|
300
|
+
| `taste-skill` | Senior UI/UX engineering for frontend design |
|
|
301
|
+
| `frontend-slides` | HTML presentation creation |
|
|
302
|
+
| And more... | |
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
### Dashboard
|
|
307
|
+
|
|
308
|
+
The main overview with:
|
|
175
309
|
|
|
176
|
-
|
|
310
|
+
- **Stat Cards** — active agents, runs today, tokens used (with cost), scheduled tasks
|
|
311
|
+
- **Run Activity Chart** — 14-day bar chart with green (success), yellow (cancelled), red (failure)
|
|
312
|
+
- **Success Rate Donut** — overall success percentage
|
|
313
|
+
- **Active Agent Cards** — fixed-height streaming output from running agents with agent→task title
|
|
314
|
+
- **Activity Timeline** — recent runs with status, duration, tokens
|
|
315
|
+
- **Fleet Status** — agent list with quick-run capability
|
|
177
316
|
|
|
178
|
-
|
|
317
|
+
**Sidebar navigation:**
|
|
318
|
+
- Dashboard / Agents / Tasks Board / Run History / Approvals / Skills / MCP Servers / Channels
|
|
179
319
|
|
|
180
|
-
|
|
181
|
-
-
|
|
182
|
-
-
|
|
183
|
-
-
|
|
184
|
-
-
|
|
185
|
-
|
|
320
|
+
**Agent detail page tabs:**
|
|
321
|
+
- Overview (stats, heartbeat status, skills, permissions, recent runs)
|
|
322
|
+
- Config (all settings, system prompt, heartbeat instruction)
|
|
323
|
+
- Runs (full history for this agent)
|
|
324
|
+
- Memory (learned context)
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
### Agent Memory
|
|
329
|
+
|
|
330
|
+
Agents persist context across sessions:
|
|
331
|
+
|
|
332
|
+
1. Agent includes `[REMEMBER]important context[/REMEMBER]` in its output
|
|
333
|
+
2. Extracted and appended to `_fleet/memory/<agent-name>.md`
|
|
334
|
+
3. Injected into the agent's prompt on every future run
|
|
335
|
+
4. Memory is agent-scoped — shared across all conversations including Slack channels
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
### Run History
|
|
340
|
+
|
|
341
|
+
Every execution is logged in `_fleet/runs/YYYY-MM-DD/`:
|
|
342
|
+
|
|
343
|
+
```yaml
|
|
344
|
+
---
|
|
345
|
+
run_id: abc123
|
|
346
|
+
agent: fleet-orchestrator
|
|
347
|
+
task: daily-report
|
|
348
|
+
status: success
|
|
349
|
+
started: 2026-04-03T09:00:00
|
|
350
|
+
completed: 2026-04-03T09:02:30
|
|
351
|
+
duration_seconds: 150
|
|
352
|
+
tokens_used: 4500
|
|
353
|
+
cost_usd: 0.07
|
|
354
|
+
model: claude-opus-4-6
|
|
355
|
+
tags: [heartbeat]
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Prompt
|
|
359
|
+
...
|
|
360
|
+
|
|
361
|
+
## Output
|
|
362
|
+
...
|
|
363
|
+
|
|
364
|
+
## Tools Used
|
|
365
|
+
...
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Click any run in the dashboard to see full details in a slideover panel.
|
|
369
|
+
|
|
370
|
+
---
|
|
186
371
|
|
|
187
372
|
## Configuration
|
|
188
373
|
|
|
@@ -192,81 +377,78 @@ The dashboard provides:
|
|
|
192
377
|
|---------|---------|-------------|
|
|
193
378
|
| Fleet Folder | `_fleet` | Root folder for all fleet data |
|
|
194
379
|
| Claude CLI Path | `claude` | Path to Claude Code CLI |
|
|
195
|
-
| Default Model | `default` | Default model for agents |
|
|
196
|
-
|
|
|
197
|
-
|
|
|
198
|
-
|
|
|
380
|
+
| Default Model | `default` | Default model for new agents |
|
|
381
|
+
| AWS Region | `us-east-1` | For AWS Bedrock model support |
|
|
382
|
+
| Max Concurrent Runs | `2` | Parallel task execution limit |
|
|
383
|
+
| Run Log Retention | `30` days | Auto-cleanup old logs |
|
|
384
|
+
| Catch Up Missed Tasks | `true` | Run overdue tasks on startup |
|
|
199
385
|
| Notification Level | `all` | `all`, `failures-only`, `none` |
|
|
200
386
|
|
|
201
|
-
###
|
|
387
|
+
### Channel Settings
|
|
202
388
|
|
|
203
|
-
|
|
|
204
|
-
|
|
205
|
-
| `
|
|
206
|
-
| `
|
|
207
|
-
| `
|
|
208
|
-
| `plan` | Read-only, no execution |
|
|
389
|
+
| Setting | Default | Description |
|
|
390
|
+
|---------|---------|-------------|
|
|
391
|
+
| Max Concurrent Sessions | `5` | Live claude subprocesses across all channels |
|
|
392
|
+
| Idle Timeout | `15` min | Hibernate sessions after inactivity |
|
|
393
|
+
| Rate Limit | `20` msgs / `5` min | Per-conversation sliding window |
|
|
209
394
|
|
|
210
|
-
|
|
395
|
+
### File Structure
|
|
396
|
+
|
|
397
|
+
All data lives in `_fleet/` as plain markdown:
|
|
211
398
|
|
|
212
399
|
```
|
|
213
|
-
|
|
214
|
-
├──
|
|
215
|
-
├──
|
|
216
|
-
├──
|
|
217
|
-
├──
|
|
218
|
-
├──
|
|
219
|
-
|
|
220
|
-
├──
|
|
221
|
-
|
|
222
|
-
│ ├── executionManager.ts Claude CLI process spawning
|
|
223
|
-
│ ├── fleetRuntime.ts Runtime state and orchestration
|
|
224
|
-
│ └── taskScheduler.ts Cron-based task scheduling
|
|
225
|
-
├── views/
|
|
226
|
-
│ ├── dashboardView.ts Main dashboard (3700+ lines)
|
|
227
|
-
│ ├── agentsView.ts Sidebar agent list
|
|
228
|
-
│ ├── sidebarView.ts Navigation sidebar
|
|
229
|
-
│ └── inboxView.ts Inbox view
|
|
230
|
-
├── modals/
|
|
231
|
-
│ ├── iconPickerModal.ts Lucide icon selector
|
|
232
|
-
│ ├── taskModal.ts Task creation
|
|
233
|
-
│ ├── createAgentModal.ts Agent creation wizard
|
|
234
|
-
│ └── confirmDeleteModal.ts Deletion confirmation
|
|
235
|
-
├── components/
|
|
236
|
-
│ ├── chartRenderer.ts Bar and donut charts
|
|
237
|
-
│ ├── dragDrop.ts Drag and drop utilities
|
|
238
|
-
│ └── scheduleEditor.ts Cron schedule editor
|
|
239
|
-
└── utils/
|
|
240
|
-
├── icons.ts Icon helper
|
|
241
|
-
└── markdown.ts Frontmatter parser
|
|
400
|
+
_fleet/
|
|
401
|
+
├── agents/ Agent folders (agent.md, config.md, HEARTBEAT.md, etc.)
|
|
402
|
+
├── skills/ Shared skill folders (skill.md, tools.md, etc.)
|
|
403
|
+
├── tasks/ Task files with frontmatter
|
|
404
|
+
├── channels/ Channel bindings (Slack, etc.)
|
|
405
|
+
├── runs/ Execution logs by date
|
|
406
|
+
│ └── YYYY-MM-DD/
|
|
407
|
+
├── memory/ Agent memory files
|
|
408
|
+
└── chat-images/ Images pasted into chat
|
|
242
409
|
```
|
|
243
410
|
|
|
244
|
-
|
|
411
|
+
Everything is searchable, version-controllable, and fully yours.
|
|
245
412
|
|
|
246
|
-
|
|
247
|
-
# Clone
|
|
248
|
-
git clone https://github.com/denberek/obsidian-agent-fleet.git
|
|
249
|
-
cd obsidian-agent-fleet
|
|
413
|
+
---
|
|
250
414
|
|
|
251
|
-
|
|
252
|
-
npm install
|
|
415
|
+
## FAQ
|
|
253
416
|
|
|
254
|
-
|
|
255
|
-
|
|
417
|
+
**Q: Do I need an API key?**
|
|
418
|
+
Not necessarily. Agent Fleet works with your **Claude Max or Pro subscription** via Claude Code CLI. No separate API key or billing. If you prefer, you can also use an Anthropic API key directly.
|
|
256
419
|
|
|
257
|
-
|
|
258
|
-
|
|
420
|
+
**Q: Does it work without internet?**
|
|
421
|
+
No — agents need the Claude API to run. But all your data (agents, tasks, skills, memory) is local markdown.
|
|
259
422
|
|
|
260
|
-
|
|
261
|
-
|
|
423
|
+
**Q: Can I use different models per agent?**
|
|
424
|
+
Yes. Each agent has its own model setting. Supports Anthropic direct (Opus, Sonnet, Haiku) and AWS Bedrock models.
|
|
262
425
|
|
|
263
|
-
|
|
264
|
-
|
|
426
|
+
**Q: What happens if I delete the plugin?**
|
|
427
|
+
Your `_fleet/` folder stays. All agents, tasks, skills, run logs, and memory are plain markdown files in your vault.
|
|
265
428
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
429
|
+
**Q: Can multiple agents run at the same time?**
|
|
430
|
+
Yes, up to `maxConcurrentRuns` (default 2). Additional tasks queue until a slot opens.
|
|
431
|
+
|
|
432
|
+
**Q: Does the chat remember previous conversations?**
|
|
433
|
+
Yes. Each agent has persistent chat sessions that survive Obsidian restarts via Claude CLI `--resume`.
|
|
434
|
+
|
|
435
|
+
**Q: Does the Slack bot work when Obsidian is closed?**
|
|
436
|
+
No. The bot runs inside Obsidian via Socket Mode — when Obsidian is closed, the bot goes offline. Slack buffers messages briefly during short disconnects.
|
|
269
437
|
|
|
270
|
-
|
|
438
|
+
**Q: Can I use multiple agents in Slack?**
|
|
439
|
+
Yes. Type `@agent-name: message` to switch agents within a Slack thread. Each agent maintains its own session. Use `/agents` to see available agents.
|
|
440
|
+
|
|
441
|
+
**Q: What is a heartbeat?**
|
|
442
|
+
An autonomous periodic run — what an agent does on a schedule without user input. Configured via `HEARTBEAT.md` in the agent's folder. Results can be posted to a Slack channel automatically.
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
## Links
|
|
447
|
+
|
|
448
|
+
- [Releases](https://github.com/denberek/obsidian-agent-fleet/releases)
|
|
449
|
+
- [npm package](https://www.npmjs.com/package/obsidian-agent-fleet)
|
|
450
|
+
- [Report Issues](https://github.com/denberek/obsidian-agent-fleet/issues)
|
|
451
|
+
|
|
452
|
+
---
|
|
271
453
|
|
|
272
|
-
|
|
454
|
+
© 2026 Denis Berekchiyan. All rights reserved.
|
package/package.json
CHANGED
package/plugin/main.js
CHANGED
|
@@ -3677,7 +3677,8 @@ var DEFAULT_SETTINGS = {
|
|
|
3677
3677
|
maxConcurrentChannelSessions: 5,
|
|
3678
3678
|
channelIdleTimeoutMinutes: 15,
|
|
3679
3679
|
channelRateLimitPerConversation: 20,
|
|
3680
|
-
channelRateLimitWindowMinutes: 5
|
|
3680
|
+
channelRateLimitWindowMinutes: 5,
|
|
3681
|
+
defaultFileHashes: {}
|
|
3681
3682
|
};
|
|
3682
3683
|
var FLEET_SUBFOLDERS = ["agents", "skills", "tasks", "runs", "memory", "channels"];
|
|
3683
3684
|
|
|
@@ -15425,6 +15426,14 @@ function asNumber(value, fallback) {
|
|
|
15425
15426
|
function asStringArray(value) {
|
|
15426
15427
|
return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
15427
15428
|
}
|
|
15429
|
+
function simpleHash(str) {
|
|
15430
|
+
let hash = 0;
|
|
15431
|
+
for (let i = 0; i < str.length; i++) {
|
|
15432
|
+
const ch = str.charCodeAt(i);
|
|
15433
|
+
hash = (hash << 5) - hash + ch | 0;
|
|
15434
|
+
}
|
|
15435
|
+
return hash.toString(36);
|
|
15436
|
+
}
|
|
15428
15437
|
var FleetRepository = class {
|
|
15429
15438
|
constructor(vault, settings) {
|
|
15430
15439
|
this.vault = vault;
|
|
@@ -15463,6 +15472,39 @@ var FleetRepository = class {
|
|
|
15463
15472
|
await this.createFileIfMissing(fullPath, file.content);
|
|
15464
15473
|
}
|
|
15465
15474
|
}
|
|
15475
|
+
/**
|
|
15476
|
+
* Update default files that the user hasn't customized. For each default file:
|
|
15477
|
+
* - If missing on disk → write it and store the hash
|
|
15478
|
+
* - If on disk and hash matches stored hash → user hasn't touched it → overwrite
|
|
15479
|
+
* - If on disk and hash differs → user customized it → leave it alone
|
|
15480
|
+
*
|
|
15481
|
+
* Returns the updated hashes map so the caller can persist it to settings.
|
|
15482
|
+
*/
|
|
15483
|
+
async updateDefaults(storedHashes) {
|
|
15484
|
+
const root = this.getFleetRoot();
|
|
15485
|
+
const updatedHashes = { ...storedHashes };
|
|
15486
|
+
for (const file of DEFAULT_FILES) {
|
|
15487
|
+
const fullPath = (0, import_obsidian2.normalizePath)(`${root}/${file.path}`);
|
|
15488
|
+
const newHash = simpleHash(file.content);
|
|
15489
|
+
const storedHash = storedHashes[file.path];
|
|
15490
|
+
if (storedHash === newHash) continue;
|
|
15491
|
+
const existing = this.vault.getAbstractFileByPath(fullPath);
|
|
15492
|
+
if (!(existing instanceof import_obsidian2.TFile)) {
|
|
15493
|
+
const parentDir = fullPath.substring(0, fullPath.lastIndexOf("/"));
|
|
15494
|
+
await this.ensureFolder(parentDir);
|
|
15495
|
+
await this.createFileIfMissing(fullPath, file.content);
|
|
15496
|
+
updatedHashes[file.path] = newHash;
|
|
15497
|
+
continue;
|
|
15498
|
+
}
|
|
15499
|
+
const currentContent = await this.vault.cachedRead(existing);
|
|
15500
|
+
const currentHash = simpleHash(currentContent);
|
|
15501
|
+
if (!storedHash || currentHash === storedHash) {
|
|
15502
|
+
await this.vault.modify(existing, file.content);
|
|
15503
|
+
updatedHashes[file.path] = newHash;
|
|
15504
|
+
}
|
|
15505
|
+
}
|
|
15506
|
+
return updatedHashes;
|
|
15507
|
+
}
|
|
15466
15508
|
async loadAll() {
|
|
15467
15509
|
this.agents.clear();
|
|
15468
15510
|
this.skills.clear();
|
|
@@ -23054,7 +23096,7 @@ var FleetDashboardView = class extends import_obsidian12.ItemView {
|
|
|
23054
23096
|
grid,
|
|
23055
23097
|
"radio",
|
|
23056
23098
|
"No channels configured",
|
|
23057
|
-
"
|
|
23099
|
+
"Connect an agent to Slack or another chat platform"
|
|
23058
23100
|
);
|
|
23059
23101
|
return;
|
|
23060
23102
|
}
|
|
@@ -26848,6 +26890,11 @@ var AgentFleetPlugin = class extends import_obsidian14.Plugin {
|
|
|
26848
26890
|
if (isFirstRun) {
|
|
26849
26891
|
await this.repository.ensureSamples();
|
|
26850
26892
|
}
|
|
26893
|
+
const updatedHashes = await this.repository.updateDefaults(this.settings.defaultFileHashes ?? {});
|
|
26894
|
+
if (JSON.stringify(updatedHashes) !== JSON.stringify(this.settings.defaultFileHashes ?? {})) {
|
|
26895
|
+
this.settings.defaultFileHashes = updatedHashes;
|
|
26896
|
+
await this.saveData(this.settings);
|
|
26897
|
+
}
|
|
26851
26898
|
await this.runtime.initialize();
|
|
26852
26899
|
await this.verifyClaudeCli(false);
|
|
26853
26900
|
this.addRibbonIcon("bot", "Agent Fleet Dashboard", () => void this.activateDashboardView());
|