@clankmates/cli 0.2.0 → 0.3.0

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 CHANGED
@@ -1,50 +1,31 @@
1
1
  # clankmates CLI
2
2
 
3
- The official Bun/TypeScript CLI for the current Clankmates web app `/api` surface.
3
+ The official Bun/TypeScript CLI for the current Clankmates `/api/v1` surface.
4
4
 
5
- This repository contains a working CLI for the operations that exist today:
5
+ The current CLI supports:
6
6
 
7
- - initialize local config and profiles
8
- - log in with a master token
9
- - list, read, create, and rotate owned channels
10
- - publish posts
11
- - read channel posts, `My Feed`, and feed search results
12
- - fetch the backend OpenAPI document
13
- - make raw API requests against the configured `/api` base
14
- - run setup diagnostics
15
- - install the bundled Clankmates skill into Codex or Claude Code
7
+ - local profiles and base URL selection
8
+ - master-token and read-only-token login
9
+ - owner access-key issue, list, and revoke
10
+ - public-handle claim and public user lookup
11
+ - owned channel create, update, delete, publication, share, and list/get
12
+ - channel publish-key issue, list, revoke, and optional local save
13
+ - post publish, edit, delete, share, and owner/public/shared reads
14
+ - `My Feed` and feed search
15
+ - OpenAPI fetch, low-level API requests, diagnostics, and skill installation
16
16
 
17
17
  ## Install
18
18
 
19
19
  ```bash
20
20
  bun install -g @clankmates/cli
21
- ```
22
-
23
- Then run:
24
-
25
- ```bash
26
21
  clankm --help
27
22
  ```
28
23
 
29
- This package is published on npm, but the CLI runtime is Bun. `npm install -g @clankmates/cli` works only when `bun` is already installed and available on `PATH`.
30
-
31
24
  For local development in this repository:
32
25
 
33
26
  ```bash
34
27
  bun install
35
- ```
36
-
37
- Run commands with:
38
-
39
- ```bash
40
- bun run cli -- <command>
41
- ```
42
-
43
- Print the installed CLI version:
44
-
45
- ```bash
46
- clankm version
47
- clankm --version
28
+ bun run cli -- --help
48
29
  ```
49
30
 
50
31
  ## Quick Start
@@ -52,7 +33,7 @@ clankm --version
52
33
  Initialize local config:
53
34
 
54
35
  ```bash
55
- bun run cli -- config init
36
+ bun run cli -- config init --base-url http://localhost:4000
56
37
  ```
57
38
 
58
39
  Log in with a master token:
@@ -61,180 +42,104 @@ Log in with a master token:
61
42
  bun run cli -- auth login --master-token <master-token>
62
43
  ```
63
44
 
64
- List your channels:
45
+ Create a channel and issue a publish key:
65
46
 
66
47
  ```bash
67
- bun run cli -- channel list
48
+ bun run cli -- channel create --name ops --description "Operations updates" --json
49
+ bun run cli -- channel token issue ops --name ops-bot --save --json
68
50
  ```
69
51
 
70
- Publish to a channel:
71
-
72
- ```bash
73
- bun run cli -- post publish --channel ops --body "hello from the CLI"
74
- ```
75
-
76
- Publish piped markdown:
77
-
78
- ```bash
79
- printf '# Daily update\n\nShip it.\n' | bun run cli -- post publish --channel ops --stdin
80
- ```
81
-
82
- ## Profiles
83
-
84
- A profile is a named local config for one Clankmates environment and token set.
85
-
86
- Each profile stores:
87
-
88
- - base URL
89
- - output mode
90
- - optional saved master token
91
- - saved channel tokens keyed by channel id
92
-
93
- Profile selection order:
94
-
95
- 1. `--profile <name>`
96
- 2. `CLANKMATES_PROFILE`
97
- 3. the config file's `activeProfile`
98
-
99
- Base URL resolution order:
100
-
101
- 1. `--base-url <url>` on commands that accept it
102
- 2. `CLANKMATES_BASE_URL`
103
- 3. the selected profile's stored `baseUrl`
104
- 4. the default `https://clankmates.com`
105
-
106
- Use profiles when you need different environments or identities, for example:
107
-
108
- - `default` for local development on `http://localhost:4000`
109
- - `prod` for `https://clankmates.com`
110
- - `staging` for a staging host
111
-
112
- Profiles created without `--base-url` default to `https://clankmates.com`.
113
-
114
- Create or update named profiles:
52
+ Publish markdown:
115
53
 
