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.
Files changed (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +266 -0
  3. package/bin/port-doctor.js +8 -0
  4. package/dist/cli/commands/free.d.ts +3 -0
  5. package/dist/cli/commands/free.d.ts.map +1 -0
  6. package/dist/cli/commands/free.js +120 -0
  7. package/dist/cli/commands/free.js.map +1 -0
  8. package/dist/cli/commands/overview.d.ts +3 -0
  9. package/dist/cli/commands/overview.d.ts.map +1 -0
  10. package/dist/cli/commands/overview.js +19 -0
  11. package/dist/cli/commands/overview.js.map +1 -0
  12. package/dist/cli/commands/run.d.ts +4 -0
  13. package/dist/cli/commands/run.d.ts.map +1 -0
  14. package/dist/cli/commands/run.js +133 -0
  15. package/dist/cli/commands/run.js.map +1 -0
  16. package/dist/cli/commands/why.d.ts +3 -0
  17. package/dist/cli/commands/why.d.ts.map +1 -0
  18. package/dist/cli/commands/why.js +24 -0
  19. package/dist/cli/commands/why.js.map +1 -0
  20. package/dist/cli/index.d.ts +3 -0
  21. package/dist/cli/index.d.ts.map +1 -0
  22. package/dist/cli/index.js +200 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/cli/output/formatter.d.ts +6 -0
  25. package/dist/cli/output/formatter.d.ts.map +1 -0
  26. package/dist/cli/output/formatter.js +177 -0
  27. package/dist/cli/output/formatter.js.map +1 -0
  28. package/dist/cli/output/json.d.ts +2 -0
  29. package/dist/cli/output/json.d.ts.map +1 -0
  30. package/dist/cli/output/json.js +6 -0
  31. package/dist/cli/output/json.js.map +1 -0
  32. package/dist/cli/output/tree.d.ts +3 -0
  33. package/dist/cli/output/tree.d.ts.map +1 -0
  34. package/dist/cli/output/tree.js +19 -0
  35. package/dist/cli/output/tree.js.map +1 -0
  36. package/dist/cli/prompts/confirm.d.ts +3 -0
  37. package/dist/cli/prompts/confirm.d.ts.map +1 -0
  38. package/dist/cli/prompts/confirm.js +53 -0
  39. package/dist/cli/prompts/confirm.js.map +1 -0
  40. package/dist/core/diagnosis/index.d.ts +4 -0
  41. package/dist/core/diagnosis/index.d.ts.map +1 -0
  42. package/dist/core/diagnosis/index.js +109 -0
  43. package/dist/core/diagnosis/index.js.map +1 -0
  44. package/dist/core/framework/index.d.ts +5 -0
  45. package/dist/core/framework/index.d.ts.map +1 -0
  46. package/dist/core/framework/index.js +211 -0
  47. package/dist/core/framework/index.js.map +1 -0
  48. package/dist/core/git/index.d.ts +3 -0
  49. package/dist/core/git/index.d.ts.map +1 -0
  50. package/dist/core/git/index.js +56 -0
  51. package/dist/core/git/index.js.map +1 -0
  52. package/dist/core/lifecycle/index.d.ts +8 -0
  53. package/dist/core/lifecycle/index.d.ts.map +1 -0
  54. package/dist/core/lifecycle/index.js +175 -0
  55. package/dist/core/lifecycle/index.js.map +1 -0
  56. package/dist/core/process/index.d.ts +9 -0
  57. package/dist/core/process/index.d.ts.map +1 -0
  58. package/dist/core/process/index.js +94 -0
  59. package/dist/core/process/index.js.map +1 -0
  60. package/dist/core/project/index.d.ts +3 -0
  61. package/dist/core/project/index.d.ts.map +1 -0
  62. package/dist/core/project/index.js +84 -0
  63. package/dist/core/project/index.js.map +1 -0
  64. package/dist/core/scanner/index.d.ts +5 -0
  65. package/dist/core/scanner/index.d.ts.map +1 -0
  66. package/dist/core/scanner/index.js +71 -0
  67. package/dist/core/scanner/index.js.map +1 -0
  68. package/dist/index.d.ts +11 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +11 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/platform/darwin.d.ts +27 -0
  73. package/dist/platform/darwin.d.ts.map +1 -0
  74. package/dist/platform/darwin.js +268 -0
  75. package/dist/platform/darwin.js.map +1 -0
  76. package/dist/platform/index.d.ts +4 -0
  77. package/dist/platform/index.d.ts.map +1 -0
  78. package/dist/platform/index.js +26 -0
  79. package/dist/platform/index.js.map +1 -0
  80. package/dist/platform/linux.d.ts +22 -0
  81. package/dist/platform/linux.d.ts.map +1 -0
  82. package/dist/platform/linux.js +217 -0
  83. package/dist/platform/linux.js.map +1 -0
  84. package/dist/platform/types.d.ts +40 -0
  85. package/dist/platform/types.d.ts.map +1 -0
  86. package/dist/platform/types.js +2 -0
  87. package/dist/platform/types.js.map +1 -0
  88. package/dist/platform/windows.d.ts +17 -0
  89. package/dist/platform/windows.d.ts.map +1 -0
  90. package/dist/platform/windows.js +138 -0
  91. package/dist/platform/windows.js.map +1 -0
  92. package/dist/types/index.d.ts +101 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/index.js +2 -0
  95. package/dist/types/index.js.map +1 -0
  96. package/dist/utils/exec.d.ts +16 -0
  97. package/dist/utils/exec.d.ts.map +1 -0
  98. package/dist/utils/exec.js +51 -0
  99. package/dist/utils/exec.js.map +1 -0
  100. package/dist/utils/formatting.d.ts +10 -0
  101. package/dist/utils/formatting.d.ts.map +1 -0
  102. package/dist/utils/formatting.js +60 -0
  103. package/dist/utils/formatting.js.map +1 -0
  104. package/dist/utils/redaction.d.ts +5 -0
  105. package/dist/utils/redaction.d.ts.map +1 -0
  106. package/dist/utils/redaction.js +31 -0
  107. package/dist/utils/redaction.js.map +1 -0
  108. package/package.json +56 -0
@@ -0,0 +1,3 @@
1
+ export declare function showHelp(): void;
2
+ export declare function runCLI(argv?: string[]): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function printJson(data: any): void;
2
+ //# sourceMappingURL=json.d.ts.map
@@ -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,6 @@
1
+ export function printJson(data) {
2
+ // Ensure pure valid JSON to stdout without extra trailing artifacts
3
+ const formatted = JSON.stringify(data, null, 2);
4
+ process.stdout.write(formatted + '\n');
5
+ }
6
+ //# sourceMappingURL=json.js.map
@@ -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,3 @@
1
+ import { ProcessTreeNode } from '../../types/index.js';
2
+ export declare function renderProcessTree(tree?: ProcessTreeNode[]): string;
3
+ //# sourceMappingURL=tree.d.ts.map
@@ -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,3 @@
1
+ export declare function askConfirmation(question: string, defaultYes?: boolean): Promise<boolean>;
2
+ export declare function askChoice(question: string, choices: string[]): Promise<number>;
3
+ //# sourceMappingURL=confirm.d.ts.map
@@ -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"}