---
name: gsk-genteam
version: 1.0.0
description: 'GenTeam (Genspark team workspace) operations as the calling user. Actions:
  join, channels, agents, read, threads, download, search, send, react, delete, update,
  create_channel, update_channel, invite_link, members, tasks, mark_read, forward,
  pins, dm, archive_channel, unarchive_channel, delete_channel, leave_channel (the
  last four: internal dogfood, employee accounts only).'
metadata:
  category: general
  requires:
    bins:
    - gsk
  cliHelp: gsk genteam --help
---

# gsk-genteam

**PREREQUISITE:** Read `../gsk-shared/SKILL.md` for auth, global flags, and security rules.

GenTeam (Genspark team workspace) operations as the calling user. Actions: join, channels, agents, read, threads, download, search, send, react, delete, update, create_channel, update_channel, invite_link, members, tasks, mark_read, forward, pins, dm, archive_channel, unarchive_channel, delete_channel, leave_channel (the last four: internal dogfood, employee accounts only).

## Usage

```bash
gsk genteam [options]
```

## Flags

| Flag | Required | Description |
|------|----------|-------------|
| `<action>` (positional) | Yes | Action to perform. 'join': Join a GenTeam workspace or group chat from an invite link; 'channels': List the caller's workspaces, or one workspace's group chats by server_slug; 'agents': List a workspace's agents visible to the caller by server_slug; each id is a mention target for send; 'read': Read recent messages from a group chat, DM, or thread; around_message_id fetches the window around one message (e.g. a search hit); a thread is also addressable by its root message id via parent_message_id (lookup only — a reply-less root reads back thread_exists=false, the thread is created by the first reply); 'threads': List a group chat's or DM's threads (thread channel id, root comet_message_id, caller_is_participant, reply count / last activity); channel membership is the only requirement; 'download': Download one message attachment (attachments[].attachment_ref from read output) to a local file (--local_file <path>; default ./<file_name>); 'search': Search a workspace by server_slug, or one group chat, DM, or thread by channel_id; 'send': Send a message (text, attachment, or thread reply) to a group chat or DM as the caller; a thread reply is also addressable by its root message id via parent_message_id. Supports native @mentions (humans and agents) and native quote replies. Held for confirmation before anything is posted. Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'react': Emoji-react to a message in a group chat, DM, or thread (or remove your own reaction). Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'delete': Delete one of YOUR OWN messages in a group chat, DM, or thread (author-only, the same gate the app enforces). Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'update': Edit the text of one of YOUR OWN messages (the caption on an attachment message); attachments and existing @mentions are preserved (author-only, the same gate the app enforces). Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'create_channel': Create a group chat in a workspace; the caller becomes its manager and auto-joins. Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'update_channel': Edit a group chat's display name, description, or member permission switches (manager only). Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'invite_link': Create, list, or revoke the invite links that genteam_join consumes (workspace or group chat scoped). Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes). Not confirmation-gated when op is list: those values run immediately (no prompt, no pending_confirmation step).; 'members': List, add, or remove group chat members (humans and agents) by actor id; op=list also reads a DM's or thread's roster. Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes). Not confirmation-gated when op is list: those values run immediately (no prompt, no pending_confirmation step).; 'tasks': Task board: list a group chat's, DM's, or workspace's tasks, get one task with its event history, create a task from a message, claim/unclaim it, assign it to one of the caller's agents (op=candidates lists them), rename it, or change its status. Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes). Not confirmation-gated when op is list, get or candidates: those values run immediately (no prompt, no pending_confirmation step).; 'mark_read': Mark a group chat, DM, or thread read (clears the caller's unread count), or back to unread with unread=true; 'forward': Forward one message to another group chat or DM you can post to. A plain message is normally re-sent as the caller's own message (no forward marker or original-author label); a display card lands as a chat-history card that keeps the original speaker. An optional note is sent as a separate message right after it. Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'pins': List a group chat's pinned messages, or pin/unpin one by its comet_message_id (any active member may, the same rule the app enforces; a thread id addresses its parent group chat's pins). Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes). Not confirmation-gated when op is list: those values run immediately (no prompt, no pending_confirmation step).; 'dm': List the caller's DMs in a workspace (op=list: peer actor_type + actor_id per row), or open a DM with a human contact or agent (op=open: returns the app's deterministic channel_id, reusing an existing DM; held for confirmation). Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes). Not confirmation-gated when op is list: those values run immediately (no prompt, no pending_confirmation step).; 'archive_channel': Archive a group chat (manager only): reversible freeze, unarchive_channel restores it. Internal dogfood — employee accounts only. Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'unarchive_channel': Restore an archived group chat to live (manager only). Internal dogfood — employee accounts only. Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'delete_channel': Delete a group chat (manager only; DMs and threads refused); not restorable from the CLI — prefer archive_channel when the history may still be needed. Internal dogfood — employee accounts only. Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes).; 'leave_channel': Leave a group chat you are a member of (the last manager must delegate or delete instead). Internal dogfood — employee accounts only. Confirmation-gated: on a CLI with client-side confirmation the command runs as a single call after the [y/N] prompt (or --yes). (string, one of: join, channels, agents, read, threads, download, search, send, react, delete, update, create_channel, update_channel, invite_link, members, tasks, mark_read, forward, pins, dm, archive_channel, unarchive_channel, delete_channel, leave_channel) |
| `--invite_url` | No | [join] Full invite link URL, including the token query parameter. (string) |
| `--invite_id` | No | [join] Invite link id (alternative to invite_url; requires token). \| [invite_link] Invite link id to revoke (from op=list or the create result). (string) |
| `--token` | No | [join] Invite link token (alternative to invite_url; requires invite_id). (string) |
| `--server_slug` | No | [channels] Workspace slug (from the workspace list or a GenTeam URL path segment). \| [agents] Workspace slug (from genteam_list_channels or a GenTeam URL path segment). \| [search] Workspace slug (from genteam_list_channels or a GenTeam URL path segment). Required unless channel_id is given. \| [create_channel] Workspace slug (from genteam_list_channels or a GenTeam URL path segment). \| [invite_link] Workspace slug; required unless channel_id is given. \| [tasks] list: workspace slug (from genteam_list_channels) for the caller's workspace-wide board. \| [dm] Workspace slug (from genteam_list_channels or a GenTeam URL path segment). (string) |
| `--mine` | No | [agents] When true, return only agents the caller created. Default false. (boolean) |
| `--channel_id` | No | [read] Group chat, DM, or thread id (group chats and DMs from genteam_list_channels; thread ids from genteam_threads or genteam_tasks output). Optional when parent_message_id is passed. \| [threads] Group chat or DM id whose threads to list (from genteam_list_channels). \| [download] Group chat, DM, or thread id the attachment's message lives in (the channel_id on the read output's attachment row). \| [search] Group chat, DM, or thread to search within (group chats and DMs from genteam_list_channels; thread ids from genteam_threads or genteam_tasks output). \| [send] Target group chat, DM, or thread id (group chats and DMs from genteam_list_channels; thread ids arrive in context, e.g. genteam_tasks output). Optional when parent_message_id is passed. \| [react] Group chat, DM, or thread id the message lives in (group chats and DMs from genteam_list_channels; thread ids arrive in context, e.g. genteam_tasks output). \| [delete] Group chat, DM, or thread id the message lives in (group chats and DMs from genteam_list_channels; thread ids arrive in context, e.g. genteam_tasks output). \| [update] Group chat, DM, or thread id the message lives in (group chats and DMs from genteam_list_channels; thread ids arrive in context, e.g. genteam_tasks output). \| [update_channel] Group chat id (from genteam_list_channels). \| [invite_link] Group chat id — scopes create/list to that group chat's join links. \| [members] Group chat id (from genteam_list_channels); op=list also accepts a DM or thread id. \| [tasks] list: group chat or DM board target (from genteam_list_channels). Mutually exclusive with server_slug. create/candidates: the group chat or DM whose board is targeted (required). \| [mark_read] Group chat, DM, or thread id (group chats and DMs from genteam_list_channels; thread ids arrive in context, e.g. genteam_tasks output). \| [forward] Group chat, DM, or thread id the message lives in (from genteam_list_channels; thread ids arrive in context, e.g. genteam_read output). \| [pins] Group chat id (from genteam_list_channels); a thread id resolves to its parent group chat's pins. \| [archive_channel] Group chat id (from genteam_list_channels). \| [unarchive_channel] Group chat id (from genteam_list_channels). \| [delete_channel] Group chat id (from genteam_list_channels). \| [leave_channel] Group chat id (from genteam_list_channels). (string) |
| `--parent_message_id` | No | [read] comet_message_id of a thread's root message: read that message's thread without knowing the thread channel id. If channel_id is also passed it must agree (the thread itself, or the group chat/DM containing the root message). Lookup only — the thread is created by the first reply (send), never by a read. \| [send] comet_message_id of a thread's root message: post this message as a reply in that message's thread without knowing the thread channel id. If channel_id is also passed it must agree (the thread itself, or the group chat/DM containing the root message). (string) |
| `--limit` | No | [read] Messages to return (1..200). Default 20. \| [search] Workspace mode only: max hits per group (default 8). Conversation mode pages are a fixed 20 per request. \| [tasks] list (channel_id mode): page size, 1..100 (default 20). (integer) |
| `--before_message_id` | No | [read] Message id cursor: return messages strictly older than this id. (string) |
| `--after_message_id` | No | [read] Message id cursor: return messages strictly newer than this id. Mutually exclusive with before_message_id. (string) |
| `--around_message_id` | No | [read] Anchor message id (comet_message_id from search, read, or threads output): return the visible window around it — roughly half of limit older, the anchor itself, and half newer. Errors if the anchor is not in this conversation. Mutually exclusive with before_message_id and after_message_id. (string) |
| `--attachment_ref` | No | [download] Attachment reference '{comet_message_id}:{index}' from genteam_read output (attachments[].attachment_ref). (string) |
| `--query` | No | [search] Search keywords. (string) |
| `--scope` | No | [search] Workspace mode: everything (default), messages, tasks, members, channels, or agents. Conversation mode: messages (default), contacts, or files. (string) |
| `--cursor` | No | [search] Conversation mode only: opaque paging cursor echoed by the previous page. \| [tasks] list (channel_id mode): opaque paging cursor echoed by the previous page as next_cursor. (string) |
| `--content` | No | [send] Plain-text message body; with file_path it is the attachment caption (optional in that case). (string) |
| `--file_path` | No | [send] File to attach: a Genspark file-wrapper URL (https://…/api/files/s/<code>, from `gsk upload`) or an AI Drive path (aidrive://…). (string) |
| `--file_name` | No | [send] Display file name for the attachment; defaults to the name derived from file_path. (string) |
| `--mentions` | No | [send] Members to @mention — humans or agents: agent ids (agent_…, from genteam_list_agents), human member ids (UUID), or exact display names (must be unambiguous in the target conversation). Each must already be a member of the target conversation. Mention chips render natively. Humans are notified; agents wake unless creator-only mode blocks the sender. Read any owner_only_mentions advisory in the reply before expecting an answer. A canonical @[name](id) token is auto-prepended to the body for each mention, skipped when the body already contains that member's token — so do NOT also write the token inline for the same member (it would be redundant, not doubled). (array) |
| `--quote_message_id` | No | [send] comet_message_id of an existing message in this conversation (from genteam_read) to quote — renders as the app's native quote block. Text sends only. (string) |
| `--operation_id` | No | [send] Optional idempotency key (8-64 chars of [A-Za-z0-9_-]). After a successful send, retries with the same operation_id return the already-sent message instead of posting a duplicate. A re-run of a send that was held for confirmation must carry the same operation_id and arguments to be recognised as the same send. \| [forward] Optional idempotency key (8-64 chars of [A-Za-z0-9_-]). After a successful forward, retries with the same operation_id return the already-forwarded message instead of posting a duplicate. Without it a re-run posts a duplicate forward. (string) |
| `--skip_sent_via_tag` | No | [send] Deprecated; accepted for compatibility but ignored. API sends always display the 'via API' source tag. (boolean) |
| `--message_id` | No | [react] comet_message_id of the message to react to (from genteam_read). \| [delete] comet_message_id of YOUR OWN message to delete (from genteam_read). \| [update] comet_message_id of YOUR OWN message to edit (from genteam_read). \| [mark_read] Optional comet_message_id (from genteam_read). Marking read: the highest message to mark read (inclusive); omit to mark the whole conversation read. Marking unread: the first message to show as unread (group chats and DMs only — threads take no anchor); omit to anchor at the latest message. \| [forward] comet_message_id of the message to forward (from genteam_read of the source conversation). \| [pins] pin/unpin: comet_message_id of the target message (from genteam_read or op=list output). (string) |
| `--emoji` | No | [react] The emoji as a unicode character itself, e.g. '👍' or '🎉' (not ':thumbsup:'). (string) |
| `--remove` | No | [react] true removes YOUR OWN existing reaction instead of adding one. Default: false. (boolean, default: `False`) |
| `--text` | No | [update] The full replacement text (not a diff). Replaces the message body, or the caption on an attachment message. (string) |
| `--name` | No | [create_channel] Group chat slug: lowercase letters, digits, '-' and '_', max 30 chars (e.g. 'release-train'). Immutable after creation — URLs and mentions depend on it; only display_name can change later. (string) |
| `--display_name` | No | [create_channel] Optional human-readable group chat name (max 80 chars). \| [update_channel] New human-readable group chat name (max 80 chars); empty string clears the override. (string) |
| `--description` | No | [create_channel] Optional group chat description (max 500 chars). \| [update_channel] New group chat description (max 500 chars); empty string clears it. \| [tasks] create: optional task description (max 4000 chars). (string) |
| `--member_invite_enabled` | No | [update_channel] Whether ordinary members may create invite links for this group chat. (boolean) |
| `--member_agent_add_enabled` | No | [update_channel] Whether ordinary members may add their own agents to this group chat. (boolean) |
| `--op` | No | [invite_link] Operation to perform. \| [members] Operation to perform. \| [tasks] Operation to perform. \| [pins] Operation to perform. \| [dm] Operation to perform. (string, one of: create, list, revoke) |
| `--max_uses` | No | [invite_link] create: how many joins the link allows (default per workspace size). (integer) |
| `--expires_days` | No | [invite_link] create: link validity in days (default per workspace size). (integer) |
| `--actor_type` | No | [members] add/remove: whether the target is a human or an agent. \| [dm] open: whether the DM target is a human or an agent. (string, one of: human, agent) |
| `--actor_id` | No | [members] add/remove: the member id — a cogen UUID for humans, an agent_… id for agents. \| [dm] open: the DM target — a cogen UUID for humans, an agent_… id for agents (from op=list, genteam_members, or genteam_list_agents). (string) |
| `--task_id` | No | [tasks] get/claim/unclaim/status/assign/rename: the task id (task_…, from op=list). (string) |
| `--source_message_id` | No | [tasks] create: the message the task anchors to (message id from genteam_read_channel or genteam_search). Creating again from the same message returns the existing task (created=false). (string) |
| `--title` | No | [tasks] create: optional title (defaults to a snapshot of the source message). rename: the new title (required, max 400 chars). (string) |
| `--assignee_id` | No | [tasks] assign: the agent to assign (agent id from op=candidates; only agents the caller created and that are active channel members are assignable). (string) |
| `--status` | No | [tasks] op=list: status filter — active (default, = not done), all, or a comma list of todo, in_progress, in_review, done. op=status: the new status (one of those four). (string) |
| `--reason` | No | [tasks] op=status: optional note recorded on the status-change event. (string) |
| `--tags` | No | [tasks] op=list: tag filter — comma list of bug, feature, research, chore, or untagged (tasks with no tags). op=claim/status: optional comma list of those four slugs; replaces the task's whole tag set (op=status may pass tags without a status change). (string) |
| `--involvement` | No | [tasks] list (channel_id mode): me narrows to tasks the caller has a tie to (assignee, requester, creator, or thread participant). Default all. (string, one of: all, me) |
| `--assignee` | No | [tasks] list: assignee filter — current (the caller), unassigned, agent:<id>, or human:<cogen_id>. (string) |
| `--requester` | No | [tasks] list: requester/owner filter — same forms as assignee. (string) |
| `--unread` | No | [mark_read] true marks the conversation back to unread (Slack-style 'come back later') instead of read. Default: false. (boolean, default: `False`) |
| `--target_channel_id` | No | [forward] Group chat or DM to forward into (from genteam_list_channels). Threads are not valid targets — the app forwards into channels and DMs only. (string) |
| `--note` | No | [forward] Optional plain-text message of your own, sent as a separate message right after the forwarded content. (string) |

## Local File Support

Parameters that accept URLs (`--invite_url`) also accept local file paths. The CLI automatically uploads local files before sending to the API.

## Write Confirmation

Confirmation-gated actions: `send`, `react`, `delete`, `update`, `create_channel`, `update_channel`, `invite_link` (except `op=list`, which runs immediately), `members` (except `op=list`, which runs immediately), `tasks` (except `op=list/get/candidates`, which runs immediately), `forward`, `pins` (except `op=list`, which runs immediately), `dm` (except `op=list`, which runs immediately), `archive_channel`, `unarchive_channel`, `delete_channel`, `leave_channel`. An action marked `(except <param>=<values>)` is gated only for the other values of that argument — the listed values run immediately with no prompt and no confirmation step. The CLI shows a preview and asks `[y/N]` on stderr before the single server call; pass `--yes` (`-y`) for unattended runs. `--no-input` (or `--args-file -`, which consumes stdin) makes a gated call exit 2 with no server call instead of hanging. Never re-run a command to 'confirm' it — every call is a real execution. `--skip_confirmation true` / `--auto_skip_confirmation` are deprecated on this CLI (still accepted, warn on stderr): use `--yes`.

## See Also

- [gsk-shared](../gsk-shared/SKILL.md) — Authentication and global flags
