@letterstory/cli 0.177.25 → 0.177.27
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 +4 -4
- package/lib/commands/admin.mjs +7 -3
- package/lib/commands/automate.mjs +2 -0
- package/lib/commands/visits.mjs +16 -1
- 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.27";
|
|
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;
|
|
@@ -710,7 +710,7 @@ Reviewers:
|
|
|
710
710
|
[--event <name>] [--kind post|landing] [--competitor <host>] [--site <host>]
|
|
711
711
|
[--every <n> --unit hours|days|weeks|months] [--facts <a,b>] [--recipe <id>]
|
|
712
712
|
[--fit-run <run-id> --publication-host <site>]
|
|
713
|
-
[--hot-leads-only] [--per-day <n>] [--backfill all|<YYYY-MM-DD>] [--off]
|
|
713
|
+
[--hot-leads-only] [--icp] [--per-day <n>] [--backfill all|<YYYY-MM-DD>] [--off]
|
|
714
714
|
Make one (a template fills what you leave out): it starts
|
|
715
715
|
from now (--backfill also runs it on past events, oldest
|
|
716
716
|
first), acts on its own, and posts each event it acts on
|
|
@@ -1361,7 +1361,7 @@ Admin (STAFF key — --staff-key / LETTERSTORY_STAFF_API_KEY; acts before an org
|
|
|
1361
1361
|
| payments [--org <org-id>] [--open] | payments retry <lago-invoice-id> | payments run [--dry]
|
|
1362
1362
|
| signups [--status open|card_saved|provisioned|paid|abandoned|canceled]
|
|
1363
1363
|
| cap <org-id> <dollars|off> [--why "…"] | cancel <org-id> --why "…" --yes
|
|
1364
|
-
| move <org-id> --plan starter|growth|scale [--ratio N [--why "…"]] [--reason "…"] [--stripe-subscription sub_…] [--dry]
|
|
1364
|
+
| move <org-id> --plan starter|growth|scale [--ratio N [--why "…"]] [--reason "…"] [--stripe-subscription sub_…] [--now] [--dry]
|
|
1365
1365
|
| changes [--org <org-id>] | changes cancel <org-id>
|
|
1366
1366
|
Usage billing on Lago: the plan catalog, an org's
|
|
1367
1367
|
plan and gifted ratio, Lago's tokens against ours,
|
|
@@ -2012,7 +2012,7 @@ Visits (Visitors: AI agents reading your site, and AI answers sending people to
|
|
|
2012
2012
|
Who was identified, and who fits your ICP
|
|
2013
2013
|
visits compare <agent-a> <agent-b> [--since 7d] [--path '/docs/*'] [--purpose <p>]
|
|
2014
2014
|
Pages one agent read that the other didn't
|
|
2015
|
-
visits export [--since 30d] [--format json|csv] [--table agent_visits|citations]
|
|
2015
|
+
visits export [--since 30d] [--format json|csv] [--table agent_visits|citations] [--include agents|people|companies] [--icp|--not-icp]
|
|
2016
2016
|
visits sites Your Visitors sites and their install checks
|
|
2017
2017
|
visits domain <domain> [--site <id>] [--name <n>] Move a site to a new domain, keeping its key
|
|
2018
2018
|
visits pages [--since 28d] [--path '/docs/*'] [--agent <id>] [--limit <n>] [--site <id>]
|
package/lib/commands/admin.mjs
CHANGED
|
@@ -6254,8 +6254,8 @@ const LAGO_USAGE = `Usage: admin billing desk [--json] the Billing desk: s
|
|
|
6254
6254
|
signups end <org-id> --why "…" end an org's signup in flight (not yet provisioned), so one on other terms can open
|
|
6255
6255
|
cap <org-id> <dollars|off> [--why "…"] set an account's monthly spend cap on overage (off: no cap)
|
|
6256
6256
|
cancel <org-id> --why "…" --yes end an account's Lago plan now (its plan fee refunded in its first month, once per org)
|
|
6257
|
-
move <org-id> --plan starter [--ratio 4] [--why "…" above 4x] [--reason "…"] [--complimentary 20000] [--review 2027-05-01] [--stripe-subscription sub_…] [--dry]
|
|
6258
|
-
move an existing customer from Stripe to Lago at their renewal
|
|
6257
|
+
move <org-id> --plan starter [--ratio 4] [--why "…" above 4x] [--reason "…"] [--complimentary 20000] [--review 2027-05-01] [--stripe-subscription sub_…] [--now] [--dry]
|
|
6258
|
+
move an existing customer from Stripe to Lago at their renewal (--now: today, the first invoice credited)
|
|
6259
6259
|
changes [--org <org-id>] term changes waiting to take effect (moves, cheaper plans, new ratios)
|
|
6260
6260
|
changes cancel <org-id> take back an org's scheduled change before it takes effect`;
|
|
6261
6261
|
|
|
@@ -6893,13 +6893,17 @@ async function cmdAdminBilling(ctx) {
|
|
|
6893
6893
|
complimentaryTokens: flagNum(flags.complimentary),
|
|
6894
6894
|
reviewAt: flagStr(flags.review),
|
|
6895
6895
|
stripeSubscriptionId: flagStr(flags["stripe-subscription"]),
|
|
6896
|
+
startNow: flags.now ? true : undefined,
|
|
6896
6897
|
dryRun: flags.dry ? true : undefined,
|
|
6897
6898
|
})
|
|
6898
6899
|
);
|
|
6899
6900
|
const p = result.plan;
|
|
6901
|
+
const credit = p.to.firstInvoiceCreditCents ?? 0;
|
|
6900
6902
|
ok(
|
|
6901
6903
|
ctx,
|
|
6902
|
-
|
|
6904
|
+
p.to.startsAt && p.to.startsAt !== p.from.renewsAt
|
|
6905
|
+
? `${result.dryRun ? "Would move" : "Moving"} ${p.orgId} from Stripe ${p.from.stripeSubscriptionId} (${p.from.product ?? "subscription"}) to Lago ${p.to.plan} now: ${p.to.includedTokens} tokens from today, the first invoice $${((p.to.amountCents - credit) / 100).toFixed(2)} after $${(credit / 100).toFixed(2)} Stripe already took. Stripe stops at ${p.from.renewsAt}, when Lago charges $${(p.to.amountCents / 100).toFixed(2)} next.`
|
|
6906
|
+
: `${result.dryRun ? "Would move" : "Moving"} ${p.orgId} from Stripe ${p.from.stripeSubscriptionId} (${p.from.product ?? "subscription"}) to Lago ${p.to.plan} at its renewal ${p.from.renewsAt}: Stripe stops then, Lago charges $${(p.to.amountCents / 100).toFixed(2)} then (${p.to.includedTokens} tokens included, overage $${p.to.overageUsdPerToken} a token). Bonus when it takes effect: ${(p.to.bonusTokens ?? 0).toLocaleString("en-US")} tokens (signup × ${p.to.ratio}x), once.`
|
|
6903
6907
|
);
|
|
6904
6908
|
printResult(io, flags, result);
|
|
6905
6909
|
return 0;
|
|
@@ -48,6 +48,8 @@ const triggerParams = {
|
|
|
48
48
|
competitors: { flag: "competitor", type: "list" },
|
|
49
49
|
hosts: { flag: "site", type: "list" },
|
|
50
50
|
hot_leads_only: { flag: "hot-leads-only", type: "bool" },
|
|
51
|
+
// --icp: only people who fit the company's ICP (visitor_identified), checked against their stored fit.
|
|
52
|
+
icp: { flag: "icp", type: "bool" },
|
|
51
53
|
event: { flag: "event" },
|
|
52
54
|
per_day: { flag: "per-day", type: "num" },
|
|
53
55
|
// --trigger schedule --every 2 --unit weeks: a recurring automation, on the calendar (Monday, the 1st).
|
package/lib/commands/visits.mjs
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
// letterstory visits people --since 30d [--path /pricing] people who read the site, and how many were identified
|
|
12
12
|
// letterstory visits who --icp [--category Investors] [--path /pricing] who was identified (--icp: who fits your ICP)
|
|
13
13
|
// letterstory visits export --since 30d --format csv
|
|
14
|
+
// letterstory visits export --include people --icp > icp.csv the people who fit your ICP, as Humans shows them
|
|
14
15
|
// letterstory visits sites
|
|
15
16
|
// letterstory visits domain composal.com [--site <id>] move the site to a new domain, keeping its key
|
|
16
17
|
// letterstory visits pages --since 28d [--path '/docs/*'] [--agent openai-crawler]
|
|
@@ -77,7 +78,15 @@ export const ARGS = {
|
|
|
77
78
|
path: "path",
|
|
78
79
|
purpose: { flag: "purpose", enum: PURPOSES },
|
|
79
80
|
},
|
|
80
|
-
visitors_export: {
|
|
81
|
+
visitors_export: {
|
|
82
|
+
site_id: "site",
|
|
83
|
+
days,
|
|
84
|
+
format: { flag: "format", enum: ["json", "csv"] },
|
|
85
|
+
include: { flag: "include", enum: ["agents", "people", "companies"] },
|
|
86
|
+
icp: { flag: "icp", type: "bool", negate: "not-icp" },
|
|
87
|
+
category: "category",
|
|
88
|
+
path: "path",
|
|
89
|
+
},
|
|
81
90
|
};
|
|
82
91
|
|
|
83
92
|
/** `7d`, `7`, `2w` → days (1-90). Absent → undefined (the tool's default, 30). */
|
|
@@ -362,6 +371,12 @@ async function visitsCompare(ctx) {
|
|
|
362
371
|
async function visitsExport(ctx) {
|
|
363
372
|
const { flags, io } = ctx;
|
|
364
373
|
const result = await call(ctx, "visitors_export");
|
|
374
|
+
// People or companies: the CSV, as the Humans or Companies tab exports it (pipe to a file).
|
|
375
|
+
if (result.include === "people" || result.include === "companies") {
|
|
376
|
+
if (flags.json) io.log(JSON.stringify(result, null, 2));
|
|
377
|
+
else io.log(result.include === "people" ? result.csv_people : result.csv_companies);
|
|
378
|
+
return 0;
|
|
379
|
+
}
|
|
365
380
|
if (flagStr(flags.format) === "csv" && !flags.json && result.csv) {
|
|
366
381
|
// --table picks one; default is agent visits (pipe to a file).
|
|
367
382
|
const table = flagStr(flags.table) ?? "agent_visits";
|