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 +10 -0
- package/dist/calls.js +11 -1
- package/dist/cli.js +2 -0
- package/dist/mcp.js +4 -1
- package/package.json +1 -1
- package/src/calls.ts +11 -1
- package/src/cli.ts +2 -0
- package/src/mcp.ts +4 -1
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
|
-
|
|
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({
|
|
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.
|
|
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
|
-
|
|
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({
|
|
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 =
|