ninja-terminals 2.2.3 → 2.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +3 -3
- package/mcp-server.js +44 -17
- package/package.json +1 -1
- package/server.js +1 -1
package/cli.js
CHANGED
|
@@ -32,7 +32,7 @@ USAGE
|
|
|
32
32
|
OPTIONS
|
|
33
33
|
--setup Configure MCP server + orchestrator prompt (run once)
|
|
34
34
|
--port <number> Port to listen on (default: 3300)
|
|
35
|
-
--terminals <number> Number of terminals to spawn (default: 4)
|
|
35
|
+
--terminals <number> Number of terminals to spawn (default: 2, paid: 4)
|
|
36
36
|
--cwd <path> Working directory for terminals (default: current dir)
|
|
37
37
|
--token <jwt> Auth token for Pro users / CI (skips browser login)
|
|
38
38
|
--offline Offline mode for Pro users (skips backend validation)
|
|
@@ -89,7 +89,7 @@ if (hasFlag('--setup')) {
|
|
|
89
89
|
command: 'node',
|
|
90
90
|
args: [path.join(npmRoot, 'mcp-server.js')],
|
|
91
91
|
env: {
|
|
92
|
-
NINJA_TERMINAL_COUNT: '4'
|
|
92
|
+
NINJA_TERMINAL_COUNT: '2', // Free tier default. Set to '4' for paid.
|
|
93
93
|
NINJA_LOG_LEVEL: 'info'
|
|
94
94
|
}
|
|
95
95
|
};
|
|
@@ -180,7 +180,7 @@ MCP tools available after restart:
|
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
const port = parseInt(getArg('--port', '3300'), 10);
|
|
183
|
-
const terminals = parseInt(getArg('--terminals', '
|
|
183
|
+
const terminals = parseInt(getArg('--terminals', '2'), 10); // Free tier default
|
|
184
184
|
const cwd = getArg('--cwd', process.cwd());
|
|
185
185
|
const token = getArg('--token', null);
|
|
186
186
|
const offline = hasFlag('--offline');
|
package/mcp-server.js
CHANGED
|
@@ -694,24 +694,51 @@ mcpServer.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
694
694
|
|
|
695
695
|
// ── Start Servers ───────────────────────────────────────────
|
|
696
696
|
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
for (let i = 0; i < terminalCount; i++) {
|
|
709
|
-
const label = labels[i] || `T${i + 1}`;
|
|
710
|
-
spawnTerminal(label, [], process.cwd(), 'pro');
|
|
711
|
-
console.error(` Spawned ${label}`);
|
|
712
|
-
}
|
|
713
|
-
console.error(`All ${terminalCount} terminals ready`);
|
|
697
|
+
// Check if port is in use
|
|
698
|
+
function isPortInUse(port) {
|
|
699
|
+
return new Promise((resolve) => {
|
|
700
|
+
const net = require('net');
|
|
701
|
+
const server = net.createServer();
|
|
702
|
+
server.once('error', () => resolve(true));
|
|
703
|
+
server.once('listening', () => {
|
|
704
|
+
server.close();
|
|
705
|
+
resolve(false);
|
|
706
|
+
});
|
|
707
|
+
server.listen(port, '127.0.0.1');
|
|
714
708
|
});
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
// Proxy mode flag - when true, MCP tools should call existing server via HTTP
|
|
712
|
+
let proxyMode = false;
|
|
713
|
+
|
|
714
|
+
async function main() {
|
|
715
|
+
// Check if server.js is already running on port 3300
|
|
716
|
+
const portInUse = await isPortInUse(HTTP_PORT);
|
|
717
|
+
|
|
718
|
+
if (portInUse) {
|
|
719
|
+
// Proxy mode: server.js is already running, just run MCP on stdio
|
|
720
|
+
proxyMode = true;
|
|
721
|
+
console.error(`Ninja Terminals server already running on port ${HTTP_PORT}`);
|
|
722
|
+
console.error('MCP server starting in proxy mode (will use existing server)');
|
|
723
|
+
} else {
|
|
724
|
+
// Standalone mode: start our own HTTP server
|
|
725
|
+
httpServer.listen(HTTP_PORT, () => {
|
|
726
|
+
console.error(`Ninja Terminals HTTP server running on http://localhost:${HTTP_PORT}`);
|
|
727
|
+
|
|
728
|
+
// Auto-spawn terminals based on tier (NINJA_TERMINAL_COUNT env var)
|
|
729
|
+
// Free = 2, Paid = 4
|
|
730
|
+
const terminalCount = parseInt(process.env.NINJA_TERMINAL_COUNT || '2', 10);
|
|
731
|
+
const labels = ['T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8'];
|
|
732
|
+
|
|
733
|
+
console.error(`Auto-spawning ${terminalCount} terminals...`);
|
|
734
|
+
for (let i = 0; i < terminalCount; i++) {
|
|
735
|
+
const label = labels[i] || `T${i + 1}`;
|
|
736
|
+
spawnTerminal(label, [], process.cwd(), 'pro');
|
|
737
|
+
console.error(` Spawned ${label}`);
|
|
738
|
+
}
|
|
739
|
+
console.error(`All ${terminalCount} terminals ready`);
|
|
740
|
+
});
|
|
741
|
+
}
|
|
715
742
|
|
|
716
743
|
// Start MCP server on stdio
|
|
717
744
|
const transport = new StdioServerTransport();
|
package/package.json
CHANGED
package/server.js
CHANGED
|
@@ -23,7 +23,7 @@ const { runPostSession } = require('./lib/post-session');
|
|
|
23
23
|
|
|
24
24
|
// ── Config ──────────────────────────────────────────────────
|
|
25
25
|
const PORT = process.env.PORT || 3300;
|
|
26
|
-
const DEFAULT_TERMINALS = parseInt(process.env.DEFAULT_TERMINALS || '
|
|
26
|
+
const DEFAULT_TERMINALS = parseInt(process.env.DEFAULT_TERMINALS || '2', 10); // Free tier default
|
|
27
27
|
const CLAUDE_CMD = process.env.CLAUDE_CMD || 'claude --dangerously-skip-permissions';
|
|
28
28
|
const SHELL = process.env.SHELL || '/bin/zsh';
|
|
29
29
|
const PROJECT_DIR = __dirname;
|