@tloncorp/tlon-skill 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -1
- package/SKILL.md +90 -6
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -104,6 +104,13 @@ tlon --url https://bot.tlon.network --cookie "urbauth-~bot=0v..." contacts self
|
|
|
104
104
|
# List your groups
|
|
105
105
|
tlon channels groups
|
|
106
106
|
|
|
107
|
+
# Create a group channel
|
|
108
|
+
# (preferred alias; tlon groups add-channel still works)
|
|
109
|
+
tlon channels create ~host/group-slug "Projects" --kind chat
|
|
110
|
+
|
|
111
|
+
# Rename a channel
|
|
112
|
+
tlon channels rename chat/~host/project-updates "Team Updates"
|
|
113
|
+
|
|
107
114
|
# Get recent mentions
|
|
108
115
|
tlon activity mentions --limit 10
|
|
109
116
|
|
|
@@ -115,6 +122,14 @@ tlon contacts update-profile --nickname "My Name"
|
|
|
115
122
|
|
|
116
123
|
# Create a group
|
|
117
124
|
tlon groups create "My Group" --description "A cool group"
|
|
125
|
+
|
|
126
|
+
# Join a public or invited group; private groups without an invite request one
|
|
127
|
+
tlon groups join ~host/group-slug
|
|
128
|
+
|
|
129
|
+
# Manage group invite flow explicitly
|
|
130
|
+
tlon groups request-invite ~host/group-slug
|
|
131
|
+
tlon groups accept-invite ~host/group-slug
|
|
132
|
+
tlon groups reject-invite ~host/group-slug
|
|
118
133
|
```
|
|
119
134
|
|
|
120
135
|
## Features
|
|
@@ -122,7 +137,7 @@ tlon groups create "My Group" --description "A cool group"
|
|
|
122
137
|
- **Activity**: Mentions, replies, unreads (with nicknames)
|
|
123
138
|
- **Channels**: List DMs, group DMs, subscribed groups (nicknames shown), reader/writer permissions
|
|
124
139
|
- **Contacts**: List, get, update profiles
|
|
125
|
-
- **Groups**: Create, join, invite, roles, privacy (member nicknames shown)
|
|
140
|
+
- **Groups**: Create, join, invite/request flows, roles, privacy (member nicknames shown)
|
|
126
141
|
- **Hooks**: Manage channel hooks (add, edit, delete, order, config, cron)
|
|
127
142
|
- **Messages**: History, search (author nicknames shown)
|
|
128
143
|
- **DMs**: Send, react, accept/decline
|
package/SKILL.md
CHANGED
|
@@ -11,6 +11,30 @@ Use the `tlon` command for reading data, managing channels/groups/contacts, and
|
|
|
11
11
|
|
|
12
12
|
When running as an OpenClaw skill, use the built-in `message` tool for sending outbound messages (DMs and channel posts). The `tlon` command is for reading data, administration, and management — not for sending messages. The `message` tool routes through the proper delivery infrastructure (threading, bot profile, rate limiting).
|
|
13
13
|
|
|
14
|
+
### Diary / Notebook Thread Replies
|
|
15
|
+
|
|
16
|
+
Tlon diary/notebook channels are special: a channel-level `send` creates a **new notebook post/note**. Do **not** use `message` with `action: "send"` in a diary channel unless you intentionally want to create a new notebook post.
|
|
17
|
+
|
|
18
|
+
For normal conversation inside an existing diary/notebook post, use the `message` tool with `action: "reply"` and reply to the **parent diary post id**, not the newest reply id.
|
|
19
|
+
|
|
20
|
+
Working pattern:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"action": "reply",
|
|
25
|
+
"channel": "tlon",
|
|
26
|
+
"target": "diary/~host/slug",
|
|
27
|
+
"messageId": "170.141.184.507.950.303.933.087.606.997.052.817.408",
|
|
28
|
+
"message": "Reply text here"
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Important details:
|
|
33
|
+
- Use the dotted `@ud` post id format when available.
|
|
34
|
+
- `messageId` should be the parent notebook post/thread id.
|
|
35
|
+
- After sending, verify with `tlon messages post <diary-nest> <parent-post-id>` when correctness matters.
|
|
36
|
+
- If the tool reports success but the reply is not visible under the parent post, treat it as a delivery/plugin issue and do not claim success until verified.
|
|
37
|
+
|
|
14
38
|
## Installation
|
|
15
39
|
|
|
16
40
|
**npm (Node.js):**
|
|
@@ -150,6 +174,8 @@ tlon channels dms # List DM contacts (w
|
|
|
150
174
|
tlon channels groups # List subscribed groups
|
|
151
175
|
tlon channels all # List everything
|
|
152
176
|
tlon channels info chat/~host/slug # Get channel details
|
|
177
|
+
tlon channels create ~host/slug "Projects" --kind chat # Create a group channel
|
|
178
|
+
tlon channels rename chat/~host/slug "New Title" # Rename a channel
|
|
153
179
|
tlon channels update chat/~host/slug --title "New Title" # Update metadata
|
|
154
180
|
tlon channels delete chat/~host/slug # Delete a channel
|
|
155
181
|
|
|
@@ -162,6 +188,14 @@ tlon channels add-readers ~host/group chat/~host/slug admin # Restrict viewin
|
|
|
162
188
|
tlon channels del-readers ~host/group chat/~host/slug admin # Open viewing
|
|
163
189
|
```
|
|
164
190
|
|
|
191
|
+
Help works for both the command and subcommands:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
tlon channels --help
|
|
195
|
+
tlon channels create --help
|
|
196
|
+
tlon channels rename --help
|
|
197
|
+
```
|
|
198
|
+
|
|
165
199
|
Notes on permissions:
|
|
166
200
|
|
|
167
201
|
- Empty writers list = anyone in the group can post (default for chat)
|
|
@@ -194,18 +228,24 @@ Full group management.
|
|
|
194
228
|
tlon groups list # List your groups
|
|
195
229
|
tlon groups info ~host/slug # Get group details
|
|
196
230
|
tlon groups create "Name" [--description "..."] # Create a group
|
|
197
|
-
tlon groups join ~host/slug # Join
|
|
231
|
+
tlon groups join ~host/slug # Join public/invited group, or request invite if private
|
|
232
|
+
tlon groups request-invite ~host/slug # Request invite to a private group
|
|
233
|
+
tlon groups accept-invite ~host/slug # Accept an existing group invite
|
|
234
|
+
tlon groups reject-invite ~host/slug # Reject an existing group invite
|
|
235
|
+
tlon groups cancel-join ~host/slug # Cancel a pending join
|
|
236
|
+
tlon groups rescind-request ~host/slug # Cancel an invite request
|
|
198
237
|
tlon groups leave ~host/slug # Leave a group
|
|
199
238
|
tlon groups delete ~host/slug # Delete (host only)
|
|
200
239
|
tlon groups update ~host/slug --title "..." [--description "..."]
|
|
201
240
|
|
|
202
241
|
# Members (shown with nicknames when available)
|
|
203
242
|
tlon groups invite ~host/slug ~ship1 ~ship2 # Invite members
|
|
243
|
+
tlon groups revoke-invite ~host/slug ~ship1 # Revoke pending member invite
|
|
204
244
|
tlon groups kick ~host/slug ~ship1 # Kick members
|
|
205
245
|
tlon groups ban ~host/slug ~ship1 # Ban members
|
|
206
246
|
tlon groups unban ~host/slug ~ship1 # Unban members
|
|
207
|
-
tlon groups accept-join ~host/slug ~ship1 #
|
|
208
|
-
tlon groups reject-join ~host/slug ~ship1 #
|
|
247
|
+
tlon groups accept-join ~host/slug ~ship1 # Approve a member join request
|
|
248
|
+
tlon groups reject-join ~host/slug ~ship1 # Deny a member join request
|
|
209
249
|
tlon groups set-privacy ~host/slug public|private|secret # Set privacy
|
|
210
250
|
|
|
211
251
|
# Roles
|
|
@@ -232,8 +272,27 @@ Roles vs Admin:
|
|
|
232
272
|
tlon groups add-channel ~host/slug "Name" [--kind chat|diary|heap]
|
|
233
273
|
```
|
|
234
274
|
|
|
275
|
+
`tlon groups add-channel` remains supported, but for agent/tool use prefer the more discoverable channel-centric form:
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
tlon channels create ~host/slug "Projects" --kind chat
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Help works here too:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
tlon groups --help
|
|
285
|
+
tlon groups add-channel --help
|
|
286
|
+
```
|
|
287
|
+
|
|
235
288
|
Group format: `~host-ship/group-slug`
|
|
236
289
|
|
|
290
|
+
Join behavior:
|
|
291
|
+
- `join` first checks whether you are already a member, then checks foreign/unjoined group state for a valid invite.
|
|
292
|
+
- Invited groups and public groups use the backend join action.
|
|
293
|
+
- Private groups without an invite use the invite-request action.
|
|
294
|
+
- Secret groups require an invite.
|
|
295
|
+
|
|
237
296
|
### Hooks
|
|
238
297
|
|
|
239
298
|
Manage channel hooks — functions that run on triggers (posts, replies, reactions, crons).
|
|
@@ -343,7 +402,7 @@ Manage channel posts (reactions, edits, deletes).
|
|
|
343
402
|
tlon posts react chat/~host/slug 170.141... "👍" # React to a post
|
|
344
403
|
tlon posts unreact chat/~host/slug 170.141... # Remove reaction
|
|
345
404
|
tlon posts edit chat/~host/slug 170.141... "New text" # Edit with plain text
|
|
346
|
-
tlon posts edit diary/~host/slug 170.141... --title "T" --image <url> --content
|
|
405
|
+
tlon posts edit diary/~host/slug 170.141... --title "T" --image <url> --content story.json # Edit notebook
|
|
347
406
|
tlon posts delete chat/~host/slug 170.141... # Delete a post
|
|
348
407
|
```
|
|
349
408
|
|
|
@@ -355,11 +414,36 @@ Post to diary/notebook channels.
|
|
|
355
414
|
|
|
356
415
|
```bash
|
|
357
416
|
tlon notebook diary/~host/slug "Title" # Post with no body
|
|
358
|
-
tlon notebook diary/~host/slug "Title" --content
|
|
417
|
+
tlon notebook diary/~host/slug "Title" --content story.json # Post with Story JSON
|
|
418
|
+
tlon notebook diary/~host/slug "Title" --markdown post.md # Post with Markdown
|
|
419
|
+
cat post.md | tlon notebook diary/~host/slug "Title" --markdown-stdin
|
|
359
420
|
tlon notebook diary/~host/slug "Title" --image <url> # Post with cover image
|
|
360
421
|
```
|
|
361
422
|
|
|
362
|
-
The `--content` file should be Story JSON
|
|
423
|
+
The `--content` file should be **Urbit Story JSON**: an array of verses accepted by the ship's `story-json` decoder. Use `--markdown` for Markdown files instead of passing Markdown or editor-export JSON through `--content`.
|
|
424
|
+
|
|
425
|
+
Working examples:
|
|
426
|
+
|
|
427
|
+
```json
|
|
428
|
+
[{"inline": ["Hello world"]}]
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
```json
|
|
432
|
+
[{"block": {"header": {"tag": "h1", "content": ["Title"]}}}]
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
```json
|
|
436
|
+
[{"inline": ["Use ", {"inline-code": "ha-q"}, " for entity queries."]}]
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
Important gotcha:
|
|
440
|
+
- Do **not** assume newer block-editor JSON shapes or arbitrary markdown-export JSON will work.
|
|
441
|
+
- If posting fails with a `channel-action-2` cast error mentioning `content -> add -> post -> action -> channel`, the first thing to check is whether the content file matches the ship's Story JSON shape.
|
|
442
|
+
- When debugging, post a minimal one-verse story first so you do not create duplicate full notebook posts.
|
|
443
|
+
|
|
444
|
+
See the ship-side decoder and types here:
|
|
445
|
+
- `tlon-apps/desk/lib/story-json.hoon`
|
|
446
|
+
- [Story types in tlon-apps](https://github.com/tloncorp/tlon-apps/blob/develop/packages/shared/src/urbit/content.ts)
|
|
363
447
|
|
|
364
448
|
### Upload
|
|
365
449
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tloncorp/tlon-skill",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.6",
|
|
4
4
|
"description": "Tlon/Urbit skill for OpenClaw agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
"postinstall": "node scripts/postinstall.js"
|
|
22
22
|
},
|
|
23
23
|
"optionalDependencies": {
|
|
24
|
-
"@tloncorp/tlon-skill-darwin-arm64": "0.3.
|
|
25
|
-
"@tloncorp/tlon-skill-darwin-x64": "0.3.
|
|
26
|
-
"@tloncorp/tlon-skill-linux-x64": "0.3.
|
|
27
|
-
"@tloncorp/tlon-skill-linux-arm64": "0.3.
|
|
24
|
+
"@tloncorp/tlon-skill-darwin-arm64": "0.3.6",
|
|
25
|
+
"@tloncorp/tlon-skill-darwin-x64": "0.3.6",
|
|
26
|
+
"@tloncorp/tlon-skill-linux-x64": "0.3.6",
|
|
27
|
+
"@tloncorp/tlon-skill-linux-arm64": "0.3.6"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@tloncorp/api": "^0.0.4",
|