@wji.ai/cli 0.5.0 → 0.6.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.
Files changed (32) hide show
  1. package/README.md +22 -2
  2. package/dist/commands/canvas.js +52 -5
  3. package/dist/commands/fsnode.js +13 -6
  4. package/dist/commands/gen.js +3 -2
  5. package/dist/commands/model.js +4 -2
  6. package/dist/commands/workspace.js +6 -3
  7. package/dist/core/output.js +29 -0
  8. package/dist/index.js +5 -2
  9. package/package.json +1 -1
  10. package/skill/ads/SKILL.md +176 -0
  11. package/skill/ads/reference/ai-consistency.md +109 -0
  12. package/skill/ads/reference/brief-template.md +103 -0
  13. package/skill/ads/reference/compliance.md +66 -0
  14. package/skill/ads/reference/formats-image.md +108 -0
  15. package/skill/ads/reference/formats-video.md +121 -0
  16. package/skill/ads/reference/models.md +95 -0
  17. package/skill/ads/reference/product-photography.md +119 -0
  18. package/skill/ads/reference/styles.md +70 -0
  19. package/skill/short-drama/SKILL.md +4 -0
  20. package/skill/short-drama/reference/canvas-recipes.md +18 -0
  21. package/skill/short-drama/reference/operations-cli.md +1 -0
  22. package/skill/short-drama/reference/operations-wji.md +27 -4
  23. package/skill/short-drama/reference/stage-storyboard.md +6 -0
  24. package/skill/social-media/SKILL.md +152 -0
  25. package/skill/social-media/reference/content-craft.md +124 -0
  26. package/skill/social-media/reference/plan-template.md +171 -0
  27. package/skill/social-media/reference/platforms-china.md +94 -0
  28. package/skill/social-media/reference/platforms-global.md +122 -0
  29. package/skill/social-media/reference/ratio-map.md +100 -0
  30. package/skill/social-media/reference/repurpose.md +119 -0
  31. package/skill/wji/SKILL.md +30 -2
  32. package/skill/wji/reference/commands.md +27 -12
@@ -9,6 +9,12 @@ description: Drive the WJI AI platform from the terminal with the `wji` CLI —
9
9
  `--json`, so prefer `--json` piped through `jq` when you need to read a value,
10
10
  and the human table output when you are showing the user a result.
11
11
 
12
+ `--json` prints the **`standard`** detail level: ids, names, status, media urls,
13
+ long text clipped to 200 chars and `content` reduced to a summary marked
14
+ `truncated: true`. Add `--detail full` whenever you need the whole `content`,
15
+ `form` or `settings` (always before a read-modify-write), and `--detail brief`
16
+ when you only want ids. `WJI_DETAIL=full` sets it for a whole session.
17
+
12
18
  ## Before anything else
13
19
 
14
20
  ```bash
@@ -94,7 +100,7 @@ wji ws fs # whole workspace tree
94
100
  wji ws fs --app <appId> # one app's tree
95
101
  wji fs tree <nodeId> --depth 2
96
102
  wji fs ls <folderId>
97
- wji fs get <nodeId> --json | jq .content
103
+ wji fs get <nodeId> --json --detail full | jq .content # --detail full: the summary is not the content
98
104
 
99
105
  wji fs mkdir <parentId> characters --nickname 角色
100
106
  wji dataset new <folderId> "Ada" -t character -d "a tired detective"
@@ -211,6 +217,25 @@ balanced default; **Seedance 2.0 Fast / MiniMax H3 Max** for drafts, tests and
211
217
  large batches. The ranking is a guide — quote the real number from
212
218
  `wji gen cost` / `wji canvas gen` before spending.
213
219
 
220
+ **Uncensored (無審核) models.** Use these only when the user asks for
221
+ uncensored output or a censored model refused the content. They carry the
222
+ `uncensored` tag in `wji models list --json`, and their names end in
223
+ `-uncensored`. The Wan 3.0 family has a Ref and a first/last-frame variant of
224
+ each tier, like the censored Wan 3.0.
225
+
226
+ | Job | Model (`name`) | Inputs |
227
+ | --- | --- | --- |
228
+ | Video, Ref | `wan-3.0-ref-uncensored`, `wan-3.0-prime-ref-uncensored` (480p–1080p); `wan-3.0-pro-ref-uncensored`, `wan-3.0-prime-pro-ref-uncensored` (1080p / 2k / 4k) | ≤ 10 images + ≤ 5 videos + ≤ 5 audios, freely mixed (video/audio ≤ 15 s total) |
229
+ | Video, first/last frame | `wan-3.0-uncensored`, `wan-3.0-prime-uncensored`, `wan-3.0-pro-uncensored`, `wan-3.0-prime-pro-uncensored` | text only, or start and/or end image; 2–30 s |
230
+ | Image → video | `wan-2.7-i2v-uncensored` (720p/1080p, 2–15 s; optional 1 driving audio for lip-sync via `--ref-audio`), `wan-2.2-i2v-uncensored` (cheapest; 480p/720p, 5 or 8 s, optional end frame) | start image |
231
+ | Animate a character | `wan-animate-uncensored` (`--set mode=animate\|replace`) | exactly 1 image + 1 video; output is as long as the video |
232
+ | Text → image | `z-image-uncensored` (long edge ≤ 1536), `z-image-pro-uncensored` (≤ 2560, `--set long_edge=`) | prompt + ratio |
233
+ | Edit an image | `qwen-image-edit-uncensored` | 1–3 images: the **first** is the image to edit |
234
+ | Face / head swap | `face-swap-uncensored`, `head-swap-uncensored` | exactly 2 images, **order matters**: 1st = target picture, 2nd = the face / head to put on it |
235
+ | Video upscale | `flashvsr-uncensored` (`--set resolution=720p\|1080p\|2k\|4k`) | 1 MP4 ≤ 120 s; billed per input second |
236
+
237
+ "Prime" variants are faster and cost more; "Pro" variants output 1080p–4K.
238
+
214
239
  ### Limits (per account)
215
240
 
216
241
  | Limit | Value | When exceeded |
@@ -248,7 +273,7 @@ headshot and sheet as image references and the voice as an audio reference to
248
273
  a Ref model.
249
274
 
250
275
  ```bash
