@rolino/cli 0.2.0 → 0.4.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/CHANGELOG.md +28 -0
- package/README.md +80 -61
- package/dist/bin.cjs +30 -14
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +1 -1
- package/dist/{chunk-2B34YBKX.js → chunk-VQOMONSS.js} +32 -15
- package/dist/chunk-VQOMONSS.js.map +1 -0
- package/dist/index.cjs +30 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +4 -4
- package/dist/chunk-2B34YBKX.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @rolino/cli
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 6d5cefc: Add LinkedIn native video capability, limits, and delivery-options parity across public agent surfaces.
|
|
8
|
+
- 4149259: Add platform-aware media-adjustment readiness actions and align LinkedIn publishing guidance across agent packages.
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- Updated dependencies [6d5cefc]
|
|
13
|
+
- Updated dependencies [4149259]
|
|
14
|
+
- @rolino/contracts@0.4.0
|
|
15
|
+
- @rolino/sdk@0.4.0
|
|
16
|
+
- @rolino/local-auth@0.4.0
|
|
17
|
+
|
|
18
|
+
## 0.3.0
|
|
19
|
+
|
|
20
|
+
### Minor Changes
|
|
21
|
+
|
|
22
|
+
- 5267911: Add LinkedIn member publishing as a gated provider across public contracts, SDK, CLI, and MCP workflows.
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- Updated dependencies [5267911]
|
|
27
|
+
- @rolino/contracts@0.3.0
|
|
28
|
+
- @rolino/sdk@0.3.0
|
|
29
|
+
- @rolino/local-auth@0.3.0
|
|
30
|
+
|
|
3
31
|
## 0.2.0
|
|
4
32
|
|
|
5
33
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -6,9 +6,9 @@ Network requests go through `@rolino/sdk`, which uses the Node.js native
|
|
|
6
6
|
`fetch` implementation; the CLI does not depend on Axios or another HTTP
|
|
7
7
|
client package.
|
|
8
8
|
|
|
9
|
-
## Installation
|
|
10
|
-
|
|
11
|
-
The supported installation keeps the CLI independent from MCP:
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
The supported installation keeps the CLI independent from MCP:
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
14
|
npm install --global @rolino/cli
|
|
@@ -36,20 +36,20 @@ rolino setup mcp --client claude-code [--scope user|project]
|
|
|
36
36
|
rolino whoami
|
|
37
37
|
rolino projects create --name NAME [--type PRODUCT|SERVICE|PERSONAL|COMPANY] [--website URL] [--description TEXT] [--idempotency-key KEY] --yes
|
|
38
38
|
rolino projects list [--limit 50] [--cursor ID]
|
|
39
|
-
rolino projects show PROJECT_ID
|
|
40
|
-
rolino media list --project PROJECT_ID [--type IMAGE|VIDEO] [--query TEXT] [--limit 50] [--cursor ID]
|
|
41
|
-
rolino media upload FILE_PATH --project PROJECT_ID --yes
|
|
42
|
-
rolino posts create --project PROJECT_ID --caption TEXT [--platform INSTAGRAM|TIKTOK|YOUTUBE|BLUESKY] [--media ASSET_ID] --yes
|
|
43
|
-
rolino posts update POST_ID --project PROJECT_ID --expected-version VERSION [--caption TEXT] [--platform INSTAGRAM|TIKTOK|YOUTUBE|BLUESKY] [--media ASSET_ID] [--clear-platforms] [--clear-media] --yes
|
|
39
|
+
rolino projects show PROJECT_ID
|
|
40
|
+
rolino media list --project PROJECT_ID [--type IMAGE|VIDEO] [--query TEXT] [--limit 50] [--cursor ID]
|
|
41
|
+
rolino media upload FILE_PATH --project PROJECT_ID --yes
|
|
42
|
+
rolino posts create --project PROJECT_ID --caption TEXT [--platform INSTAGRAM|TIKTOK|YOUTUBE|BLUESKY|LINKEDIN] [--media ASSET_ID] --yes
|
|
43
|
+
rolino posts update POST_ID --project PROJECT_ID --expected-version VERSION [--caption TEXT] [--platform INSTAGRAM|TIKTOK|YOUTUBE|BLUESKY|LINKEDIN] [--media ASSET_ID] [--clear-platforms] [--clear-media] --yes
|
|
44
44
|
rolino posts list --project PROJECT_ID [--limit 50] [--cursor ID] [--status STATUS]
|
|
45
45
|
rolino posts show POST_ID --project PROJECT_ID
|
|
46
46
|
rolino posts readiness POST_ID --project PROJECT_ID
|
|
47
47
|
rolino posts schedule preview POST_ID --project PROJECT_ID --expected-version VERSION --at ISO_DATE --timezone IANA_TIMEZONE
|
|
48
48
|
rolino posts schedule execute POST_ID --project PROJECT_ID --expected-version VERSION --at ISO_DATE --timezone IANA_TIMEZONE --confirmation-token TOKEN [--idempotency-key KEY]
|
|
49
|
-
rolino posts publish preview POST_ID --project PROJECT_ID --expected-version VERSION --platform INSTAGRAM|TIKTOK|YOUTUBE|BLUESKY
|
|
50
|
-
rolino posts publish execute POST_ID --project PROJECT_ID --expected-version VERSION --platform INSTAGRAM|TIKTOK|YOUTUBE|BLUESKY --confirmation-token TOKEN [--idempotency-key KEY]
|
|
51
|
-
rolino integrations health --project PROJECT_ID
|
|
52
|
-
rolino integrations delivery-options --project PROJECT_ID --provider TIKTOK
|
|
49
|
+
rolino posts publish preview POST_ID --project PROJECT_ID --expected-version VERSION --platform INSTAGRAM|TIKTOK|YOUTUBE|BLUESKY|LINKEDIN
|
|
50
|
+
rolino posts publish execute POST_ID --project PROJECT_ID --expected-version VERSION --platform INSTAGRAM|TIKTOK|YOUTUBE|BLUESKY|LINKEDIN --confirmation-token TOKEN [--idempotency-key KEY]
|
|
51
|
+
rolino integrations health --project PROJECT_ID
|
|
52
|
+
rolino integrations delivery-options --project PROJECT_ID --provider TIKTOK|LINKEDIN
|
|
53
53
|
rolino calendar list --project PROJECT_ID [--from ISO_DATE --to ISO_DATE] [--limit 50] [--cursor CURSOR]
|
|
54
54
|
rolino doctor
|
|
55
55
|
```
|
|
@@ -79,21 +79,21 @@ directory. Existing file-backed configuration is backed up with a
|
|
|
79
79
|
`.rolino-backup` suffix. Use `--dry-run` to preview in scripts and `--yes` to
|
|
80
80
|
provide explicit non-interactive consent; `--agent` never implies consent.
|
|
81
81
|
|
|
82
|
-
Draft creation and update never schedule or publish. Updates change only the
|
|
83
|
-
fields supplied; omitted media, destinations, captions, and provider settings
|
|
84
|
-
are preserved. Both require interactive
|
|
82
|
+
Draft creation and update never schedule or publish. Updates change only the
|
|
83
|
+
fields supplied; omitted media, destinations, captions, and provider settings
|
|
84
|
+
are preserved. Both require interactive
|
|
85
85
|
confirmation or `--yes`; non-interactive and agent-mode calls fail before an
|
|
86
86
|
HTTP request unless `--yes` is present. Retries use `--idempotency-key` (the
|
|
87
87
|
request ID by default), and updates require the current `--expected-version`
|
|
88
|
-
shown by `posts show` so stale automation cannot overwrite a newer edit.
|
|
89
|
-
|
|
90
|
-
Media uploads use the deployment's existing local, S3-compatible, or
|
|
91
|
-
Cloudflare R2 storage. The CLI validates the local file, requests a short-lived
|
|
92
|
-
signed upload, streams the file directly to storage, and registers the reusable
|
|
93
|
-
asset only after the stored size and content type match. Rolino derives image
|
|
94
|
-
dimensions and video duration from bounded reads of the stored object rather
|
|
95
|
-
than trusting caller metadata. Uploading requires
|
|
96
|
-
interactive confirmation or `--yes` and never creates or schedules a post.
|
|
88
|
+
shown by `posts show` so stale automation cannot overwrite a newer edit.
|
|
89
|
+
|
|
90
|
+
Media uploads use the deployment's existing local, S3-compatible, or
|
|
91
|
+
Cloudflare R2 storage. The CLI validates the local file, requests a short-lived
|
|
92
|
+
signed upload, streams the file directly to storage, and registers the reusable
|
|
93
|
+
asset only after the stored size and content type match. Rolino derives image
|
|
94
|
+
dimensions and video duration from bounded reads of the stored object rather
|
|
95
|
+
than trusting caller metadata. Uploading requires
|
|
96
|
+
interactive confirmation or `--yes` and never creates or schedules a post.
|
|
97
97
|
|
|
98
98
|
YouTube drafts require exactly one stored video and explicit settings. Supply
|
|
99
99
|
`--youtube-title`, `--youtube-category-id`, `--youtube-privacy`, and
|
|
@@ -106,34 +106,52 @@ description; otherwise Rolino uses the shared caption. For example:
|
|
|
106
106
|
rolino posts create --project PROJECT_ID --caption "Launch description" --platform YOUTUBE --media VIDEO_ASSET_ID --youtube-title "Launch video" --youtube-category-id 22 --youtube-privacy PRIVATE --youtube-made-for-kids no --youtube-tag launch --yes
|
|
107
107
|
```
|
|
108
108
|
|
|
109
|
-
Google may restrict uploads from unaudited API projects to Private. Rolino does
|
|
110
|
-
not infer audit approval from configuration. A scheduled YouTube post must
|
|
111
|
-
target Public; confirmed scheduling starts its private resumable upload
|
|
112
|
-
immediately so processing can finish before the target time.
|
|
113
|
-
|
|
114
|
-
TikTok drafts require account-specific choices. Refresh them immediately before
|
|
115
|
-
preparing the draft:
|
|
116
|
-
|
|
117
|
-
```text
|
|
118
|
-
rolino integrations delivery-options --project PROJECT_ID --provider TIKTOK
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
For direct publishing, pass the exact returned visibility and explicit yes/no
|
|
122
|
-
choices for comments, duet, stitch, commercial content, own-brand promotion,
|
|
123
|
-
third-party promotion, and AI-generated content. Use `--tiktok-mode inbox` for
|
|
124
|
-
a mobile inbox handoff. Add `--tiktok-settings-reviewed` only after reviewing
|
|
125
|
-
those fresh choices; it is deliberately separate from `--yes`, which confirms
|
|
126
|
-
the Rolino draft write. Editing TikTok caption, media, destinations, or its
|
|
127
|
-
override clears the prior settings review.
|
|
128
|
-
|
|
129
|
-
Bluesky drafts can be text-only or include up to four stored JPEG, PNG, or WebP
|
|
130
|
-
images. Use `--bluesky-caption` for a destination-specific override of up to
|
|
131
|
-
300 graphemes:
|
|
132
|
-
|
|
133
|
-
```text
|
|
134
|
-
rolino posts create --project PROJECT_ID --caption "Shared launch" --platform BLUESKY --bluesky-caption "Launch day 🦋" --yes
|
|
135
|
-
```
|
|
136
|
-
|
|
109
|
+
Google may restrict uploads from unaudited API projects to Private. Rolino does
|
|
110
|
+
not infer audit approval from configuration. A scheduled YouTube post must
|
|
111
|
+
target Public; confirmed scheduling starts its private resumable upload
|
|
112
|
+
immediately so processing can finish before the target time.
|
|
113
|
+
|
|
114
|
+
TikTok drafts require account-specific choices. Refresh them immediately before
|
|
115
|
+
preparing the draft:
|
|
116
|
+
|
|
117
|
+
```text
|
|
118
|
+
rolino integrations delivery-options --project PROJECT_ID --provider TIKTOK
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
For direct publishing, pass the exact returned visibility and explicit yes/no
|
|
122
|
+
choices for comments, duet, stitch, commercial content, own-brand promotion,
|
|
123
|
+
third-party promotion, and AI-generated content. Use `--tiktok-mode inbox` for
|
|
124
|
+
a mobile inbox handoff. Add `--tiktok-settings-reviewed` only after reviewing
|
|
125
|
+
those fresh choices; it is deliberately separate from `--yes`, which confirms
|
|
126
|
+
the Rolino draft write. Editing TikTok caption, media, destinations, or its
|
|
127
|
+
override clears the prior settings review.
|
|
128
|
+
|
|
129
|
+
Bluesky drafts can be text-only or include up to four stored JPEG, PNG, or WebP
|
|
130
|
+
images. Use `--bluesky-caption` for a destination-specific override of up to
|
|
131
|
+
300 graphemes:
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
rolino posts create --project PROJECT_ID --caption "Shared launch" --platform BLUESKY --bluesky-caption "Launch day 🦋" --yes
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
LinkedIn drafts can be text-only, include up to ten stored JPEG/PNG images, or
|
|
138
|
+
contain exactly one stored MP4 without mixing images and video. Native video
|
|
139
|
+
must be 75 KB to 500 MB and 3 seconds to 30 minutes. Refresh the connected
|
|
140
|
+
member and server policy before preparing the draft, and use
|
|
141
|
+
`--linkedin-caption` for a destination override:
|
|
142
|
+
|
|
143
|
+
```text
|
|
144
|
+
rolino integrations delivery-options --project PROJECT_ID --provider LINKEDIN
|
|
145
|
+
rolino posts create --project PROJECT_ID --caption "Shared launch" --platform LINKEDIN --linkedin-caption "Launch day for our LinkedIn network" --media IMAGE_ASSET_ID --yes
|
|
146
|
+
rolino posts create --project PROJECT_ID --caption "Product demo" --platform LINKEDIN --media VIDEO_ASSET_ID --yes
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The connected OAuth member is the author; the developer app's associated
|
|
150
|
+
Company Page is not a publishing target. Native video publish and schedule
|
|
151
|
+
execution remains in preparation until LinkedIn confirms upload and processing.
|
|
152
|
+
If final post creation has an unknown outcome, inspect that member's LinkedIn
|
|
153
|
+
feed before retrying.
|
|
154
|
+
|
|
137
155
|
Project creation also requires interactive confirmation or `--yes`. It
|
|
138
156
|
atomically saves a project and its paired brand, but does not start research,
|
|
139
157
|
connect accounts, schedule posts, or publish. A fresh CLI invocation generates
|
|
@@ -167,13 +185,14 @@ arguments. YouTube remains `PREPARING` while its resumable upload and provider
|
|
|
167
185
|
processing are incomplete; only provider-confirmed visibility becomes
|
|
168
186
|
published.
|
|
169
187
|
|
|
170
|
-
The CLI cannot enable YouTube or
|
|
171
|
-
Those are server-side deployment controls. Self-hosted operators should
|
|
172
|
-
complete the
|
|
173
|
-
[YouTube operations guide](https://github.com/deifos/rolino/blob/main/docs/integrations/youtube.md)
|
|
174
|
-
and
|
|
175
|
-
[Bluesky operations guide](https://github.com/deifos/rolino/blob/main/docs/integrations/bluesky.md)
|
|
176
|
-
|
|
188
|
+
The CLI cannot enable YouTube, Bluesky, or LinkedIn, or infer provider approval.
|
|
189
|
+
Those are server-side deployment controls. Self-hosted operators should
|
|
190
|
+
complete the
|
|
191
|
+
[YouTube operations guide](https://github.com/deifos/rolino/blob/main/docs/integrations/youtube.md)
|
|
192
|
+
and
|
|
193
|
+
[Bluesky operations guide](https://github.com/deifos/rolino/blob/main/docs/integrations/bluesky.md), and
|
|
194
|
+
[LinkedIn operations guide](https://github.com/deifos/rolino/blob/main/docs/integrations/linkedin.md)
|
|
195
|
+
before live testing.
|
|
177
196
|
|
|
178
197
|
Configuration is read from `ROLINO_URL`, `ROLINO_TOKEN`, `ROLINO_CONFIG_DIR`,
|
|
179
198
|
`ROLINO_OUTPUT`, `ROLINO_TIMEOUT`, and the short-lived
|
|
@@ -203,8 +222,8 @@ Stable exit codes:
|
|
|
203
222
|
|
|
204
223
|
## Support, security, and license
|
|
205
224
|
|
|
206
|
-
Stable releases are published only after the maintainer approves the release
|
|
207
|
-
gate. Report bugs through the
|
|
225
|
+
Stable releases are published only after the maintainer approves the release
|
|
226
|
+
gate. Report bugs through the
|
|
208
227
|
[Rolino issue tracker](https://github.com/deifos/rolino/issues) and security
|
|
209
228
|
issues through the repository's
|
|
210
229
|
[security policy](https://github.com/deifos/rolino/security/policy).
|
package/dist/bin.cjs
CHANGED
|
@@ -34,7 +34,7 @@ var import_commander = require("commander");
|
|
|
34
34
|
// package.json
|
|
35
35
|
var package_default = {
|
|
36
36
|
name: "@rolino/cli",
|
|
37
|
-
version: "0.
|
|
37
|
+
version: "0.4.0",
|
|
38
38
|
description: "Agent-friendly command-line interface for Rolino",
|
|
39
39
|
type: "module",
|
|
40
40
|
license: "MIT",
|
|
@@ -91,9 +91,9 @@ var package_default = {
|
|
|
91
91
|
dev: "tsx src/bin.ts"
|
|
92
92
|
},
|
|
93
93
|
dependencies: {
|
|
94
|
-
"@rolino/contracts": "0.
|
|
95
|
-
"@rolino/local-auth": "0.
|
|
96
|
-
"@rolino/sdk": "0.
|
|
94
|
+
"@rolino/contracts": "0.4.0",
|
|
95
|
+
"@rolino/local-auth": "0.4.0",
|
|
96
|
+
"@rolino/sdk": "0.4.0",
|
|
97
97
|
commander: "^15.0.0",
|
|
98
98
|
open: "^11.0.0"
|
|
99
99
|
},
|
|
@@ -509,6 +509,15 @@ function formatProviderDeliveryOptions(options) {
|
|
|
509
509
|
`Interactions: comments ${options.interactions.comment.available ? "available" : "disabled"}, duet ${options.interactions.duet.available ? "available" : "disabled"}, stitch ${options.interactions.stitch.available ? "available" : "disabled"}`,
|
|
510
510
|
`Maximum video duration: ${options.maxVideoDurationMs === null ? "unknown" : `${options.maxVideoDurationMs} ms`}`
|
|
511
511
|
].join("\n");
|
|
512
|
+
case "LINKEDIN":
|
|
513
|
+
return [
|
|
514
|
+
`LinkedIn delivery options for ${options.account.displayName ?? "connected member"}`,
|
|
515
|
+
`Checked: ${options.checkedAt}`,
|
|
516
|
+
`Health: ${options.health.status} (${options.health.code}) ${options.health.message}`,
|
|
517
|
+
`Post types: ${options.supportedPostTypes.join(", ")}`,
|
|
518
|
+
`Images: up to ${options.image.maxItems}; ${options.image.mimeTypes.join(", ")}; under ${options.image.maxPixelsExclusive.toLocaleString()} pixels`,
|
|
519
|
+
`Video: one ${options.video.mimeTypes.join(", ")}; ${options.video.minDurationMs / 1e3}s to ${options.video.maxDurationMs / 6e4}m; ${options.video.minBytes.toLocaleString()} to ${options.video.maxBytes.toLocaleString()} bytes`
|
|
520
|
+
].join("\n");
|
|
512
521
|
}
|
|
513
522
|
}
|
|
514
523
|
function formatPostReadiness(readiness) {
|
|
@@ -857,6 +866,14 @@ function collectPublishingProvider(value, previous) {
|
|
|
857
866
|
function collectString(value, previous) {
|
|
858
867
|
return [...previous ?? [], value];
|
|
859
868
|
}
|
|
869
|
+
function deliveryOptionsProvider(value) {
|
|
870
|
+
const normalized = value.toUpperCase();
|
|
871
|
+
const parsed = import_contracts2.ProviderDeliveryOptionsProviderSchema.safeParse(normalized);
|
|
872
|
+
if (parsed.success) return parsed.data;
|
|
873
|
+
throw new import_commander.InvalidArgumentError(
|
|
874
|
+
`Provider must be one of ${import_contracts2.ProviderDeliveryOptionsProviderSchema.options.join(", ")}.`
|
|
875
|
+
);
|
|
876
|
+
}
|
|
860
877
|
function tiktokPostMode(value) {
|
|
861
878
|
const normalized = value.trim().toLowerCase();
|
|
862
879
|
if (normalized === "direct" || normalized === "direct_post") {
|
|
@@ -1489,7 +1506,7 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1489
1506
|
});
|
|
1490
1507
|
});
|
|
1491
1508
|
const posts = program.command("posts").description("Read and prepare posts in a Rolino project");
|
|
1492
|
-
posts.command("create").description("Create a draft post without scheduling or publishing it").requiredOption("--project <project-id>", "exact Rolino project ID").requiredOption("--caption <text>", "draft caption; use an empty string for media-only drafts").option("--platform <provider>", "INSTAGRAM, TIKTOK, YOUTUBE, or
|
|
1509
|
+
posts.command("create").description("Create a draft post without scheduling or publishing it").requiredOption("--project <project-id>", "exact Rolino project ID").requiredOption("--caption <text>", "draft caption; use an empty string for media-only drafts").option("--platform <provider>", "INSTAGRAM, TIKTOK, YOUTUBE, BLUESKY, or LINKEDIN; repeat as needed", collectPublishingProvider, []).option("--media <asset-id>", "existing project media asset ID; repeat for multiple", collectString, []).option("--instagram-caption <text>", "Instagram-specific caption override").option("--tiktok-caption <text>", "TikTok-specific caption override").option("--tiktok-mode <mode>", "direct publishing or inbox draft delivery", tiktokPostMode).option("--tiktok-visibility <value>", "exact visibility returned by integrations delivery-options").option("--tiktok-comments <yes|no>", "allow TikTok comments", yesOrNo).option("--tiktok-duet <yes|no>", "allow TikTok duets", yesOrNo).option("--tiktok-stitch <yes|no>", "allow TikTok stitches", yesOrNo).option("--tiktok-commercial-content <yes|no>", "declare commercial TikTok content", yesOrNo).option("--tiktok-promotes-own-brand <yes|no>", "declare own-brand promotion", yesOrNo).option("--tiktok-promotes-third-party <yes|no>", "declare third-party promotion", yesOrNo).option("--tiktok-ai-generated <yes|no>", "declare AI-generated TikTok content", yesOrNo).option("--tiktok-cover-timestamp-ms <number>", "video cover timestamp in milliseconds", nonnegativeInteger).option("--tiktok-settings-reviewed", "confirm the TikTok account choices were reviewed; separate from --yes").option("--youtube-caption <text>", "YouTube description override; otherwise the shared caption is used").option("--bluesky-caption <text>", "Bluesky-specific caption override; limited to 300 graphemes").option("--linkedin-caption <text>", "LinkedIn-specific caption override; limited to 3,000 characters").option("--youtube-title <text>", "required YouTube video title").option("--youtube-category-id <id>", "required numeric YouTube video category ID").option("--youtube-privacy <status>", "required PUBLIC, UNLISTED, or PRIVATE visibility", youtubePrivacy).option("--youtube-made-for-kids <yes|no>", "required explicit YouTube audience declaration", yesOrNo).option("--youtube-synthetic-media", "declare realistic altered or synthetic media to YouTube").option("--no-youtube-notify-subscribers", "disable eligible YouTube subscriber notifications").option("--youtube-tag <tag>", "YouTube tag; repeat as needed", collectString, []).option("--idempotency-key <key>", "stable retry key; defaults to the request ID").option("--yes", "confirm creation without an interactive prompt").action(async (local) => {
|
|
1493
1510
|
const global = program.opts();
|
|
1494
1511
|
commandExitCode = await execute({
|
|
1495
1512
|
command: "posts create",
|
|
@@ -1515,7 +1532,8 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1515
1532
|
...local.instagramCaption === void 0 ? {} : { INSTAGRAM: local.instagramCaption },
|
|
1516
1533
|
...local.tiktokCaption === void 0 ? {} : { TIKTOK: local.tiktokCaption },
|
|
1517
1534
|
...local.youtubeCaption === void 0 ? {} : { YOUTUBE: local.youtubeCaption },
|
|
1518
|
-
...local.blueskyCaption === void 0 ? {} : { BLUESKY: local.blueskyCaption }
|
|
1535
|
+
...local.blueskyCaption === void 0 ? {} : { BLUESKY: local.blueskyCaption },
|
|
1536
|
+
...local.linkedinCaption === void 0 ? {} : { LINKEDIN: local.linkedinCaption }
|
|
1519
1537
|
},
|
|
1520
1538
|
tiktokSettings: tiktokSettings(local) ?? null,
|
|
1521
1539
|
youtubeSettings: youtubeSettings(local)
|
|
@@ -1533,7 +1551,7 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1533
1551
|
}
|
|
1534
1552
|
});
|
|
1535
1553
|
});
|
|
1536
|
-
posts.command("update").description("Update selected draft fields using optimistic concurrency").argument("<post-id>").requiredOption("--project <project-id>", "exact Rolino project ID").requiredOption("--expected-version <number>", "current post version from posts show", positiveInteger).option("--caption <text>", "replacement draft caption; omitted fields are preserved").option("--platform <provider>", "replacement destinations; repeat as needed", collectPublishingProvider).option("--clear-platforms", "remove every draft destination").option("--media <asset-id>", "replacement media asset ID; repeat for multiple", collectString).option("--clear-media", "remove every media asset from the draft").option("--instagram-caption <text>", "Instagram-specific caption override").option("--tiktok-caption <text>", "TikTok-specific caption override").option("--tiktok-mode <mode>", "direct publishing or inbox draft delivery", tiktokPostMode).option("--tiktok-visibility <value>", "exact visibility returned by integrations delivery-options").option("--tiktok-comments <yes|no>", "allow TikTok comments", yesOrNo).option("--tiktok-duet <yes|no>", "allow TikTok duets", yesOrNo).option("--tiktok-stitch <yes|no>", "allow TikTok stitches", yesOrNo).option("--tiktok-commercial-content <yes|no>", "declare commercial TikTok content", yesOrNo).option("--tiktok-promotes-own-brand <yes|no>", "declare own-brand promotion", yesOrNo).option("--tiktok-promotes-third-party <yes|no>", "declare third-party promotion", yesOrNo).option("--tiktok-ai-generated <yes|no>", "declare AI-generated TikTok content", yesOrNo).option("--tiktok-cover-timestamp-ms <number>", "video cover timestamp in milliseconds", nonnegativeInteger).option("--tiktok-settings-reviewed", "confirm the TikTok account choices were reviewed; separate from --yes").option("--youtube-caption <text>", "YouTube description override; otherwise the shared caption is used").option("--bluesky-caption <text>", "Bluesky-specific caption override; limited to 300 graphemes").option("--youtube-title <text>", "required YouTube video title").option("--youtube-category-id <id>", "required numeric YouTube video category ID").option("--youtube-privacy <status>", "required PUBLIC, UNLISTED, or PRIVATE visibility", youtubePrivacy).option("--youtube-made-for-kids <yes|no>", "required explicit YouTube audience declaration", yesOrNo).option("--youtube-synthetic-media", "declare realistic altered or synthetic media to YouTube").option("--no-youtube-notify-subscribers", "disable eligible YouTube subscriber notifications").option("--youtube-tag <tag>", "replacement YouTube tag; repeat as needed", collectString).option("--idempotency-key <key>", "stable retry key; defaults to the request ID").option("--yes", "confirm the update without an interactive prompt").action(async (postId, local) => {
|
|
1554
|
+
posts.command("update").description("Update selected draft fields using optimistic concurrency").argument("<post-id>").requiredOption("--project <project-id>", "exact Rolino project ID").requiredOption("--expected-version <number>", "current post version from posts show", positiveInteger).option("--caption <text>", "replacement draft caption; omitted fields are preserved").option("--platform <provider>", "replacement destinations; repeat as needed", collectPublishingProvider).option("--clear-platforms", "remove every draft destination").option("--media <asset-id>", "replacement media asset ID; repeat for multiple", collectString).option("--clear-media", "remove every media asset from the draft").option("--instagram-caption <text>", "Instagram-specific caption override").option("--tiktok-caption <text>", "TikTok-specific caption override").option("--tiktok-mode <mode>", "direct publishing or inbox draft delivery", tiktokPostMode).option("--tiktok-visibility <value>", "exact visibility returned by integrations delivery-options").option("--tiktok-comments <yes|no>", "allow TikTok comments", yesOrNo).option("--tiktok-duet <yes|no>", "allow TikTok duets", yesOrNo).option("--tiktok-stitch <yes|no>", "allow TikTok stitches", yesOrNo).option("--tiktok-commercial-content <yes|no>", "declare commercial TikTok content", yesOrNo).option("--tiktok-promotes-own-brand <yes|no>", "declare own-brand promotion", yesOrNo).option("--tiktok-promotes-third-party <yes|no>", "declare third-party promotion", yesOrNo).option("--tiktok-ai-generated <yes|no>", "declare AI-generated TikTok content", yesOrNo).option("--tiktok-cover-timestamp-ms <number>", "video cover timestamp in milliseconds", nonnegativeInteger).option("--tiktok-settings-reviewed", "confirm the TikTok account choices were reviewed; separate from --yes").option("--youtube-caption <text>", "YouTube description override; otherwise the shared caption is used").option("--bluesky-caption <text>", "Bluesky-specific caption override; limited to 300 graphemes").option("--linkedin-caption <text>", "LinkedIn-specific caption override; limited to 3,000 characters").option("--youtube-title <text>", "required YouTube video title").option("--youtube-category-id <id>", "required numeric YouTube video category ID").option("--youtube-privacy <status>", "required PUBLIC, UNLISTED, or PRIVATE visibility", youtubePrivacy).option("--youtube-made-for-kids <yes|no>", "required explicit YouTube audience declaration", yesOrNo).option("--youtube-synthetic-media", "declare realistic altered or synthetic media to YouTube").option("--no-youtube-notify-subscribers", "disable eligible YouTube subscriber notifications").option("--youtube-tag <tag>", "replacement YouTube tag; repeat as needed", collectString).option("--idempotency-key <key>", "stable retry key; defaults to the request ID").option("--yes", "confirm the update without an interactive prompt").action(async (postId, local) => {
|
|
1537
1555
|
const global = program.opts();
|
|
1538
1556
|
commandExitCode = await execute({
|
|
1539
1557
|
command: "posts update",
|
|
@@ -1561,7 +1579,8 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1561
1579
|
...local.instagramCaption === void 0 ? {} : { INSTAGRAM: local.instagramCaption },
|
|
1562
1580
|
...local.tiktokCaption === void 0 ? {} : { TIKTOK: local.tiktokCaption },
|
|
1563
1581
|
...local.youtubeCaption === void 0 ? {} : { YOUTUBE: local.youtubeCaption },
|
|
1564
|
-
...local.blueskyCaption === void 0 ? {} : { BLUESKY: local.blueskyCaption }
|
|
1582
|
+
...local.blueskyCaption === void 0 ? {} : { BLUESKY: local.blueskyCaption },
|
|
1583
|
+
...local.linkedinCaption === void 0 ? {} : { LINKEDIN: local.linkedinCaption }
|
|
1565
1584
|
};
|
|
1566
1585
|
const resolvedTikTokSettings = tiktokSettings(local);
|
|
1567
1586
|
const resolvedYouTubeSettings = youtubeSettings(local);
|
|
@@ -1709,7 +1728,7 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1709
1728
|
});
|
|
1710
1729
|
});
|
|
1711
1730
|
const publish = posts.command("publish").description("Preview and queue server-confirmed immediate publishing");
|
|
1712
|
-
publish.command("preview").description("Validate exact destinations and issue a five-minute confirmation").argument("<post-id>").requiredOption("--project <project-id>", "exact Rolino project ID").requiredOption("--expected-version <number>", "current post version from posts show", positiveInteger).requiredOption("--platform <provider>", "INSTAGRAM, TIKTOK, YOUTUBE, or
|
|
1731
|
+
publish.command("preview").description("Validate exact destinations and issue a five-minute confirmation").argument("<post-id>").requiredOption("--project <project-id>", "exact Rolino project ID").requiredOption("--expected-version <number>", "current post version from posts show", positiveInteger).requiredOption("--platform <provider>", "INSTAGRAM, TIKTOK, YOUTUBE, BLUESKY, or LINKEDIN; repeat as needed", collectPublishingProvider).action(async (postId, local) => {
|
|
1713
1732
|
const global = program.opts();
|
|
1714
1733
|
commandExitCode = await execute({
|
|
1715
1734
|
command: "posts publish preview",
|
|
@@ -1792,16 +1811,13 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1792
1811
|
}
|
|
1793
1812
|
});
|
|
1794
1813
|
});
|
|
1795
|
-
integrations.command("delivery-options").description("Refresh secret-safe creator delivery choices for one provider").requiredOption("--project <project-id>", "exact Rolino project ID").requiredOption("--provider <provider>", "publishing provider;
|
|
1814
|
+
integrations.command("delivery-options").description("Refresh secret-safe creator delivery choices for one provider").requiredOption("--project <project-id>", "exact Rolino project ID").requiredOption("--provider <provider>", "publishing provider; TIKTOK or LINKEDIN", deliveryOptionsProvider).action(async (local) => {
|
|
1796
1815
|
const global = program.opts();
|
|
1797
1816
|
commandExitCode = await execute({
|
|
1798
1817
|
command: "integrations delivery-options",
|
|
1799
1818
|
global,
|
|
1800
1819
|
runtime,
|
|
1801
1820
|
async action(context, client) {
|
|
1802
|
-
if (local.provider !== "TIKTOK") {
|
|
1803
|
-
throw new TypeError("Delivery options are currently available for TIKTOK.");
|
|
1804
|
-
}
|
|
1805
1821
|
const options = await client.integrations.deliveryOptions(
|
|
1806
1822
|
local.project,
|
|
1807
1823
|
local.provider,
|
|
@@ -1811,7 +1827,7 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1811
1827
|
context,
|
|
1812
1828
|
options,
|
|
1813
1829
|
formatProviderDeliveryOptions(options),
|
|
1814
|
-
[`rolino posts create --project ${local.project} --caption <text> --platform
|
|
1830
|
+
[`rolino posts create --project ${local.project} --caption <text> --platform ${local.provider} --agent --yes`]
|
|
1815
1831
|
);
|
|
1816
1832
|
}
|
|
1817
1833
|
});
|