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.
Files changed (151) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/LICENSE +21 -0
  3. package/README.md +810 -29
  4. package/dist/cli.d.ts +7 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +329 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/allocate.command.d.ts +8 -0
  9. package/dist/commands/allocate.command.d.ts.map +1 -0
  10. package/dist/commands/allocate.command.js +84 -0
  11. package/dist/commands/allocate.command.js.map +1 -0
  12. package/dist/commands/base-command.d.ts +28 -0
  13. package/dist/commands/base-command.d.ts.map +1 -0
  14. package/dist/commands/base-command.js +33 -0
  15. package/dist/commands/base-command.js.map +1 -0
  16. package/dist/commands/check.command.d.ts +7 -0
  17. package/dist/commands/check.command.d.ts.map +1 -0
  18. package/dist/commands/check.command.js +44 -0
  19. package/dist/commands/check.command.js.map +1 -0
  20. package/dist/commands/completion.command.d.ts +7 -0
  21. package/dist/commands/completion.command.d.ts.map +1 -0
  22. package/dist/commands/completion.command.js +116 -0
  23. package/dist/commands/completion.command.js.map +1 -0
  24. package/dist/commands/gitignore.command.d.ts +7 -0
  25. package/dist/commands/gitignore.command.d.ts.map +1 -0
  26. package/dist/commands/gitignore.command.js +61 -0
  27. package/dist/commands/gitignore.command.js.map +1 -0
  28. package/dist/commands/index.d.ts +7 -0
  29. package/dist/commands/index.d.ts.map +1 -0
  30. package/dist/commands/index.js +35 -0
  31. package/dist/commands/index.js.map +1 -0
  32. package/dist/commands/info.command.d.ts +7 -0
  33. package/dist/commands/info.command.d.ts.map +1 -0
  34. package/dist/commands/info.command.js +40 -0
  35. package/dist/commands/info.command.js.map +1 -0
  36. package/dist/commands/list.command.d.ts +8 -0
  37. package/dist/commands/list.command.d.ts.map +1 -0
  38. package/dist/commands/list.command.js +165 -0
  39. package/dist/commands/list.command.js.map +1 -0
  40. package/dist/commands/release.command.d.ts +8 -0
  41. package/dist/commands/release.command.d.ts.map +1 -0
  42. package/dist/commands/release.command.js +89 -0
  43. package/dist/commands/release.command.js.map +1 -0
  44. package/dist/commands/render.command.d.ts +7 -0
  45. package/dist/commands/render.command.d.ts.map +1 -0
  46. package/dist/commands/render.command.js +53 -0
  47. package/dist/commands/render.command.js.map +1 -0
  48. package/dist/commands/reserve.command.d.ts +7 -0
  49. package/dist/commands/reserve.command.d.ts.map +1 -0
  50. package/dist/commands/reserve.command.js +42 -0
  51. package/dist/commands/reserve.command.js.map +1 -0
  52. package/dist/commands/setup.command.d.ts +7 -0
  53. package/dist/commands/setup.command.d.ts.map +1 -0
  54. package/dist/commands/setup.command.js +43 -0
  55. package/dist/commands/setup.command.js.map +1 -0
  56. package/dist/commands/status.command.d.ts +7 -0
  57. package/dist/commands/status.command.d.ts.map +1 -0
  58. package/dist/commands/status.command.js +41 -0
  59. package/dist/commands/status.command.js.map +1 -0
  60. package/dist/commands/unreserve.command.d.ts +7 -0
  61. package/dist/commands/unreserve.command.d.ts.map +1 -0
  62. package/dist/commands/unreserve.command.js +38 -0
  63. package/dist/commands/unreserve.command.js.map +1 -0
  64. package/dist/commands/worktree-add.command.d.ts +7 -0
  65. package/dist/commands/worktree-add.command.d.ts.map +1 -0
  66. package/dist/commands/worktree-add.command.js +68 -0
  67. package/dist/commands/worktree-add.command.js.map +1 -0
  68. package/dist/commands/worktree-remove.command.d.ts +7 -0
  69. package/dist/commands/worktree-remove.command.d.ts.map +1 -0
  70. package/dist/commands/worktree-remove.command.js +33 -0
  71. package/dist/commands/worktree-remove.command.js.map +1 -0
  72. package/dist/completion/bash-completion-template.d.ts +5 -0
  73. package/dist/completion/bash-completion-template.d.ts.map +1 -0
  74. package/dist/completion/bash-completion-template.js +14 -0
  75. package/dist/completion/bash-completion-template.js.map +1 -0
  76. package/dist/completion/bash.sh +208 -0
  77. package/dist/completion/completion-data.d.ts +16 -0
  78. package/dist/completion/completion-data.d.ts.map +1 -0
  79. package/dist/completion/completion-data.js +38 -0
  80. package/dist/completion/completion-data.js.map +1 -0
  81. package/dist/completion/index.d.ts +24 -0
  82. package/dist/completion/index.d.ts.map +1 -0
  83. package/dist/completion/index.js +30 -0
  84. package/dist/completion/index.js.map +1 -0
  85. package/dist/completion/shell-config.d.ts +27 -0
  86. package/dist/completion/shell-config.d.ts.map +1 -0
  87. package/dist/completion/shell-config.js +243 -0
  88. package/dist/completion/shell-config.js.map +1 -0
  89. package/dist/completion/zsh-completion-template.d.ts +5 -0
  90. package/dist/completion/zsh-completion-template.d.ts.map +1 -0
  91. package/dist/completion/zsh-completion-template.js +14 -0
  92. package/dist/completion/zsh-completion-template.js.map +1 -0
  93. package/dist/completion/zsh.sh +164 -0
  94. package/dist/config.d.ts +6 -0
  95. package/dist/config.d.ts.map +1 -0
  96. package/dist/config.js +111 -0
  97. package/dist/config.js.map +1 -0
  98. package/dist/devports-1.0.0.tgz +0 -0
  99. package/dist/execution.d.ts +31 -0
  100. package/dist/execution.d.ts.map +1 -0
  101. package/dist/execution.js +110 -0
  102. package/dist/execution.js.map +1 -0
  103. package/dist/gitignore.d.ts +22 -0
  104. package/dist/gitignore.d.ts.map +1 -0
  105. package/dist/gitignore.js +142 -0
  106. package/dist/gitignore.js.map +1 -0
  107. package/dist/index.d.ts +7 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +6 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/port-manager.d.ts +33 -0
  112. package/dist/port-manager.d.ts.map +1 -0
  113. package/dist/port-manager.js +169 -0
  114. package/dist/port-manager.js.map +1 -0
  115. package/dist/port-utils.d.ts +9 -0
  116. package/dist/port-utils.d.ts.map +1 -0
  117. package/dist/port-utils.js +38 -0
  118. package/dist/port-utils.js.map +1 -0
  119. package/dist/render.d.ts +54 -0
  120. package/dist/render.d.ts.map +1 -0
  121. package/dist/render.js +286 -0
  122. package/dist/render.js.map +1 -0
  123. package/dist/services/lock-manager.d.ts +46 -0
  124. package/dist/services/lock-manager.d.ts.map +1 -0
  125. package/dist/services/lock-manager.js +118 -0
  126. package/dist/services/lock-manager.js.map +1 -0
  127. package/dist/services/response-formatter.d.ts +45 -0
  128. package/dist/services/response-formatter.d.ts.map +1 -0
  129. package/dist/services/response-formatter.js +102 -0
  130. package/dist/services/response-formatter.js.map +1 -0
  131. package/dist/services/validation-service.d.ts +109 -0
  132. package/dist/services/validation-service.d.ts.map +1 -0
  133. package/dist/services/validation-service.js +267 -0
  134. package/dist/services/validation-service.js.map +1 -0
  135. package/dist/setup.d.ts +20 -0
  136. package/dist/setup.d.ts.map +1 -0
  137. package/dist/setup.js +243 -0
  138. package/dist/setup.js.map +1 -0
  139. package/dist/types.d.ts +29 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +18 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/validation.d.ts +69 -0
  144. package/dist/validation.d.ts.map +1 -0
  145. package/dist/validation.js +344 -0
  146. package/dist/validation.js.map +1 -0
  147. package/dist/worktree.d.ts +24 -0
  148. package/dist/worktree.d.ts.map +1 -0
  149. package/dist/worktree.js +245 -0
  150. package/dist/worktree.js.map +1 -0
  151. package/package.json +90 -6
@@ -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.1",
4
- "description": "OIDC trusted publishing setup package for devports",
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
- "oidc",
7
- "trusted-publishing",
8
- "setup"
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
  }