cli/skill/SKILL.md
Explain and use the Inline CLI (`inline`) for authentication, chats, users, spaces, messages, search, bots, typing, notifications, tasks, schema, attachments, downloads, JSON output, and configuration. Use when asked how to use the Inline CLI or its commands, flags, outputs, or workflows.
npx skillsauth add inline-chat/inline inline-cliInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
--json: Output raw JSON payloads (proto/RPC results) to stdout (available on all commands).
--json is set and a command fails, the CLI prints a structured error JSON to stderr: {"error":{"code","message","hint","examples"}} and exits non-zero.--json mode. Specifically: inline users list --filter/--ids/--id, inline bots list --filter/--ids/--id, and inline chats list --ids/--id.inline chats list --json still supports --filter, --limit, and --offset for pre-filtered/paginated payloads.--json mode; pass --yes explicitly.--pretty: Pretty-print JSON output (default).--compact: Compact JSON output (no whitespace).inline auth login [--email [email protected] | --phone +15551234567]
inline auth me
inline auth logout
inline me and inline whoami
inline auth me.inline search ...
inline messages search ....inline chat ..., inline thread ..., inline threads ...
inline chats ....inline bot ...
inline bots ....inline chats list
inline chats list --json --filter "launch"
GetChatsResult JSON payload, but pre-filtered by chat name/space/id for agent pipelines.inline chats get [--chat-id 123 | --user-id 42]
inline chats participants --chat-id 123
inline chats add-participant --chat-id 123 --user-id 42
inline chats remove-participant --chat-id 123 --user-id 42
inline chats create --title "Project" [--space-id 31] [--description "Spec"] [--emoji ":rocket:"] [--public] [--participant 42]
--public is set, participants must be empty.inline chats create-dm --user-id 42
inline chats update-visibility --chat-id 123 [--public | --private --participant 42 --participant 99]
--public cannot include participants.--private requires one or more --participant values.inline chats rename --chat-id 123 --title "New title" [--emoji "🚀"]
inline chats mark-unread [--chat-id 123 | --user-id 42]
inline chats mark-read [--chat-id 123 | --user-id 42] [--max-id 456]
--max-id is omitted, marks through the latest message.inline chats delete --chat-id 123
--yes is provided (--json requires --yes).inline bot ... maps to inline bots ....inline bots list [--filter "name"] [--ids | --id]
inline bots create --name "Build Bot" --username build_bot [--add-to-space 31]
inline bots reveal-token explicitly. JSON includes the token.inline bots reveal-token --bot-user-id 42
inline typing start [--chat-id 123 | --user-id 42]
inline typing stop [--chat-id 123 | --user-id 42]
inline users list [--filter "name"] [--ids | --id]
--filter matches name, username, email, or phone.--ids prints one user id per line.--id requires exactly one match and prints that id.inline users get --id 42
inline spaces list
inline spaces members --space-id 31
inline spaces invite --space-id 31 [--user-id 42 | --email [email protected] | --phone +15551234567] [--admin] [--public-chats]
inline spaces delete-member --space-id 31 --user-id 42
--yes to skip; --json requires --yes).inline spaces update-member-access --space-id 31 --user-id 42 [--admin | --member] [--public-chats]
--admin or --member (and optional --public-chats).inline notifications get
inline notifications set [--mode all|none|mentions|only-mentions|important] [--silent | --sound]
inline update
inline doctor
inline tasks create-linear --chat-id 123 --message-id 456 [--space-id 31]
inline tasks create-notion --chat-id 123 --message-id 456 --space-id 31
inline schema proto
inline messages list [--chat-id 123 | --user-id 42] [--limit 50] [--offset-id 456] [--translate en] [--since "yesterday"] [--until "today"]
--translate <lang> fetches translations and includes them in output.inline messages export [--chat-id 123 | --user-id 42] [--limit 50] [--offset-id 456] [--since "1w ago"] [--until "today"] --output PATH
inline messages search [--chat-id 123 | --user-id 42] --query "onboarding" [--query "alpha beta"] [--limit 50] [--since "today"] [--until "tomorrow"]
--query is repeatable; each query can contain space-separated terms (ANDed within a query, ORed across queries). Extra whitespace is collapsed.--since and --until accept relative time expressions like yesterday, 2h ago, monday, 2024-01-15, or RFC3339.inline messages get --chat-id 123 --message-id 456 [--translate en]
inline messages send [--chat-id 123 | --user-id 42] [--text "hi" | --message "hi" | --msg "hi" | -m "hi"] [--stdin] [--reply-to 456] [--mention USER_ID:OFFSET:LENGTH ...] [--attach PATH ...] [--force-file]
--mention with UTF-16 offsets.--stdin reads message text from stdin.--attach is repeatable. Each attachment is sent as its own message; --text is reused as the caption.--force-file uploads photos/videos as files (documents).--mention is repeatable and must match the message text (user_id:offset:length with UTF-16 units).inline messages forward --from-chat-id 123 --message-id 456 --to-chat-id 789 [--no-header]
--message-id to forward multiple messages.inline messages edit [--chat-id 123 | --user-id 42] --message-id 456 [--text "updated" | --message "updated" | --msg "updated" | -m "updated" | --stdin]
inline messages delete [--chat-id 123 | --user-id 42] --message-id 456 [--message-id 789]
--yes to skip; --json requires --yes).inline messages add-reaction [--chat-id 123 | --user-id 42] --message-id 456 --emoji "👍"
:shortcode:).inline messages delete-reaction [--chat-id 123 | --user-id 42] --message-id 456 --emoji "👍"
:shortcode:).inline messages download [--chat-id 123 | --user-id 42] --message-id 456 [--output PATH | --dir PATH]
inline auth login (prompts for email/phone + code, then prints welcome name)inline auth meinline meinline doctorinline chats listinline thread listinline chats update-visibility --chat-id 123 --publicinline chats update-visibility --chat-id 123 --private --participant 42 --participant 99inline messages search --chat-id 123 --query "design review"inline messages search --chat-id 123 --query "design review" --jsoninline search --chat-id 123 --query "design review"inline messages list --chat-id 123 --translate eninline messages list --chat-id 123 --since "yesterday"inline messages list --chat-id 123 --since "2h ago" --until "1h ago"inline messages export --chat-id 123 --output ./messages.jsoninline messages export --chat-id 123 --since "1w ago" --output ./recent.jsoninline messages send --chat-id 123 --text "FYI" --attach ./photo.jpg --attach ./spec.pdfinline messages send --chat-id 123 --reply-to 456 --text "on it"inline messages forward --from-chat-id 123 --message-id 456 --to-chat-id 789inline messages send --chat-id 123 --text "@Sam hello" --mention 42:0:4inline messages download --chat-id 123 --message-id 456 --dir ./downloadsinline chats rename --chat-id 123 --title "New title"inline bots listinline bots create --name "Build Bot" --username build_botinline bots reveal-token --bot-user-id 42 (token is not printed by default)inline tasks create-linear --chat-id 123 --message-id 456inline tasks create-notion --chat-id 123 --message-id 456 --space-id 31inline typing start --chat-id 123inline typing stop --chat-id 123inline messages edit --chat-id 123 --message-id 456 --text "updated"inline messages delete --chat-id 123 --message-id 456inline spaces invite --space-id 31 --email [email protected]inline spaces update-member-access --space-id 31 --user-id 42 --admininline users list --json | jq -r '.users[] | "\(.id)\t\(.first_name) \(.last_name)\t@\(.username // "")\t\(.email // "")"'inline users list --json | jq -r '.users[] | select((.first_name + " " + (.last_name // "") + " " + (.username // "") + " " + (.email // "")) | ascii_downcase | contains("mo")) | "\(.id)\t\(.first_name) \(.last_name)"'inline chats list --json | jq -r '.chats[] | "\(.id)\t\(.title // "")\tspace:\(if .space_id == null then "dm" else (.space_id | tostring) end)"'inline chats list --json | jq -r '.dialogs[] | select(.unread_count > 0) | "\(.chat_id)\tunread:\(.unread_count)"'inline messages list --chat-id 123 --json | jq -r '.messages[] | "\(.id)\t\(.from_id)\t\((.message // "") | gsub("\n"; " ") | .[0:80])"'inline schema proto --json --compact | jq -r '.files[].name'inline users list | grep -i "partial_name"
Faster than parsing JSON when you just need user ID.
# Find the DM user id by name/email/username
USER_ID="$(inline users list --filter "sam" --id)"
# Read the last 5 messages
inline messages list --user-id "$USER_ID" --limit 5 --json --compact
# Download media from the last 50 messages
inline messages list --user-id "$USER_ID" --limit 50 --json --compact \
| jq -r '.messages[] | select(.media != null) | .id' \
| while read -r MESSAGE_ID; do
inline messages download --user-id "$USER_ID" --message-id "$MESSAGE_ID" --dir ./downloads
done
# Get last N outgoing messages (your messages)
inline messages list --user-id ID --json | jq '[.messages[] | select(.out == true)] | .[0:3]'
# Get last N incoming messages (their messages)
inline messages list --user-id ID --json | jq '[.messages[] | select(.out == false)] | .[0:3]'
inline messages search --user-id ID --query "bug" --query "issue" --query "loom" --query "broken" --limit 30 --json
Each --query is ORed together - useful for finding feedback items.
# Page back with offset-id
inline messages list --chat-id ID --limit 50 --offset-id 1234
# Get the latest message id
inline messages list --chat-id ID --limit 1 --json | jq '.messages[0].id'
# Export a batch for offline review
inline messages export --chat-id ID --limit 500 --output ./chat.json
# Compact JSON for pipelines
inline messages list --chat-id ID --json --compact | jq '.messages | length'
Chat list (GetChatsResult, truncated to essential fields):
{
"dialogs": [
{
"peer": { "type": { "Chat": { "chat_id": 340 } } },
"space_id": 31,
"archived": false,
"pinned": false,
"read_max_id": 1,
"unread_count": 0,
"chat_id": 340,
"unread_mark": false
}
],
"chats": [
{
"id": 340,
"title": "Main",
"space_id": 31,
"description": "Main chat for everyone in the space",
"emoji": null,
"is_public": true,
"last_msg_id": 1,
"peer_id": { "type": { "Chat": { "chat_id": 340 } } },
"date": 1754585453
}
],
"spaces": [
{ "id": 31, "name": "Design", "creator": false, "date": 1750000000 }
],
"users": [
{
"id": 1000,
"first_name": "Ava",
"last_name": "Chen",
"username": "ava",
"email": "[email protected]",
"min": false,
"bot": false
}
],
"messages": [
{
"id": 1,
"from_id": 1000,
"peer_id": { "type": { "Chat": { "chat_id": 340 } } },
"chat_id": 340,
"message": null,
"out": true,
"date": 1754585453,
"media": {
"media": {
"Document": {
"document": {
"id": 32,
"file_name": "recording.mp4",
"mime_type": "video/mp4",
"size": 6932635,
"cdn_url": "https://..."
}
}
}
}
}
]
}
Message list (GetChatHistoryResult, truncated to essential fields):
{
"messages": [
{
"id": 456,
"from_id": 42,
"peer_id": { "type": { "Chat": { "chat_id": 123 } } },
"chat_id": 123,
"message": "Ship it",
"out": true,
"date": 1733184000,
"attachments": {
"attachments": [
{
"id": 9001,
"attachment": {
"UrlPreview": {
"id": 88,
"url": "https://...",
"site_name": "Docs",
"title": "Spec",
"description": "API rollout spec"
}
}
}
]
}
}
]
}
development
Reads commits and changed files within a timeframe specified by user and compiles a changelog for both iOS and macOS.
testing
Safely sync local commits with remote by rebasing onto origin/main and then push, following a GitHub Desktop-style flow. Use when asked to push/sync a branch, reconcile local and remote state, resolve rebase conflicts, run targeted tests or typechecks, and push only if checks pass.
development
Write, review, or improve SwiftUI code following best practices for state management, view composition, performance, macOS-specific APIs, and iOS 26+ Liquid Glass adoption. Use when building new SwiftUI features, refactoring existing views, reviewing code quality, or adopting modern SwiftUI patterns.
development
Based on the context, write a summary of changes, what's left, production readiness, tests run, and APIs/packages used.