@@ -183,14 +183,16 @@ func runCmdFunc(cmd *cobra.Command, args []string) error {
183
183
return fmt .Errorf ("failed to create workload manager: %v" , err )
184
184
}
185
185
186
- if runFlags .Name != "" {
187
- exists , err := workloadManager .DoesWorkloadExist (ctx , runFlags .Name )
188
- if err != nil {
189
- return fmt .Errorf ("failed to check if workload exists: %v" , err )
190
- }
191
- if exists {
192
- return fmt .Errorf ("workload with name '%s' already exists" , runFlags .Name )
193
- }
186
+ if runFlags .Name == "" {
187
+ runFlags .Name = getworkloadDefaultName (serverOrImage )
188
+ logger .Infof ("No workload name specified, using generated name: %s" , runFlags .Name )
189
+ }
190
+ exists , err := workloadManager .DoesWorkloadExist (ctx , runFlags .Name )
191
+ if err != nil {
192
+ return fmt .Errorf ("failed to check if workload exists: %v" , err )
193
+ }
194
+ if exists {
195
+ return fmt .Errorf ("workload with name '%s' already exists" , runFlags .Name )
194
196
}
195
197
err = validateGroup (ctx , workloadManager , serverOrImage )
196
198
if err != nil {
@@ -238,6 +240,43 @@ func deriveRemoteName(remoteURL string) (string, error) {
238
240
return hostname , nil
239
241
}
240
242
243
+ // getworkloadDefaultName generates a default workload name based on the serverOrImage input
244
+ // This function reuses the existing system's naming logic to ensure consistency
245
+ func getworkloadDefaultName (serverOrImage string ) string {
246
+ // If it's a protocol scheme (uvx://, npx://, go://)
247
+ if runner .IsImageProtocolScheme (serverOrImage ) {
248
+ // Extract package name from protocol scheme using the existing parseProtocolScheme logic
249
+ _ , packageName , err := runner .ParseProtocolScheme (serverOrImage )
250
+ if err != nil {
251
+ return ""
252
+ }
253
+
254
+ // Use the existing packageNameToImageName function from the runner package
255
+ return runner .PackageNameToImageName (packageName )
256
+ }
257
+
258
+ // If it's a URL (remote server)
259
+ if networking .IsURL (serverOrImage ) {
260
+ name , err := deriveRemoteName (serverOrImage )
261
+ if err != nil {
262
+ return ""
263
+ }
264
+ return name
265
+ }
266
+
267
+ // Check if it's a server name from registry
268
+ // Registry server names are typically multi-word names with hyphens
269
+ if ! strings .Contains (serverOrImage , "://" ) && ! strings .Contains (serverOrImage , "/" ) && ! strings .Contains (serverOrImage , ":" ) {
270
+ // Likely a registry server name (no protocol, no slashes, no colons), return as-is
271
+ return serverOrImage
272
+ }
273
+
274
+ // For container images, use the existing container.GetOrGenerateContainerName logic
275
+ // We pass empty string as containerName to force generation, and extract the baseName
276
+ _ , baseName := container .GetOrGenerateContainerName ("" , serverOrImage )
277
+ return baseName
278
+ }
279
+
241
280
func runForeground (ctx context.Context , workloadManager workloads.Manager , runnerConfig * runner.RunConfig ) error {
242
281
ctx , cancel := context .WithCancel (ctx )
243
282
defer cancel ()
0 commit comments