From 2cd976987e0a4837301df161479e44dfcca6e206 Mon Sep 17 00:00:00 2001 From: Seth Troisi Date: Mon, 5 May 2025 21:16:13 +0000 Subject: [PATCH] slash command altnames and support for ? --- .../cli/src/ui/hooks/slashCommandProcessor.ts | 31 ++++++------------- packages/cli/src/ui/hooks/useCompletion.ts | 11 ++++++- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/packages/cli/src/ui/hooks/slashCommandProcessor.ts b/packages/cli/src/ui/hooks/slashCommandProcessor.ts index 33b59b68..b4401eef 100644 --- a/packages/cli/src/ui/hooks/slashCommandProcessor.ts +++ b/packages/cli/src/ui/hooks/slashCommandProcessor.ts @@ -11,6 +11,7 @@ import { getCommandFromQuery } from '../utils/commandUtils.js'; export interface SlashCommand { name: string; // slash command + altName?: string; // alternative name for the command description: string; // flavor text in UI action: (value: PartListUnion) => void; } @@ -37,6 +38,7 @@ export const useSlashCommandProcessor = ( const slashCommands: SlashCommand[] = [ { name: 'help', + altName: '?', description: 'for help on gemini-code', action: (_value: PartListUnion) => { setDebugMessage('Opening help.'); @@ -61,31 +63,12 @@ export const useSlashCommandProcessor = ( }, }, { - name: 'exit', - description: '', - action: (_value: PartListUnion) => { - setDebugMessage('Exiting. Good-bye.'); - const timestamp = getNextMessageId(Date.now()); - addHistoryItem( - setHistory, - { type: 'info', text: 'good-bye!' }, - timestamp, - ); - process.exit(0); - }, - }, - { - // TODO: dedup with exit by adding altName or cmdRegex. name: 'quit', + altName: 'exit', description: '', action: (_value: PartListUnion) => { setDebugMessage('Quitting. Good-bye.'); const timestamp = getNextMessageId(Date.now()); - addHistoryItem( - setHistory, - { type: 'info', text: 'good-bye!' }, - timestamp, - ); process.exit(0); }, }, @@ -102,12 +85,16 @@ export const useSlashCommandProcessor = ( const [symbol, test] = getCommandFromQuery(trimmed); // Skip non slash commands - if (symbol !== '/') { + if (symbol !== '/' && symbol !== '?') { return false; } for (const cmd of slashCommands) { - if (test === cmd.name) { + if ( + test === cmd.name || + test === cmd.altName || + symbol === cmd.altName + ) { // Add user message *before* execution const userMessageTimestamp = Date.now(); addHistoryItem( diff --git a/packages/cli/src/ui/hooks/useCompletion.ts b/packages/cli/src/ui/hooks/useCompletion.ts index 31c59bcf..97ad48ed 100644 --- a/packages/cli/src/ui/hooks/useCompletion.ts +++ b/packages/cli/src/ui/hooks/useCompletion.ts @@ -119,9 +119,18 @@ export function useCompletion( // --- Handle Slash Command Completion --- if (trimmedQuery.startsWith('/')) { const partialCommand = trimmedQuery.substring(1); - const filteredSuggestions = slashCommands + const commands = slashCommands .map((cmd) => cmd.name) + .concat( + slashCommands + .map((cmd) => cmd.altName) + .filter((cmd) => cmd !== undefined), + ); + + const filteredSuggestions = commands .filter((name) => name.startsWith(partialCommand)) + // Filter out ? and any other single character commands + .filter((name) => name.length > 1) .map((name) => ({ label: name, value: name })) .sort();