thumbgate 1.16.9 โ 1.16.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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/mcp/server-stdio.js +1 -1
- package/adapters/opencode/opencode.json +1 -1
- package/package.json +3 -2
- package/public/index.html +98 -3
- package/public/numbers.html +3 -3
- package/scripts/billing.js +2 -0
- package/scripts/hosted-config.js +12 -0
- package/scripts/pr-manager.js +2 -1
- package/src/api/server.js +4 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate-marketplace",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.11",
|
|
4
4
|
"owner": {
|
|
5
5
|
"name": "Igor Ganapolsky",
|
|
6
6
|
"email": "ig5973700@gmail.com"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"source": "npm",
|
|
14
14
|
"package": "thumbgate"
|
|
15
15
|
},
|
|
16
|
-
"version": "1.16.
|
|
16
|
+
"version": "1.16.11",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "Igor Ganapolsky"
|
|
19
19
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
3
|
"description": "Type ๐ or ๐ on any agent action. ThumbGate captures it, distills a lesson, and blocks the pattern from repeating. One thumbs-down = the agent physically cannot make that mistake again. 33 pre-action checks, budget enforcement, self-protection, and NIST/SOC2 compliance tags.",
|
|
4
|
-
"version": "1.16.
|
|
4
|
+
"version": "1.16.11",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Igor Ganapolsky"
|
|
7
7
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.11",
|
|
4
4
|
"description": "ThumbGate โ ๐๐ feedback that teaches your AI agent. Thumbs down a mistake, it never happens again.",
|
|
5
5
|
"homepage": "https://thumbgate-production.up.railway.app",
|
|
6
6
|
"transport": "stdio",
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"thumbgate": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--yes", "--package", "thumbgate@1.16.
|
|
5
|
+
"args": ["--yes", "--package", "thumbgate@1.16.11", "thumbgate", "serve"]
|
|
6
6
|
}
|
|
7
7
|
},
|
|
8
8
|
"hooks": {
|
|
9
9
|
"preToolUse": {
|
|
10
10
|
"command": "npx",
|
|
11
|
-
"args": ["--yes", "--package", "thumbgate@1.16.
|
|
11
|
+
"args": ["--yes", "--package", "thumbgate@1.16.11", "thumbgate", "gate-check"]
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -201,7 +201,7 @@ const {
|
|
|
201
201
|
finalizeSession: finalizeFeedbackSession,
|
|
202
202
|
} = require('../../scripts/feedback-session');
|
|
203
203
|
|
|
204
|
-
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.16.
|
|
204
|
+
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.16.11' };
|
|
205
205
|
const COMMERCE_CATEGORIES = [
|
|
206
206
|
'product_recommendation',
|
|
207
207
|
'brand_compliance',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.11",
|
|
4
4
|
"description": "Self-improving agent governance: type thumbs-up or thumbs-down on any AI agent action. ThumbGate turns every mistake into a prevention rule and blocks the pattern from repeating. One thumbs-down, never again. 33 pre-action checks, budget enforcement, and self-protection for Claude Code, Cursor, Codex, Gemini CLI, and Amp.",
|
|
5
5
|
"homepage": "https://thumbgate-production.up.railway.app",
|
|
6
6
|
"repository": {
|
|
@@ -229,6 +229,7 @@
|
|
|
229
229
|
"verify:full": "node scripts/verify-run.js full",
|
|
230
230
|
"budget:status": "node scripts/budget-guard.js --status",
|
|
231
231
|
"revenue:status": "node scripts/revenue-status.js",
|
|
232
|
+
"revenue:plan": "node scripts/may-2026-revenue-machine.js",
|
|
232
233
|
"revenue:status:local": "node bin/cli.js cfo",
|
|
233
234
|
"revenue:repair:github-marketplace": "node bin/cli.js repair-github-marketplace --write",
|
|
234
235
|
"cfo:report": "node bin/cli.js cfo",
|
|
@@ -350,7 +351,7 @@
|
|
|
350
351
|
"test:training-export": "node --test tests/training-export.test.js tests/databricks-export.test.js",
|
|
351
352
|
"test:deployment": "node --test tests/deployment.test.js tests/deploy-policy.test.js tests/publish-decision.test.js tests/changeset-check.test.js tests/release-notes.test.js tests/sonarcloud-workflow.test.js tests/package-boundary.test.js tests/public-package-boundary.test.js tests/revenue-observability-workflow.test.js",
|
|
352
353
|
"test:operational-integrity": "node --test tests/operational-integrity.test.js tests/sync-branch-protection.test.js",
|
|
353
|
-
"test:workflow": "node --test tests/workflow-contract.test.js tests/social-marketing-assets.test.js tests/social-pipeline.test.js tests/positioning-contract.test.js tests/docs-claim-hygiene.test.js tests/thumbgate-scope.test.js tests/workflow-runs.test.js tests/workflow-sprint-intake.test.js tests/gtm-revenue-loop.test.js tests/customer-discovery-sprint.test.js tests/revenue-pack-utils.test.js tests/aiventyx-marketplace-plan.test.js tests/cursor-marketplace-revenue-pack.test.js tests/codex-marketplace-revenue-pack.test.js tests/codex-plugin-revenue-pack.test.js tests/gemini-cli-demand-pack.test.js tests/linkedin-workflow-hardening-pack.test.js tests/chatgpt-gpt-revenue-pack.test.js tests/mcp-directory-revenue-pack.test.js tests/autonomous-sales-agent.test.js tests/reddit-dm-workflow-hardening-pack.test.js tests/sales-pipeline.test.js tests/reddit-dm-outreach.test.js tests/github-outreach.test.js tests/enterprise-story.test.js tests/ralph-loop.test.js tests/ralph-mode-ci.test.js tests/guide-conversion-path.test.js",
|
|
354
|
+
"test:workflow": "node --test tests/workflow-contract.test.js tests/social-marketing-assets.test.js tests/social-pipeline.test.js tests/positioning-contract.test.js tests/docs-claim-hygiene.test.js tests/thumbgate-scope.test.js tests/workflow-runs.test.js tests/workflow-sprint-intake.test.js tests/gtm-revenue-loop.test.js tests/may-2026-revenue-machine.test.js tests/customer-discovery-sprint.test.js tests/revenue-pack-utils.test.js tests/aiventyx-marketplace-plan.test.js tests/cursor-marketplace-revenue-pack.test.js tests/codex-marketplace-revenue-pack.test.js tests/codex-plugin-revenue-pack.test.js tests/gemini-cli-demand-pack.test.js tests/linkedin-workflow-hardening-pack.test.js tests/chatgpt-gpt-revenue-pack.test.js tests/mcp-directory-revenue-pack.test.js tests/autonomous-sales-agent.test.js tests/reddit-dm-workflow-hardening-pack.test.js tests/sales-pipeline.test.js tests/reddit-dm-outreach.test.js tests/github-outreach.test.js tests/enterprise-story.test.js tests/ralph-loop.test.js tests/ralph-mode-ci.test.js tests/guide-conversion-path.test.js",
|
|
354
355
|
"test:sales-pipeline": "node --test tests/sales-pipeline.test.js",
|
|
355
356
|
"test:billing": "node --test tests/billing.test.js tests/stripe-sync-product-images.test.js",
|
|
356
357
|
"test:cli": "node --test tests/analytics-report.test.js tests/codex-self-heal.test.js tests/creator-campaigns.test.js tests/cli.test.js tests/codex-bridge-script.test.js tests/dependabot-changeset.test.js tests/dispatch-brief.test.js tests/feedback-normalize.test.js tests/install-mcp.test.js tests/pr-manager.test.js tests/pro-local-dashboard.test.js tests/published-cli.test.js tests/revenue-status.test.js tests/stripe-live-status.test.js",
|
package/public/index.html
CHANGED
|
@@ -45,6 +45,10 @@ __GA_BOOTSTRAP__
|
|
|
45
45
|
const serverSessionId = '__SERVER_SESSION_ID__';
|
|
46
46
|
const serverAcquisitionId = '__SERVER_ACQUISITION_ID__';
|
|
47
47
|
const serverTelemetryCaptured = '__SERVER_TELEMETRY_CAPTURED__' === 'true';
|
|
48
|
+
const sprintDiagnosticCheckoutUrl = '__SPRINT_DIAGNOSTIC_CHECKOUT_URL__';
|
|
49
|
+
const workflowSprintCheckoutUrl = '__WORKFLOW_SPRINT_CHECKOUT_URL__';
|
|
50
|
+
const sprintDiagnosticPriceDollars = Number('__SPRINT_DIAGNOSTIC_PRICE_DOLLARS__') || 499;
|
|
51
|
+
const workflowSprintPriceDollars = Number('__WORKFLOW_SPRINT_PRICE_DOLLARS__') || 1500;
|
|
48
52
|
</script>
|
|
49
53
|
|
|
50
54
|
<script type="application/ld+json">
|
|
@@ -540,6 +544,14 @@ __GA_BOOTSTRAP__
|
|
|
540
544
|
.team-intake-panel h3 { margin: 0 0 6px; font-size: 18px; color: var(--text); }
|
|
541
545
|
.team-intake-panel p { margin: 0; color: var(--text-dim); font-size: 13px; line-height: 1.55; }
|
|
542
546
|
.team-intake-badge { flex-shrink: 0; padding: 6px 10px; border: 1px solid rgba(74,222,128,0.35); border-radius: 999px; color: var(--green); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; }
|
|
547
|
+
.team-paid-path { display: none; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 0 0 16px; }
|
|
548
|
+
.team-paid-path.visible { display: grid; }
|
|
549
|
+
.team-paid-card { display: flex; flex-direction: column; justify-content: space-between; gap: 12px; min-height: 150px; padding: 16px; border: 1px solid rgba(74,222,128,0.22); border-radius: 10px; background: rgba(0,0,0,0.24); }
|
|
550
|
+
.team-paid-card h4 { margin: 0 0 6px; color: var(--text); font-size: 15px; }
|
|
551
|
+
.team-paid-card p { margin: 0; color: var(--text-dim); font-size: 12px; line-height: 1.5; }
|
|
552
|
+
.team-paid-price { color: var(--green); font-weight: 800; font-size: 18px; }
|
|
553
|
+
.team-paid-link { display: block; text-align: center; padding: 10px 12px; background: rgba(74,222,128,0.16); color: var(--green); border: 1px solid rgba(74,222,128,0.45); border-radius: 8px; text-decoration: none; font-size: 13px; font-weight: 700; }
|
|
554
|
+
.team-paid-link:hover { border-color: var(--green); transform: translateY(-1px); }
|
|
543
555
|
.team-form { max-width: 860px; margin: 24px auto 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
|
|
544
556
|
.team-intake-panel .team-form { max-width: none; margin: 0; }
|
|
545
557
|
.team-form .full { grid-column: 1 / -1; }
|
|
@@ -605,6 +617,7 @@ __GA_BOOTSTRAP__
|
|
|
605
617
|
.pricing-grid { grid-template-columns: 1fr; }
|
|
606
618
|
.team-intake-panel-head { display: block; }
|
|
607
619
|
.team-intake-badge { display: inline-block; margin-bottom: 10px; }
|
|
620
|
+
.team-paid-path { grid-template-columns: 1fr; }
|
|
608
621
|
.team-form { grid-template-columns: 1fr; }
|
|
609
622
|
.hero { padding: 72px 0 56px; }
|
|
610
623
|
.hero-actions { flex-direction: column; }
|
|
@@ -1164,7 +1177,7 @@ __GA_BOOTSTRAP__
|
|
|
1164
1177
|
<!-- HOW IT WORKS -->
|
|
1165
1178
|
<section class="how-it-works" id="how-it-works">
|
|
1166
1179
|
<div class="container">
|
|
1167
|
-
<div class="section-label">New in v1.16.
|
|
1180
|
+
<div class="section-label">New in v1.16.11</div>
|
|
1168
1181
|
<h2 class="section-title">Three steps to stop repeated AI failures</h2>
|
|
1169
1182
|
<div class="steps">
|
|
1170
1183
|
<div class="step">
|
|
@@ -1403,10 +1416,32 @@ __GA_BOOTSTRAP__
|
|
|
1403
1416
|
<div class="team-intake-panel-head">
|
|
1404
1417
|
<div>
|
|
1405
1418
|
<h3>Tell us the workflow. Get a proof plan.</h3>
|
|
1406
|
-
<p>The highest-fit Team buyer is already feeling one repeated failure.
|
|
1419
|
+
<p>The highest-fit Team buyer is already feeling one repeated failure. Start with a paid diagnostic when budget is ready, or use intake when you need qualification first.</p>
|
|
1407
1420
|
</div>
|
|
1408
1421
|
<span class="team-intake-badge">30-minute intake</span>
|
|
1409
1422
|
</div>
|
|
1423
|
+
<div class="team-paid-path" data-sprint-paid-path aria-label="Paid workflow hardening options">
|
|
1424
|
+
<div class="team-paid-card">
|
|
1425
|
+
<div>
|
|
1426
|
+
<h4>Workflow Hardening Diagnostic</h4>
|
|
1427
|
+
<p>Paid triage for one repeated agent or review failure, with a concrete proof plan and go/no-go recommendation.</p>
|
|
1428
|
+
</div>
|
|
1429
|
+
<div>
|
|
1430
|
+
<div class="team-paid-price">$<span data-sprint-diagnostic-price>499</span></div>
|
|
1431
|
+
<a class="team-paid-link" data-sprint-diagnostic-link href="#workflow-sprint-intake">Pay for diagnostic</a>
|
|
1432
|
+
</div>
|
|
1433
|
+
</div>
|
|
1434
|
+
<div class="team-paid-card">
|
|
1435
|
+
<div>
|
|
1436
|
+
<h4>Workflow Hardening Sprint</h4>
|
|
1437
|
+
<p>48-hour implementation sprint for one workflow owner, one blocker, one proof review, and one hardened rollout path.</p>
|
|
1438
|
+
</div>
|
|
1439
|
+
<div>
|
|
1440
|
+
<div class="team-paid-price">$<span data-workflow-sprint-price>1500</span></div>
|
|
1441
|
+
<a class="team-paid-link" data-workflow-sprint-link href="#workflow-sprint-intake">Pay for sprint</a>
|
|
1442
|
+
</div>
|
|
1443
|
+
</div>
|
|
1444
|
+
</div>
|
|
1410
1445
|
<form id="team-pilot-intake-form" class="team-form" action="/v1/intake/workflow-sprint" method="POST" data-team-intake-form>
|
|
1411
1446
|
<input type="hidden" name="ctaId" value="workflow_sprint_intake">
|
|
1412
1447
|
<input type="hidden" name="ctaPlacement" value="team_visible_intake">
|
|
@@ -1534,7 +1569,7 @@ __GA_BOOTSTRAP__
|
|
|
1534
1569
|
<a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
|
|
1535
1570
|
<a href="/blog">Blog</a>
|
|
1536
1571
|
</div>
|
|
1537
|
-
<span class="footer-copy">ยฉ 2026 Max Smith KDP LLC ยท MIT License ยท v1.16.
|
|
1572
|
+
<span class="footer-copy">ยฉ 2026 Max Smith KDP LLC ยท MIT License ยท v1.16.11</span>
|
|
1538
1573
|
</div>
|
|
1539
1574
|
</footer>
|
|
1540
1575
|
|
|
@@ -1619,6 +1654,60 @@ function sendFirstPartyTelemetry(eventType, props) {
|
|
|
1619
1654
|
}).catch(function() {});
|
|
1620
1655
|
}
|
|
1621
1656
|
|
|
1657
|
+
function sendGa4Event(eventName, params) {
|
|
1658
|
+
if (!gaMeasurementId || typeof globalThis.gtag !== 'function') return;
|
|
1659
|
+
globalThis.gtag('event', eventName, params || {});
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1662
|
+
function initializePaidSprintPath() {
|
|
1663
|
+
var panel = document.querySelector('[data-sprint-paid-path]');
|
|
1664
|
+
if (!panel) return;
|
|
1665
|
+
var diagnosticLink = document.querySelector('[data-sprint-diagnostic-link]');
|
|
1666
|
+
var sprintLink = document.querySelector('[data-workflow-sprint-link]');
|
|
1667
|
+
var diagnosticPrice = document.querySelector('[data-sprint-diagnostic-price]');
|
|
1668
|
+
var sprintPrice = document.querySelector('[data-workflow-sprint-price]');
|
|
1669
|
+
if (diagnosticPrice) diagnosticPrice.textContent = String(sprintDiagnosticPriceDollars);
|
|
1670
|
+
if (sprintPrice) sprintPrice.textContent = String(workflowSprintPriceDollars);
|
|
1671
|
+
var hasDiagnosticUrl = /^https?:\/\//.test(sprintDiagnosticCheckoutUrl);
|
|
1672
|
+
var hasSprintUrl = /^https?:\/\//.test(workflowSprintCheckoutUrl);
|
|
1673
|
+
if (!hasDiagnosticUrl && !hasSprintUrl) return;
|
|
1674
|
+
panel.classList.add('visible');
|
|
1675
|
+
if (hasDiagnosticUrl && diagnosticLink) {
|
|
1676
|
+
diagnosticLink.href = sprintDiagnosticCheckoutUrl;
|
|
1677
|
+
diagnosticLink.addEventListener('click', function() {
|
|
1678
|
+
sendFirstPartyTelemetry('workflow_sprint_diagnostic_checkout_started', {
|
|
1679
|
+
ctaId: 'workflow_sprint_diagnostic_checkout',
|
|
1680
|
+
ctaPlacement: 'team_paid_path',
|
|
1681
|
+
planId: 'team',
|
|
1682
|
+
offer: 'workflow_hardening_diagnostic',
|
|
1683
|
+
price: sprintDiagnosticPriceDollars,
|
|
1684
|
+
});
|
|
1685
|
+
sendGa4Event('begin_checkout', {
|
|
1686
|
+
currency: 'USD',
|
|
1687
|
+
value: sprintDiagnosticPriceDollars,
|
|
1688
|
+
items: [{ item_id: 'workflow_hardening_diagnostic', item_name: 'Workflow Hardening Diagnostic' }],
|
|
1689
|
+
});
|
|
1690
|
+
});
|
|
1691
|
+
}
|
|
1692
|
+
if (hasSprintUrl && sprintLink) {
|
|
1693
|
+
sprintLink.href = workflowSprintCheckoutUrl;
|
|
1694
|
+
sprintLink.addEventListener('click', function() {
|
|
1695
|
+
sendFirstPartyTelemetry('workflow_sprint_checkout_started', {
|
|
1696
|
+
ctaId: 'workflow_sprint_checkout',
|
|
1697
|
+
ctaPlacement: 'team_paid_path',
|
|
1698
|
+
planId: 'team',
|
|
1699
|
+
offer: 'workflow_hardening_sprint',
|
|
1700
|
+
price: workflowSprintPriceDollars,
|
|
1701
|
+
});
|
|
1702
|
+
sendGa4Event('begin_checkout', {
|
|
1703
|
+
currency: 'USD',
|
|
1704
|
+
value: workflowSprintPriceDollars,
|
|
1705
|
+
items: [{ item_id: 'workflow_hardening_sprint', item_name: 'Workflow Hardening Sprint' }],
|
|
1706
|
+
});
|
|
1707
|
+
});
|
|
1708
|
+
}
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1622
1711
|
function initializeTeamIntakeTelemetry() {
|
|
1623
1712
|
document.querySelectorAll('[data-team-intake-form]').forEach(function(form) {
|
|
1624
1713
|
var started = false;
|
|
@@ -1641,6 +1730,11 @@ function initializeTeamIntakeTelemetry() {
|
|
|
1641
1730
|
ctaPlacement: readHidden('ctaPlacement'),
|
|
1642
1731
|
planId: readHidden('planId') || 'team',
|
|
1643
1732
|
});
|
|
1733
|
+
sendGa4Event('generate_lead', {
|
|
1734
|
+
currency: 'USD',
|
|
1735
|
+
value: workflowSprintPriceDollars,
|
|
1736
|
+
method: 'workflow_sprint_intake',
|
|
1737
|
+
});
|
|
1644
1738
|
});
|
|
1645
1739
|
});
|
|
1646
1740
|
}
|
|
@@ -1787,6 +1881,7 @@ function copyInstall(el) {
|
|
|
1787
1881
|
</script>
|
|
1788
1882
|
<script>
|
|
1789
1883
|
initializeBuyerIntentForms();
|
|
1884
|
+
initializePaidSprintPath();
|
|
1790
1885
|
initializeTeamIntakeTelemetry();
|
|
1791
1886
|
|
|
1792
1887
|
async function handleProTrial() {
|
package/public/numbers.html
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"alternateName": "thumbgate",
|
|
26
26
|
"applicationCategory": "DeveloperApplication",
|
|
27
27
|
"operatingSystem": "Cross-platform, Node.js >=18.18.0",
|
|
28
|
-
"softwareVersion": "1.16.
|
|
28
|
+
"softwareVersion": "1.16.11",
|
|
29
29
|
"url": "https://thumbgate-production.up.railway.app/numbers",
|
|
30
30
|
"dateModified": "2026-05-03",
|
|
31
31
|
"creator": {
|
|
@@ -190,7 +190,7 @@
|
|
|
190
190
|
<main class="container">
|
|
191
191
|
<h1>The Numbers</h1>
|
|
192
192
|
<p class="subtitle">Generated first-party operational data from the ThumbGate runtime. No surveys or projections โ this page is a release-time snapshot produced by the same local scripts that power the CLI and dashboard.</p>
|
|
193
|
-
<div class="freshness">Updated: 2026-05-03 ยท Version 1.16.
|
|
193
|
+
<div class="freshness">Updated: 2026-05-03 ยท Version 1.16.11</div>
|
|
194
194
|
|
|
195
195
|
<h2>Gate enforcement</h2>
|
|
196
196
|
<div class="stats-grid">
|
|
@@ -264,7 +264,7 @@
|
|
|
264
264
|
<div class="cta">
|
|
265
265
|
<a href="https://www.npmjs.com/package/thumbgate">Install ThumbGate โ npx thumbgate init</a>
|
|
266
266
|
<div class="footer-note">Prefer the raw feed? See <a href="https://github.com/IgorGanapolsky/ThumbGate">GitHub</a> or run <code>npm run gate:stats</code> locally.</div>
|
|
267
|
-
<div class="footer-note">Generated at 2026-05-
|
|
267
|
+
<div class="footer-note">Generated at 2026-05-03T18:27:19.381Z UTC.</div>
|
|
268
268
|
</div>
|
|
269
269
|
</main>
|
|
270
270
|
</body>
|
package/scripts/billing.js
CHANGED
|
@@ -2263,6 +2263,7 @@ function getBusinessAnalytics(options = {}) {
|
|
|
2263
2263
|
conversionByOfferCode,
|
|
2264
2264
|
},
|
|
2265
2265
|
trafficMetrics,
|
|
2266
|
+
ctas: telemetry.ctas || {},
|
|
2266
2267
|
operatorGeneratedAcquisition,
|
|
2267
2268
|
dataQuality,
|
|
2268
2269
|
sourceDiagnostics,
|
|
@@ -2349,6 +2350,7 @@ function getBillingSummary(options = {}) {
|
|
|
2349
2350
|
newsletter: business.newsletter,
|
|
2350
2351
|
attribution: business.attribution,
|
|
2351
2352
|
trafficMetrics: business.trafficMetrics,
|
|
2353
|
+
ctas: business.ctas,
|
|
2352
2354
|
operatorGeneratedAcquisition: business.operatorGeneratedAcquisition,
|
|
2353
2355
|
dataQuality: business.dataQuality,
|
|
2354
2356
|
sourceDiagnostics: business.sourceDiagnostics,
|
package/scripts/hosted-config.js
CHANGED
|
@@ -11,6 +11,8 @@ const DEFAULT_PUBLIC_APP_ORIGIN = 'https://thumbgate-production.up.railway.app';
|
|
|
11
11
|
const DEFAULT_CHECKOUT_FALLBACK_URL = PRO_MONTHLY_PAYMENT_LINK;
|
|
12
12
|
const DEFAULT_PRO_PRICE_DOLLARS = PRO_MONTHLY_PRICE_DOLLARS;
|
|
13
13
|
const DEFAULT_PRO_PRICE_LABEL = PRO_PRICE_LABEL;
|
|
14
|
+
const DEFAULT_SPRINT_DIAGNOSTIC_PRICE_DOLLARS = 499;
|
|
15
|
+
const DEFAULT_WORKFLOW_SPRINT_PRICE_DOLLARS = 1500;
|
|
14
16
|
const GA_MEASUREMENT_ID_PATTERN = /^G-[A-Z0-9]+$/i;
|
|
15
17
|
|
|
16
18
|
function normalizeOrigin(value) {
|
|
@@ -125,6 +127,8 @@ function resolveHostedBillingConfig({ requestOrigin } = {}, env = process.env) {
|
|
|
125
127
|
const gaMeasurementId = normalizeTrackingId(env.THUMBGATE_GA_MEASUREMENT_ID, GA_MEASUREMENT_ID_PATTERN);
|
|
126
128
|
const posthogApiKey = env.POSTHOG_API_KEY || '';
|
|
127
129
|
const googleSiteVerification = normalizeTrackingId(env.THUMBGATE_GOOGLE_SITE_VERIFICATION);
|
|
130
|
+
const sprintDiagnosticCheckoutUrl = normalizeAbsoluteUrl(env.THUMBGATE_SPRINT_DIAGNOSTIC_CHECKOUT_URL);
|
|
131
|
+
const workflowSprintCheckoutUrl = normalizeAbsoluteUrl(env.THUMBGATE_WORKFLOW_SPRINT_CHECKOUT_URL);
|
|
128
132
|
|
|
129
133
|
return {
|
|
130
134
|
appOrigin,
|
|
@@ -136,6 +140,12 @@ function resolveHostedBillingConfig({ requestOrigin } = {}, env = process.env) {
|
|
|
136
140
|
) || DEFAULT_CHECKOUT_FALLBACK_URL,
|
|
137
141
|
proPriceDollars,
|
|
138
142
|
proPriceLabel,
|
|
143
|
+
sprintDiagnosticCheckoutUrl,
|
|
144
|
+
workflowSprintCheckoutUrl,
|
|
145
|
+
sprintDiagnosticPriceDollars: normalizePriceDollars(env.THUMBGATE_SPRINT_DIAGNOSTIC_PRICE_DOLLARS)
|
|
146
|
+
|| DEFAULT_SPRINT_DIAGNOSTIC_PRICE_DOLLARS,
|
|
147
|
+
workflowSprintPriceDollars: normalizePriceDollars(env.THUMBGATE_WORKFLOW_SPRINT_PRICE_DOLLARS)
|
|
148
|
+
|| DEFAULT_WORKFLOW_SPRINT_PRICE_DOLLARS,
|
|
139
149
|
gaMeasurementId,
|
|
140
150
|
googleSiteVerification,
|
|
141
151
|
posthogApiKey,
|
|
@@ -147,6 +157,8 @@ module.exports = {
|
|
|
147
157
|
DEFAULT_CHECKOUT_FALLBACK_URL,
|
|
148
158
|
DEFAULT_PRO_PRICE_DOLLARS,
|
|
149
159
|
DEFAULT_PRO_PRICE_LABEL,
|
|
160
|
+
DEFAULT_SPRINT_DIAGNOSTIC_PRICE_DOLLARS,
|
|
161
|
+
DEFAULT_WORKFLOW_SPRINT_PRICE_DOLLARS,
|
|
150
162
|
GA_MEASUREMENT_ID_PATTERN,
|
|
151
163
|
normalizeAbsoluteUrl,
|
|
152
164
|
normalizeOrigin,
|
package/scripts/pr-manager.js
CHANGED
|
@@ -115,7 +115,8 @@ function isMissingCurrentBranchPr(result, prNumber) {
|
|
|
115
115
|
return false;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
return /no pull requests found for branch/i.test(formatGhError(result))
|
|
118
|
+
return /no pull requests found for branch/i.test(formatGhError(result))
|
|
119
|
+
|| /could not determine current branch:.*not on any branch/i.test(formatGhError(result));
|
|
119
120
|
}
|
|
120
121
|
|
|
121
122
|
/**
|
package/src/api/server.js
CHANGED
|
@@ -1648,6 +1648,10 @@ function loadPublicMarketingTemplateHtml(templatePath, runtimeConfig, pageContex
|
|
|
1648
1648
|
'__CHECKOUT_FALLBACK_URL__': runtimeConfig.checkoutFallbackUrl,
|
|
1649
1649
|
'__PRO_PRICE_DOLLARS__': runtimeConfig.proPriceDollars,
|
|
1650
1650
|
'__PRO_PRICE_LABEL__': runtimeConfig.proPriceLabel,
|
|
1651
|
+
'__SPRINT_DIAGNOSTIC_CHECKOUT_URL__': runtimeConfig.sprintDiagnosticCheckoutUrl || '',
|
|
1652
|
+
'__WORKFLOW_SPRINT_CHECKOUT_URL__': runtimeConfig.workflowSprintCheckoutUrl || '',
|
|
1653
|
+
'__SPRINT_DIAGNOSTIC_PRICE_DOLLARS__': runtimeConfig.sprintDiagnosticPriceDollars || 499,
|
|
1654
|
+
'__WORKFLOW_SPRINT_PRICE_DOLLARS__': runtimeConfig.workflowSprintPriceDollars || 1500,
|
|
1651
1655
|
'__GA_MEASUREMENT_ID__': runtimeConfig.gaMeasurementId || '',
|
|
1652
1656
|
'__GA_BOOTSTRAP__': gaBootstrap,
|
|
1653
1657
|
'__GOOGLE_SITE_VERIFICATION_META__': googleSiteVerificationMeta,
|