···281281 ],
282282 [Events.TAB]: [
283283 {
284284- // Command has params AND name is already fully typed → enter param mode
285285- guard: (p) => guard('hasMatches', p) && guard('commandHasParams', p) && guard('textAlreadyMatchesCommand', p),
284284+ // Command has params → complete name and enter param mode in one step
285285+ guard: (p) => guard('hasMatches', p) && guard('commandHasParams', p),
286286 target: States.PARAM_MODE,
287287 actions: ['tabCompleteCommand', 'enterParamMode', 'updateGhostText', 'updateResults'],
288288 },
289289 {
290290- // Command has params but name is only partially typed → complete name first
291291- // (next Tab press will enter param mode since name will then be fully typed)
290290+ // No params — just complete/cycle the name
292291 guard: 'hasMatches',
293292 target: States.TYPING,
294293 actions: ['tabCompleteCommand', 'updateGhostText', 'updateResults'],
···371370 actions: ['tabCompleteCommand', 'enterParamMode', 'updateGhostText', 'updateResults'],
372371 },
373372 {
373373+ // In RESULTS_OPEN, Tab cycles through results — only enter param mode
374374+ // when the name is already fully typed (above guard). Otherwise cycle.
374375 guard: 'hasMatches',
375376 target: States.RESULTS_OPEN,
376377 actions: ['tabCycleInResults', 'updateGhostText', 'renderResults'],