@revfleet/hscli 0.8.12 → 0.9.1
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 +197 -1
- package/README.md +243 -10
- package/dist/cli.js +27 -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/evidence.d.ts +68 -0
- package/dist/commands/agent/evidence.js +358 -0
- package/dist/commands/agent/evidence.js.map +1 -0
- package/dist/commands/agent/index.d.ts +3 -0
- package/dist/commands/agent/index.js +223 -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/audit/index.js +4 -0
- package/dist/commands/audit/index.js.map +1 -1
- 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 +1 -1
- package/dist/commands/guide/index.js +37 -4
- 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.js +14 -4
- package/dist/commands/ui/index.js.map +1 -1
- 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 +99 -17
- package/docs/COMPARISON.md +8 -5
- package/docs/COOKBOOK.md +124 -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,228 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { CliError, printResult } from "../../core/output.js";
|
|
3
|
+
import { addBrowserSessionOptions, resolveBrowserSession } from "../internal-session.js";
|
|
4
|
+
import { setContentPermissions } from "../content-permissions/index.js";
|
|
5
|
+
const PLAYBOOKS_RPC = "/api/chirp-frontend-app/v1/gateway/com.hubspot.playbooks.rpc.PlaybooksRpc";
|
|
6
|
+
const PLAYBOOK_QUESTIONS_RPC = "/api/chirp-frontend-app/v1/gateway/com.hubspot.playbooks.rpc.PlaybookQuestionsRpc";
|
|
7
|
+
export function registerPlaybooks(program, getCtx) {
|
|
8
|
+
const playbooks = program
|
|
9
|
+
.command("playbooks")
|
|
10
|
+
.description("Internal HubSpot playbook backup + migration helpers");
|
|
11
|
+
addBrowserSessionOptions(playbooks
|
|
12
|
+
.command("list")
|
|
13
|
+
.description("List playbooks with inline body/htmlBody when exposed by HubSpot")).action(async (opts) => {
|
|
14
|
+
const ctx = getCtx();
|
|
15
|
+
const session = resolveBrowserSession(ctx, opts, "Playbooks list", true);
|
|
16
|
+
const res = await session.client.request(`${PLAYBOOKS_RPC}/listPlaybooks`, { method: "POST", body: {}, permissionMode: "read" });
|
|
17
|
+
printResult(ctx, res);
|
|
18
|
+
});
|
|
19
|
+
addBrowserSessionOptions(playbooks
|
|
20
|
+
.command("get")
|
|
21
|
+
.argument("<id>")
|
|
22
|
+
.description("Read the latest version for one playbook")).action(async (id, opts) => {
|
|
23
|
+
const ctx = getCtx();
|
|
24
|
+
const session = resolveBrowserSession(ctx, opts, "Playbook get", true);
|
|
25
|
+
const res = await session.client.request(`${PLAYBOOKS_RPC}/getLatestPlaybookVersion`, { method: "POST", body: { playbookId: id }, permissionMode: "read" });
|
|
26
|
+
printResult(ctx, res);
|
|
27
|
+
});
|
|
28
|
+
addBrowserSessionOptions(playbooks
|
|
29
|
+
.command("questions")
|
|
30
|
+
.argument("<id>")
|
|
31
|
+
.description("Read latest playbook questions")).action(async (id, opts) => {
|
|
32
|
+
const ctx = getCtx();
|
|
33
|
+
const session = resolveBrowserSession(ctx, opts, "Playbook questions", true);
|
|
34
|
+
const res = await session.client.request(`${PLAYBOOK_QUESTIONS_RPC}/getLatestQuestionsByPlaybook`, { method: "POST", body: { playbookId: id }, permissionMode: "read" });
|
|
35
|
+
printResult(ctx, res);
|
|
36
|
+
});
|
|
37
|
+
addBrowserSessionOptions(playbooks
|
|
38
|
+
.command("versions")
|
|
39
|
+
.argument("<id>")
|
|
40
|
+
.description("Read playbook version history summaries")).action(async (id, opts) => {
|
|
41
|
+
const ctx = getCtx();
|
|
42
|
+
const session = resolveBrowserSession(ctx, opts, "Playbook versions", true);
|
|
43
|
+
const res = await session.client.request(`${PLAYBOOKS_RPC}/getPlaybookVersionSummaries`, { method: "POST", body: { playbookId: id }, permissionMode: "read" });
|
|
44
|
+
printResult(ctx, res);
|
|
45
|
+
});
|
|
46
|
+
addBrowserSessionOptions(playbooks
|
|
47
|
+
.command("create")
|
|
48
|
+
.description("Create a playbook via createPlaybook chirp RPC")
|
|
49
|
+
.option("--title <name>", "Playbook title")
|
|
50
|
+
.option("--type <type>", "playbookType (e.g. CALL_SCRIPT, HOW_TO)")
|
|
51
|
+
.option("--stage <stage>", "publicationStage (DRAFT|PUBLISHED)", "DRAFT")
|
|
52
|
+
.option("--html-body <html>", "Body HTML inline")
|
|
53
|
+
.option("--html-body-file <path>", "Read body HTML from a file")
|
|
54
|
+
.option("--engagement-types <list>", "Comma-separated engagement types (CALL,MEETING,EMAIL...)", "CALL")
|
|
55
|
+
.option("--visible-on <list>", "Comma-separated visibleOn values", "EVERYWHERE")
|
|
56
|
+
.option("--display-preference <pref>", "displayPreference", "SHOW_EVERYWHERE")
|
|
57
|
+
.option("--from-file <path>", "Read the entire createPlaybook request body from JSON file (overrides other flags)")).action(async (opts) => {
|
|
58
|
+
const ctx = getCtx();
|
|
59
|
+
const session = resolveBrowserSession(ctx, opts, "Playbook create", true);
|
|
60
|
+
const body = opts.fromFile ? readJsonFileFlag(opts.fromFile, "--from-file") : buildCreatePlaybookBody(opts);
|
|
61
|
+
const res = await session.client.request(`${PLAYBOOKS_RPC}/createPlaybook?portalId=${encodeURIComponent(session.portalId)}`, { method: "POST", body, permissionMode: "write" });
|
|
62
|
+
printResult(ctx, res);
|
|
63
|
+
});
|
|
64
|
+
addBrowserSessionOptions(playbooks
|
|
65
|
+
.command("update")
|
|
66
|
+
.argument("<id>")
|
|
67
|
+
.description("Update fields on an existing playbook via updatePlaybook chirp RPC")
|
|
68
|
+
.option("--title <name>", "New title")
|
|
69
|
+
.option("--html-body <html>", "New body HTML inline")
|
|
70
|
+
.option("--html-body-file <path>", "Read new body HTML from a file")
|
|
71
|
+
.option("--publication-stage <stage>", "publicationStage (DRAFT|PUBLISHED)")
|
|
72
|
+
.option("--from-file <path>", "Read the entire updatePlaybook request body from JSON file")).action(async (id, opts) => {
|
|
73
|
+
const ctx = getCtx();
|
|
74
|
+
const session = resolveBrowserSession(ctx, opts, "Playbook update", true);
|
|
75
|
+
const body = opts.fromFile
|
|
76
|
+
? { playbookId: id, ...readJsonFileFlag(opts.fromFile, "--from-file") }
|
|
77
|
+
: buildUpdatePlaybookBody(id, opts);
|
|
78
|
+
const res = await session.client.request(`${PLAYBOOKS_RPC}/updatePlaybook?portalId=${encodeURIComponent(session.portalId)}`, { method: "POST", body, permissionMode: "write" });
|
|
79
|
+
printResult(ctx, res);
|
|
80
|
+
});
|
|
81
|
+
addBrowserSessionOptions(playbooks
|
|
82
|
+
.command("delete")
|
|
83
|
+
.argument("<id>")
|
|
84
|
+
.description("Delete a playbook via deletePlaybook chirp RPC")).action(async (id, opts) => {
|
|
85
|
+
const ctx = getCtx();
|
|
86
|
+
const session = resolveBrowserSession(ctx, opts, "Playbook delete", true);
|
|
87
|
+
const res = await session.client.request(`${PLAYBOOKS_RPC}/deletePlaybook?portalId=${encodeURIComponent(session.portalId)}`, { method: "POST", body: { playbookId: id }, permissionMode: "write" });
|
|
88
|
+
printResult(ctx, res);
|
|
89
|
+
});
|
|
90
|
+
addBrowserSessionOptions(playbooks
|
|
91
|
+
.command("migrate")
|
|
92
|
+
.argument("<id>", "Source playbook ID")
|
|
93
|
+
.description("Migrate playbook src→dest: read source body, create on dest with same htmlBody, optional rename + permissions")
|
|
94
|
+
.requiredOption("--src-portal-id <id>", "Source portal ID")
|
|
95
|
+
.option("--src-cookie <header>", "Source browser cookie")
|
|
96
|
+
.option("--src-cookie-file <path>", "Source cookie file")
|
|
97
|
+
.option("--src-csrf <token>", "Source CSRF token")
|
|
98
|
+
.option("--rename <name>", "Override the playbook title on destination")
|
|
99
|
+
.option("--teams <ids>", "Comma-separated team IDs to set on destination")
|
|
100
|
+
.option("--users <ids>", "Comma-separated user IDs (default --owner-id if provided)")
|
|
101
|
+
.option("--owner-id <id>", "Destination owner userId (sets permissionedUserIds to [ownerId] if --users omitted)")
|
|
102
|
+
.option("--dry-run", "Print transformed create body without POSTing")).action(async (id, opts) => {
|
|
103
|
+
const ctx = getCtx();
|
|
104
|
+
const destSession = resolveBrowserSession(ctx, opts, "Playbook migrate destination", true);
|
|
105
|
+
const srcSession = resolveBrowserSession(ctx, {
|
|
106
|
+
portalId: opts.srcPortalId,
|
|
107
|
+
cookie: opts.srcCookie ?? opts.cookie,
|
|
108
|
+
cookieFile: opts.srcCookieFile ?? opts.cookieFile,
|
|
109
|
+
csrf: opts.srcCsrf ?? opts.csrf,
|
|
110
|
+
uiDomain: opts.uiDomain,
|
|
111
|
+
}, "Playbook migrate source", true);
|
|
112
|
+
const srcRes = (await srcSession.client.request(`${PLAYBOOKS_RPC}/getLatestPlaybookVersion`, { method: "POST", body: { playbookId: id }, permissionMode: "read" }));
|
|
113
|
+
const playbook = chirpUnwrap(srcRes) ?? null;
|
|
114
|
+
if (!playbook || typeof playbook !== "object") {
|
|
115
|
+
throw new CliError("MIGRATE_NO_SOURCE", `Source playbook ${id} did not return a payload`);
|
|
116
|
+
}
|
|
117
|
+
const src = playbook;
|
|
118
|
+
const createBody = {
|
|
119
|
+
title: opts.rename?.trim() || src.title || `Migrated playbook ${id}`,
|
|
120
|
+
playbookType: src.playbookType || "CALL_SCRIPT",
|
|
121
|
+
publicationStage: "DRAFT",
|
|
122
|
+
htmlBody: typeof src.htmlBody === "string" ? src.htmlBody : "",
|
|
123
|
+
engagementTypes: Array.isArray(src.engagementTypes) ? src.engagementTypes : ["CALL"],
|
|
124
|
+
visibleOn: Array.isArray(src.visibleOn) ? src.visibleOn : ["EVERYWHERE"],
|
|
125
|
+
displayPreference: src.displayPreference || "SHOW_EVERYWHERE",
|
|
126
|
+
};
|
|
127
|
+
if (ctx.dryRun || opts.dryRun) {
|
|
128
|
+
printResult(ctx, { dryRun: true, createPlaybook: createBody });
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const createRes = (await destSession.client.request(`${PLAYBOOKS_RPC}/createPlaybook?portalId=${encodeURIComponent(destSession.portalId)}`, { method: "POST", body: createBody, permissionMode: "write" }));
|
|
132
|
+
const newId = createRes?.data?.playbook?.id;
|
|
133
|
+
let permResult = null;
|
|
134
|
+
if (newId && (opts.teams || opts.users || opts.ownerId)) {
|
|
135
|
+
const teamIds = opts.teams ? parseIdList(opts.teams, "--teams") : [];
|
|
136
|
+
const userIds = opts.users
|
|
137
|
+
? parseIdList(opts.users, "--users")
|
|
138
|
+
: opts.ownerId
|
|
139
|
+
? [Number(opts.ownerId)]
|
|
140
|
+
: [];
|
|
141
|
+
permResult = await setContentPermissions(destSession.client, destSession.portalId, {
|
|
142
|
+
objectType: "PLAYBOOK",
|
|
143
|
+
objectIds: [newId],
|
|
144
|
+
teamIds,
|
|
145
|
+
userIds,
|
|
146
|
+
visibleToAll: false,
|
|
147
|
+
private: false,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
printResult(ctx, { newPlaybookId: newId, create: createRes, permissions: permResult });
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function buildCreatePlaybookBody(opts) {
|
|
154
|
+
if (!opts.title?.trim()) {
|
|
155
|
+
throw new CliError("INVALID_FLAG", "--title is required (or use --from-file)");
|
|
156
|
+
}
|
|
157
|
+
const htmlBody = opts.htmlBodyFile
|
|
158
|
+
? readFileFlag(opts.htmlBodyFile, "--html-body-file")
|
|
159
|
+
: opts.htmlBody ?? "";
|
|
160
|
+
return {
|
|
161
|
+
title: opts.title.trim(),
|
|
162
|
+
playbookType: opts.type?.trim() || "CALL_SCRIPT",
|
|
163
|
+
publicationStage: opts.stage?.trim() || "DRAFT",
|
|
164
|
+
htmlBody,
|
|
165
|
+
engagementTypes: parseCsvList(opts.engagementTypes ?? "CALL"),
|
|
166
|
+
visibleOn: parseCsvList(opts.visibleOn ?? "EVERYWHERE"),
|
|
167
|
+
displayPreference: opts.displayPreference?.trim() || "SHOW_EVERYWHERE",
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function buildUpdatePlaybookBody(id, opts) {
|
|
171
|
+
const body = { playbookId: id };
|
|
172
|
+
if (opts.title)
|
|
173
|
+
body.title = opts.title.trim();
|
|
174
|
+
if (opts.htmlBodyFile)
|
|
175
|
+
body.htmlBody = readFileFlag(opts.htmlBodyFile, "--html-body-file");
|
|
176
|
+
else if (opts.htmlBody !== undefined)
|
|
177
|
+
body.htmlBody = opts.htmlBody;
|
|
178
|
+
if (opts.publicationStage)
|
|
179
|
+
body.publicationStage = opts.publicationStage.trim();
|
|
180
|
+
if (Object.keys(body).length === 1) {
|
|
181
|
+
throw new CliError("INVALID_FLAG", "playbooks update requires at least one of --title, --html-body, --html-body-file, --publication-stage, --from-file");
|
|
182
|
+
}
|
|
183
|
+
return body;
|
|
184
|
+
}
|
|
185
|
+
function chirpUnwrap(res) {
|
|
186
|
+
if (!res || typeof res !== "object" || Array.isArray(res))
|
|
187
|
+
return null;
|
|
188
|
+
const data = res.data;
|
|
189
|
+
if (!data || typeof data !== "object" || Array.isArray(data))
|
|
190
|
+
return null;
|
|
191
|
+
const playbook = data.playbook;
|
|
192
|
+
return playbook && typeof playbook === "object" && !Array.isArray(playbook)
|
|
193
|
+
? playbook
|
|
194
|
+
: data;
|
|
195
|
+
}
|
|
196
|
+
function parseCsvList(raw) {
|
|
197
|
+
return raw.split(",").map((s) => s.trim()).filter(Boolean);
|
|
198
|
+
}
|
|
199
|
+
function parseIdList(raw, flag) {
|
|
200
|
+
const items = raw.split(",").map((s) => s.trim()).filter(Boolean);
|
|
201
|
+
if (!items.length)
|
|
202
|
+
throw new CliError("INVALID_FLAG", `${flag} must contain at least one ID`);
|
|
203
|
+
return items.map((item) => {
|
|
204
|
+
const n = Number(item);
|
|
205
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
206
|
+
throw new CliError("INVALID_FLAG", `${flag} entries must be positive integers (got: ${item})`);
|
|
207
|
+
}
|
|
208
|
+
return n;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
function readFileFlag(path, flag) {
|
|
212
|
+
try {
|
|
213
|
+
return readFileSync(path, "utf8");
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
throw new CliError("INVALID_FLAG", `${flag} cannot read ${path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function readJsonFileFlag(path, flag) {
|
|
220
|
+
const raw = readFileFlag(path, flag);
|
|
221
|
+
try {
|
|
222
|
+
return JSON.parse(raw);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
throw new CliError("INVALID_JSON", `${flag} payload is not valid JSON`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/playbooks/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { detectHublet, getHscliHomeDir, getProfile, listProfiles, resolveApiDomain, } from "../../core/auth.js";
|
|
2
|
+
import { CliError, printResult } from "../../core/output.js";
|
|
3
|
+
import { parseNumberFlag } from "../crm/shared.js";
|
|
4
|
+
const AGENT_RUNBOOKS = ["data-cleanup", "pipeline-risk", "automation-risk"];
|
|
5
|
+
function displayHublet(profile) {
|
|
6
|
+
return profile.hublet?.trim() || detectHublet(profile) || "na1";
|
|
7
|
+
}
|
|
8
|
+
function displayApiDomain(profile) {
|
|
9
|
+
return profile.apiDomain?.trim() || resolveApiDomain(displayHublet(profile));
|
|
10
|
+
}
|
|
11
|
+
function summarizeProfile(profileName) {
|
|
12
|
+
const profile = getProfile(profileName);
|
|
13
|
+
return {
|
|
14
|
+
profile: profileName,
|
|
15
|
+
portalId: profile.portalId ?? null,
|
|
16
|
+
mode: profile.mode ?? "unset",
|
|
17
|
+
hublet: displayHublet(profile),
|
|
18
|
+
apiDomain: displayApiDomain(profile),
|
|
19
|
+
uiDomain: profile.uiDomain ?? null,
|
|
20
|
+
dataHostingLocation: profile.dataHostingLocation ?? null,
|
|
21
|
+
scopeCount: Array.isArray(profile.scopes) ? profile.scopes.length : 0,
|
|
22
|
+
hasToken: Boolean(profile.token?.trim()),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function parseProfileSelection(rawProfiles) {
|
|
26
|
+
const available = listProfiles();
|
|
27
|
+
if (!rawProfiles?.trim())
|
|
28
|
+
return available;
|
|
29
|
+
const requested = rawProfiles
|
|
30
|
+
.split(/[,\s]+/)
|
|
31
|
+
.map((item) => item.trim())
|
|
32
|
+
.filter(Boolean);
|
|
33
|
+
const missing = requested.filter((profile) => !available.includes(profile));
|
|
34
|
+
if (missing.length > 0) {
|
|
35
|
+
throw new CliError("PORTAL_PROFILE_NOT_FOUND", `Unknown profile(s): ${missing.join(", ")}`);
|
|
36
|
+
}
|
|
37
|
+
return requested;
|
|
38
|
+
}
|
|
39
|
+
function resolveRunbook(raw) {
|
|
40
|
+
if (AGENT_RUNBOOKS.includes(raw))
|
|
41
|
+
return raw;
|
|
42
|
+
throw new CliError("PORTAL_RUNBOOK_UNKNOWN", `Unknown runbook '${raw}'. Expected one of: ${AGENT_RUNBOOKS.join(", ")}`);
|
|
43
|
+
}
|
|
44
|
+
function shellQuoteArg(value) {
|
|
45
|
+
if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value))
|
|
46
|
+
return value;
|
|
47
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
48
|
+
}
|
|
49
|
+
function renderCommand(args) {
|
|
50
|
+
return args.map(shellQuoteArg).join(" ");
|
|
51
|
+
}
|
|
52
|
+
function renderProfileCommands(profile, runbook, opts) {
|
|
53
|
+
const commands = [];
|
|
54
|
+
if (opts.includeContext) {
|
|
55
|
+
commands.push(renderCommand([
|
|
56
|
+
"hscli",
|
|
57
|
+
"--profile",
|
|
58
|
+
profile.profile,
|
|
59
|
+
"--json",
|
|
60
|
+
"context",
|
|
61
|
+
"build",
|
|
62
|
+
"--sample-limit",
|
|
63
|
+
String(opts.sampleLimit),
|
|
64
|
+
]));
|
|
65
|
+
}
|
|
66
|
+
commands.push(renderCommand([
|
|
67
|
+
"hscli",
|
|
68
|
+
"--profile",
|
|
69
|
+
profile.profile,
|
|
70
|
+
"--json",
|
|
71
|
+
"agent",
|
|
72
|
+
"plan",
|
|
73
|
+
runbook,
|
|
74
|
+
]));
|
|
75
|
+
return {
|
|
76
|
+
profile: profile.profile,
|
|
77
|
+
portalId: profile.portalId,
|
|
78
|
+
mode: profile.mode,
|
|
79
|
+
commands,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function registerPortals(program, getCtx) {
|
|
83
|
+
const portals = program
|
|
84
|
+
.command("portals")
|
|
85
|
+
.description("Manage multiple local HubSpot portal profiles without cross-tenant writes");
|
|
86
|
+
portals
|
|
87
|
+
.command("list")
|
|
88
|
+
.description("List local portal profiles without exposing tokens or calling HubSpot")
|
|
89
|
+
.action(() => {
|
|
90
|
+
const ctx = getCtx();
|
|
91
|
+
const profiles = listProfiles().map((profile) => summarizeProfile(profile));
|
|
92
|
+
printResult(ctx, {
|
|
93
|
+
executionMode: "local-inventory",
|
|
94
|
+
authHome: getHscliHomeDir(),
|
|
95
|
+
count: profiles.length,
|
|
96
|
+
profiles,
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
portals
|
|
100
|
+
.command("plan")
|
|
101
|
+
.description("Render safe per-profile context/runbook commands; does not call HubSpot")
|
|
102
|
+
.option("--profiles <csv>", "Comma/space-separated profile names; defaults to all profiles")
|
|
103
|
+
.option("--runbook <name>", "Agent runbook: data-cleanup|pipeline-risk|automation-risk", "data-cleanup")
|
|
104
|
+
.option("--include-context", "Include `context build` before each runbook")
|
|
105
|
+
.option("--sample-limit <n>", "Sample limit for context build when --include-context is used", "25")
|
|
106
|
+
.action((opts) => {
|
|
107
|
+
const ctx = getCtx();
|
|
108
|
+
const runbook = resolveRunbook(String(opts.runbook ?? "data-cleanup"));
|
|
109
|
+
const sampleLimit = parseNumberFlag(String(opts.sampleLimit ?? "25"), "--sample-limit");
|
|
110
|
+
if (sampleLimit < 1 || sampleLimit > 100) {
|
|
111
|
+
throw new CliError("PORTAL_SAMPLE_LIMIT_INVALID", "--sample-limit must be between 1 and 100");
|
|
112
|
+
}
|
|
113
|
+
const profiles = parseProfileSelection(opts.profiles ? String(opts.profiles) : undefined)
|
|
114
|
+
.map((profile) => summarizeProfile(profile));
|
|
115
|
+
printResult(ctx, {
|
|
116
|
+
executionMode: "plan-only",
|
|
117
|
+
runbook,
|
|
118
|
+
profileCount: profiles.length,
|
|
119
|
+
commands: profiles.map((profile) => renderProfileCommands(profile, runbook, {
|
|
120
|
+
includeContext: Boolean(opts.includeContext),
|
|
121
|
+
sampleLimit,
|
|
122
|
+
})),
|
|
123
|
+
guardrails: [
|
|
124
|
+
"Plan-only: no HubSpot requests are executed by `portals plan`.",
|
|
125
|
+
"Every rendered command keeps an explicit --profile to avoid cross-tenant access.",
|
|
126
|
+
"Use read-only auth modes for source portals and run write commands only through normal --force/policy/change-ticket gates.",
|
|
127
|
+
"Run `doctor parity` before assuming a surface is public-API reachable across all portals.",
|
|
128
|
+
],
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/portals/index.ts"],"names":[],"mappings":"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"}
|