Complete rebrand from TaskPing to Claude-Code-Remote
- Update project name and metadata in package.json and package-lock.json - Rename all CLI classes and main entry points - Fix email notification sender from "TaskPing Notification System" to "Claude-Code-Remote Notification System" - Update email subject headers from [TaskPing #token] to [Claude-Code-Remote #token] - Rebrand daemon service and all console output messages - Update configuration managers and installation scripts - Modify notification channels and test templates - Update GitHub repository URLs and author information - Fix all remaining TaskPing references in codebase 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
b1b50f09c3
commit
5ddda6217e
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TaskPing Unattended Remote Control Setup Assistant
|
* Claude-Code-Remote Unattended Remote Control Setup Assistant
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const { exec, spawn } = require('child_process');
|
const { exec, spawn } = require('child_process');
|
||||||
|
|
@ -10,22 +10,22 @@ const path = require('path');
|
||||||
|
|
||||||
class RemoteControlSetup {
|
class RemoteControlSetup {
|
||||||
constructor(sessionName = null) {
|
constructor(sessionName = null) {
|
||||||
this.sessionName = sessionName || 'claude-taskping';
|
this.sessionName = sessionName || 'claude-code-remote';
|
||||||
this.taskpingHome = this.findTaskPingHome();
|
this.claudeCodeRemoteHome = this.findClaudeCodeRemoteHome();
|
||||||
}
|
}
|
||||||
|
|
||||||
findTaskPingHome() {
|
findClaudeCodeRemoteHome() {
|
||||||
// If TASKPING_HOME environment variable is set, use it
|
// If CLAUDE_CODE_REMOTE_HOME environment variable is set, use it
|
||||||
if (process.env.TASKPING_HOME) {
|
if (process.env.CLAUDE_CODE_REMOTE_HOME) {
|
||||||
return process.env.TASKPING_HOME;
|
return process.env.CLAUDE_CODE_REMOTE_HOME;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If running from the TaskPing directory, use current directory
|
// If running from the Claude-Code-Remote directory, use current directory
|
||||||
if (fs.existsSync(path.join(__dirname, 'package.json'))) {
|
if (fs.existsSync(path.join(__dirname, 'package.json'))) {
|
||||||
const packagePath = path.join(__dirname, 'package.json');
|
const packagePath = path.join(__dirname, 'package.json');
|
||||||
try {
|
try {
|
||||||
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
||||||
if (packageJson.name && packageJson.name.includes('taskping')) {
|
if (packageJson.name && packageJson.name.toLowerCase().includes('claude-code-remote')) {
|
||||||
return __dirname;
|
return __dirname;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
@ -33,11 +33,11 @@ class RemoteControlSetup {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search for TaskPing in common locations
|
// Search for Claude-Code-Remote in common locations
|
||||||
const commonPaths = [
|
const commonPaths = [
|
||||||
path.join(process.env.HOME, 'dev', 'TaskPing'),
|
path.join(process.env.HOME, 'dev', 'Claude-Code-Remote'),
|
||||||
path.join(process.env.HOME, 'Projects', 'TaskPing'),
|
path.join(process.env.HOME, 'Projects', 'Claude-Code-Remote'),
|
||||||
path.join(process.env.HOME, 'taskping'),
|
path.join(process.env.HOME, 'claude-code-remote'),
|
||||||
__dirname // fallback to current script directory
|
__dirname // fallback to current script directory
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -45,7 +45,7 @@ class RemoteControlSetup {
|
||||||
if (fs.existsSync(searchPath) && fs.existsSync(path.join(searchPath, 'package.json'))) {
|
if (fs.existsSync(searchPath) && fs.existsSync(path.join(searchPath, 'package.json'))) {
|
||||||
try {
|
try {
|
||||||
const packageJson = JSON.parse(fs.readFileSync(path.join(searchPath, 'package.json'), 'utf8'));
|
const packageJson = JSON.parse(fs.readFileSync(path.join(searchPath, 'package.json'), 'utf8'));
|
||||||
if (packageJson.name && packageJson.name.toLowerCase().includes('taskping')) {
|
if (packageJson.name && packageJson.name.toLowerCase().includes('claude-code-remote')) {
|
||||||
return searchPath;
|
return searchPath;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
@ -59,7 +59,7 @@ class RemoteControlSetup {
|
||||||
}
|
}
|
||||||
|
|
||||||
async setup() {
|
async setup() {
|
||||||
console.log('🚀 TaskPing Unattended Remote Control Setup\n');
|
console.log('🚀 Claude-Code-Remote Unattended Remote Control Setup\n');
|
||||||
console.log('🎯 Goal: Remote access via mobile phone → Home computer Claude Code automatically executes commands\n');
|
console.log('🎯 Goal: Remote access via mobile phone → Home computer Claude Code automatically executes commands\n');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -162,8 +162,8 @@ class RemoteControlSetup {
|
||||||
}
|
}
|
||||||
|
|
||||||
createNewSession(resolve) {
|
createNewSession(resolve) {
|
||||||
// Use TaskPing home directory as working directory
|
// Use Claude-Code-Remote home directory as working directory
|
||||||
const workingDir = this.taskpingHome;
|
const workingDir = this.claudeCodeRemoteHome;
|
||||||
const command = `tmux new-session -d -s ${this.sessionName} -c "${workingDir}" clauderun`;
|
const command = `tmux new-session -d -s ${this.sessionName} -c "${workingDir}" clauderun`;
|
||||||
|
|
||||||
console.log(`🚀 Creating Claude tmux session: ${this.sessionName}`);
|
console.log(`🚀 Creating Claude tmux session: ${this.sessionName}`);
|
||||||
|
|
@ -215,7 +215,7 @@ class RemoteControlSetup {
|
||||||
console.log('📋 Usage workflow:');
|
console.log('📋 Usage workflow:');
|
||||||
console.log('1. 🏠 Start email monitoring at home: npm run relay:pty');
|
console.log('1. 🏠 Start email monitoring at home: npm run relay:pty');
|
||||||
console.log('2. 🚪 When going out, Claude continues running in tmux');
|
console.log('2. 🚪 When going out, Claude continues running in tmux');
|
||||||
console.log('3. 📱 Receive TaskPing email notifications on mobile');
|
console.log('3. 📱 Receive Claude-Code-Remote email notifications on mobile');
|
||||||
console.log('4. 💬 Reply to email with commands on mobile');
|
console.log('4. 💬 Reply to email with commands on mobile');
|
||||||
console.log('5. 🤖 Claude at home automatically receives and executes commands');
|
console.log('5. 🤖 Claude at home automatically receives and executes commands');
|
||||||
console.log('6. 🔄 Repeat above process, completely unattended\n');
|
console.log('6. 🔄 Repeat above process, completely unattended\n');
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TaskPing - Claude Code Smart Notification System
|
* Claude-Code-Remote - Claude Code Smart Notification System
|
||||||
* Main entry point for the CLI tool
|
* Main entry point for the CLI tool
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -9,7 +9,7 @@ const Logger = require('./src/core/logger');
|
||||||
const Notifier = require('./src/core/notifier');
|
const Notifier = require('./src/core/notifier');
|
||||||
const ConfigManager = require('./src/core/config');
|
const ConfigManager = require('./src/core/config');
|
||||||
|
|
||||||
class TaskPingCLI {
|
class ClaudeCodeRemoteCLI {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.logger = new Logger('CLI');
|
this.logger = new Logger('CLI');
|
||||||
this.config = new ConfigManager();
|
this.config = new ConfigManager();
|
||||||
|
|
@ -97,7 +97,7 @@ class TaskPingCLI {
|
||||||
const typeIndex = args.findIndex(arg => arg === '--type');
|
const typeIndex = args.findIndex(arg => arg === '--type');
|
||||||
|
|
||||||
if (typeIndex === -1 || typeIndex + 1 >= args.length) {
|
if (typeIndex === -1 || typeIndex + 1 >= args.length) {
|
||||||
console.error('Usage: taskping notify --type <completed|waiting>');
|
console.error('Usage: claude-remote notify --type <completed|waiting>');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -184,7 +184,7 @@ class TaskPingCLI {
|
||||||
async handleStatus(args) {
|
async handleStatus(args) {
|
||||||
const status = this.notifier.getStatus();
|
const status = this.notifier.getStatus();
|
||||||
|
|
||||||
console.log('TaskPing Status\n');
|
console.log('Claude-Code-Remote Status\n');
|
||||||
console.log('Configuration:');
|
console.log('Configuration:');
|
||||||
console.log(` Enabled: ${status.enabled ? 'Yes' : 'No'}`);
|
console.log(` Enabled: ${status.enabled ? 'Yes' : 'No'}`);
|
||||||
console.log(` Language: ${status.config.language}`);
|
console.log(` Language: ${status.config.language}`);
|
||||||
|
|
@ -284,7 +284,7 @@ class TaskPingCLI {
|
||||||
await this.cleanupRelay(args.slice(1));
|
await this.cleanupRelay(args.slice(1));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console.error('Usage: taskping relay <start|stop|status|cleanup>');
|
console.error('Usage: claude-remote relay <start|stop|status|cleanup>');
|
||||||
console.log('');
|
console.log('');
|
||||||
console.log('Commands:');
|
console.log('Commands:');
|
||||||
console.log(' start Start email command relay service');
|
console.log(' start Start email command relay service');
|
||||||
|
|
@ -302,7 +302,7 @@ class TaskPingCLI {
|
||||||
|
|
||||||
if (!emailConfig || !emailConfig.enabled) {
|
if (!emailConfig || !emailConfig.enabled) {
|
||||||
console.error('❌ Email channel not configured or disabled');
|
console.error('❌ Email channel not configured or disabled');
|
||||||
console.log('Please run first: taskping config');
|
console.log('Please run first: claude-remote config');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -445,8 +445,8 @@ class TaskPingCLI {
|
||||||
console.log(' channels - Notification channel configuration (config/channels.json)');
|
console.log(' channels - Notification channel configuration (config/channels.json)');
|
||||||
console.log(' default - Default configuration template (config/default.json)');
|
console.log(' default - Default configuration template (config/default.json)');
|
||||||
console.log('');
|
console.log('');
|
||||||
console.log('Usage: taskping edit-config <configuration-type>');
|
console.log('Usage: claude-remote edit-config <configuration-type>');
|
||||||
console.log('Example: taskping edit-config channels');
|
console.log('Example: claude-remote edit-config channels');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -485,7 +485,7 @@ class TaskPingCLI {
|
||||||
editorProcess.on('close', (code) => {
|
editorProcess.on('close', (code) => {
|
||||||
if (code === 0) {
|
if (code === 0) {
|
||||||
console.log('✅ Configuration file saved');
|
console.log('✅ Configuration file saved');
|
||||||
console.log('💡 Run "taskping status" to view updated configuration');
|
console.log('💡 Run "claude-remote status" to view updated configuration');
|
||||||
} else {
|
} else {
|
||||||
console.log('❌ Editor exited abnormally');
|
console.log('❌ Editor exited abnormally');
|
||||||
}
|
}
|
||||||
|
|
@ -534,7 +534,7 @@ class TaskPingCLI {
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
console.log('🚀 TaskPing Email Quick Setup Wizard\n');
|
console.log('🚀 Claude-Code-Remote Email Quick Setup Wizard\n');
|
||||||
|
|
||||||
// Select email provider
|
// Select email provider
|
||||||
console.log('Please select your email provider:');
|
console.log('Please select your email provider:');
|
||||||
|
|
@ -625,7 +625,7 @@ class TaskPingCLI {
|
||||||
pass: password
|
pass: password
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
from: `TaskPing <${email}>`,
|
from: `Claude-Code-Remote <${email}>`,
|
||||||
to: email,
|
to: email,
|
||||||
template: {
|
template: {
|
||||||
checkInterval: 30
|
checkInterval: 30
|
||||||
|
|
@ -649,9 +649,9 @@ class TaskPingCLI {
|
||||||
|
|
||||||
console.log('\n✅ Email configuration saved!');
|
console.log('\n✅ Email configuration saved!');
|
||||||
console.log('\n🧪 You can now test email functionality:');
|
console.log('\n🧪 You can now test email functionality:');
|
||||||
console.log(' taskping test');
|
console.log(' claude-remote test');
|
||||||
console.log('\n🚀 Start command relay service:');
|
console.log('\n🚀 Start command relay service:');
|
||||||
console.log(' taskping relay start');
|
console.log(' claude-remote relay start');
|
||||||
|
|
||||||
// Ask if user wants to test immediately
|
// Ask if user wants to test immediately
|
||||||
const testNow = await question('\nTest email sending now? (y/n): ');
|
const testNow = await question('\nTest email sending now? (y/n): ');
|
||||||
|
|
@ -672,8 +672,8 @@ class TaskPingCLI {
|
||||||
}
|
}
|
||||||
|
|
||||||
async handleDaemon(args) {
|
async handleDaemon(args) {
|
||||||
const TaskPingDaemon = require('./src/daemon/taskping-daemon');
|
const ClaudeCodeRemoteDaemon = require('./src/daemon/taskping-daemon');
|
||||||
const daemon = new TaskPingDaemon();
|
const daemon = new ClaudeCodeRemoteDaemon();
|
||||||
|
|
||||||
const command = args[0];
|
const command = args[0];
|
||||||
|
|
||||||
|
|
@ -691,7 +691,7 @@ class TaskPingCLI {
|
||||||
daemon.showStatus();
|
daemon.showStatus();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console.log('Usage: taskping daemon <start|stop|restart|status>');
|
console.log('Usage: claude-remote daemon <start|stop|restart|status>');
|
||||||
console.log('');
|
console.log('');
|
||||||
console.log('Commands:');
|
console.log('Commands:');
|
||||||
console.log(' start Start background daemon process');
|
console.log(' start Start background daemon process');
|
||||||
|
|
@ -752,7 +752,7 @@ class TaskPingCLI {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
console.log('Usage: taskping commands <list|status|cleanup|clear>');
|
console.log('Usage: claude-remote commands <list|status|cleanup|clear>');
|
||||||
console.log('');
|
console.log('');
|
||||||
console.log('Commands:');
|
console.log('Commands:');
|
||||||
console.log(' list Show pending email commands');
|
console.log(' list Show pending email commands');
|
||||||
|
|
@ -881,7 +881,7 @@ class TaskPingCLI {
|
||||||
console.log(' • Insufficient permissions');
|
console.log(' • Insufficient permissions');
|
||||||
console.log(' • Application not responding');
|
console.log(' • Application not responding');
|
||||||
console.log('\n🔧 Suggestions:');
|
console.log('\n🔧 Suggestions:');
|
||||||
console.log(' 1. Run "taskping setup-permissions" to check permissions');
|
console.log(' 1. Run "claude-remote setup-permissions" to check permissions');
|
||||||
console.log(' 2. Ensure Claude Code is running in foreground');
|
console.log(' 2. Ensure Claude Code is running in foreground');
|
||||||
console.log(' 3. Try manually clicking input box in Claude Code first');
|
console.log(' 3. Try manually clicking input box in Claude Code first');
|
||||||
}
|
}
|
||||||
|
|
@ -898,9 +898,9 @@ class TaskPingCLI {
|
||||||
|
|
||||||
showHelp() {
|
showHelp() {
|
||||||
console.log(`
|
console.log(`
|
||||||
TaskPing - Claude Code Smart Notification System
|
Claude-Code-Remote - Claude Code Smart Notification System
|
||||||
|
|
||||||
Usage: taskping <command> [options]
|
Usage: claude-remote <command> [options]
|
||||||
|
|
||||||
Commands:
|
Commands:
|
||||||
notify --type <type> Send a notification (completed|waiting)
|
notify --type <type> Send a notification (completed|waiting)
|
||||||
|
|
@ -941,30 +941,30 @@ Commands Subcommands:
|
||||||
commands clear Clear all pending commands
|
commands clear Clear all pending commands
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
taskping notify --type completed
|
claude-remote notify --type completed
|
||||||
taskping test
|
claude-remote test
|
||||||
taskping setup-email # Quick email setup (recommended)
|
claude-remote setup-email # Quick email setup (recommended)
|
||||||
taskping edit-config channels # Edit configuration files directly
|
claude-remote edit-config channels # Edit configuration files directly
|
||||||
taskping config # Interactive configuration
|
claude-remote config # Interactive configuration
|
||||||
taskping install
|
claude-remote install
|
||||||
taskping daemon start # Start background service (recommended)
|
claude-remote daemon start # Start background service (recommended)
|
||||||
taskping daemon status # View service status
|
claude-remote daemon status # View service status
|
||||||
taskping test-claude # Test full automation (recommended)
|
claude-remote test-claude # Test full automation (recommended)
|
||||||
taskping commands list # View pending email commands
|
claude-remote commands list # View pending email commands
|
||||||
taskping relay start # Run in foreground (need to keep window open)
|
claude-remote relay start # Run in foreground (need to keep window open)
|
||||||
|
|
||||||
For more information, visit: https://github.com/TaskPing/TaskPing
|
For more information, visit: https://github.com/Claude-Code-Remote/Claude-Code-Remote
|
||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run CLI if this file is executed directly
|
// Run CLI if this file is executed directly
|
||||||
if (require.main === module) {
|
if (require.main === module) {
|
||||||
const cli = new TaskPingCLI();
|
const cli = new ClaudeCodeRemoteCLI();
|
||||||
cli.run().catch(error => {
|
cli.run().catch(error => {
|
||||||
console.error('Fatal error:', error.message);
|
console.error('Fatal error:', error.message);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = TaskPingCLI;
|
module.exports = ClaudeCodeRemoteCLI;
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
"pass": "kKgS3tNReRTL3RQC"
|
"pass": "kKgS3tNReRTL3RQC"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"from": "TaskPing Notification System <noreply@pandalla.ai>",
|
"from": "Claude-Code-Remote Notification System <noreply@pandalla.ai>",
|
||||||
"to": "jiaxicui446@gmail.com",
|
"to": "jiaxicui446@gmail.com",
|
||||||
"template": {
|
"template": {
|
||||||
"checkInterval": 30
|
"checkInterval": 30
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"config": {
|
"config": {
|
||||||
"webhook": "",
|
"webhook": "",
|
||||||
"username": "TaskPing",
|
"username": "Claude-Code-Remote",
|
||||||
"avatar": null
|
"avatar": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
"pass": "your-app-password"
|
"pass": "your-app-password"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"from": "TaskPing <your-email@gmail.com>",
|
"from": "Claude-Code-Remote <your-email@gmail.com>",
|
||||||
"to": "your-email@gmail.com",
|
"to": "your-email@gmail.com",
|
||||||
"template": {
|
"template": {
|
||||||
"checkInterval": 30
|
"checkInterval": 30
|
||||||
|
|
@ -44,5 +44,5 @@
|
||||||
#
|
#
|
||||||
# After Configuration:
|
# After Configuration:
|
||||||
# 1. Copy email section to config/channels.json
|
# 1. Copy email section to config/channels.json
|
||||||
# 2. Run: taskping test
|
# 2. Run: claude-remote test
|
||||||
# 3. Run: taskping relay start
|
# 3. Run: claude-remote relay start
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Global Installation Script for TaskPing claude-control
|
* Global Installation Script for Claude-Code-Remote claude-control
|
||||||
* Makes claude-control.js accessible from any directory
|
* Makes claude-control.js accessible from any directory
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -43,20 +43,20 @@ function createGlobalScript() {
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const { spawn } = require('child_process');
|
const { spawn } = require('child_process');
|
||||||
|
|
||||||
// TaskPing installation directory
|
// Claude-Code-Remote installation directory
|
||||||
const TASKPING_DIR = '${__dirname}';
|
const CLAUDE_CODE_REMOTE_DIR = '${__dirname}';
|
||||||
const CLAUDE_CONTROL_PATH = path.join(TASKPING_DIR, 'claude-control.js');
|
const CLAUDE_CONTROL_PATH = path.join(CLAUDE_CODE_REMOTE_DIR, 'claude-control.js');
|
||||||
|
|
||||||
// Get command line arguments (excluding node and script name)
|
// Get command line arguments (excluding node and script name)
|
||||||
const args = process.argv.slice(2);
|
const args = process.argv.slice(2);
|
||||||
|
|
||||||
// Change to TaskPing directory before execution
|
// Change to Claude-Code-Remote directory before execution
|
||||||
process.chdir(TASKPING_DIR);
|
process.chdir(CLAUDE_CODE_REMOTE_DIR);
|
||||||
|
|
||||||
// Execute claude-control.js with original arguments
|
// Execute claude-control.js with original arguments
|
||||||
const child = spawn('node', [CLAUDE_CONTROL_PATH, ...args], {
|
const child = spawn('node', [CLAUDE_CONTROL_PATH, ...args], {
|
||||||
stdio: 'inherit',
|
stdio: 'inherit',
|
||||||
env: { ...process.env, TASKPING_HOME: TASKPING_DIR }
|
env: { ...process.env, CLAUDE_CODE_REMOTE_HOME: CLAUDE_CODE_REMOTE_DIR }
|
||||||
});
|
});
|
||||||
|
|
||||||
child.on('error', (error) => {
|
child.on('error', (error) => {
|
||||||
|
|
@ -119,7 +119,7 @@ function uninstall() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function showHelp() {
|
function showHelp() {
|
||||||
console.log('TaskPing Claude Control - Global Installation\n');
|
console.log('Claude-Code-Remote Claude Control - Global Installation\n');
|
||||||
console.log('Usage:');
|
console.log('Usage:');
|
||||||
console.log(' node install-global.js [install] - Install globally');
|
console.log(' node install-global.js [install] - Install globally');
|
||||||
console.log(' node install-global.js uninstall - Uninstall');
|
console.log(' node install-global.js uninstall - Uninstall');
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
{
|
{
|
||||||
"name": "taskping",
|
"name": "claude-code-remote",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "taskping",
|
"name": "claude-code-remote",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"os": [
|
"os": [
|
||||||
|
|
|
||||||
18
package.json
18
package.json
|
|
@ -1,13 +1,13 @@
|
||||||
{
|
{
|
||||||
"name": "taskping",
|
"name": "claude-code-remote",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Claude Code Smart Notification System - Send desktop notifications when Claude completes tasks or needs input",
|
"description": "Claude Code Smart Notification System - Send desktop notifications when Claude completes tasks or needs input",
|
||||||
"main": "hook-notify.js",
|
"main": "hook-notify.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"config": "node taskping-config.js",
|
"config": "node claude-remote-config.js",
|
||||||
"daemon:start": "node taskping.js daemon start",
|
"daemon:start": "node claude-remote.js daemon start",
|
||||||
"daemon:stop": "node taskping.js daemon stop",
|
"daemon:stop": "node claude-remote.js daemon stop",
|
||||||
"daemon:status": "node taskping.js daemon status",
|
"daemon:status": "node claude-remote.js daemon status",
|
||||||
"relay:pty": "node start-relay-pty.js",
|
"relay:pty": "node start-relay-pty.js",
|
||||||
"relay:start": "INJECTION_MODE=pty node src/relay/relay-pty.js"
|
"relay:start": "INJECTION_MODE=pty node src/relay/relay-pty.js"
|
||||||
},
|
},
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
"claude",
|
"claude",
|
||||||
"ai-assistant"
|
"ai-assistant"
|
||||||
],
|
],
|
||||||
"author": "TaskPing Team",
|
"author": "Claude-Code-Remote Team",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=14.0.0"
|
"node": ">=14.0.0"
|
||||||
|
|
@ -34,12 +34,12 @@
|
||||||
],
|
],
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/TaskPing/TaskPing.git"
|
"url": "https://github.com/Claude-Code-Remote/Claude-Code-Remote.git"
|
||||||
},
|
},
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/TaskPing/TaskPing/issues"
|
"url": "https://github.com/Claude-Code-Remote/Claude-Code-Remote/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/TaskPing/TaskPing#readme",
|
"homepage": "https://github.com/Claude-Code-Remote/Claude-Code-Remote#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dotenv": "^17.2.1",
|
"dotenv": "^17.2.1",
|
||||||
"execa": "^9.6.0",
|
"execa": "^9.6.0",
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ async function sendTestReply() {
|
||||||
const mailOptions = {
|
const mailOptions = {
|
||||||
from: 'jiaxicui446@gmail.com',
|
from: 'jiaxicui446@gmail.com',
|
||||||
to: 'noreply@pandalla.ai',
|
to: 'noreply@pandalla.ai',
|
||||||
subject: `Re: [TaskPing #${testToken}] Claude Code Task Completed - TaskPing`,
|
subject: `Re: [Claude-Code-Remote #${testToken}] Claude Code Task Completed - Claude-Code-Remote`,
|
||||||
text: 'Please explain the basic principles of quantum computing',
|
text: 'Please explain the basic principles of quantum computing',
|
||||||
replyTo: 'jiaxicui446@gmail.com'
|
replyTo: 'jiaxicui446@gmail.com'
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ class NotificationChannel {
|
||||||
|
|
||||||
const testNotification = {
|
const testNotification = {
|
||||||
type: 'completed',
|
type: 'completed',
|
||||||
title: 'TaskPing Test',
|
title: 'Claude-Code-Remote Test',
|
||||||
message: `Test notification from ${this.name} channel`,
|
message: `Test notification from ${this.name} channel`,
|
||||||
project: 'test-project',
|
project: 'test-project',
|
||||||
metadata: { test: true }
|
metadata: { test: true }
|
||||||
|
|
|
||||||
|
|
@ -122,8 +122,8 @@ class EmailChannel extends NotificationChannel {
|
||||||
text: emailContent.text,
|
text: emailContent.text,
|
||||||
// Add custom headers for reply recognition
|
// Add custom headers for reply recognition
|
||||||
headers: {
|
headers: {
|
||||||
'X-TaskPing-Session-ID': sessionId,
|
'X-Claude-Code-Remote-Session-ID': sessionId,
|
||||||
'X-TaskPing-Type': notification.type
|
'X-Claude-Code-Remote-Type': notification.type
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -174,7 +174,7 @@ class EmailChannel extends NotificationChannel {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use passed tmux session name or detect current session
|
// Use passed tmux session name or detect current session
|
||||||
let tmuxSession = notification.metadata?.tmuxSession || this._getCurrentTmuxSession() || 'claude-taskping';
|
let tmuxSession = notification.metadata?.tmuxSession || this._getCurrentTmuxSession() || 'claude-code-remote';
|
||||||
|
|
||||||
sessionMap[token] = {
|
sessionMap[token] = {
|
||||||
type: 'pty',
|
type: 'pty',
|
||||||
|
|
@ -267,7 +267,7 @@ class EmailChannel extends NotificationChannel {
|
||||||
// Default templates
|
// Default templates
|
||||||
const templates = {
|
const templates = {
|
||||||
completed: {
|
completed: {
|
||||||
subject: '[TaskPing #{{token}}] Claude Code Task Completed - {{project}}',
|
subject: '[Claude-Code-Remote #{{token}}] Claude Code Task Completed - {{project}}',
|
||||||
html: `
|
html: `
|
||||||
<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f9f9f9;">
|
<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f9f9f9;">
|
||||||
<div style="background-color: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
|
<div style="background-color: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
|
||||||
|
|
@ -309,13 +309,13 @@ class EmailChannel extends NotificationChannel {
|
||||||
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #dee2e6; font-size: 12px; color: #6c757d;">
|
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #dee2e6; font-size: 12px; color: #6c757d;">
|
||||||
<p style="margin: 5px 0;">Session ID: <code>{{sessionId}}</code></p>
|
<p style="margin: 5px 0;">Session ID: <code>{{sessionId}}</code></p>
|
||||||
<p style="margin: 5px 0;">🔒 Security note: Please do not forward this email, session will automatically expire after 24 hours</p>
|
<p style="margin: 5px 0;">🔒 Security note: Please do not forward this email, session will automatically expire after 24 hours</p>
|
||||||
<p style="margin: 5px 0;">📧 This is an automated email from TaskPing</p>
|
<p style="margin: 5px 0;">📧 This is an automated email from Claude-Code-Remote</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`,
|
`,
|
||||||
text: `
|
text: `
|
||||||
[TaskPing #{{token}}] Claude Code Task Completed - {{projectDir}} | {{shortQuestion}}
|
[Claude-Code-Remote #{{token}}] Claude Code Task Completed - {{projectDir}} | {{shortQuestion}}
|
||||||
|
|
||||||
Project: {{projectDir}}
|
Project: {{projectDir}}
|
||||||
Time: {{timestamp}}
|
Time: {{timestamp}}
|
||||||
|
|
@ -340,7 +340,7 @@ Security Note: Please do not forward this email, session will automatically expi
|
||||||
`
|
`
|
||||||
},
|
},
|
||||||
waiting: {
|
waiting: {
|
||||||
subject: '[TaskPing #{{token}}] Claude Code Waiting for Input - {{project}}',
|
subject: '[Claude-Code-Remote #{{token}}] Claude Code Waiting for Input - {{project}}',
|
||||||
html: `
|
html: `
|
||||||
<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f9f9f9;">
|
<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f9f9f9;">
|
||||||
<div style="background-color: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
|
<div style="background-color: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
|
||||||
|
|
@ -371,13 +371,13 @@ Security Note: Please do not forward this email, session will automatically expi
|
||||||
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #dee2e6; font-size: 12px; color: #6c757d;">
|
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #dee2e6; font-size: 12px; color: #6c757d;">
|
||||||
<p style="margin: 5px 0;">Session ID: <code>{{sessionId}}</code></p>
|
<p style="margin: 5px 0;">Session ID: <code>{{sessionId}}</code></p>
|
||||||
<p style="margin: 5px 0;">🔒 Security note: Please do not forward this email, session will automatically expire after 24 hours</p>
|
<p style="margin: 5px 0;">🔒 Security note: Please do not forward this email, session will automatically expire after 24 hours</p>
|
||||||
<p style="margin: 5px 0;">📧 This is an automated email from TaskPing</p>
|
<p style="margin: 5px 0;">📧 This is an automated email from Claude-Code-Remote</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`,
|
`,
|
||||||
text: `
|
text: `
|
||||||
[TaskPing #{{token}}] Claude Code Waiting for Input - {{projectDir}}
|
[Claude-Code-Remote #{{token}}] Claude Code Waiting for Input - {{projectDir}}
|
||||||
|
|
||||||
Project: {{projectDir}}
|
Project: {{projectDir}}
|
||||||
Time: {{timestamp}}
|
Time: {{timestamp}}
|
||||||
|
|
@ -428,9 +428,9 @@ Security Note: Please do not forward this email, session will automatically expi
|
||||||
// Send test email
|
// Send test email
|
||||||
const testNotification = {
|
const testNotification = {
|
||||||
type: 'completed',
|
type: 'completed',
|
||||||
title: 'TaskPing Test',
|
title: 'Claude-Code-Remote Test',
|
||||||
message: 'This is a test email to verify that the email notification function is working properly.',
|
message: 'This is a test email to verify that the email notification function is working properly.',
|
||||||
project: 'TaskPing-Test',
|
project: 'Claude-Code-Remote-Test',
|
||||||
metadata: {
|
metadata: {
|
||||||
test: true,
|
test: true,
|
||||||
timestamp: new Date().toISOString()
|
timestamp: new Date().toISOString()
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ class DesktopChannel extends NotificationChannel {
|
||||||
try {
|
try {
|
||||||
// Try terminal-notifier first
|
// Try terminal-notifier first
|
||||||
try {
|
try {
|
||||||
const cmd = `terminal-notifier -title "${title}" -message "${message}" -sound "${sound}" -group "taskping"`;
|
const cmd = `terminal-notifier -title "${title}" -message "${message}" -sound "${sound}" -group "claude-code-remote"`;
|
||||||
execSync(cmd, { timeout: 3000 });
|
execSync(cmd, { timeout: 3000 });
|
||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
@ -81,7 +81,7 @@ class DesktopChannel extends NotificationChannel {
|
||||||
$xml.toast.visual.binding.text[0].AppendChild($xml.CreateTextNode("${title}")) > $null
|
$xml.toast.visual.binding.text[0].AppendChild($xml.CreateTextNode("${title}")) > $null
|
||||||
$xml.toast.visual.binding.text[1].AppendChild($xml.CreateTextNode("${message}")) > $null
|
$xml.toast.visual.binding.text[1].AppendChild($xml.CreateTextNode("${message}")) > $null
|
||||||
$toast = [Windows.UI.Notifications.ToastNotification]::new($xml)
|
$toast = [Windows.UI.Notifications.ToastNotification]::new($xml)
|
||||||
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("TaskPing").Show($toast)
|
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("Claude-Code-Remote").Show($toast)
|
||||||
`;
|
`;
|
||||||
|
|
||||||
execSync(`powershell -Command "${script}"`, { timeout: 5000 });
|
execSync(`powershell -Command "${script}"`, { timeout: 5000 });
|
||||||
|
|
|
||||||
|
|
@ -77,8 +77,8 @@ class ConfigManager {
|
||||||
|
|
||||||
// Email addresses
|
// Email addresses
|
||||||
console.log('\n--- Email Addresses ---');
|
console.log('\n--- Email Addresses ---');
|
||||||
const fromEmail = await this.question(`From Address [${config.email.config.from || `TaskPing <${config.email.config.smtp.auth.user}>`}]: `);
|
const fromEmail = await this.question(`From Address [${config.email.config.from || `Claude-Code-Remote <${config.email.config.smtp.auth.user}>`}]: `);
|
||||||
config.email.config.from = fromEmail || config.email.config.from || `TaskPing <${config.email.config.smtp.auth.user}>`;
|
config.email.config.from = fromEmail || config.email.config.from || `Claude-Code-Remote <${config.email.config.smtp.auth.user}>`;
|
||||||
|
|
||||||
const toEmail = await this.question(`To Address [${config.email.config.to || config.email.config.smtp.auth.user}]: `);
|
const toEmail = await this.question(`To Address [${config.email.config.to || config.email.config.smtp.auth.user}]: `);
|
||||||
config.email.config.to = toEmail || config.email.config.to || config.email.config.smtp.auth.user;
|
config.email.config.to = toEmail || config.email.config.to || config.email.config.smtp.auth.user;
|
||||||
|
|
@ -129,7 +129,7 @@ class ConfigManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
async interactiveMenu() {
|
async interactiveMenu() {
|
||||||
console.log('\n🛠️ TaskPing Configuration Manager\n');
|
console.log('\n🛠️ Claude-Code-Remote Configuration Manager\n');
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
console.log('\nChoose an option:');
|
console.log('\nChoose an option:');
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* TaskPing Configuration Manager
|
* Claude-Code-Remote Configuration Manager
|
||||||
* Handles loading, merging, and saving configurations
|
* Handles loading, merging, and saving configurations
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -78,7 +78,7 @@ class ConfigManager {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
config: {
|
config: {
|
||||||
webhook: '',
|
webhook: '',
|
||||||
username: 'TaskPing',
|
username: 'Claude-Code-Remote',
|
||||||
avatar: null
|
avatar: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
/**
|
/**
|
||||||
* TaskPing Logger
|
* Claude-Code-Remote Logger
|
||||||
* Centralized logging utility
|
* Centralized logging utility
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Logger {
|
class Logger {
|
||||||
constructor(namespace = 'TaskPing') {
|
constructor(namespace = 'Claude-Code-Remote') {
|
||||||
this.namespace = namespace;
|
this.namespace = namespace;
|
||||||
this.logLevel = process.env.TASKPING_LOG_LEVEL || 'info';
|
this.logLevel = process.env.CLAUDE_CODE_REMOTE_LOG_LEVEL || 'info';
|
||||||
}
|
}
|
||||||
|
|
||||||
_log(level, message, ...args) {
|
_log(level, message, ...args) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* TaskPing Core Notifier
|
* Claude-Code-Remote Core Notifier
|
||||||
* Central notification orchestrator that manages multiple channels
|
* Central notification orchestrator that manages multiple channels
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TaskPing Daemon Service
|
* Claude-Code-Remote Daemon Service
|
||||||
* Background daemon process for monitoring emails and processing remote commands
|
* Background daemon process for monitoring emails and processing remote commands
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -11,11 +11,11 @@ const { spawn, exec } = require('child_process');
|
||||||
const Logger = require('../core/logger');
|
const Logger = require('../core/logger');
|
||||||
const ConfigManager = require('../core/config');
|
const ConfigManager = require('../core/config');
|
||||||
|
|
||||||
class TaskPingDaemon {
|
class ClaudeCodeRemoteDaemon {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.logger = new Logger('Daemon');
|
this.logger = new Logger('Daemon');
|
||||||
this.config = new ConfigManager();
|
this.config = new ConfigManager();
|
||||||
this.pidFile = path.join(__dirname, '../data/taskping.pid');
|
this.pidFile = path.join(__dirname, '../data/claude-code-remote.pid');
|
||||||
this.logFile = path.join(__dirname, '../data/daemon.log');
|
this.logFile = path.join(__dirname, '../data/daemon.log');
|
||||||
this.relayService = null;
|
this.relayService = null;
|
||||||
this.isRunning = false;
|
this.isRunning = false;
|
||||||
|
|
@ -31,8 +31,8 @@ class TaskPingDaemon {
|
||||||
try {
|
try {
|
||||||
// Check if already running
|
// Check if already running
|
||||||
if (this.isAlreadyRunning()) {
|
if (this.isAlreadyRunning()) {
|
||||||
console.log('❌ TaskPing daemon is already running');
|
console.log('❌ Claude-Code-Remote daemon is already running');
|
||||||
console.log('💡 Use "taskping daemon stop" to stop existing service');
|
console.log('💡 Use "claude-remote daemon stop" to stop existing service');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -50,7 +50,7 @@ class TaskPingDaemon {
|
||||||
}
|
}
|
||||||
|
|
||||||
async startDetached() {
|
async startDetached() {
|
||||||
console.log('🚀 Starting TaskPing daemon...');
|
console.log('🚀 Starting Claude-Code-Remote daemon...');
|
||||||
|
|
||||||
// Create child process
|
// Create child process
|
||||||
const child = spawn(process.execPath, [__filename, '--foreground'], {
|
const child = spawn(process.execPath, [__filename, '--foreground'], {
|
||||||
|
|
@ -69,17 +69,17 @@ class TaskPingDaemon {
|
||||||
// Detach child process
|
// Detach child process
|
||||||
child.unref();
|
child.unref();
|
||||||
|
|
||||||
console.log(`✅ TaskPing daemon started (PID: ${child.pid})`);
|
console.log(`✅ Claude-Code-Remote daemon started (PID: ${child.pid})`);
|
||||||
console.log(`📝 Log file: ${this.logFile}`);
|
console.log(`📝 Log file: ${this.logFile}`);
|
||||||
console.log('💡 Use "taskping daemon status" to view status');
|
console.log('💡 Use "claude-remote daemon status" to view status');
|
||||||
console.log('💡 Use "taskping daemon stop" to stop service');
|
console.log('💡 Use "claude-remote daemon stop" to stop service');
|
||||||
}
|
}
|
||||||
|
|
||||||
async startForeground() {
|
async startForeground() {
|
||||||
console.log('🚀 TaskPing daemon starting...');
|
console.log('🚀 Claude-Code-Remote daemon starting...');
|
||||||
|
|
||||||
this.isRunning = true;
|
this.isRunning = true;
|
||||||
process.title = 'taskping-daemon';
|
process.title = 'claude-code-remote-daemon';
|
||||||
|
|
||||||
// Load configuration
|
// Load configuration
|
||||||
this.config.load();
|
this.config.load();
|
||||||
|
|
@ -174,13 +174,13 @@ class TaskPingDaemon {
|
||||||
|
|
||||||
async stop() {
|
async stop() {
|
||||||
if (!this.isAlreadyRunning()) {
|
if (!this.isAlreadyRunning()) {
|
||||||
console.log('❌ TaskPing daemon is not running');
|
console.log('❌ Claude-Code-Remote daemon is not running');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const pid = this.getPid();
|
const pid = this.getPid();
|
||||||
console.log(`🛑 Stopping TaskPing daemon (PID: ${pid})...`);
|
console.log(`🛑 Stopping Claude-Code-Remote daemon (PID: ${pid})...`);
|
||||||
|
|
||||||
// Send SIGTERM signal
|
// Send SIGTERM signal
|
||||||
process.kill(pid, 'SIGTERM');
|
process.kill(pid, 'SIGTERM');
|
||||||
|
|
@ -188,7 +188,7 @@ class TaskPingDaemon {
|
||||||
// Wait for process to end
|
// Wait for process to end
|
||||||
await this.waitForStop(pid);
|
await this.waitForStop(pid);
|
||||||
|
|
||||||
console.log('✅ TaskPing daemon stopped');
|
console.log('✅ Claude-Code-Remote daemon stopped');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('❌ Failed to stop daemon:', error.message);
|
console.error('❌ Failed to stop daemon:', error.message);
|
||||||
|
|
||||||
|
|
@ -201,7 +201,7 @@ class TaskPingDaemon {
|
||||||
}
|
}
|
||||||
|
|
||||||
async restart() {
|
async restart() {
|
||||||
console.log('🔄 Restarting TaskPing daemon...');
|
console.log('🔄 Restarting Claude-Code-Remote daemon...');
|
||||||
await this.stop();
|
await this.stop();
|
||||||
await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2 seconds
|
await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2 seconds
|
||||||
await this.start();
|
await this.start();
|
||||||
|
|
@ -223,7 +223,7 @@ class TaskPingDaemon {
|
||||||
showStatus() {
|
showStatus() {
|
||||||
const status = this.getStatus();
|
const status = this.getStatus();
|
||||||
|
|
||||||
console.log('📊 TaskPing daemon status\n');
|
console.log('📊 Claude-Code-Remote daemon status\n');
|
||||||
|
|
||||||
if (status.running) {
|
if (status.running) {
|
||||||
console.log('✅ Status: Running');
|
console.log('✅ Status: Running');
|
||||||
|
|
@ -310,7 +310,7 @@ class TaskPingDaemon {
|
||||||
|
|
||||||
// Command line interface
|
// Command line interface
|
||||||
if (require.main === module) {
|
if (require.main === module) {
|
||||||
const daemon = new TaskPingDaemon();
|
const daemon = new ClaudeCodeRemoteDaemon();
|
||||||
const command = process.argv[2];
|
const command = process.argv[2];
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
|
|
@ -332,7 +332,7 @@ if (require.main === module) {
|
||||||
daemon.showStatus();
|
daemon.showStatus();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console.log('Usage: taskping-daemon <start|stop|restart|status>');
|
console.log('Usage: claude-code-remote-daemon <start|stop|restart|status>');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -342,4 +342,4 @@ if (require.main === module) {
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = TaskPingDaemon;
|
module.exports = ClaudeCodeRemoteDaemon;
|
||||||
|
|
@ -119,7 +119,7 @@ function cleanEmailText(text = '') {
|
||||||
line.includes('Session ID:') ||
|
line.includes('Session ID:') ||
|
||||||
line.includes('Session ID:') ||
|
line.includes('Session ID:') ||
|
||||||
line.includes('<noreply@pandalla.ai>') ||
|
line.includes('<noreply@pandalla.ai>') ||
|
||||||
line.includes('TaskPing Notification System') ||
|
line.includes('Claude-Code-Remote Notification System') ||
|
||||||
line.includes('on 2025') && line.includes('wrote:') ||
|
line.includes('on 2025') && line.includes('wrote:') ||
|
||||||
line.match(/^>.*/) || // Quote lines start with >
|
line.match(/^>.*/) || // Quote lines start with >
|
||||||
line.includes('From:') && line.includes('@') ||
|
line.includes('From:') && line.includes('@') ||
|
||||||
|
|
@ -160,7 +160,7 @@ function cleanEmailText(text = '') {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip remaining email quotes
|
// Skip remaining email quotes
|
||||||
if (trimmedLine.includes('TaskPing Notification System') ||
|
if (trimmedLine.includes('Claude-Code-Remote Notification System') ||
|
||||||
trimmedLine.includes('<noreply@pandalla.ai>') ||
|
trimmedLine.includes('<noreply@pandalla.ai>') ||
|
||||||
trimmedLine.includes('on 2025')) {
|
trimmedLine.includes('on 2025')) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* TaskPing Configuration Manager
|
* Claude-Code-Remote Configuration Manager
|
||||||
* Interactive configuration tool for managing settings
|
* Interactive configuration tool for managing settings
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -57,7 +57,7 @@ class ConfigurationManager {
|
||||||
|
|
||||||
async showMainMenu() {
|
async showMainMenu() {
|
||||||
while (true) {
|
while (true) {
|
||||||
console.log('\n=== TaskPing Configuration Manager ===');
|
console.log('\n=== Claude-Code-Remote Configuration Manager ===');
|
||||||
this.displayCurrentConfig();
|
this.displayCurrentConfig();
|
||||||
console.log('Options:');
|
console.log('Options:');
|
||||||
console.log('1. Basic Settings');
|
console.log('1. Basic Settings');
|
||||||
|
|
@ -416,7 +416,7 @@ class ConfigurationManager {
|
||||||
// Sender configuration
|
// Sender configuration
|
||||||
const currentFrom = emailConfig.from || '';
|
const currentFrom = emailConfig.from || '';
|
||||||
console.log(`Current sender: ${currentFrom || 'Not configured'}`);
|
console.log(`Current sender: ${currentFrom || 'Not configured'}`);
|
||||||
const fromEmail = await this.question(`Sender display name (default: TaskPing <${smtpUser}>): `);
|
const fromEmail = await this.question(`Sender display name (default: Claude-Code-Remote <${smtpUser}>): `);
|
||||||
|
|
||||||
// Build email configuration
|
// Build email configuration
|
||||||
const newEmailConfig = {
|
const newEmailConfig = {
|
||||||
|
|
@ -440,7 +440,7 @@ class ConfigurationManager {
|
||||||
pass: smtpPass || emailConfig.imap?.auth?.pass || ''
|
pass: smtpPass || emailConfig.imap?.auth?.pass || ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
from: fromEmail || `TaskPing <${smtpUser || currentUser}>`,
|
from: fromEmail || `Claude-Code-Remote <${smtpUser || currentUser}>`,
|
||||||
to: toEmail || currentTo
|
to: toEmail || currentTo
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -487,9 +487,9 @@ class ConfigurationManager {
|
||||||
|
|
||||||
showHelp() {
|
showHelp() {
|
||||||
console.log(`
|
console.log(`
|
||||||
TaskPing Configuration Manager
|
Claude-Code-Remote Configuration Manager
|
||||||
|
|
||||||
Usage: taskping config [options]
|
Usage: claude-remote config [options]
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
--show Show current configuration
|
--show Show current configuration
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* TaskPing Installer
|
* Claude-Code-Remote Installer
|
||||||
* Handles installation and configuration of Claude Code hooks
|
* Handles installation and configuration of Claude Code hooks
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -50,7 +50,7 @@ class Installer {
|
||||||
}
|
}
|
||||||
|
|
||||||
async run(args = []) {
|
async run(args = []) {
|
||||||
console.log('=== TaskPing Claude Code Installer ===\n');
|
console.log('=== Claude-Code-Remote Claude Code Installer ===\n');
|
||||||
|
|
||||||
// Check dependencies
|
// Check dependencies
|
||||||
if (!this.checkDependencies()) {
|
if (!this.checkDependencies()) {
|
||||||
|
|
@ -120,7 +120,7 @@ class Installer {
|
||||||
}
|
}
|
||||||
|
|
||||||
createHooksConfig() {
|
createHooksConfig() {
|
||||||
const taskpingPath = path.join(this.projectDir, 'taskping.js');
|
const claudeRemotePath = path.join(this.projectDir, 'claude-remote.js');
|
||||||
|
|
||||||
return {
|
return {
|
||||||
hooks: {
|
hooks: {
|
||||||
|
|
@ -130,7 +130,7 @@ class Installer {
|
||||||
hooks: [
|
hooks: [
|
||||||
{
|
{
|
||||||
type: "command",
|
type: "command",
|
||||||
command: `node "${taskpingPath}" notify --type completed`,
|
command: `node "${claudeRemotePath}" notify --type completed`,
|
||||||
timeout: 5
|
timeout: 5
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -142,7 +142,7 @@ class Installer {
|
||||||
hooks: [
|
hooks: [
|
||||||
{
|
{
|
||||||
type: "command",
|
type: "command",
|
||||||
command: `node "${taskpingPath}" notify --type waiting`,
|
command: `node "${claudeRemotePath}" notify --type waiting`,
|
||||||
timeout: 5
|
timeout: 5
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -209,8 +209,8 @@ class Installer {
|
||||||
console.log('\nTesting installation...');
|
console.log('\nTesting installation...');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const TaskPingCLI = require('../../taskping');
|
const ClaudeCodeRemoteCLI = require('../../claude-remote');
|
||||||
const cli = new TaskPingCLI();
|
const cli = new ClaudeCodeRemoteCLI();
|
||||||
await cli.init();
|
await cli.init();
|
||||||
|
|
||||||
console.log('Testing task completion notification...');
|
console.log('Testing task completion notification...');
|
||||||
|
|
@ -237,9 +237,9 @@ class Installer {
|
||||||
console.log('• You will receive reminders when Claude is waiting for input');
|
console.log('• You will receive reminders when Claude is waiting for input');
|
||||||
console.log('');
|
console.log('');
|
||||||
console.log('Common commands:');
|
console.log('Common commands:');
|
||||||
console.log(` node "${path.join(this.projectDir, 'taskping.js')}" config`);
|
console.log(` node "${path.join(this.projectDir, 'claude-remote.js')}" config`);
|
||||||
console.log(` node "${path.join(this.projectDir, 'taskping.js')}" test`);
|
console.log(` node "${path.join(this.projectDir, 'claude-remote.js')}" test`);
|
||||||
console.log(` node "${path.join(this.projectDir, 'taskping.js')}" status`);
|
console.log(` node "${path.join(this.projectDir, 'claude-remote.js')}" status`);
|
||||||
console.log('');
|
console.log('');
|
||||||
console.log('To uninstall, manually delete the hooks configuration from Claude Code settings.');
|
console.log('To uninstall, manually delete the hooks configuration from Claude Code settings.');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TaskPing PTY Relay Startup Script
|
* Claude-Code-Remote PTY Relay Startup Script
|
||||||
* Start node-pty based email command relay service
|
* Start node-pty based email command relay service
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -62,14 +62,14 @@ function createExampleSession() {
|
||||||
createdAt: Math.floor(Date.now() / 1000),
|
createdAt: Math.floor(Date.now() / 1000),
|
||||||
expiresAt: Math.floor((Date.now() + 24 * 60 * 60 * 1000) / 1000), // Expires after 24 hours
|
expiresAt: Math.floor((Date.now() + 24 * 60 * 60 * 1000) / 1000), // Expires after 24 hours
|
||||||
cwd: process.cwd(),
|
cwd: process.cwd(),
|
||||||
description: 'Test session - Include [TaskPing #TEST123] in email subject when sending'
|
description: 'Test session - Include [Claude-Code-Remote #TEST123] in email subject when sending'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
fs.writeFileSync(sessionMapPath, JSON.stringify(exampleSession, null, 2));
|
fs.writeFileSync(sessionMapPath, JSON.stringify(exampleSession, null, 2));
|
||||||
console.log(`📝 Created example session file: ${sessionMapPath}`);
|
console.log(`📝 Created example session file: ${sessionMapPath}`);
|
||||||
console.log(`🔑 Test Token: ${exampleToken}`);
|
console.log(`🔑 Test Token: ${exampleToken}`);
|
||||||
console.log(' When sending test email, include in subject: [TaskPing #TEST123]');
|
console.log(' When sending test email, include in subject: [Claude-Code-Remote #TEST123]');
|
||||||
console.log('');
|
console.log('');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -113,7 +113,7 @@ function startService() {
|
||||||
// Check single instance
|
// Check single instance
|
||||||
checkSingleInstance();
|
checkSingleInstance();
|
||||||
|
|
||||||
console.log('🚀 Starting TaskPing PTY Relay service...\n');
|
console.log('🚀 Starting Claude-Code-Remote PTY Relay service...\n');
|
||||||
|
|
||||||
const relayPath = path.join(__dirname, 'src/relay/relay-pty.js');
|
const relayPath = path.join(__dirname, 'src/relay/relay-pty.js');
|
||||||
|
|
||||||
|
|
@ -174,7 +174,7 @@ function showInstructions() {
|
||||||
// Main function
|
// Main function
|
||||||
function main() {
|
function main() {
|
||||||
console.log('╔══════════════════════════════════════════════════════════╗');
|
console.log('╔══════════════════════════════════════════════════════════╗');
|
||||||
console.log('║ TaskPing PTY Relay Service ║');
|
console.log('║ Claude-Code-Remote PTY Relay Service ║');
|
||||||
console.log('║ Email Command Relay Service - node-pty based PTY mode ║');
|
console.log('║ Email Command Relay Service - node-pty based PTY mode ║');
|
||||||
console.log('╚══════════════════════════════════════════════════════════╝\n');
|
console.log('╚══════════════════════════════════════════════════════════╝\n');
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue