Skip to main content
Glama
CommanderBinderCommandBindingAppTests.swift11.6 kB
import Commander import Testing @testable import PeekabooCLI @Suite("Commander Binder Command Binding (App + Config)") struct CommanderBinderAppConfigTests { @Test("App launch binding") func bindAppLaunch() throws { let parsed = ParsedValues( positional: ["Visual Studio Code"], options: [ "bundleId": ["com.microsoft.VSCode"] ], flags: ["waitUntilReady"] ) let command = try CommanderCLIBinder.instantiateCommand( ofType: AppCommand.LaunchSubcommand.self, parsedValues: parsed ) #expect(command.app == "Visual Studio Code") #expect(command.bundleId == "com.microsoft.VSCode") #expect(command.waitUntilReady == true) #expect(command.noFocus == false) } @Test("App launch binding with --no-focus") func bindAppLaunchNoFocus() throws { let parsed = ParsedValues( positional: ["Calendar"], options: [:], flags: ["noFocus"] ) let command = try CommanderCLIBinder.instantiateCommand( ofType: AppCommand.LaunchSubcommand.self, parsedValues: parsed ) #expect(command.app == "Calendar") #expect(command.noFocus == true) } @Test("App launch binding with open targets") func bindAppLaunchWithOpenTargets() throws { let parsed = ParsedValues( positional: ["Safari"], options: [ "open": ["https://example.com", "~/Documents/report.pdf"] ], flags: [] ) let command = try CommanderCLIBinder.instantiateCommand( ofType: AppCommand.LaunchSubcommand.self, parsedValues: parsed ) #expect(command.app == "Safari") #expect(command.openTargets == ["https://example.com", "~/Documents/report.pdf"]) } @Test("Open command binding with overrides") func bindOpenCommandWithOverrides() throws { let parsed = ParsedValues( positional: ["https://example.com"], options: [ "app": ["Safari"], "bundleId": ["com.apple.Safari"] ], flags: ["waitUntilReady", "noFocus"] ) let command = try CommanderCLIBinder.instantiateCommand(ofType: OpenCommand.self, parsedValues: parsed) #expect(command.target == "https://example.com") #expect(command.app == "Safari") #expect(command.bundleId == "com.apple.Safari") #expect(command.waitUntilReady == true) #expect(command.noFocus == true) } @Test("Open command binding minimal") func bindOpenCommandMinimal() throws { let parsed = ParsedValues( positional: ["~/Desktop"], options: [:], flags: [] ) let command = try CommanderCLIBinder.instantiateCommand(ofType: OpenCommand.self, parsedValues: parsed) #expect(command.target == "~/Desktop") #expect(command.app == nil) #expect(command.bundleId == nil) #expect(command.waitUntilReady == false) #expect(command.noFocus == false) } @Test("App quit binding") func bindAppQuit() throws { let parsed = ParsedValues( positional: [], options: [ "app": ["Safari"], "pid": ["123"], "except": ["Finder,Terminal"] ], flags: ["all", "force"] ) let command = try CommanderCLIBinder.instantiateCommand( ofType: AppCommand.QuitSubcommand.self, parsedValues: parsed ) #expect(command.app == "Safari") #expect(command.pid == 123) #expect(command.all == true) #expect(command.except == "Finder,Terminal") #expect(command.force == true) } @Test("App switch binding") func bindAppSwitch() throws { let parsed = ParsedValues( positional: [], options: ["to": ["Slack"]], flags: ["cycle"] ) let command = try CommanderCLIBinder.instantiateCommand( ofType: AppCommand.SwitchSubcommand.self, parsedValues: parsed ) #expect(command.to == "Slack") #expect(command.cycle == true) } @Test("App list binding") func bindAppList() throws { let parsed = ParsedValues( positional: [], options: [:], flags: ["includeHidden", "includeBackground"] ) let command = try CommanderCLIBinder.instantiateCommand( ofType: AppCommand.ListSubcommand.self, parsedValues: parsed ) #expect(command.includeHidden == true) #expect(command.includeBackground == true) } @Test("App relaunch binding") func bindAppRelaunch() throws { let parsed = ParsedValues( positional: ["Safari"], options: [ "pid": ["456"], "wait": ["3.5"] ], flags: ["force", "waitUntilReady"] ) let command = try CommanderCLIBinder.instantiateCommand( ofType: AppCommand.RelaunchSubcommand.self, parsedValues: parsed ) #expect(command.app == "Safari") #expect(command.pid == 456) #expect(command.wait == 3.5) #expect(command.force == true) #expect(command.waitUntilReady == true) } @Test("Config init binding") func bindConfigInit() throws { let parsed = ParsedValues(positional: [], options: [:], flags: ["force"]) let command = try CommanderCLIBinder.instantiateCommand( ofType: ConfigCommand.InitCommand.self, parsedValues: parsed ) #expect(command.force == true) } @Test("Config show binding") func bindConfigShow() throws { let parsed = ParsedValues(positional: [], options: [:], flags: ["effective"]) let command = try CommanderCLIBinder.instantiateCommand( ofType: ConfigCommand.ShowCommand.self, parsedValues: parsed ) #expect(command.effective == true) } @Test("Config set credential binding") func bindConfigSetCredential() throws { let parsed = ParsedValues(positional: ["OPENAI_API_KEY", "sk-123"], options: [:], flags: []) let command = try CommanderCLIBinder.instantiateCommand( ofType: ConfigCommand.SetCredentialCommand.self, parsedValues: parsed ) #expect(command.key == "OPENAI_API_KEY") #expect(command.value == "sk-123") } @Test("Config add provider binding") func bindConfigAddProvider() throws { let parsed = ParsedValues( positional: ["openrouter"], options: [ "type": ["openai"], "name": ["OpenRouter"], "baseUrl": ["https://openrouter.ai"], "apiKey": ["{env:OPENROUTER_API_KEY}"], "description": ["Multi-provider"], "headers": ["x-demo:yes"] ], flags: ["force"] ) let command = try CommanderCLIBinder.instantiateCommand( ofType: ConfigCommand.AddProviderCommand.self, parsedValues: parsed ) #expect(command.providerId == "openrouter") #expect(command.type == "openai") #expect(command.name == "OpenRouter") #expect(command.baseUrl == "https://openrouter.ai") #expect(command.apiKey == "{env:OPENROUTER_API_KEY}") #expect(command.description == "Multi-provider") #expect(command.headers == "x-demo:yes") #expect(command.force == true) } @Test("Config remove provider binding") func bindConfigRemoveProvider() throws { let parsed = ParsedValues(positional: ["openrouter"], options: [:], flags: ["force"]) let command = try CommanderCLIBinder.instantiateCommand( ofType: ConfigCommand.RemoveProviderCommand.self, parsedValues: parsed ) #expect(command.providerId == "openrouter") #expect(command.force == true) } @Test("Config models provider binding") func bindConfigModelsProvider() throws { let parsed = ParsedValues(positional: ["openrouter"], options: [:], flags: ["discover"]) let command = try CommanderCLIBinder.instantiateCommand( ofType: ConfigCommand.ModelsProviderCommand.self, parsedValues: parsed ) #expect(command.providerId == "openrouter") #expect(command.discover == true) } @Test("Space list binding") func bindSpaceList() throws { let parsed = ParsedValues(positional: [], options: [:], flags: ["detailed"]) let command = try CommanderCLIBinder.instantiateCommand(ofType: ListSubcommand.self, parsedValues: parsed) #expect(command.detailed == true) } @Test("Space switch binding") func bindSpaceSwitch() throws { let parsed = ParsedValues(positional: [], options: ["to": ["3"]], flags: []) let command = try CommanderCLIBinder.instantiateCommand(ofType: SwitchSubcommand.self, parsedValues: parsed) #expect(command.to == 3) } @Test("Space move-window binding") func bindSpaceMoveWindow() throws { let parsed = ParsedValues( positional: [], options: [ "app": ["Safari"], "pid": ["123"], "windowTitle": ["Inbox"], "windowIndex": ["456"], "to": ["2"] ], flags: ["toCurrent", "follow"] ) let command = try CommanderCLIBinder.instantiateCommand( ofType: MoveWindowSubcommand.self, parsedValues: parsed ) #expect(command.app == "Safari") #expect(command.pid == 123) #expect(command.windowTitle == "Inbox") #expect(command.windowIndex == 456) #expect(command.to == 2) #expect(command.toCurrent == true) #expect(command.follow == true) } @Test("Agent command binding") func bindAgentCommand() throws { let parsed = ParsedValues( positional: ["Open Notes and write summary"], options: [ "maxSteps": ["7"], "model": ["gpt-5.1"], "resumeSession": ["sess-42"], "audioFile": ["/tmp/input.wav"] ], flags: [ "debugTerminal", "quiet", "dryRun", "resume", "listSessions", "noCache", "audio", "realtime", "simple", "noColor" ] ) let command = try CommanderCLIBinder.instantiateCommand(ofType: AgentCommand.self, parsedValues: parsed) #expect(command.task == "Open Notes and write summary") #expect(command.debugTerminal == true) #expect(command.quiet == true) #expect(command.dryRun == true) #expect(command.maxSteps == 7) #expect(command.model == "gpt-5.1") #expect(command.resume == true) #expect(command.resumeSession == "sess-42") #expect(command.listSessions == true) #expect(command.noCache == true) #expect(command.audio == true) #expect(command.audioFile == "/tmp/input.wav") #expect(command.realtime == true) #expect(command.simple == true) #expect(command.noColor == true) } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/steipete/Peekaboo'

If you have feedback or need assistance with the MCP directory API, please join our Discord server