一键导入
octo-matter
Matter (todo/task) domain — CRUD, status transitions, assignees, channels, timeline, and AI extract from chat messages. Load after octo-shared.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Matter (todo/task) domain — CRUD, status transitions, assignees, channels, timeline, and AI extract from chat messages. Load after octo-shared.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Docs domain — create and govern documents, read and incrementally edit a doc's live body, read and batch-edit spreadsheet cells (with paged reads for large sheets), read and batch-edit whiteboard scenes, members and sharing, inline comments, versions/snapshots, and attachment metadata as a bot. Load after octo-shared.
File operations (upload/download, presigned S3 credentials) plus bot housekeeping (register, set-commands, user-info, space-members, typing, heartbeat). Load after octo-shared.
Messaging domain — send/edit/sync messages, read receipts, groups and threads (User Bot), and event polling. Covers App Bot DM-only constraints. Load after octo-shared.
Shared knowledge for using the octo CLI — authentication, multi-service config, output envelopes, universal flags, error handling, and common patterns. Load before invoking any octo domain skill.
| name | octo-matter |
| version | 0.4.0 |
| disabled | true |
| description | Matter (todo/task) domain — CRUD, status transitions, assignees, channels, timeline, and AI extract from chat messages. Load after octo-shared. |
| metadata | {"requires":{"bins":["octo-cli"],"skills":["octo-shared"]}} |
A matter is the Octo equivalent of a task or todo. The domain has 17 operations across five groups: core CRUD, status transitions, assignees, channels, and timeline. Plus one LLM helper: matter extract.
Backend: matters service at $OCTO_API_BASE_URL/api/v1/matters.
Both App Bot and User Bot can call every operation in this domain.
octo-cli matter create --title "Fix login bug" # required: --title (≤500 chars)
octo-cli matter list --status open --assignee-id me --limit 50 # cursor pagination
octo-cli matter get <id>
octo-cli matter update <id> --title "..." --description "..."
octo-cli matter delete <id> # soft delete
create also accepts --description (≤10 000), --assignee-ids (repeatable — supports me alias), --deadline (RFC3339), --remind-at (RFC3339), --source-channel-id, --source-channel-type (1=user, 2=group, 5=thread), --source-name.
list filters: --status, --assignee-id (me supported), --creator-id, --q <query>, --source-channel-id, --source-channel-type, --channel-id, --limit (default 20, max 100), --cursor.
There is no state machine — any status can move to any status.
octo-cli matter transition <id> --status done
octo-cli matter close <id> # alias → --status done
octo-cli matter reopen <id> # alias → --status open
octo-cli matter archive <id> # alias → --status archived
Valid values: open, done, archived.
octo-cli matter assignee add <id> --user-id <uid>
octo-cli matter assignee remove <id> <uid>
--user-id accepts me to self-assign. Adding a user who is already assigned returns DUPLICATE_ASSIGNEE (validation error — recover by listing current assignees first).
Link a matter to a chat channel so conversations show up in context.
octo-cli matter channel link <id> --channel-id <cid> --channel-type 1 # 1=user 2=group 5=thread
octo-cli matter channel link <id> --channel-id <cid> --channel-type 2 --channel-name "#eng-ops"
octo-cli matter channel unlink <id> <channel_id>
Timeline entries are the successor to comments. Simple text goes through --content; attachments, quoted messages, and channel context go through --data:
octo-cli matter timeline add <id> --content "Ping from oncall"
octo-cli matter timeline add <id> --data '{
"content":"see attached log",
"attachments":[{"url":"https://…/log.txt","name":"log.txt","type":"text/plain"}]
}'
octo-cli matter timeline list <id> # paginated
octo-cli matter timeline delete <id> <entry_id>
--content caps at 10 000 characters.
matter extract hands a chat transcript to an LLM and returns a structured matter. Typical bot use:
octo-cli matter extract --data '{
"channel_type": 2,
"channel_id": "ch_abc",
"creator_uid": "<bot-owner-uid>",
"msgs": [
{"uid":"u_alice","text":"we need to fix login"},
{"uid":"u_bob","text":"+1 by friday"}
]
}'
Critical: a bot must set creator_uid to its owner_uid, not its own bot_uid — the backend rejects the request otherwise. Capture owner_uid from the one-time octo-cli bot register response at publish (--jq '.data.owner_uid') and cache it (env/config); reuse the cached value rather than re-registering on every extract. Note bot user-info does not return it (it needs --uid and returns only {uid,name,avatar}).
meAnywhere an assignee UID is accepted, me resolves server-side to the caller's UID.
octo-cli matter list --assignee-id me --status open
All list endpoints follow {data:[], pagination:{has_more, next_cursor}}. Let the CLI walk them:
octo-cli matter list --status open --page-all
octo-cli matter timeline list <id> --page-all --page-limit 5
octo-cli matter list --status open --assignee-id me --jq '.data[].id' \
| xargs -I{} octo-cli matter close {}
error.code | What to do |
|---|---|
MATTER_NOT_FOUND | Confirm the id with octo-cli matter list before retrying. |
ASSIGNEE_NOT_FOUND | The UID is wrong or not in the space. octo-cli bot space-members to verify. |
DUPLICATE_ASSIGNEE | Already assigned — list current assignees and skip. |
FORBIDDEN | Bot lacks space membership or owner-equivalent permission. |
SPACE_FORBIDDEN | OCTO_SPACE_ID / --space points at a space the bot isn't in. |
VALIDATION_ERROR | error.detail.details names the offending field; fix and retry. |
PAYLOAD_TOO_LARGE | Body over 1 MB — trim description/timeline content. |
RATE_LIMITED | Honour the cooldown window; the retry wrapper already waits once. |
When unsure about a flag or body shape:
octo-cli schema matter.create
octo-cli schema matter.list
octo-cli schema matter.timeline.add
Everything in this skill is derived from those specs — if the schema says otherwise, trust the schema.