Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@termly-dev/cli-dev

Package Overview
Dependencies
Maintainers
1
Versions
64
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@termly-dev/cli-dev - npm Package Compare versions

Package version was removed
This package version has been unpublished, mostly likely due to security reasons
Comparing version
1.1.10
to
1.2.7
+12
-1
lib/ai-tools/detector.js

@@ -23,4 +23,9 @@ const { getAllTools, getToolVersion } = require('./registry');

// On Windows, checkInstalled may return full path instead of true
// Use this full path as command if available (for .cmd/.bat files)
const toolCommand = (typeof isInstalled === 'string') ? isInstalled : tool.command;
installedTools.push({
...tool,
command: toolCommand,
version,

@@ -30,3 +35,3 @@ installed: true

logger.debug(`Found: ${tool.displayName} v${version}`);
logger.debug(`Found: ${tool.displayName} v${version} (command: ${toolCommand})`);
}

@@ -57,2 +62,7 @@ } catch (err) {

const version = await getToolVersion(tool);
// On Windows, checkInstalled may return full path instead of true
// Use this full path as command if available (for .cmd/.bat files)
const toolCommand = (typeof isInstalled === 'string') ? isInstalled : tool.command;
return {

@@ -62,2 +72,3 @@ installed: true,

...tool,
command: toolCommand,
version

@@ -64,0 +75,0 @@ }

@@ -10,3 +10,3 @@ const { exec } = require('child_process');

command: 'claude',
args: ['code'],
args: [],
displayName: 'Claude Code',

@@ -173,2 +173,4 @@ description: 'Anthropic\'s AI coding assistant',

// Check if command exists
// On Windows, returns full path to command (for reliable PTY execution)
// On Unix, returns true/false
async function commandExists(command) {

@@ -178,3 +180,28 @@ try {

const checkCommand = isWindows ? `where ${command}` : `command -v ${command}`;
await execAsync(checkCommand);
const { stdout } = await execAsync(checkCommand);
// On Windows, always return full path
// PTY spawned via cmd.exe may have different PATH than parent PowerShell
// where.exe returns multiple lines if multiple matches exist, use first
if (isWindows && stdout.trim()) {
// Handle both \r\n (Windows) and \n line endings
const lines = stdout.trim().split(/\r?\n/);
let firstLine = lines[0].trim();
if (firstLine && firstLine.length > 0) {
// where.exe may return path without extension
// If path doesn't end with .cmd/.bat/.exe, prefer .cmd version if it exists
const hasExtension = /\.(cmd|bat|exe)$/i.test(firstLine);
if (!hasExtension) {
// Check if .cmd file exists
const fs = require('fs');
const cmdPath = `${firstLine}.cmd`;
if (fs.existsSync(cmdPath)) {
return cmdPath;
}
}
return firstLine;
}
}
return true;

@@ -181,0 +208,0 @@ } catch {

+0
-32

@@ -291,20 +291,2 @@ const WebSocket = require('ws');

// Handle input from mobile
// Helper: escape special characters for logging
escapeSpecialChars(data) {
return data
.replace(/\r/g, '\\r')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
.replace(/\x1b/g, '\\x1b')
.replace(/\x00/g, '\\x00');
}
// Helper: convert to hex dump
toHexDump(data, maxLength = 200) {
const bytes = Buffer.from(data, 'utf8');
const hex = bytes.toString('hex').match(/.{1,2}/g)?.join(' ') || '';
const truncated = hex.length > maxLength ? hex.substring(0, maxLength) + '...' : hex;
return truncated;
}
handleInput(message) {

@@ -319,9 +301,2 @@ if (!this.aesKey) {

// Log decrypted input for debugging
if (process.env.DEBUG === '1' || process.argv.includes('--debug')) {
logger.debug(`WS Input received (${decrypted.length} bytes):`);
logger.debug(` Text: ${this.escapeSpecialChars(decrypted.substring(0, 100))}`);
logger.debug(` Hex: ${this.toHexDump(decrypted)}`);
}
if (this.onInputCallback) {

@@ -488,9 +463,2 @@ this.onInputCallback(decrypted);

try {
// Log output before encryption for debugging
if (process.env.DEBUG === '1' || process.argv.includes('--debug')) {
logger.debug(`WS Output sending (${data.length} bytes):`);
logger.debug(` Text: ${this.escapeSpecialChars(data.substring(0, 100))}`);
logger.debug(` Hex: ${this.toHexDump(data)}`);
}
const encrypted = encrypt(data, this.aesKey);

@@ -497,0 +465,0 @@

@@ -46,5 +46,15 @@ const pty = require('node-pty');

if (isWindows) {
// Use cmd.exe to spawn the command (handles .cmd/.bat files)
spawnCommand = 'cmd.exe';
spawnArgs = ['/c', this.tool.command, ...args];
// On Windows with full paths: spawn .cmd/.bat directly (node-pty supports this)
// Avoids cmd.exe quote escaping issues
const isFullPath = this.tool.command.includes('\\') || this.tool.command.includes('/');
if (isFullPath) {
// Direct spawn - node-pty handles .cmd/.bat files automatically
spawnCommand = this.tool.command;
spawnArgs = args;
} else {
// For commands in PATH, use cmd.exe
spawnCommand = 'cmd.exe';
spawnArgs = ['/c', this.tool.command, ...args];
}
}

@@ -51,0 +61,0 @@

{
"name": "@termly-dev/cli-dev",
"version": "1.1.10",
"version": "1.2.7",
"description": "Mirror your AI coding sessions to mobile - control Claude, Aider, Copilot, and 17+ tools from your phone (Development version)",

@@ -5,0 +5,0 @@ "main": "index.js",