@@ -183,14 +183,16 @@ func runCmdFunc(cmd *cobra.Command, args []string) error {
183183 return fmt .Errorf ("failed to create workload manager: %v" , err )
184184 }
185185
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 )
194196 }
195197 err = validateGroup (ctx , workloadManager , serverOrImage )
196198 if err != nil {
@@ -238,6 +240,43 @@ func deriveRemoteName(remoteURL string) (string, error) {
238240 return hostname , nil
239241}
240242
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+
241280func runForeground (ctx context.Context , workloadManager workloads.Manager , runnerConfig * runner.RunConfig ) error {
242281 ctx , cancel := context .WithCancel (ctx )
243282 defer cancel ()
0 commit comments