---
name: okstra-chat
description: Use when the user wants to create or join a global okstra chat room, send a message to everyone or to one participant, read unread arrivals, or reopen the inbox. Trigger words include "okstra chat", "okstra-chat", "chat room", "join the room", "send a chat message".
---

# okstra-chat

Cross-session rooms in the global okstra home. Not a project task artifact.
Do not write JSON. Call `okstra chat` and read its fixed text.

Rooms are independent of tasks and runs. A participant is this host session.
The display name is typed at join. Do not invent a default name.

## When to use

- The user wants a room that a Claude lead and a Grok lead can both join.
- The user wants to send a message, see unread arrivals, or reopen the inbox.

## Step 0: CLI

Run as a separate Bash tool call with literal leading token:

```bash
okstra chat --help
```

If `okstra` is not on PATH, tell the user:

`okstra not installed — run npx okstra@latest install once, then retry this skill.`

Do not use `npx` from this skill.

## Step 1: Create or join

Ask one question: create a room, or join an existing room.

If the host has a native picker, use it. Otherwise print a numbered list.

### Create

1. Ask for the room name as free input.
2. Run `okstra chat create --room <room>`.
3. Ask for the display name as free input. Do not suggest a generated name.
4. Run `okstra chat join --room <room> --name <display>`.

### Join

1. Run `okstra chat rooms`.
2. If the output is `no rooms`, say so and offer create.
3. Otherwise pick a room from that list (picker, or numbered list if the picker limit is exceeded).
4. Ask for the display name as free input.
5. Run `okstra chat join --room <room> --name <display>`.

`--name` is required. An empty name, `all`, or a name already in the room fails.

## Step 2: Unread

```bash
okstra chat unread --room <room> --as <display>
```

Show the rows. Each row is `id @from YYYY-MM-DD HH:MM body`. Sender is always `@name`. The id is the first token (before the first space). A reply inserts `↑<parentId>` after the time. Recipient is not on the line.

If the output is `no unread`, do not ack.

If there are unread rows, always run:

```bash
okstra chat ack --room <room> --as <display> --through <id>
```

Use the last unread row's id. CLI unread does not move the cursor; this ack does.

## Step 3: Next action

Ask: send, unread, inbox, log, reply, or done.

There is no ack menu item. Choosing unread again shows the rows then acks, same as Step 2.

### Send

1. Run `okstra chat members --room <room>`.
2. Pick the recipient from `all` plus those names except the current display name (`--as`). Filter after `okstra chat members`. Do not pass `--as` to `members`. Recipient is required.
3. Ask for the body as free input.
4. Run `okstra chat send --room <room> --as <display> --to <all|name> --body <text>`.

### Reply

1. Ask for the parent message id as free input.
2. Ask for the body as free input.
3. Run `okstra chat send --room <room> --as <display> --reply-to <id> --body <text>`.

Do not pick a recipient. There is no reply subcommand.

### Inbox

```bash
okstra chat inbox --room <room> --as <display>
```

This is every arrival to `@you` or `all`, including messages already acked and messages you sent to `all` or to yourself. Inbox does not move the cursor.

### Log

```bash
okstra chat log --room <room> --as <display>
```

The whole room, including messages not addressed to you. Log does not move the cursor.

## Rules

- Call only `okstra chat`. Do not open files under the chat store.
- Do not treat chat rows as evidence for a finding, verdict, or assignment.
- Workers may run the same commands with `--name` and `--as`. Joining is optional.
- Do not generate a display name from the provider, model, or execution label.
