@revfleet/hscli 0.8.11 → 0.9.0
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/CHANGELOG.md +186 -0
- package/README.md +223 -10
- package/dist/cli.js +29 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent/contracts.d.ts +3 -0
- package/dist/commands/agent/contracts.js +139 -0
- package/dist/commands/agent/contracts.js.map +1 -0
- package/dist/commands/agent/index.d.ts +3 -0
- package/dist/commands/agent/index.js +188 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/agent/recipes.d.ts +13 -0
- package/dist/commands/agent/recipes.js +108 -0
- package/dist/commands/agent/recipes.js.map +1 -0
- package/dist/commands/agent/runner.d.ts +16 -0
- package/dist/commands/agent/runner.js +165 -0
- package/dist/commands/agent/runner.js.map +1 -0
- package/dist/commands/auth/index.js +64 -7
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/automation/index.js +30 -0
- package/dist/commands/automation/index.js.map +1 -1
- package/dist/commands/backup/index.d.ts +12 -0
- package/dist/commands/backup/index.js +459 -0
- package/dist/commands/backup/index.js.map +1 -0
- package/dist/commands/cms/content-ops.js +1 -1
- package/dist/commands/cms/content-ops.js.map +1 -1
- package/dist/commands/communication-preferences/index.js +207 -7
- package/dist/commands/communication-preferences/index.js.map +1 -1
- package/dist/commands/content-permissions/index.d.ts +22 -0
- package/dist/commands/content-permissions/index.js +141 -0
- package/dist/commands/content-permissions/index.js.map +1 -0
- package/dist/commands/context/index.d.ts +3 -0
- package/dist/commands/context/index.js +182 -0
- package/dist/commands/context/index.js.map +1 -0
- package/dist/commands/crm/associations.js +38 -0
- package/dist/commands/crm/associations.js.map +1 -1
- package/dist/commands/crm/custom-objects.js +39 -2
- package/dist/commands/crm/custom-objects.js.map +1 -1
- package/dist/commands/crm/dated.js +3 -3
- package/dist/commands/crm/dated.js.map +1 -1
- package/dist/commands/crm/migration.js +210 -2
- package/dist/commands/crm/migration.js.map +1 -1
- package/dist/commands/crm/properties.js +2 -1
- package/dist/commands/crm/properties.js.map +1 -1
- package/dist/commands/crm/property-batch.d.ts +1 -0
- package/dist/commands/crm/property-batch.js +44 -5
- package/dist/commands/crm/property-batch.js.map +1 -1
- package/dist/commands/crm/shared.js +21 -2
- package/dist/commands/crm/shared.js.map +1 -1
- package/dist/commands/crm/sync.js +1 -1
- package/dist/commands/crm/sync.js.map +1 -1
- package/dist/commands/doctor/index.js +193 -0
- package/dist/commands/doctor/index.js.map +1 -1
- package/dist/commands/email-tracking/index.d.ts +16 -0
- package/dist/commands/email-tracking/index.js +314 -0
- package/dist/commands/email-tracking/index.js.map +1 -0
- package/dist/commands/extensions/index.js +1 -1
- package/dist/commands/extensions/index.js.map +1 -1
- package/dist/commands/forms/index.js +15 -2
- package/dist/commands/forms/index.js.map +1 -1
- package/dist/commands/forms/legacy-v2.d.ts +7 -2
- package/dist/commands/forms/legacy-v2.js +103 -7
- package/dist/commands/forms/legacy-v2.js.map +1 -1
- package/dist/commands/guide/index.d.ts +3 -0
- package/dist/commands/guide/index.js +75 -16
- package/dist/commands/guide/index.js.map +1 -1
- package/dist/commands/internal/catalog.d.ts +1 -0
- package/dist/commands/internal/catalog.js +2 -0
- package/dist/commands/internal/catalog.js.map +1 -0
- package/dist/commands/internal/index.d.ts +26 -0
- package/dist/commands/internal/index.js +823 -0
- package/dist/commands/internal/index.js.map +1 -0
- package/dist/commands/internal-session.d.ts +15 -0
- package/dist/commands/internal-session.js +152 -0
- package/dist/commands/internal-session.js.map +1 -0
- package/dist/commands/lists/index.js +1 -1
- package/dist/commands/lists/index.js.map +1 -1
- package/dist/commands/marketing/email-audit.d.ts +32 -0
- package/dist/commands/marketing/email-audit.js +121 -0
- package/dist/commands/marketing/email-audit.js.map +1 -0
- package/dist/commands/marketing/index.js +2 -0
- package/dist/commands/marketing/index.js.map +1 -1
- package/dist/commands/mcp.js +5 -3
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/playbooks/index.d.ts +3 -0
- package/dist/commands/playbooks/index.js +228 -0
- package/dist/commands/playbooks/index.js.map +1 -0
- package/dist/commands/portals/index.d.ts +3 -0
- package/dist/commands/portals/index.js +132 -0
- package/dist/commands/portals/index.js.map +1 -0
- package/dist/commands/reports/index.d.ts +3 -0
- package/dist/commands/reports/index.js +479 -0
- package/dist/commands/reports/index.js.map +1 -0
- package/dist/commands/sales-content/index.d.ts +13 -0
- package/dist/commands/sales-content/index.js +59 -0
- package/dist/commands/sales-content/index.js.map +1 -0
- package/dist/commands/sales-templates/index.d.ts +3 -0
- package/dist/commands/sales-templates/index.js +88 -0
- package/dist/commands/sales-templates/index.js.map +1 -0
- package/dist/commands/seed/cms.js +28 -45
- package/dist/commands/seed/cms.js.map +1 -1
- package/dist/commands/sequences/index.d.ts +18 -0
- package/dist/commands/sequences/index.js +263 -0
- package/dist/commands/sequences/index.js.map +1 -0
- package/dist/commands/settings/index.js +450 -102
- package/dist/commands/settings/index.js.map +1 -1
- package/dist/commands/settings/site-settings.d.ts +3 -0
- package/dist/commands/settings/site-settings.js +106 -0
- package/dist/commands/settings/site-settings.js.map +1 -0
- package/dist/commands/ui/index.d.ts +3 -0
- package/dist/commands/ui/index.js +422 -0
- package/dist/commands/ui/index.js.map +1 -0
- package/dist/commands/workflows/index.js +2 -0
- package/dist/commands/workflows/index.js.map +1 -1
- package/dist/commands/workflows/preflight.d.ts +23 -0
- package/dist/commands/workflows/preflight.js +295 -0
- package/dist/commands/workflows/preflight.js.map +1 -0
- package/dist/core/action-contract.d.ts +43 -0
- package/dist/core/action-contract.js +207 -0
- package/dist/core/action-contract.js.map +1 -0
- package/dist/core/auth.d.ts +6 -0
- package/dist/core/auth.js +85 -0
- package/dist/core/auth.js.map +1 -1
- package/dist/core/http.d.ts +8 -0
- package/dist/core/http.js +37 -5
- package/dist/core/http.js.map +1 -1
- package/dist/core/id-maps.d.ts +27 -0
- package/dist/core/id-maps.js +204 -0
- package/dist/core/id-maps.js.map +1 -0
- package/dist/core/output.d.ts +2 -1
- package/dist/core/output.js +34 -0
- package/dist/core/output.js.map +1 -1
- package/dist/mcp/profiles.d.ts +14 -0
- package/dist/mcp/profiles.js +68 -0
- package/dist/mcp/profiles.js.map +1 -0
- package/dist/mcp/server.d.ts +5 -3
- package/dist/mcp/server.js +22 -5
- package/dist/mcp/server.js.map +1 -1
- package/docs/CAPABILITY_LIBRARY.md +29 -8
- package/docs/COMMAND_TREE.md +98 -17
- package/docs/COMPARISON.md +8 -5
- package/docs/COOKBOOK.md +127 -5
- package/docs/INTERNAL-ENDPOINTS-DISCOVERY.md +813 -0
- package/docs/INTERNAL-ENDPOINTS.md +371 -0
- package/docs/INTERNAL_ENDPOINTS.md +243 -0
- package/docs/MARKETING_SETUP.md +21 -1
- package/docs/MCP.md +28 -89
- package/docs/MCP_TOOL_CATALOG.md +192 -0
- package/docs/MIGRATION_ADAPTERS.md +115 -0
- package/docs/PORTAL_BACKUP.md +212 -0
- package/docs/PUBLISHING.md +1 -1
- package/docs/SALES_CONTENT_INTERNAL_PUNCH_LIST.md +504 -0
- package/docs/TUTORIALS/secure-agent-writes.md +49 -0
- package/docs/WHY_HOW_WHAT.md +10 -4
- package/package.json +4 -2
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { CliError, printResult } from "../../core/output.js";
|
|
3
|
+
import { encodePathSegment } from "../crm/shared.js";
|
|
4
|
+
import { addBrowserSessionOptions, resolveBrowserSession } from "../internal-session.js";
|
|
5
|
+
export function registerSalesTemplates(program, getCtx) {
|
|
6
|
+
const templates = program
|
|
7
|
+
.command("sales-templates")
|
|
8
|
+
.description("Internal HubSpot sales-template backup helpers");
|
|
9
|
+
addBrowserSessionOptions(templates
|
|
10
|
+
.command("list")
|
|
11
|
+
.description("List sales templates through the internal template catalog")).action(async (opts) => {
|
|
12
|
+
const ctx = getCtx();
|
|
13
|
+
const session = resolveBrowserSession(ctx, opts, "Sales-template list", true);
|
|
14
|
+
const res = await session.client.request(`/api/templates/v1/templates?portalId=${encodeURIComponent(session.portalId)}`);
|
|
15
|
+
printResult(ctx, res);
|
|
16
|
+
});
|
|
17
|
+
addBrowserSessionOptions(templates
|
|
18
|
+
.command("get")
|
|
19
|
+
.argument("<id>")
|
|
20
|
+
.description("Fetch a full internal sales-template payload")).action(async (id, opts) => {
|
|
21
|
+
const ctx = getCtx();
|
|
22
|
+
const session = resolveBrowserSession(ctx, opts, "Sales-template get", true);
|
|
23
|
+
const templateId = encodePathSegment(id, "templateId");
|
|
24
|
+
const res = await session.client.request(`/api/sales-templates/v2/templates/${templateId}?portalId=${encodeURIComponent(session.portalId)}`);
|
|
25
|
+
printResult(ctx, res);
|
|
26
|
+
});
|
|
27
|
+
addBrowserSessionOptions(templates
|
|
28
|
+
.command("usage")
|
|
29
|
+
.description("Read sales-template quota and usage")).action(async (opts) => {
|
|
30
|
+
const ctx = getCtx();
|
|
31
|
+
const session = resolveBrowserSession(ctx, opts, "Sales-template usage", true);
|
|
32
|
+
const res = await session.client.request(`/api/sales-templates/v2/templates/usage?portalId=${encodeURIComponent(session.portalId)}`);
|
|
33
|
+
printResult(ctx, res);
|
|
34
|
+
});
|
|
35
|
+
addBrowserSessionOptions(templates
|
|
36
|
+
.command("create")
|
|
37
|
+
.description("Create a sales template via POST /api/sales-templates/v2/templates")
|
|
38
|
+
.option("--name <name>", "Template name")
|
|
39
|
+
.option("--subject <subject>", "Email subject line")
|
|
40
|
+
.option("--body <html>", "Body HTML inline")
|
|
41
|
+
.option("--body-file <path>", "Read body HTML from a file")
|
|
42
|
+
.option("--folder-id <id>", "Optional folderId")
|
|
43
|
+
.option("--from-file <path>", "Read the entire create payload from JSON file (overrides other flags)")).action(async (opts) => {
|
|
44
|
+
const ctx = getCtx();
|
|
45
|
+
const session = resolveBrowserSession(ctx, opts, "Sales-template create", true);
|
|
46
|
+
const body = opts.fromFile ? readJsonFileFlag(opts.fromFile, "--from-file") : buildCreateTemplateBody(opts);
|
|
47
|
+
const res = await session.client.request(`/api/sales-templates/v2/templates?portalId=${encodeURIComponent(session.portalId)}`, { method: "POST", body, permissionMode: "write" });
|
|
48
|
+
printResult(ctx, res);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function buildCreateTemplateBody(opts) {
|
|
52
|
+
if (!opts.name?.trim()) {
|
|
53
|
+
throw new CliError("INVALID_FLAG", "--name is required for sales-templates create (or use --from-file)");
|
|
54
|
+
}
|
|
55
|
+
const body = { name: opts.name.trim() };
|
|
56
|
+
if (opts.subject !== undefined)
|
|
57
|
+
body.subject = opts.subject;
|
|
58
|
+
if (opts.bodyFile)
|
|
59
|
+
body.body = readFileFlag(opts.bodyFile, "--body-file");
|
|
60
|
+
else if (opts.body !== undefined)
|
|
61
|
+
body.body = opts.body;
|
|
62
|
+
if (opts.folderId) {
|
|
63
|
+
const n = Number(opts.folderId);
|
|
64
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
65
|
+
throw new CliError("INVALID_FLAG", "--folder-id must be a positive integer");
|
|
66
|
+
}
|
|
67
|
+
body.folderId = n;
|
|
68
|
+
}
|
|
69
|
+
return body;
|
|
70
|
+
}
|
|
71
|
+
function readFileFlag(path, flag) {
|
|
72
|
+
try {
|
|
73
|
+
return readFileSync(path, "utf8");
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
throw new CliError("INVALID_FLAG", `${flag} cannot read ${path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function readJsonFileFlag(path, flag) {
|
|
80
|
+
const raw = readFileFlag(path, flag);
|
|
81
|
+
try {
|
|
82
|
+
return JSON.parse(raw);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
throw new CliError("INVALID_JSON", `${flag} payload is not valid JSON`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sales-templates/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ import { errorReason, nowIso, safeCreate } from "./shared.js";
|
|
|
5
5
|
*/
|
|
6
6
|
export async function seedCms(ctx, result) {
|
|
7
7
|
const { client, runSuffix } = ctx;
|
|
8
|
+
const seededSitePages = [];
|
|
9
|
+
const seededLandingPages = [];
|
|
8
10
|
// --- URL redirect ---
|
|
9
11
|
try {
|
|
10
12
|
const rec = await safeCreate(client, "/cms/v3/url-redirects", {
|
|
@@ -37,8 +39,10 @@ export async function seedCms(ctx, result) {
|
|
|
37
39
|
metaDescription: "A sample site page created by hscli seed for testing.",
|
|
38
40
|
language: "en",
|
|
39
41
|
});
|
|
40
|
-
if (rec)
|
|
42
|
+
if (rec) {
|
|
41
43
|
result.created.push({ type: "site_page", name: pageName, id: rec.id });
|
|
44
|
+
seededSitePages.push({ id: rec.id, name: pageName });
|
|
45
|
+
}
|
|
42
46
|
}
|
|
43
47
|
catch (err) {
|
|
44
48
|
result.skipped.push({ type: "site_page", name: "HubCLI Seed Site Page", reason: errorReason(err) });
|
|
@@ -52,8 +56,10 @@ export async function seedCms(ctx, result) {
|
|
|
52
56
|
htmlTitle: "HubCLI Seed Landing Page",
|
|
53
57
|
language: "en",
|
|
54
58
|
});
|
|
55
|
-
if (rec)
|
|
59
|
+
if (rec) {
|
|
56
60
|
result.created.push({ type: "landing_page", name: lpName, id: rec.id });
|
|
61
|
+
seededLandingPages.push({ id: rec.id, name: lpName });
|
|
62
|
+
}
|
|
57
63
|
}
|
|
58
64
|
catch (err) {
|
|
59
65
|
result.skipped.push({ type: "landing_page", name: "HubCLI Seed Landing Page", reason: errorReason(err) });
|
|
@@ -136,49 +142,9 @@ export async function seedCms(ctx, result) {
|
|
|
136
142
|
catch (err) {
|
|
137
143
|
result.skipped.push({ type: "hubdb_table", name: "hscli_seed_table", reason: errorReason(err) });
|
|
138
144
|
}
|
|
139
|
-
// --- Revisions + push-live for
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
for (const sp of sitePages.results?.slice(0, 2) ?? []) {
|
|
143
|
-
if (!sp.id)
|
|
144
|
-
continue;
|
|
145
|
-
try {
|
|
146
|
-
await client.request(`/cms/v3/pages/site-pages/${sp.id}/draft`, {
|
|
147
|
-
method: "PATCH",
|
|
148
|
-
body: { metaDescription: `Revised by hscli seed at ${nowIso()}` },
|
|
149
|
-
});
|
|
150
|
-
result.created.push({ type: "revision:site_page", name: sp.name || sp.id, id: sp.id });
|
|
151
|
-
try {
|
|
152
|
-
await client.request(`/cms/v3/pages/site-pages/${sp.id}/draft/push-live`, { method: "POST", body: {} });
|
|
153
|
-
result.created.push({ type: "publish:site_page", name: sp.name || sp.id, id: sp.id });
|
|
154
|
-
}
|
|
155
|
-
catch { /* ignore publish failure */ }
|
|
156
|
-
}
|
|
157
|
-
catch { /* ignore */ }
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
catch { /* ignore */ }
|
|
161
|
-
try {
|
|
162
|
-
const lpList = await client.request("/cms/v3/pages/landing-pages?limit=5");
|
|
163
|
-
for (const lp of lpList.results?.slice(0, 2) ?? []) {
|
|
164
|
-
if (!lp.id)
|
|
165
|
-
continue;
|
|
166
|
-
try {
|
|
167
|
-
await client.request(`/cms/v3/pages/landing-pages/${lp.id}/draft`, {
|
|
168
|
-
method: "PATCH",
|
|
169
|
-
body: { metaDescription: `Revised by hscli seed at ${nowIso()}` },
|
|
170
|
-
});
|
|
171
|
-
result.created.push({ type: "revision:landing_page", name: lp.name || lp.id, id: lp.id });
|
|
172
|
-
try {
|
|
173
|
-
await client.request(`/cms/v3/pages/landing-pages/${lp.id}/draft/push-live`, { method: "POST", body: {} });
|
|
174
|
-
result.created.push({ type: "publish:landing_page", name: lp.name || lp.id, id: lp.id });
|
|
175
|
-
}
|
|
176
|
-
catch { /* ignore */ }
|
|
177
|
-
}
|
|
178
|
-
catch { /* ignore */ }
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
catch { /* ignore */ }
|
|
145
|
+
// --- Revisions + push-live only for pages created by this seed run ---
|
|
146
|
+
await reviseAndPublishSeededPages(client, result, "site_page", "/cms/v3/pages/site-pages", seededSitePages);
|
|
147
|
+
await reviseAndPublishSeededPages(client, result, "landing_page", "/cms/v3/pages/landing-pages", seededLandingPages);
|
|
182
148
|
// --- Attempt to create a blog (requires a connected domain) ---
|
|
183
149
|
try {
|
|
184
150
|
const existingBlogs = await client.request("/cms/v3/blogs/posts?limit=1");
|
|
@@ -201,4 +167,21 @@ export async function seedCms(ctx, result) {
|
|
|
201
167
|
}
|
|
202
168
|
catch { /* ignore */ }
|
|
203
169
|
}
|
|
170
|
+
async function reviseAndPublishSeededPages(client, result, type, basePath, pages) {
|
|
171
|
+
for (const page of pages) {
|
|
172
|
+
try {
|
|
173
|
+
await client.request(`${basePath}/${page.id}/draft`, {
|
|
174
|
+
method: "PATCH",
|
|
175
|
+
body: { metaDescription: `Revised by hscli seed at ${nowIso()}` },
|
|
176
|
+
});
|
|
177
|
+
result.created.push({ type: `revision:${type}`, name: page.name, id: page.id });
|
|
178
|
+
try {
|
|
179
|
+
await client.request(`${basePath}/${page.id}/draft/push-live`, { method: "POST", body: {} });
|
|
180
|
+
result.created.push({ type: `publish:${type}`, name: page.name, id: page.id });
|
|
181
|
+
}
|
|
182
|
+
catch { /* ignore publish failure */ }
|
|
183
|
+
}
|
|
184
|
+
catch { /* ignore revision failure */ }
|
|
185
|
+
}
|
|
186
|
+
}
|
|
204
187
|
//# sourceMappingURL=cms.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cms.js","sourceRoot":"","sources":["../../../src/commands/seed/cms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAgB,EAAE,MAAkB;IAChE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"cms.js","sourceRoot":"","sources":["../../../src/commands/seed/cms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import type { HubSpotClient } from "../../core/http.js";
|
|
3
|
+
import type { CliContext } from "../../core/output.js";
|
|
4
|
+
export declare function registerSequencesInternal(program: Command, getCtx: () => CliContext): void;
|
|
5
|
+
interface BuildEggOptions {
|
|
6
|
+
destPortalId: number;
|
|
7
|
+
ownerId: number;
|
|
8
|
+
templateMap: Map<number | string, number>;
|
|
9
|
+
rename?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Strip server-set IDs/timestamps from a source sequence payload and
|
|
13
|
+
* remap owner + template references so it can be POSTed to a
|
|
14
|
+
* destination portal.
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildSequenceEgg(sequence: Record<string, unknown>, options: BuildEggOptions): Record<string, unknown>;
|
|
17
|
+
export declare function createSequence(client: HubSpotClient, portalId: string, sequenceEgg: unknown): Promise<unknown>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { CliError, printResult } from "../../core/output.js";
|
|
3
|
+
import { encodePathSegment } from "../crm/shared.js";
|
|
4
|
+
import { addBrowserSessionOptions, resolveBrowserSession } from "../internal-session.js";
|
|
5
|
+
import { searchSalesContent } from "../sales-content/index.js";
|
|
6
|
+
import { setContentPermissions } from "../content-permissions/index.js";
|
|
7
|
+
export function registerSequencesInternal(program, getCtx) {
|
|
8
|
+
const sequences = program
|
|
9
|
+
.command("sequences")
|
|
10
|
+
.description("Internal HubSpot sequences backup/migration helpers");
|
|
11
|
+
addBrowserSessionOptions(sequences
|
|
12
|
+
.command("list")
|
|
13
|
+
.option("--query <query>", "Search query", "")
|
|
14
|
+
.option("--limit <n>", "Page size", "100")
|
|
15
|
+
.option("--offset <n>", "Offset", "0")).action(async (opts) => {
|
|
16
|
+
const ctx = getCtx();
|
|
17
|
+
const session = resolveBrowserSession(ctx, opts, "Internal sequence list", true);
|
|
18
|
+
const res = await searchSalesContent(session.client, session.portalId, { ...opts, type: "SEQUENCE" });
|
|
19
|
+
printResult(ctx, res);
|
|
20
|
+
});
|
|
21
|
+
addBrowserSessionOptions(sequences
|
|
22
|
+
.command("get")
|
|
23
|
+
.argument("<id>")
|
|
24
|
+
.description("Fetch the internal full sequence payload")).action(async (id, opts) => {
|
|
25
|
+
const ctx = getCtx();
|
|
26
|
+
const session = resolveBrowserSession(ctx, opts, "Internal sequence get", true);
|
|
27
|
+
const sequenceId = encodePathSegment(id, "sequenceId");
|
|
28
|
+
const res = await session.client.request(`/api/sequences/v3/sequences/${sequenceId}?portalId=${encodeURIComponent(session.portalId)}`);
|
|
29
|
+
printResult(ctx, res);
|
|
30
|
+
});
|
|
31
|
+
addBrowserSessionOptions(sequences
|
|
32
|
+
.command("create")
|
|
33
|
+
.description("POST a new sequence from a sequenceEgg JSON payload")
|
|
34
|
+
.requiredOption("--from-file <path>", "Path to a JSON file containing { sequenceEgg: {...} } or a bare sequenceEgg")).action(async (opts) => {
|
|
35
|
+
const ctx = getCtx();
|
|
36
|
+
const session = resolveBrowserSession(ctx, opts, "Internal sequence create", true);
|
|
37
|
+
const body = readSequenceEggFile(opts.fromFile);
|
|
38
|
+
const res = await session.client.request(`/api/sequences/v3/sequences/create?portalId=${encodeURIComponent(session.portalId)}`, { method: "POST", body, permissionMode: "write" });
|
|
39
|
+
printResult(ctx, res);
|
|
40
|
+
});
|
|
41
|
+
addBrowserSessionOptions(sequences
|
|
42
|
+
.command("delete")
|
|
43
|
+
.description("Batch-delete sequences via DELETE /api/sequences/v3/sequences/batch")
|
|
44
|
+
.requiredOption("--ids <ids>", "Comma-separated sequence IDs")).action(async (opts) => {
|
|
45
|
+
const ctx = getCtx();
|
|
46
|
+
const session = resolveBrowserSession(ctx, opts, "Internal sequence delete", true);
|
|
47
|
+
const ids = parseIdList(opts.ids, "--ids");
|
|
48
|
+
const res = await session.client.request(`/api/sequences/v3/sequences/batch?portalId=${encodeURIComponent(session.portalId)}`, { method: "DELETE", body: { ids }, permissionMode: "write" });
|
|
49
|
+
printResult(ctx, res);
|
|
50
|
+
});
|
|
51
|
+
addBrowserSessionOptions(sequences
|
|
52
|
+
.command("migrate")
|
|
53
|
+
.description("Migrate a sequence src→dest: fetch source body, remap templateIds + owner, create on dest, set permissions")
|
|
54
|
+
.argument("<id>", "Source sequence ID")
|
|
55
|
+
.requiredOption("--src-portal-id <id>", "Source portal ID")
|
|
56
|
+
.option("--src-cookie <header>", "Source browser cookie (defaults to --cookie)")
|
|
57
|
+
.option("--src-cookie-file <path>", "Source cookie file (defaults to --cookie-file)")
|
|
58
|
+
.option("--src-csrf <token>", "Source CSRF token (defaults to --csrf)")
|
|
59
|
+
.requiredOption("--owner-id <id>", "Destination owner userId (sequence.userId)")
|
|
60
|
+
.option("--template-map <path>", "Path to JSON map { srcTemplateId: dstTemplateId } to remap email steps")
|
|
61
|
+
.option("--teams <ids>", "Comma-separated team IDs for destination permissions")
|
|
62
|
+
.option("--users <ids>", "Comma-separated user IDs for destination permissions (defaults to --owner-id)")
|
|
63
|
+
.option("--rename <name>", "Override the sequence name on destination")
|
|
64
|
+
.option("--dry-run", "Print transformed sequenceEgg without POSTing")).action(async (id, opts) => {
|
|
65
|
+
const ctx = getCtx();
|
|
66
|
+
const destSession = resolveBrowserSession(ctx, opts, "Sequence migrate destination", true);
|
|
67
|
+
const srcSession = resolveBrowserSession(ctx, {
|
|
68
|
+
portalId: opts.srcPortalId,
|
|
69
|
+
cookie: opts.srcCookie ?? opts.cookie,
|
|
70
|
+
cookieFile: opts.srcCookieFile ?? opts.cookieFile,
|
|
71
|
+
csrf: opts.srcCsrf ?? opts.csrf,
|
|
72
|
+
uiDomain: opts.uiDomain,
|
|
73
|
+
}, "Sequence migrate source", true);
|
|
74
|
+
const sequenceId = encodePathSegment(id, "sequenceId");
|
|
75
|
+
const srcRes = (await srcSession.client.request(`/api/sequences/v3/sequences/${sequenceId}?portalId=${encodeURIComponent(srcSession.portalId)}`));
|
|
76
|
+
if (!srcRes?.sequence) {
|
|
77
|
+
throw new CliError("MIGRATE_NO_SOURCE", `Source sequence ${id} did not return a sequence payload`);
|
|
78
|
+
}
|
|
79
|
+
const templateMap = opts.templateMap ? parseTemplateMap(readFileFlag(opts.templateMap, "--template-map")) : new Map();
|
|
80
|
+
const ownerId = Number(opts.ownerId);
|
|
81
|
+
if (!Number.isInteger(ownerId) || ownerId <= 0) {
|
|
82
|
+
throw new CliError("INVALID_FLAG", "--owner-id must be a positive integer");
|
|
83
|
+
}
|
|
84
|
+
const egg = buildSequenceEgg(srcRes.sequence, {
|
|
85
|
+
destPortalId: Number(destSession.portalId),
|
|
86
|
+
ownerId,
|
|
87
|
+
templateMap,
|
|
88
|
+
rename: opts.rename,
|
|
89
|
+
});
|
|
90
|
+
if (ctx.dryRun || opts.dryRun) {
|
|
91
|
+
printResult(ctx, { dryRun: true, sequenceEgg: egg });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const createRes = (await destSession.client.request(`/api/sequences/v3/sequences/create?portalId=${encodeURIComponent(destSession.portalId)}`, { method: "POST", body: { sequenceEgg: egg }, permissionMode: "write" }));
|
|
95
|
+
const newId = createRes?.sequence?.id;
|
|
96
|
+
let permResult = null;
|
|
97
|
+
if (newId && (opts.teams || opts.users)) {
|
|
98
|
+
const teamIds = opts.teams ? parseIdList(opts.teams, "--teams") : [];
|
|
99
|
+
const userIds = opts.users ? parseIdList(opts.users, "--users") : [ownerId];
|
|
100
|
+
permResult = await setContentPermissions(destSession.client, destSession.portalId, {
|
|
101
|
+
objectType: "SEQUENCE",
|
|
102
|
+
objectIds: [newId],
|
|
103
|
+
teamIds,
|
|
104
|
+
userIds,
|
|
105
|
+
visibleToAll: false,
|
|
106
|
+
private: false,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
printResult(ctx, { newSequenceId: newId, create: createRes, permissions: permResult });
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Strip server-set IDs/timestamps from a source sequence payload and
|
|
114
|
+
* remap owner + template references so it can be POSTed to a
|
|
115
|
+
* destination portal.
|
|
116
|
+
*/
|
|
117
|
+
export function buildSequenceEgg(sequence, options) {
|
|
118
|
+
const cloned = deepClone(sequence);
|
|
119
|
+
delete cloned.id;
|
|
120
|
+
delete cloned.createdAt;
|
|
121
|
+
delete cloned.updatedAt;
|
|
122
|
+
delete cloned.deletedAt;
|
|
123
|
+
cloned.portalId = options.destPortalId;
|
|
124
|
+
cloned.userId = options.ownerId;
|
|
125
|
+
cloned.folderId = null;
|
|
126
|
+
if (typeof options.rename === "string" && options.rename.trim()) {
|
|
127
|
+
cloned.name = options.rename.trim();
|
|
128
|
+
}
|
|
129
|
+
cloned.active = "INACTIVE";
|
|
130
|
+
const steps = Array.isArray(cloned.steps) ? cloned.steps : [];
|
|
131
|
+
cloned.steps = steps
|
|
132
|
+
.filter((s) => Boolean(s) && typeof s === "object")
|
|
133
|
+
.filter((s) => s.actionType !== "FINISH_ENROLLMENT") // server appends FINISH_ENROLLMENT automatically
|
|
134
|
+
.map((step) => {
|
|
135
|
+
const copy = { ...step };
|
|
136
|
+
delete copy.id;
|
|
137
|
+
delete copy.sequenceId;
|
|
138
|
+
delete copy.createdAt;
|
|
139
|
+
delete copy.updatedAt;
|
|
140
|
+
delete copy.deletedAt;
|
|
141
|
+
if (copy.emailPattern && typeof copy.emailPattern === "object") {
|
|
142
|
+
const emailPattern = { ...copy.emailPattern };
|
|
143
|
+
delete emailPattern.id;
|
|
144
|
+
delete emailPattern.sequenceId;
|
|
145
|
+
delete emailPattern.sequenceStepId;
|
|
146
|
+
delete emailPattern.createdAt;
|
|
147
|
+
delete emailPattern.updatedAt;
|
|
148
|
+
delete emailPattern.deletedAt;
|
|
149
|
+
const srcTpl = emailPattern.templateId;
|
|
150
|
+
if (typeof srcTpl === "number" || typeof srcTpl === "string") {
|
|
151
|
+
const mapped = options.templateMap.get(srcTpl) ?? options.templateMap.get(String(srcTpl));
|
|
152
|
+
if (mapped)
|
|
153
|
+
emailPattern.templateId = mapped;
|
|
154
|
+
}
|
|
155
|
+
copy.emailPattern = emailPattern;
|
|
156
|
+
}
|
|
157
|
+
if (copy.taskPattern && typeof copy.taskPattern === "object") {
|
|
158
|
+
const taskPattern = { ...copy.taskPattern };
|
|
159
|
+
delete taskPattern.id;
|
|
160
|
+
delete taskPattern.sequenceId;
|
|
161
|
+
delete taskPattern.sequenceStepId;
|
|
162
|
+
delete taskPattern.createdAt;
|
|
163
|
+
delete taskPattern.updatedAt;
|
|
164
|
+
delete taskPattern.deletedAt;
|
|
165
|
+
copy.taskPattern = taskPattern;
|
|
166
|
+
}
|
|
167
|
+
return copy;
|
|
168
|
+
});
|
|
169
|
+
const deps = Array.isArray(cloned.dependencies) ? cloned.dependencies : [];
|
|
170
|
+
cloned.dependencies = deps
|
|
171
|
+
.filter((d) => Boolean(d) && typeof d === "object")
|
|
172
|
+
.map((dep) => {
|
|
173
|
+
const copy = { ...dep };
|
|
174
|
+
delete copy.id;
|
|
175
|
+
delete copy.sequenceId;
|
|
176
|
+
delete copy.portalId;
|
|
177
|
+
delete copy.createdAt;
|
|
178
|
+
delete copy.updatedAt;
|
|
179
|
+
delete copy.deletedAt;
|
|
180
|
+
// Server resolves new sequenceStepIds from stepOrder + branchNumber refs
|
|
181
|
+
delete copy.requiredBySequenceStepId;
|
|
182
|
+
delete copy.reliesOnSequenceStepId;
|
|
183
|
+
return copy;
|
|
184
|
+
});
|
|
185
|
+
return cloned;
|
|
186
|
+
}
|
|
187
|
+
function readSequenceEggFile(path) {
|
|
188
|
+
let raw;
|
|
189
|
+
try {
|
|
190
|
+
raw = readFileSync(path, "utf8");
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
throw new CliError("INVALID_FLAG", `--from-file cannot read ${path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
194
|
+
}
|
|
195
|
+
let parsed;
|
|
196
|
+
try {
|
|
197
|
+
parsed = JSON.parse(raw);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
throw new CliError("INVALID_JSON", "--from-file payload is not valid JSON");
|
|
201
|
+
}
|
|
202
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed) && "sequenceEgg" in parsed) {
|
|
203
|
+
return parsed;
|
|
204
|
+
}
|
|
205
|
+
return { sequenceEgg: parsed };
|
|
206
|
+
}
|
|
207
|
+
function parseTemplateMap(raw) {
|
|
208
|
+
let parsed;
|
|
209
|
+
try {
|
|
210
|
+
parsed = JSON.parse(raw);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
throw new CliError("INVALID_JSON", "--template-map payload is not valid JSON");
|
|
214
|
+
}
|
|
215
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
216
|
+
throw new CliError("INVALID_JSON", "--template-map must be a JSON object of {srcId: dstId}");
|
|
217
|
+
}
|
|
218
|
+
const out = new Map();
|
|
219
|
+
for (const [k, v] of Object.entries(parsed)) {
|
|
220
|
+
const dst = Number(v);
|
|
221
|
+
if (!Number.isInteger(dst) || dst <= 0) {
|
|
222
|
+
throw new CliError("INVALID_JSON", `--template-map values must be positive integers (key ${k})`);
|
|
223
|
+
}
|
|
224
|
+
const numKey = Number(k);
|
|
225
|
+
if (Number.isInteger(numKey))
|
|
226
|
+
out.set(numKey, dst);
|
|
227
|
+
out.set(k, dst);
|
|
228
|
+
}
|
|
229
|
+
return out;
|
|
230
|
+
}
|
|
231
|
+
function parseIdList(raw, flag) {
|
|
232
|
+
const items = raw.split(",").map((s) => s.trim()).filter(Boolean);
|
|
233
|
+
if (!items.length) {
|
|
234
|
+
throw new CliError("INVALID_FLAG", `${flag} must contain at least one ID`);
|
|
235
|
+
}
|
|
236
|
+
return items.map((item) => {
|
|
237
|
+
const n = Number(item);
|
|
238
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
239
|
+
throw new CliError("INVALID_FLAG", `${flag} entries must be positive integers (got: ${item})`);
|
|
240
|
+
}
|
|
241
|
+
return n;
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
function readFileFlag(path, flag) {
|
|
245
|
+
try {
|
|
246
|
+
return readFileSync(path, "utf8");
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
throw new CliError("INVALID_FLAG", `${flag} cannot read ${path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function deepClone(value) {
|
|
253
|
+
return JSON.parse(JSON.stringify(value));
|
|
254
|
+
}
|
|
255
|
+
// Helper available for callers that want to inject a HubSpot client directly (tests, automation).
|
|
256
|
+
export async function createSequence(client, portalId, sequenceEgg) {
|
|
257
|
+
return client.request(`/api/sequences/v3/sequences/create?portalId=${encodeURIComponent(portalId)}`, {
|
|
258
|
+
method: "POST",
|
|
259
|
+
body: { sequenceEgg },
|
|
260
|
+
permissionMode: "write",
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sequences/index.ts"],"names":[],"mappings":"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"}
|