@letterstory/cli 0.177.15 → 0.177.17

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
@@ -88,7 +88,7 @@ import {
88
88
  import { fetchParkedSections, withoutParked } from "./parked.mjs";
89
89
 
90
90
  // Matches cli/package.json; publish-cli.yml rewrites both to the published version.
91
- export const VERSION = "0.177.15";
91
+ export const VERSION = "0.177.17";
92
92
 
93
93
  /** The exit code for a gate refusal (CARD_REQUIRED, PAYMENT_FAILED, OUT_OF_TOKENS): 1 is a plain error. */
94
94
  export const EXIT_PAYMENT_REQUIRED = 3;
@@ -5141,12 +5141,14 @@ const RECIPE_FILE_FIELDS = [
5141
5141
  "tool_access",
5142
5142
  "primitives_access",
5143
5143
  "immediate",
5144
+ // Whether its row must name what it acts on (2026-11-11); left out here, an export would drop it.
5145
+ "names_subject",
5144
5146
  "status",
5145
5147
  "needs",
5146
5148
  "variations",
5147
5149
  ];
5148
5150
  const RECIPES_USAGE =
5149
- "Usage: admin recipes list [--kind recipe|known_issue] [--status live|parked] [--approach seo|geo|agent_conviction|inbound_conversion|outbound|other] | show <id|name> | runs <id|name> [--days 1..90] [--limit n] | vocab | stats | export [--out <file>] | import <file> [--dry-run] | refit [--org <id>,…] [--recipe <id|name>] [--limit n] | save [<id>] [--file <recipe.json>] [--kind recipe|known_issue] [--name …] [--description …] [--recipe …] [--when-to-use …] [--when-not-to-use …] [--weight 1..10] [--approaches seo,geo,…] [--reads llms_txt,github,…] [--runs <catalog action id>] [--primitives-access true|false] [--immediate true|false] [--status live|parked] [--needs <what a parked recipe is missing>] | delete <id> --yes";
5151
+ "Usage: admin recipes list [--kind recipe|known_issue] [--status live|parked] [--approach seo|geo|agent_conviction|inbound_conversion|outbound|other] | show <id|name> | runs <id|name> [--days 1..90] [--limit n] | vocab | stats | export [--out <file>] | import <file> [--dry-run] | refit [--org <id>,…] [--recipe <id|name>] [--limit n] | save [<id>] [--file <recipe.json>] [--kind recipe|known_issue] [--name …] [--description …] [--recipe …] [--when-to-use …] [--when-not-to-use …] [--weight 1..10] [--approaches seo,geo,…] [--reads llms_txt,github,…] [--runs <catalog action id>] [--primitives-access true|false] [--immediate true|false] [--names-subject true|false] [--status live|parked] [--needs <what a parked recipe is missing>] | delete <id> --yes";
5150
5152
 
5151
5153
  const recipeForFile = (r) => Object.fromEntries(RECIPE_FILE_FIELDS.map((k) => [k, r[k]]));
5152
5154
 
@@ -5196,6 +5198,7 @@ function recipeDetail(r) {
5196
5198
  : r.primitives_access
5197
5199
  ? [" letter's tools: its build may read the account through them (primitives_access)"]
5198
5200
  : []),
5201
+ ...(r.names_subject ? [" title: names what it acts on, or it is a no (names_subject)"] : []),
5199
5202
  ...(variations.length > 1
5200
5203
  ? variations.flatMap((v, i) => [` variation ${i + 1}: ${v.name}`, ...fields(v, " ")])
5201
5204
  : fields(r, " ")),
@@ -5250,6 +5253,8 @@ function recipeFromFlags(flags) {
5250
5253
  flags["primitives-access"] === undefined ? undefined : String(flags["primitives-access"]) === "true",
5251
5254
  // --immediate is accepted for old scripts and read by nothing: a quick row is one whose runs is empty.
5252
5255
  immediate: flags.immediate === undefined ? undefined : String(flags.immediate) === "true",
5256
+ // --names-subject true: its row names what it acts on, or is a no; false: it may keep its general name.
5257
+ names_subject: flags["names-subject"] === undefined ? undefined : String(flags["names-subject"]) === "true",
5253
5258
  // --reads llms_txt,github declares the facts its conditions rest on; --reads "" clears them.
5254
5259
  reads: flagStr(flags.reads)
5255
5260
  ?.split(",")
@@ -123,9 +123,20 @@ export async function cmdDeploy(ctx) {
123
123
  case "advance":
124
124
  refuseUnknownFlags(rest, ARGS.advance_deployment, []);
125
125
  return deployShow(rest, await call(rest, "advance_deployment"));
126
- case "page":
126
+ case "page": {
127
127
  refuseUnknownFlags(rest, ARGS.add_deployment_page, []);
128
- return deployShow(rest, await call(rest, "add_deployment_page"));
128
+ const result = await call(rest, "add_deployment_page");
129
+ if (result?.app) return deployShow(rest, result);
130
+ // A phantom moved to code answers with the phantom, not an app.
131
+ printResult(
132
+ rest.io,
133
+ rest.flags,
134
+ result,
135
+ (r) =>
136
+ `${r.phantom?.name ?? "The site"}: adding a landing page\n Run ${r.run_id} (repo show ${r.run_id})`
137
+ );
138
+ return 0;
139
+ }
129
140
  case "connect":
130
141
  return deployShow(rest, await call(rest, "connect_deployment_repo"));
131
142
  case "source": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letterstory/cli",
3
- "version": "0.177.15",
3
+ "version": "0.177.17",
4
4
  "description": "Spin up and manage Letter phantom blogs from your terminal.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",