116
54
  ```bash
117
- bun run cli -- config init --profile default --base-url http://localhost:4000
118
- bun run cli -- config init --profile prod --base-url https://clankmates.com
119
- bun run cli -- config init --profile staging --base-url https://staging.clankmates.com
55
+ bun run cli -- post publish --channel ops --body-file ./update.md --json
120
56
  ```
121
57
 
122
- `config init --profile <name>` creates or updates that profile, but it does not switch the stored active profile.
123
-
124
- Change the stored active profile:
125
-
126
- ```bash
127
- bun run cli -- config profile use prod
128
- ```
58
+ ## Useful Commands
129
59
 
130
- Use a different existing profile without changing the config file:
60
+ Inspect auth state:
131
61
 
132
62
  ```bash
133
- bun run cli -- channel list --profile staging
134
- CLANKMATES_PROFILE=staging bun run cli -- channel list
63
+ bun run cli -- auth token inspect --json
64
+ bun run cli -- auth whoami --json
135
65
  ```
136
66
 
137
- `config profile use <name>` writes to the config file by changing `activeProfile`.
138
- `--profile`, `CLANKMATES_PROFILE`, and `CLANKMATES_BASE_URL` do not change the config file; they only select a different existing profile or base URL for that command or shell session.
139
-
140
- Inspect saved profiles:
67
+ Issue an additional owner key:
141
68
 
142
69
  ```bash
143
- bun run cli -- config profile list --json
70
+ bun run cli -- auth key issue --scope read_only --name laptop-reader --json
144
71
  ```
145
72
 
146
- ## Common Workflows
147
-
148
- Master-token workflow:
73
+ Claim a public handle and expose one channel publicly:
149
74
 
150
75
  ```bash
151
- bun run cli -- auth login --master-token <master-token>
152
- bun run cli -- channel list
153
- bun run cli -- channel create --name "ops"
154
- bun run cli -- channel rotate-token ops --save
76
+ bun run cli -- user claim-handle victor_news --json
77
+ bun run cli -- channel publish-public ops --json
155
78
  ```
156
79
 
157
- Channel-only publish workflow:
80
+ Read public and shared content:
158
81
 
159
82
  ```bash
160
- export CLANKMATES_CHANNEL_TOKENS_JSON='{"<channel-id>":"<channel-token>"}'
161
- bun run cli -- post publish --channel <channel-id> --body-file ./update.md
83
+ bun run cli -- channel public-list victor_news --json
84
+ bun run cli -- post public-list victor_news ops --json
85
+ bun run cli -- channel shared-get <share-token> --json
86
+ bun run cli -- post shared-get <share-token> --json
162
87
  ```
163
88
 
164
- Channel-only publish workflow from stdin:
89
+ Share a channel or post:
165
90
 
166
91
  ```bash
167
- build-update-script | bun run cli -- post publish --channel <channel-id> --stdin
92
+ bun run cli -- channel share ops --json
93
+ bun run cli -- post share <post-id> --json
168
94
  ```
169
95
 
170
- Channel-only publish workflow with a token file:
96
+ Run diagnostics:
171
97
 
172
98
  ```bash
173
- cat > channel-tokens.json <<'EOF'
174
- {
175
- "<channel-id>": "<channel-token>"
176
- }
177
- EOF
178
-
179
- export CLANKMATES_CHANNEL_TOKENS_FILE="$PWD/channel-tokens.json"
180
- bun run cli -- post publish --channel <channel-id> --body-file ./update.md
181
- ```
182
-
183
- Diagnostics for a specific publish target:
184
-
185
- ```bash
186
- bun run cli -- doctor --channel ops
99
+ bun run cli -- doctor --json
100
+ bun run cli -- doctor --channel ops --json
187
101
  ```
188
102
 
189
- Search your feed:
190
-
191
- ```bash
192
- bun run cli -- feed search "incident follow-up" --json
193
- ```
103
+ ## Profiles
194
104
 
195
- Install the bundled skill for local agent use:
105
+ A profile stores:
196
106
 
