---
name: rezi-routing
description: Add routing with guards and nested outlets to a Rezi app. Use when building multi-page/screen TUI applications.
user-invocable: true
allowed-tools: Read, Glob, Grep, Edit, Write
argument-hint: "[route-name]"
metadata:
  short-description: Add routing
---

## When to use

Use this skill when:

- App needs multiple pages or screens
- Need route guards (auth, permissions)
- Need nested routes with outlets

## Source of truth

- `packages/core/src/router/` — router implementation, guards, outlets
- `packages/core/src/widgets/ui.ts` — `ui.routerBreadcrumb()`, `ui.routerTabs()`

## Steps

1. **Define routes** with optional guards and nested children:
   ```typescript
   const routes = [
     {
       id: "home",
       screen: (_params, context) => HomeScreen(context.state),
     },
     {
       id: "settings",
       screen: (_params, context) => SettingsScreen(context.state),
       guard: (_params, state) => {
         if (!state.meta.isAuthenticated) return { redirect: "home" };
         return true;
       },
     },
     {
       id: "operations",
       screen: (_params, context) => ui.column([
         Header(context.state),
         context.outlet,
       ]),
       children: [
         { id: "operations.overview", screen: (_params, context) => OverviewPanel(context.state) },
         { id: "operations.logs", screen: (_params, context) => LogsPanel(context.state) },
       ],
     },
   ] as const;
   ```

2. **Pass to app**:
   ```typescript
   const app = createApp({ routes, initialRoute: "home" });
   ```

3. **Navigate programmatically**:
   ```typescript
   app.router.navigate("settings");
   app.router.navigate("operations.overview");
   ```

4. **Nested routes** render via `context.outlet` in the parent view

5. **Add navigation widgets** (optional):
   ```typescript
   if (app.router) {
     ui.routerBreadcrumb(app.router, routes)
     ui.routerTabs(app.router, routes)
   }
   ```

## Verification

- Correct screens render for each route
- Guards block unauthorized access and redirect
- Nested outlet renders child routes
- Back navigation works
