diff --git a/packages/mobile/src/navigation/RootNavigator.tsx b/packages/mobile/src/navigation/RootNavigator.tsx index 01fcc0ad5..9939907e4 100644 --- a/packages/mobile/src/navigation/RootNavigator.tsx +++ b/packages/mobile/src/navigation/RootNavigator.tsx @@ -7,6 +7,7 @@ import TerminalScreen from "../screens/TerminalScreen"; import SettingsScreen from "../screens/SettingsScreen"; import SpawnSessionScreen from "../screens/SpawnSessionScreen"; import OrchestratorScreen from "../screens/OrchestratorScreen"; +import CommandsScreen from "../screens/CommandsScreen"; export type RootStackParamList = { Home: undefined; @@ -15,6 +16,7 @@ export type RootStackParamList = { Settings: undefined; SpawnSession: undefined; Orchestrator: undefined; + Commands: undefined; }; export const navigationRef = createNavigationContainerRef(); @@ -77,6 +79,11 @@ export default function RootNavigator() { component={OrchestratorScreen} options={{ title: "Orchestrator" }} /> + ); diff --git a/packages/mobile/src/screens/CommandsScreen.tsx b/packages/mobile/src/screens/CommandsScreen.tsx new file mode 100644 index 000000000..b584c78d6 --- /dev/null +++ b/packages/mobile/src/screens/CommandsScreen.tsx @@ -0,0 +1,75 @@ +import React from "react"; +import { View, Text, StyleSheet, ScrollView } from "react-native"; + +const CLI_COMMANDS = [ + { cmd: "ao start [project]", desc: "Start orchestrator + dashboard" }, + { cmd: "ao stop [project]", desc: "Stop orchestrator + dashboard" }, + { cmd: "ao spawn [issue]", desc: "Spawn a session for an issue" }, + { cmd: "ao batch-spawn ", desc: "Spawn multiple sessions" }, + { cmd: "ao session ls [-p ]", desc: "List all active sessions" }, + { cmd: "ao session kill ", desc: "Kill a session" }, + { cmd: "ao session restore ", desc: "Restore a crashed session" }, + { cmd: "ao session cleanup [-p ]", desc: "Clean up merged/closed sessions" }, + { cmd: "ao send [message]", desc: "Send message to a session" }, + { cmd: "ao status [-p ]", desc: "Show sessions with PR/CI status" }, + { cmd: "ao review-check [project]", desc: "Check PRs and trigger agents" }, + { cmd: "ao dashboard [-p ]", desc: "Start the web dashboard" }, + { cmd: "ao open [target]", desc: "Open session(s) in terminal" }, + { cmd: "ao init [project]", desc: "Initialize config file" }, +]; + +export default function CommandsScreen() { + return ( + + + Quick reference for managing sessions from terminal. + {CLI_COMMANDS.map((c, i) => ( + + {c.cmd} + {c.desc} + + ))} + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: "#0d1117", + }, + content: { + padding: 14, + paddingBottom: 32, + }, + section: { + backgroundColor: "#161b22", + borderRadius: 10, + padding: 16, + }, + hint: { + color: "#8b949e", + fontSize: 13, + lineHeight: 18, + marginBottom: 12, + }, + cmdRow: { + backgroundColor: "#0d1117", + borderRadius: 6, + padding: 10, + marginBottom: 6, + borderWidth: 1, + borderColor: "#30363d", + }, + cmdText: { + color: "#58a6ff", + fontSize: 12, + fontFamily: "monospace", + marginBottom: 4, + }, + cmdDesc: { + color: "#8b949e", + fontSize: 12, + }, +}); diff --git a/packages/mobile/src/screens/HomeScreen.tsx b/packages/mobile/src/screens/HomeScreen.tsx index 66a85d423..655e1e25b 100644 --- a/packages/mobile/src/screens/HomeScreen.tsx +++ b/packages/mobile/src/screens/HomeScreen.tsx @@ -32,7 +32,7 @@ function sortSessions(sessions: DashboardSession[]): DashboardSession[] { } export default function HomeScreen({ navigation }: Props) { - const { sessions, stats, loading, error, refresh } = useSessions(); + const { sessions, stats, orchestratorId, loading, error, refresh } = useSessions(); useSessionNotifications(sessions); React.useLayoutEffect(() => { @@ -47,7 +47,13 @@ export default function HomeScreen({ navigation }: Props) { Session navigation.navigate("Orchestrator")} + onPress={() => { + if (orchestratorId) { + navigation.navigate("SessionDetail", { sessionId: orchestratorId }); + } else { + navigation.navigate("Orchestrator"); + } + }} > {"\uD83E\uDD16"} @@ -60,7 +66,7 @@ export default function HomeScreen({ navigation }: Props) { ), }); - }, [navigation]); + }, [navigation, orchestratorId]); const sorted = sortSessions(sessions); diff --git a/packages/mobile/src/screens/OrchestratorScreen.tsx b/packages/mobile/src/screens/OrchestratorScreen.tsx index a4330341e..031bf5ce4 100644 --- a/packages/mobile/src/screens/OrchestratorScreen.tsx +++ b/packages/mobile/src/screens/OrchestratorScreen.tsx @@ -14,23 +14,6 @@ import { getAttentionLevel, isTerminal, type DashboardSession } from "../types"; type Props = NativeStackScreenProps; -const CLI_COMMANDS = [ - { cmd: "ao start [project]", desc: "Start orchestrator + dashboard" }, - { cmd: "ao stop [project]", desc: "Stop orchestrator + dashboard" }, - { cmd: "ao spawn [issue]", desc: "Spawn a session for an issue" }, - { cmd: "ao batch-spawn ", desc: "Spawn multiple sessions" }, - { cmd: "ao session ls [-p ]", desc: "List all active sessions" }, - { cmd: "ao session kill ", desc: "Kill a session" }, - { cmd: "ao session restore ", desc: "Restore a crashed session" }, - { cmd: "ao session cleanup [-p ]", desc: "Clean up merged/closed sessions" }, - { cmd: "ao send [message]", desc: "Send message to a session" }, - { cmd: "ao status [-p ]", desc: "Show sessions with PR/CI status" }, - { cmd: "ao review-check [project]", desc: "Check PRs and trigger agents" }, - { cmd: "ao dashboard [-p ]", desc: "Start the web dashboard" }, - { cmd: "ao open [target]", desc: "Open session(s) in terminal" }, - { cmd: "ao init [project]", desc: "Initialize config file" }, -]; - function getZoneCounts(sessions: DashboardSession[]) { const counts = { merge: 0, respond: 0, review: 0, pending: 0, working: 0, done: 0 }; for (const s of sessions) { @@ -43,6 +26,16 @@ function getZoneCounts(sessions: DashboardSession[]) { export default function OrchestratorScreen({ navigation }: Props) { const { sessions, stats, orchestratorId, loading, error, refresh } = useSessions(); + React.useLayoutEffect(() => { + navigation.setOptions({ + headerRight: () => ( + navigation.navigate("Commands")}> + Commands + + ), + }); + }, [navigation]); + const zones = getZoneCounts(sessions); const activeSessions = sessions.filter((s) => !isTerminal(s)); @@ -115,17 +108,6 @@ export default function OrchestratorScreen({ navigation }: Props) { - {/* CLI Reference */} - - CLI Commands - Quick reference for managing sessions from terminal. - {CLI_COMMANDS.map((c, i) => ( - - {c.cmd} - {c.desc} - - ))} - ); } @@ -178,12 +160,6 @@ const styles = StyleSheet.create({ textTransform: "uppercase", marginBottom: 12, }, - hint: { - color: "#8b949e", - fontSize: 13, - lineHeight: 18, - marginBottom: 12, - }, // Orchestrator card orchestratorCard: { backgroundColor: "#0d1117", @@ -260,25 +236,6 @@ const styles = StyleSheet.create({ fontSize: 13, fontWeight: "600", }, - // CLI commands - cmdRow: { - backgroundColor: "#0d1117", - borderRadius: 6, - padding: 10, - marginBottom: 6, - borderWidth: 1, - borderColor: "#30363d", - }, - cmdText: { - color: "#58a6ff", - fontSize: 12, - fontFamily: "monospace", - marginBottom: 4, - }, - cmdDesc: { - color: "#8b949e", - fontSize: 12, - }, // Error errorText: { color: "#f85149",