@letterstory/cli 0.177.39 → 0.177.41
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 +1 -1
- package/lib/commands/admin.mjs +6 -1
- package/lib/commands/automate.mjs +1 -0
- package/lib/commands/replicate.mjs +7 -2
- package/package.json +1 -1
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.
|
|
91
|
+
export const VERSION = "0.177.41";
|
|
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;
|
package/lib/commands/admin.mjs
CHANGED
|
@@ -5179,12 +5179,14 @@ const RECIPE_FILE_FIELDS = [
|
|
|
5179
5179
|
"immediate",
|
|
5180
5180
|
// Whether its row must name what it acts on (2026-11-11); left out here, an export would drop it.
|
|
5181
5181
|
"names_subject",
|
|
5182
|
+
// Where its row shows: ideas or fix (a deficit, 2026-11-13); left out here, an export would drop it.
|
|
5183
|
+
"shows_in",
|
|
5182
5184
|
"status",
|
|
5183
5185
|
"needs",
|
|
5184
5186
|
"variations",
|
|
5185
5187
|
];
|
|
5186
5188
|
const RECIPES_USAGE =
|
|
5187
|
-
"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";
|
|
5189
|
+
"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] [--shows-in ideas|fix] [--status live|parked] [--needs <what a parked recipe is missing>] | delete <id> --yes";
|
|
5188
5190
|
|
|
5189
5191
|
const recipeForFile = (r) => Object.fromEntries(RECIPE_FILE_FIELDS.map((k) => [k, r[k]]));
|
|
5190
5192
|
|
|
@@ -5235,6 +5237,7 @@ function recipeDetail(r) {
|
|
|
5235
5237
|
? [" letter's tools: its build may read the account through them (primitives_access)"]
|
|
5236
5238
|
: []),
|
|
5237
5239
|
...(r.names_subject ? [" title: names what it acts on, or it is a no (names_subject)"] : []),
|
|
5240
|
+
...(r.shows_in === "fix" ? [" shows in: Fix, as a deficit (shows_in)"] : []),
|
|
5238
5241
|
...(variations.length > 1
|
|
5239
5242
|
? variations.flatMap((v, i) => [` variation ${i + 1}: ${v.name}`, ...fields(v, " ")])
|
|
5240
5243
|
: fields(r, " ")),
|
|
@@ -5291,6 +5294,8 @@ function recipeFromFlags(flags) {
|
|
|
5291
5294
|
immediate: flags.immediate === undefined ? undefined : String(flags.immediate) === "true",
|
|
5292
5295
|
// --names-subject true: its row names what it acts on, or is a no; false: it may keep its general name.
|
|
5293
5296
|
names_subject: flags["names-subject"] === undefined ? undefined : String(flags["names-subject"]) === "true",
|
|
5297
|
+
// --shows-in fix: its row is a deficit, in Fix's Deficits; ideas (the default): a thing to build, on Ideas.
|
|
5298
|
+
shows_in: flagStr(flags["shows-in"]),
|
|
5294
5299
|
// --reads llms_txt,github declares the facts its conditions rest on; --reads "" clears them.
|
|
5295
5300
|
reads: flagStr(flags.reads)
|
|
5296
5301
|
?.split(",")
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
// attach_replication_repo, advance_replication, archive_replication, list_form_submissions), the
|
|
7
7
|
// same lib functions the app calls.
|
|
8
8
|
//
|
|
9
|
-
// letterstory replicate https://example.com [--max-pages 300] [--path /pricing --path /about] [--cookies "country=US; locale=en"] [--refine-budget 25] [--repo-name example-site] [--repo-owner <account>]
|
|
9
|
+
// letterstory replicate https://example.com [--max-pages 300] [--path /pricing --path /about] [--cookies "country=US; locale=en"] [--region us] [--refine-budget 25] [--repo-name example-site] [--repo-owner <account>]
|
|
10
10
|
// letterstory replicate list
|
|
11
11
|
// letterstory replicate show <id> [--failing]
|
|
12
12
|
// letterstory replicate attach <id> <repo-name> [--repo-owner <account>]
|
|
13
|
-
// letterstory replicate advance <id> [--retry] [--again] [--preview] [--extend-preview <days>] [--keep-preview]
|
|
13
|
+
// letterstory replicate advance <id> [--retry] [--again] [--preview] [--extend-preview <days>] [--keep-preview] [--region us|none]
|
|
14
14
|
// letterstory replicate archive <id>
|
|
15
15
|
// letterstory replicate forms [<id>] [--form <form>] [--limit <n>] [--before <iso>]
|
|
16
16
|
// letterstory replicate forms <id> --show-key (admins: LETTER_FORMS_URL and LETTER_FORMS_KEY to host it yourself)
|
|
@@ -27,6 +27,7 @@ export const ARGS = {
|
|
|
27
27
|
paths: { flag: "path", type: "list" },
|
|
28
28
|
sample_banner: { flag: "sample-banner", type: "bool" },
|
|
29
29
|
capture_cookies: "cookies",
|
|
30
|
+
capture_region: "region",
|
|
30
31
|
refine_budget_usd: { flag: "refine-budget", type: "num" },
|
|
31
32
|
repo_name: "repo-name",
|
|
32
33
|
repo_owner: "repo-owner",
|
|
@@ -48,6 +49,10 @@ export const ARGS = {
|
|
|
48
49
|
preview: { flag: "preview", type: "bool" },
|
|
49
50
|
extend_preview_days: { flag: "extend-preview", type: "num" },
|
|
50
51
|
keep_preview: { flag: "keep-preview", type: "bool" },
|
|
52
|
+
capture_region: {
|
|
53
|
+
value: (flags) =>
|
|
54
|
+
flags.region === undefined ? undefined : flags.region === "none" ? null : String(flags.region),
|
|
55
|
+
},
|
|
51
56
|
sample_banner: { flag: "sample-banner", type: "bool" },
|
|
52
57
|
},
|
|
53
58
|
archive_replication: { replication_id: replicationId },
|