fullstackgtm 0.13.0 → 0.13.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 CHANGED
@@ -5,6 +5,16 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
5
5
  and the project adheres to [Semantic Versioning](https://semver.org/).
6
6
  The path to 1.0 is planned in [docs/roadmap-to-1.0.md](./docs/roadmap-to-1.0.md).
7
7
 
8
+ ## [0.13.1] — 2026-06-11
9
+
10
+ ### Fixed
11
+
12
+ - **Granola's formatted text export parses correctly**: it writes
13
+ `[Speaker] text` with no colon, which the transcript parser missed
14
+ entirely (found running the published 0.13.0 against a real export).
15
+ `normalizeTranscript` now rewrites those lines to the canonical
16
+ `[Speaker]: text` form.
17
+
8
18
  ## [0.13.0] — 2026-06-11
9
19
 
10
20
  Calls become evidence: the deterministic skeleton of every call workflow —
package/dist/calls.js CHANGED
@@ -226,7 +226,17 @@ export function normalizeTranscript(raw) {
226
226
  // not JSON — fall through and treat as plain text
227
227
  }
228
228
  }
229
- return raw;
229
+ // Granola's formatted text export writes "[Speaker] text" with no colon;
230
+ // rewrite those lines to the canonical "[Speaker]: text" form.
231
+ return raw
232
+ .split(/\r?\n/)
233
+ .map((line) => {
234
+ const match = /^(\[[^\]]{1,60}\])\s+(\S.*)$/.exec(line);
235
+ return match && !line.slice(match[1].length).trimStart().startsWith(":")
236
+ ? `${match[1]}: ${match[2]}`
237
+ : line;
238
+ })
239
+ .join("\n");
230
240
  }
231
241
  /**
232
242
  * Parse any supported transcript dialect into a canonical call: segments,
package/dist/cli.js CHANGED
@@ -185,6 +185,8 @@ async function connectorFor(provider, args) {
185
185
  return createHubspotConnector({
186
186
  getAccessToken: () => connection.accessToken,
187
187
  fieldMappings: connection.fieldMappings ?? undefined,
188
+ // Point at a mock/proxy HubSpot (tests, evals, request-recording).
189
+ apiBaseUrl: process.env.HUBSPOT_API_BASE_URL,
188
190
  });
189
191
  }
190
192
  if (provider === "salesforce") {
package/dist/mcp.js CHANGED
@@ -63,7 +63,10 @@ async function connectorFor(provider) {
63
63
  if (!token) {
64
64
  throw new Error("No HubSpot credentials. Run `fullstackgtm login hubspot` or set HUBSPOT_ACCESS_TOKEN in the MCP server environment.");
65
65
  }
66
- return createHubspotConnector({ getAccessToken: () => token });
66
+ return createHubspotConnector({
67
+ getAccessToken: () => token,
68
+ apiBaseUrl: process.env.HUBSPOT_API_BASE_URL,
69
+ });
67
70
  }
68
71
  if (provider === "salesforce") {
69
72
  const connection = process.env.SALESFORCE_ACCESS_TOKEN && process.env.SALESFORCE_INSTANCE_URL
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fullstackgtm",
3
- "version": "0.13.0",
3
+ "version": "0.13.1",
4
4
  "description": "Open-source agentic GTM ops framework: canonical GTM data model, pluggable deterministic audits, reviewable dry-run patch plans, approval-gated write-back with conflict detection, and cross-system entity resolution. HubSpot, Salesforce, and Stripe connectors included.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Full Stack GTM",
package/src/calls.ts CHANGED
@@ -299,7 +299,17 @@ export function normalizeTranscript(raw: string): string {
299
299
  // not JSON — fall through and treat as plain text
300
300
  }
301
301
  }
302
- return raw;
302
+ // Granola's formatted text export writes "[Speaker] text" with no colon;
303
+ // rewrite those lines to the canonical "[Speaker]: text" form.
304
+ return raw
305
+ .split(/\r?\n/)
306
+ .map((line) => {
307
+ const match = /^(\[[^\]]{1,60}\])\s+(\S.*)$/.exec(line);
308
+ return match && !line.slice(match[1].length).trimStart().startsWith(":")
309
+ ? `${match[1]}: ${match[2]}`
310
+ : line;
311
+ })
312
+ .join("\n");
303
313
  }
304
314
 
305
315
  /**
package/src/cli.ts CHANGED
@@ -218,6 +218,8 @@ async function connectorFor(provider: string, args: string[]): Promise<GtmConnec
218
218
  return createHubspotConnector({
219
219
  getAccessToken: () => connection.accessToken,
220
220
  fieldMappings: (connection.fieldMappings as FieldMappings | undefined) ?? undefined,
221
+ // Point at a mock/proxy HubSpot (tests, evals, request-recording).
222
+ apiBaseUrl: process.env.HUBSPOT_API_BASE_URL,
221
223
  });
222
224
  }
223
225
  if (provider === "salesforce") {
package/src/mcp.ts CHANGED
@@ -69,7 +69,10 @@ async function connectorFor(provider: string): Promise<GtmConnector> {
69
69
  "No HubSpot credentials. Run `fullstackgtm login hubspot` or set HUBSPOT_ACCESS_TOKEN in the MCP server environment.",
70
70
  );
71
71
  }
72
- return createHubspotConnector({ getAccessToken: () => token });
72
+ return createHubspotConnector({
73
+ getAccessToken: () => token,
74
+ apiBaseUrl: process.env.HUBSPOT_API_BASE_URL,
75
+ });
73
76
  }
74
77
  if (provider === "salesforce") {
75
78
  const connection =