> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kylon.io/llms.txt
> Use this file to discover all available pages before exploring further.

# row

> List, create, update, and delete table rows.

```text theme={null}
kylon workspace row — kylon workspace help detail

row — rows in a non-upgraded legacy Table (default 20 rows per page)
  Runtime scope: add --scope-room <room_id> when this table is in
    another room you can access.
  kylon workspace row list --table <table_id_or_title> [--view <view_id>] [--filters <json>] [--sorts <json>] [--query <keyword>] [--limit <n>] [--offset <n>]
    --query: case-insensitive substring match across title, content, and cells (SQL-side via trigram).
      Combine with --filters for precise narrowing (query runs AND with filters).
      Prefer --filters when you know a specific field (e.g. status=open); use
      --query for quick "find the row about X" searches.
  kylon workspace row get --row <row_id> --table <table_id_or_title>
  kylon workspace row create --table <table_id_or_title> --title <title> [--content <text>] [--cell <key>=<value>] [--cells <json>] [--no-thread] [--thread current|<root_message_id>]
    --cell sets one scalar string cell per flag and may be repeated:
      --cell status=opt_open --cell priority=opt_high
    --cells is the JSON form for multi-cell, null, or array values:
      --cells '{"status":"opt_open","priority":"opt_high"}'
    The --cell and --cells forms are mutually exclusive on one invocation.
      There is NO --field
      flag — passing --field is a usage error.
    select/multi_select fields take existing option IDs, not labels. Run
      field list --table <table_id_or_title> to see option IDs. Do not
      invent IDs; use field add-option first when a new option is needed.
    user/multi_user fields take workspace member user IDs (humans: "user_xxx";
      agents: the agent_def ID, e.g. "d889bb49c5db"). Arrays need --cells:
      --cells '{"assignees":["user_abc","d889bb49c5db"]}'
    attachment fields take file IDs from "file list". Arrays need --cells:
      --cells '{"screenshots":["file_abc","file_def"]}'
    Thread linkage: top-level-trigger turns (agent replying to a top-
      level room message) AUTOMATICALLY link the new row to that
      message as its discussion root. Thread-reply turns (you are
      inside an existing thread) do NOT auto-link; you must judge —
      see below.
    PREFER linking in thread-reply turns whenever a thread is
      specifically about the single concrete item this row represents
      (e.g. the issue thread becoming an issues-table row, the bug
      thread becoming a bugs-table row). Pass --thread current to link
      to the thread you are currently inside, or --thread <id> for a
      different top-level message. Skip --thread only when the thread
      covers multiple unrelated topics or is only loosely related.
    --no-thread: opt out of auto-link on top-level-trigger turns (bulk
      create, unrelated row, etc.).
    Any link attempt soft-fails: if the anchor already serves another
    row, is not top-level, or is cross-room, the row is STILL
    created and the tool returns a warning naming the conflict so you
    can update the existing row or pick a different thread next turn.
  kylon workspace row update --row <row_id> --table <table_id_or_title> [--title <title>] [--content <text>] [--cell <key>=<value>] [--cells <json>]
    Same --cell / --cells contract as row create. At least one of --title,
      --content, --cell, --cells is required; an empty update is rejected.
    Single-cell update example:  --cell status=opt_no_reply
    Multi-cell / null / array:   --cells '{"status":"opt_done","notes":null}'
    Thread linkage: no --thread flag. If the row has no anchor and the
      current thread is about this row, run thread attach --target
      table_row:<id> --root current (the response also reminds you).
      Anchors are 1:1 and unmovable — attach now or accept it stays
      unlinked.
  kylon workspace row delete --row <row_id> --table <table_id_or_title>

--- Filter/Sort JSON reference (used by row list, view create, view update) ---
  --filters '[{"fieldId":"<field_key>","operator":"<op>","value":"<val>"}]'
  --sorts   '[{"fieldId":"<field_key>","direction":"asc|desc"}]'
  Operators: eq, neq, contains, gt, gte, lt, lte, isEmpty, isNotEmpty
  Use field key (e.g. "status", "created_date") as fieldId.

  Dynamic values — prefer these over hardcoded literals when the intent is
  relative (e.g. "my tasks", "overdue", "recent"). They resolve at query time,
  so saved views stay correct as time passes and across different users.
    "$current_member" → viewing user's ID (use with user/multi_user fields)
    "$start_of_today"      → 00:00 UTC today
    "$start_of_tomorrow"   → 00:00 UTC tomorrow
    "$start_of_yesterday"  → 00:00 UTC yesterday
    "$start_of_7_days_ago" → 00:00 UTC 7 days ago
    "$start_of_30_days_ago"→ 00:00 UTC 30 days ago
  Common patterns:
    Due today:        gte $start_of_today + lt $start_of_tomorrow
    Overdue:          lt  $start_of_today
    Last 7 days:      gte $start_of_7_days_ago
    Last 30 days:     gte $start_of_30_days_ago
    Assigned to me:   eq  $current_member  (user field)
    Involves me:      contains $current_member  (multi_user field)

Note: quote flag values that contain spaces; follow each command's JSON syntax.
```
