@letterstory/cli 0.176.94 → 0.176.96

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/lib/cli.mjs CHANGED
@@ -86,7 +86,7 @@ import {
86
86
  import { fetchParkedSections, withoutParked } from "./parked.mjs";
87
87
 
88
88
  // Matches cli/package.json; publish-cli.yml rewrites both to the published version.
89
- export const VERSION = "0.176.94";
89
+ export const VERSION = "0.176.96";
90
90
 
91
91
  /** The exit code for a gate refusal (CARD_REQUIRED, PAYMENT_FAILED, OUT_OF_TOKENS): 1 is a plain error. */
92
92
  export const EXIT_PAYMENT_REQUIRED = 3;
@@ -101,6 +101,8 @@ export const BOOLEAN_FLAGS = new Set([
101
101
  "advance",
102
102
  // build list: only what the Plan started.
103
103
  "from-plan",
104
+ // domains plan: scores only, no model call.
105
+ "no-write",
104
106
  // build: a website or app of its own (deploy create's path). deploy create: hold until its build starts.
105
107
  "new-site",
106
108
  "wait",
@@ -563,6 +565,7 @@ Collections (the content engine as a primitive — one door, 'collection run'):
563
565
  collection run-status <run-id> Status, steps, constraints, verification
564
566
  collection runs [--collection <id>] [--status <s>] [--limit <n>]
565
567
  collection approve <run-id> [--now] Answer the gate (--now publishes immediately)
568
+ collection start <run-id> Start a scheduled slot's writing now (it goes live at its slot)
566
569
  collection move <run-id> --date YYYY-MM-DD Move a slot not yet written, or an approved written post, to another day
567
570
  collection cancel <run-id>
568
571
  collection inventory <id> Where every piece is; each finished draft's publish-on-its-own time
@@ -1970,10 +1973,10 @@ Domains (the domains you hold, and free ones that match what people search):
1970
1973
  Free .com/.org domains on what people search in your
1971
1974
  space (brainstormed, or the phrases given), ranked
1972
1975
  domains buy <domain> --dry-run | --yes The price and whose account pays; --yes buys it
1973
- domains plan <domain> [--phrase "<search>"] [--searches <n>]
1976
+ domains plan <domain> [--phrase "<search>"] [--searches <n>] [--version <version>] [--no-write]
1974
1977
  The most strategic site for the domain, every version
1975
1978
  scored, and whether it can launch; spends nothing
1976
- domains launch <domain> [--phrase …] [--searches …] [--words "<plan words>"] --yes
1979
+ domains launch <domain> [--phrase …] [--searches …] [--version <version>] [--words "<plan words>"] --yes
1977
1980
  Build and Launch Site: buys the domain if needed, builds
1978
1981
  the plan and puts it live
1979
1982
 
@@ -134,6 +134,9 @@ export const ARGS = {
134
134
  cancel_collection_run: {
135
135
  run_id: { positional: 0, label: "run-id", required: true },
136
136
  },
137
+ start_collection_run: {
138
+ run_id: { positional: 0, label: "run-id", required: true },
139
+ },
137
140
  reschedule_collection_run: {
138
141
  run_id: { positional: 0, label: "run-id", required: true },
139
142
  date: { flag: "date", required: true },
@@ -184,6 +187,8 @@ export async function cmdCollection(ctx) {
184
187
  return collectionApprove(rest);
185
188
  case "cancel":
186
189
  return collectionCancel(rest);
190
+ case "start":
191
+ return collectionStart(rest);
187
192
  case "move":
188
193
  case "reschedule":
189
194
  return collectionMove(rest);
@@ -197,7 +202,7 @@ export async function cmdCollection(ctx) {
197
202
  return collectionMentions(rest);
198
203
  default:
199
204
  throw new CliError(
200
- `Unknown collection subcommand: ${sub ?? "(none)"}. Try: list, overview, new, config, delete, run, add, queue, headline, run-status, runs, approve, move, cancel, inventory, links, mentions`
205
+ `Unknown collection subcommand: ${sub ?? "(none)"}. Try: list, overview, new, config, delete, run, add, queue, headline, run-status, runs, approve, start, move, cancel, inventory, links, mentions`
201
206
  );
202
207
  }
203
208
  }
@@ -395,6 +400,18 @@ async function collectionCancel(ctx) {
395
400
  return 0;
396
401
  }
397
402
 
403
+ // `collection start <run-id>` — a slot on the calendar starts writing now; it still goes live at its slot
404
+ // (start_collection_run, the way a letterbase's writing automation starts its slot).
405
+ async function collectionStart(ctx) {
406
+ const result = await ctx.client.callTool(
407
+ "start_collection_run",
408
+ argsFromFlags(ARGS.start_collection_run, ctx.flags, ctx.positionals)
409
+ );
410
+ ok(ctx, toolField(result, "started") ? "Started: it is being written." : "Not started yet: see its step.");
411
+ printResult(ctx.io, ctx.flags, result);
412
+ return 0;
413
+ }
414
+
398
415
  // `collection move <run-id> --date YYYY-MM-DD` — a slot not yet written, or a written post
399
416
  // already approved, onto another day (reschedule_collection_run).
400
417
  async function collectionMove(ctx) {
@@ -7,9 +7,10 @@
7
7
  // letterstory domains scan "nano banana pro" ["ai headshots" …] [--tld com,org,ai] [--expand none|searches|space]
8
8
  // letterstory domains buy nanobananaprofree.com --dry-run the price and whose account pays; buys nothing
9
9
  // letterstory domains buy nanobananaprofree.com --yes buys it (spends money; domains:write)
10
- // letterstory domains plan bestaidatalabs.com [--phrase "best ai data labs"] [--searches 880]
10
+ // letterstory domains plan bestaidatalabs.com [--phrase "best ai data labs"] [--searches 880] [--version comparison]
11
+ // [--no-write]
11
12
  // the most strategic site for it; spends nothing
12
- // letterstory domains launch bestaidatalabs.com [--phrase …] [--searches …] --yes
13
+ // letterstory domains launch bestaidatalabs.com [--phrase …] [--searches …] [--version …] --yes
13
14
  // Build and Launch Site: buys it if needed, builds the
14
15
  // plan and puts it live (spends money; domains:write)
15
16
 
@@ -42,11 +43,16 @@ export const ARGS = {
42
43
  domain: { value: (flags, positionals) => stripScheme(requirePositional(positionals, 0, "domain")) },
43
44
  phrase: { flag: "phrase" },
44
45
  monthly_searches: { flag: "searches", type: "num" },
46
+ // A version other than the top score (ranked_list, comparison, directory, free_tool, templates, guide).
47
+ version: { flag: "version" },
48
+ // The scores and whether it can launch, at once: the version's own plan, no model call.
49
+ write: { flag: "no-write", type: "bool", invert: true },
45
50
  },
46
51
  launch_domain_site: {
47
52
  domain: { value: (flags, positionals) => stripScheme(requirePositional(positionals, 0, "domain")) },
48
53
  phrase: { flag: "phrase" },
49
54
  monthly_searches: { flag: "searches", type: "num" },
55
+ version: { flag: "version" },
50
56
  // The words of a plan already read (`domains plan … --json`'s plan.words): that plan is built as it was.
51
57
  words: { flag: "words" },
52
58
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letterstory/cli",
3
- "version": "0.176.94",
3
+ "version": "0.176.96",
4
4
  "description": "Spin up and manage Letter phantom blogs from your terminal.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",