devports 0.0.1 → 1.0.1
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 +87 -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.1.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 +245 -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
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { handleCommandError, } from './base-command.js';
|
|
2
|
+
import { generateCompletionScript, installCompletionWithSetup, uninstallCompletion, isCompletionInstalled, } from '../completion/index.js';
|
|
3
|
+
import { ValidationError } from '../services/validation-service.js';
|
|
4
|
+
export class CompletionCommand {
|
|
5
|
+
name = 'completion';
|
|
6
|
+
description = 'Generate shell completion script';
|
|
7
|
+
async execute(args, options) {
|
|
8
|
+
try {
|
|
9
|
+
const [shell = 'zsh'] = args;
|
|
10
|
+
const validShells = ['bash', 'zsh'];
|
|
11
|
+
const normalizedShell = shell.toLowerCase().trim();
|
|
12
|
+
if (!validShells.includes(normalizedShell)) {
|
|
13
|
+
throw new ValidationError(`Invalid shell type. Must be one of: ${validShells.join(', ')}`);
|
|
14
|
+
}
|
|
15
|
+
if (options.check) {
|
|
16
|
+
const installed = isCompletionInstalled(normalizedShell);
|
|
17
|
+
const result = { shell: normalizedShell, installed };
|
|
18
|
+
if (options.json) {
|
|
19
|
+
console.log(JSON.stringify(result));
|
|
20
|
+
return { success: installed, data: result };
|
|
21
|
+
}
|
|
22
|
+
const status = installed ? '✅ installed' : '❌ not installed';
|
|
23
|
+
console.log(`Shell completion for ${normalizedShell}: ${status}`);
|
|
24
|
+
if (!installed) {
|
|
25
|
+
console.log(`\nTo install: devports completion ${normalizedShell} --install`);
|
|
26
|
+
}
|
|
27
|
+
return { success: installed, data: result };
|
|
28
|
+
}
|
|
29
|
+
if (options.test) {
|
|
30
|
+
// Test completion in a fresh shell
|
|
31
|
+
try {
|
|
32
|
+
const { execSync } = await import('child_process');
|
|
33
|
+
const configFile = normalizedShell === 'zsh' ? '~/.zshrc' : '~/.bashrc';
|
|
34
|
+
const testCommand = normalizedShell === 'zsh'
|
|
35
|
+
? `source ${configFile} && type _devports >/dev/null 2>&1`
|
|
36
|
+
: `source ${configFile} && type _devports_completion >/dev/null 2>&1`;
|
|
37
|
+
execSync(`${normalizedShell} -c '${testCommand}'`, { stdio: 'pipe' });
|
|
38
|
+
const result = {
|
|
39
|
+
shell: normalizedShell,
|
|
40
|
+
completionWorks: true,
|
|
41
|
+
message: 'Completion system is working correctly',
|
|
42
|
+
};
|
|
43
|
+
if (options.json) {
|
|
44
|
+
console.log(JSON.stringify(result));
|
|
45
|
+
return { success: true, data: result };
|
|
46
|
+
}
|
|
47
|
+
console.log(`✅ ${normalizedShell} completion is working correctly!`);
|
|
48
|
+
console.log(`Try these tests in a new terminal:`);
|
|
49
|
+
console.log(` devports <TAB><TAB>`);
|
|
50
|
+
console.log(` devports al<TAB>`);
|
|
51
|
+
console.log(` devports release -a <TAB>`);
|
|
52
|
+
return { success: true, data: result };
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
const result = {
|
|
56
|
+
shell: normalizedShell,
|
|
57
|
+
completionWorks: false,
|
|
58
|
+
message: 'Completion system is not working. Try running --install first.',
|
|
59
|
+
};
|
|
60
|
+
if (options.json) {
|
|
61
|
+
console.log(JSON.stringify(result));
|
|
62
|
+
return { success: false, data: result };
|
|
63
|
+
}
|
|
64
|
+
console.log(`❌ ${normalizedShell} completion is not working.`);
|
|
65
|
+
console.log(`Run: devports completion ${normalizedShell} --install`);
|
|
66
|
+
return { success: false, data: result };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (options.install) {
|
|
70
|
+
const result = installCompletionWithSetup(normalizedShell);
|
|
71
|
+
const data = {
|
|
72
|
+
success: result.success,
|
|
73
|
+
shell: normalizedShell,
|
|
74
|
+
message: result.message,
|
|
75
|
+
configFile: result.configFile,
|
|
76
|
+
};
|
|
77
|
+
if (options.json) {
|
|
78
|
+
console.log(JSON.stringify(data));
|
|
79
|
+
return { success: result.success, data };
|
|
80
|
+
}
|
|
81
|
+
console.log(result.message);
|
|
82
|
+
return { success: result.success, data };
|
|
83
|
+
}
|
|
84
|
+
else if (options.uninstall) {
|
|
85
|
+
const result = uninstallCompletion(normalizedShell);
|
|
86
|
+
const data = {
|
|
87
|
+
uninstalled: result.success,
|
|
88
|
+
shell: normalizedShell,
|
|
89
|
+
message: result.message,
|
|
90
|
+
};
|
|
91
|
+
if (options.json) {
|
|
92
|
+
console.log(JSON.stringify(data));
|
|
93
|
+
return { success: result.success, data };
|
|
94
|
+
}
|
|
95
|
+
console.log(result.message);
|
|
96
|
+
return { success: result.success, data };
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Output completion script to stdout
|
|
100
|
+
const script = generateCompletionScript(normalizedShell);
|
|
101
|
+
const data = { shell: normalizedShell, script };
|
|
102
|
+
if (options.json) {
|
|
103
|
+
console.log(JSON.stringify(data));
|
|
104
|
+
return { success: true, data };
|
|
105
|
+
}
|
|
106
|
+
console.log(script);
|
|
107
|
+
return { success: true, data };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
handleCommandError(error, options);
|
|
112
|
+
return { success: false };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=completion.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.command.js","sourceRoot":"","sources":["../../src/commands/completion.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command, CommandOptions, CommandResult } from './base-command.js';
|
|
2
|
+
export declare class GitignoreCommand implements Command {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
execute(args: string[], options: CommandOptions): Promise<CommandResult>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=gitignore.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.command.d.ts","sourceRoot":"","sources":["../../src/commands/gitignore.command.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAQ3B,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,IAAI,SAAe;IACnB,WAAW,SAAoD;IAEzD,OAAO,CACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC;CAoE1B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { handleCommandError, } from './base-command.js';
|
|
2
|
+
import { updateGitignore, cleanGitignore, previewGitignore, } from '../gitignore.js';
|
|
3
|
+
import { sanitizeForDisplay } from '../validation.js';
|
|
4
|
+
export class GitignoreCommand {
|
|
5
|
+
name = 'gitignore';
|
|
6
|
+
description = 'Manage .gitignore entries for *.devports files';
|
|
7
|
+
async execute(args, options) {
|
|
8
|
+
try {
|
|
9
|
+
let result;
|
|
10
|
+
if (options.clean) {
|
|
11
|
+
result = await cleanGitignore();
|
|
12
|
+
}
|
|
13
|
+
else if (options.preview) {
|
|
14
|
+
result = await previewGitignore();
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
result = await updateGitignore();
|
|
18
|
+
}
|
|
19
|
+
if (options.json) {
|
|
20
|
+
console.log(JSON.stringify(result, null, 2));
|
|
21
|
+
return { success: true, data: result };
|
|
22
|
+
}
|
|
23
|
+
if (options.preview) {
|
|
24
|
+
console.log('\nGitignore Preview:\n');
|
|
25
|
+
}
|
|
26
|
+
else if (options.clean) {
|
|
27
|
+
console.log('\nCleaned .gitignore:\n');
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log('\nUpdated .gitignore:\n');
|
|
31
|
+
}
|
|
32
|
+
console.log(`📁 Found ${result.devportsFiles.length} *.devports files`);
|
|
33
|
+
if (result.devportsFiles.length > 0) {
|
|
34
|
+
console.log(` ${result.devportsFiles
|
|
35
|
+
.map((f) => sanitizeForDisplay(f))
|
|
36
|
+
.join(', ')}`);
|
|
37
|
+
console.log('');
|
|
38
|
+
}
|
|
39
|
+
if (result.added.length > 0) {
|
|
40
|
+
console.log(`✅ ${options.preview ? 'Would add' : 'Added'} ${result.added.length} entries:`);
|
|
41
|
+
result.added.forEach((file) => console.log(` + ${sanitizeForDisplay(file)}`));
|
|
42
|
+
}
|
|
43
|
+
if (result.existing.length > 0) {
|
|
44
|
+
console.log(`ℹ️ ${result.existing.length} entries already in .gitignore:`);
|
|
45
|
+
result.existing.forEach((file) => console.log(` ~ ${sanitizeForDisplay(file)}`));
|
|
46
|
+
}
|
|
47
|
+
if (result.added.length === 0 && result.existing.length === 0) {
|
|
48
|
+
console.log('✅ No changes needed');
|
|
49
|
+
}
|
|
50
|
+
if (options.preview && result.added.length > 0) {
|
|
51
|
+
console.log(`\nRun 'devports gitignore' to apply changes.`);
|
|
52
|
+
}
|
|
53
|
+
return { success: true, data: result };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
handleCommandError(error, options);
|
|
57
|
+
return { success: false };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=gitignore.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.command.js","sourceRoot":"","sources":["../../src/commands/gitignore.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command registry - exports all available commands
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from './base-command.js';
|
|
5
|
+
export declare const commands: Map<string, Command>;
|
|
6
|
+
export { Command, CommandOptions, CommandResult } from './base-command.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAiB5C,eAAO,MAAM,QAAQ,sBAenB,CAAC;AAEH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command registry - exports all available commands
|
|
3
|
+
*/
|
|
4
|
+
import { AllocateCommand } from './allocate.command.js';
|
|
5
|
+
import { ReleaseCommand } from './release.command.js';
|
|
6
|
+
import { ListCommand } from './list.command.js';
|
|
7
|
+
import { StatusCommand } from './status.command.js';
|
|
8
|
+
import { ReserveCommand } from './reserve.command.js';
|
|
9
|
+
import { UnreserveCommand } from './unreserve.command.js';
|
|
10
|
+
import { CheckCommand } from './check.command.js';
|
|
11
|
+
import { InfoCommand } from './info.command.js';
|
|
12
|
+
import { SetupCommand } from './setup.command.js';
|
|
13
|
+
import { WorktreeAddCommand } from './worktree-add.command.js';
|
|
14
|
+
import { WorktreeRemoveCommand } from './worktree-remove.command.js';
|
|
15
|
+
import { RenderCommand } from './render.command.js';
|
|
16
|
+
import { GitignoreCommand } from './gitignore.command.js';
|
|
17
|
+
import { CompletionCommand } from './completion.command.js';
|
|
18
|
+
// Registry of all available commands
|
|
19
|
+
export const commands = new Map([
|
|
20
|
+
['allocate', new AllocateCommand()],
|
|
21
|
+
['release', new ReleaseCommand()],
|
|
22
|
+
['list', new ListCommand()],
|
|
23
|
+
['status', new StatusCommand()],
|
|
24
|
+
['reserve', new ReserveCommand()],
|
|
25
|
+
['unreserve', new UnreserveCommand()],
|
|
26
|
+
['check', new CheckCommand()],
|
|
27
|
+
['info', new InfoCommand()],
|
|
28
|
+
['setup', new SetupCommand()],
|
|
29
|
+
['worktree-add', new WorktreeAddCommand()],
|
|
30
|
+
['worktree-remove', new WorktreeRemoveCommand()],
|
|
31
|
+
['render', new RenderCommand()],
|
|
32
|
+
['gitignore', new GitignoreCommand()],
|
|
33
|
+
['completion', new CompletionCommand()],
|
|
34
|
+
]);
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,qCAAqC;AACrC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAkB;IAC/C,CAAC,UAAU,EAAE,IAAI,eAAe,EAAE,CAAC;IACnC,CAAC,SAAS,EAAE,IAAI,cAAc,EAAE,CAAC;IACjC,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC,QAAQ,EAAE,IAAI,aAAa,EAAE,CAAC;IAC/B,CAAC,SAAS,EAAE,IAAI,cAAc,EAAE,CAAC;IACjC,CAAC,WAAW,EAAE,IAAI,gBAAgB,EAAE,CAAC;IACrC,CAAC,OAAO,EAAE,IAAI,YAAY,EAAE,CAAC;IAC7B,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC,OAAO,EAAE,IAAI,YAAY,EAAE,CAAC;IAC7B,CAAC,cAAc,EAAE,IAAI,kBAAkB,EAAE,CAAC;IAC1C,CAAC,iBAAiB,EAAE,IAAI,qBAAqB,EAAE,CAAC;IAChD,CAAC,QAAQ,EAAE,IAAI,aAAa,EAAE,CAAC;IAC/B,CAAC,WAAW,EAAE,IAAI,gBAAgB,EAAE,CAAC;IACrC,CAAC,YAAY,EAAE,IAAI,iBAAiB,EAAE,CAAC;CACxC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command, CommandOptions, CommandResult } from './base-command.js';
|
|
2
|
+
export declare class InfoCommand implements Command {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
execute(args: string[], options: CommandOptions): Promise<CommandResult>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=info.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.command.d.ts","sourceRoot":"","sources":["../../src/commands/info.command.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAG3B,qBAAa,WAAY,YAAW,OAAO;IACzC,IAAI,SAAU;IACd,WAAW,SAA0D;IAE/D,OAAO,CACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC;CAoC1B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { handleCommandError, } from './base-command.js';
|
|
2
|
+
import { listAllocations, getStatus } from '../port-manager.js';
|
|
3
|
+
export class InfoCommand {
|
|
4
|
+
name = 'info';
|
|
5
|
+
description = 'Show devports configuration and registry information';
|
|
6
|
+
async execute(args, options) {
|
|
7
|
+
try {
|
|
8
|
+
const { loadConfig } = await import('../config.js');
|
|
9
|
+
const config = loadConfig();
|
|
10
|
+
const allocations = listAllocations();
|
|
11
|
+
const status = getStatus();
|
|
12
|
+
const info = {
|
|
13
|
+
configPath: '~/.config/devports/config.json',
|
|
14
|
+
registryPath: config.registryPath,
|
|
15
|
+
totalAllocations: allocations.length,
|
|
16
|
+
portRanges: config.ranges,
|
|
17
|
+
stats: status.types,
|
|
18
|
+
};
|
|
19
|
+
if (options.json) {
|
|
20
|
+
console.log(JSON.stringify(info, null, 2));
|
|
21
|
+
return { success: true, data: info };
|
|
22
|
+
}
|
|
23
|
+
console.log('\ndevports Configuration:\n');
|
|
24
|
+
console.log(`Config: ~/.config/devports/config.json`);
|
|
25
|
+
console.log(`Registry: ${config.registryPath}`);
|
|
26
|
+
console.log(`Allocations: ${allocations.length} ports in use`);
|
|
27
|
+
console.log('\nPort Ranges:');
|
|
28
|
+
for (const [type, range] of Object.entries(config.ranges)) {
|
|
29
|
+
console.log(` ${type.padEnd(10)}: ${range.start}-${range.end}`);
|
|
30
|
+
}
|
|
31
|
+
console.log('');
|
|
32
|
+
return { success: true, data: info };
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
handleCommandError(error, options);
|
|
36
|
+
return { success: false };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=info.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.command.js","sourceRoot":"","sources":["../../src/commands/info.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,OAAO,WAAW;IACtB,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,sDAAsD,CAAC;IAErE,KAAK,CAAC,OAAO,CACX,IAAc,EACd,OAAuB;QAEvB,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAE3B,MAAM,IAAI,GAAG;gBACX,UAAU,EAAE,gCAAgC;gBAC5C,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,gBAAgB,EAAE,WAAW,CAAC,MAAM;gBACpC,UAAU,EAAE,MAAM,CAAC,MAAM;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACvC,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,MAAM,eAAe,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvC,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,8 @@
|
|
|
1
|
+
import { Command, CommandOptions, CommandResult } from './base-command.js';
|
|
2
|
+
export declare class ListCommand implements Command {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
execute(args: string[], options: CommandOptions): CommandResult;
|
|
6
|
+
private handleCompletion;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=list.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.command.d.ts","sourceRoot":"","sources":["../../src/commands/list.command.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAK3B,qBAAa,WAAY,YAAW,OAAO;IACzC,IAAI,SAAU;IACd,WAAW,SAA+B;IAE1C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa;IAkL/D,OAAO,CAAC,gBAAgB;CA4BzB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { handleCommandError, } from './base-command.js';
|
|
2
|
+
import { listAllocations, listReservations } from '../port-manager.js';
|
|
3
|
+
import { ValidationService } from '../services/validation-service.js';
|
|
4
|
+
import { VALID_PORT_TYPES } from '../types.js';
|
|
5
|
+
export class ListCommand {
|
|
6
|
+
name = 'list';
|
|
7
|
+
description = 'List all port allocations';
|
|
8
|
+
execute(args, options) {
|
|
9
|
+
try {
|
|
10
|
+
// Handle completion mode (no validation needed for shell completion)
|
|
11
|
+
if (options.completion) {
|
|
12
|
+
return this.handleCompletion(options);
|
|
13
|
+
}
|
|
14
|
+
// Validate filter parameters if provided
|
|
15
|
+
const validatedProject = options.project
|
|
16
|
+
? ValidationService.validateProjectName(options.project)
|
|
17
|
+
: undefined;
|
|
18
|
+
const validatedType = options.type
|
|
19
|
+
? ValidationService.validateServiceType(options.type)
|
|
20
|
+
: undefined;
|
|
21
|
+
const allocations = listAllocations({
|
|
22
|
+
project: validatedProject,
|
|
23
|
+
type: validatedType,
|
|
24
|
+
});
|
|
25
|
+
const reservations = listReservations();
|
|
26
|
+
if (options.quiet) {
|
|
27
|
+
// Just output port numbers, one per line (allocations only for quiet mode)
|
|
28
|
+
allocations.forEach((allocation) => {
|
|
29
|
+
console.log(allocation.port);
|
|
30
|
+
});
|
|
31
|
+
return { success: true, data: allocations };
|
|
32
|
+
}
|
|
33
|
+
if (options.json) {
|
|
34
|
+
const result = {
|
|
35
|
+
allocations,
|
|
36
|
+
reservations,
|
|
37
|
+
};
|
|
38
|
+
console.log(JSON.stringify(result, null, 2));
|
|
39
|
+
return { success: true, data: result };
|
|
40
|
+
}
|
|
41
|
+
// Text output
|
|
42
|
+
if (allocations.length === 0 && reservations.length === 0) {
|
|
43
|
+
console.log('No port allocations or reservations found.');
|
|
44
|
+
return {
|
|
45
|
+
success: true,
|
|
46
|
+
message: 'No port allocations or reservations found.',
|
|
47
|
+
data: { allocations: [], reservations: [] },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
console.log('\n');
|
|
51
|
+
// Show allocations grouped by project
|
|
52
|
+
if (allocations.length > 0) {
|
|
53
|
+
// Group by project for better readability
|
|
54
|
+
const grouped = allocations.reduce((acc, alloc) => {
|
|
55
|
+
if (!acc[alloc.project]) {
|
|
56
|
+
acc[alloc.project] = [];
|
|
57
|
+
}
|
|
58
|
+
acc[alloc.project].push(alloc);
|
|
59
|
+
return acc;
|
|
60
|
+
}, {});
|
|
61
|
+
Object.keys(grouped)
|
|
62
|
+
.sort()
|
|
63
|
+
.forEach((project, index, projects) => {
|
|
64
|
+
// Project header with styling
|
|
65
|
+
console.log(`\x1b[1m\x1b[36m🏗️ ${project}\x1b[0m`);
|
|
66
|
+
// Table header
|
|
67
|
+
console.log(`\x1b[2m┌──────┬──────────────────┬──────────────────┬──────────────────────────┐\x1b[0m`);
|
|
68
|
+
console.log(`\x1b[2m│\x1b[0m \x1b[1mPort\x1b[0m \x1b[2m│\x1b[0m \x1b[1mService\x1b[0m \x1b[2m│\x1b[0m \x1b[1mType\x1b[0m \x1b[2m│\x1b[0m \x1b[1mAllocated\x1b[0m \x1b[2m│\x1b[0m`);
|
|
69
|
+
console.log(`\x1b[2m├──────┼──────────────────┼──────────────────┼──────────────────────────┤\x1b[0m`);
|
|
70
|
+
// Table rows
|
|
71
|
+
grouped[project]
|
|
72
|
+
.sort((a, b) => a.port - b.port)
|
|
73
|
+
.forEach((allocation) => {
|
|
74
|
+
const port = allocation.port.toString().padEnd(4);
|
|
75
|
+
const service = allocation.service.padEnd(16);
|
|
76
|
+
const type = allocation.type.padEnd(16);
|
|
77
|
+
// Use consistent date format to ensure fixed width (24 chars for allocations)
|
|
78
|
+
const date = new Date(allocation.allocatedAt);
|
|
79
|
+
const timeStr = `${date.toLocaleDateString()}, ${date.toLocaleTimeString([], {
|
|
80
|
+
hour12: true,
|
|
81
|
+
hour: '2-digit',
|
|
82
|
+
minute: '2-digit',
|
|
83
|
+
second: '2-digit',
|
|
84
|
+
})}`;
|
|
85
|
+
const time = timeStr.padEnd(24);
|
|
86
|
+
console.log(`\x1b[2m│\x1b[0m \x1b[32m${port}\x1b[0m \x1b[2m│\x1b[0m ${service} \x1b[2m│\x1b[0m \x1b[33m${type}\x1b[0m \x1b[2m│\x1b[0m ${time} \x1b[2m│\x1b[0m`);
|
|
87
|
+
});
|
|
88
|
+
// Table footer
|
|
89
|
+
console.log(`\x1b[2m└──────┴──────────────────┴──────────────────┴──────────────────────────┘\x1b[0m`);
|
|
90
|
+
// Add spacing between projects (except for the last one or before reservations)
|
|
91
|
+
if (index < projects.length - 1) {
|
|
92
|
+
console.log();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// Add spacing before reservations if both exist
|
|
96
|
+
if (reservations.length > 0) {
|
|
97
|
+
console.log();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Show reservations
|
|
101
|
+
if (reservations.length > 0) {
|
|
102
|
+
console.log(`\x1b[1m\x1b[35m🔒 Reserved\x1b[0m`);
|
|
103
|
+
// Table header
|
|
104
|
+
console.log(`\x1b[2m┌──────┬───────────────────────────────────┬──────────────────────────┐\x1b[0m`);
|
|
105
|
+
console.log(`\x1b[2m│\x1b[0m \x1b[1mPort\x1b[0m \x1b[2m│\x1b[0m \x1b[1mReason\x1b[0m \x1b[2m│\x1b[0m \x1b[1mReserved\x1b[0m \x1b[2m│\x1b[0m`);
|
|
106
|
+
console.log(`\x1b[2m├──────┼───────────────────────────────────┼──────────────────────────┤\x1b[0m`);
|
|
107
|
+
// Table rows
|
|
108
|
+
reservations
|
|
109
|
+
.sort((a, b) => a.port - b.port)
|
|
110
|
+
.forEach((reservation) => {
|
|
111
|
+
const port = reservation.port.toString().padEnd(4);
|
|
112
|
+
// Truncate reason if too long and pad to exactly 33 chars (35 - 2 spaces in template)
|
|
113
|
+
const reason = reservation.reason.length > 33
|
|
114
|
+
? `${reservation.reason.substring(0, 30)}...`
|
|
115
|
+
: reservation.reason.padEnd(33);
|
|
116
|
+
// Use consistent date format to ensure fixed width (24 chars for reservations)
|
|
117
|
+
const date = new Date(reservation.reservedAt);
|
|
118
|
+
const timeStr = `${date.toLocaleDateString()}, ${date.toLocaleTimeString([], {
|
|
119
|
+
hour12: true,
|
|
120
|
+
hour: '2-digit',
|
|
121
|
+
minute: '2-digit',
|
|
122
|
+
second: '2-digit',
|
|
123
|
+
})}`;
|
|
124
|
+
const time = timeStr.padEnd(24);
|
|
125
|
+
console.log(`\x1b[2m│\x1b[0m \x1b[31m${port}\x1b[0m \x1b[2m│\x1b[0m ${reason} \x1b[2m│\x1b[0m ${time} \x1b[2m│\x1b[0m`);
|
|
126
|
+
});
|
|
127
|
+
// Table footer
|
|
128
|
+
console.log(`\x1b[2m└──────┴───────────────────────────────────┴──────────────────────────┘\x1b[0m`);
|
|
129
|
+
}
|
|
130
|
+
return { success: true, data: { allocations, reservations } };
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
handleCommandError(error, options);
|
|
134
|
+
return { success: false };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
handleCompletion(options) {
|
|
138
|
+
const mode = options.completion.toLowerCase();
|
|
139
|
+
const allocations = listAllocations({
|
|
140
|
+
project: options.project,
|
|
141
|
+
});
|
|
142
|
+
switch (mode) {
|
|
143
|
+
case 'projects': {
|
|
144
|
+
const projects = [...new Set(allocations.map((a) => a.project))].sort();
|
|
145
|
+
projects.forEach((p) => console.log(p));
|
|
146
|
+
process.exit(0);
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
case 'services': {
|
|
150
|
+
const services = [...new Set(allocations.map((a) => a.service))].sort();
|
|
151
|
+
services.forEach((s) => console.log(s));
|
|
152
|
+
process.exit(0);
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case 'types': {
|
|
156
|
+
VALID_PORT_TYPES.forEach((t) => console.log(t));
|
|
157
|
+
process.exit(0);
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
default:
|
|
161
|
+
throw new Error(`Invalid completion mode: ${mode}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=list.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.command.js","sourceRoot":"","sources":["../../src/commands/list.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command, CommandOptions, CommandResult } from './base-command.js';
|
|
2
|
+
export declare class ReleaseCommand implements Command {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
execute(args: string[], options: CommandOptions): Promise<CommandResult>;
|
|
6
|
+
private handleCompletion;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=release.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.command.d.ts","sourceRoot":"","sources":["../../src/commands/release.command.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAS3B,qBAAa,cAAe,YAAW,OAAO;IAC5C,IAAI,SAAa;IACjB,WAAW,SAA+B;IAEpC,OAAO,CACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC;IA4EzB,OAAO,CAAC,gBAAgB;CAmCzB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { handleCommandError, } from './base-command.js';
|
|
2
|
+
import { releasePort, releasePortByNumber, listAllocations, } from '../port-manager.js';
|
|
3
|
+
import { ValidationService } from '../services/validation-service.js';
|
|
4
|
+
import { ResponseFormatter } from '../services/response-formatter.js';
|
|
5
|
+
export class ReleaseCommand {
|
|
6
|
+
name = 'release';
|
|
7
|
+
description = 'Release allocated port(s)';
|
|
8
|
+
async execute(args, options) {
|
|
9
|
+
try {
|
|
10
|
+
// Handle completion mode
|
|
11
|
+
if (options.completion) {
|
|
12
|
+
return this.handleCompletion(options);
|
|
13
|
+
}
|
|
14
|
+
const [projectOrPort, service] = args;
|
|
15
|
+
if (!projectOrPort) {
|
|
16
|
+
throw new Error('Project name or port number is required');
|
|
17
|
+
}
|
|
18
|
+
// Handle --port flag: release by port number
|
|
19
|
+
if (options.port) {
|
|
20
|
+
const portNum = ValidationService.validatePort(projectOrPort);
|
|
21
|
+
const wasReleased = await releasePortByNumber(portNum);
|
|
22
|
+
if (!wasReleased) {
|
|
23
|
+
throw new Error(`No allocation found for port ${portNum}`);
|
|
24
|
+
}
|
|
25
|
+
const response = ResponseFormatter.portRelease(1, `port ${portNum}`);
|
|
26
|
+
return ResponseFormatter.format(response, options);
|
|
27
|
+
}
|
|
28
|
+
// Handle normal project/service release
|
|
29
|
+
const validatedProject = ValidationService.validateProjectName(projectOrPort);
|
|
30
|
+
// Release all ports for project if --all flag or no service specified
|
|
31
|
+
if (options.all || !service) {
|
|
32
|
+
const releasedCount = await releasePort(validatedProject, undefined, true);
|
|
33
|
+
if (releasedCount === 0) {
|
|
34
|
+
throw new Error(`No allocations found for project "${validatedProject}"`);
|
|
35
|
+
}
|
|
36
|
+
const response = ResponseFormatter.portRelease(releasedCount, `project "${validatedProject}"`);
|
|
37
|
+
return ResponseFormatter.format(response, options);
|
|
38
|
+
}
|
|
39
|
+
// Release specific service
|
|
40
|
+
const validatedService = ValidationService.validateServiceName(service);
|
|
41
|
+
const releasedCount = await releasePort(validatedProject, validatedService, false);
|
|
42
|
+
if (releasedCount === 0) {
|
|
43
|
+
throw new Error(`No allocation found for ${validatedProject}/${validatedService}`);
|
|
44
|
+
}
|
|
45
|
+
const response = ResponseFormatter.portRelease(releasedCount, `${validatedProject}/${validatedService}`);
|
|
46
|
+
return ResponseFormatter.format(response, options);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
handleCommandError(error, options);
|
|
50
|
+
return { success: false };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
handleCompletion(options) {
|
|
54
|
+
const mode = options.completion.toLowerCase();
|
|
55
|
+
switch (mode) {
|
|
56
|
+
case 'projects': {
|
|
57
|
+
const allocations = listAllocations();
|
|
58
|
+
const projects = [...new Set(allocations.map((a) => a.project))].sort();
|
|
59
|
+
projects.forEach((p) => console.log(p));
|
|
60
|
+
process.exit(0);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case 'services': {
|
|
64
|
+
// For services, we need a specific project - check if one was provided
|
|
65
|
+
const project = options.project;
|
|
66
|
+
if (project) {
|
|
67
|
+
const allocations = listAllocations({ project: project });
|
|
68
|
+
const services = [
|
|
69
|
+
...new Set(allocations.map((a) => a.service)),
|
|
70
|
+
].sort();
|
|
71
|
+
services.forEach((s) => console.log(s));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// No project specified, return all services
|
|
75
|
+
const allocations = listAllocations();
|
|
76
|
+
const services = [
|
|
77
|
+
...new Set(allocations.map((a) => a.service)),
|
|
78
|
+
].sort();
|
|
79
|
+
services.forEach((s) => console.log(s));
|
|
80
|
+
}
|
|
81
|
+
process.exit(0);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
default:
|
|
85
|
+
throw new Error(`Invalid completion mode: ${mode}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=release.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.command.js","sourceRoot":"","sources":["../../src/commands/release.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Command, CommandOptions, CommandResult } from './base-command.js';
|
|
2
|
+
export declare class RenderCommand implements Command {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
execute(args: string[], options: CommandOptions): Promise<CommandResult>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=render.command.d.ts.map
|