@@ -89,6 +89,10 @@ func (m *InjectionManager) PrepareProviderEnvironment(provider string) (*Provide
8989 if err := m .prepareGeminiEnvironment (env ); err != nil {
9090 return nil , fmt .Errorf ("failed to prepare Gemini environment: %w" , err )
9191 }
92+ case "qwen" :
93+ if err := m .prepareQwenEnvironment (env ); err != nil {
94+ return nil , fmt .Errorf ("failed to prepare Qwen environment: %w" , err )
95+ }
9296 default :
9397 return nil , fmt .Errorf ("unsupported provider: %s" , provider )
9498 }
@@ -155,6 +159,23 @@ func (m *InjectionManager) prepareGeminiEnvironment(env *ProviderEnvironment) er
155159 return nil
156160}
157161
162+ // prepareQwenEnvironment prepares Qwen-specific environment
163+ func (m * InjectionManager ) prepareQwenEnvironment (env * ProviderEnvironment ) error {
164+ // Since Qwen is a fork of Gemini, it has similar limitations
165+ // We rely entirely on MCP servers for extensions
166+
167+ // Create QWEN.md for system prompt customization in workspace
168+ qwenMdPath := filepath .Join (m .workspaceDir , "QWEN.md" )
169+ if err := m .generateQwenSystemPrompt (qwenMdPath ); err != nil {
170+ return err
171+ }
172+
173+ // Ensure MCP servers include our slash command server
174+ // This is already handled by SyncToProvider
175+
176+ return nil
177+ }
178+
158179// generateClaudeSlashCommands generates markdown files for Claude slash commands
159180func (m * InjectionManager ) generateClaudeSlashCommands (commandsDir string ) error {
160181 commands := m .sharedManager .GetSlashCommands ()
@@ -388,6 +409,70 @@ This is a managed Opun session with the following MCP servers available:
388409 return t .Execute (file , data )
389410}
390411
412+ // generateQwenSystemPrompt generates QWEN.md for system customization
413+ func (m * InjectionManager ) generateQwenSystemPrompt (mdPath string ) error {
414+ tmpl := `# QWEN.md
415+
416+ This file provides system-level guidance for Qwen Code CLI when working in this Opun session.
417+
418+ ## Available Commands via MCP
419+
420+ Since Qwen doesn't support custom slash commands natively, use the MCP tools to access Opun functionality:
421+
422+ ### Workflows
423+ {{range .Commands}}{{if eq .Type "workflow"}}
424+ - **{{.Name}}**: {{.Description}}
425+ - Handler: {{.Handler}}
426+ {{end}}{{end}}
427+
428+ ### Prompts
429+ {{range .Commands}}{{if eq .Type "prompt"}}
430+ - **{{.Name}}**: {{.Description}}
431+ - Handler: {{.Handler}}
432+ {{end}}{{end}}
433+
434+ ### Built-in Commands
435+ {{range .Commands}}{{if eq .Type "builtin"}}
436+ - **{{.Name}}**: {{.Description}}
437+ {{end}}{{end}}
438+
439+ ## Using Commands
440+
441+ To execute any of these commands, use the MCP tools:
442+ 1. List available tools with the MCP server
443+ 2. Execute the desired command through the opun tool
444+ 3. For prompts, use the opun tool
445+
446+ ## Session Configuration
447+
448+ This is a managed Opun session with the following MCP servers available:
449+ {{range .Servers}}{{if .Installed}}
450+ - **{{.Name}}**: {{.Package}}
451+ {{end}}{{end}}
452+ `
453+
454+ t , err := template .New ("qwen" ).Parse (tmpl )
455+ if err != nil {
456+ return err
457+ }
458+
459+ data := struct {
460+ Commands []core.SharedSlashCommand
461+ Servers []core.SharedMCPServer
462+ }{
463+ Commands : m .sharedManager .GetSlashCommands (),
464+ Servers : m .sharedManager .GetMCPServers (),
465+ }
466+
467+ file , err := os .Create (mdPath )
468+ if err != nil {
469+ return err
470+ }
471+ defer file .Close ()
472+
473+ return t .Execute (file , data )
474+ }
475+
391476// ProviderEnvironment contains the prepared environment for a provider
392477type ProviderEnvironment struct {
393478 Provider string
0 commit comments