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 CHANGED
@@ -1,157 +1,286 @@
1
1
  # Agent Fleet for Obsidian
2
2
 
3
- **File-backed AI agents, task scheduling, and interactive chat — all inside Obsidian.**
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 lets you create, configure, and run AI agents directly from your Obsidian vault. Every agent, skill, task, and run log is a markdown file with YAML frontmatter. If the plugin disappears, your knowledge stays.
5
+ ![Agent Fleet Dashboard](screenshot.png)
6
6
 
7
- ## Key Features
7
+ ---
8
8
 
9
- - **Interactive Chat** chat with agents in a side panel with streaming markdown responses
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
- ## Requirements
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
- - **Obsidian** 1.6.0 or later (desktop only)
22
- - **[Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code)** installed and authenticated
23
- ```bash
24
- npm install -g @anthropic-ai/claude-code
25
- claude # authenticate on first run
26
- ```
27
- - **Claude Max subscription** or Anthropic API key (for Claude Code CLI)
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
- ## Installation
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
- ### Via BRAT (recommended auto-updates)
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
- 1. Install the [BRAT plugin](https://github.com/TfTHacker/obsidian42-brat) from Community Plugins
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
- ### Manual Install
27
+ 🧠 **Agent Memory** — Agents persist context across sessions using `[REMEMBER]` tags stored as markdown.
39
28
 
40
- 1. Download `main.js`, `manifest.json`, and `styles.css` from the [latest release](https://github.com/denberek/obsidian-agent-fleet/releases)
41
- 2. Create folder: `<your-vault>/.obsidian/plugins/agent-fleet/`
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 → Settings → Community Plugins → Enable **Agent Fleet**
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
- ## First Launch
64
+ ### First Launch
46
65
 
47
- On first launch, Agent Fleet creates a `_fleet/` folder in your vault root with:
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 (knows how to manage the fleet)
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 to use — click **Chat** to ask it to create new agents, tasks, or skills.
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
- ## How It Works
91
+ ## Features
62
92
 
63
93
  ### Agents
64
94
 
65
- Each agent is a folder in `_fleet/agents/<name>/` with these files:
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
- | File | Purpose |
68
- |------|---------|
69
- | `agent.md` | Identity, description, system prompt, skill assignments |
70
- | `config.md` | Model, timeout, permission mode, working directory |
71
- | `CONTEXT.md` | Project-specific context (optional) |
72
- | `SKILLS.md` | Agent-specific skills not shared with others (optional) |
73
- | `permissions.json` | Claude Code allow/deny rules (optional) |
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
- tags: [monitoring]
83
- skills:
84
- - agent-fleet-system
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
- You are a website monitoring agent. Check the specified URL,
88
- report its HTTP status code, response time, and any errors.
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
- ### Skills
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
- Reusable instruction sets in `_fleet/skills/<name>/`:
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
- Agents reference skills by name in their `agent.md` frontmatter. Multiple agents can share the same skill.
162
+ ### Slack Channels
103
163
 
104
- ### Tasks
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
- Scheduled or one-shot tasks in `_fleet/tasks/<name>.md`:
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
- task_id: check-website
111
- agent: site-monitor
112
- schedule: "0 * * * *" # every hour
113
- type: recurring
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
- **Task types:**
121
- - `recurring`runs on a cron schedule
122
- - `once`runs at a specific time (`run_at` field)
123
- - `immediate` runs once on creation
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
- ### Chat
201
+ **Important:** Obsidian must be running for channels to work. When Obsidian is closed, the bot goes offline.
126
202
 
127
- Click **Chat** on any agent to open an interactive conversation panel. Features:
203
+ ---
128
204
 
129
- - **Streaming responses** — text appears in real-time as the agent works
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
- ### Run History
207
+ The chat panel is a first-class Obsidian view — dock it in the sidebar, center, or any split.
138
208
 
139
- Every execution (scheduled or manual) is logged in `_fleet/runs/YYYY-MM-DD/` with:
140
- - Status (success, failure, timeout, cancelled, pending_approval)
141
- - Duration, token count, model used
142
- - Full prompt and output
143
- - Tools used with commands
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
- ### Agent Memory
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
- [REMEMBER]Something important to remember[/REMEMBER]
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
- These entries are appended to `_fleet/memory/<agent-name>.md` and included in future prompts.
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
- | `theme-factory` | Apply visual themes to artifacts |
172
- | `web-artifacts-builder` | Multi-component HTML artifacts with React/Tailwind |
173
- | `webapp-testing` | Test web apps with Playwright |
174
- | `xlsx` | Create, read, edit spreadsheet files |
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
- ## Dashboard
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
- The dashboard provides:
317
+ **Sidebar navigation:**
318
+ - Dashboard / Agents / Tasks Board / Run History / Approvals / Skills / MCP Servers / Channels
179
319
 
180
- - **Overview** agent status cards with run charts
181
- - **Agents** manage agents with enable/disable toggles
182
- - **Tasks Board** kanban view of pending, completed, and failed runs
183
- - **Run History** searchable table of all executions
184
- - **Skills Library** — browse and manage shared skills
185
- - **Approvals** — review and approve/reject pending tool uses
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
- | Max Concurrent Runs | `3` | Parallel execution limit |
197
- | Run Log Retention | `30` days | Auto-cleanup old run logs |
198
- | Catch Up Missed Tasks | `true` | Run missed tasks on startup |
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
- ### Agent Permission Modes
387
+ ### Channel Settings
202
388
 
203
- | Mode | Behavior |
204
- |------|----------|
205
- | `bypassPermissions` | Auto-runs everything except deny list |
206
- | `dontAsk` | Only allow-listed commands run |
207
- | `acceptEdits` | File edits auto-approved |
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
- ## Architecture
395
+ ### File Structure
396
+
397
+ All data lives in `_fleet/` as plain markdown:
211
398
 
212
399
  ```
213
- src/
214
- ├── main.ts Plugin entry point
215
- ├── defaults.ts Embedded default agents + skills
216
- ├── fleetRepository.ts File I/O and vault management
217
- ├── types.ts TypeScript interfaces
218
- ├── constants.ts View types and defaults
219
- ├── settingsTab.ts Plugin settings UI
220
- ├── services/
221
- │ ├── chatSession.ts Interactive chat with --resume
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
- ## Development
411
+ Everything is searchable, version-controllable, and fully yours.
245
412
 
246
- ```bash
247
- # Clone
248
- git clone https://github.com/denberek/obsidian-agent-fleet.git
249
- cd obsidian-agent-fleet
413
+ ---
250
414
 
251
- # Install dependencies
252
- npm install
415
+ ## FAQ
253
416
 
254
- # Development build (watches for changes)
255
- npm run dev
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
- # Production build
258
- npm run build
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
- # Type check
261
- npx tsc --noEmit
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
- # Run tests
264
- npm test
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
- # Symlink to vault for development
267
- ln -s $(pwd) ~/path-to-vault/.obsidian/plugins/agent-fleet
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
- ## License
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
- MIT
454
+ © 2026 Denis Berekchiyan. All rights reserved.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-agent-fleet",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Obsidian plugin for file-backed AI agents, task scheduling, channels (Slack), heartbeat, and interactive chat.",
5
5
  "main": "plugin/main.js",
6
6
  "bin": {
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
- "Create a file under _fleet/channels/ to wire an agent to Slack"
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());
package/plugin/styles.css CHANGED
@@ -2242,6 +2242,8 @@
2242
2242
  justify-content: center;
2243
2243
  padding: 60px 20px;
2244
2244
  color: var(--af-text-muted);
2245
+ grid-column: 1 / -1;
2246
+ text-align: center;
2245
2247
  }
2246
2248
 
2247
2249
  .af-empty-icon {