@revfleet/hscli 0.8.10 → 0.8.11
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 +43 -0
- package/README.md +28 -2
- package/dist/cli.js +25 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth/index.js +46 -11
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/crm/activities.d.ts +3 -0
- package/dist/commands/crm/activities.js +186 -0
- package/dist/commands/crm/activities.js.map +1 -0
- package/dist/commands/crm/index.js +4 -0
- package/dist/commands/crm/index.js.map +1 -1
- package/dist/commands/crm/migration.d.ts +3 -0
- package/dist/commands/crm/migration.js +155 -0
- package/dist/commands/crm/migration.js.map +1 -0
- package/dist/commands/crm/properties.js +105 -18
- package/dist/commands/crm/properties.js.map +1 -1
- package/dist/commands/crm/property-batch.d.ts +34 -0
- package/dist/commands/crm/property-batch.js +205 -0
- package/dist/commands/crm/property-batch.js.map +1 -0
- package/dist/commands/doctor/index.js +119 -1
- package/dist/commands/doctor/index.js.map +1 -1
- package/dist/commands/forms/index.js +47 -6
- package/dist/commands/forms/index.js.map +1 -1
- package/dist/commands/forms/legacy-v2.d.ts +6 -0
- package/dist/commands/forms/legacy-v2.js +350 -0
- package/dist/commands/forms/legacy-v2.js.map +1 -0
- package/dist/commands/forms/property-preflight.d.ts +20 -0
- package/dist/commands/forms/property-preflight.js +99 -0
- package/dist/commands/forms/property-preflight.js.map +1 -0
- package/dist/commands/guide/index.d.ts +3 -0
- package/dist/commands/guide/index.js +231 -0
- package/dist/commands/guide/index.js.map +1 -0
- package/dist/commands/settings/index.js +238 -2
- package/dist/commands/settings/index.js.map +1 -1
- package/dist/core/auth.d.ts +7 -1
- package/dist/core/auth.js +45 -7
- package/dist/core/auth.js.map +1 -1
- package/dist/core/http.d.ts +16 -0
- package/dist/core/http.js +141 -40
- package/dist/core/http.js.map +1 -1
- package/dist/core/output.d.ts +2 -0
- package/dist/core/output.js +1 -1
- package/dist/core/output.js.map +1 -1
- package/dist/core/scopes.d.ts +29 -0
- package/dist/core/scopes.js +415 -0
- package/dist/core/scopes.js.map +1 -0
- package/dist/mcp/ext-tools.d.ts +1 -1
- package/dist/mcp/ext-tools.js +52 -1
- package/dist/mcp/ext-tools.js.map +1 -1
- package/dist/mcp/server.js +90 -22
- package/dist/mcp/server.js.map +1 -1
- package/docs/CAPABILITY_LIBRARY.md +4 -3
- package/docs/COMMAND_TREE.md +21 -5
- package/docs/COOKBOOK.md +96 -0
- package/docs/MARKETING_SETUP.md +8 -2
- package/docs/MCP.md +1 -0
- package/docs/OPERATIONAL_PLAYBOOKS.md +1 -1
- package/docs/PORTAL_SETUP.md +3 -2
- package/docs/SAFETY_MODEL.md +3 -0
- package/package.json +1 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
3
|
+
import { printResult } from "../../core/output.js";
|
|
4
|
+
const GOAL_ALIASES = {
|
|
5
|
+
"1": "portal-migration",
|
|
6
|
+
"/migration": "portal-migration",
|
|
7
|
+
migration: "portal-migration",
|
|
8
|
+
"portal-migration": "portal-migration",
|
|
9
|
+
"2": "setup",
|
|
10
|
+
"/setup": "setup",
|
|
11
|
+
setup: "setup",
|
|
12
|
+
"3": "read",
|
|
13
|
+
"/read": "read",
|
|
14
|
+
read: "read",
|
|
15
|
+
"4": "write",
|
|
16
|
+
"/write": "write",
|
|
17
|
+
write: "write",
|
|
18
|
+
"5": "guardrails",
|
|
19
|
+
"/guardrails": "guardrails",
|
|
20
|
+
guardrails: "guardrails",
|
|
21
|
+
safety: "guardrails",
|
|
22
|
+
policy: "guardrails",
|
|
23
|
+
properties: "property-preflight",
|
|
24
|
+
"property-preflight": "property-preflight",
|
|
25
|
+
"6": "property-preflight",
|
|
26
|
+
audit: "audit-trace",
|
|
27
|
+
trace: "audit-trace",
|
|
28
|
+
"audit-trace": "audit-trace",
|
|
29
|
+
"7": "audit-trace",
|
|
30
|
+
explore: "explore",
|
|
31
|
+
help: "explore",
|
|
32
|
+
"8": "explore",
|
|
33
|
+
};
|
|
34
|
+
function resolveGoal(raw) {
|
|
35
|
+
const value = raw?.trim().toLowerCase();
|
|
36
|
+
if (!value)
|
|
37
|
+
return "portal-migration";
|
|
38
|
+
return GOAL_ALIASES[value] ?? "portal-migration";
|
|
39
|
+
}
|
|
40
|
+
async function askGoal() {
|
|
41
|
+
if (!input.isTTY)
|
|
42
|
+
return "portal-migration";
|
|
43
|
+
const rl = createInterface({ input, output });
|
|
44
|
+
try {
|
|
45
|
+
const answer = await rl.question([
|
|
46
|
+
"What do you want to do with hscli?",
|
|
47
|
+
"1) Prepare a portal/schema migration",
|
|
48
|
+
"2) Set up auth, hublet routing, scopes, and capabilities",
|
|
49
|
+
"3) Read safely from a source portal",
|
|
50
|
+
"4) Write safely to a target portal",
|
|
51
|
+
"5) Configure guardrails",
|
|
52
|
+
"6) Preflight property migration payloads",
|
|
53
|
+
"7) Trace/audit writes",
|
|
54
|
+
"8) Explore available commands",
|
|
55
|
+
"Choose 1-8: ",
|
|
56
|
+
].join("\n"));
|
|
57
|
+
return resolveGoal(answer);
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
rl.close();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function guidePayload(goal) {
|
|
64
|
+
if (goal === "setup") {
|
|
65
|
+
return {
|
|
66
|
+
goal,
|
|
67
|
+
purpose: "Create a safe profile, confirm hublet routing, then inspect portal capabilities before any migration work.",
|
|
68
|
+
nextCommands: [
|
|
69
|
+
"hscli auth login --profile live --token-stdin --hublet eu1",
|
|
70
|
+
"hscli auth set-mode live read-only",
|
|
71
|
+
"hscli --profile live doctor hublet-check",
|
|
72
|
+
"hscli --profile live doctor scopes diff --required real-mirror-read",
|
|
73
|
+
"hscli --profile live doctor capabilities --refresh",
|
|
74
|
+
],
|
|
75
|
+
decisions: [
|
|
76
|
+
"Use read-only mode for live/source portals.",
|
|
77
|
+
"Use a separate read-write profile for sandbox/target portals.",
|
|
78
|
+
"Use --hublet eu1|na1|na2|ap1 when token metadata is not enough to infer routing.",
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (goal === "read") {
|
|
83
|
+
return {
|
|
84
|
+
goal,
|
|
85
|
+
purpose: "Read from a source portal without accidental writes.",
|
|
86
|
+
nextCommands: [
|
|
87
|
+
"hscli auth set-mode live read-only",
|
|
88
|
+
"hscli --profile live crm migration export-metadata --out migration-metadata.json",
|
|
89
|
+
"hscli --profile live crm activities export contacts <contactId> --out contact-activities.json",
|
|
90
|
+
"hscli --profile live crm properties list contacts --format json > contacts-properties.json",
|
|
91
|
+
"hscli --profile live trace start --scope read",
|
|
92
|
+
],
|
|
93
|
+
guardrails: [
|
|
94
|
+
"Profile read-only mode blocks POST/PATCH/PUT/DELETE even if the token has write scopes.",
|
|
95
|
+
"Use separate source/target profiles instead of switching tokens in place.",
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (goal === "write") {
|
|
100
|
+
return {
|
|
101
|
+
goal,
|
|
102
|
+
purpose: "Write to a sandbox or target portal with dry-runs, change tickets, and traceability.",
|
|
103
|
+
nextCommands: [
|
|
104
|
+
"hscli auth set-mode sandbox read-write",
|
|
105
|
+
"hscli --profile sandbox trace start --scope write --include-bodies",
|
|
106
|
+
"hscli --profile sandbox --dry-run crm properties batch-create contacts --skip-existing --data @contacts-properties.json",
|
|
107
|
+
"hscli --profile sandbox --force --change-ticket CHG-123 crm properties batch-create contacts --skip-existing --data @contacts-properties.json",
|
|
108
|
+
"hscli --profile sandbox trace stop",
|
|
109
|
+
],
|
|
110
|
+
guardrails: [
|
|
111
|
+
"Writes still require --force.",
|
|
112
|
+
"Use --dry-run first, then rerun the same command with --force.",
|
|
113
|
+
"Use --change-ticket when policy requires audited writes.",
|
|
114
|
+
],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (goal === "guardrails") {
|
|
118
|
+
return {
|
|
119
|
+
goal,
|
|
120
|
+
purpose: "Turn on the safety rails before a client migration or production-adjacent run.",
|
|
121
|
+
nextCommands: [
|
|
122
|
+
"hscli auth set-mode live read-only",
|
|
123
|
+
"hscli policy templates extract read-only --to ./policy.json",
|
|
124
|
+
"export HSCLI_POLICY_FILE=./policy.json",
|
|
125
|
+
"hscli trace start --scope all --include-bodies",
|
|
126
|
+
"hscli --profile live doctor hublet-check",
|
|
127
|
+
"hscli --profile live doctor scopes diff --required real-mirror-read",
|
|
128
|
+
],
|
|
129
|
+
checks: [
|
|
130
|
+
"Live/source profiles should be read-only.",
|
|
131
|
+
"Target profiles can be read-write but still need --force.",
|
|
132
|
+
"Trace/audit entries include request id, profile, tool name, and change ticket when provided.",
|
|
133
|
+
],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (goal === "property-preflight") {
|
|
137
|
+
return {
|
|
138
|
+
goal,
|
|
139
|
+
nextCommands: [
|
|
140
|
+
"hscli --json crm properties list contacts > contacts-properties.json",
|
|
141
|
+
"hscli --dry-run crm properties batch-create contacts --skip-existing --skip-label-collisions --data @contacts-properties.json",
|
|
142
|
+
"hscli --dry-run crm properties batch-create contacts --empty-enum demote --data @contacts-properties.json",
|
|
143
|
+
],
|
|
144
|
+
checks: [
|
|
145
|
+
"Reserved hs_* names are skipped unless --include-reserved is set.",
|
|
146
|
+
"Read-only/HubSpot-defined properties are skipped unless --include-readonly is set.",
|
|
147
|
+
"Enum options with blank labels/values are removed before write.",
|
|
148
|
+
],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
if (goal === "audit-trace") {
|
|
152
|
+
return {
|
|
153
|
+
goal,
|
|
154
|
+
nextCommands: [
|
|
155
|
+
"hscli trace start --scope write --include-bodies",
|
|
156
|
+
"hscli --force --change-ticket CHG-123 crm contacts update <id> --data '{...}'",
|
|
157
|
+
"hscli trace stop",
|
|
158
|
+
"hscli audit by-ticket --ticket CHG-123",
|
|
159
|
+
],
|
|
160
|
+
checks: [
|
|
161
|
+
"Use --change-ticket when policy requires traceable writes.",
|
|
162
|
+
"Trace bodies are redacted before being written.",
|
|
163
|
+
],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (goal === "explore") {
|
|
167
|
+
return {
|
|
168
|
+
goal,
|
|
169
|
+
nextCommands: [
|
|
170
|
+
"hscli doctor capabilities --refresh",
|
|
171
|
+
"hscli crm describe contacts --refresh-cache",
|
|
172
|
+
"hscli crm migration export-metadata --out migration-metadata.json",
|
|
173
|
+
"hscli --help",
|
|
174
|
+
],
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
goal,
|
|
179
|
+
nextCommands: [
|
|
180
|
+
"hscli crm migration export-metadata --out migration-metadata.json",
|
|
181
|
+
"hscli crm activities export contacts <contactId> --out contact-activities.json",
|
|
182
|
+
"hscli --json crm properties list contacts > contacts-properties.json",
|
|
183
|
+
"hscli --dry-run crm properties batch-create contacts --skip-existing --skip-label-collisions --data @contacts-properties.json",
|
|
184
|
+
"hscli crm pipelines list deals",
|
|
185
|
+
"hscli crm pipelines get deals <pipelineId>",
|
|
186
|
+
],
|
|
187
|
+
capturedByMigrationExport: [
|
|
188
|
+
"property groups with labels/displayOrder",
|
|
189
|
+
"property definitions",
|
|
190
|
+
"deal/ticket pipelines with stage detail",
|
|
191
|
+
"custom object schemas",
|
|
192
|
+
"owners, teams, business units, currencies",
|
|
193
|
+
"standard association labels",
|
|
194
|
+
"recoverable record activities via crm activities export",
|
|
195
|
+
],
|
|
196
|
+
replayOrder: [
|
|
197
|
+
"custom schemas",
|
|
198
|
+
"property groups",
|
|
199
|
+
"properties",
|
|
200
|
+
"pipelines and stages",
|
|
201
|
+
"association labels",
|
|
202
|
+
"owner/team remapping",
|
|
203
|
+
"records and associations",
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
export function registerGuide(program, getCtx) {
|
|
208
|
+
program
|
|
209
|
+
.command("guide")
|
|
210
|
+
.description("Guided workflows for migration, preflight, and audit tasks")
|
|
211
|
+
.option("--goal <goal>", "portal-migration|property-preflight|audit-trace|explore")
|
|
212
|
+
.action(async (opts) => {
|
|
213
|
+
const ctx = getCtx();
|
|
214
|
+
const goal = opts.goal ? resolveGoal(opts.goal) : await askGoal();
|
|
215
|
+
printResult(ctx, guidePayload(goal));
|
|
216
|
+
});
|
|
217
|
+
registerSlashGuide(program, getCtx, "/migration", "portal-migration", "Portal/schema migration workflow");
|
|
218
|
+
registerSlashGuide(program, getCtx, "/setup", "setup", "Initial profile, hublet, scope, and capability setup");
|
|
219
|
+
registerSlashGuide(program, getCtx, "/read", "read", "Safe source-portal read workflow");
|
|
220
|
+
registerSlashGuide(program, getCtx, "/write", "write", "Target-portal write workflow with dry-run and trace");
|
|
221
|
+
registerSlashGuide(program, getCtx, "/guardrails", "guardrails", "Safety policy, read-only, and trace workflow");
|
|
222
|
+
}
|
|
223
|
+
function registerSlashGuide(program, getCtx, name, goal, description) {
|
|
224
|
+
const action = () => {
|
|
225
|
+
const ctx = getCtx();
|
|
226
|
+
printResult(ctx, guidePayload(goal));
|
|
227
|
+
};
|
|
228
|
+
program.command(name).description(description).action(action);
|
|
229
|
+
program.command(name.slice(1)).description(`${description} (alias for ${name})`).action(action);
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/guide/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,183 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { getProfile } from "../../core/auth.js";
|
|
3
|
+
import { createBrowserSessionClient, createClient } from "../../core/http.js";
|
|
4
|
+
import { CliError, printResult } from "../../core/output.js";
|
|
3
5
|
import { encodePathSegment, maybeWrite, parseJsonPayload, parseNumberFlag } from "../crm/shared.js";
|
|
6
|
+
function addBrowserSessionOptions(command) {
|
|
7
|
+
return command
|
|
8
|
+
.option("--portal-id <id>", "HubSpot portal ID (or HSCLI_PORTAL_ID / profile.portalId)")
|
|
9
|
+
.option("--ui-domain <domain>", "HubSpot app domain, e.g. app.hubspot.com or app-eu1.hubspot.com")
|
|
10
|
+
.option("--cookie <header>", "Browser Cookie header for app.hubspot.com")
|
|
11
|
+
.option("--cookie-file <path>", "Cookie header, Netscape cookie jar, or JSON cookie export")
|
|
12
|
+
.option("--csrf <token>", "x-hubspot-csrf-hubspotapi header value");
|
|
13
|
+
}
|
|
14
|
+
function resolvePermissionSetSession(ctx, opts) {
|
|
15
|
+
const profile = safeProfile(ctx.profile);
|
|
16
|
+
const portalId = firstString(opts.portalId, process.env.HSCLI_PORTAL_ID, profile?.portalId);
|
|
17
|
+
if (!portalId) {
|
|
18
|
+
throw new CliError("SESSION_PORTAL_ID_REQUIRED", "Permission-set commands require --portal-id, HSCLI_PORTAL_ID, or profile.portalId.");
|
|
19
|
+
}
|
|
20
|
+
const uiDomain = normalizeUiDomain(firstString(opts.uiDomain, process.env.HSCLI_HUBSPOT_UI_DOMAIN, profile?.uiDomain, "app.hubspot.com") ?? "app.hubspot.com");
|
|
21
|
+
const cookie = firstString(opts.cookie, process.env.HSCLI_HUBSPOT_COOKIE) ?? readCookieFile(firstString(opts.cookieFile, process.env.HSCLI_HUBSPOT_COOKIE_FILE));
|
|
22
|
+
if (!cookie) {
|
|
23
|
+
throw new CliError("SESSION_COOKIE_REQUIRED", "Permission-set commands require --cookie, --cookie-file, HSCLI_HUBSPOT_COOKIE, or HSCLI_HUBSPOT_COOKIE_FILE.");
|
|
24
|
+
}
|
|
25
|
+
const csrfToken = firstString(opts.csrf, process.env.HSCLI_HUBSPOT_CSRF, extractCsrfToken(cookie));
|
|
26
|
+
if (!csrfToken) {
|
|
27
|
+
throw new CliError("SESSION_CSRF_REQUIRED", "Permission-set commands require --csrf or HSCLI_HUBSPOT_CSRF. A csrf.app cookie is also accepted when present.");
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
portalId,
|
|
31
|
+
client: createBrowserSessionClient(ctx.profile, {
|
|
32
|
+
apiBaseUrl: `https://${uiDomain}`,
|
|
33
|
+
cookie,
|
|
34
|
+
csrfToken,
|
|
35
|
+
telemetryFile: ctx.telemetryFile,
|
|
36
|
+
strictCapabilities: ctx.strictCapabilities,
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function permissionSetsPath(portalId) {
|
|
41
|
+
return `/api/app-users/v1/permission-sets?portalId=${encodeURIComponent(portalId)}`;
|
|
42
|
+
}
|
|
43
|
+
function permissionSetPath(portalId, id) {
|
|
44
|
+
return `/api/app-users/v1/permission-sets/${encodePathSegment(id, "permissionSetId")}?portalId=${encodeURIComponent(portalId)}`;
|
|
45
|
+
}
|
|
46
|
+
async function maybeWritePermissionSetWithRoleRetry(ctx, client, method, path, body, stripUnknownRoles) {
|
|
47
|
+
try {
|
|
48
|
+
return await maybeWrite(ctx, client, method, path, body);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const missingRoles = stripUnknownRoles ? extractMissingRoles(error) : [];
|
|
52
|
+
const strippedBody = missingRoles.length > 0 ? stripRoles(body, missingRoles) : undefined;
|
|
53
|
+
if (!strippedBody)
|
|
54
|
+
throw error;
|
|
55
|
+
const result = await maybeWrite(ctx, client, method, path, strippedBody);
|
|
56
|
+
return {
|
|
57
|
+
result,
|
|
58
|
+
strippedRoleNames: missingRoles,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function findExistingPermissionSetByName(client, portalId, name) {
|
|
63
|
+
const response = await client.request(permissionSetsPath(portalId));
|
|
64
|
+
return extractPermissionSets(response).find((item) => item.name === name);
|
|
65
|
+
}
|
|
66
|
+
function extractPermissionSets(response) {
|
|
67
|
+
if (Array.isArray(response))
|
|
68
|
+
return response.filter(isRecord);
|
|
69
|
+
if (!isRecord(response))
|
|
70
|
+
return [];
|
|
71
|
+
for (const key of ["results", "permissionSets", "items"]) {
|
|
72
|
+
const value = response[key];
|
|
73
|
+
if (Array.isArray(value))
|
|
74
|
+
return value.filter(isRecord);
|
|
75
|
+
}
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
function extractMissingRoles(error) {
|
|
79
|
+
if (!(error instanceof CliError) || error.status !== 400)
|
|
80
|
+
return [];
|
|
81
|
+
const details = error.details === undefined ? error.message : JSON.stringify(error.details);
|
|
82
|
+
const match = details.match(/Cannot find roles\s*\[([^\]]+)\]/i);
|
|
83
|
+
if (!match)
|
|
84
|
+
return [];
|
|
85
|
+
return match[1]
|
|
86
|
+
.split(",")
|
|
87
|
+
.map((role) => role.trim().replace(/^["']|["']$/g, ""))
|
|
88
|
+
.filter(Boolean);
|
|
89
|
+
}
|
|
90
|
+
function stripRoles(body, rolesToStrip) {
|
|
91
|
+
const roles = Array.isArray(body.roleNames) ? body.roleNames.filter((role) => typeof role === "string") : [];
|
|
92
|
+
if (roles.length === 0)
|
|
93
|
+
return undefined;
|
|
94
|
+
const missing = new Set(rolesToStrip);
|
|
95
|
+
const kept = roles.filter((role) => !missing.has(role));
|
|
96
|
+
if (kept.length === roles.length)
|
|
97
|
+
return undefined;
|
|
98
|
+
return { ...body, roleNames: kept };
|
|
99
|
+
}
|
|
100
|
+
function safeProfile(profile) {
|
|
101
|
+
try {
|
|
102
|
+
return getProfile(profile);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function firstString(...values) {
|
|
109
|
+
for (const value of values) {
|
|
110
|
+
const trimmed = value?.trim();
|
|
111
|
+
if (trimmed)
|
|
112
|
+
return trimmed;
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
function normalizeUiDomain(raw) {
|
|
117
|
+
return raw.replace(/^https?:\/\//, "").replace(/\/.*$/, "");
|
|
118
|
+
}
|
|
119
|
+
function readCookieFile(path) {
|
|
120
|
+
if (!path)
|
|
121
|
+
return undefined;
|
|
122
|
+
const raw = readFileSync(path, "utf8").trim();
|
|
123
|
+
if (!raw)
|
|
124
|
+
return undefined;
|
|
125
|
+
return normalizeCookieFile(raw);
|
|
126
|
+
}
|
|
127
|
+
function normalizeCookieFile(raw) {
|
|
128
|
+
const parsed = parseCookieJson(raw);
|
|
129
|
+
if (parsed)
|
|
130
|
+
return parsed;
|
|
131
|
+
const lines = raw.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
132
|
+
const netscapeCookies = lines
|
|
133
|
+
.filter((line) => !line.startsWith("#"))
|
|
134
|
+
.map((line) => line.split(/\t+/))
|
|
135
|
+
.filter((parts) => parts.length >= 7)
|
|
136
|
+
.map((parts) => `${parts[5]}=${parts.slice(6).join("\t")}`);
|
|
137
|
+
if (netscapeCookies.length > 0)
|
|
138
|
+
return netscapeCookies.join("; ");
|
|
139
|
+
return lines.filter((line) => !line.startsWith("#")).join("; ");
|
|
140
|
+
}
|
|
141
|
+
function parseCookieJson(raw) {
|
|
142
|
+
try {
|
|
143
|
+
const parsed = JSON.parse(raw);
|
|
144
|
+
if (typeof parsed === "string")
|
|
145
|
+
return parsed;
|
|
146
|
+
if (isRecord(parsed) && typeof parsed.cookie === "string")
|
|
147
|
+
return parsed.cookie;
|
|
148
|
+
const cookies = Array.isArray(parsed) ? parsed : isRecord(parsed) && Array.isArray(parsed.cookies) ? parsed.cookies : undefined;
|
|
149
|
+
if (!cookies)
|
|
150
|
+
return undefined;
|
|
151
|
+
const pairs = cookies
|
|
152
|
+
.filter(isRecord)
|
|
153
|
+
.map((cookie) => {
|
|
154
|
+
const name = typeof cookie.name === "string" ? cookie.name.trim() : "";
|
|
155
|
+
const value = typeof cookie.value === "string" ? cookie.value : "";
|
|
156
|
+
return name ? `${name}=${value}` : "";
|
|
157
|
+
})
|
|
158
|
+
.filter(Boolean);
|
|
159
|
+
return pairs.length > 0 ? pairs.join("; ") : undefined;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function extractCsrfToken(cookieHeader) {
|
|
166
|
+
const candidates = new Set(["csrf.app", "csrf", "hubspotapi-csrf", "hs-csrf"]);
|
|
167
|
+
for (const part of cookieHeader.split(";")) {
|
|
168
|
+
const [rawName, ...rawValue] = part.trim().split("=");
|
|
169
|
+
if (!rawName || rawValue.length === 0)
|
|
170
|
+
continue;
|
|
171
|
+
if (candidates.has(rawName.trim().toLowerCase())) {
|
|
172
|
+
const value = rawValue.join("=").trim();
|
|
173
|
+
return value ? decodeURIComponent(value) : undefined;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
function isRecord(value) {
|
|
179
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
180
|
+
}
|
|
4
181
|
export function registerSettings(program, getCtx) {
|
|
5
182
|
const settings = program.command("settings").description("HubSpot Settings APIs");
|
|
6
183
|
// Users
|
|
@@ -90,6 +267,65 @@ export function registerSettings(program, getCtx) {
|
|
|
90
267
|
const res = await client.request("/settings/v3/users/teams");
|
|
91
268
|
printResult(ctx, res);
|
|
92
269
|
});
|
|
270
|
+
// Permission sets — internal HubSpot endpoint, requires browser session cookies.
|
|
271
|
+
const permissionSets = settings.command("permission-sets").description("Permission-set management via internal HubSpot session-auth endpoint");
|
|
272
|
+
addBrowserSessionOptions(permissionSets.command("list"))
|
|
273
|
+
.action(async (opts) => {
|
|
274
|
+
const ctx = getCtx();
|
|
275
|
+
const { client, portalId } = resolvePermissionSetSession(ctx, opts);
|
|
276
|
+
const res = await client.request(permissionSetsPath(portalId));
|
|
277
|
+
printResult(ctx, res);
|
|
278
|
+
});
|
|
279
|
+
addBrowserSessionOptions(permissionSets.command("get").argument("<id>"))
|
|
280
|
+
.action(async (id, opts) => {
|
|
281
|
+
const ctx = getCtx();
|
|
282
|
+
const { client, portalId } = resolvePermissionSetSession(ctx, opts);
|
|
283
|
+
const res = await client.request(permissionSetPath(portalId, id));
|
|
284
|
+
printResult(ctx, res);
|
|
285
|
+
});
|
|
286
|
+
addBrowserSessionOptions(permissionSets.command("create")
|
|
287
|
+
.requiredOption("--data <payload>", "Permission-set payload JSON: { name, description?, roleNames[] }")
|
|
288
|
+
.option("--skip-existing", "Fetch existing permission sets first and skip when name already exists")
|
|
289
|
+
.option("--no-strip-unknown-roles", "Do not auto-retry after removing roles rejected by HubSpot")).action(async (opts) => {
|
|
290
|
+
const ctx = getCtx();
|
|
291
|
+
const { client, portalId } = resolvePermissionSetSession(ctx, opts);
|
|
292
|
+
const payload = parseJsonPayload(opts.data);
|
|
293
|
+
const path = permissionSetsPath(portalId);
|
|
294
|
+
if (!ctx.dryRun && opts.skipExisting) {
|
|
295
|
+
const name = typeof payload.name === "string" ? payload.name.trim() : "";
|
|
296
|
+
if (!name)
|
|
297
|
+
throw new CliError("PERMISSION_SET_NAME_REQUIRED", "--skip-existing requires payload.name.");
|
|
298
|
+
const existing = await findExistingPermissionSetByName(client, portalId, name);
|
|
299
|
+
if (existing) {
|
|
300
|
+
printResult(ctx, { skipped: true, reason: "permission-set-exists", existing });
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
const res = await maybeWritePermissionSetWithRoleRetry(ctx, client, "POST", path, payload, opts.stripUnknownRoles !== false);
|
|
305
|
+
printResult(ctx, res);
|
|
306
|
+
});
|
|
307
|
+
addBrowserSessionOptions(permissionSets.command("update")
|
|
308
|
+
.argument("<id>")
|
|
309
|
+
.requiredOption("--data <payload>", "Permission-set update payload JSON")
|
|
310
|
+
.option("--method <method>", "HTTP method for update: PUT|PATCH", "PUT")
|
|
311
|
+
.option("--no-strip-unknown-roles", "Do not auto-retry after removing roles rejected by HubSpot")).action(async (id, opts) => {
|
|
312
|
+
const ctx = getCtx();
|
|
313
|
+
const method = String(opts.method).trim().toUpperCase();
|
|
314
|
+
if (method !== "PUT" && method !== "PATCH") {
|
|
315
|
+
throw new CliError("INVALID_FLAG", "--method must be PUT or PATCH");
|
|
316
|
+
}
|
|
317
|
+
const { client, portalId } = resolvePermissionSetSession(ctx, opts);
|
|
318
|
+
const payload = parseJsonPayload(opts.data);
|
|
319
|
+
const res = await maybeWritePermissionSetWithRoleRetry(ctx, client, method, permissionSetPath(portalId, id), payload, opts.stripUnknownRoles !== false);
|
|
320
|
+
printResult(ctx, res);
|
|
321
|
+
});
|
|
322
|
+
addBrowserSessionOptions(permissionSets.command("delete").argument("<id>"))
|
|
323
|
+
.action(async (id, opts) => {
|
|
324
|
+
const ctx = getCtx();
|
|
325
|
+
const { client, portalId } = resolvePermissionSetSession(ctx, opts);
|
|
326
|
+
const res = await maybeWrite(ctx, client, "DELETE", permissionSetPath(portalId, id));
|
|
327
|
+
printResult(ctx, res);
|
|
328
|
+
});
|
|
93
329
|
// Currencies
|
|
94
330
|
const currencies = settings.command("currencies").description("Multi-currency management");
|
|
95
331
|
currencies
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/settings/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/settings/index.ts"],"names":[],"mappings":"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"}
|
package/dist/core/auth.d.ts
CHANGED
|
@@ -5,13 +5,19 @@ export interface AuthProfile {
|
|
|
5
5
|
scopes?: string[];
|
|
6
6
|
portalId?: string;
|
|
7
7
|
uiDomain?: string;
|
|
8
|
+
dataHostingLocation?: string;
|
|
8
9
|
apiDomain?: string;
|
|
9
10
|
hublet?: string;
|
|
10
11
|
mode?: "read-only" | "read-write";
|
|
11
12
|
}
|
|
13
|
+
export declare function normalizeHublet(value: string | undefined): string | undefined;
|
|
14
|
+
export declare function normalizeStoredHublet(value: string): string;
|
|
15
|
+
export declare function normalizeApiDomain(value: string): string;
|
|
16
|
+
export declare function normalizeApiBaseUrl(value: string): string;
|
|
12
17
|
/**
|
|
13
18
|
* Detect the hublet from available profile data.
|
|
14
|
-
* Priority: explicit hublet field > uiDomain > token prefix.
|
|
19
|
+
* Priority: explicit hublet field > dataHostingLocation > uiDomain > token prefix.
|
|
20
|
+
* NA1 resolves to undefined because public API calls use api.hubapi.com.
|
|
15
21
|
*/
|
|
16
22
|
export declare function detectHublet(profile: Partial<AuthProfile>): string | undefined;
|
|
17
23
|
/**
|
package/dist/core/auth.js
CHANGED
|
@@ -3,24 +3,61 @@ import { join } from "node:path";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { CliError } from "./output.js";
|
|
5
5
|
import { isVaultEncrypted, readVaultData, writeVaultData, getVaultPassphrase } from "./vault.js";
|
|
6
|
+
export function normalizeHublet(value) {
|
|
7
|
+
const normalized = value?.trim().toLowerCase();
|
|
8
|
+
if (!normalized || normalized === "na" || normalized === "na1" || normalized === "global" || normalized === "prod")
|
|
9
|
+
return undefined;
|
|
10
|
+
if (!/^[a-z][a-z0-9]*\d+$/.test(normalized)) {
|
|
11
|
+
throw new CliError("INVALID_HUBLET", `Invalid hublet '${value}'. Expected values like eu1, na1, na2, ap1.`);
|
|
12
|
+
}
|
|
13
|
+
return normalized;
|
|
14
|
+
}
|
|
15
|
+
export function normalizeStoredHublet(value) {
|
|
16
|
+
const normalized = value.trim().toLowerCase();
|
|
17
|
+
if (!normalized)
|
|
18
|
+
throw new CliError("INVALID_HUBLET", "Hublet cannot be empty.");
|
|
19
|
+
if (normalized === "na" || normalized === "global" || normalized === "prod")
|
|
20
|
+
return "na1";
|
|
21
|
+
if (!/^[a-z][a-z0-9]*\d+$/.test(normalized)) {
|
|
22
|
+
throw new CliError("INVALID_HUBLET", `Invalid hublet '${value}'. Expected values like eu1, na1, na2, ap1.`);
|
|
23
|
+
}
|
|
24
|
+
return normalized;
|
|
25
|
+
}
|
|
26
|
+
export function normalizeApiDomain(value) {
|
|
27
|
+
const normalized = value
|
|
28
|
+
.trim()
|
|
29
|
+
.replace(/^https?:\/\//i, "")
|
|
30
|
+
.replace(/\/+$/, "")
|
|
31
|
+
.toLowerCase();
|
|
32
|
+
if (!/^api(?:-[a-z0-9]+)?\.hubapi\.com$/.test(normalized)) {
|
|
33
|
+
throw new CliError("INVALID_API_DOMAIN", "API domain must be api.hubapi.com or api-<hublet>.hubapi.com.");
|
|
34
|
+
}
|
|
35
|
+
return normalized;
|
|
36
|
+
}
|
|
37
|
+
export function normalizeApiBaseUrl(value) {
|
|
38
|
+
return `https://${normalizeApiDomain(value)}`;
|
|
39
|
+
}
|
|
6
40
|
/**
|
|
7
41
|
* Detect the hublet from available profile data.
|
|
8
|
-
* Priority: explicit hublet field > uiDomain > token prefix.
|
|
42
|
+
* Priority: explicit hublet field > dataHostingLocation > uiDomain > token prefix.
|
|
43
|
+
* NA1 resolves to undefined because public API calls use api.hubapi.com.
|
|
9
44
|
*/
|
|
10
45
|
export function detectHublet(profile) {
|
|
11
46
|
if (profile.hublet)
|
|
12
|
-
return profile.hublet;
|
|
47
|
+
return normalizeHublet(profile.hublet);
|
|
48
|
+
if (profile.dataHostingLocation)
|
|
49
|
+
return normalizeHublet(profile.dataHostingLocation);
|
|
13
50
|
// Detect from uiDomain (e.g. "app-eu1.hubspot.com" → "eu1")
|
|
14
51
|
if (profile.uiDomain) {
|
|
15
52
|
const match = profile.uiDomain.match(/^app-([a-z0-9]+)\./);
|
|
16
53
|
if (match)
|
|
17
|
-
return match[1];
|
|
54
|
+
return normalizeHublet(match[1]);
|
|
18
55
|
}
|
|
19
56
|
// Detect from token prefix (e.g. "pat-eu1-..." → "eu1")
|
|
20
57
|
if (profile.token) {
|
|
21
58
|
const tokenMatch = profile.token.match(/^pat-([a-z0-9]+)-/);
|
|
22
|
-
if (tokenMatch
|
|
23
|
-
return tokenMatch[1];
|
|
59
|
+
if (tokenMatch)
|
|
60
|
+
return normalizeHublet(tokenMatch[1]);
|
|
24
61
|
}
|
|
25
62
|
return undefined;
|
|
26
63
|
}
|
|
@@ -29,9 +66,10 @@ export function detectHublet(profile) {
|
|
|
29
66
|
* NA/default → "api.hubapi.com", EU1 → "api-eu1.hubapi.com", etc.
|
|
30
67
|
*/
|
|
31
68
|
export function resolveApiDomain(hublet) {
|
|
32
|
-
|
|
69
|
+
const normalized = normalizeHublet(hublet);
|
|
70
|
+
if (!normalized)
|
|
33
71
|
return "api.hubapi.com";
|
|
34
|
-
return `api-${
|
|
72
|
+
return `api-${normalized}.hubapi.com`;
|
|
35
73
|
}
|
|
36
74
|
/**
|
|
37
75
|
* Get the API base URL for a profile (hublet-aware).
|