thumbgate 1.16.10 → 1.16.12

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate-marketplace",
3
- "version": "1.16.10",
3
+ "version": "1.16.12",
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.10",
16
+ "version": "1.16.12",
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.10",
4
+ "version": "1.16.12",
5
5
  "author": {
6
6
  "name": "Igor Ganapolsky"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.16.10",
3
+ "version": "1.16.12",
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.10", "thumbgate", "serve"]
5
+ "args": ["--yes", "--package", "thumbgate@1.16.12", "thumbgate", "serve"]
6
6
  }
7
7
  },
8
8
  "hooks": {
9
9
  "preToolUse": {
10
10
  "command": "npx",
11
- "args": ["--yes", "--package", "thumbgate@1.16.10", "thumbgate", "gate-check"]
11
+ "args": ["--yes", "--package", "thumbgate@1.16.12", "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.10' };
204
+ const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.16.12' };
205
205
  const COMMERCE_CATEGORIES = [
206
206
  'product_recommendation',
207
207
  'brand_compliance',
@@ -7,7 +7,7 @@
7
7
  "npx",
8
8
  "--yes",
9
9
  "--package",
10
- "thumbgate@1.16.10",
10
+ "thumbgate@1.16.12",
11
11
  "thumbgate",
12
12
  "serve"
13
13
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.16.10",
3
+ "version": "1.16.12",
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",
@@ -239,6 +240,7 @@
239
240
  "gtm:chatgpt": "node scripts/chatgpt-gpt-revenue-pack.js",
240
241
  "gtm:codex": "node scripts/codex-marketplace-revenue-pack.js",
241
242
  "gtm:linkedin": "node scripts/linkedin-workflow-hardening-pack.js",
243
+ "gtm:roo-sunset": "node scripts/roo-sunset-demand-pack.js",
242
244
  "gtm:reddit": "node scripts/reddit-dm-workflow-hardening-pack.js",
243
245
  "sales:pipeline": "node scripts/sales-pipeline.js",
244
246
  "social:prepare": "node scripts/social-pipeline.js prepare",
@@ -308,7 +310,7 @@
308
310
  "test:hosted-config": "node --test tests/hosted-config.test.js",
309
311
  "test:operational-summary": "node --test tests/operational-summary.test.js",
310
312
  "test:operational-dashboard": "node --test tests/operational-dashboard.test.js",
311
- "test:operator-artifacts": "node --test tests/operator-artifacts.test.js tests/revenue-pack-utils.test.js tests/claude-workflow-hardening-pack.test.js tests/gemini-cli-demand-pack.test.js tests/chatgpt-gpt-revenue-pack.test.js",
313
+ "test:operator-artifacts": "node --test tests/operator-artifacts.test.js tests/revenue-pack-utils.test.js tests/claude-workflow-hardening-pack.test.js tests/gemini-cli-demand-pack.test.js tests/roo-sunset-demand-pack.test.js tests/chatgpt-gpt-revenue-pack.test.js",
312
314
  "test:operator-key-auth": "node --test tests/api-operator-key-auth.test.js",
313
315
  "test:cloudflare-sandbox": "node --test tests/cloudflare-dynamic-sandbox.test.js tests/cloudflare-sandbox-api.test.js",
314
316
  "test:mcp-config": "node --test tests/mcp-config.test.js",
@@ -350,7 +352,7 @@
350
352
  "test:training-export": "node --test tests/training-export.test.js tests/databricks-export.test.js",
351
353
  "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
354
  "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",
355
+ "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/roo-sunset-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 tests/roo-sunset-marketing.test.js",
354
356
  "test:sales-pipeline": "node --test tests/sales-pipeline.test.js",
355
357
  "test:billing": "node --test tests/billing.test.js tests/stripe-sync-product-images.test.js",
356
358
  "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",
@@ -62,7 +62,7 @@
62
62
  "name": "Is ThumbGate free?",
63
63
  "acceptedAnswer": {
64
64
  "@type": "Answer",
65
- "text": "ThumbGate has a free tier that includes local enforcement with 3 daily feedback captures, 5 lesson searches, unlimited recall, blocking, and history-aware lesson distillation. Pro ($19/mo or $149/yr) adds a personal local dashboard and DPO export. Team rollout ($49/seat/mo) adds a shared lesson database and org dashboard."
65
+ "text": "ThumbGate has a free tier that includes local enforcement with 3 feedback captures total, 1 auto-promoted prevention rule, and pre-action check blocking. Pro ($19/mo or $149/yr) adds a personal local dashboard, recall, lesson search, and DPO export. Team rollout ($49/seat/mo) adds a shared lesson database and org dashboard."
66
66
  }
67
67
  },
68
68
  {
@@ -293,7 +293,7 @@
293
293
 
294
294
  <div class="card">
295
295
  <h3>Is ThumbGate free?</h3>
296
- <p>ThumbGate has a free tier that includes local enforcement with 3 daily feedback captures, 5 lesson searches, unlimited recall, and pre-action check blocking. Pro ($19/mo or $149/yr) adds a personal local dashboard and DPO export. Team rollout ($49/seat/mo) adds a shared lesson database and org dashboard.</p>
296
+ <p>ThumbGate has a free tier that includes local enforcement with 3 feedback captures total, 1 auto-promoted prevention rule, and pre-action check blocking. Pro ($19/mo or $149/yr) adds a personal local dashboard, recall, lesson search, and DPO export. Team rollout ($49/seat/mo) adds a shared lesson database and org dashboard.</p>
297
297
  </div>
298
298
 
299
299
  <div class="card">
package/public/guide.html CHANGED
@@ -354,7 +354,7 @@ npx thumbgate init --agent gemini</code></pre>
354
354
  <p>One command. Works with Claude Code, Cursor, Codex, Gemini, Amp, and OpenCode. Claude Code can also call Codex for review, adversarial review, and second-pass handoffs through the repo-local bridge plugin.</p>
355
355
  <a href="https://thumbgate-production.up.railway.app/checkout/pro?utm_source=guide&utm_medium=cta_button&utm_campaign=pro_pack" class="cta">Get Pro — $19/mo or $149/yr</a>
356
356
  <a href="https://thumbgate-production.up.railway.app/#workflow-sprint-intake" class="cta cta-secondary">Start a Workflow Hardening Sprint</a>
357
- <p style="color:var(--muted); font-size:0.85rem;">Free keeps local enforcement with 3 daily feedback captures, 5 lesson searches, unlimited recall, blocking, and history-aware lesson distillation. Pro is $19/mo or $149/yr for a personal local dashboard and DPO export. Team rollout starts intake-first at $49/seat/mo with a 3-seat minimum for the hosted shared lesson DB, org dashboard, and generated review views.</p>
357
+ <p style="color:var(--muted); font-size:0.85rem;">Free keeps local enforcement with 3 feedback captures total, 1 auto-promoted prevention rule, and built-in hook blocking. Pro is $19/mo or $149/yr for a personal local dashboard, recall, lesson search, and DPO export. Team rollout starts intake-first at $49/seat/mo with a 3-seat minimum for the hosted shared lesson DB, org dashboard, and generated review views.</p>
358
358
 
359
359
  </div>
360
360
  </body>
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; }
@@ -1123,6 +1136,12 @@ __GA_BOOTSTRAP__
1123
1136
  <p>Why Gemini CLI buyers start with memory and convert when they see how memory becomes real pre-action checks.</p>
1124
1137
  <div class="card-arrow">Read the Gemini guide →</div>
1125
1138
  </a>
1139
+ <a class="seo-card" href="/guides/roo-code-alternative-cline">
1140
+ <div class="seo-kicker">Migration</div>
1141
+ <h3>Roo Code Alternative: Migrate to Cline Without Losing Agent Memory</h3>
1142
+ <p>Turn the Roo shutdown into a portable-memory story: keep the lessons, keep the gates, and avoid re-teaching the same failures after the move.</p>
1143
+ <div class="card-arrow">Read the migration guide →</div>
1144
+ </a>
1126
1145
  <a class="seo-card" href="/guides/autoresearch-agent-safety">
1127
1146
  <div class="seo-kicker">Autoresearch</div>
1128
1147
  <h3>Autoresearch Safety for Self-Improving Agents</h3>
@@ -1164,7 +1183,7 @@ __GA_BOOTSTRAP__
1164
1183
  <!-- HOW IT WORKS -->
1165
1184
  <section class="how-it-works" id="how-it-works">
1166
1185
  <div class="container">
1167
- <div class="section-label">New in v1.16.10</div>
1186
+ <div class="section-label">New in v1.16.12</div>
1168
1187
  <h2 class="section-title">Three steps to stop repeated AI failures</h2>
1169
1188
  <div class="steps">
1170
1189
  <div class="step">
@@ -1313,7 +1332,7 @@ __GA_BOOTSTRAP__
1313
1332
  <div class="tier" style="color:var(--cyan);">Free</div>
1314
1333
  <div class="price">$0</div>
1315
1334
  <div class="price-sub">See how it works. Hit the wall. Then decide.</div>
1316
- <p style="font-size:13px;color:#aaa;margin-bottom:16px;">3 captures, 1 rule, 1 agent. Enough to prove the enforcement loop works. When you need more, you will know.</p>
1335
+ <p style="font-size:13px;color:#aaa;margin-bottom:16px;">3 captures total, 1 rule. Enough to prove the enforcement loop works. When you need more, you will know.</p>
1317
1336
  <ul>
1318
1337
  <li><strong>3 feedback captures total</strong> (not per day)</li>
1319
1338
  <li>1 auto-promoted prevention rule</li>
@@ -1403,10 +1422,32 @@ __GA_BOOTSTRAP__
1403
1422
  <div class="team-intake-panel-head">
1404
1423
  <div>
1405
1424
  <h3>Tell us the workflow. Get a proof plan.</h3>
1406
- <p>The highest-fit Team buyer is already feeling one repeated failure. Capture it here instead of making them click through a hidden form.</p>
1425
+ <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
1426
  </div>
1408
1427
  <span class="team-intake-badge">30-minute intake</span>
1409
1428
  </div>
1429
+ <div class="team-paid-path" data-sprint-paid-path aria-label="Paid workflow hardening options">
1430
+ <div class="team-paid-card">
1431
+ <div>
1432
+ <h4>Workflow Hardening Diagnostic</h4>
1433
+ <p>Paid triage for one repeated agent or review failure, with a concrete proof plan and go/no-go recommendation.</p>
1434
+ </div>
1435
+ <div>
1436
+ <div class="team-paid-price">$<span data-sprint-diagnostic-price>499</span></div>
1437
+ <a class="team-paid-link" data-sprint-diagnostic-link href="#workflow-sprint-intake">Pay for diagnostic</a>
1438
+ </div>
1439
+ </div>
1440
+ <div class="team-paid-card">
1441
+ <div>
1442
+ <h4>Workflow Hardening Sprint</h4>
1443
+ <p>48-hour implementation sprint for one workflow owner, one blocker, one proof review, and one hardened rollout path.</p>
1444
+ </div>
1445
+ <div>
1446
+ <div class="team-paid-price">$<span data-workflow-sprint-price>1500</span></div>
1447
+ <a class="team-paid-link" data-workflow-sprint-link href="#workflow-sprint-intake">Pay for sprint</a>
1448
+ </div>
1449
+ </div>
1450
+ </div>
1410
1451
  <form id="team-pilot-intake-form" class="team-form" action="/v1/intake/workflow-sprint" method="POST" data-team-intake-form>
1411
1452
  <input type="hidden" name="ctaId" value="workflow_sprint_intake">
1412
1453
  <input type="hidden" name="ctaPlacement" value="team_visible_intake">
@@ -1470,7 +1511,7 @@ __GA_BOOTSTRAP__
1470
1511
  </div>
1471
1512
  <div class="faq-item">
1472
1513
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">Do I need a cloud account?</div>
1473
- <div class="faq-a">No. Free keeps local enforcement on your machine with 3 daily feedback captures, 5 lesson searches, unlimited recall, checks, and hook blocking. No cloud account is required. The business starts when a team wants shared rules, approval boundaries, hosted review views, org dashboard visibility, and proof that survives handoffs. Pro is the optional solo side lane for a personal dashboard, DPO export, and team lesson export/import — share lessons across projects so one team's mistakes become every team's prevention rules.</div>
1514
+ <div class="faq-a">No. Free keeps local enforcement on your machine with 3 feedback captures total, 1 auto-promoted prevention rule, built-in safety checks, and hook blocking. Recall, lesson search, and exports open up on Pro. No cloud account is required. The business starts when a team wants shared rules, approval boundaries, hosted review views, org dashboard visibility, and proof that survives handoffs. Pro is the optional solo side lane for a personal dashboard, DPO export, and team lesson export/import — share lessons across projects so one team's mistakes become every team's prevention rules.</div>
1474
1515
  </div>
1475
1516
  <div class="faq-item">
1476
1517
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What if my thumbs-down is vague?</div>
@@ -1534,7 +1575,7 @@ __GA_BOOTSTRAP__
1534
1575
  <a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
1535
1576
  <a href="/blog">Blog</a>
1536
1577
  </div>
1537
- <span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.16.10</span>
1578
+ <span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.16.12</span>
1538
1579
  </div>
1539
1580
  </footer>
1540
1581
 
@@ -1619,6 +1660,60 @@ function sendFirstPartyTelemetry(eventType, props) {
1619
1660
  }).catch(function() {});
1620
1661
  }
1621
1662
 
1663
+ function sendGa4Event(eventName, params) {
1664
+ if (!gaMeasurementId || typeof globalThis.gtag !== 'function') return;
1665
+ globalThis.gtag('event', eventName, params || {});
1666
+ }
1667
+
1668
+ function initializePaidSprintPath() {
1669
+ var panel = document.querySelector('[data-sprint-paid-path]');
1670
+ if (!panel) return;
1671
+ var diagnosticLink = document.querySelector('[data-sprint-diagnostic-link]');
1672
+ var sprintLink = document.querySelector('[data-workflow-sprint-link]');
1673
+ var diagnosticPrice = document.querySelector('[data-sprint-diagnostic-price]');
1674
+ var sprintPrice = document.querySelector('[data-workflow-sprint-price]');
1675
+ if (diagnosticPrice) diagnosticPrice.textContent = String(sprintDiagnosticPriceDollars);
1676
+ if (sprintPrice) sprintPrice.textContent = String(workflowSprintPriceDollars);
1677
+ var hasDiagnosticUrl = /^https?:\/\//.test(sprintDiagnosticCheckoutUrl);
1678
+ var hasSprintUrl = /^https?:\/\//.test(workflowSprintCheckoutUrl);
1679
+ if (!hasDiagnosticUrl && !hasSprintUrl) return;
1680
+ panel.classList.add('visible');
1681
+ if (hasDiagnosticUrl && diagnosticLink) {
1682
+ diagnosticLink.href = sprintDiagnosticCheckoutUrl;
1683
+ diagnosticLink.addEventListener('click', function() {
1684
+ sendFirstPartyTelemetry('workflow_sprint_diagnostic_checkout_started', {
1685
+ ctaId: 'workflow_sprint_diagnostic_checkout',
1686
+ ctaPlacement: 'team_paid_path',
1687
+ planId: 'team',
1688
+ offer: 'workflow_hardening_diagnostic',
1689
+ price: sprintDiagnosticPriceDollars,
1690
+ });
1691
+ sendGa4Event('begin_checkout', {
1692
+ currency: 'USD',
1693
+ value: sprintDiagnosticPriceDollars,
1694
+ items: [{ item_id: 'workflow_hardening_diagnostic', item_name: 'Workflow Hardening Diagnostic' }],
1695
+ });
1696
+ });
1697
+ }
1698
+ if (hasSprintUrl && sprintLink) {
1699
+ sprintLink.href = workflowSprintCheckoutUrl;
1700
+ sprintLink.addEventListener('click', function() {
1701
+ sendFirstPartyTelemetry('workflow_sprint_checkout_started', {
1702
+ ctaId: 'workflow_sprint_checkout',
1703
+ ctaPlacement: 'team_paid_path',
1704
+ planId: 'team',
1705
+ offer: 'workflow_hardening_sprint',
1706
+ price: workflowSprintPriceDollars,
1707
+ });
1708
+ sendGa4Event('begin_checkout', {
1709
+ currency: 'USD',
1710
+ value: workflowSprintPriceDollars,
1711
+ items: [{ item_id: 'workflow_hardening_sprint', item_name: 'Workflow Hardening Sprint' }],
1712
+ });
1713
+ });
1714
+ }
1715
+ }
1716
+
1622
1717
  function initializeTeamIntakeTelemetry() {
1623
1718
  document.querySelectorAll('[data-team-intake-form]').forEach(function(form) {
1624
1719
  var started = false;
@@ -1641,6 +1736,11 @@ function initializeTeamIntakeTelemetry() {
1641
1736
  ctaPlacement: readHidden('ctaPlacement'),
1642
1737
  planId: readHidden('planId') || 'team',
1643
1738
  });
1739
+ sendGa4Event('generate_lead', {
1740
+ currency: 'USD',
1741
+ value: workflowSprintPriceDollars,
1742
+ method: 'workflow_sprint_intake',
1743
+ });
1644
1744
  });
1645
1745
  });
