summaryrefslogtreecommitdiff
path: root/packages/cli/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src')
-rw-r--r--packages/cli/src/ui/App.tsx8
-rw-r--r--packages/cli/src/ui/components/Footer.tsx12
-rw-r--r--packages/cli/src/ui/components/Help.tsx18
-rw-r--r--packages/cli/src/ui/hooks/slashCommandProcessor.test.ts3
-rw-r--r--packages/cli/src/ui/hooks/slashCommandProcessor.ts10
-rw-r--r--packages/cli/src/ui/hooks/useCompletion.ts1
6 files changed, 43 insertions, 9 deletions
diff --git a/packages/cli/src/ui/App.tsx b/packages/cli/src/ui/App.tsx
index 70ece34f..707b8b9a 100644
--- a/packages/cli/src/ui/App.tsx
+++ b/packages/cli/src/ui/App.tsx
@@ -58,6 +58,12 @@ export const App = ({
const [showHelp, setShowHelp] = useState<boolean>(false);
const [themeError, setThemeError] = useState<string | null>(null);
const [footerHeight, setFooterHeight] = useState<number>(0);
+ const [corgiMode, setCorgiMode] = useState(false);
+
+ const toggleCorgiMode = useCallback(() => {
+ setCorgiMode((prev) => !prev);
+ }, []);
+
const {
isThemeDialogOpen,
openThemeDialog,
@@ -124,6 +130,7 @@ export const App = ({
setDebugMessage,
openThemeDialog,
performMemoryRefresh,
+ toggleCorgiMode,
);
const { streamingState, submitQuery, initError, pendingHistoryItem } =
@@ -408,6 +415,7 @@ export const App = ({
debugMessage={debugMessage}
cliVersion={cliVersion}
geminiMdFileCount={geminiMdFileCount}
+ corgiMode={corgiMode}
/>
<ConsoleOutput debugMode={config.getDebugMode()} />
</Box>
diff --git a/packages/cli/src/ui/components/Footer.tsx b/packages/cli/src/ui/components/Footer.tsx
index a98c8760..3b3cac72 100644
--- a/packages/cli/src/ui/components/Footer.tsx
+++ b/packages/cli/src/ui/components/Footer.tsx
@@ -15,6 +15,7 @@ interface FooterProps {
debugMessage: string;
cliVersion: string;
geminiMdFileCount: number;
+ corgiMode: boolean;
}
export const Footer: React.FC<FooterProps> = ({
@@ -23,6 +24,7 @@ export const Footer: React.FC<FooterProps> = ({
debugMessage,
cliVersion,
geminiMdFileCount,
+ corgiMode,
}) => (
<Box marginTop={1}>
<Box>
@@ -62,6 +64,16 @@ export const Footer: React.FC<FooterProps> = ({
<Box>
<Text color={Colors.AccentBlue}> {config.getModel()} </Text>
<Text color={Colors.SubtleComment}>| CLI {cliVersion} </Text>
+ {corgiMode && (
+ <Text>
+ <Text color={Colors.SubtleComment}>| </Text>
+ <Text color={Colors.AccentRed}>▼</Text>
+ <Text color={Colors.Foreground}>(´</Text>
+ <Text color={Colors.AccentRed}>ᴥ</Text>
+ <Text color={Colors.Foreground}>`)</Text>
+ <Text color={Colors.AccentRed}>▼ </Text>
+ </Text>
+ )}
</Box>
</Box>
);
diff --git a/packages/cli/src/ui/components/Help.tsx b/packages/cli/src/ui/components/Help.tsx
index 3ca182be..adc49cec 100644
--- a/packages/cli/src/ui/components/Help.tsx
+++ b/packages/cli/src/ui/components/Help.tsx
@@ -28,15 +28,17 @@ export const Help: React.FC<Help> = ({ commands }) => (
<Text bold color={Colors.Foreground}>
Commands:
</Text>
- {commands.map((command: SlashCommand) => (
- <Text key={command.name} color={Colors.SubtleComment}>
- <Text bold color={Colors.AccentPurple}>
- {' '}
- /{command.name}
+ {commands
+ .filter((command) => command.description)
+ .map((command: SlashCommand) => (
+ <Text key={command.name} color={Colors.SubtleComment}>
+ <Text bold color={Colors.AccentPurple}>
+ {' '}
+ /{command.name}
+ </Text>
+ {command.description && ' - ' + command.description}
</Text>
- {command.description && ' - ' + command.description}
- </Text>
- ))}
+ ))}
<Text color={Colors.SubtleComment}>
<Text bold color={Colors.AccentPurple}>
{' '}
diff --git a/packages/cli/src/ui/hooks/slashCommandProcessor.test.ts b/packages/cli/src/ui/hooks/slashCommandProcessor.test.ts
index 4055dfd3..f7f1bb5e 100644
--- a/packages/cli/src/ui/hooks/slashCommandProcessor.test.ts
+++ b/packages/cli/src/ui/hooks/slashCommandProcessor.test.ts
@@ -48,6 +48,7 @@ describe('useSlashCommandProcessor', () => {
let mockOpenThemeDialog: ReturnType<typeof vi.fn>;
let mockPerformMemoryRefresh: ReturnType<typeof vi.fn>;
let mockConfig: Config;
+ let mockCorgiMode: ReturnType<typeof vi.fn>;
beforeEach(() => {
mockAddItem = vi.fn();
@@ -58,6 +59,7 @@ describe('useSlashCommandProcessor', () => {
mockOpenThemeDialog = vi.fn();
mockPerformMemoryRefresh = vi.fn().mockResolvedValue(undefined);
mockConfig = { getDebugMode: vi.fn(() => false) } as unknown as Config;
+ mockCorgiMode = vi.fn();
// Clear mocks for fsPromises if they were used directly or indirectly
vi.mocked(fsPromises.readFile).mockClear();
@@ -89,6 +91,7 @@ describe('useSlashCommandProcessor', () => {
mockOnDebugMessage,
mockOpenThemeDialog,
mockPerformMemoryRefresh,
+ mockCorgiMode,
),
);
return result.current;
diff --git a/packages/cli/src/ui/hooks/slashCommandProcessor.ts b/packages/cli/src/ui/hooks/slashCommandProcessor.ts
index f489c648..095f4ad7 100644
--- a/packages/cli/src/ui/hooks/slashCommandProcessor.ts
+++ b/packages/cli/src/ui/hooks/slashCommandProcessor.ts
@@ -15,7 +15,7 @@ import { addMemoryEntry } from '../../config/memoryUtils.js';
export interface SlashCommand {
name: string;
altName?: string;
- description: string;
+ description?: string;
action: (mainCommand: string, subCommand?: string, args?: string) => void;
}
@@ -31,6 +31,7 @@ export const useSlashCommandProcessor = (
onDebugMessage: (message: string) => void,
openThemeDialog: () => void,
performMemoryRefresh: () => Promise<void>, // Add performMemoryRefresh prop
+ toggleCorgiMode: () => void,
) => {
const addMessage = useCallback(
(message: Message) => {
@@ -132,6 +133,12 @@ export const useSlashCommandProcessor = (
},
},
{
+ name: 'corgi',
+ action: (_mainCommand, _subCommand, _args) => {
+ toggleCorgiMode();
+ },
+ },
+ {
name: 'quit',
altName: 'exit',
description: 'exit the cli',
@@ -151,6 +158,7 @@ export const useSlashCommandProcessor = (
showMemoryAction,
addMemoryAction,
addMessage,
+ toggleCorgiMode,
],
);
diff --git a/packages/cli/src/ui/hooks/useCompletion.ts b/packages/cli/src/ui/hooks/useCompletion.ts
index 9c0c2db1..c707adef 100644
--- a/packages/cli/src/ui/hooks/useCompletion.ts
+++ b/packages/cli/src/ui/hooks/useCompletion.ts
@@ -142,6 +142,7 @@ export function useCompletion(
(altNameMatch && cmd.altName && cmd.altName.length > 1)
);
})
+ .filter((cmd) => cmd.description)
.map((cmd) => ({
label: cmd.name, // Always show the main name as label
value: cmd.name, // Value should be the main command name for execution