@letterstory/cli 0.177.21 → 0.177.22

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.21";
91
+ export const VERSION = "0.177.22";
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;
@@ -1226,7 +1226,7 @@ Admin (STAFF key — --staff-key / LETTERSTORY_STAFF_API_KEY; acts before an org
1226
1226
  admin demo ideas <org-id> [--library] [--preview] [--force] | --status [--id <run>]
1227
1227
  Start every Idea on a demo org for real (pull requests, or
1228
1228
  previews), or read how the latest run went.
1229
- admin demo sweep [--prepare] [--pull-requests] [--recipes a,b] [--orgs a,b] [--exclude a,b] [--buy a,b] [--make-orgs] [--no-refit] | --status [--id <sweep>]
1229
+ admin demo sweep [--prepare] [--pull-requests] [--recipes a,b] [--variation <n|name>] [--orgs a,b] [--exclude a,b] [--buy a,b] [--make-orgs] [--no-refit] | --status [--id <sweep>] | --reset <recipe> [--id <sweep>]
1230
1230
  Every live recipe end to end: each gets a test org whose Ideas
1231
1231
  offers it, its Start pressed (or, with --prepare, left for you
1232
1232
  to press in the app), and its outcome judged, with who owns a
@@ -7007,7 +7007,7 @@ const DEMO_ITEM_FLAGS = [
7007
7007
  "setup",
7008
7008
  ];
7009
7009
  const DEMO_USAGE =
7010
- "Usage: admin demo guide | list [--enrollable] | show <org-id> [--moves] | set <org-id> [--enroll] [--unenroll] [--file <state.json>] [--phantom parked|shown] [--main-blog …] [--visitors …] [--probes not_run|shown] [--cms hidden|shown] [--publish-target …] [--search-console …] [--github …] [--domain …] [--setup fresh|finished] [--domain-cap n] [--inject <key>]... [--hide <key>]... [--save-as <name>] [--baseline <owner/repo>[@sha] | --clear-baseline] [--copy-from <org-id> [--copy-scenarios a,b] [--overwrite]] [--auto-reset <scenario>|off] [--every <minutes>] [--release] | domains | new <domain> [--name <n>] [--brief <t>] [--full] [--host vercel|pages] [--no-wait] | teardown <org-id> [--keep-repo] | bootstrap <org-id>... --from <org-id> [--scenarios a,b] [--overwrite] | reset <org-id> <scenario> [--clean-slate] [--close-prs since_applied|all_open|none] [--hold <minutes>] [--restore-repo revert|force] [--rebuild] [--reread-company] [--forget-company] [--forget-site] | check <org-id> | ideas <org-id> [--library] [--preview] [--force] | ideas <org-id> --status [--id <run-id>] | sweep [--prepare] [--pull-requests] [--recipes <id>,…] [--orgs <id>,…] [--exclude <id>,…] [--buy <recipe-id>,…] [--make-orgs] [--no-refit] | sweep --status [--id <sweep-id>]";
7010
+ "Usage: admin demo guide | list [--enrollable] | show <org-id> [--moves] | set <org-id> [--enroll] [--unenroll] [--file <state.json>] [--phantom parked|shown] [--main-blog …] [--visitors …] [--probes not_run|shown] [--cms hidden|shown] [--publish-target …] [--search-console …] [--github …] [--domain …] [--setup fresh|finished] [--domain-cap n] [--inject <key>]... [--hide <key>]... [--save-as <name>] [--baseline <owner/repo>[@sha] | --clear-baseline] [--copy-from <org-id> [--copy-scenarios a,b] [--overwrite]] [--auto-reset <scenario>|off] [--every <minutes>] [--release] | domains | new <domain> [--name <n>] [--brief <t>] [--full] [--host vercel|pages] [--no-wait] | teardown <org-id> [--keep-repo] | bootstrap <org-id>... --from <org-id> [--scenarios a,b] [--overwrite] | reset <org-id> <scenario> [--clean-slate] [--close-prs since_applied|all_open|none] [--hold <minutes>] [--restore-repo revert|force] [--rebuild] [--reread-company] [--forget-company] [--forget-site] | check <org-id> | ideas <org-id> [--library] [--preview] [--force] | ideas <org-id> --status [--id <run-id>] | sweep [--prepare] [--pull-requests] [--recipes <id>,…] [--variation <n|name>] [--orgs <id>,…] [--exclude <id>,…] [--buy <recipe-id>,…] [--make-orgs] [--no-refit] | sweep --status [--id <sweep-id>] | sweep --reset <recipe-id> [--id <sweep-id>]";
7011
7011
 
7012
7012
  const readinessLines = (r) =>
7013
7013
  r
@@ -7052,7 +7052,7 @@ const recipeSweepLines = (sweep, appUrl) =>
7052
7052
  `${sweep.start ? "started by the sweep" : "prepared for you to start"}, ${sweep.delivery === "build" ? "previews" : "pull requests"}, by ${sweep.started_by_name ?? "staff"} at ${sweep.created_at} sweep ${sweep.id}`,
7053
7053
  ...sweep.items.map((i) =>
7054
7054
  [
7055
- `\n${(SWEEP_MARK[i.result] ?? i.result).padEnd(10)} ${i.name}`,
7055
+ `\n${(SWEEP_MARK[i.result] ?? i.result).padEnd(10)} ${i.name}${i.variation ? ` (variation ${i.variation}: ${i.variation_name ?? ""})` : ""}`,
7056
7056
  i.org ? ` org: ${i.org.name} (${i.org.host})${i.org.made ? ", made for it" : ""}` : null,
7057
7057
  i.fit[0] ? ` fit: ${i.fit[0].fits}: ${i.fit[0].why}` : null,
7058
7058
  i.row
@@ -7063,6 +7063,7 @@ const recipeSweepLines = (sweep, appUrl) =>
7063
7063
  : null,
7064
7064
  i.verdict ? ` outcome: ${i.verdict.state}: ${i.verdict.observed}` : null,
7065
7065
  i.cause ? ` cause: ${i.cause.owner}: ${i.cause.why}` : null,
7066
+ ...(i.tried ?? []).map((t) => ` tried ${t.name}: ${t.why}`),
7066
7067
  i.profile_problem ? ` profile: ${i.profile_problem}` : null,
7067
7068
  i.profile?.unsettable?.length
7068
7069
  ? ` can't be made on a test org: ${i.profile.unsettable.map((u) => u.key).join(", ")}`
@@ -7319,6 +7320,18 @@ async function cmdAdminDemo(ctx) {
7319
7320
  const orgId = requirePositional(positionals, 1, "org-id");
7320
7321
  const path = `${DEMO}/${encodeURIComponent(orgId)}/ideas`;
7321
7322
  const id = flagStr(flags.id);
7323
+ // The retest loop: one recipe brought back on its test org (reset_recipe_sweep_item).
7324
+ if (flagStr(flags.reset)) {
7325
+ const reset = await staffPost(ctx, `${path}/reset`, compact({ id, recipe_id: flagStr(flags.reset) }));
7326
+ printResult(io, flags, reset, (r) =>
7327
+ [
7328
+ ...r.reset.undone.map((u) => `undone: ${u}`),
7329
+ ...r.reset.kept.map((k) => `kept: ${k}`),
7330
+ recipeSweepLines(r.sweep, ctx.client.url),
7331
+ ].join("\n")
7332
+ );
7333
+ return 0;
7334
+ }
7322
7335
  const result =
7323
7336
  flagBool(flags.status) || id
7324
7337
  ? await staffRequest(ctx, "GET", id ? `${path}?id=${encodeURIComponent(id)}` : path)
@@ -7348,6 +7361,12 @@ async function cmdAdminDemo(ctx) {
7348
7361
  start: flagBool(flags.prepare) ? false : undefined,
7349
7362
  delivery: flagBool(flags["pull-requests"]) ? "build_pr" : undefined,
7350
7363
  recipes: flags.recipes ? flagList(flags.recipes) : undefined,
7364
+ // A number is the variation's place (1 is the recipe itself); anything else its name.
7365
+ variation: flagStr(flags.variation)
7366
+ ? /^\d+$/.test(flagStr(flags.variation))
7367
+ ? Number(flagStr(flags.variation))
7368
+ : flagStr(flags.variation)
7369
+ : undefined,
7351
7370
  orgs: flags.orgs ? flagList(flags.orgs) : undefined,
7352
7371
  exclude: flags.exclude ? flagList(flags.exclude) : undefined,
7353
7372
  purchases: flags.buy ? flagList(flags.buy) : undefined,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letterstory/cli",
3
- "version": "0.177.21",
3
+ "version": "0.177.22",
4
4
  "description": "Spin up and manage Letter phantom blogs from your terminal.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",