1646
1746
  }
@@ -1787,6 +1887,7 @@ function copyInstall(el) {
1787
1887
  </script>
1788
1888
  <script>
1789
1889
  initializeBuyerIntentForms();
1890
+ initializePaidSprintPath();
1790
1891
  initializeTeamIntakeTelemetry();
1791
1892
 
1792
1893
  async function handleProTrial() {
package/public/learn.html CHANGED
@@ -97,24 +97,30 @@
97
97
  {
98
98
  "@type": "ListItem",
99
99
  "position": 10,
100
+ "url": "https://thumbgate.ai/guides/roo-code-alternative-cline",
101
+ "name": "Roo Code Alternative: Migrating to Cline with Portable Lesson Memory"
102
+ },
103
+ {
104
+ "@type": "ListItem",
105
+ "position": 11,
100
106
  "url": "https://thumbgate.ai/guides/browser-automation-safety",
101
107
  "name": "Browser Automation Safety for AI Agents"
102
108
  },
103
109
  {
104
110
  "@type": "ListItem",
105
- "position": 11,
111
+ "position": 12,
106
112
  "url": "https://thumbgate.ai/guides/native-messaging-host-security",
107
113
  "name": "Native Messaging Host Security"
108
114
  },
109
115
  {
110
116
  "@type": "ListItem",
111
- "position": 12,
117
+ "position": 13,
112
118
  "url": "https://thumbgate.ai/guides/ai-search-topical-presence",
113
119
  "name": "AI Search Topical Presence"
114
120
  },
115
121
  {
116
122
  "@type": "ListItem",
117
- "position": 13,
123
+ "position": 14,
118
124
  "url": "https://thumbgate.ai/guides/relational-knowledge-ai-recommendations",
119
125
  "name": "Relational Knowledge in AI Recommendations"
120
126
  }
@@ -316,6 +322,14 @@
316
322
  <span class="article-tag">Enforcement</span>
317
323
  </a>
318
324
 
325
+ <a href="/guides/roo-code-alternative-cline" class="article-card">
326
+ <h3>Roo Code Alternative: Migrate to Cline Without Losing Agent Memory</h3>
327
+ <p>Use the Roo shutdown window to pitch portable lesson memory and local-first enforcement instead of making operators re-teach the same failures after they switch.</p>
328
+ <span class="article-tag">Migration</span>
329
+ <span class="article-tag">Cline</span>
330
+ <span class="article-tag">Portable Memory</span>
331
+ </a>
332
+
319
333
  <a href="/guides/browser-automation-safety" class="article-card">
320
334
  <h3>Browser Automation Safety for AI Agents</h3>
321
335
  <p>Prompt injection gets more dangerous when browser agents can create cross-app bridges, hold persistent permissions, or silently widen connector scope.</p>
@@ -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.10",
28
+ "softwareVersion": "1.16.12",
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.10</div>
193
+ <div class="freshness">Updated: 2026-05-03 · Version 1.16.12</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-03T16:23:03.917Z UTC.</div>
267
+ <div class="footer-note">Generated at 2026-05-03T22:31:46.242Z UTC.</div>
268
268
  </div>
269
269
  </main>
270
270
  </body>
@@ -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,
@@ -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,
@@ -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
  /**
@@ -127,6 +127,12 @@ const HIGH_ROI_QUERY_SEEDS = [
127
127
  source: 'seed',
128
128
  notes: 'Integration page for Gemini CLI users who need memory plus enforcement.',
129
129
  },
130
+ {
131
+ query: 'roo code alternative cline',
132
+ businessValue: 83,
133
+ source: 'seed',
134
+ notes: 'Time-sensitive migration query for Roo users who need portable lesson memory before the May 15, 2026 shutdown.',
135
+ },
130
136
  ];
131
137
 
132
138
  function querySeed(query, businessValue, notes) {
@@ -877,6 +883,55 @@ const PAGE_BLUEPRINTS = [
877
883
  ],
878
884
  relatedPaths: ['/compare/mem0', '/guides/stop-repeated-ai-agent-mistakes'],
879
885
  },
886
+ {
887
+ query: 'roo code alternative cline',
888
+ path: '/guides/roo-code-alternative-cline',
889
+ pageType: 'integration',
890
+ pillar: 'agent-workflows',
891
+ title: 'Roo Code Alternative: Migrating to Cline with Portable Lesson Memory',
892
+ heroTitle: 'Roo Code Alternative: Migrate to Cline Without Losing Agent Memory',
893
+ heroSummary: 'Roo Code is shutting down on May 15, 2026, and its own docs point users to Cline. ThumbGate keeps the migration from resetting every hard-won thumbs-down and workflow correction back to zero.',
894
+ takeaways: [
895
+ 'Roo users have a time-bound migration problem with clear buyer urgency.',
896
+ 'The real wedge is portable lesson memory, not just swapping one VS Code extension for another.',
897
+ 'The page should answer the migration question and route serious operators into a local-first enforcement path.',
898
+ ],
899
+ sections: [
900
+ {
901
+ heading: 'Why the migration risk is bigger than the extension swap',
902
+ paragraphs: [
903
+ 'Roo users can usually move to Cline without much trouble at the MCP layer. The hidden risk is losing every correction that only lived in the old agent context.',
904
+ 'If the same git, deploy, or migration mistake has to be re-taught from scratch after the swap, the migration cost is higher than it looks.',
905
+ ],
906
+ },
907
+ {
908
+ heading: 'What ThumbGate adds to the move',
909
+ bullets: [
910
+ 'Keep lessons in a local SQLite plus FTS5 store instead of vendor-scoped memory.',
911
+ 'Turn repeated failures into prevention rules and pre-action checks before the next tool call runs.',
912
+ 'Reuse the same local memory across Cline, Claude Code, Cursor, Codex, Gemini CLI, Amp, and other MCP-compatible agents.',
913
+ 'Give migration buyers a proof-backed install path instead of another generic memory promise.',
914
+ ],
915
+ },
916
+ {
917
+ heading: 'Why this converts',
918
+ paragraphs: [
919
+ 'A migration deadline creates urgency, but the stronger buying reason is avoiding repeated rework after the switch. Portable lesson memory plus enforced checks is the part buyers can immediately understand and verify.',
920
+ ],
921
+ },
922
+ ],
923
+ faq: [
924
+ {
925
+ question: 'Why not just switch from Roo to Cline and keep going?',
926
+ answer: 'Because the workflow memory can still reset if past corrections only lived inside the old agent context. ThumbGate keeps those lessons in a local store that survives the vendor swap.',
927
+ },
928
+ {
929
+ question: 'Does ThumbGate only help with Cline?',
930
+ answer: 'No. Cline is the immediate migration path, but the same local lesson memory and pre-action checks work across other MCP-compatible coding agents too.',
931
+ },
932
+ ],
933
+ relatedPaths: ['/guides/codex-cli-guardrails', '/guides/stop-repeated-ai-agent-mistakes'],
934
+ },
880
935
  ...BROWSER_BRIDGE_GUIDE_SPECS.map(buildBrowserBridgeGuide),
881
936
  ...AI_RECOMMENDATION_VISIBILITY_GUIDE_SPECS.map(buildAiRecommendationVisibilityGuide),
882
937
  guideBlueprint({
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,