devports 0.0.1 → 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/CHANGELOG.md +80 -0
- package/LICENSE +21 -0
- package/README.md +810 -29
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +329 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/allocate.command.d.ts +8 -0
- package/dist/commands/allocate.command.d.ts.map +1 -0
- package/dist/commands/allocate.command.js +84 -0
- package/dist/commands/allocate.command.js.map +1 -0
- package/dist/commands/base-command.d.ts +28 -0
- package/dist/commands/base-command.d.ts.map +1 -0
- package/dist/commands/base-command.js +33 -0
- package/dist/commands/base-command.js.map +1 -0
- package/dist/commands/check.command.d.ts +7 -0
- package/dist/commands/check.command.d.ts.map +1 -0
- package/dist/commands/check.command.js +44 -0
- package/dist/commands/check.command.js.map +1 -0
- package/dist/commands/completion.command.d.ts +7 -0
- package/dist/commands/completion.command.d.ts.map +1 -0
- package/dist/commands/completion.command.js +116 -0
- package/dist/commands/completion.command.js.map +1 -0
- package/dist/commands/gitignore.command.d.ts +7 -0
- package/dist/commands/gitignore.command.d.ts.map +1 -0
- package/dist/commands/gitignore.command.js +61 -0
- package/dist/commands/gitignore.command.js.map +1 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +35 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/info.command.d.ts +7 -0
- package/dist/commands/info.command.d.ts.map +1 -0
- package/dist/commands/info.command.js +40 -0
- package/dist/commands/info.command.js.map +1 -0
- package/dist/commands/list.command.d.ts +8 -0
- package/dist/commands/list.command.d.ts.map +1 -0
- package/dist/commands/list.command.js +165 -0
- package/dist/commands/list.command.js.map +1 -0
- package/dist/commands/release.command.d.ts +8 -0
- package/dist/commands/release.command.d.ts.map +1 -0
- package/dist/commands/release.command.js +89 -0
- package/dist/commands/release.command.js.map +1 -0
- package/dist/commands/render.command.d.ts +7 -0
- package/dist/commands/render.command.d.ts.map +1 -0
- package/dist/commands/render.command.js +53 -0
- package/dist/commands/render.command.js.map +1 -0
- package/dist/commands/reserve.command.d.ts +7 -0
- package/dist/commands/reserve.command.d.ts.map +1 -0
- package/dist/commands/reserve.command.js +42 -0
- package/dist/commands/reserve.command.js.map +1 -0
- package/dist/commands/setup.command.d.ts +7 -0
- package/dist/commands/setup.command.d.ts.map +1 -0
- package/dist/commands/setup.command.js +43 -0
- package/dist/commands/setup.command.js.map +1 -0
- package/dist/commands/status.command.d.ts +7 -0
- package/dist/commands/status.command.d.ts.map +1 -0
- package/dist/commands/status.command.js +41 -0
- package/dist/commands/status.command.js.map +1 -0
- package/dist/commands/unreserve.command.d.ts +7 -0
- package/dist/commands/unreserve.command.d.ts.map +1 -0
- package/dist/commands/unreserve.command.js +38 -0
- package/dist/commands/unreserve.command.js.map +1 -0
- package/dist/commands/worktree-add.command.d.ts +7 -0
- package/dist/commands/worktree-add.command.d.ts.map +1 -0
- package/dist/commands/worktree-add.command.js +68 -0
- package/dist/commands/worktree-add.command.js.map +1 -0
- package/dist/commands/worktree-remove.command.d.ts +7 -0
- package/dist/commands/worktree-remove.command.d.ts.map +1 -0
- package/dist/commands/worktree-remove.command.js +33 -0
- package/dist/commands/worktree-remove.command.js.map +1 -0
- package/dist/completion/bash-completion-template.d.ts +5 -0
- package/dist/completion/bash-completion-template.d.ts.map +1 -0
- package/dist/completion/bash-completion-template.js +14 -0
- package/dist/completion/bash-completion-template.js.map +1 -0
- package/dist/completion/bash.sh +208 -0
- package/dist/completion/completion-data.d.ts +16 -0
- package/dist/completion/completion-data.d.ts.map +1 -0
- package/dist/completion/completion-data.js +38 -0
- package/dist/completion/completion-data.js.map +1 -0
- package/dist/completion/index.d.ts +24 -0
- package/dist/completion/index.d.ts.map +1 -0
- package/dist/completion/index.js +30 -0
- package/dist/completion/index.js.map +1 -0
- package/dist/completion/shell-config.d.ts +27 -0
- package/dist/completion/shell-config.d.ts.map +1 -0
- package/dist/completion/shell-config.js +243 -0
- package/dist/completion/shell-config.js.map +1 -0
- package/dist/completion/zsh-completion-template.d.ts +5 -0
- package/dist/completion/zsh-completion-template.d.ts.map +1 -0
- package/dist/completion/zsh-completion-template.js +14 -0
- package/dist/completion/zsh-completion-template.js.map +1 -0
- package/dist/completion/zsh.sh +164 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +111 -0
- package/dist/config.js.map +1 -0
- package/dist/devports-1.0.0.tgz +0 -0
- package/dist/execution.d.ts +31 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +110 -0
- package/dist/execution.js.map +1 -0
- package/dist/gitignore.d.ts +22 -0
- package/dist/gitignore.d.ts.map +1 -0
- package/dist/gitignore.js +142 -0
- package/dist/gitignore.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/port-manager.d.ts +33 -0
- package/dist/port-manager.d.ts.map +1 -0
- package/dist/port-manager.js +169 -0
- package/dist/port-manager.js.map +1 -0
- package/dist/port-utils.d.ts +9 -0
- package/dist/port-utils.d.ts.map +1 -0
- package/dist/port-utils.js +38 -0
- package/dist/port-utils.js.map +1 -0
- package/dist/render.d.ts +54 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +286 -0
- package/dist/render.js.map +1 -0
- package/dist/services/lock-manager.d.ts +46 -0
- package/dist/services/lock-manager.d.ts.map +1 -0
- package/dist/services/lock-manager.js +118 -0
- package/dist/services/lock-manager.js.map +1 -0
- package/dist/services/response-formatter.d.ts +45 -0
- package/dist/services/response-formatter.d.ts.map +1 -0
- package/dist/services/response-formatter.js +102 -0
- package/dist/services/response-formatter.js.map +1 -0
- package/dist/services/validation-service.d.ts +109 -0
- package/dist/services/validation-service.d.ts.map +1 -0
- package/dist/services/validation-service.js +267 -0
- package/dist/services/validation-service.js.map +1 -0
- package/dist/setup.d.ts +20 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +243 -0
- package/dist/setup.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +69 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +344 -0
- package/dist/validation.js.map +1 -0
- package/dist/worktree.d.ts +24 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +245 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +90 -6
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Secure CLI wrapper with comprehensive input validation
|
|
4
|
+
* This file provides security-hardened versions of all CLI commands
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
const program = new Command();
|
|
8
|
+
const ASCII_HEADER = `
|
|
9
|
+
██████╗ ███████╗██╗ ██╗██████╗ ██████╗ ██████╗ ████████╗███████╗
|
|
10
|
+
██╔══██╗██╔════╝██║ ██║██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝
|
|
11
|
+
██║ ██║█████╗ ██║ ██║██████╔╝██║ ██║██████╔╝ ██║ ███████╗
|
|
12
|
+
██║ ██║██╔══╝ ╚██╗ ██╔╝██╔═══╝ ██║ ██║██╔══██╗ ██║ ╚════██║
|
|
13
|
+
██████╔╝███████╗ ╚████╔╝ ██║ ╚██████╔╝██║ ██║ ██║ ███████║
|
|
14
|
+
╚═════╝ ╚══════╝ ╚═══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝
|
|
15
|
+
|
|
16
|
+
Port allocation manager for multi-project development
|
|
17
|
+
`;
|
|
18
|
+
// Override process.stdout.write and process.stderr.write to add extra line after output
|
|
19
|
+
const originalStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
20
|
+
const originalStderrWrite = process.stderr.write.bind(process.stderr);
|
|
21
|
+
// Track if we should add blank lines (disabled for quiet/json modes)
|
|
22
|
+
let shouldAddBlankLines = true;
|
|
23
|
+
function setShouldAddBlankLines(value) {
|
|
24
|
+
shouldAddBlankLines = value;
|
|
25
|
+
}
|
|
26
|
+
function addBlankLineAfterOutput(output) {
|
|
27
|
+
if (!shouldAddBlankLines) {
|
|
28
|
+
return output;
|
|
29
|
+
}
|
|
30
|
+
// Check if this looks like help output by looking for common help patterns
|
|
31
|
+
if (output.includes('Usage:') &&
|
|
32
|
+
(output.includes('Options:') || output.includes('Commands:'))) {
|
|
33
|
+
return `${output}\n`;
|
|
34
|
+
}
|
|
35
|
+
// Check if this looks like command completion (ends with success/error emoji and doesn't already end with newline)
|
|
36
|
+
if ((output.includes('✅') || output.includes('❌')) &&
|
|
37
|
+
!output.endsWith('\n\n')) {
|
|
38
|
+
return `${output}\n`;
|
|
39
|
+
}
|
|
40
|
+
return output;
|
|
41
|
+
}
|
|
42
|
+
process.stdout.write = ((chunk, encoding, callback) => {
|
|
43
|
+
if (typeof chunk === 'string') {
|
|
44
|
+
chunk = addBlankLineAfterOutput(chunk);
|
|
45
|
+
}
|
|
46
|
+
return originalStdoutWrite(chunk, encoding, callback);
|
|
47
|
+
});
|
|
48
|
+
process.stderr.write = ((chunk, encoding, callback) => {
|
|
49
|
+
if (typeof chunk === 'string') {
|
|
50
|
+
chunk = addBlankLineAfterOutput(chunk);
|
|
51
|
+
}
|
|
52
|
+
return originalStderrWrite(chunk, encoding, callback);
|
|
53
|
+
});
|
|
54
|
+
program
|
|
55
|
+
.name('devports')
|
|
56
|
+
.description('Port allocation manager for multi-project development')
|
|
57
|
+
.version('0.1.0')
|
|
58
|
+
.addHelpText('before', ASCII_HEADER);
|
|
59
|
+
// Setup command
|
|
60
|
+
const setupCmd = new SetupCommand();
|
|
61
|
+
program
|
|
62
|
+
.command('setup')
|
|
63
|
+
.description(setupCmd.description)
|
|
64
|
+
.option('--template <file>', 'Template file to use (default: .env.devports if exists)')
|
|
65
|
+
.option('--services <services>', 'Services to allocate (comma-separated, e.g., postgres:postgres,api:api)')
|
|
66
|
+
.option('--force', 'Overwrite existing .env file (creates .env.backup)')
|
|
67
|
+
.option('--skip-render', 'Skip auto-rendering of *.devports files')
|
|
68
|
+
.option('--post-hook <script>', 'Run script after setup (passed env vars)')
|
|
69
|
+
.option('--json', 'Output as JSON')
|
|
70
|
+
.action(async (options) => {
|
|
71
|
+
// Disable blank lines for quiet or json mode
|
|
72
|
+
if (options.quiet || options.json) {
|
|
73
|
+
setShouldAddBlankLines(false);
|
|
74
|
+
}
|
|
75
|
+
// Show ASCII header for setup command (but not if --json is used)
|
|
76
|
+
if (!options.json) {
|
|
77
|
+
console.log(ASCII_HEADER);
|
|
78
|
+
}
|
|
79
|
+
const result = await setupCmd.execute([], options);
|
|
80
|
+
process.exit(result.success ? 0 : 1);
|
|
81
|
+
});
|
|
82
|
+
// Worktree command group
|
|
83
|
+
const worktreeAddCmd = new WorktreeAddCommand();
|
|
84
|
+
const worktreeRemoveCmd = new WorktreeRemoveCommand();
|
|
85
|
+
const worktree = program
|
|
86
|
+
.command('worktree')
|
|
87
|
+
.description('Git worktree integration with automatic port allocation');
|
|
88
|
+
// Worktree add
|
|
89
|
+
worktree
|
|
90
|
+
.command('add')
|
|
91
|
+
.description(worktreeAddCmd.description)
|
|
92
|
+
.argument('<path>', 'Path for the new worktree')
|
|
93
|
+
.option('-b, --branch <branch>', 'Create and checkout a new branch')
|
|
94
|
+
.option('--no-env', 'Skip .env file creation')
|
|
95
|
+
.option('--env-file <file>', 'Custom .env file name', '.env')
|
|
96
|
+
.option('--services <services>', 'Services to allocate (comma-separated, e.g., postgres:postgres,api:api)')
|
|
97
|
+
.option('--template <file>', 'Use template file for .env generation (default: .env.devports if exists)')
|
|
98
|
+
.option('--post-hook <script>', 'Run script after worktree creation (passed env vars)')
|
|
99
|
+
.option('--json', 'Output as JSON')
|
|
100
|
+
.action(async (path, options) => {
|
|
101
|
+
// Disable blank lines for json mode
|
|
102
|
+
if (options.json) {
|
|
103
|
+
setShouldAddBlankLines(false);
|
|
104
|
+
}
|
|
105
|
+
const result = await worktreeAddCmd.execute([path], options);
|
|
106
|
+
process.exit(result.success ? 0 : 1);
|
|
107
|
+
});
|
|
108
|
+
// Worktree remove
|
|
109
|
+
worktree
|
|
110
|
+
.command('remove')
|
|
111
|
+
.description(worktreeRemoveCmd.description)
|
|
112
|
+
.argument('<path>', 'Path to the worktree to remove')
|
|
113
|
+
.option('-f, --force', 'Force removal even if worktree is dirty')
|
|
114
|
+
.option('--json', 'Output as JSON')
|
|
115
|
+
.action(async (path, options) => {
|
|
116
|
+
// Disable blank lines for json mode
|
|
117
|
+
if (options.json) {
|
|
118
|
+
setShouldAddBlankLines(false);
|
|
119
|
+
}
|
|
120
|
+
const result = await worktreeRemoveCmd.execute([path], options);
|
|
121
|
+
process.exit(result.success ? 0 : 1);
|
|
122
|
+
});
|
|
123
|
+
// Allocate command
|
|
124
|
+
import { AllocateCommand } from './commands/allocate.command.js';
|
|
125
|
+
import { ReleaseCommand } from './commands/release.command.js';
|
|
126
|
+
import { ListCommand } from './commands/list.command.js';
|
|
127
|
+
import { StatusCommand } from './commands/status.command.js';
|
|
128
|
+
import { ReserveCommand } from './commands/reserve.command.js';
|
|
129
|
+
import { UnreserveCommand } from './commands/unreserve.command.js';
|
|
130
|
+
import { CheckCommand } from './commands/check.command.js';
|
|
131
|
+
import { InfoCommand } from './commands/info.command.js';
|
|
132
|
+
import { SetupCommand } from './commands/setup.command.js';
|
|
133
|
+
import { WorktreeAddCommand } from './commands/worktree-add.command.js';
|
|
134
|
+
import { WorktreeRemoveCommand } from './commands/worktree-remove.command.js';
|
|
135
|
+
import { RenderCommand } from './commands/render.command.js';
|
|
136
|
+
import { GitignoreCommand } from './commands/gitignore.command.js';
|
|
137
|
+
import { CompletionCommand } from './commands/completion.command.js';
|
|
138
|
+
const allocateCmd = new AllocateCommand();
|
|
139
|
+
program
|
|
140
|
+
.command('allocate')
|
|
141
|
+
.description(allocateCmd.description)
|
|
142
|
+
.argument('[project]', 'Project name')
|
|
143
|
+
.argument('[service]', 'Service name (e.g., postgres, api)')
|
|
144
|
+
.option('-t, --type <type>', 'Service type (postgres, mysql, redis, api, app, custom)')
|
|
145
|
+
.option('-q, --quiet', 'Only output the port number (for scripting)')
|
|
146
|
+
.option('--json', 'Output result as JSON')
|
|
147
|
+
.option('--completion <mode>', 'Output for shell completion: projects, services, types')
|
|
148
|
+
.action(async (project, service, options) => {
|
|
149
|
+
// Disable blank lines for quiet or json mode
|
|
150
|
+
if (options.quiet || options.json) {
|
|
151
|
+
setShouldAddBlankLines(false);
|
|
152
|
+
}
|
|
153
|
+
await allocateCmd.execute([project, service], options);
|
|
154
|
+
process.exit(0);
|
|
155
|
+
});
|
|
156
|
+
// Release command
|
|
157
|
+
const releaseCmd = new ReleaseCommand();
|
|
158
|
+
program
|
|
159
|
+
.command('release')
|
|
160
|
+
.description(releaseCmd.description)
|
|
161
|
+
.argument('[project]', 'Project name (or port number with --port)')
|
|
162
|
+
.argument('[service]', 'Service name (optional if using --all or --port)')
|
|
163
|
+
.option('-a, --all', 'Release all ports for this project')
|
|
164
|
+
.option('-p, --port', 'First argument is a port number to release')
|
|
165
|
+
.option('-q, --quiet', 'Suppress output (exit code indicates success)')
|
|
166
|
+
.option('--json', 'Output result as JSON')
|
|
167
|
+
.option('--completion <mode>', 'Output for shell completion: projects, services')
|
|
168
|
+
.option('--project <name>', 'Project name for completion filtering (internal use)')
|
|
169
|
+
.action(async (projectOrPort, service, options) => {
|
|
170
|
+
// Disable blank lines for quiet or json mode
|
|
171
|
+
if (options.quiet || options.json) {
|
|
172
|
+
setShouldAddBlankLines(false);
|
|
173
|
+
}
|
|
174
|
+
const args = service ? [projectOrPort, service] : [projectOrPort];
|
|
175
|
+
const result = await releaseCmd.execute(args, options);
|
|
176
|
+
process.exit(result.success ? 0 : 1);
|
|
177
|
+
});
|
|
178
|
+
// List command
|
|
179
|
+
const listCmd = new ListCommand();
|
|
180
|
+
program
|
|
181
|
+
.command('list')
|
|
182
|
+
.description(listCmd.description)
|
|
183
|
+
.option('-p, --project <project>', 'Filter by project')
|
|
184
|
+
.option('-t, --type <type>', 'Filter by service type')
|
|
185
|
+
.option('--json', 'Output as JSON')
|
|
186
|
+
.option('-q, --quiet', 'Minimal output (just port numbers, one per line)')
|
|
187
|
+
.option('--completion <mode>', 'Output for shell completion: projects, services, types')
|
|
188
|
+
.action((options) => {
|
|
189
|
+
// Disable blank lines for quiet or json mode
|
|
190
|
+
if (options.quiet || options.json) {
|
|
191
|
+
setShouldAddBlankLines(false);
|
|
192
|
+
}
|
|
193
|
+
const result = listCmd.execute([], options);
|
|
194
|
+
if (!result.success) {
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
// Status command
|
|
199
|
+
const statusCmd = new StatusCommand();
|
|
200
|
+
program
|
|
201
|
+
.command('status')
|
|
202
|
+
.description(statusCmd.description)
|
|
203
|
+
.option('--json', 'Output as JSON')
|
|
204
|
+
.option('-q, --quiet', 'Minimal output (just next available ports)')
|
|
205
|
+
.action((options) => {
|
|
206
|
+
// Disable blank lines for quiet or json mode
|
|
207
|
+
if (options.quiet || options.json) {
|
|
208
|
+
setShouldAddBlankLines(false);
|
|
209
|
+
}
|
|
210
|
+
const result = statusCmd.execute([], options);
|
|
211
|
+
process.exit(result.success ? 0 : 1);
|
|
212
|
+
});
|
|
213
|
+
// Reserve command
|
|
214
|
+
const reserveCmd = new ReserveCommand();
|
|
215
|
+
program
|
|
216
|
+
.command('reserve')
|
|
217
|
+
.description(reserveCmd.description)
|
|
218
|
+
.argument('<port>', 'Port number to reserve')
|
|
219
|
+
.argument('[reason]', 'Reason for reservation', 'Reserved')
|
|
220
|
+
.option('--json', 'Output as JSON')
|
|
221
|
+
.option('-q, --quiet', 'Suppress output')
|
|
222
|
+
.action(async (portStr, reason, options) => {
|
|
223
|
+
// Disable blank lines for quiet or json mode
|
|
224
|
+
if (options.quiet || options.json) {
|
|
225
|
+
setShouldAddBlankLines(false);
|
|
226
|
+
}
|
|
227
|
+
const result = await reserveCmd.execute([portStr, reason], options);
|
|
228
|
+
process.exit(result.success ? 0 : 1);
|
|
229
|
+
});
|
|
230
|
+
// Unreserve command
|
|
231
|
+
const unreserveCmd = new UnreserveCommand();
|
|
232
|
+
program
|
|
233
|
+
.command('unreserve')
|
|
234
|
+
.description(unreserveCmd.description)
|
|
235
|
+
.argument('<port>', 'Port number to unreserve')
|
|
236
|
+
.option('--json', 'Output as JSON')
|
|
237
|
+
.option('-q, --quiet', 'Suppress output')
|
|
238
|
+
.action(async (portStr, options) => {
|
|
239
|
+
// Disable blank lines for quiet or json mode
|
|
240
|
+
if (options.quiet || options.json) {
|
|
241
|
+
setShouldAddBlankLines(false);
|
|
242
|
+
}
|
|
243
|
+
const result = await unreserveCmd.execute([portStr], options);
|
|
244
|
+
process.exit(result.success ? 0 : 1);
|
|
245
|
+
});
|
|
246
|
+
// Check command
|
|
247
|
+
const checkCmd = new CheckCommand();
|
|
248
|
+
program
|
|
249
|
+
.command('check')
|
|
250
|
+
.description(checkCmd.description)
|
|
251
|
+
.argument('<port>', 'Port number to check')
|
|
252
|
+
.option('--json', 'Output as JSON')
|
|
253
|
+
.option('-q, --quiet', 'Silent mode (exit code only: 0=available, 1=in use)')
|
|
254
|
+
.action((portStr, options) => {
|
|
255
|
+
// Disable blank lines for quiet or json mode
|
|
256
|
+
if (options.quiet || options.json) {
|
|
257
|
+
setShouldAddBlankLines(false);
|
|
258
|
+
}
|
|
259
|
+
const result = checkCmd.execute([portStr], options);
|
|
260
|
+
process.exit(result.success ? 0 : 1);
|
|
261
|
+
});
|
|
262
|
+
// Info command
|
|
263
|
+
const infoCmd = new InfoCommand();
|
|
264
|
+
program
|
|
265
|
+
.command('info')
|
|
266
|
+
.description(infoCmd.description)
|
|
267
|
+
.option('--json', 'Output as JSON')
|
|
268
|
+
.action(async (options) => {
|
|
269
|
+
// Disable blank lines for json mode
|
|
270
|
+
if (options.json) {
|
|
271
|
+
setShouldAddBlankLines(false);
|
|
272
|
+
}
|
|
273
|
+
const result = await infoCmd.execute([], options);
|
|
274
|
+
process.exit(result.success ? 0 : 1);
|
|
275
|
+
});
|
|
276
|
+
// Render command
|
|
277
|
+
const renderCmd = new RenderCommand();
|
|
278
|
+
program
|
|
279
|
+
.command('render')
|
|
280
|
+
.description(renderCmd.description)
|
|
281
|
+
.argument('<file>', 'Template file to process')
|
|
282
|
+
.option('-p, --project <n>', 'Project name (overrides DEVPORTS_PROJECT_NAME in template)')
|
|
283
|
+
.option('-o, --output <file>', 'Output file (defaults to stdout)')
|
|
284
|
+
.option('--json', 'Output allocation info as JSON')
|
|
285
|
+
.action(async (file, options) => {
|
|
286
|
+
// Disable blank lines for json mode
|
|
287
|
+
if (options.json) {
|
|
288
|
+
setShouldAddBlankLines(false);
|
|
289
|
+
}
|
|
290
|
+
const result = await renderCmd.execute([file], options);
|
|
291
|
+
process.exit(result.success ? 0 : 1);
|
|
292
|
+
});
|
|
293
|
+
// Gitignore command
|
|
294
|
+
const gitignoreCmd = new GitignoreCommand();
|
|
295
|
+
program
|
|
296
|
+
.command('gitignore')
|
|
297
|
+
.description(gitignoreCmd.description)
|
|
298
|
+
.option('--preview', 'Show what would be added without making changes')
|
|
299
|
+
.option('--clean', 'Remove stale devports entries from .gitignore')
|
|
300
|
+
.option('--json', 'Output as JSON')
|
|
301
|
+
.action(async (options) => {
|
|
302
|
+
// Disable blank lines for json mode
|
|
303
|
+
if (options.json) {
|
|
304
|
+
setShouldAddBlankLines(false);
|
|
305
|
+
}
|
|
306
|
+
const result = await gitignoreCmd.execute([], options);
|
|
307
|
+
process.exit(result.success ? 0 : 1);
|
|
308
|
+
});
|
|
309
|
+
// Completion command
|
|
310
|
+
const completionCmd = new CompletionCommand();
|
|
311
|
+
program
|
|
312
|
+
.command('completion')
|
|
313
|
+
.description(completionCmd.description)
|
|
314
|
+
.argument('[shell]', 'Shell type (bash, zsh)', 'zsh')
|
|
315
|
+
.option('-i, --install', 'Install completion script to user directory')
|
|
316
|
+
.option('-u, --uninstall', 'Remove completion script and shell config')
|
|
317
|
+
.option('--check', 'Check if completion is already installed')
|
|
318
|
+
.option('--test', 'Test if completion works in a fresh shell')
|
|
319
|
+
.option('--json', 'Output as JSON')
|
|
320
|
+
.action(async (shell, options) => {
|
|
321
|
+
// Disable blank lines for json mode
|
|
322
|
+
if (options.json) {
|
|
323
|
+
setShouldAddBlankLines(false);
|
|
324
|
+
}
|
|
325
|
+
const result = await completionCmd.execute([shell], options);
|
|
326
|
+
process.exit(result.success ? 0 : 1);
|
|
327
|
+
});
|
|
328
|
+
program.parse();
|
|
329
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command, CommandOptions, CommandResult } from './base-command.js';
|
|
2
|
+
export declare class AllocateCommand implements Command {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
execute(args: string[], options: CommandOptions): Promise<CommandResult>;
|
|
6
|
+
private handleCompletion;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=allocate.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allocate.command.d.ts","sourceRoot":"","sources":["../../src/commands/allocate.command.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAM3B,qBAAa,eAAgB,YAAW,OAAO;IAC7C,IAAI,SAAc;IAClB,WAAW,SAA2C;IAEhD,OAAO,CACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC;IAuDzB,OAAO,CAAC,gBAAgB;CAwCzB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { handleCommandError, } from './base-command.js';
|
|
2
|
+
import { allocatePort, listAllocations } from '../port-manager.js';
|
|
3
|
+
import { ValidationService } from '../services/validation-service.js';
|
|
4
|
+
import { ResponseFormatter } from '../services/response-formatter.js';
|
|
5
|
+
import { VALID_PORT_TYPES } from '../types.js';
|
|
6
|
+
export class AllocateCommand {
|
|
7
|
+
name = 'allocate';
|
|
8
|
+
description = 'Allocate a port for a project/service';
|
|
9
|
+
async execute(args, options) {
|
|
10
|
+
try {
|
|
11
|
+
// Handle completion mode
|
|
12
|
+
if (options.completion) {
|
|
13
|
+
return this.handleCompletion(options);
|
|
14
|
+
}
|
|
15
|
+
const [project, service] = args;
|
|
16
|
+
if (!project) {
|
|
17
|
+
throw new Error('Project name is required');
|
|
18
|
+
}
|
|
19
|
+
if (!service) {
|
|
20
|
+
throw new Error('Service name is required');
|
|
21
|
+
}
|
|
22
|
+
if (!options.type) {
|
|
23
|
+
throw new Error('Service type is required. Use --type to specify one of: postgres, mysql, redis, api, app, custom');
|
|
24
|
+
}
|
|
25
|
+
// Validate inputs
|
|
26
|
+
const validatedProject = ValidationService.validateProjectName(project);
|
|
27
|
+
const validatedService = ValidationService.validateServiceName(service);
|
|
28
|
+
const validatedType = ValidationService.validateServiceType(options.type);
|
|
29
|
+
const port = await allocatePort(validatedProject, validatedService, validatedType);
|
|
30
|
+
// Handle quiet mode first
|
|
31
|
+
if (options.quiet) {
|
|
32
|
+
return ResponseFormatter.quiet(port, { port });
|
|
33
|
+
}
|
|
34
|
+
// Use centralized formatter for all output patterns
|
|
35
|
+
const response = ResponseFormatter.portAllocation(port, validatedProject, validatedService, validatedType);
|
|
36
|
+
return ResponseFormatter.format(response, options);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
handleCommandError(error, options);
|
|
40
|
+
return { success: false };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
handleCompletion(options) {
|
|
44
|
+
const mode = options.completion.toLowerCase();
|
|
45
|
+
switch (mode) {
|
|
46
|
+
case 'projects': {
|
|
47
|
+
const allocations = listAllocations();
|
|
48
|
+
const projects = [...new Set(allocations.map((a) => a.project))].sort();
|
|
49
|
+
projects.forEach((p) => console.log(p));
|
|
50
|
+
process.exit(0);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case 'services': {
|
|
54
|
+
// For services, we need a specific project - check if one was provided
|
|
55
|
+
const project = options.project;
|
|
56
|
+
if (project) {
|
|
57
|
+
const allocations = listAllocations({ project });
|
|
58
|
+
const services = [
|
|
59
|
+
...new Set(allocations.map((a) => a.service)),
|
|
60
|
+
].sort();
|
|
61
|
+
services.forEach((s) => console.log(s));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// No project specified, return all services
|
|
65
|
+
const allocations = listAllocations();
|
|
66
|
+
const services = [
|
|
67
|
+
...new Set(allocations.map((a) => a.service)),
|
|
68
|
+
].sort();
|
|
69
|
+
services.forEach((s) => console.log(s));
|
|
70
|
+
}
|
|
71
|
+
process.exit(0);
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'types': {
|
|
75
|
+
VALID_PORT_TYPES.forEach((t) => console.log(t));
|
|
76
|
+
process.exit(0);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
default:
|
|
80
|
+
throw new Error(`Invalid completion mode: ${mode}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=allocate.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allocate.command.js","sourceRoot":"","sources":["../../src/commands/allocate.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base command interface and utilities for CLI commands
|
|
3
|
+
*/
|
|
4
|
+
export interface CommandOptions {
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
export interface CommandResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
message?: string;
|
|
10
|
+
data?: unknown;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Base interface for all commands
|
|
14
|
+
*/
|
|
15
|
+
export interface Command {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
execute(args: string[], options: CommandOptions): Promise<CommandResult> | CommandResult;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Helper function for consistent JSON/text output
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatOutput(result: CommandResult, options: CommandOptions): void;
|
|
24
|
+
/**
|
|
25
|
+
* Helper function for error handling
|
|
26
|
+
*/
|
|
27
|
+
export declare function handleCommandError(error: unknown, options: CommandOptions): void;
|
|
28
|
+
//# sourceMappingURL=base-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CACL,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,cAAc,GACtB,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,cAAc,GACtB,IAAI,CAiBN"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base command interface and utilities for CLI commands
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Helper function for consistent JSON/text output
|
|
6
|
+
*/
|
|
7
|
+
export function formatOutput(result, options) {
|
|
8
|
+
if (options.json) {
|
|
9
|
+
console.log(JSON.stringify(result));
|
|
10
|
+
}
|
|
11
|
+
else if (result.message) {
|
|
12
|
+
console.log(result.message);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Helper function for error handling
|
|
17
|
+
*/
|
|
18
|
+
export function handleCommandError(error, options) {
|
|
19
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
20
|
+
if (!options.quiet) {
|
|
21
|
+
if (options.json) {
|
|
22
|
+
console.error(JSON.stringify({
|
|
23
|
+
success: false,
|
|
24
|
+
error: message,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.error(`❌ ${message}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=base-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAqB,EACrB,OAAuB;IAEvB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAc,EACd,OAAuB;IAEvB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CACX,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,OAAO;aACf,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command, CommandOptions, CommandResult } from './base-command.js';
|
|
2
|
+
export declare class CheckCommand implements Command {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
execute(args: string[], options: CommandOptions): CommandResult;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=check.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.command.d.ts","sourceRoot":"","sources":["../../src/commands/check.command.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,YAAa,YAAW,OAAO;IAC1C,IAAI,SAAW;IACf,WAAW,SAAoD;IAE/D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa;CAyChE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { handleCommandError, } from './base-command.js';
|
|
2
|
+
import { listAllocations } from '../port-manager.js';
|
|
3
|
+
import { ValidationService } from '../services/validation-service.js';
|
|
4
|
+
export class CheckCommand {
|
|
5
|
+
name = 'check';
|
|
6
|
+
description = 'Check if a port is available (non-destructive)';
|
|
7
|
+
execute(args, options) {
|
|
8
|
+
try {
|
|
9
|
+
const [portStr] = args;
|
|
10
|
+
if (!portStr) {
|
|
11
|
+
throw new Error('Port number is required');
|
|
12
|
+
}
|
|
13
|
+
const validatedPort = ValidationService.validatePort(portStr);
|
|
14
|
+
const allocations = listAllocations();
|
|
15
|
+
const allocated = allocations.find((a) => a.port === validatedPort);
|
|
16
|
+
const available = !allocated;
|
|
17
|
+
const message = options.quiet
|
|
18
|
+
? undefined
|
|
19
|
+
: available
|
|
20
|
+
? `✅ Port ${validatedPort} is available`
|
|
21
|
+
: `❌ Port ${validatedPort} is allocated to ${ValidationService.sanitizeForDisplay(allocated?.project ?? 'unknown')}/${ValidationService.sanitizeForDisplay(allocated?.service ?? 'unknown')}`;
|
|
22
|
+
if (!options.quiet) {
|
|
23
|
+
console.log(message);
|
|
24
|
+
}
|
|
25
|
+
if (options.json) {
|
|
26
|
+
return {
|
|
27
|
+
success: available,
|
|
28
|
+
message,
|
|
29
|
+
data: {
|
|
30
|
+
port: validatedPort,
|
|
31
|
+
available,
|
|
32
|
+
allocation: allocated ?? null,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { success: available, message };
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
handleCommandError(error, options);
|
|
40
|
+
return { success: false };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=check.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.command.js","sourceRoot":"","sources":["../../src/commands/check.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,OAAO,YAAY;IACvB,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,gDAAgD,CAAC;IAE/D,OAAO,CAAC,IAAc,EAAE,OAAuB;QAC7C,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;YAEvB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;YACpE,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC;YAE7B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK;gBAC3B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,SAAS;oBACT,CAAC,CAAC,UAAU,aAAa,eAAe;oBACxC,CAAC,CAAC,UAAU,aAAa,oBAAoB,iBAAiB,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,IAAI,SAAS,CAAC,IAAI,iBAAiB,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC;YAElM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,SAAS;oBAClB,OAAO;oBACP,IAAI,EAAE;wBACJ,IAAI,EAAE,aAAa;wBACnB,SAAS;wBACT,UAAU,EAAE,SAAS,IAAI,IAAI;qBAC9B;iBACF,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command, CommandOptions, CommandResult } from './base-command.js';
|
|
2
|
+
export declare class CompletionCommand implements Command {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
execute(args: string[], options: CommandOptions): Promise<CommandResult>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=completion.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.command.d.ts","sourceRoot":"","sources":["../../src/commands/completion.command.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAS3B,qBAAa,iBAAkB,YAAW,OAAO;IAC/C,IAAI,SAAgB;IACpB,WAAW,SAAsC;IAE3C,OAAO,CACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC;CAyI1B"}
|