@rolino/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/CHANGELOG.md +13 -0
- package/README.md +75 -61
- package/dist/bin.cjs +29 -14
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +1 -1
- package/dist/{chunk-2B34YBKX.js → chunk-7BCIIFUB.js} +31 -15
- package/dist/chunk-7BCIIFUB.js.map +1 -0
- package/dist/index.cjs +29 -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,18 @@
|
|
|
1
1
|
# @rolino/cli
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 5267911: Add LinkedIn member publishing as a gated provider across public contracts, SDK, CLI, and MCP workflows.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [5267911]
|
|
12
|
+
- @rolino/contracts@0.3.0
|
|
13
|
+
- @rolino/sdk@0.3.0
|
|
14
|
+
- @rolino/local-auth@0.3.0
|
|
15
|
+
|
|
3
16
|
## 0.2.0
|
|
4
17
|
|
|
5
18
|
### 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,47 @@ 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 or include up to ten stored JPEG/PNG images.
|
|
138
|
+
Refresh the connected member and server policy before preparing the draft, and
|
|
139
|
+
use `--linkedin-caption` for a destination override:
|
|
140
|
+
|
|
141
|
+
```text
|
|
142
|
+
rolino integrations delivery-options --project PROJECT_ID --provider LINKEDIN
|
|
143
|
+
rolino posts create --project PROJECT_ID --caption "Shared launch" --platform LINKEDIN --linkedin-caption "Launch day for our LinkedIn network" --media IMAGE_ASSET_ID --yes
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The connected OAuth member is the author; the developer app's associated
|
|
147
|
+
Company Page is not a publishing target. If final post creation has an unknown
|
|
148
|
+
outcome, inspect that member's LinkedIn feed before retrying.
|
|
149
|
+
|
|
137
150
|
Project creation also requires interactive confirmation or `--yes`. It
|
|
138
151
|
atomically saves a project and its paired brand, but does not start research,
|
|
139
152
|
connect accounts, schedule posts, or publish. A fresh CLI invocation generates
|
|
@@ -167,13 +180,14 @@ arguments. YouTube remains `PREPARING` while its resumable upload and provider
|
|
|
167
180
|
processing are incomplete; only provider-confirmed visibility becomes
|
|
168
181
|
published.
|
|
169
182
|
|
|
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
|
-
|
|
183
|
+
The CLI cannot enable YouTube, Bluesky, or LinkedIn, or infer provider approval.
|
|
184
|
+
Those are server-side deployment controls. Self-hosted operators should
|
|
185
|
+
complete the
|
|
186
|
+
[YouTube operations guide](https://github.com/deifos/rolino/blob/main/docs/integrations/youtube.md)
|
|
187
|
+
and
|
|
188
|
+
[Bluesky operations guide](https://github.com/deifos/rolino/blob/main/docs/integrations/bluesky.md), and
|
|
189
|
+
[LinkedIn operations guide](https://github.com/deifos/rolino/blob/main/docs/integrations/linkedin.md)
|
|
190
|
+
before live testing.
|
|
177
191
|
|
|
178
192
|
Configuration is read from `ROLINO_URL`, `ROLINO_TOKEN`, `ROLINO_CONFIG_DIR`,
|
|
179
193
|
`ROLINO_OUTPUT`, `ROLINO_TIMEOUT`, and the short-lived
|
|
@@ -203,8 +217,8 @@ Stable exit codes:
|
|
|
203
217
|
|
|
204
218
|
## Support, security, and license
|
|
205
219
|
|
|
206
|
-
Stable releases are published only after the maintainer approves the release
|
|
207
|
-
gate. Report bugs through the
|
|
220
|
+
Stable releases are published only after the maintainer approves the release
|
|
221
|
+
gate. Report bugs through the
|
|
208
222
|
[Rolino issue tracker](https://github.com/deifos/rolino/issues) and security
|
|
209
223
|
issues through the repository's
|
|
210
224
|
[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.3.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.3.0",
|
|
95
|
+
"@rolino/local-auth": "0.3.0",
|
|
96
|
+
"@rolino/sdk": "0.3.0",
|
|
97
97
|
commander: "^15.0.0",
|
|
98
98
|
open: "^11.0.0"
|
|
99
99
|
},
|
|
@@ -509,6 +509,14 @@ 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
|
+
].join("\n");
|
|
512
520
|
}
|
|
513
521
|
}
|
|
514
522
|
function formatPostReadiness(readiness) {
|
|
@@ -857,6 +865,14 @@ function collectPublishingProvider(value, previous) {
|
|
|
857
865
|
function collectString(value, previous) {
|
|
858
866
|
return [...previous ?? [], value];
|
|
859
867
|
}
|
|
868
|
+
function deliveryOptionsProvider(value) {
|
|
869
|
+
const normalized = value.toUpperCase();
|
|
870
|
+
const parsed = import_contracts2.ProviderDeliveryOptionsProviderSchema.safeParse(normalized);
|
|
871
|
+
if (parsed.success) return parsed.data;
|
|
872
|
+
throw new import_commander.InvalidArgumentError(
|
|
873
|
+
`Provider must be one of ${import_contracts2.ProviderDeliveryOptionsProviderSchema.options.join(", ")}.`
|
|
874
|
+
);
|
|
875
|
+
}
|
|
860
876
|
function tiktokPostMode(value) {
|
|
861
877
|
const normalized = value.trim().toLowerCase();
|
|
862
878
|
if (normalized === "direct" || normalized === "direct_post") {
|
|
@@ -1489,7 +1505,7 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1489
1505
|
});
|
|
1490
1506
|
});
|
|
1491
1507
|
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
|
|
1508
|
+
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
1509
|
const global = program.opts();
|
|
1494
1510
|
commandExitCode = await execute({
|
|
1495
1511
|
command: "posts create",
|
|
@@ -1515,7 +1531,8 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1515
1531
|
...local.instagramCaption === void 0 ? {} : { INSTAGRAM: local.instagramCaption },
|
|
1516
1532
|
...local.tiktokCaption === void 0 ? {} : { TIKTOK: local.tiktokCaption },
|
|
1517
1533
|
...local.youtubeCaption === void 0 ? {} : { YOUTUBE: local.youtubeCaption },
|
|
1518
|
-
...local.blueskyCaption === void 0 ? {} : { BLUESKY: local.blueskyCaption }
|
|
1534
|
+
...local.blueskyCaption === void 0 ? {} : { BLUESKY: local.blueskyCaption },
|
|
1535
|
+
...local.linkedinCaption === void 0 ? {} : { LINKEDIN: local.linkedinCaption }
|
|
1519
1536
|
},
|
|
1520
1537
|
tiktokSettings: tiktokSettings(local) ?? null,
|
|
1521
1538
|
youtubeSettings: youtubeSettings(local)
|
|
@@ -1533,7 +1550,7 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1533
1550
|
}
|
|
1534
1551
|
});
|
|
1535
1552
|
});
|
|
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) => {
|
|
1553
|
+
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
1554
|
const global = program.opts();
|
|
1538
1555
|
commandExitCode = await execute({
|
|
1539
1556
|
command: "posts update",
|
|
@@ -1561,7 +1578,8 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1561
1578
|
...local.instagramCaption === void 0 ? {} : { INSTAGRAM: local.instagramCaption },
|
|
1562
1579
|
...local.tiktokCaption === void 0 ? {} : { TIKTOK: local.tiktokCaption },
|
|
1563
1580
|
...local.youtubeCaption === void 0 ? {} : { YOUTUBE: local.youtubeCaption },
|
|
1564
|
-
...local.blueskyCaption === void 0 ? {} : { BLUESKY: local.blueskyCaption }
|
|
1581
|
+
...local.blueskyCaption === void 0 ? {} : { BLUESKY: local.blueskyCaption },
|
|
1582
|
+
...local.linkedinCaption === void 0 ? {} : { LINKEDIN: local.linkedinCaption }
|
|
1565
1583
|
};
|
|
1566
1584
|
const resolvedTikTokSettings = tiktokSettings(local);
|
|
1567
1585
|
const resolvedYouTubeSettings = youtubeSettings(local);
|
|
@@ -1709,7 +1727,7 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1709
1727
|
});
|
|
1710
1728
|
});
|
|
1711
1729
|
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
|
|
1730
|
+
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
1731
|
const global = program.opts();
|
|
1714
1732
|
commandExitCode = await execute({
|
|
1715
1733
|
command: "posts publish preview",
|
|
@@ -1792,16 +1810,13 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1792
1810
|
}
|
|
1793
1811
|
});
|
|
1794
1812
|
});
|
|
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;
|
|
1813
|
+
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
1814
|
const global = program.opts();
|
|
1797
1815
|
commandExitCode = await execute({
|
|
1798
1816
|
command: "integrations delivery-options",
|
|
1799
1817
|
global,
|
|
1800
1818
|
runtime,
|
|
1801
1819
|
async action(context, client) {
|
|
1802
|
-
if (local.provider !== "TIKTOK") {
|
|
1803
|
-
throw new TypeError("Delivery options are currently available for TIKTOK.");
|
|
1804
|
-
}
|
|
1805
1820
|
const options = await client.integrations.deliveryOptions(
|
|
1806
1821
|
local.project,
|
|
1807
1822
|
local.provider,
|
|
@@ -1811,7 +1826,7 @@ async function runCli(argv = process.argv, overrides = {}) {
|
|
|
1811
1826
|
context,
|
|
1812
1827
|
options,
|
|
1813
1828
|
formatProviderDeliveryOptions(options),
|
|
1814
|
-
[`rolino posts create --project ${local.project} --caption <text> --platform
|
|
1829
|
+
[`rolino posts create --project ${local.project} --caption <text> --platform ${local.provider} --agent --yes`]
|
|
1815
1830
|
);
|
|
1816
1831
|
}
|
|
1817
1832
|
});
|