summaryrefslogtreecommitdiff
path: root/packages/cli/src
diff options
context:
space:
mode:
authorSeth Troisi <[email protected]>2025-04-29 23:38:26 +0000
committerSeth Troisi <[email protected]>2025-04-29 17:20:38 -0700
commitfb23321514dbc8d1c0243457e8d5d8d953bb3985 (patch)
tree1600685a1ab5aad8361701122d9212e91131fb60 /packages/cli/src
parentbf659f19776ddc4eb9825bd5376c66288aed06c8 (diff)
Add Intro text with list of /commands
Diffstat (limited to 'packages/cli/src')
-rw-r--r--packages/cli/src/ui/App.tsx11
-rw-r--r--packages/cli/src/ui/components/Intro.tsx43
-rw-r--r--packages/cli/src/ui/hooks/slashCommandProcessor.ts10
-rw-r--r--packages/cli/src/ui/hooks/useGeminiStream.ts10
4 files changed, 46 insertions, 28 deletions
diff --git a/packages/cli/src/ui/App.tsx b/packages/cli/src/ui/App.tsx
index ce326af5..4bf7123e 100644
--- a/packages/cli/src/ui/App.tsx
+++ b/packages/cli/src/ui/App.tsx
@@ -32,8 +32,13 @@ interface AppProps {
export const App = ({ config, cliVersion }: AppProps) => {
const [history, setHistory] = useState<HistoryItem[]>([]);
const [startupWarnings, setStartupWarnings] = useState<string[]>([]);
- const { streamingState, submitQuery, initError, debugMessage } =
- useGeminiStream(setHistory, config);
+ const {
+ streamingState,
+ submitQuery,
+ initError,
+ debugMessage,
+ slashCommands,
+ } = useGeminiStream(setHistory, config);
const { elapsedTime, currentLoadingPhrase } =
useLoadingIndicator(streamingState);
@@ -104,7 +109,7 @@ export const App = ({ config, cliVersion }: AppProps) => {
<Box flexDirection="column" key={'header-' + index}>
<Header />
<Tips />
- <Intro />
+ <Intro commands={slashCommands} />
</Box>
);
}
diff --git a/packages/cli/src/ui/components/Intro.tsx b/packages/cli/src/ui/components/Intro.tsx
index 04dac134..d99e5993 100644
--- a/packages/cli/src/ui/components/Intro.tsx
+++ b/packages/cli/src/ui/components/Intro.tsx
@@ -7,28 +7,35 @@
import React from 'react';
import { Box, Newline, Text } from 'ink';
import { Colors } from '../colors.js';
+import { SlashCommand } from '../hooks/slashCommandProcessor.js';
-export const Intro: React.FC = () => (
+interface Intro {
+ commands: SlashCommand[];
+}
+
+export const Intro: React.FC<Intro> = ({ commands }) => (
<Box flexDirection="column" marginBottom={1}>
- <Text bold color={Colors.Foreground}>Abilities:</Text>
- <Text color={Colors.Foreground}> * Use tools to read and write files</Text>
- <Text color={Colors.Foreground}> * Semantically search and understand code</Text>
- <Text color={Colors.Foreground}> * Execute bash commands</Text>
- <Newline/>
- <Text bold color={Colors.Foreground}>Commands:</Text>
- <Text color={Colors.SubtleComment}>
- <Text bold color={Colors.AccentPurple}> /help</Text>
- {' '}- prints this help
- </Text>
- <Text color={Colors.SubtleComment}>
- <Text bold color={Colors.AccentPurple}> /clear</Text>
- {' '}- clear the screen
+ <Text bold color={Colors.Foreground}>
+ Abilities:
</Text>
- <Text color={Colors.SubtleComment}>
- <Text bold color={Colors.AccentPurple}> /exit</Text>
+ <Text color={Colors.Foreground}> * Use tools to read and write files</Text>
+ <Text color={Colors.Foreground}>
+ {' '}
+ * Semantically search and explain code
</Text>
- <Text color={Colors.SubtleComment}>
- <Text bold color={Colors.AccentPurple}> /quit</Text>
+ <Text color={Colors.Foreground}> * Execute bash commands</Text>
+ <Newline />
+ <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}
+ </Text>
+ {command.description && ' - ' + command.description}
+ </Text>
+ ))}
</Box>
);
diff --git a/packages/cli/src/ui/hooks/slashCommandProcessor.ts b/packages/cli/src/ui/hooks/slashCommandProcessor.ts
index 400597e3..6608001b 100644
--- a/packages/cli/src/ui/hooks/slashCommandProcessor.ts
+++ b/packages/cli/src/ui/hooks/slashCommandProcessor.ts
@@ -9,7 +9,7 @@ import { type PartListUnion } from '@google/genai';
import { HistoryItem } from '../types.js';
import { isSlashCommand } from '../utils/commandUtils.js';
-interface SlashCommand {
+export interface SlashCommand {
name: string; // slash command
description: string; // flavor text in UI
action: (value: PartListUnion) => void;
@@ -43,7 +43,7 @@ export const useSlashCommandProcessor = (
},
{
name: 'help',
- description: '/help for help on gemini-code',
+ description: 'for help on gemini-code',
action: (_value: PartListUnion) => {
const helpText =
'I am an interactive CLI tool assistant designed to ' +
@@ -58,7 +58,7 @@ export const useSlashCommandProcessor = (
},
{
name: 'exit',
- description: 'Exit gemini-code',
+ description: '',
action: (_value: PartListUnion) => {
setDebugMessage('Exiting. Good-bye.');
const timestamp = getNextMessageId(Date.now());
@@ -73,7 +73,7 @@ export const useSlashCommandProcessor = (
{
// TODO: dedup with exit by adding altName or cmdRegex.
name: 'quit',
- description: 'Quit gemini-code',
+ description: '',
action: (_value: PartListUnion) => {
setDebugMessage('Quitting. Good-bye.');
const timestamp = getNextMessageId(Date.now());
@@ -121,5 +121,5 @@ export const useSlashCommandProcessor = (
[setDebugMessage, setHistory, getNextMessageId, slashCommands],
);
- return { handleSlashCommand };
+ return { handleSlashCommand, slashCommands };
};
diff --git a/packages/cli/src/ui/hooks/useGeminiStream.ts b/packages/cli/src/ui/hooks/useGeminiStream.ts
index 7e1f2177..f166bc1e 100644
--- a/packages/cli/src/ui/hooks/useGeminiStream.ts
+++ b/packages/cli/src/ui/hooks/useGeminiStream.ts
@@ -69,7 +69,7 @@ export const useGeminiStream = (
}, []);
// Instantiate command processors
- const { handleSlashCommand } = useSlashCommandProcessor(
+ const { handleSlashCommand, slashCommands } = useSlashCommandProcessor(
setHistory,
setDebugMessage,
getNextMessageId,
@@ -532,5 +532,11 @@ export const useGeminiStream = (
],
);
- return { streamingState, submitQuery, initError, debugMessage };
+ return {
+ streamingState,
+ submitQuery,
+ initError,
+ debugMessage,
+ slashCommands,
+ };
};