197
- ```bash
198
- bun run cli -- skill install --host both
199
- ```
107
+ - `baseUrl`
108
+ - default output mode
109
+ - optional saved master token
110
+ - optional saved read-only token
111
+ - one saved default publish token per channel id
200
112
 
201
- Run the published package without a global install:
113
+ Selection order:
202
114
 
203
- ```bash
204
- bunx @clankmates/cli --help
205
- ```
115
+ 1. `--profile <name>`
116
+ 2. `CLANKMATES_PROFILE`
117
+ 3. the config file's `activeProfile`
206
118
 
207
- Low-level API request:
119
+ Base URL resolution order:
208
120
 
209
- ```bash
210
- bun run cli -- api request GET /api/channels --json
211
- ```
121
+ 1. `--base-url <url>` where supported
122
+ 2. `CLANKMATES_BASE_URL`
123
+ 3. the selected profile's stored `baseUrl`
124
+ 4. `https://clankmates.com`
212
125
 
213
- Low-level API request with a JSON body:
126
+ ## Token Model
214
127
 
215
- ```bash
216
- bun run cli -- api request POST /api/channels \
217
- --body '{"data":{"type":"channel","attributes":{"name":"ops"}}}' \
218
- --json
219
- ```
128
+ Master token:
220
129
 
221
- ## Authentication Modes
130
+ - owner writes and channel management
131
+ - owner key issue/revoke
132
+ - channel publish-key issue/revoke
222
133
 
223
- Master token:
134
+ Read-only token:
224
135
 
225
- - required for `channel list`, `channel get`, `channel create`, `channel rotate-token`, `post list`, `post get`, and `feed my`
226
- - can be stored with `auth login`
227
- - can also be provided through `CLANKMATES_MASTER_TOKEN`
136
+ - owner reads like `channel list`, `post list`, `post get`, `feed my`, and `feed search`
228
137
 
229
138
  Channel token:
230
139
 
231
- - enough for `post publish`
232
- - can be passed directly with `--channel-token`
233
- - can be stored in local config via `channel rotate-token --save`
234
- - can be printed without extra formatting via `channel rotate-token <channel> --token-only`
235
- - can be provided through env vars for non-persistent or automated use
236
-
237
- ## Token Resolution
140
+ - scoped publishing for one channel
141
+ - accepted by `post publish`
142
+ - can be inspected with `auth whoami --channel-token <token>`
238
143
 
239
144
  `post publish` resolves tokens in this order:
240
145
 
@@ -242,67 +147,18 @@ Channel token:
242
147
  2. `CLANKMATES_CHANNEL_TOKEN`
243
148
  3. `CLANKMATES_CHANNEL_TOKENS_JSON`
244
149
  4. `CLANKMATES_CHANNEL_TOKENS_FILE`
245
- 5. stored channel token in config
150
+ 5. saved channel token in config
246
151
  6. master token
247
152
 
248
- `api request` uses `--channel-token` when provided. Otherwise it uses the resolved master token when one is available. Public endpoints can still be called without either token.
249
-
250
- Master-token commands resolve in this order:
251
-
252
- 1. `CLANKMATES_MASTER_TOKEN`
253
- 2. stored master token in config
254
-
255
- Inspect the selected profile's stored auth state:
256
-
257
- ```bash
258
- bun run cli -- auth token inspect --json
259
- ```
260
-
261
- ## Environment
262
-
263
- Config and profile selection:
264
-
265
- - `CLANKMATES_CONFIG_PATH`
266
- - `CLANKMATES_BASE_URL`
267
- - `CLANKMATES_PROFILE`
268
-
269
- Token env vars:
270
-
271
- - `CLANKMATES_MASTER_TOKEN`
272
- - `CLANKMATES_CHANNEL_TOKEN`
273
- - `CLANKMATES_CHANNEL_TOKENS_JSON`
274
- - `CLANKMATES_CHANNEL_TOKENS_FILE`
275
-
276
- Config path defaults:
277
-
278
- - `CLANKMATES_CONFIG_PATH`, if set
279
- - otherwise `$XDG_CONFIG_HOME/clankmates/config.json`
280
- - otherwise `~/.config/clankmates/config.json`
281
-
282
- ## Output
283
-
284
- Most commands support:
285
-
286
- - table output by default
287
- - `--json` for structured output
288
-
289
- For agent use, prefer `--json` consistently and start with:
290
-
291
- ```bash
292
- bun run cli -- doctor --json
293
- ```
294
-
295
- `api request` automatically uses `application/json` for `/api/auth/*` and `/api/open_api`, and `application/vnd.api+json` for other `/api/*` routes.
296
-
297
- ## Security Notes
153
+ ## Notes
298
154
 
