@delt/claude-alarm 0.3.1 → 0.3.4
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 +201 -181
- package/dist/dashboard/index.html +9 -9
- package/package.json +1 -1
- package/src/dashboard/index.html +9 -9
package/README.md
CHANGED
|
@@ -1,181 +1,201 @@
|
|
|
1
|
-
# claude-alarm
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
- **
|
|
16
|
-
- **
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
"
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
1
|
+
# claude-alarm
|
|
2
|
+
|
|
3
|
+
> Multi-session monitoring dashboard for Claude Code via MCP Channels
|
|
4
|
+
|
|
5
|
+
Monitor and interact with multiple Claude Code sessions from a web dashboard. Get desktop notifications when tasks complete, send messages to Claude, and track session status.
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<img src="docs/architecture.svg" alt="Architecture" width="800">
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- **Multi-Session Monitoring** — Real-time session status (idle / working / waiting)
|
|
16
|
+
- **Two-way Messaging** — Text + markdown + image exchange with Claude
|
|
17
|
+
- **Desktop Notifications** — Windows / macOS / Linux toast alerts
|
|
18
|
+
- **Token Auth** — Auto-generated secure access
|
|
19
|
+
- **Dark / Light Mode** — Theme toggle with persistence
|
|
20
|
+
- **Multi-Machine** — Remote hub access support
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
23
|
+
|
|
24
|
+
### 1. Install
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install -g @delt/claude-alarm
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. Start the Hub
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
claude-alarm hub start
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 3. Initialize Project
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
cd your-project
|
|
40
|
+
claude-alarm init
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 4. Run Claude Code
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
claude --dangerously-load-development-channels server:claude-alarm
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 5. Open Dashboard
|
|
50
|
+
|
|
51
|
+
Open `http://127.0.0.1:7900` in your browser.
|
|
52
|
+
|
|
53
|
+
## Message Flow
|
|
54
|
+
|
|
55
|
+
<p align="center">
|
|
56
|
+
<img src="docs/message-flow.svg" alt="Message Flow" width="700">
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
## Dashboard Layout
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
63
|
+
│ Claude Alarm ☽ ● Connected │
|
|
64
|
+
├──────────────┬──────────────────────┬───────────────────────┤
|
|
65
|
+
│ SESSIONS │ Messages │ NOTIFICATIONS │
|
|
66
|
+
│ │ │ │
|
|
67
|
+
│ ┌──────────┐ │ ┌─────────────────┐ │ ┌─────────────────┐ │
|
|
68
|
+
│ │ my-app │ │ │ Claude · 14:30 │ │ │ ● Task complete │ │
|
|
69
|
+
│ │ idle │ │ │ Build succeeded │ │ │ my-app · 14:30│ │
|
|
70
|
+
│ └──────────┘ │ └─────────────────┘ │ └─────────────────┘ │
|
|
71
|
+
│ ┌──────────┐ │ │ ┌─────────────────┐ │
|
|
72
|
+
│ │ api-svc │ │ ┌────────────┐ │ │ ● Error found │ │
|
|
73
|
+
│ │ working │ │ │ You · 14:31│ │ │ api-svc · 14:2│ │
|
|
74
|
+
│ └──────────┘ │ │ Fix the bug│ │ └─────────────────┘ │
|
|
75
|
+
│ ┌──────────┐ │ └────────────┘ │ │
|
|
76
|
+
│ │ frontend │ │ │ │
|
|
77
|
+
│ │ waiting │ │ │ │
|
|
78
|
+
│ └──────────┘ │ │ │
|
|
79
|
+
├──────────────┴──────────────────────┴───────────────────────┤
|
|
80
|
+
│ 📎 [Message input... Shift+Enter ↵] [ Send ] │
|
|
81
|
+
└─────────────────────────────────────────────────────────────┘
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## CLI Commands
|
|
85
|
+
|
|
86
|
+
| Command | Description |
|
|
87
|
+
|---------|-------------|
|
|
88
|
+
| `claude-alarm init` | Setup project and show next steps |
|
|
89
|
+
| `claude-alarm hub start [-d]` | Start hub server (`-d` for daemon) |
|
|
90
|
+
| `claude-alarm hub stop` | Stop hub daemon |
|
|
91
|
+
| `claude-alarm hub status` | Show hub status |
|
|
92
|
+
| `claude-alarm token` | Show auth token |
|
|
93
|
+
| `claude-alarm test` | Send test notification |
|
|
94
|
+
|
|
95
|
+
## Tools Available to Claude
|
|
96
|
+
|
|
97
|
+
| Tool | Description |
|
|
98
|
+
|------|-------------|
|
|
99
|
+
| `notify` | Send a desktop notification (title, message, level) |
|
|
100
|
+
| `reply` | Send a message to the dashboard |
|
|
101
|
+
| `status` | Update session status (idle, working, waiting_input) |
|
|
102
|
+
|
|
103
|
+
## Configuration
|
|
104
|
+
|
|
105
|
+
Config stored at `~/.claude-alarm/config.json`:
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"hub": {
|
|
110
|
+
"host": "127.0.0.1",
|
|
111
|
+
"port": 7900,
|
|
112
|
+
"token": "auto-generated-uuid"
|
|
113
|
+
},
|
|
114
|
+
"notifications": {
|
|
115
|
+
"desktop": true,
|
|
116
|
+
"sound": true
|
|
117
|
+
},
|
|
118
|
+
"webhooks": []
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Custom Session Names
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"mcpServers": {
|
|
127
|
+
"claude-alarm": {
|
|
128
|
+
"command": "npx",
|
|
129
|
+
"args": ["-y", "@delt/claude-alarm", "serve"],
|
|
130
|
+
"env": {
|
|
131
|
+
"CLAUDE_ALARM_SESSION_NAME": "my-project"
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Webhooks
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"webhooks": [
|
|
143
|
+
{
|
|
144
|
+
"url": "https://hooks.slack.com/services/...",
|
|
145
|
+
"headers": { "Content-Type": "application/json" }
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Remote Access
|
|
152
|
+
|
|
153
|
+
<p align="center">
|
|
154
|
+
<img src="docs/remote-access.svg" alt="Remote Access" width="600">
|
|
155
|
+
</p>
|
|
156
|
+
|
|
157
|
+
1. Set host to `0.0.0.0` in `~/.claude-alarm/config.json`
|
|
158
|
+
2. Open port 7900 in your firewall
|
|
159
|
+
3. On remote machine: `claude-alarm init` → select remote hub (Y)
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"mcpServers": {
|
|
164
|
+
"claude-alarm": {
|
|
165
|
+
"command": "npx",
|
|
166
|
+
"args": ["-y", "@delt/claude-alarm", "serve"],
|
|
167
|
+
"env": {
|
|
168
|
+
"CLAUDE_ALARM_HUB_HOST": "your-server-ip",
|
|
169
|
+
"CLAUDE_ALARM_HUB_PORT": "7900",
|
|
170
|
+
"CLAUDE_ALARM_HUB_TOKEN": "your-token"
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Image Upload (Local Sessions)
|
|
178
|
+
|
|
179
|
+
Send images to Claude via the dashboard:
|
|
180
|
+
- **Ctrl+V** — Paste from clipboard
|
|
181
|
+
- **Drag & Drop** — Drop image onto message area
|
|
182
|
+
- **Attach button** — Click 📎 to browse files
|
|
183
|
+
|
|
184
|
+
> Images are only available for local sessions (same machine as Hub). Max 10MB, auto-deleted after 5 minutes.
|
|
185
|
+
|
|
186
|
+
## Platform Support
|
|
187
|
+
|
|
188
|
+
| Platform | Notifications | Engine |
|
|
189
|
+
|----------|:---:|--------|
|
|
190
|
+
| Windows | ✓ | SnoreToast |
|
|
191
|
+
| macOS | ✓ | terminal-notifier |
|
|
192
|
+
| Linux | ✓ | notify-send |
|
|
193
|
+
|
|
194
|
+
## Requirements
|
|
195
|
+
|
|
196
|
+
- Node.js >= 18
|
|
197
|
+
- Claude Code with MCP Channels support
|
|
198
|
+
|
|
199
|
+
## License
|
|
200
|
+
|
|
201
|
+
MIT
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
--border: #2a2d3a;
|
|
12
12
|
--text: #e1e4ed;
|
|
13
13
|
--text-dim: #8b8fa3;
|
|
14
|
-
--accent: #
|
|
15
|
-
--accent-dim: #
|
|
14
|
+
--accent: #e0a86d;
|
|
15
|
+
--accent-dim: #c48d52;
|
|
16
16
|
--green: #3dd68c;
|
|
17
|
-
--yellow: #
|
|
17
|
+
--yellow: #f59e0b;
|
|
18
18
|
--red: #ef4444;
|
|
19
19
|
--blue: #60a5fa;
|
|
20
20
|
}
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
--border: #d1d5db;
|
|
25
25
|
--text: #1f2937;
|
|
26
26
|
--text-dim: #6b7280;
|
|
27
|
-
--accent: #
|
|
28
|
-
--accent-dim: #
|
|
27
|
+
--accent: #c48d52;
|
|
28
|
+
--accent-dim: #a87642;
|
|
29
29
|
--green: #22c55e;
|
|
30
|
-
--yellow: #
|
|
30
|
+
--yellow: #d97706;
|
|
31
31
|
--red: #ef4444;
|
|
32
32
|
--blue: #3b82f6;
|
|
33
33
|
}
|
|
@@ -172,8 +172,8 @@
|
|
|
172
172
|
border: 1px solid var(--border);
|
|
173
173
|
}
|
|
174
174
|
.message.from-dashboard {
|
|
175
|
-
background: rgba(
|
|
176
|
-
border: 1px solid rgba(
|
|
175
|
+
background: rgba(224,168,109,0.12);
|
|
176
|
+
border: 1px solid rgba(224,168,109,0.25);
|
|
177
177
|
margin-left: auto;
|
|
178
178
|
}
|
|
179
179
|
.message-meta {
|
|
@@ -223,7 +223,7 @@
|
|
|
223
223
|
.drag-overlay {
|
|
224
224
|
position: absolute;
|
|
225
225
|
inset: 0;
|
|
226
|
-
background: rgba(
|
|
226
|
+
background: rgba(224,168,109,0.15);
|
|
227
227
|
border: 2px dashed var(--accent);
|
|
228
228
|
border-radius: 8px;
|
|
229
229
|
display: none;
|
package/package.json
CHANGED
package/src/dashboard/index.html
CHANGED
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
--border: #2a2d3a;
|
|
12
12
|
--text: #e1e4ed;
|
|
13
13
|
--text-dim: #8b8fa3;
|
|
14
|
-
--accent: #
|
|
15
|
-
--accent-dim: #
|
|
14
|
+
--accent: #e0a86d;
|
|
15
|
+
--accent-dim: #c48d52;
|
|
16
16
|
--green: #3dd68c;
|
|
17
|
-
--yellow: #
|
|
17
|
+
--yellow: #f59e0b;
|
|
18
18
|
--red: #ef4444;
|
|
19
19
|
--blue: #60a5fa;
|
|
20
20
|
}
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
--border: #d1d5db;
|
|
25
25
|
--text: #1f2937;
|
|
26
26
|
--text-dim: #6b7280;
|
|
27
|
-
--accent: #
|
|
28
|
-
--accent-dim: #
|
|
27
|
+
--accent: #c48d52;
|
|
28
|
+
--accent-dim: #a87642;
|
|
29
29
|
--green: #22c55e;
|
|
30
|
-
--yellow: #
|
|
30
|
+
--yellow: #d97706;
|
|
31
31
|
--red: #ef4444;
|
|
32
32
|
--blue: #3b82f6;
|
|
33
33
|
}
|
|
@@ -172,8 +172,8 @@
|
|
|
172
172
|
border: 1px solid var(--border);
|
|
173
173
|
}
|
|
174
174
|
.message.from-dashboard {
|
|
175
|
-
background: rgba(
|
|
176
|
-
border: 1px solid rgba(
|
|
175
|
+
background: rgba(224,168,109,0.12);
|
|
176
|
+
border: 1px solid rgba(224,168,109,0.25);
|
|
177
177
|
margin-left: auto;
|
|
178
178
|
}
|
|
179
179
|
.message-meta {
|
|
@@ -223,7 +223,7 @@
|
|
|
223
223
|
.drag-overlay {
|
|
224
224
|
position: absolute;
|
|
225
225
|
inset: 0;
|
|
226
|
-
background: rgba(
|
|
226
|
+
background: rgba(224,168,109,0.15);
|
|
227
227
|
border: 2px dashed var(--accent);
|
|
228
228
|
border-radius: 8px;
|
|
229
229
|
display: none;
|