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/worktree.js
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secure worktree operations with input validation and safe command execution
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
5
|
+
import { join, basename } from 'path';
|
|
6
|
+
import { glob } from 'glob';
|
|
7
|
+
import { allocatePort, releasePort } from './port-manager.js';
|
|
8
|
+
import { detectServicesFromTemplate, extractProjectNameFromTemplate, makeUrlSafe, processTemplate, } from './render.js';
|
|
9
|
+
import { safeGitWorktreeAdd, safeGitWorktreeRemove, safeScriptExecution, } from './execution.js';
|
|
10
|
+
import { validateWorktreePath, validateBranchName, validateScriptPath, validateServices, validateTemplatePath, validateOutputPath, } from './validation.js';
|
|
11
|
+
/**
|
|
12
|
+
* Secure version of createWorktree with input validation and safe command execution
|
|
13
|
+
*/
|
|
14
|
+
export async function createWorktree(path, branch, options = {}) {
|
|
15
|
+
// Validate all inputs first
|
|
16
|
+
const validatedPath = validateWorktreePath(path);
|
|
17
|
+
const validatedBranch = validateBranchName(branch);
|
|
18
|
+
let validatedServices;
|
|
19
|
+
if (options.services) {
|
|
20
|
+
const validatedServiceList = validateServices(options.services);
|
|
21
|
+
validatedServices = validatedServiceList.map((s) => `${s.service}:${s.type}`);
|
|
22
|
+
}
|
|
23
|
+
const validatedTemplate = options.template
|
|
24
|
+
? validateTemplatePath(options.template)
|
|
25
|
+
: undefined;
|
|
26
|
+
const validatedEnvFile = options.envFile
|
|
27
|
+
? validateOutputPath(options.envFile)
|
|
28
|
+
: options.envFile;
|
|
29
|
+
const validatedPostHook = options.postHook
|
|
30
|
+
? validateScriptPath(options.postHook)
|
|
31
|
+
: undefined;
|
|
32
|
+
// Extract worktree identifier from path
|
|
33
|
+
const worktreeDir = basename(validatedPath);
|
|
34
|
+
// Create the git worktree using safe execution
|
|
35
|
+
try {
|
|
36
|
+
await safeGitWorktreeAdd(validatedPath, validatedBranch);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new Error(`Failed to create git worktree: ${error.message}`);
|
|
40
|
+
}
|
|
41
|
+
// Determine services to allocate and extract project name
|
|
42
|
+
let services;
|
|
43
|
+
let templateContent = null;
|
|
44
|
+
let projectName = null;
|
|
45
|
+
let templatePath = null;
|
|
46
|
+
if (validatedTemplate ?? existsSync('.env.devports')) {
|
|
47
|
+
templatePath = validatedTemplate ?? '.env.devports';
|
|
48
|
+
try {
|
|
49
|
+
templateContent = readFileSync(templatePath, 'utf-8');
|
|
50
|
+
services = detectServicesFromTemplate(templateContent, templatePath);
|
|
51
|
+
projectName = extractProjectNameFromTemplate(templateContent);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
console.warn(`⚠️ Could not read template ${templatePath}, falling back to detection`);
|
|
55
|
+
services =
|
|
56
|
+
validatedServices ??
|
|
57
|
+
detectServices(validatedPath, validatedEnvFile ?? undefined);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
services =
|
|
62
|
+
validatedServices ??
|
|
63
|
+
detectServices(validatedPath, validatedEnvFile ?? undefined);
|
|
64
|
+
}
|
|
65
|
+
// Override with explicit services if provided
|
|
66
|
+
if (validatedServices) {
|
|
67
|
+
services = validatedServices;
|
|
68
|
+
}
|
|
69
|
+
// Use project name from template or generate one from worktree directory
|
|
70
|
+
const finalProjectName = projectName ?? worktreeDir;
|
|
71
|
+
const urlSafeProjectName = makeUrlSafe(finalProjectName);
|
|
72
|
+
console.log(`✅ Created worktree: ${validatedPath}`);
|
|
73
|
+
console.log(` Branch: ${validatedBranch}`);
|
|
74
|
+
if (services.length > 0) {
|
|
75
|
+
console.log(`📍 Detected services: ${services.map((s) => s.split(':')[0]).join(', ')}`);
|
|
76
|
+
}
|
|
77
|
+
// Allocate ports for each service
|
|
78
|
+
const allocatedPorts = {};
|
|
79
|
+
const serviceTypes = {};
|
|
80
|
+
for (const service of services) {
|
|
81
|
+
const [serviceName, serviceType] = service.split(':');
|
|
82
|
+
const port = await allocatePort(urlSafeProjectName, serviceName, serviceType);
|
|
83
|
+
allocatedPorts[serviceName] = port;
|
|
84
|
+
serviceTypes[serviceName] = serviceType;
|
|
85
|
+
}
|
|
86
|
+
if (Object.keys(allocatedPorts).length > 0) {
|
|
87
|
+
console.log('🔌 Allocated ports:');
|
|
88
|
+
for (const [service, port] of Object.entries(allocatedPorts)) {
|
|
89
|
+
const type = serviceTypes[service];
|
|
90
|
+
console.log(` ${service}: ${port} (${type})`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Generate .env file in the worktree if not skipped
|
|
94
|
+
if (validatedEnvFile !== null) {
|
|
95
|
+
const envPath = join(validatedPath, validatedEnvFile ?? '.env');
|
|
96
|
+
if (templateContent) {
|
|
97
|
+
// Use template if available
|
|
98
|
+
const processedContent = processTemplate(templateContent, allocatedPorts, urlSafeProjectName, templatePath ?? undefined);
|
|
99
|
+
writeFileSync(envPath, processedContent);
|
|
100
|
+
console.log(`📝 Generated ${basename(envPath)} from template`);
|
|
101
|
+
}
|
|
102
|
+
else if (Object.keys(allocatedPorts).length > 0) {
|
|
103
|
+
// Create basic .env with just port variables
|
|
104
|
+
const envContent = `${[
|
|
105
|
+
'# Generated by devports worktree',
|
|
106
|
+
`DEVPORTS_PROJECT_NAME=${finalProjectName}`,
|
|
107
|
+
'',
|
|
108
|
+
...Object.entries(allocatedPorts).map(([service, port]) => `${service.toUpperCase()}_PORT=${port}`),
|
|
109
|
+
'',
|
|
110
|
+
'# Example connection URLs:',
|
|
111
|
+
...Object.entries(allocatedPorts)
|
|
112
|
+
.filter(([, port]) => port >= 5432 && port < 5500)
|
|
113
|
+
.map(([_service, port]) => `# DATABASE_URL=postgresql://user:password@localhost:${port}/myapp`),
|
|
114
|
+
].join('\n')}\n`;
|
|
115
|
+
writeFileSync(envPath, envContent);
|
|
116
|
+
console.log(`📝 Generated basic ${basename(envPath)} with allocated ports`);
|
|
117
|
+
}
|
|
118
|
+
// Auto-render any *.devports files found in current directory
|
|
119
|
+
await autoRenderDevportsFiles(validatedPath, allocatedPorts, urlSafeProjectName);
|
|
120
|
+
}
|
|
121
|
+
// Run post-hook if available
|
|
122
|
+
if (validatedPostHook ?? existsSync('.devports/hooks/post-worktree')) {
|
|
123
|
+
await runPostHook(validatedPath, allocatedPorts, urlSafeProjectName, validatedPostHook);
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
worktreePath: validatedPath,
|
|
127
|
+
ports: allocatedPorts,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Secure version of removeWorktree with input validation
|
|
132
|
+
*/
|
|
133
|
+
export async function removeWorktree(path, options = {}) {
|
|
134
|
+
// Validate input
|
|
135
|
+
const validatedPath = validateWorktreePath(path);
|
|
136
|
+
// Determine project name from the worktree directory
|
|
137
|
+
const worktreeDir = basename(validatedPath);
|
|
138
|
+
const urlSafeProjectName = makeUrlSafe(worktreeDir);
|
|
139
|
+
console.log(`🔄 Removing worktree: ${validatedPath}`);
|
|
140
|
+
// Release all ports for this project
|
|
141
|
+
const released = await releasePort(urlSafeProjectName, undefined, true);
|
|
142
|
+
if (released > 0) {
|
|
143
|
+
console.log(`🔌 Released ${released} allocated port(s)`);
|
|
144
|
+
}
|
|
145
|
+
// Remove the git worktree using safe execution
|
|
146
|
+
try {
|
|
147
|
+
await safeGitWorktreeRemove(validatedPath, options.force);
|
|
148
|
+
console.log('✅ Git worktree removed successfully');
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
throw new Error(`Failed to remove git worktree: ${error.message}`);
|
|
152
|
+
}
|
|
153
|
+
return released;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Detect services from an existing .env file or defaults
|
|
157
|
+
*/
|
|
158
|
+
function detectServices(worktreePath, envFile) {
|
|
159
|
+
const services = [];
|
|
160
|
+
const envPath = join(process.cwd(), envFile ?? '.env');
|
|
161
|
+
if (existsSync(envPath)) {
|
|
162
|
+
const envContent = readFileSync(envPath, 'utf-8');
|
|
163
|
+
const portPatterns = [
|
|
164
|
+
{ regex: /DATABASE_PORT|POSTGRES_PORT/i, service: 'postgres:postgres' },
|
|
165
|
+
{ regex: /MYSQL_PORT/i, service: 'mysql:mysql' },
|
|
166
|
+
{ regex: /REDIS_PORT/i, service: 'redis:redis' },
|
|
167
|
+
{ regex: /API_PORT/i, service: 'api:api' },
|
|
168
|
+
{ regex: /APP_PORT|WEB_PORT/i, service: 'app:app' },
|
|
169
|
+
];
|
|
170
|
+
for (const pattern of portPatterns) {
|
|
171
|
+
if (pattern.regex.test(envContent) &&
|
|
172
|
+
!services.includes(pattern.service)) {
|
|
173
|
+
services.push(pattern.service);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Default to postgres if nothing detected
|
|
178
|
+
if (services.length === 0) {
|
|
179
|
+
services.push('postgres:postgres');
|
|
180
|
+
}
|
|
181
|
+
return services;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Auto-render any *.devports files found in the current directory
|
|
185
|
+
*/
|
|
186
|
+
async function autoRenderDevportsFiles(worktreePath, allocatedPorts, projectName) {
|
|
187
|
+
try {
|
|
188
|
+
const devportsFiles = await glob('**/*.devports', {
|
|
189
|
+
cwd: process.cwd(),
|
|
190
|
+
ignore: ['node_modules/**', '.git/**'],
|
|
191
|
+
});
|
|
192
|
+
if (devportsFiles.length === 0) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
console.log(`🔄 Auto-rendering ${devportsFiles.length} *.devports files for worktree...`);
|
|
196
|
+
for (const devportsFile of devportsFiles) {
|
|
197
|
+
const fullDevportsPath = join(process.cwd(), devportsFile);
|
|
198
|
+
const outputFileName = devportsFile.replace(/\.devports$/, '');
|
|
199
|
+
const outputPath = join(worktreePath, outputFileName);
|
|
200
|
+
try {
|
|
201
|
+
const templateContent = readFileSync(fullDevportsPath, 'utf-8');
|
|
202
|
+
const processedContent = processTemplate(templateContent, allocatedPorts, projectName, devportsFile);
|
|
203
|
+
writeFileSync(outputPath, processedContent);
|
|
204
|
+
console.log(` ${outputFileName} (from ${devportsFile})`);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
console.warn(`⚠️ Failed to render ${devportsFile}: ${error.message}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.warn(`⚠️ Error during auto-rendering: ${error.message}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Run post-worktree hook if available (secure version)
|
|
217
|
+
*/
|
|
218
|
+
async function runPostHook(worktreePath, allocatedPorts, projectName, customHook) {
|
|
219
|
+
const hookScript = customHook ?? '.devports/hooks/post-worktree';
|
|
220
|
+
if (!existsSync(hookScript)) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
try {
|
|
224
|
+
console.log('🔗 Running post-worktree hook...');
|
|
225
|
+
// Prepare environment variables
|
|
226
|
+
const hookEnv = {
|
|
227
|
+
DEVPORTS_PROJECT_NAME: projectName,
|
|
228
|
+
DEVPORTS_WORKTREE_PATH: worktreePath,
|
|
229
|
+
};
|
|
230
|
+
// Add all port variables
|
|
231
|
+
for (const [service, port] of Object.entries(allocatedPorts)) {
|
|
232
|
+
const varName = `${service.toUpperCase().replace(/-/g, '_')}_PORT`;
|
|
233
|
+
hookEnv[varName] = port.toString();
|
|
234
|
+
}
|
|
235
|
+
// Execute hook script safely
|
|
236
|
+
await safeScriptExecution(hookScript, hookEnv, {
|
|
237
|
+
cwd: process.cwd(),
|
|
238
|
+
});
|
|
239
|
+
console.log('✅ Post-worktree hook completed');
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
console.warn(`⚠️ Post-worktree hook failed: ${error.message}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,94 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devports",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Port allocation manager for multi-project development",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"devports": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc && cp src/completion/*.sh dist/completion/",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:coverage": "vitest run --coverage",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"format": "prettier --write .",
|
|
24
|
+
"format:check": "prettier --check .",
|
|
25
|
+
"prepublishOnly": "npm run test && npm run build",
|
|
26
|
+
"lint": "eslint . --max-warnings 100 && tsc --noEmit && npm run lint:shell",
|
|
27
|
+
"lint:fix": "eslint . --fix",
|
|
28
|
+
"lint:shell": "shellcheck src/completion/bash.sh && zsh -n src/completion/zsh.sh",
|
|
29
|
+
"preuninstall": "node dist/cli.js completion zsh --uninstall > /dev/null 2>&1 || true && node dist/cli.js completion bash --uninstall > /dev/null 2>&1 || true"
|
|
30
|
+
},
|
|
5
31
|
"keywords": [
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
|
|
32
|
+
"ports",
|
|
33
|
+
"docker",
|
|
34
|
+
"development",
|
|
35
|
+
"devtools",
|
|
36
|
+
"postgres",
|
|
37
|
+
"port-management",
|
|
38
|
+
"cli",
|
|
39
|
+
"automation",
|
|
40
|
+
"worktree",
|
|
41
|
+
"multi-project"
|
|
42
|
+
],
|
|
43
|
+
"author": {
|
|
44
|
+
"name": "Ben Dechrai",
|
|
45
|
+
"email": "ben@dechrai.com",
|
|
46
|
+
"url": "https://bendechr.ai"
|
|
47
|
+
},
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "https://github.com/bendechrai/devports.git"
|
|
52
|
+
},
|
|
53
|
+
"bugs": {
|
|
54
|
+
"url": "https://github.com/bendechrai/devports/issues"
|
|
55
|
+
},
|
|
56
|
+
"homepage": "https://github.com/bendechrai/devports#readme",
|
|
57
|
+
"files": [
|
|
58
|
+
"dist",
|
|
59
|
+
"README.md",
|
|
60
|
+
"LICENSE",
|
|
61
|
+
"CHANGELOG.md"
|
|
62
|
+
],
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"commander": "^12.1.0",
|
|
65
|
+
"glob": "^11.0.3",
|
|
66
|
+
"magic-string": "^0.30.21",
|
|
67
|
+
"proper-lockfile": "^4.1.2"
|
|
68
|
+
},
|
|
69
|
+
"devDependencies": {
|
|
70
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
71
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
72
|
+
"@semantic-release/git": "^10.0.1",
|
|
73
|
+
"@semantic-release/github": "^11.0.0",
|
|
74
|
+
"@semantic-release/npm": "^13.1.2",
|
|
75
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
76
|
+
"@types/glob": "^8.1.0",
|
|
77
|
+
"@types/node": "^22.10.2",
|
|
78
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
79
|
+
"@typescript-eslint/eslint-plugin": "^8.47.0",
|
|
80
|
+
"@typescript-eslint/parser": "^8.47.0",
|
|
81
|
+
"@vitest/coverage-v8": "^4.0.10",
|
|
82
|
+
"eslint": "^9.39.1",
|
|
83
|
+
"globals": "^16.5.0",
|
|
84
|
+
"prettier": "^3.6.2",
|
|
85
|
+
"semantic-release": "^25.0.2",
|
|
86
|
+
"shellcheck": "^4.1.0",
|
|
87
|
+
"typescript": "^5.7.2",
|
|
88
|
+
"typescript-eslint": "^8.47.0",
|
|
89
|
+
"vitest": "^4.0.9"
|
|
90
|
+
},
|
|
91
|
+
"engines": {
|
|
92
|
+
"node": ">=18"
|
|
93
|
+
}
|
|
10
94
|
}
|