251
- wji fs get <datasetId> --scope full --json | jq '{images: [.images[]? | {id, type}], icon, primaryAudio}'
276
+ wji fs get <datasetId> --json --detail full | jq '{images: [.images[]? | {id, type}], icon, primaryAudio}'
252
277
  wji fs set <datasetId> --add-images <headshot> <sheet> <voice> --icon <headshot> --set primaryAudio=<voice>
253
278
  ```
254
279
 
@@ -549,6 +574,9 @@ wji org list && wji org use <orgId>
549
574
  - **Lists are paginated.** `--limit` is capped at 100; `--limit -1` returns at
550
575
  most 500 on most endpoints. Page with `--page` instead of assuming you got
551
576
  everything.
577
+ - **Lists are trimmed.** `--json` is the `standard` level; read `content`,
578
+ `form` or `settings` with `--detail full`, and never write back a `content`
579
+ that carries `truncated: true`.
552
580
  - **Report failures honestly.** A failed generation surfaces as a non-zero exit
553
581
  with the provider's message — pass it on rather than retrying silently.
554
582
 
@@ -10,7 +10,8 @@ Global flags (accepted before any subcommand):
10
10
  | `--org <orgId>` | organization context (`X-Org-Id`) |
11
11
  | `--no-org` | force personal context for this call |
12
12
  | `--locale <locale>` | response language: `cht`, `chs`, `en` |
13
- | `--json` | print the raw API response instead of tables |
13
+ | `--json` | print JSON instead of tables (`standard` detail unless `--detail` is given) |
14
+ | `--detail <level>` | `brief` / `standard` / `full` for list and get reads; `full` is the raw API response. Env `WJI_DETAIL` |
14
15
 
15
16
  Value conventions: `@file` reads a file, `-` reads stdin, `--set key=value`
16
17
  repeats and nests on dots, references are `assetId[:label[:weight]]`.
@@ -64,8 +65,8 @@ switch endpoint.
64
65
 
65
66
  | Command | API |
66
67
  | --- | --- |
67
- | `ws list [-k keyword] [-s all\|me\|shared\|favorite] [--page] [--limit]` | `GET /workspace/search` — `--limit` max 100, `-1` returns at most 500 |
68
- | `ws get [id]` | `GET /workspace/list/:id` |
68
+ | `ws list [-k keyword] [-s all\|me\|shared\|favorite] [--page] [--limit]` | `GET /workspace/search` — `--limit` max 100, `-1` returns at most 500; sends `detail` |
69
+ | `ws get [id]` | `GET /workspace/list/:id` — sends `detail` (`settings` and full members need `--detail full`) |
69
70
  | `ws use <id>` | stores the default workspace locally |
70
71
  | `ws create <name> [-d] [-r ratio] [-l lang] [-t type] [-a app...] [--no-apps]` | `POST /workspace/create` — without `-a` the workspace gets the default template `dataset datasetimagegeneration canvas`; `--no-apps` creates it empty (the API itself adds nothing) |
71
72
  | `ws update [id] [-n] [-d] [-r] [-l] [--set]` | `PUT /workspace/list/:id` |
@@ -96,10 +97,10 @@ Restriction from the backend: `Dataset`, `Draw`, `DatasetImageGeneration` and
96
97
 
97
98
  | Command | API |
98
99
  | --- | --- |
99
- | `fs root [key] [-d depth]` | `GET /fsnode/root[/:key]` — key defaults to your drive; pass a workspace id for its root |
100
- | `fs ls <id> [--limit] [--scope]` | `GET /fsnode/list/:id/children` |
101
- | `fs tree <id> [-d depth]` | `GET /fsnode/list/:id/tree` |
102
- | `fs get <id> [--scope]` | `GET /fsnode/list/:id` (comma-separated ids allowed) |
100
+ | `fs root [key] [-d depth]` | `GET /fsnode/root[/:key]` — key defaults to your drive; pass a workspace id for its root; sends `detail` |
101
+ | `fs ls <id> [--limit] [--scope]` | `GET /fsnode/list/:id/children` — sends `detail`; at `standard` each `content` is a summary |
102
+ | `fs tree <id> [-d depth]` | `GET /fsnode/list/:id/tree` — sends `detail` |
103
+ | `fs get <id> [--scope]` | `GET /fsnode/list/:id` (comma-separated ids allowed) — sends `detail`; `--detail full` for the whole `content` |
103
104
  | `fs path <id>` | `GET /fsnode/list/:id/path` |
104
105
  | `fs mkdir <parent> <name> [--nickname] [--content]` | `POST /fsnode/create` type=folder |
105
106
  | `fs touch <parent> <name> [--mimetype] [--asset] [--content]` | `POST /fsnode/create` type=file |
@@ -118,7 +119,7 @@ characters, nicknames at 200, and `fs batch` at 100 items per call.
118
119
  | Command | Notes |
119
120
  | --- | --- |
120
121
  | `dataset new <parent> <name> [-t type] [-d description] [--images] [--nickname]` | creates an fsnode with mimetype `workspace/dataset` |
121
- | `dataset list <folderId>` | dataset nodes in a folder |
122
+ | `dataset list <folderId>` | dataset nodes in a folder (sends `detail`) |
122
123
  | `dataset get <key>` | `GET /dataset/list/:key` (vector-store record) |
123
124
  | `dataset rm <key> [-y]` | `DELETE /dataset/list/:key` |
124
125
 
@@ -150,6 +151,11 @@ Model parameters worth knowing (`--set`, see `wji models get`):
150
151
  `gpt-image-2.5-*` `background=transparent` returns a PNG with alpha;
151
152
  `bytedance-seedream-5-pro` `layer_decomposition=true` splits one reference
152
153
  image into separate PNG layer assets (exactly 1 reference, `size=1K|2K`).
154
+ `face-swap-uncensored` / `head-swap-uncensored` take exactly 2 references in
155
+ order (target picture, then the face / head); `qwen-image-edit-uncensored`
156
+ edits the first reference; `z-image-*-uncensored` `long_edge=<px>`;
157
+ `wan-animate-uncensored` `mode=animate|replace`; `flashvsr-uncensored`
158
+ `resolution=720p|1080p|2k|4k`.
153
159
 
154
160
  Uploads of `.html`, `.xhtml`, `.svg`, `.js` and `.xml` are stored as
155
161
  `application/octet-stream` with `Content-Disposition: attachment`.
@@ -171,7 +177,7 @@ updates live.
171
177
  | `canvas copy [nodeIds...] --to <canvasIds...> [-c] [--selected] [--at x,y] [--same-position] [-y]` | the canvas's own copy-paste: new nodes (no position, `generate.historyId/pendingAssetId` dropped, finished asset shared via `file`), edges among them re-created oldest first so `@image1…` numbering holds, color tags kept and a missing label carried to the target. Edges from nodes outside the copy are left out. Default placement: right of what is already on the target |
172
178
  | `canvas nodes [-c] [-k kind] [-n regex] [--tag tags…\|--untagged]` | `GET /fsnode/list/:canvasId/children?limit=-1` + `POST /assets/check-status`. `-n` matches the node name as a case-insensitive regex (`/re/flags` to set flags yourself). `--tag` takes a label (`C01`, case-insensitive), a color (`red`) or a color id (`rose`); several values match any. Filters combine (AND) |
173
179
  | `canvas tags [-c] [-a]` | the canvas's color tags: color, label, node count (`-a` also unused, unlabelled colors) |
174
- | `canvas get <nodeId> [-c]` | same load; one node with references (`@image1 ← id`) and frame slots |
180
+ | `canvas get <nodeId> [-c]` | same load; one node with references (`@image1 ← id`) and frame slots. Canvas commands always load the full canvas; `--detail` trims only the JSON they print (`standard` clips `text` / `generate.prompt` and drops `generate.values`) |
175
181
  | `canvas edges [-c] [--node]` | the `canvas/edge` children |
176
182
  | `canvas add <kind> [-c] [-n] [-t\|--text-file] [--plain] [--size w,h] [--asset] [--dataset] [-p\|--prompt-file] [-m] [-r] [--resolution] [-d] [--set] [--from ids…] [--at x,y]` | `POST /fsnode/create` (`canvas/node/<kind>`), then one `canvas/edge` per `--from`. Kinds: text, title, comment, image, video, audio, dataset. `add dataset --dataset <fsnodeId>` writes `content {datasetId, datasetName, datasetType, datasetParentName, description}` from the dataset node (must be `workspace/dataset`); it takes no `--from`. Text kinds are Markdown on the web; `--plain` turns every single line break into a Markdown hard break (`" \n"`, fenced code untouched), and without it the CLI warns when a single break would be joined. `--size` writes `content.width/height` |
177
183
  | `canvas set <nodeId> [-c] [-n] [-t\|--text-file] [--plain] [--move x,y] [--size w,h] [-p] [-m] [-r] [--resolution] [-d] [--set]` | read → merge → `PATCH /fsnode/list/:id` with `contentPatch` of only the top-level keys that changed, so a concurrent browser edit of another key survives (falls back to a whole-content write on a backend without `contentPatch`) |
@@ -320,7 +326,7 @@ parameters are range-checked against the model's `min`/`max`.
320
326
  ## history
321
327
 
322
328
  `history list [-w] [--mode image|video|audio] [--fsnode] [--scope] [--scope-id] [--tags] [--bookmarked]` →
323
- `GET /ai/assets/history/search`
329
+ `GET /ai/assets/history/search` (sends `detail`; `standard` clips `prompt` and summarises `form`)
324
330
 
325
331
  `history get <id> [--wait] [--timeout] [--interval]` ·
326
332
  `history bookmark <id> [--off]` · `history rm <id> [-y]` ·
@@ -329,12 +335,15 @@ parameters are range-checked against the model's `min`/`max`.
329
335
  ## models
330
336
 
331
337
  `models list [-f feature...] [-w] [-k keyword] [--all]` →
332
- `GET /ai/model/list/:features`
338
+ `GET /ai/model/list/:features` (sends `detail`; at `standard` the `form` keeps
339
+ only ratios, batch, reference caps and `other` options — `--detail full` for the
340
+ whole schema)
333
341
 
334
342
  The endpoint matches with `features.some(...)`, so an empty feature list returns
335
343
  nothing; with no `-f` the CLI asks for every feature instead.
336
344
 
337
- The response is a curated view — no `id`, `rate`, `tags` or `protocol` — and it
345
+ The response is a curated view — no `id`, `rate` or `protocol` (`tags` is
346
+ included; uncensored models carry `uncensored`) — and it
338
347
  is de-duplicated by **`nickname`**, which is therefore the unique selector.
339
348
  `name` is not unique (`seedance-2.0` exists twice under different providers).
340
349
  Pass the `MODEL` column (the nickname) to `-m`.
@@ -467,6 +476,12 @@ Pass `null` to clear a nullable field. Password minimum is 6 characters.
467
476
  asset carrying `error` is also a failure.
468
477
  - Some GETs are cached per user for 10s, keyed on the full URL including the
469
478
  query string.
479
+ - Workspace, fsnode, model and history reads accept `?detail=brief|standard|full`.
480
+ The API defaults to `full` (the website relies on it); the CLI sends the
481
+ `--detail` value, or `standard` under `--json`. `standard` clips long text to
482
+ 200 chars, turns media into `{id, url, thumbnail, status, …}` and reduces an
483
+ fsnode `content` to a summary carrying `truncated: true`; never PATCH such a
484
+ summary back.
470
485
  - Paginated endpoints return `{ data, pagination: { total, page, limit, next,
471
486
  hasNext, hasPrev, totalPages } }`. An explicit `limit` is capped at **100**.
472
487
  `limit: -1` returns everything only on endpoints that opt in (`fs ls` does);