@letterstory/cli 0.176.53 → 0.176.55

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
@@ -85,7 +85,7 @@ import {
85
85
  import { fetchParkedSections, withoutParked } from "./parked.mjs";
86
86
 
87
87
  // Matches cli/package.json; publish-cli.yml rewrites both to the published version.
88
- export const VERSION = "0.176.53";
88
+ export const VERSION = "0.176.55";
89
89
 
90
90
  /** The exit code for a gate refusal (CARD_REQUIRED, PAYMENT_FAILED, OUT_OF_TOKENS): 1 is a plain error. */
91
91
  export const EXIT_PAYMENT_REQUIRED = 3;
@@ -202,6 +202,8 @@ export const BOOLEAN_FLAGS = new Set([
202
202
  "no-control",
203
203
  "own-beat",
204
204
  "refresh",
205
+ // ask --more: every row that fits, not only the top ones.
206
+ "more",
205
207
  "preview",
206
208
  "with-preview",
207
209
  // repo …: the repo is a GitLab project (--repo group/subgroup/project).
@@ -1687,17 +1689,17 @@ Mail:
1687
1689
  (any phone format; country as a name or a 2-letter code)
1688
1690
 
1689
1691
  Insights:
1690
- ask [<words…>] [--outcome geo|seo|…] [--lens fix|build] [--site host]
1692
+ ask [<words…>] [--outcome geo|seo|…] [--more] [--lens fix|build] [--site host]
1691
1693
  Ask Letterpress what to do next: the plan for an outcome (the
1692
1694
  Plan tab's box), what's broken (--lens fix, most pressing
1693
1695
  first), what to build (--lens build), or your own words. Nothing asked:
1694
1696
  each list's head. The same answer as the console and Slack.
1695
1697
  plan auto [activate|disable] [--site host] [--veto-hours <1-168>|off] [--pace-hours <1-168>]
1696
1698
  [--delivery build|build_pr|build_merge]
1697
- [--aggression low|medium|high|xhigh] [--goal geo|seo|agent_conviction|inbound_conversion|any]
1699
+ [--aggression low|medium|high|xhigh] [--strategies geo,seo,agent_conviction,inbound_conversion|any]
1698
1700
  [--slack-channel <C…>|none]
1699
1701
  Auto-Plan on a site: Letterpress picks its strategies and builds
1700
- them (--goal: one goal's strategies, else any); each pick waits --veto-hours for a veto. Settings shown when none given.
1702
+ them under the site's strategies (--strategies, any by default; the Plan reads the same set); each pick waits --veto-hours for a veto. Settings shown when none given.
1701
1703
  plan pending [--site host] What Auto-Plan picked and is waiting to build
1702
1704
  plan veto <proposal-id> Veto one: it is never built
1703
1705
  plan start <proposal-id> Start one now (a Needs you pick, or one waiting out its review window)
@@ -1,7 +1,7 @@
1
1
  // `ask` — ask Letterpress, the one door (docs/architecture/one-recipe-engine.md §9b): what should
2
2
  // this account do next. The same answer as the console's Plan, Build and Fix tabs and Slack.
3
3
  // ask → each list's head: what's broken, what to build
4
- // ask --outcome geo|seo|… → the plan for that outcome (the Plan tab's box)
4
+ // ask --outcome geo|seo|… → the plan for that outcome (Ideas filtered to it); --more: every row that fits
5
5
  // ask --strategy <id> → a typed strategy's next actions (plan strategies)
6
6
  // ask --lens fix | --lens build → what's broken (most pressing first) | what to build
7
7
  // ask "<words…>" → in your own words; what nothing does comes back as unmet
@@ -21,13 +21,15 @@ export const ARGS = {
21
21
  found: "found",
22
22
  // --refresh: decide every strategy again from the facts as they are now (the standing fit is read otherwise).
23
23
  refresh: { flag: "refresh", type: "bool" },
24
+ // --more: every row that fits, not only the top ones (the Ideas list's Show all).
25
+ more: { flag: "more", type: "bool" },
24
26
  domain: "site",
25
27
  },
26
28
  };
27
29
 
28
30
  export async function cmdAsk(ctx) {
29
31
  const { client, flags, io } = ctx;
30
- refuseUnknownFlags(ctx, {}, ["outcome", "strategy", "lens", "words", "found", "site", "refresh"]);
32
+ refuseUnknownFlags(ctx, {}, ["outcome", "strategy", "lens", "words", "found", "site", "refresh", "more"]);
31
33
  const args = argsFromFlags(ARGS.ask_letterpress, flags, ctx.positionals, {});
32
34
  if ([args.outcome, args.strategy_id, args.lens, args.words].filter(Boolean).length > 1)
33
35
  throw new CliError("One ask at a time: --outcome, --strategy <id>, --lens fix|build, or your words.");
@@ -63,6 +63,8 @@ const ARGS = {
63
63
  again: { flag: "again", type: "bool" },
64
64
  // --recipe <id>: the recipe the build carries out (a Plan row's), recorded on it.
65
65
  recipe: "recipe",
66
+ // Preserve the account-specific task selected by the Plan.
67
+ fit_run: "fit-run",
66
68
  // --new-site: a website or app of its own, built and hosted on its own domain (deploy create's path).
67
69
  new_site: { flag: "new-site", type: "bool" },
68
70
  // --new-site --look-like linear.app,supabase.com: other companies' sites to model its look after.
@@ -106,6 +108,8 @@ const ARGS = {
106
108
  subjects: { flag: "subject", type: "list" },
107
109
  // --recipe <id>: the recipe the words carry out (a Plan row's), recorded on the build it starts.
108
110
  recipe: "recipe",
111
+ // Preserve the account-specific task selected by the Plan.
112
+ fit_run: "fit-run",
109
113
  files: { value: (_flags, _positionals, extra) => (extra.files?.length ? extra.files : undefined) },
110
114
  harness: { flag: "harness", enum: ["letterpress-1", "claude-code", "codex"] },
111
115
  // --repo owner/name: the repo you're working in, where a Proofs install goes.
@@ -230,6 +234,7 @@ async function buildStart(ctx) {
230
234
  "site",
231
235
  "subject",
232
236
  "recipe",
237
+ "fit-run",
233
238
  "action",
234
239
  "notify-slack",
235
240
  "harness",
@@ -262,6 +267,8 @@ async function buildTalk(ctx) {
262
267
  const { client, flags, io } = ctx;
263
268
  refuseUnknownFlags(ctx, {}, [
264
269
  "message",
270
+ "recipe",
271
+ "fit-run",
265
272
  "conversation",
266
273
  "build",
267
274
  "site",
@@ -2,7 +2,7 @@
2
2
  // organization's own domain). The same calls as the Plan's modal and its sidebar's Pending rows.
3
3
  // plan auto → get_auto_plan
4
4
  // plan auto [activate|disable] [--veto-hours <1-168>|off] [--pace-hours <1-168>] [--delivery build|build_pr|build_merge]
5
- // [--aggression low|medium|high|xhigh] [--goal geo|seo|agent_conviction|inbound_conversion|any]
5
+ // [--aggression low|medium|high|xhigh] [--strategies geo,seo|any]
6
6
  // [--slack-channel <C…>|none] → set_auto_plan
7
7
  // plan pending → list_auto_plan_proposals (status pending)
8
8
  // plan veto <proposal-id> → veto_auto_plan_proposal
@@ -67,15 +67,23 @@ export const ARGS = {
67
67
  // How far each pick goes: a preview, a pull request, or one merged once ready.
68
68
  delivery: { flag: "delivery", enum: ["build", "build_pr", "build_merge"] },
69
69
  aggression: { flag: "aggression", enum: ["low", "medium", "high", "xhigh"] },
70
- // --goal geo picks strategies for that goal only; --goal any (the default) reads every strategy.
71
- goal: {
70
+ // --strategies geo,seo: the site's strategies (what the Plan reads under, what Auto-Plan picks from), replaced
71
+ // whole; --strategies any (or none) reads every strategy.
72
+ strategies: {
72
73
  value: (flags) => {
73
- const v = flagStr(flags.goal);
74
+ const v = flagStr(flags.strategies);
74
75
  if (v === undefined) return undefined;
75
- if (v === "any") return null;
76
- if (!["agent_conviction", "geo", "seo", "inbound_conversion"].includes(v))
77
- throw new CliError("--goal takes agent_conviction, geo, seo, inbound_conversion, or any.");
78
- return v;
76
+ if (v === "any" || v === "") return [];
77
+ const list = v
78
+ .split(",")
79
+ .map((x) => x.trim())
80
+ .filter(Boolean);
81
+ for (const g of list)
82
+ if (!["agent_conviction", "geo", "seo", "inbound_conversion"].includes(g))
83
+ throw new CliError(
84
+ "--strategies takes agent_conviction, geo, seo, inbound_conversion (comma-separated), or any."
85
+ );
86
+ return list;
79
87
  },
80
88
  },
81
89
  slack_channel: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letterstory/cli",
3
- "version": "0.176.53",
3
+ "version": "0.176.55",
4
4
  "description": "Spin up and manage Letter phantom blogs from your terminal.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",