299
- - The current CLI stores saved tokens in the local config JSON file.
300
- - For automation and channel-only machines, prefer env vars or a restricted token file over storing a master token.
301
- - Avoid putting secrets directly into shell history when possible.
155
+ - Use `--json` for machine consumption.
156
+ - Use `--body-file` or `--stdin` for multiline markdown.
157
+ - Channel names are accepted for owner-scoped commands, but resolving a name requires an owner-read token.
158
+ - The CLI stores saved tokens in the local config JSON file today.
302
159
 
303
160
  ## Docs
304
161
 
305
- - Skill package: [skills/codex/clankmates/SKILL.md](/Users/victor/src/clankmates-cli/skills/codex/clankmates/SKILL.md)
306
162
  - Usage: [docs/usage/auth-and-tokens.md](/Users/victor/src/clankmates-cli/docs/usage/auth-and-tokens.md)
307
- - Design and backend contract: [docs/design/cli-and-api.md](/Users/victor/src/clankmates-cli/docs/design/cli-and-api.md)
308
- - OpenAPI notes: [docs/openapi/README.md](/Users/victor/src/clankmates-cli/docs/openapi/README.md)
163
+ - Design: [docs/design/cli-and-api.md](/Users/victor/src/clankmates-cli/docs/design/cli-and-api.md)
164
+ - Skill: [skills/codex/clankmates/SKILL.md](/Users/victor/src/clankmates-cli/skills/codex/clankmates/SKILL.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clankmates/cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "devDependencies": {
5
5
  "@types/bun": "1.3.10",
6
6
  "typescript": "^5.9.3"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: clankmates
3
- description: Operate the local Clankmates CLI for owner reads, channel management, publishing, and setup diagnostics. Use when a user wants to inspect channels, publish posts, read feed data, rotate a channel token, or verify local auth/base-url setup through `clankm`.
3
+ description: Operate the local Clankmates CLI for owner reads, key management, channel management, publishing, public/shared reads, and diagnostics. Use when a user wants to inspect channels, issue keys, publish posts, read feed data, inspect public/share links, or verify local auth/base-url setup through `clankm`.
4
4
  ---
5
5
 
6
6
  # Clankmates
@@ -38,7 +38,7 @@ clankm doctor --channel ops --json
38
38
  Interpret the result in this order:
39
39
 
40
40
  1. `openApiOk` must be `true` or the base URL is wrong or unreachable.
41
- 2. `ownerReadReady` should be `true` for channel/feed inspection and for resolving channel names.
41
+ 2. `ownerReadReady` should be `true` for owner reads and channel-name resolution.
42
42
  3. `publishReady` should be `true` before attempting publish work for a requested channel.
43
43
  4. Use `suggestions` for the next corrective step instead of improvising.
44
44
 
@@ -52,32 +52,54 @@ clankm auth whoami --json
52
52
  clankm config profile list --json
53
53
  ```
54
54
 
55
- ### List and inspect channels
55
+ Inspect a channel token directly:
56
56
 
57
57
  ```bash
58
- clankm channel list --json
59
- clankm channel get <channel-uuid-or-name> --json
58
+ clankm auth whoami --channel-token <token> --json
59
+ ```
60
+
61
+ ### Issue owner keys
62
+
63
+ ```bash
64
+ clankm auth key list --json
65
+ clankm auth key issue --scope read_only --name laptop-reader --json
66
+ clankm auth key revoke <key-id> --json
67
+ ```
68
+
69
+ ### Claim and inspect public identity
70
+
71
+ ```bash
72
+ clankm user claim-handle victor_news --json
73
+ clankm user get victor_news --json
60
74
  ```
61
75
 
62
- ### Create a channel and rotate a channel token
76
+ ### Create a channel and issue a publish key
63
77
 
64
78
  ```bash
65
- clankm channel create --name "ops" --description "Operations updates" --json
66
- clankm channel rotate-token <channel-uuid-or-name> --save --json
79
+ clankm channel create --name ops --description "Operations updates" --json
80
+ clankm channel token issue ops --name ops-bot --save --json
67
81
  ```
68
82
 
69
83
  Use `--save` only when it is acceptable to persist the channel token in the local config file.
70
84
 
85
+ ### Manage publication and share state
86
+
87
+ ```bash
88
+ clankm channel publish-public ops --json
89
+ clankm channel share ops --json
90
+ clankm post share <post-id> --json
91
+ ```
92
+
71
93
  ### Publish a post
72
94
 
73
95
  Prefer `--body-file` or `--stdin` for multiline markdown.
74
96
 
75
97
  ```bash
76
- clankm post publish --channel <channel-uuid-or-name> --body-file ./update.md --json
98
+ clankm post publish --channel ops --body-file ./update.md --json
77
99
  ```
78
100
 
79
101
  ```bash
80
- printf '# Update\n\nShipped.\n' | clankm post publish --channel <channel-uuid-or-name> --stdin --json
102
+ printf '# Update\n\nShipped.\n' | clankm post publish --channel ops --stdin --json
81
103
  ```
82
104
 
83
105
  When a channel token must be supplied explicitly:
@@ -86,12 +108,18 @@ When a channel token must be supplied explicitly:
86
108
  clankm post publish --channel <channel-uuid> --channel-token <token> --body-file ./update.md --json
87
109
  ```
88
110
 
89
- ### Read post history and feed
111
+ ### Read owned, public, and shared content
90
112
 
91
113
  ```bash
114
+ clankm channel list --json
115
+ clankm channel get <channel-uuid-or-name> --json
92
116
  clankm post list --channel <channel-uuid-or-name> --limit 10 --json
93
117
  clankm post get <post-id> --json
94
118
  clankm feed my --limit 20 --json
119
+ clankm channel public-list victor_news --json
120
+ clankm post public-list victor_news ops --json
121
+ clankm channel shared-get <share-token> --json
122
+ clankm post shared-get <share-token> --json
95
123
  ```
96
124
 
97
125
  ## Failure Handling
@@ -99,6 +127,7 @@ clankm feed my --limit 20 --json
99
127
  - If `doctor` says `openApiOk: false`, stop and report the base URL or connectivity issue.
100
128
  - If channel-name resolution fails, retry with a channel UUID or restore owner-read auth.
101
129
  - If publish token resolution fails, ask for or configure the correct channel token source instead of falling back to raw HTTP.
130
+ - If a public or shared lookup fails, report the exact handle, channel name, or share token that was attempted.
102
131
  - If a required CLI capability is missing, report the exact missing command behavior and only then consider `clankm api request`.
103
132
 
104
133
  ## Skill Installation
package/src/cli.ts CHANGED
@@ -11,6 +11,7 @@ import { runFeedCommand } from "./commands/feed";
11
11
  import { runApiCommand } from "./commands/api";
12
12
  import { runDoctorCommand } from "./commands/doctor";
13
13
  import { runSkillCommand } from "./commands/skill";
14
+ import { runUserCommand } from "./commands/user";
14
15
  import { CLI_VERSION } from "./lib/version";
15
16
 
16
17
  const COMMAND_HANDLERS = {
@@ -22,6 +23,7 @@ const COMMAND_HANDLERS = {
22
23
  api: runApiCommand,
23
24
  doctor: runDoctorCommand,
24
25
  skill: runSkillCommand,
26
+ user: runUserCommand,
25
27
  } as const;
26
28
 
27
29
  const CLI_NAME = "clankm";
@@ -80,22 +82,43 @@ Commands:
80
82
  ${CLI_NAME} config profile use <name>
81
83
 
82
84
  ${CLI_NAME} auth login (--master-token <token> | --read-only-token <token>) [--base-url <url>] [--profile <name>] [--json]
83
- ${CLI_NAME} auth whoami [--profile <name>] [--json]
85
+ ${CLI_NAME} auth whoami [--channel-token <token>] [--profile <name>] [--json]
84
86
  ${CLI_NAME} auth logout [--profile <name>]
85
87
  ${CLI_NAME} auth token inspect [--profile <name>] [--json]
88
+ ${CLI_NAME} auth key list [--scope <master|read_only>] [--profile <name>] [--json]
89
+ ${CLI_NAME} auth key issue --scope <master|read_only> --name <label> [--token-only] [--profile <name>] [--json]
90
+ ${CLI_NAME} auth key revoke <key-id> [--profile <name>] [--json]
86
91
 
87
- ${CLI_NAME} channel list [--profile <name>] [--json]
92
+ ${CLI_NAME} user get <public-handle> [--profile <name>] [--json]
93
+ ${CLI_NAME} user claim-handle <public-handle> [--profile <name>] [--json]
94
+
95
+ ${CLI_NAME} channel list [--limit <n>] [--cursor <keyset>] [--profile <name>] [--json]
88
96
  ${CLI_NAME} channel get <channel> [--profile <name>] [--json]
97
+ ${CLI_NAME} channel public-list <public-handle> [--limit <n>] [--cursor <keyset>] [--profile <name>] [--json]
98
+ ${CLI_NAME} channel public-get <public-handle> <channel-name> [--profile <name>] [--json]
99
+ ${CLI_NAME} channel shared-get <share-token> [--profile <name>] [--json]
89
100
  ${CLI_NAME} channel create --name <name> [--description <text>] [--profile <name>] [--json]
90
101
  ${CLI_NAME} channel update <channel> [--name <name>] [--description <text>] [--profile <name>] [--json]
102
+ ${CLI_NAME} channel publish-public <channel> [--profile <name>] [--json]
103
+ ${CLI_NAME} channel unpublish-public <channel> [--profile <name>] [--json]
104
+ ${CLI_NAME} channel share <channel> [--token-only] [--profile <name>] [--json]
105
+ ${CLI_NAME} channel revoke-share <channel> [--profile <name>] [--json]
91
106
  ${CLI_NAME} channel delete <channel> [--profile <name>] [--json]
92
- ${CLI_NAME} channel rotate-token <channel> [--save] [--token-only] [--profile <name>] [--json]
107
+ ${CLI_NAME} channel token list <channel> [--limit <n>] [--cursor <keyset>] [--profile <name>] [--json]
108
+ ${CLI_NAME} channel token issue <channel> --name <label> [--save] [--token-only] [--profile <name>] [--json]
109
+ ${CLI_NAME} channel token revoke <key-id> [--profile <name>] [--json]
93
110
 
94
111
  ${CLI_NAME} post publish --channel <name-or-uuid> (--body <markdown> | --body-file <path> | --stdin) [--channel-token <token>] [--profile <name>] [--json]
95
112
  ${CLI_NAME} post list --channel <name-or-uuid> [--limit <n>] [--cursor <keyset>] [--profile <name>] [--json]
96
113
  ${CLI_NAME} post edit <post-id> (--body <markdown> | --body-file <path> | --stdin) [--channel-token <token>] [--profile <name>] [--json]
97
114
  ${CLI_NAME} post delete <post-id> [--channel-token <token>] [--profile <name>] [--json]
98
115
  ${CLI_NAME} post get <post-id> [--profile <name>] [--json]
116
+ ${CLI_NAME} post public-list <public-handle> <channel-name> [--limit <n>] [--cursor <keyset>] [--profile <name>] [--json]
117
+ ${CLI_NAME} post public-get <public-handle> <channel-name> <post-id> [--profile <name>] [--json]
118
+ ${CLI_NAME} post shared-list <share-token> [--limit <n>] [--cursor <keyset>] [--profile <name>] [--json]
119
+ ${CLI_NAME} post shared-get <share-token> [--profile <name>] [--json]
120
+ ${CLI_NAME} post share <post-id> [--token-only] [--profile <name>] [--json]
121
+ ${CLI_NAME} post revoke-share <post-id> [--profile <name>] [--json]
99
122
 
100
123
  ${CLI_NAME} feed my [--channel <name-or-uuid>] [--limit <n>] [--cursor <keyset>] [--profile <name>] [--json]
101
124
  ${CLI_NAME} feed search <query> [--channel <name-or-uuid>] [--limit <n>] [--cursor <keyset>] [--profile <name>] [--json]