Refactor README and project structure
Major changes: - Simplify README with clearer setup guide and single-step instructions - Add changelog section with contributor mentions for all PRs - Create practical TODO list focusing on key features - Move demo images to assets folder for better organization - Remove separate email reply guides, merge content into main README - Create ROADMAP.md for detailed future feature planning - Remove temporary data files from tracking This makes the project more approachable for new users while maintaining comprehensive documentation for advanced features. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
0eb01e6e75
commit
3d2a26286c
|
|
@ -1,156 +0,0 @@
|
||||||
# TaskPing Email Reply Feature Guide
|
|
||||||
|
|
||||||
**English** | [中文](./HOW_TO_USE_EMAIL_REPLY_ZH.md)
|
|
||||||
|
|
||||||
## 📋 Complete Usage Workflow
|
|
||||||
|
|
||||||
### Step 1: Start Email Listening Service
|
|
||||||
Run in Terminal 1:
|
|
||||||
```bash
|
|
||||||
cd /Users/jessytsui/dev/TaskPing
|
|
||||||
npm run relay:pty
|
|
||||||
```
|
|
||||||
|
|
||||||
This will start the email listening service, monitoring replies to `noreply@example.com`.
|
|
||||||
|
|
||||||
### Step 2: Start Claude Code and Integrate TaskPing
|
|
||||||
Run in Terminal 2:
|
|
||||||
```bash
|
|
||||||
# Start Claude Code
|
|
||||||
claude
|
|
||||||
|
|
||||||
# Use TaskPing in Claude Code to send email notifications
|
|
||||||
# Example: Email notifications will be sent automatically when tasks complete
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 3: Configure Claude Code Hooks (if not configured)
|
|
||||||
Run in Claude Code:
|
|
||||||
```bash
|
|
||||||
# View current hook configuration
|
|
||||||
cat ~/.config/claude-code/settings/hooks.json
|
|
||||||
|
|
||||||
# If not configured, set up TaskPing hooks
|
|
||||||
# Copy TaskPing's hook configuration file
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📧 Email Reply Test Workflow
|
|
||||||
|
|
||||||
### Method 1: Manual Email Test
|
|
||||||
```bash
|
|
||||||
# Run in TaskPing directory
|
|
||||||
node test-smtp-token.js
|
|
||||||
```
|
|
||||||
|
|
||||||
This will send a test email to `user@example.com` with a subject containing Token format:
|
|
||||||
`[TaskPing #XXXXXXXX] Claude Code Task Completed - TaskPing-Token-Test`
|
|
||||||
|
|
||||||
### Method 2: Integration Test
|
|
||||||
1. Execute a task in Claude Code
|
|
||||||
2. After task completion, TaskPing will automatically send email notification
|
|
||||||
3. Email will be sent to configured mailbox (`user@example.com`)
|
|
||||||
|
|
||||||
## 💌 How to Reply to Send Commands
|
|
||||||
|
|
||||||
### After Receiving Email:
|
|
||||||
1. Receive email at `user@example.com` with subject like:
|
|
||||||
```
|
|
||||||
[TaskPing #A53PXR7F] Claude Code Task Completed - Project Name
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Reply directly to the email** with commands in the body:
|
|
||||||
```
|
|
||||||
Continue optimizing code
|
|
||||||
```
|
|
||||||
or
|
|
||||||
```
|
|
||||||
Generate unit tests
|
|
||||||
```
|
|
||||||
or
|
|
||||||
```
|
|
||||||
Explain the purpose of this function
|
|
||||||
```
|
|
||||||
|
|
||||||
3. After sending reply, the email listening service will:
|
|
||||||
- Receive the reply email
|
|
||||||
- Extract the Token (A53PXR7F)
|
|
||||||
- Find corresponding PTY session
|
|
||||||
- Inject command into Claude Code CLI
|
|
||||||
|
|
||||||
## 🔧 Configuration File Description
|
|
||||||
|
|
||||||
### .env Configuration
|
|
||||||
```env
|
|
||||||
# Outgoing Mail Configuration (Feishu Email)
|
|
||||||
SMTP_HOST=smtp.feishu.cn
|
|
||||||
SMTP_USER=noreply@example.com
|
|
||||||
SMTP_PASS=your-smtp-password
|
|
||||||
|
|
||||||
# Incoming Mail Configuration (Feishu Email)
|
|
||||||
IMAP_HOST=imap.feishu.cn
|
|
||||||
IMAP_USER=noreply@example.com
|
|
||||||
IMAP_PASS=your-imap-password
|
|
||||||
|
|
||||||
# User Notification Email
|
|
||||||
EMAIL_TO=user@example.com
|
|
||||||
|
|
||||||
# Allowed Command Senders (Security Whitelist)
|
|
||||||
ALLOWED_SENDERS=user@example.com
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🐛 Troubleshooting
|
|
||||||
|
|
||||||
### 1. Not Receiving Email Replies
|
|
||||||
Check:
|
|
||||||
- Email listening service is running (`npm run relay:pty`)
|
|
||||||
- Reply is sent from whitelisted email (`user@example.com`)
|
|
||||||
- Email subject contains correct Token format
|
|
||||||
|
|
||||||
### 2. Commands Not Injected into Claude Code
|
|
||||||
Check:
|
|
||||||
- Claude Code is still running
|
|
||||||
- PTY session is still valid (Token not expired)
|
|
||||||
- Check service log output
|
|
||||||
|
|
||||||
### 3. View Debug Logs
|
|
||||||
```bash
|
|
||||||
# View detailed email listening logs
|
|
||||||
DEBUG=true npm run relay:pty
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📱 Supported Email Clients
|
|
||||||
|
|
||||||
Users can reply from any email to `noreply@example.com`:
|
|
||||||
- ✅ Gmail Web/Client
|
|
||||||
- ✅ Mobile Gmail App
|
|
||||||
- ✅ Apple Mail
|
|
||||||
- ✅ Outlook
|
|
||||||
- ✅ QQ Mail
|
|
||||||
- ✅ 163 Mail
|
|
||||||
- ✅ Any SMTP-supported email
|
|
||||||
|
|
||||||
## 🔒 Security Features
|
|
||||||
|
|
||||||
1. **Token Verification**: Each session has unique Token to prevent misoperation
|
|
||||||
2. **Sender Whitelist**: Only authorized emails can send commands
|
|
||||||
3. **Session Expiry**: Token valid for 24 hours
|
|
||||||
4. **Command Filtering**: Automatically filters potentially dangerous commands
|
|
||||||
|
|
||||||
## 🎯 Real-world Use Cases
|
|
||||||
|
|
||||||
### Scenario 1: Long Build Process
|
|
||||||
```
|
|
||||||
1. Start project build in Claude Code
|
|
||||||
2. Leave computer, receive build completion email on phone
|
|
||||||
3. Reply directly from phone: "Continue deployment to production"
|
|
||||||
4. Deployment completed when returning to computer
|
|
||||||
```
|
|
||||||
|
|
||||||
### Scenario 2: Code Review
|
|
||||||
```
|
|
||||||
1. Claude Code completes code generation
|
|
||||||
2. Receive email notification
|
|
||||||
3. Reply: "Please add unit tests and documentation"
|
|
||||||
4. Claude automatically generates tests and docs
|
|
||||||
```
|
|
||||||
|
|
||||||
This enables true remote control of Claude Code!
|
|
||||||
|
|
@ -1,156 +0,0 @@
|
||||||
# TaskPing 邮件回复功能使用指南
|
|
||||||
|
|
||||||
[English](./HOW_TO_USE_EMAIL_REPLY.md) | **中文**
|
|
||||||
|
|
||||||
## 📋 完整使用流程
|
|
||||||
|
|
||||||
### 步骤1:启动邮件监听服务
|
|
||||||
在终端1中运行:
|
|
||||||
```bash
|
|
||||||
cd /Users/jessytsui/dev/TaskPing
|
|
||||||
npm run relay:pty
|
|
||||||
```
|
|
||||||
|
|
||||||
这会启动邮件监听服务,监听 `noreply@example.com` 收到的回复邮件。
|
|
||||||
|
|
||||||
### 步骤2:启动Claude Code并集成TaskPing
|
|
||||||
在终端2中运行:
|
|
||||||
```bash
|
|
||||||
# 启动Claude Code
|
|
||||||
claude
|
|
||||||
|
|
||||||
# 在Claude Code中使用TaskPing发送邮件通知
|
|
||||||
# 例如:当任务完成时会自动发送邮件
|
|
||||||
```
|
|
||||||
|
|
||||||
### 步骤3:配置Claude Code钩子(如果还没配置)
|
|
||||||
在Claude Code中运行:
|
|
||||||
```bash
|
|
||||||
# 查看当前钩子配置
|
|
||||||
cat ~/.config/claude-code/settings/hooks.json
|
|
||||||
|
|
||||||
# 如果没有配置,需要设置TaskPing钩子
|
|
||||||
# 复制TaskPing的钩子配置文件
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📧 邮件回复测试流程
|
|
||||||
|
|
||||||
### 方法1:手动测试发送邮件
|
|
||||||
```bash
|
|
||||||
# 在TaskPing目录中运行
|
|
||||||
node test-smtp-token.js
|
|
||||||
```
|
|
||||||
|
|
||||||
这会发送一封测试邮件到 `user@example.com`,邮件主题包含Token格式:
|
|
||||||
`[TaskPing #XXXXXXXX] Claude Code 任务完成 - TaskPing-Token-Test`
|
|
||||||
|
|
||||||
### 方法2:实际集成测试
|
|
||||||
1. 在Claude Code中执行一个任务
|
|
||||||
2. 任务完成后,TaskPing会自动发送邮件通知
|
|
||||||
3. 邮件会发送到配置的邮箱(`user@example.com`)
|
|
||||||
|
|
||||||
## 💌 如何回复邮件发送命令
|
|
||||||
|
|
||||||
### 收到邮件后:
|
|
||||||
1. 在 `user@example.com` 收到邮件,主题如:
|
|
||||||
```
|
|
||||||
[TaskPing #A53PXR7F] Claude Code 任务完成 - 项目名
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **直接回复邮件**,在正文中输入命令:
|
|
||||||
```
|
|
||||||
继续优化代码
|
|
||||||
```
|
|
||||||
或
|
|
||||||
```
|
|
||||||
生成单元测试
|
|
||||||
```
|
|
||||||
或
|
|
||||||
```
|
|
||||||
解释这个函数的作用
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 发送回复后,邮件监听服务会:
|
|
||||||
- 收到回复邮件
|
|
||||||
- 提取Token(A53PXR7F)
|
|
||||||
- 找到对应的PTY会话
|
|
||||||
- 将命令注入到Claude Code CLI
|
|
||||||
|
|
||||||
## 🔧 配置文件说明
|
|
||||||
|
|
||||||
### .env 配置
|
|
||||||
```env
|
|
||||||
# 发件配置(飞书邮箱)
|
|
||||||
SMTP_HOST=smtp.feishu.cn
|
|
||||||
SMTP_USER=noreply@example.com
|
|
||||||
SMTP_PASS=kKgS3tNReRTL3RQC
|
|
||||||
|
|
||||||
# 收件配置(飞书邮箱)
|
|
||||||
IMAP_HOST=imap.feishu.cn
|
|
||||||
IMAP_USER=noreply@example.com
|
|
||||||
IMAP_PASS=kKgS3tNReRTL3RQC
|
|
||||||
|
|
||||||
# 用户通知邮箱
|
|
||||||
EMAIL_TO=user@example.com
|
|
||||||
|
|
||||||
# 允许发送命令的邮箱(安全白名单)
|
|
||||||
ALLOWED_SENDERS=user@example.com
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🐛 故障排除
|
|
||||||
|
|
||||||
### 1. 收不到邮件回复
|
|
||||||
检查:
|
|
||||||
- 邮件监听服务是否正在运行(`npm run relay:pty`)
|
|
||||||
- 是否从白名单邮箱(`user@example.com`)发送回复
|
|
||||||
- 邮件主题是否包含正确的Token格式
|
|
||||||
|
|
||||||
### 2. 命令没有注入到Claude Code
|
|
||||||
检查:
|
|
||||||
- Claude Code是否还在运行
|
|
||||||
- PTY会话是否还有效(Token未过期)
|
|
||||||
- 检查服务日志输出
|
|
||||||
|
|
||||||
### 3. 查看调试日志
|
|
||||||
```bash
|
|
||||||
# 查看详细的邮件监听日志
|
|
||||||
DEBUG=true npm run relay:pty
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📱 支持的邮件客户端
|
|
||||||
|
|
||||||
用户可以从任意邮箱回复到 `noreply@example.com`:
|
|
||||||
- ✅ Gmail 网页版/客户端
|
|
||||||
- ✅ 手机Gmail APP
|
|
||||||
- ✅ Apple Mail
|
|
||||||
- ✅ Outlook
|
|
||||||
- ✅ QQ邮箱
|
|
||||||
- ✅ 163邮箱
|
|
||||||
- ✅ 任何支持SMTP的邮箱
|
|
||||||
|
|
||||||
## 🔒 安全特性
|
|
||||||
|
|
||||||
1. **Token验证**:每个会话有唯一Token,防止误操作
|
|
||||||
2. **发件人白名单**:只有授权邮箱可以发送命令
|
|
||||||
3. **会话过期**:Token有24小时有效期
|
|
||||||
4. **命令过滤**:自动过滤潜在危险命令
|
|
||||||
|
|
||||||
## 🎯 实际使用场景
|
|
||||||
|
|
||||||
### 场景1:长时间构建
|
|
||||||
```
|
|
||||||
1. 在Claude Code中启动项目构建
|
|
||||||
2. 离开电脑,在手机收到构建完成邮件
|
|
||||||
3. 手机直接回复:"继续部署到生产环境"
|
|
||||||
4. 回到电脑时部署已完成
|
|
||||||
```
|
|
||||||
|
|
||||||
### 场景2:代码审查
|
|
||||||
```
|
|
||||||
1. Claude Code完成代码生成
|
|
||||||
2. 收到邮件通知
|
|
||||||
3. 回复:"请添加单元测试和文档"
|
|
||||||
4. Claude自动生成测试和文档
|
|
||||||
```
|
|
||||||
|
|
||||||
这样就可以实现真正的远程控制Claude Code了!
|
|
||||||
238
README.md
238
README.md
|
|
@ -7,7 +7,7 @@ Control [Claude Code](https://claude.ai/code) remotely via email. Start tasks lo
|
||||||
### 🎥 Watch Demo Video
|
### 🎥 Watch Demo Video
|
||||||
|
|
||||||
<a href="https://youtu.be/_yrNlDYOJhw">
|
<a href="https://youtu.be/_yrNlDYOJhw">
|
||||||
<img src="./CCRemote_demo.png" alt="Claude Code Remote Demo" width="100%">
|
<img src="./assets/CCRemote_demo.png" alt="Claude Code Remote Demo" width="100%">
|
||||||
<br>
|
<br>
|
||||||
<img src="https://img.shields.io/badge/▶-Watch%20on%20YouTube-red?style=for-the-badge&logo=youtube" alt="Watch on YouTube">
|
<img src="https://img.shields.io/badge/▶-Watch%20on%20YouTube-red?style=for-the-badge&logo=youtube" alt="Watch on YouTube">
|
||||||
</a>
|
</a>
|
||||||
|
|
@ -18,15 +18,48 @@ Control [Claude Code](https://claude.ai/code) remotely via email. Start tasks lo
|
||||||
|
|
||||||
## ✨ Features
|
## ✨ Features
|
||||||
|
|
||||||
- **📧 Email Notifications**: Get notified when Claude completes tasks
|
- **📧 Email Notifications**: Get notified when Claude completes tasks 
|
||||||
- **🔄 Email Control**: Reply to emails to send new commands to Claude
|
- **🔄 Email Control**: Reply to emails to send new commands to Claude
|
||||||
- **📱 Remote Access**: Control Claude from anywhere with just email
|
- **📱 Remote Access**: Control Claude from anywhere with just email
|
||||||
- **🔒 Secure**: Whitelist-based sender verification
|
- **🔒 Secure**: Whitelist-based sender verification
|
||||||
- **📋 Multi-line Support**: Send complex commands with formatting
|
- **📋 Multi-line Support**: Send complex commands with formatting
|
||||||
|
|
||||||
## 🚀 Quick Start
|
|
||||||
|
|
||||||
### 1. Install
|
## 📅 Changelog
|
||||||
|
|
||||||
|
### January 2025
|
||||||
|
- **2025-01-15**: Implement terminal-style UI for email notifications ([#8](https://github.com/JessyTsui/Claude-Code-Remote/pull/8) by [@vaclisinc](https://github.com/vaclisinc))
|
||||||
|
- **2025-01-15**: Fix working directory issue - enable claude-remote to run from any directory ([#7](https://github.com/JessyTsui/Claude-Code-Remote/pull/7) by [@vaclisinc](https://github.com/vaclisinc))
|
||||||
|
- **2025-01-14**: Fix self-reply loop issue when using same email for send/receive ([#4](https://github.com/JessyTsui/Claude-Code-Remote/pull/4) by [@vaclisinc](https://github.com/vaclisinc))
|
||||||
|
|
||||||
|
### July 2025
|
||||||
|
- **2025-07-28**: Remove hardcoded values and implement environment-based configuration ([#2](https://github.com/JessyTsui/Claude-Code-Remote/pull/2) by [@kevinsslin](https://github.com/kevinsslin))
|
||||||
|
|
||||||
|
## 📋 TODO List
|
||||||
|
|
||||||
|
### Notification Channels
|
||||||
|
- [ ] **Discord & Telegram**: Bot integration for messaging platforms
|
||||||
|
- [ ] **Slack Workflow**: Native Slack app with slash commands
|
||||||
|
|
||||||
|
### Developer Tools
|
||||||
|
- [ ] **AI Tools**: Support for Gemini CLI, Cursor, and other AI tools
|
||||||
|
- [ ] **Git Automation**: Auto-commit, PR creation, branch management
|
||||||
|
|
||||||
|
### Usage Analytics
|
||||||
|
- [ ] **Cost Tracking**: Token usage and estimated costs
|
||||||
|
- [ ] **Performance Metrics**: Execution time and resource usage
|
||||||
|
- [ ] **Scheduled Reports**: Daily/weekly usage summaries via email
|
||||||
|
|
||||||
|
### Native Apps
|
||||||
|
- [ ] **Mobile Apps**: iOS and Android applications
|
||||||
|
- [ ] **Desktop Apps**: macOS and Windows native clients
|
||||||
|
|
||||||
|
|
||||||
|
## 🚀 Setup Guide
|
||||||
|
|
||||||
|
Follow these steps to get Claude Code Remote running:
|
||||||
|
|
||||||
|
### Step 1: Clone and Install Dependencies
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/JessyTsui/Claude-Code-Remote.git
|
git clone https://github.com/JessyTsui/Claude-Code-Remote.git
|
||||||
|
|
@ -34,32 +67,52 @@ cd Claude-Code-Remote
|
||||||
npm install
|
npm install
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Configure Email
|
### Step 2: Configure Email Settings
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Copy example config
|
# Copy the example configuration
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
|
|
||||||
# Edit with your email credentials
|
# Open .env in your editor
|
||||||
nano .env
|
nano .env # or use vim, code, etc.
|
||||||
```
|
```
|
||||||
|
|
||||||
**Required settings:**
|
Edit the `.env` file with your email credentials:
|
||||||
|
|
||||||
```env
|
```env
|
||||||
|
# Email account for sending notifications
|
||||||
SMTP_USER=your-email@gmail.com
|
SMTP_USER=your-email@gmail.com
|
||||||
SMTP_PASS=your-app-password
|
SMTP_PASS=your-app-password # Gmail: use App Password, not regular password
|
||||||
|
|
||||||
|
# Email account for receiving replies (can be same as SMTP)
|
||||||
IMAP_USER=your-email@gmail.com
|
IMAP_USER=your-email@gmail.com
|
||||||
IMAP_PASS=your-app-password
|
IMAP_PASS=your-app-password
|
||||||
|
|
||||||
|
# Where to send notifications
|
||||||
EMAIL_TO=your-notification-email@gmail.com
|
EMAIL_TO=your-notification-email@gmail.com
|
||||||
|
|
||||||
|
# Who can send commands (security whitelist)
|
||||||
ALLOWED_SENDERS=your-notification-email@gmail.com
|
ALLOWED_SENDERS=your-notification-email@gmail.com
|
||||||
SESSION_MAP_PATH=/your/path/to/Claude-Code-Remote/src/data/session-map.json
|
|
||||||
|
# Path to session data (use absolute path)
|
||||||
|
SESSION_MAP_PATH=/your/absolute/path/to/Claude-Code-Remote/src/data/session-map.json
|
||||||
```
|
```
|
||||||
|
|
||||||
📌 **Gmail users**: Use [App Passwords](https://myaccount.google.com/security), not your regular password.
|
📌 **Gmail users**: Create an [App Password](https://myaccount.google.com/security) instead of using your regular password.
|
||||||
|
|
||||||
### 3. Configure Claude Code Hooks
|
### Step 3: Set Up Claude Code Hooks
|
||||||
|
|
||||||
Add to `~/.claude/settings.json`:
|
Open Claude's settings file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create the directory if it doesn't exist
|
||||||
|
mkdir -p ~/.claude
|
||||||
|
|
||||||
|
# Edit settings.json
|
||||||
|
nano ~/.claude/settings.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Add this configuration (replace `/your/absolute/path/` with your actual path):
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
|
@ -68,7 +121,7 @@ Add to `~/.claude/settings.json`:
|
||||||
"matcher": "*",
|
"matcher": "*",
|
||||||
"hooks": [{
|
"hooks": [{
|
||||||
"type": "command",
|
"type": "command",
|
||||||
"command": "node /your/path/to/Claude-Code-Remote/claude-remote.js notify --type completed",
|
"command": "node /your/absolute/path/to/Claude-Code-Remote/claude-remote.js notify --type completed",
|
||||||
"timeout": 5
|
"timeout": 5
|
||||||
}]
|
}]
|
||||||
}],
|
}],
|
||||||
|
|
@ -76,7 +129,7 @@ Add to `~/.claude/settings.json`:
|
||||||
"matcher": "*",
|
"matcher": "*",
|
||||||
"hooks": [{
|
"hooks": [{
|
||||||
"type": "command",
|
"type": "command",
|
||||||
"command": "node /your/path/to/Claude-Code-Remote/claude-remote.js notify --type waiting",
|
"command": "node /your/absolute/path/to/Claude-Code-Remote/claude-remote.js notify --type waiting",
|
||||||
"timeout": 5
|
"timeout": 5
|
||||||
}]
|
}]
|
||||||
}]
|
}]
|
||||||
|
|
@ -84,86 +137,149 @@ Add to `~/.claude/settings.json`:
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Start
|
### Step 4: Test Your Setup
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Start email monitoring
|
# Test email configuration
|
||||||
npm run relay:pty
|
node claude-remote.js test
|
||||||
|
```
|
||||||
|
|
||||||
# In another terminal, start Claude Code
|
You should receive a test email. If not, check your email settings.
|
||||||
tmux new-session -d -s my-project
|
|
||||||
tmux attach -t my-project
|
### Step 5: Start Claude Code Remote
|
||||||
|
|
||||||
|
**Terminal 1 - Start email monitoring:**
|
||||||
|
```bash
|
||||||
|
npm run relay:pty
|
||||||
|
```
|
||||||
|
|
||||||
|
Keep this running. You should see:
|
||||||
|
```
|
||||||
|
🚀 Claude Code Remote is running!
|
||||||
|
📧 Monitoring emails...
|
||||||
|
```
|
||||||
|
|
||||||
|
**Terminal 2 - Start Claude in tmux:**
|
||||||
|
```bash
|
||||||
|
# Create a new tmux session
|
||||||
|
tmux new-session -s my-project
|
||||||
|
|
||||||
|
# Inside tmux, start Claude
|
||||||
claude
|
claude
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🎮 How It Works
|
### Step 6: You're Ready!
|
||||||
|
|
||||||
1. **Use Claude normally** in tmux session
|
1. Use Claude normally in the tmux session
|
||||||
2. **Get email notifications** when Claude completes tasks
|
2. When Claude completes a task, you'll receive an email
|
||||||
3. **Reply to emails** with new commands
|
3. Reply to the email with new commands
|
||||||
4. **Commands execute automatically** in Claude
|
4. Your commands will execute automatically in Claude
|
||||||
|
|
||||||
📖 **Detailed Email Reply Guide**: [English](./HOW_TO_USE_EMAIL_REPLY.md) | [中文](./HOW_TO_USE_EMAIL_REPLY_ZH.md)
|
### Verify Everything Works
|
||||||
|
|
||||||
### Example Email Flow
|
In Claude, type:
|
||||||
|
```
|
||||||
|
What is 2+2?
|
||||||
|
```
|
||||||
|
|
||||||
|
Wait for Claude to respond, then check your email. You should receive a notification!
|
||||||
|
|
||||||
|
## 📖 How to Use
|
||||||
|
|
||||||
|
### Email Notifications
|
||||||
|
When Claude completes a task, you'll receive an email notification:
|
||||||
|
|
||||||
**📩 Notification received:**
|
|
||||||
```
|
```
|
||||||
Subject: Claude Code Remote Task Complete [#ABC123]
|
Subject: Claude Code Remote Task Complete [#ABC123]
|
||||||
|
|
||||||
Claude completed: "Analyze the code structure"
|
Claude completed: "analyze the code structure"
|
||||||
[Claude's full response...]
|
|
||||||
|
|
||||||
Reply to send new commands.
|
[Claude's full response here...]
|
||||||
|
|
||||||
|
Reply to this email to send new commands.
|
||||||
```
|
```
|
||||||
|
|
||||||
**📨 Your reply:**
|
### Sending Commands via Email Reply
|
||||||
|
|
||||||
|
1. **Direct Reply**: Simply reply to the notification email
|
||||||
|
2. **Write Command**: Type your command in the email body:
|
||||||
```
|
```
|
||||||
Please optimize the performance and fix any bugs you find.
|
Please refactor the main function and add error handling
|
||||||
|
```
|
||||||
|
3. **Send**: Your command will automatically execute in Claude!
|
||||||
|
|
||||||
|
### Advanced Email Features
|
||||||
|
|
||||||
|
**Multi-line Commands**
|
||||||
|
```
|
||||||
|
First analyze the current code structure.
|
||||||
|
Then create a comprehensive test suite.
|
||||||
|
Finally, update the documentation.
|
||||||
```
|
```
|
||||||
|
|
||||||
**⚡ Result:** Your command automatically executes in Claude!
|
**Complex Instructions**
|
||||||
|
```
|
||||||
|
Refactor the authentication module with these requirements:
|
||||||
|
- Use JWT tokens instead of sessions
|
||||||
|
- Add rate limiting
|
||||||
|
- Implement refresh token logic
|
||||||
|
- Update all related tests
|
||||||
|
```
|
||||||
|
|
||||||
## 💡 Use Cases
|
### Email Reply Workflow
|
||||||
|
|
||||||
- **Remote Code Reviews**: Start reviews at office, continue from home via email
|
1. **Receive Notification** → You get an email when Claude completes a task
|
||||||
- **Long-running Tasks**: Monitor progress and guide next steps remotely
|
2. **Reply with Command** → Send your next instruction via email reply
|
||||||
- **Multi-location Development**: Control Claude from anywhere without VPN
|
3. **Automatic Execution** → The system extracts your command and injects it into Claude
|
||||||
|
4. **Get Results** → Receive another email when the new task completes
|
||||||
|
|
||||||
## 🔧 Commands
|
### Supported Email Clients
|
||||||
|
|
||||||
|
Works with any email client that supports standard reply functionality:
|
||||||
|
- ✅ Gmail (Web/Mobile)
|
||||||
|
- ✅ Apple Mail
|
||||||
|
- ✅ Outlook
|
||||||
|
- ✅ Any SMTP-compatible email client
|
||||||
|
|
||||||
|
## 💡 Common Use Cases
|
||||||
|
|
||||||
|
- **Remote Development**: Start coding at the office, continue from home via email
|
||||||
|
- **Long Tasks**: Let Claude work while you're in meetings, check results via email
|
||||||
|
- **Team Collaboration**: Share Claude sessions by forwarding notification emails
|
||||||
|
|
||||||
|
## 🔧 Useful Commands
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Test functionality
|
# Test email setup
|
||||||
node claude-remote.js test
|
node claude-remote.js test
|
||||||
|
|
||||||
# Check status
|
# Check system status
|
||||||
node claude-remote.js status
|
node claude-remote.js status
|
||||||
|
|
||||||
# View pending commands
|
# View tmux sessions
|
||||||
node claude-remote.js commands list
|
|
||||||
|
|
||||||
# Manage sessions
|
|
||||||
tmux list-sessions
|
tmux list-sessions
|
||||||
tmux attach -t session-name
|
tmux attach -t my-project
|
||||||
|
|
||||||
|
# Stop email monitoring
|
||||||
|
# Press Ctrl+C in the terminal running npm run relay:pty
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🔍 Troubleshooting
|
## 🔍 Troubleshooting
|
||||||
|
|
||||||
**Email not working?**
|
**Not receiving emails?**
|
||||||
```bash
|
- Run `node claude-remote.js test` to test email setup
|
||||||
node claude-remote.js test # Test email setup
|
- Check spam folder
|
||||||
```
|
- Verify SMTP settings in `.env`
|
||||||
|
- For Gmail: ensure you're using App Password
|
||||||
|
|
||||||
**Commands not injecting?**
|
**Commands not executing?**
|
||||||
```bash
|
- Ensure tmux session is running: `tmux list-sessions`
|
||||||
tmux list-sessions # Check if session exists
|
- Check sender email matches `ALLOWED_SENDERS` in `.env`
|
||||||
grep ALLOWED_SENDERS .env # Verify sender whitelist
|
- Verify Claude is running inside tmux
|
||||||
```
|
|
||||||
|
|
||||||
**Hooks not triggering?**
|
**Need help?**
|
||||||
```bash
|
- Check [Issues](https://github.com/JessyTsui/Claude-Code-Remote/issues)
|
||||||
node claude-remote.js notify --type completed # Test manually
|
- Follow [@Jiaxi_Cui](https://x.com/Jiaxi_Cui) for updates
|
||||||
```
|
|
||||||
|
|
||||||
## 🛡️ Security
|
## 🛡️ Security
|
||||||
|
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 3.3 MiB After Width: | Height: | Size: 3.3 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 279 KiB |
|
|
@ -1,42 +1,46 @@
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"id": 1312,
|
"id": 1312,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1315,
|
"id": 1315,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1310,
|
"id": 1310,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1323,
|
"id": 1323,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1331,
|
"id": 1331,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1334,
|
"id": 1334,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1342,
|
"id": 1342,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1346,
|
"id": 1346,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1348,
|
"id": 1348,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 180,
|
"id": 180,
|
||||||
"timestamp": 1754021490457
|
"timestamp": 1754022727524
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1691,
|
||||||
|
"timestamp": 1754022727524
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -41,6 +41,97 @@
|
||||||
"token": "L4KQ8DVJ",
|
"token": "L4KQ8DVJ",
|
||||||
"type": "notification",
|
"type": "notification",
|
||||||
"sentAt": "2025-08-01T04:12:15.795Z"
|
"sentAt": "2025-08-01T04:12:15.795Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<e3392712-9a5b-4c96-a23c-5d97c226b415-1754022640364@claude-code-remote>",
|
||||||
|
"sessionId": "e3392712-9a5b-4c96-a23c-5d97c226b415",
|
||||||
|
"token": "7ZFMSK5P",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T04:30:41.978Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<5d19da23-5c9d-4855-824e-fbd09a0d986c-1754022731688@claude-code-remote>",
|
||||||
|
"sessionId": "5d19da23-5c9d-4855-824e-fbd09a0d986c",
|
||||||
|
"token": "PJOE746Q",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T04:32:13.100Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<ed814c4b-0b97-4e10-8ad1-dae1a7cb7ef9-1754022927776@claude-code-remote>",
|
||||||
|
"sessionId": "ed814c4b-0b97-4e10-8ad1-dae1a7cb7ef9",
|
||||||
|
"token": "C9I24JHD",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T04:35:28.987Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<46ae2185-2f70-4355-a3b8-9fc04fa01181-1754023256348@claude-code-remote>",
|
||||||
|
"sessionId": "46ae2185-2f70-4355-a3b8-9fc04fa01181",
|
||||||
|
"token": "GGBKJ2DV",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T04:40:58.066Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<49c51c77-8ecc-4a04-a7a8-5955f89411b1-1754023825872@claude-code-remote>",
|
||||||
|
"sessionId": "49c51c77-8ecc-4a04-a7a8-5955f89411b1",
|
||||||
|
"token": "DQH198YY",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T04:50:27.443Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<cc5a1eba-7e04-44e6-919f-0395ddf2ee08-1754024054719@claude-code-remote>",
|
||||||
|
"sessionId": "cc5a1eba-7e04-44e6-919f-0395ddf2ee08",
|
||||||
|
"token": "GQE6LLIF",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T04:54:16.491Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<63198b90-3b9d-4448-a932-7c39c771554a-1754024273245@claude-code-remote>",
|
||||||
|
"sessionId": "63198b90-3b9d-4448-a932-7c39c771554a",
|
||||||
|
"token": "WYKEGTXV",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T04:57:54.938Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<bfd8b8d0-bcc4-4336-a6eb-8ca3f8b6c96e-1754025557415@claude-code-remote>",
|
||||||
|
"sessionId": "bfd8b8d0-bcc4-4336-a6eb-8ca3f8b6c96e",
|
||||||
|
"token": "ATUBLIN1",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T05:19:18.866Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<cdbfc3f9-e27e-47d9-82b9-9058f0180fff-1754025634473@claude-code-remote>",
|
||||||
|
"sessionId": "cdbfc3f9-e27e-47d9-82b9-9058f0180fff",
|
||||||
|
"token": "2W24RZTM",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T05:20:35.851Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<cf18cb3b-bc72-46ea-985f-2b7f29f0993f-1754025855175@claude-code-remote>",
|
||||||
|
"sessionId": "cf18cb3b-bc72-46ea-985f-2b7f29f0993f",
|
||||||
|
"token": "PHAVU604",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T05:24:16.539Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<6da5d6f6-7e68-47eb-8676-175d77f0ddbc-1754026029245@claude-code-remote>",
|
||||||
|
"sessionId": "6da5d6f6-7e68-47eb-8676-175d77f0ddbc",
|
||||||
|
"token": "C2APCY3V",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T05:27:10.601Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<9143d717-be05-4869-b40a-2c775addcfc4-1754026119754@claude-code-remote>",
|
||||||
|
"sessionId": "9143d717-be05-4869-b40a-2c775addcfc4",
|
||||||
|
"token": "N5P4GUG3",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T05:28:41.439Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"messageId": "<6fb2932d-d4ac-427b-8b7d-54af44fee1f2-1754026220881@claude-code-remote>",
|
||||||
|
"sessionId": "6fb2932d-d4ac-427b-8b7d-54af44fee1f2",
|
||||||
|
"token": "CZIKHCFO",
|
||||||
|
"type": "notification",
|
||||||
|
"sentAt": "2025-08-01T05:30:22.303Z"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -610,5 +610,122 @@
|
||||||
"sessionId": "2b30b1f7-b9c3-4cb4-b889-11c58009bd07",
|
"sessionId": "2b30b1f7-b9c3-4cb4-b889-11c58009bd07",
|
||||||
"tmuxSession": "test-session",
|
"tmuxSession": "test-session",
|
||||||
"description": "completed - Claude-Code-Remote-Test"
|
"description": "completed - Claude-Code-Remote-Test"
|
||||||
|
},
|
||||||
|
"7ZFMSK5P": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754022640,
|
||||||
|
"expiresAt": 1754109040,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "e3392712-9a5b-4c96-a23c-5d97c226b415",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"PJOE746Q": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754022731,
|
||||||
|
"expiresAt": 1754109131,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "5d19da23-5c9d-4855-824e-fbd09a0d986c",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"C9I24JHD": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754022927,
|
||||||
|
"expiresAt": 1754109327,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "ed814c4b-0b97-4e10-8ad1-dae1a7cb7ef9",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"GGBKJ2DV": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754023256,
|
||||||
|
"expiresAt": 1754109656,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "46ae2185-2f70-4355-a3b8-9fc04fa01181",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"DQH198YY": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754023825,
|
||||||
|
"expiresAt": 1754110225,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "49c51c77-8ecc-4a04-a7a8-5955f89411b1",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"GQE6LLIF": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754024054,
|
||||||
|
"expiresAt": 1754110454,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "cc5a1eba-7e04-44e6-919f-0395ddf2ee08",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"WYKEGTXV": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754024273,
|
||||||
|
"expiresAt": 1754110673,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "63198b90-3b9d-4448-a932-7c39c771554a",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"ATUBLIN1": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754025557,
|
||||||
|
"expiresAt": 1754111957,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "bfd8b8d0-bcc4-4336-a6eb-8ca3f8b6c96e",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"2W24RZTM": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754025634,
|
||||||
|
"expiresAt": 1754112034,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "cdbfc3f9-e27e-47d9-82b9-9058f0180fff",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"PHAVU604": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754025855,
|
||||||
|
"expiresAt": 1754112255,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "cf18cb3b-bc72-46ea-985f-2b7f29f0993f",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"C2APCY3V": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754026029,
|
||||||
|
"expiresAt": 1754112429,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "6da5d6f6-7e68-47eb-8676-175d77f0ddbc",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"N5P4GUG3": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754026119,
|
||||||
|
"expiresAt": 1754112519,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "9143d717-be05-4869-b40a-2c775addcfc4",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
|
},
|
||||||
|
"CZIKHCFO": {
|
||||||
|
"type": "pty",
|
||||||
|
"createdAt": 1754026220,
|
||||||
|
"expiresAt": 1754112620,
|
||||||
|
"cwd": "/Users/jessytsui/dev/Claude-Code-Remote",
|
||||||
|
"sessionId": "6fb2932d-d4ac-427b-8b7d-54af44fee1f2",
|
||||||
|
"tmuxSession": "a",
|
||||||
|
"description": "completed - Claude-Code-Remote"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue