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,69 @@
1
+ /**
2
+ * Input validation utilities for security-critical parameters
3
+ * Designed to prevent command injection and path traversal attacks
4
+ */
5
+ export declare class ValidationError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ /**
9
+ * Validation options for different contexts
10
+ */
11
+ export interface ValidationOptions {
12
+ allowRelativePaths?: boolean;
13
+ maxLength?: number;
14
+ allowedExtensions?: string[];
15
+ mustExist?: boolean;
16
+ allowShellMetachars?: boolean;
17
+ }
18
+ /**
19
+ * Validate and sanitize a project name
20
+ */
21
+ export declare function validateProjectName(project: string): string;
22
+ /**
23
+ * Validate and sanitize a service name
24
+ */
25
+ export declare function validateServiceName(service: string): string;
26
+ /**
27
+ * Validate service type against known types
28
+ */
29
+ export declare function validateServiceType(type: string): string;
30
+ /**
31
+ * Validate port number
32
+ */
33
+ export declare function validatePort(port: string | number): number;
34
+ /**
35
+ * Validate git branch name
36
+ */
37
+ export declare function validateBranchName(branch: string): string;
38
+ /**
39
+ * Validate file path for template files, scripts, etc.
40
+ */
41
+ export declare function validateFilePath(path: string, options?: ValidationOptions): string;
42
+ /**
43
+ * Validate worktree path
44
+ */
45
+ export declare function validateWorktreePath(path: string): string;
46
+ /**
47
+ * Validate script path for hooks
48
+ */
49
+ export declare function validateScriptPath(path: string): string;
50
+ /**
51
+ * Validate service list format (service:type or service)
52
+ */
53
+ export declare function validateServices(services: string[]): Array<{
54
+ service: string;
55
+ type: string;
56
+ }>;
57
+ /**
58
+ * Validate template file path
59
+ */
60
+ export declare function validateTemplatePath(path: string): string;
61
+ /**
62
+ * Validate output file path
63
+ */
64
+ export declare function validateOutputPath(path: string): string;
65
+ /**
66
+ * Safe string for display/logging that removes dangerous characters
67
+ */
68
+ export declare function sanitizeForDisplay(input: string, maxLength?: number): string;
69
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAuBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAexD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CA6B1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAyBzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CA0ER;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8DzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuCvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAAE,GACjB,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAY,GACtB,MAAM,CAYR"}
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Input validation utilities for security-critical parameters
3
+ * Designed to prevent command injection and path traversal attacks
4
+ */
5
+ import { existsSync, statSync } from 'fs';
6
+ import { isAbsolute, normalize } from 'path';
7
+ export class ValidationError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'ValidationError';
11
+ }
12
+ }
13
+ /**
14
+ * Shell metacharacters that could be used for injection
15
+ */
16
+ const DANGEROUS_SHELL_CHARS = /[;|&$`<>(){}[\]"'\\*?~]/;
17
+ /**
18
+ * Valid characters for project/service names
19
+ */
20
+ const PROJECT_SERVICE_PATTERN = /^[a-zA-Z0-9._-]+$/;
21
+ /**
22
+ * Valid characters for branch names (based on git branch naming rules)
23
+ */
24
+ const BRANCH_NAME_PATTERN = /^[a-zA-Z0-9._/-]+$/;
25
+ /**
26
+ * Valid port number range
27
+ */
28
+ const PORT_MIN = 1024;
29
+ const PORT_MAX = 65535;
30
+ /**
31
+ * Validate and sanitize a project name
32
+ */
33
+ export function validateProjectName(project) {
34
+ if (!project || typeof project !== 'string') {
35
+ throw new ValidationError('Project name is required');
36
+ }
37
+ if (project.length > 50) {
38
+ throw new ValidationError('Project name must be 50 characters or less');
39
+ }
40
+ if (!PROJECT_SERVICE_PATTERN.test(project)) {
41
+ throw new ValidationError('Project name can only contain letters, numbers, dots, underscores, and hyphens');
42
+ }
43
+ if (project.startsWith('.') || project.startsWith('-')) {
44
+ throw new ValidationError('Project name cannot start with a dot or hyphen');
45
+ }
46
+ return project.trim();
47
+ }
48
+ /**
49
+ * Validate and sanitize a service name
50
+ */
51
+ export function validateServiceName(service) {
52
+ if (!service || typeof service !== 'string') {
53
+ throw new ValidationError('Service name is required');
54
+ }
55
+ if (service.length > 30) {
56
+ throw new ValidationError('Service name must be 30 characters or less');
57
+ }
58
+ if (!PROJECT_SERVICE_PATTERN.test(service)) {
59
+ throw new ValidationError('Service name can only contain letters, numbers, dots, underscores, and hyphens');
60
+ }
61
+ if (service.startsWith('.') || service.startsWith('-')) {
62
+ throw new ValidationError('Service name cannot start with a dot or hyphen');
63
+ }
64
+ return service.trim();
65
+ }
66
+ /**
67
+ * Validate service type against known types
68
+ */
69
+ export function validateServiceType(type) {
70
+ if (!type || typeof type !== 'string') {
71
+ throw new ValidationError('Service type is required');
72
+ }
73
+ const validTypes = ['postgres', 'mysql', 'redis', 'api', 'app', 'custom'];
74
+ const normalizedType = type.toLowerCase().trim();
75
+ if (!validTypes.includes(normalizedType)) {
76
+ throw new ValidationError(`Invalid service type. Must be one of: ${validTypes.join(', ')}`);
77
+ }
78
+ return normalizedType;
79
+ }
80
+ /**
81
+ * Validate port number
82
+ */
83
+ export function validatePort(port) {
84
+ let portNum;
85
+ if (typeof port === 'string') {
86
+ // Check for injection attempts in the string first
87
+ if (DANGEROUS_SHELL_CHARS.test(port)) {
88
+ throw new ValidationError('Port contains invalid characters');
89
+ }
90
+ portNum = parseInt(port, 10);
91
+ if (isNaN(portNum)) {
92
+ throw new ValidationError('Port must be a valid number');
93
+ }
94
+ // Ensure the string was purely numeric (no trailing chars)
95
+ if (port.trim() !== portNum.toString()) {
96
+ throw new ValidationError('Port must be a valid number');
97
+ }
98
+ }
99
+ else {
100
+ portNum = port;
101
+ }
102
+ if (portNum < PORT_MIN || portNum > PORT_MAX) {
103
+ throw new ValidationError(`Port must be between ${PORT_MIN} and ${PORT_MAX}`);
104
+ }
105
+ return portNum;
106
+ }
107
+ /**
108
+ * Validate git branch name
109
+ */
110
+ export function validateBranchName(branch) {
111
+ if (!branch || typeof branch !== 'string') {
112
+ throw new ValidationError('Branch name is required');
113
+ }
114
+ if (branch.length > 100) {
115
+ throw new ValidationError('Branch name must be 100 characters or less');
116
+ }
117
+ if (!BRANCH_NAME_PATTERN.test(branch)) {
118
+ throw new ValidationError('Branch name contains invalid characters. Only letters, numbers, dots, underscores, forward slashes, and hyphens are allowed');
119
+ }
120
+ // Git branch name restrictions
121
+ if (branch.startsWith('-') || branch.endsWith('.') || branch.includes('..')) {
122
+ throw new ValidationError('Invalid branch name format');
123
+ }
124
+ if (branch.includes(' ')) {
125
+ throw new ValidationError('Branch name cannot contain spaces');
126
+ }
127
+ return branch.trim();
128
+ }
129
+ /**
130
+ * Validate file path for template files, scripts, etc.
131
+ */
132
+ export function validateFilePath(path, options = {}) {
133
+ if (!path || typeof path !== 'string') {
134
+ throw new ValidationError('File path is required');
135
+ }
136
+ if (path.length > 500) {
137
+ throw new ValidationError('File path is too long (max 500 characters)');
138
+ }
139
+ // Check for shell metacharacters unless explicitly allowed
140
+ if (!options.allowShellMetachars && DANGEROUS_SHELL_CHARS.test(path)) {
141
+ throw new ValidationError('File path contains dangerous characters');
142
+ }
143
+ // Normalize the path to prevent traversal
144
+ const normalizedPath = normalize(path);
145
+ // Check for path traversal attempts
146
+ if (normalizedPath.includes('..')) {
147
+ throw new ValidationError('Path traversal is not allowed');
148
+ }
149
+ // Validate against null bytes and other dangerous sequences
150
+ if (normalizedPath.includes('\0') ||
151
+ normalizedPath.includes('\n') ||
152
+ normalizedPath.includes('\r')) {
153
+ throw new ValidationError('File path contains null bytes or newlines');
154
+ }
155
+ // Check if relative paths are allowed
156
+ if (!options.allowRelativePaths &&
157
+ !isAbsolute(normalizedPath) &&
158
+ normalizedPath.startsWith('../')) {
159
+ throw new ValidationError('Relative paths outside current directory are not allowed');
160
+ }
161
+ // Validate file extension if specified
162
+ if (options.allowedExtensions && options.allowedExtensions.length > 0) {
163
+ const hasValidExtension = options.allowedExtensions.some((ext) => normalizedPath.toLowerCase().endsWith(ext.toLowerCase()));
164
+ if (!hasValidExtension) {
165
+ throw new ValidationError(`File must have one of these extensions: ${options.allowedExtensions.join(', ')}`);
166
+ }
167
+ }
168
+ // Check if file exists if required
169
+ if (options.mustExist) {
170
+ try {
171
+ if (!existsSync(normalizedPath)) {
172
+ throw new ValidationError(`File does not exist: ${normalizedPath}`);
173
+ }
174
+ const stats = statSync(normalizedPath);
175
+ if (!stats.isFile()) {
176
+ throw new ValidationError(`Path is not a file: ${normalizedPath}`);
177
+ }
178
+ }
179
+ catch (error) {
180
+ if (error instanceof ValidationError) {
181
+ throw error;
182
+ }
183
+ throw new ValidationError(`Cannot access file: ${normalizedPath}`);
184
+ }
185
+ }
186
+ return normalizedPath;
187
+ }
188
+ /**
189
+ * Validate worktree path
190
+ */
191
+ export function validateWorktreePath(path) {
192
+ if (!path || typeof path !== 'string') {
193
+ throw new ValidationError('Worktree path is required');
194
+ }
195
+ if (path.length > 300) {
196
+ throw new ValidationError('Worktree path is too long (max 300 characters)');
197
+ }
198
+ // Check for shell metacharacters
199
+ if (DANGEROUS_SHELL_CHARS.test(path)) {
200
+ throw new ValidationError('Worktree path contains dangerous characters');
201
+ }
202
+ // Normalize the path
203
+ const normalizedPath = normalize(path);
204
+ // Check for excessive path traversal attempts (more than 2 levels)
205
+ const traversalCount = (path.match(/\.\./g) ?? []).length;
206
+ if (traversalCount > 2) {
207
+ throw new ValidationError('Excessive path traversal is not allowed');
208
+ }
209
+ // Check for absolute paths to sensitive locations (allow temp directories)
210
+ if (normalizedPath.startsWith('/etc/') ||
211
+ normalizedPath.startsWith('/usr/') ||
212
+ normalizedPath.startsWith('/boot/') ||
213
+ normalizedPath.endsWith('/etc/passwd') ||
214
+ normalizedPath.endsWith('/etc/shadow')) {
215
+ throw new ValidationError('Access to system directories is not allowed');
216
+ }
217
+ // Allow /var/ only for temp directories (macOS uses /var/folders/... for temp)
218
+ if (normalizedPath.startsWith('/var/') &&
219
+ !normalizedPath.startsWith('/var/folders/') &&
220
+ !normalizedPath.startsWith('/tmp/')) {
221
+ throw new ValidationError('Access to system directories is not allowed');
222
+ }
223
+ // Validate against null bytes
224
+ if (normalizedPath.includes('\0') ||
225
+ normalizedPath.includes('\n') ||
226
+ normalizedPath.includes('\r')) {
227
+ throw new ValidationError('Worktree path contains null bytes or newlines');
228
+ }
229
+ // Additional safety - ensure it doesn't start with dangerous sequences
230
+ if (normalizedPath.startsWith('/dev/') ||
231
+ normalizedPath.startsWith('/proc/') ||
232
+ normalizedPath.startsWith('/sys/')) {
233
+ throw new ValidationError('Worktree path cannot target system directories');
234
+ }
235
+ return normalizedPath;
236
+ }
237
+ /**
238
+ * Validate script path for hooks
239
+ */
240
+ export function validateScriptPath(path) {
241
+ const validatedPath = validateFilePath(path, {
242
+ allowRelativePaths: true,
243
+ maxLength: 200,
244
+ allowedExtensions: [
245
+ '.sh',
246
+ '.bash',
247
+ '.zsh',
248
+ '.fish',
249
+ '.py',
250
+ '.js',
251
+ '.mjs',
252
+ '.ts',
253
+ ],
254
+ mustExist: true,
255
+ });
256
+ // Additional checks for script execution safety
257
+ try {
258
+ const stats = statSync(validatedPath);
259
+ // Check if it's executable (on Unix-like systems)
260
+ if (process.platform !== 'win32') {
261
+ const mode = stats.mode;
262
+ if (!(mode & parseInt('0100', 8))) {
263
+ // Check if owner has execute permission
264
+ throw new ValidationError('Script file is not executable');
265
+ }
266
+ }
267
+ }
268
+ catch (error) {
269
+ if (error instanceof ValidationError) {
270
+ throw error;
271
+ }
272
+ throw new ValidationError(`Cannot verify script permissions: ${validatedPath}`);
273
+ }
274
+ return validatedPath;
275
+ }
276
+ /**
277
+ * Validate service list format (service:type or service)
278
+ */
279
+ export function validateServices(services) {
280
+ if (!Array.isArray(services)) {
281
+ throw new ValidationError('Services must be an array');
282
+ }
283
+ if (services.length === 0) {
284
+ throw new ValidationError('At least one service is required');
285
+ }
286
+ if (services.length > 10) {
287
+ throw new ValidationError('Too many services (max 10)');
288
+ }
289
+ return services.map((serviceStr, index) => {
290
+ if (!serviceStr || typeof serviceStr !== 'string') {
291
+ throw new ValidationError(`Service at index ${index} is invalid`);
292
+ }
293
+ const trimmed = serviceStr.trim();
294
+ const parts = trimmed.split(':');
295
+ if (parts.length === 1) {
296
+ // Format: service (use same name for type)
297
+ const service = validateServiceName(parts[0]);
298
+ const type = validateServiceType(parts[0]);
299
+ return { service, type };
300
+ }
301
+ else if (parts.length === 2) {
302
+ // Format: service:type
303
+ const service = validateServiceName(parts[0]);
304
+ const type = validateServiceType(parts[1]);
305
+ return { service, type };
306
+ }
307
+ else {
308
+ throw new ValidationError(`Invalid service format at index ${index}. Use 'service' or 'service:type'`);
309
+ }
310
+ });
311
+ }
312
+ /**
313
+ * Validate template file path
314
+ */
315
+ export function validateTemplatePath(path) {
316
+ return validateFilePath(path, {
317
+ allowRelativePaths: true,
318
+ allowedExtensions: ['.devports', '.env', '.template', '.tmpl'],
319
+ mustExist: true,
320
+ });
321
+ }
322
+ /**
323
+ * Validate output file path
324
+ */
325
+ export function validateOutputPath(path) {
326
+ return validateFilePath(path, {
327
+ allowRelativePaths: true,
328
+ mustExist: false,
329
+ });
330
+ }
331
+ /**
332
+ * Safe string for display/logging that removes dangerous characters
333
+ */
334
+ export function sanitizeForDisplay(input, maxLength = 100) {
335
+ if (!input || typeof input !== 'string') {
336
+ return '';
337
+ }
338
+ // Remove control characters and limit length
339
+ return (input
340
+ // eslint-disable-next-line no-control-regex
341
+ .replace(/[\x00-\x1F\x7F]/g, '') // Remove control characters
342
+ .substring(0, maxLength));
343
+ }
344
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Secure worktree operations with input validation and safe command execution
3
+ */
4
+ interface WorktreeOptions {
5
+ envFile?: string | null;
6
+ services?: string[];
7
+ template?: string;
8
+ postHook?: string;
9
+ }
10
+ /**
11
+ * Secure version of createWorktree with input validation and safe command execution
12
+ */
13
+ export declare function createWorktree(path: string, branch: string, options?: WorktreeOptions): Promise<{
14
+ worktreePath: string;
15
+ ports: Record<string, number>;
16
+ }>;
17
+ /**
18
+ * Secure version of removeWorktree with input validation
19
+ */
20
+ export declare function removeWorktree(path: string, options?: {
21
+ force?: boolean;
22
+ }): Promise<number>;
23
+ export {};
24
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAkKlE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,MAAM,CAAC,CA4BjB"}