port-doctor-cli 1.0.0
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/LICENSE +21 -0
- package/README.md +266 -0
- package/bin/port-doctor.js +8 -0
- package/dist/cli/commands/free.d.ts +3 -0
- package/dist/cli/commands/free.d.ts.map +1 -0
- package/dist/cli/commands/free.js +120 -0
- package/dist/cli/commands/free.js.map +1 -0
- package/dist/cli/commands/overview.d.ts +3 -0
- package/dist/cli/commands/overview.d.ts.map +1 -0
- package/dist/cli/commands/overview.js +19 -0
- package/dist/cli/commands/overview.js.map +1 -0
- package/dist/cli/commands/run.d.ts +4 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +133 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/why.d.ts +3 -0
- package/dist/cli/commands/why.d.ts.map +1 -0
- package/dist/cli/commands/why.js +24 -0
- package/dist/cli/commands/why.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +200 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output/formatter.d.ts +6 -0
- package/dist/cli/output/formatter.d.ts.map +1 -0
- package/dist/cli/output/formatter.js +177 -0
- package/dist/cli/output/formatter.js.map +1 -0
- package/dist/cli/output/json.d.ts +2 -0
- package/dist/cli/output/json.d.ts.map +1 -0
- package/dist/cli/output/json.js +6 -0
- package/dist/cli/output/json.js.map +1 -0
- package/dist/cli/output/tree.d.ts +3 -0
- package/dist/cli/output/tree.d.ts.map +1 -0
- package/dist/cli/output/tree.js +19 -0
- package/dist/cli/output/tree.js.map +1 -0
- package/dist/cli/prompts/confirm.d.ts +3 -0
- package/dist/cli/prompts/confirm.d.ts.map +1 -0
- package/dist/cli/prompts/confirm.js +53 -0
- package/dist/cli/prompts/confirm.js.map +1 -0
- package/dist/core/diagnosis/index.d.ts +4 -0
- package/dist/core/diagnosis/index.d.ts.map +1 -0
- package/dist/core/diagnosis/index.js +109 -0
- package/dist/core/diagnosis/index.js.map +1 -0
- package/dist/core/framework/index.d.ts +5 -0
- package/dist/core/framework/index.d.ts.map +1 -0
- package/dist/core/framework/index.js +211 -0
- package/dist/core/framework/index.js.map +1 -0
- package/dist/core/git/index.d.ts +3 -0
- package/dist/core/git/index.d.ts.map +1 -0
- package/dist/core/git/index.js +56 -0
- package/dist/core/git/index.js.map +1 -0
- package/dist/core/lifecycle/index.d.ts +8 -0
- package/dist/core/lifecycle/index.d.ts.map +1 -0
- package/dist/core/lifecycle/index.js +175 -0
- package/dist/core/lifecycle/index.js.map +1 -0
- package/dist/core/process/index.d.ts +9 -0
- package/dist/core/process/index.d.ts.map +1 -0
- package/dist/core/process/index.js +94 -0
- package/dist/core/process/index.js.map +1 -0
- package/dist/core/project/index.d.ts +3 -0
- package/dist/core/project/index.d.ts.map +1 -0
- package/dist/core/project/index.js +84 -0
- package/dist/core/project/index.js.map +1 -0
- package/dist/core/scanner/index.d.ts +5 -0
- package/dist/core/scanner/index.d.ts.map +1 -0
- package/dist/core/scanner/index.js +71 -0
- package/dist/core/scanner/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/platform/darwin.d.ts +27 -0
- package/dist/platform/darwin.d.ts.map +1 -0
- package/dist/platform/darwin.js +268 -0
- package/dist/platform/darwin.js.map +1 -0
- package/dist/platform/index.d.ts +4 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +26 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/linux.d.ts +22 -0
- package/dist/platform/linux.d.ts.map +1 -0
- package/dist/platform/linux.js +217 -0
- package/dist/platform/linux.js.map +1 -0
- package/dist/platform/types.d.ts +40 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +2 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/platform/windows.d.ts +17 -0
- package/dist/platform/windows.d.ts.map +1 -0
- package/dist/platform/windows.js +138 -0
- package/dist/platform/windows.js.map +1 -0
- package/dist/types/index.d.ts +101 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/exec.d.ts +16 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +51 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/formatting.d.ts +10 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +60 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/redaction.d.ts +5 -0
- package/dist/utils/redaction.d.ts.map +1 -0
- package/dist/utils/redaction.js +31 -0
- package/dist/utils/redaction.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAUA,wBAAgB,QAAQ,IAAI,IAAI,CA4C/B;AAeD,wBAAsB,MAAM,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2IxE"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { parseArgs } from 'node:util';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
import { parsePortList } from '../core/scanner/index.js';
|
|
4
|
+
import { handleOverview } from './commands/overview.js';
|
|
5
|
+
import { handleWhy } from './commands/why.js';
|
|
6
|
+
import { handleFree } from './commands/free.js';
|
|
7
|
+
import { handleRun } from './commands/run.js';
|
|
8
|
+
import { printJson } from './output/json.js';
|
|
9
|
+
export function showHelp() {
|
|
10
|
+
console.log(`
|
|
11
|
+
${pc.bold(pc.cyan('PORT DOCTOR'))} ${pc.dim('v1.0.0')}
|
|
12
|
+
Developer-first diagnostic, troubleshooting, and forensic CLI for local ports.
|
|
13
|
+
|
|
14
|
+
${pc.bold('USAGE:')}
|
|
15
|
+
${pc.cyan('port-doctor')} [options]
|
|
16
|
+
${pc.cyan('port-doctor why')} <port> [--json]
|
|
17
|
+
${pc.cyan('port-doctor free')} <port...> [--force] [--dry-run] [--json]
|
|
18
|
+
${pc.cyan('port-doctor run')} "<command>" [--json]
|
|
19
|
+
|
|
20
|
+
${pc.bold('COMMANDS:')}
|
|
21
|
+
${pc.bold('(default)')} Scan common development ports & display interactive overview
|
|
22
|
+
${pc.bold('why <port>')} Forensic diagnosis: Git branch, CWD, process tree, uptime, framework
|
|
23
|
+
${pc.bold('free <port...>')} Safely release ports (SIGINT -> SIGTERM -> fail; use --force to force-kill)
|
|
24
|
+
${pc.bold('run "<command>"')} Run dev command with conflict resolution (pre-flight check in --json mode)
|
|
25
|
+
|
|
26
|
+
${pc.bold('OPTIONS:')}
|
|
27
|
+
${pc.cyan('--json')} Output pure machine-readable JSON (pre-flight check for 'run')
|
|
28
|
+
${pc.cyan('--ports <list>')} Custom ports or range to scan (e.g. 3000,5173,8000-8080)
|
|
29
|
+
${pc.cyan('--force, -f')} Bypass confirmation & use force-kill (SIGKILL) during 'free'
|
|
30
|
+
${pc.cyan('--dry-run')} Simulate port release without killing processes
|
|
31
|
+
${pc.cyan('--help, -h')} Show this help message
|
|
32
|
+
${pc.cyan('--version, -v')} Show version number
|
|
33
|
+
|
|
34
|
+
${pc.bold('ALIASES:')}
|
|
35
|
+
${pc.dim('free -> kill, release')}
|
|
36
|
+
|
|
37
|
+
${pc.bold('EXAMPLES:')}
|
|
38
|
+
${pc.dim('# Quick dev ports overview')}
|
|
39
|
+
$ npx port-doctor-cli
|
|
40
|
+
|
|
41
|
+
${pc.dim('# Why is port 3000 blocked?')}
|
|
42
|
+
$ npx port-doctor-cli why 3000
|
|
43
|
+
|
|
44
|
+
${pc.dim('# Safely release port 3000 with confirmation (SIGINT -> SIGTERM)')}
|
|
45
|
+
$ npx port-doctor-cli free 3000
|
|
46
|
+
|
|
47
|
+
${pc.dim('# Forcefully terminate a stuck process')}
|
|
48
|
+
$ npx port-doctor-cli free 3000 --force
|
|
49
|
+
|
|
50
|
+
${pc.dim('# Run dev server with auto-healing port conflict resolution')}
|
|
51
|
+
$ npx port-doctor-cli run "npm run dev"
|
|
52
|
+
`);
|
|
53
|
+
}
|
|
54
|
+
const KNOWN_FLAGS = new Set([
|
|
55
|
+
'--json',
|
|
56
|
+
'--force',
|
|
57
|
+
'-f',
|
|
58
|
+
'--dry-run',
|
|
59
|
+
'--ports',
|
|
60
|
+
'--timeout',
|
|
61
|
+
'--help',
|
|
62
|
+
'-h',
|
|
63
|
+
'--version',
|
|
64
|
+
'-v',
|
|
65
|
+
]);
|
|
66
|
+
export async function runCLI(argv = process.argv.slice(2)) {
|
|
67
|
+
// First, check for special flags
|
|
68
|
+
if (argv.includes('--help') || argv.includes('-h') || (argv.length === 1 && argv[0] === 'help')) {
|
|
69
|
+
showHelp();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (argv.includes('--version') || argv.includes('-v') || (argv.length === 1 && argv[0] === 'version')) {
|
|
73
|
+
console.log('1.0.0');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Validate unknown flags
|
|
77
|
+
const isJsonMode = argv.includes('--json');
|
|
78
|
+
for (let i = 0; i < argv.length; i++) {
|
|
79
|
+
const arg = argv[i];
|
|
80
|
+
if (arg.startsWith('-')) {
|
|
81
|
+
const baseFlag = arg.split('=')[0];
|
|
82
|
+
if (!KNOWN_FLAGS.has(baseFlag)) {
|
|
83
|
+
if (isJsonMode) {
|
|
84
|
+
printJson({ status: 'error', error: `Unknown option "${arg}". Run port-doctor --help for available options.` });
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.error(pc.red(`✗ Error: Unknown option "${arg}". Run ${pc.cyan('port-doctor --help')} for available options.`));
|
|
88
|
+
}
|
|
89
|
+
return process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
// Skip value if flag takes an argument and was not joined with =
|
|
92
|
+
if ((baseFlag === '--ports' || baseFlag === '--timeout') && !arg.includes('=')) {
|
|
93
|
+
i++;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Parse arguments
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
parsed = parseArgs({
|
|
101
|
+
args: argv,
|
|
102
|
+
options: {
|
|
103
|
+
json: { type: 'boolean', default: false },
|
|
104
|
+
force: { type: 'boolean', short: 'f', default: false },
|
|
105
|
+
'dry-run': { type: 'boolean', default: false },
|
|
106
|
+
ports: { type: 'string' },
|
|
107
|
+
timeout: { type: 'string' },
|
|
108
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
109
|
+
version: { type: 'boolean', short: 'v', default: false },
|
|
110
|
+
},
|
|
111
|
+
allowPositionals: true,
|
|
112
|
+
strict: false,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (isJsonMode) {
|
|
117
|
+
printJson({ status: 'error', error: err.message });
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
console.error(pc.red(`✗ Error: ${err.message}`));
|
|
121
|
+
}
|
|
122
|
+
return process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
const { values, positionals } = parsed;
|
|
125
|
+
const isJson = Boolean(values.json);
|
|
126
|
+
const isForce = Boolean(values.force);
|
|
127
|
+
const isDryRun = Boolean(values['dry-run']);
|
|
128
|
+
const customPorts = values.ports ? parsePortList(values.ports) : undefined;
|
|
129
|
+
const timeout = values.timeout ? parseInt(values.timeout, 10) : undefined;
|
|
130
|
+
const firstArg = positionals[0];
|
|
131
|
+
// Route 1: `port-doctor why <port>` or `port-doctor 3000`
|
|
132
|
+
if (firstArg === 'why' || (/^\d+$/.test(firstArg || '') && positionals.length === 1)) {
|
|
133
|
+
const portStr = firstArg === 'why' ? positionals[1] : firstArg;
|
|
134
|
+
const port = parseInt(portStr, 10);
|
|
135
|
+
if (!Number.isInteger(port) || isNaN(port) || port <= 0 || port > 65535) {
|
|
136
|
+
if (isJson) {
|
|
137
|
+
printJson({ status: 'error', error: `Invalid port number "${portStr}". Port must be an integer between 1 and 65535.` });
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.error(pc.red(`✗ Error: Invalid port number "${portStr}". Port must be an integer between 1 and 65535.`));
|
|
141
|
+
}
|
|
142
|
+
return process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
await handleWhy(port, { json: isJson });
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Route 2: `port-doctor free <port...>` or `kill` or `release`
|
|
148
|
+
if (firstArg === 'free' || firstArg === 'kill' || firstArg === 'release') {
|
|
149
|
+
const rawPortArgs = positionals.slice(1);
|
|
150
|
+
if (rawPortArgs.length === 0) {
|
|
151
|
+
if (isJson) {
|
|
152
|
+
printJson({ status: 'error', error: 'Please specify at least one port to free.' });
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.error(pc.red('✗ Error: Please specify at least one port to free (e.g. `port-doctor free 3000`).'));
|
|
156
|
+
}
|
|
157
|
+
return process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
const portsToFree = [];
|
|
160
|
+
for (const pStr of rawPortArgs) {
|
|
161
|
+
const p = parseInt(pStr, 10);
|
|
162
|
+
if (!Number.isInteger(p) || isNaN(p) || p <= 0 || p > 65535) {
|
|
163
|
+
if (isJson) {
|
|
164
|
+
printJson({ status: 'error', error: `Invalid port number "${pStr}". Port must be an integer between 1 and 65535.` });
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
console.error(pc.red(`✗ Error: Invalid port number "${pStr}". Port must be an integer between 1 and 65535.`));
|
|
168
|
+
}
|
|
169
|
+
return process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
portsToFree.push(p);
|
|
172
|
+
}
|
|
173
|
+
await handleFree(portsToFree, {
|
|
174
|
+
json: isJson,
|
|
175
|
+
force: isForce,
|
|
176
|
+
dryRun: isDryRun,
|
|
177
|
+
timeout,
|
|
178
|
+
});
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// Route 3: `port-doctor run "<command>"`
|
|
182
|
+
if (firstArg === 'run') {
|
|
183
|
+
const rawCmd = positionals.slice(1).join(' ');
|
|
184
|
+
await handleRun(rawCmd, { json: isJson });
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// Route 4: Default overview `port-doctor`
|
|
188
|
+
if (!firstArg || positionals.length === 0) {
|
|
189
|
+
await handleOverview({
|
|
190
|
+
json: isJson,
|
|
191
|
+
ports: customPorts,
|
|
192
|
+
});
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Unknown command
|
|
196
|
+
console.error(pc.red(`✗ Unknown command: "${firstArg}"`));
|
|
197
|
+
console.log(`Run ${pc.cyan('port-doctor --help')} to see available commands.`);
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FreeResult, PortInfo } from '../../types/index.js';
|
|
2
|
+
export declare function formatBanner(): string;
|
|
3
|
+
export declare function formatOverviewTable(ports: PortInfo[]): string;
|
|
4
|
+
export declare function formatWhyReport(info: PortInfo): string;
|
|
5
|
+
export declare function formatFreeResult(result: FreeResult): string;
|
|
6
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../src/cli/output/formatter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAI5D,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAwE7D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAuFtD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA4B3D"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import { formatBytes, pad, shortenPath } from '../../utils/formatting.js';
|
|
3
|
+
import { renderProcessTree } from './tree.js';
|
|
4
|
+
export function formatBanner() {
|
|
5
|
+
return pc.bold(pc.cyan('PORT DOCTOR')) + ' ' + pc.dim('v1.0.0 — Local Port Forensics & Diagnostics');
|
|
6
|
+
}
|
|
7
|
+
export function formatOverviewTable(ports) {
|
|
8
|
+
const lines = [];
|
|
9
|
+
lines.push('');
|
|
10
|
+
lines.push(formatBanner());
|
|
11
|
+
lines.push('');
|
|
12
|
+
const COL_PORT = 8;
|
|
13
|
+
const COL_STATUS = 10;
|
|
14
|
+
const COL_PROCESS = 18;
|
|
15
|
+
const COL_PID = 8;
|
|
16
|
+
const COL_PROJECT = 28;
|
|
17
|
+
const COL_UPTIME = 12;
|
|
18
|
+
const TOTAL_WIDTH = COL_PORT + COL_STATUS + COL_PROCESS + COL_PID + COL_PROJECT + COL_UPTIME;
|
|
19
|
+
// Column headers
|
|
20
|
+
const colPort = pad('PORT', COL_PORT);
|
|
21
|
+
const colStatus = pad('STATUS', COL_STATUS);
|
|
22
|
+
const colProcess = pad('PROCESS', COL_PROCESS);
|
|
23
|
+
const colPid = pad('PID', COL_PID);
|
|
24
|
+
const colProject = pad('PROJECT / SERVICE', COL_PROJECT);
|
|
25
|
+
const colUptime = pad('UPTIME', COL_UPTIME);
|
|
26
|
+
lines.push(pc.bold(pc.dim(`${colPort}${colStatus}${colProcess}${colPid}${colProject}${colUptime}`)));
|
|
27
|
+
lines.push(pc.dim('─'.repeat(TOTAL_WIDTH)));
|
|
28
|
+
const busyPorts = ports.filter((p) => p.status === 'busy');
|
|
29
|
+
const freePorts = ports.filter((p) => p.status === 'free');
|
|
30
|
+
// Print busy ports first, then free ports
|
|
31
|
+
for (const p of ports) {
|
|
32
|
+
if (p.status === 'busy') {
|
|
33
|
+
const portStr = pad(p.port.toString(), COL_PORT);
|
|
34
|
+
const statusStr = pad(pc.red(pc.bold('BUSY')), COL_STATUS);
|
|
35
|
+
let rawProcName = p.process?.name || 'unknown';
|
|
36
|
+
if (rawProcName.length > COL_PROCESS - 2) {
|
|
37
|
+
rawProcName = rawProcName.slice(0, COL_PROCESS - 4) + '..';
|
|
38
|
+
}
|
|
39
|
+
const procName = pad(rawProcName, COL_PROCESS);
|
|
40
|
+
const pidStr = pad(p.pid ? p.pid.toString() : '-', COL_PID);
|
|
41
|
+
let serviceName = p.framework?.name || p.project?.name || '-';
|
|
42
|
+
if (p.project?.name && p.framework?.name && p.project.name !== p.framework.name) {
|
|
43
|
+
serviceName = `${p.project.name} (${p.framework.name})`;
|
|
44
|
+
}
|
|
45
|
+
const projectStr = pad(shortenPath(serviceName, COL_PROJECT - 2), COL_PROJECT);
|
|
46
|
+
const uptimeStr = pad(p.process?.uptimeFormatted || '-', COL_UPTIME);
|
|
47
|
+
lines.push(`${pc.bold(portStr)}${statusStr}${procName}${pc.dim(pidStr)}${pc.cyan(projectStr)}${uptimeStr}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Print free ports (only if scanned a smaller list or summarize)
|
|
51
|
+
for (const p of freePorts) {
|
|
52
|
+
const portStr = pad(p.port.toString(), COL_PORT);
|
|
53
|
+
const statusStr = pad(pc.green('FREE'), COL_STATUS);
|
|
54
|
+
const emptyCols = pc.dim(pad('-', COL_PROCESS) + pad('-', COL_PID) + pad('-', COL_PROJECT) + pad('-', COL_UPTIME));
|
|
55
|
+
lines.push(`${portStr}${statusStr}${emptyCols}`);
|
|
56
|
+
}
|
|
57
|
+
lines.push(pc.dim('─'.repeat(TOTAL_WIDTH)));
|
|
58
|
+
lines.push(pc.dim(`Scanned ${ports.length} ports • `) +
|
|
59
|
+
pc.red(pc.bold(`${busyPorts.length} occupied`)) +
|
|
60
|
+
pc.dim(` • `) +
|
|
61
|
+
pc.green(pc.bold(`${freePorts.length} available`)));
|
|
62
|
+
lines.push('');
|
|
63
|
+
lines.push(pc.dim(`Run ${pc.cyan('port-doctor why <port>')} for detailed forensics, or ${pc.cyan('port-doctor free <port>')} to release.`));
|
|
64
|
+
lines.push('');
|
|
65
|
+
return lines.join('\n');
|
|
66
|
+
}
|
|
67
|
+
export function formatWhyReport(info) {
|
|
68
|
+
const lines = [];
|
|
69
|
+
lines.push('');
|
|
70
|
+
if (info.status === 'free') {
|
|
71
|
+
lines.push(pc.bold(pc.green(`✓ PORT ${info.port} IS FREE`)));
|
|
72
|
+
lines.push('');
|
|
73
|
+
lines.push(` No process is currently listening on port ${pc.bold(info.port.toString())}.`);
|
|
74
|
+
lines.push(` It is available for your development server to use.`);
|
|
75
|
+
lines.push('');
|
|
76
|
+
return lines.join('\n');
|
|
77
|
+
}
|
|
78
|
+
lines.push(pc.bold(pc.red(`● PORT ${info.port} IS OCCUPIED`)));
|
|
79
|
+
lines.push('');
|
|
80
|
+
// 1. Process Section
|
|
81
|
+
lines.push(pc.bold(pc.cyan('Process')));
|
|
82
|
+
lines.push(` Name: ${pc.bold(info.process?.name || 'unknown')}`);
|
|
83
|
+
lines.push(` PID: ${pc.bold(info.pid?.toString() || 'unknown')}${info.process?.user ? pc.dim(` (User: ${info.process.user})`) : ''}`);
|
|
84
|
+
if (info.process?.fullCommand) {
|
|
85
|
+
lines.push(` Command: ${pc.white(info.process.fullCommand)}`);
|
|
86
|
+
}
|
|
87
|
+
if (info.process?.uptimeFormatted) {
|
|
88
|
+
lines.push(` Uptime: ${info.process.uptimeFormatted}`);
|
|
89
|
+
}
|
|
90
|
+
if (info.process?.memoryBytes) {
|
|
91
|
+
lines.push(` Memory: ${formatBytes(info.process.memoryBytes)}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push('');
|
|
94
|
+
// 2. Project Section
|
|
95
|
+
lines.push(pc.bold(pc.cyan('Project')));
|
|
96
|
+
if (info.project) {
|
|
97
|
+
lines.push(` Name: ${pc.bold(info.project.name)}`);
|
|
98
|
+
lines.push(` Path: ${info.project.rootDirectory}`);
|
|
99
|
+
if (info.git?.isGitRepo) {
|
|
100
|
+
const dirtyTag = info.git.isDirty ? pc.yellow(` [dirty: +${info.git.uncommittedFilesCount} files]`) : pc.green(' [clean]');
|
|
101
|
+
lines.push(` Git: ${info.git.repoName || 'yes'}`);
|
|
102
|
+
lines.push(` Branch: ${pc.magenta(info.git.branch || 'unknown')}${dirtyTag}`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
lines.push(` Git: ${pc.dim('Not a git repository')}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
lines.push(` Directory: ${info.process?.cwd || pc.dim('Not detected')}`);
|
|
110
|
+
lines.push(` Project: ${pc.dim('No project manifest (package.json) found')}`);
|
|
111
|
+
}
|
|
112
|
+
lines.push('');
|
|
113
|
+
// 3. Framework / Service Section
|
|
114
|
+
lines.push(pc.bold(pc.cyan('Service / Framework')));
|
|
115
|
+
if (info.framework) {
|
|
116
|
+
lines.push(` Type: ${pc.bold(info.framework.name)} ${pc.dim(`(${info.framework.category})`)}`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
lines.push(` Type: ${pc.dim('Generic process')}`);
|
|
120
|
+
}
|
|
121
|
+
lines.push('');
|
|
122
|
+
// 4. Process Tree Section
|
|
123
|
+
lines.push(pc.bold(pc.cyan('Process Tree')));
|
|
124
|
+
lines.push(renderProcessTree(info.processTree));
|
|
125
|
+
lines.push('');
|
|
126
|
+
// 5. Listening Interface
|
|
127
|
+
lines.push(pc.bold(pc.cyan('Listening on')));
|
|
128
|
+
const formatAddr = (addr, port) => (addr.includes(':') ? `[${addr}]:${port}` : `${addr}:${port}`);
|
|
129
|
+
if (info.allAddresses && info.allAddresses.length > 1) {
|
|
130
|
+
const addrs = info.allAddresses.map((a) => formatAddr(a, info.port)).join(', ');
|
|
131
|
+
lines.push(` ${addrs} (${info.protocol.toUpperCase()})`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
lines.push(` ${formatAddr(info.address || '0.0.0.0', info.port)} (${info.protocol.toUpperCase()})`);
|
|
135
|
+
}
|
|
136
|
+
lines.push('');
|
|
137
|
+
// 6. Diagnosis Section
|
|
138
|
+
if (info.diagnosis) {
|
|
139
|
+
lines.push(pc.bold(pc.yellow('Diagnosis')));
|
|
140
|
+
lines.push(` ${info.diagnosis.summary}`);
|
|
141
|
+
if (info.diagnosis.suggestedAction) {
|
|
142
|
+
lines.push('');
|
|
143
|
+
lines.push(pc.bold(pc.green('Suggested Action')));
|
|
144
|
+
lines.push(` ${info.diagnosis.suggestedAction}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
lines.push('');
|
|
148
|
+
return lines.join('\n');
|
|
149
|
+
}
|
|
150
|
+
export function formatFreeResult(result) {
|
|
151
|
+
const lines = [];
|
|
152
|
+
lines.push('');
|
|
153
|
+
if (result.method === 'none' && result.success) {
|
|
154
|
+
lines.push(pc.green(`✓ Port ${result.port} is already free.`));
|
|
155
|
+
lines.push('');
|
|
156
|
+
return lines.join('\n');
|
|
157
|
+
}
|
|
158
|
+
if (result.success) {
|
|
159
|
+
lines.push(pc.green(pc.bold(`✓ Successfully released port ${result.port}`)));
|
|
160
|
+
lines.push(` Terminated PID ${result.pid} (${result.processName}) using ${result.method}.`);
|
|
161
|
+
if (result.projectName) {
|
|
162
|
+
lines.push(` Project: ${result.projectName}`);
|
|
163
|
+
}
|
|
164
|
+
lines.push(` Time taken: ${result.timeTakenMs}ms`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
lines.push(pc.red(pc.bold(`✗ Failed to release port ${result.port}`)));
|
|
168
|
+
lines.push(` Target PID ${result.pid} (${result.processName}) is still running.`);
|
|
169
|
+
if (result.error) {
|
|
170
|
+
lines.push(` Reason: ${result.error}`);
|
|
171
|
+
}
|
|
172
|
+
lines.push(` Try: 'port-doctor free ${result.port} --force'`);
|
|
173
|
+
}
|
|
174
|
+
lines.push('');
|
|
175
|
+
return lines.join('\n');
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../src/cli/output/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAiB;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,QAAQ,GAAG,CAAC,CAAC;IACnB,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,CAAC,CAAC;IAClB,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;IAE7F,iBAAiB;IACjB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,GAAG,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAE5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IACrG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAE3D,0CAA0C;IAC1C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAE3D,IAAI,WAAW,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;YAC/C,IAAI,WAAW,CAAC,MAAM,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBACzC,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAC7D,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAE5D,IAAI,WAAW,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC;YAC9D,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAChF,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC;YAC1D,CAAC;YACD,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAC/E,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,eAAe,IAAI,GAAG,EAAE,UAAU,CAAC,CAAC;YAErE,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;QACnH,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CACR,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,WAAW,CAAC;QACxC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,WAAW,CAAC,CAAC;QAC/C,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QACb,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC,CACrD,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,+BAA+B,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5I,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,+CAA+C,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;QAC5F,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,qBAAqB;IACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5I,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,eAAe,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,qBAAqB;IACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,qBAAqB,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC3H,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,0CAA0C,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,iCAAiC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,0BAA0B;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,yBAAyB;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAClH,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACvG,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,uBAAuB;IACvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,WAAW,WAAW,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7F,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,WAAW,qBAAqB,CAAC,CAAC;QACnF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/cli/output/json.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAIzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/cli/output/json.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,IAAS;IACjC,oEAAoE;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../../src/cli/output/tree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,GAAG,MAAM,CAoBlE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
export function renderProcessTree(tree) {
|
|
3
|
+
if (!tree || tree.length === 0) {
|
|
4
|
+
return pc.dim('Not available');
|
|
5
|
+
}
|
|
6
|
+
const lines = [];
|
|
7
|
+
for (let i = 0; i < tree.length; i++) {
|
|
8
|
+
const node = tree[i];
|
|
9
|
+
const isLast = i === tree.length - 1;
|
|
10
|
+
const indent = ' '.repeat(i);
|
|
11
|
+
const connector = i === 0 ? '' : '└─ ';
|
|
12
|
+
const nodeText = isLast
|
|
13
|
+
? pc.cyan(pc.bold(node.name)) + pc.dim(` (PID ${node.pid})`)
|
|
14
|
+
: pc.white(node.name) + pc.dim(` (PID ${node.pid})`);
|
|
15
|
+
lines.push(`${indent}${connector}${nodeText}`);
|
|
16
|
+
}
|
|
17
|
+
return lines.join('\n');
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/cli/output/tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAEvC,MAAM,QAAQ,GAAG,MAAM;YACrB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC;YAC5D,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QAEvD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../../src/cli/prompts/confirm.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CA0B5F;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BpF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as readline from 'node:readline';
|
|
2
|
+
export async function askConfirmation(question, defaultYes = false) {
|
|
3
|
+
// If not running in an interactive TTY, return default
|
|
4
|
+
if (!process.stdin.isTTY) {
|
|
5
|
+
return defaultYes;
|
|
6
|
+
}
|
|
7
|
+
const rl = readline.createInterface({
|
|
8
|
+
input: process.stdin,
|
|
9
|
+
output: process.stdout,
|
|
10
|
+
});
|
|
11
|
+
const promptSuffix = defaultYes ? ' [Y/n] ' : ' [y/N] ';
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
rl.question(question + promptSuffix, (answer) => {
|
|
14
|
+
rl.close();
|
|
15
|
+
const trimmed = answer.trim().toLowerCase();
|
|
16
|
+
if (!trimmed) {
|
|
17
|
+
resolve(defaultYes);
|
|
18
|
+
}
|
|
19
|
+
else if (trimmed === 'y' || trimmed === 'yes') {
|
|
20
|
+
resolve(true);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
resolve(false);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export async function askChoice(question, choices) {
|
|
29
|
+
if (!process.stdin.isTTY) {
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
const rl = readline.createInterface({
|
|
33
|
+
input: process.stdin,
|
|
34
|
+
output: process.stdout,
|
|
35
|
+
});
|
|
36
|
+
console.log('\n' + question);
|
|
37
|
+
choices.forEach((choice, idx) => {
|
|
38
|
+
console.log(` ${idx + 1}. ${choice}`);
|
|
39
|
+
});
|
|
40
|
+
return new Promise((resolve) => {
|
|
41
|
+
rl.question('\nEnter your choice (1-' + choices.length + '): ', (answer) => {
|
|
42
|
+
rl.close();
|
|
43
|
+
const num = parseInt(answer.trim(), 10);
|
|
44
|
+
if (!isNaN(num) && num >= 1 && num <= choices.length) {
|
|
45
|
+
resolve(num - 1);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
resolve(0);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../../src/cli/prompts/confirm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,UAAU,GAAG,KAAK;IACxE,uDAAuD;IACvD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAExD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,GAAG,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;YAC9C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;iBAAM,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAiB;IACjE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,yBAAyB,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE;YACzE,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACrD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAC,CAAC,CAAC;YACb,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { FrameworkInfo, PortDiagnosis, PortInfo, ProcessInfo } from '../../types/index.js';
|
|
2
|
+
export declare function isOrphanDevProcess(process?: ProcessInfo, framework?: FrameworkInfo): boolean;
|
|
3
|
+
export declare function diagnosePort(info: Partial<PortInfo>): PortDiagnosis;
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/diagnosis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG3F,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,OAAO,CA+B5F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,aAAa,CAuFnE"}
|