thumbgate 1.27.19 → 1.28.0

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.
Files changed (116) hide show
  1. package/.claude/commands/dashboard.md +15 -0
  2. package/.claude/commands/thumbgate-blocked.md +27 -0
  3. package/.claude/commands/thumbgate-dashboard.md +15 -0
  4. package/.claude/commands/thumbgate-doctor.md +30 -0
  5. package/.claude/commands/thumbgate-guard.md +36 -0
  6. package/.claude/commands/thumbgate-protect.md +30 -0
  7. package/.claude/commands/thumbgate-rules.md +30 -0
  8. package/.claude-plugin/plugin.json +1 -1
  9. package/.well-known/mcp/server-card.json +1 -1
  10. package/README.md +63 -45
  11. package/adapters/claude/.mcp.json +2 -2
  12. package/adapters/gcp/dfcx-webhook-gate.js +295 -0
  13. package/adapters/letta/README.md +41 -0
  14. package/adapters/letta/thumbgate-letta-adapter.js +133 -0
  15. package/adapters/mcp/server-stdio.js +1 -1
  16. package/adapters/opencode/opencode.json +1 -1
  17. package/adapters/policy-engine/ethicore-guardian-client.js +68 -0
  18. package/adapters/policy-engine/thumbgate-policy-engine-adapter.js +260 -0
  19. package/bench/observability-eval-suite.json +26 -0
  20. package/bin/cli.js +52 -9
  21. package/bin/dashboard-cli.js +7 -0
  22. package/bin/postinstall.js +14 -23
  23. package/commands/dashboard.md +15 -0
  24. package/commands/thumbgate-dashboard.md +15 -0
  25. package/config/entitlement-public-keys.json +6 -0
  26. package/config/gates/default.json +1 -1
  27. package/config/github-about.json +2 -2
  28. package/config/merge-quality-checks.json +3 -0
  29. package/package.json +233 -100
  30. package/public/about.html +159 -0
  31. package/public/agent-manager.html +179 -0
  32. package/public/agents-cost-savings.html +153 -0
  33. package/public/ai-malpractice-prevention.html +818 -0
  34. package/public/assets/brand/github-social-preview.png +0 -0
  35. package/public/assets/brand/thumbgate-icon-512.png +0 -0
  36. package/public/assets/brand/thumbgate-icon-pro-512.png +0 -0
  37. package/public/assets/brand/thumbgate-icon-team-512.png +0 -0
  38. package/public/assets/brand/thumbgate-logo-1200x360.png +0 -0
  39. package/public/assets/brand/thumbgate-logo-transparent.svg +28 -0
  40. package/public/assets/brand/thumbgate-mark-inline-v3.svg +18 -0
  41. package/public/assets/brand/thumbgate-mark-pro.svg +23 -0
  42. package/public/assets/brand/thumbgate-mark-team.svg +26 -0
  43. package/public/assets/brand/thumbgate-mark.svg +21 -0
  44. package/public/assets/brand/thumbgate-wordmark.svg +20 -0
  45. package/public/assets/claude-thumbgate-statusbar.svg +8 -0
  46. package/public/assets/codex-thumbgate-statusbar-test.svg +9 -0
  47. package/public/assets/legal-intake-control-flow.svg +66 -0
  48. package/public/blog.html +12 -9
  49. package/public/brand/thumbgate-mark.svg +19 -0
  50. package/public/brand/thumbgate-og.svg +16 -0
  51. package/public/chatgpt-app.html +330 -0
  52. package/public/codex-enterprise.html +123 -0
  53. package/public/codex-plugin.html +5 -5
  54. package/public/compare.html +10 -10
  55. package/public/dashboard.html +1 -1
  56. package/public/diagnostic.html +345 -0
  57. package/public/federal.html +2 -2
  58. package/public/guide.html +14 -14
  59. package/public/index.html +81 -70
  60. package/public/install.html +193 -0
  61. package/public/js/buyer-intent.js +672 -0
  62. package/public/learn.html +4 -17
  63. package/public/numbers.html +2 -2
  64. package/public/pricing.html +392 -0
  65. package/public/pro.html +2 -2
  66. package/scripts/action-receipts.js +324 -0
  67. package/scripts/activation-quickstart.js +187 -0
  68. package/scripts/agent-operations-planner.js +621 -0
  69. package/scripts/agent-reward-model.js +13 -0
  70. package/scripts/ai-component-inventory.js +367 -0
  71. package/scripts/async-eval-observability.js +236 -0
  72. package/scripts/audit.js +65 -0
  73. package/scripts/aws-blocks-guardrails.js +272 -0
  74. package/scripts/bayes-optimal-gate.js +6 -1
  75. package/scripts/classifier-routing.js +130 -0
  76. package/scripts/cli-feedback.js +17 -1
  77. package/scripts/commercial-offer.js +3 -3
  78. package/scripts/dashboard-chat.js +332 -0
  79. package/scripts/entitlement.js +250 -0
  80. package/scripts/export-databricks-bundle.js +5 -0
  81. package/scripts/export-dpo-pairs.js +6 -0
  82. package/scripts/export-hf-dataset.js +5 -0
  83. package/scripts/feedback-aggregate.js +281 -0
  84. package/scripts/feedback-sanitizer.js +105 -0
  85. package/scripts/gates-engine.js +15 -3
  86. package/scripts/hook-stop-anti-claim.js +301 -0
  87. package/scripts/imperative-detector.js +85 -0
  88. package/scripts/install-shim.js +87 -0
  89. package/scripts/intervention-policy.js +13 -0
  90. package/scripts/mcp-oauth.js +293 -0
  91. package/scripts/noop-detect.js +285 -0
  92. package/scripts/parallel-workflow-orchestrator.js +293 -0
  93. package/scripts/plan-gate.js +243 -0
  94. package/scripts/plausible-domain-config.js +99 -0
  95. package/scripts/pr-manager.js +9 -22
  96. package/scripts/pro-local-dashboard.js +198 -0
  97. package/scripts/qa-scenario-planner.js +136 -0
  98. package/scripts/repeat-metric.js +137 -0
  99. package/scripts/risk-scorer.js +6 -0
  100. package/scripts/secret-fixture-tokens.js +61 -0
  101. package/scripts/secret-redaction.js +166 -0
  102. package/scripts/self-harness-optimizer.js +141 -0
  103. package/scripts/self-healing-check.js +193 -0
  104. package/scripts/self-protection.js +90 -0
  105. package/scripts/seo-gsd.js +2 -2
  106. package/scripts/silent-failure-cluster.js +531 -0
  107. package/scripts/statusline-cache-read.js +57 -0
  108. package/scripts/sync-telemetry-from-prod.js +374 -0
  109. package/scripts/thompson-sampling.js +11 -2
  110. package/scripts/tool-contract-validator.js +76 -0
  111. package/scripts/trajectory-scorer.js +63 -0
  112. package/scripts/verify-marketing-pages-deployed.js +212 -0
  113. package/scripts/visitor-journey.js +172 -0
  114. package/src/api/server.js +81 -10
  115. package/.claude-plugin/marketplace.json +0 -85
  116. package/adapters/chatgpt/openapi.yaml +0 -1707
package/public/learn.html CHANGED
@@ -112,12 +112,6 @@
112
112
  "url": "https://thumbgate.ai/learn/from-prototype-to-production",
113
113
  "name": "From git init to v1.17.0 in 70 days: an honest ThumbGate build log"
114
114
  },
115
- {
116
- "@type": "ListItem",
117
- "position": 13,
118
- "url": "https://thumbgate.ai/learn/pretix-stripe-connect-marketplaces",
119
- "name": "Building a Pretix + Stripe Connect Plugin for Live-Music Venues"
120
- },
121
115
  {
122
116
  "@type": "ListItem",
123
117
  "position": 7,
@@ -128,7 +122,7 @@
128
122
  "@type": "ListItem",
129
123
  "position": 7,
130
124
  "url": "https://thumbgate.ai/guides/cursor-agent-guardrails",
131
- "name": "Cursor Guardrails That Block Repeated Mistakes"
125
+ "name": "Cursor Guardrails That Catch Repeated Mistakes"
132
126
  },
133
127
  {
134
128
  "@type": "ListItem",
@@ -299,7 +293,7 @@
299
293
 
300
294
  <div class="container">
301
295
  <h1>Learn: AI Agent Safety</h1>
302
- <p class="hero-sub">Practical guides for developers who use AI coding agents and want them to stop repeating the same mistakes. Every article ends with something you can ship today.</p>
296
+ <p class="hero-sub">Practical guides for developers who use AI coding agents and want them to catch repeating the same mistakes. Every article ends with something you can ship today.</p>
303
297
  <p class="hero-sub" style="font-size:0.85rem;margin-top:-1rem;">Updated: <time datetime="2026-04-20">2026-04-20</time> · by <a href="https://github.com/IgorGanapolsky" style="color:inherit;">Igor Ganapolsky</a></p>
304
298
 
305
299
  <div class="article-grid">
@@ -313,7 +307,7 @@
313
307
 
314
308
  <a href="/learn/stop-ai-agent-force-push" class="article-card">
315
309
  <h3>How to Stop AI Agents From Force-Pushing to Main</h3>
316
- <p>Your agent just ran git push --force on main. Again. Here is how to make that physically impossible with a pre-action check that takes two minutes to set up.</p>
310
+ <p>Your agent just ran git push --force on main. Again. Here is how to flag and log it by default — and hard-block it under strict enforcement mode — with a pre-action check that takes two minutes to set up.</p>
317
311
  <span class="article-tag">Claude Code</span>
318
312
  <span class="article-tag">Git Safety</span>
319
313
  <span class="article-tag">Pre-Action Checks</span>
@@ -429,13 +423,6 @@
429
423
  <span class="article-tag">Shipping in Public</span>
430
424
  </a>
431
425
 
432
- <a href="/learn/pretix-stripe-connect-marketplaces" class="article-card">
433
- <h3>Building a Pretix + Stripe Connect Plugin for Live-Music Venues</h3>
434
- <p>How to design a multi-venue Stripe Connect ticketing plugin on Pretix, keeping venues as Merchant of Record without messy platform-fee tax reporting.</p>
435
- <span class="article-tag">Stripe Connect</span>
436
- <span class="article-tag">Pretix</span>
437
- <span class="article-tag">Case Study</span>
438
- </a>
439
426
  </div>
440
427
 
441
428
  <h2>Popular buyer questions</h2>
@@ -498,7 +485,7 @@
498
485
  </a>
499
486
 
500
487
  <a href="/guides/cursor-agent-guardrails" class="article-card">
501
- <h3>Cursor Guardrails That Block Repeated Mistakes</h3>
488
+ <h3>Cursor Guardrails That Catch Repeated Mistakes</h3>
502
489
  <p>For Cursor users who need to keep speed while adding a runtime enforcement layer that does more than prompt politely.</p>
503
490
  <span class="article-tag">Cursor</span>
504
491
  <span class="article-tag">Guardrails</span>
@@ -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.27.15",
28
+ "softwareVersion": "1.28.0",
29
29
  "url": "https://thumbgate.ai/numbers",
30
30
  "dateModified": "2026-05-07",
31
31
  "creator": {
@@ -202,7 +202,7 @@
202
202
  <main class="container">
203
203
  <h1>The Numbers</h1>
204
204
  <p class="subtitle">Generated first-party operational snapshot from the ThumbGate runtime. This is not customer traction, install volume, revenue, or proof that a configured gate has fired.</p>
205
- <div class="freshness">Updated: 2026-05-07 · Version 1.27.15</div>
205
+ <div class="freshness">Updated: 2026-05-07 · Version 1.28.0</div>
206
206
  <div class="truth-note"><strong>Read this first:</strong> configured checks are inventory. Recorded blocks and warnings are usage evidence. This snapshot currently reports 0 recorded hard-block event(s) and 0 recorded warning event(s).</div>
207
207
 
208
208
  <h2>Gate enforcement</h2>
@@ -0,0 +1,392 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ __GOOGLE_SITE_VERIFICATION_META__
7
+ <title>Pricing — ThumbGate</title>
8
+ <meta name="description" content="ThumbGate pricing: free CLI forever, $19/mo Pro dashboard, and custom Enterprise enforcement scoped after intake. One clear subscription path.">
9
+ <meta property="og:title" content="Pricing — ThumbGate">
10
+ <meta property="og:description" content="Free CLI, Pro self-serve, and Enterprise after workflow scope. No mixed consulting checkout maze.">
11
+ <meta property="og:type" content="website">
12
+ <meta property="og:url" content="__APP_ORIGIN__/pricing">
13
+ <meta property="og:image" content="/og.png">
14
+ <link rel="canonical" href="__APP_ORIGIN__/pricing">
15
+ <link rel="alternate" type="text/markdown" title="ThumbGate LLM context" href="__APP_ORIGIN__/llm-context.md">
16
+ <link rel="icon" type="image/png" href="/thumbgate-icon.png">
17
+ <link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg">
18
+
19
+ <script defer data-domain="thumbgate.ai" src="https://plausible.io/js/script.tagged-events.js"></script>
20
+ __GA_BOOTSTRAP__
21
+
22
+ <script>
23
+ const gaMeasurementId = '__GA_MEASUREMENT_ID__';
24
+ const serverVisitorId = '__SERVER_VISITOR_ID__';
25
+ const serverSessionId = '__SERVER_SESSION_ID__';
26
+ const serverAcquisitionId = '__SERVER_ACQUISITION_ID__';
27
+ const serverTelemetryCaptured = '__SERVER_TELEMETRY_CAPTURED__' === 'true';
28
+ const proPriceDollars = Number('__PRO_PRICE_DOLLARS__') || 19;
29
+ </script>
30
+
31
+ <script>
32
+ window.thumbgatePricingTelemetry = window.thumbgatePricingTelemetry || {};
33
+ window.trackPricingTelemetry = function(eventType, data) {
34
+ const params = new URLSearchParams(window.location.search);
35
+ const payload = Object.assign({
36
+ eventType,
37
+ clientType: 'web',
38
+ page: '/pricing',
39
+ source: params.get('utm_source') || 'pricing',
40
+ utmSource: params.get('utm_source') || 'pricing',
41
+ utmMedium: params.get('utm_medium') || 'pricing_page',
42
+ utmCampaign: params.get('utm_campaign') || 'pricing_page',
43
+ utmContent: params.get('utm_content') || null,
44
+ utmTerm: params.get('utm_term') || null,
45
+ traceId: params.get('trace_id') || null,
46
+ acquisitionId: params.get('acquisition_id') || serverAcquisitionId || null,
47
+ visitorId: params.get('visitor_id') || serverVisitorId || null,
48
+ sessionId: params.get('visitor_session_id') || params.get('session_id') || serverSessionId || null,
49
+ referrer: document.referrer || null,
50
+ landingPath: '/pricing'
51
+ }, data || {});
52
+ const body = JSON.stringify(payload);
53
+ if (navigator.sendBeacon) {
54
+ navigator.sendBeacon('/v1/telemetry/ping', new Blob([body], { type: 'application/json' }));
55
+ return;
56
+ }
57
+ fetch('/v1/telemetry/ping', {
58
+ method: 'POST',
59
+ headers: { 'content-type': 'application/json' },
60
+ body,
61
+ keepalive: true
62
+ }).catch(function(){});
63
+ };
64
+ document.addEventListener('DOMContentLoaded', function() {
65
+ trackPricingTelemetry('pricing_page_view', { serverTelemetryCaptured });
66
+ document.querySelectorAll('[data-pricing-cta]').forEach(function(link) {
67
+ link.addEventListener('click', function() {
68
+ trackPricingTelemetry('pricing_cta_click', {
69
+ ctaId: link.getAttribute('data-cta-id') || null,
70
+ ctaPlacement: link.getAttribute('data-cta-placement') || 'pricing',
71
+ tier: link.getAttribute('data-tier') || null,
72
+ planId: link.getAttribute('data-plan-id') || null,
73
+ billingCycle: link.getAttribute('data-billing-cycle') || null,
74
+ price: link.getAttribute('data-price') || null,
75
+ href: link.getAttribute('href') || null
76
+ });
77
+ });
78
+ });
79
+ });
80
+ </script>
81
+
82
+ <script type="application/ld+json">
83
+ {
84
+ "@context": "https://schema.org",
85
+ "@type": "SoftwareApplication",
86
+ "name": "ThumbGate",
87
+ "applicationCategory": "DeveloperApplication",
88
+ "operatingSystem": "Cross-platform, Node.js >=18.18.0",
89
+ "url": "__APP_ORIGIN__/pricing",
90
+ "offers": [
91
+ { "@type": "Offer", "name": "ThumbGate CLI (Free)", "price": "0", "priceCurrency": "USD" },
92
+ { "@type": "Offer", "name": "ThumbGate Pro Monthly", "price": "__PRO_PRICE_DOLLARS__", "priceCurrency": "USD", "url": "__APP_ORIGIN__/checkout/pro?confirm=1&plan_id=pro&billing_cycle=monthly&landing_path=%2Fpricing" },
93
+ { "@type": "Offer", "name": "ThumbGate Pro Annual", "price": "149", "priceCurrency": "USD", "url": "__APP_ORIGIN__/checkout/pro?confirm=1&plan_id=pro&billing_cycle=annual&landing_path=%2Fpricing" },
94
+ { "@type": "Offer", "name": "ThumbGate Enterprise", "priceCurrency": "USD", "url": "__APP_ORIGIN__/#workflow-sprint-intake" }
95
+ ]
96
+ }
97
+ </script>
98
+
99
+ <script type="application/ld+json">
100
+ {
101
+ "@context": "https://schema.org",
102
+ "@type": "FAQPage",
103
+ "mainEntity": [
104
+ { "@type": "Question", "name": "What does Pro add over the free CLI?", "acceptedAnswer": { "@type": "Answer", "text": "Free gives you 2 captures/day and 3 active rules, running on your machine. Pro removes solo caps and adds personal recall, dashboard proof, managed adapters, and DPO export. Enterprise adds shared hosted lessons and org visibility." } },
105
+ { "@type": "Question", "name": "Does ThumbGate send my code to the cloud?", "acceptedAnswer": { "@type": "Answer", "text": "No. The CLI is local-first — no source code leaves your machine. Pro adds personal proof and exports; Enterprise adds shared hosted lessons and org dashboards." } },
106
+ { "@type": "Question", "name": "When should I pick Enterprise over Pro?", "acceptedAnswer": { "@type": "Answer", "text": "When one engineer's correction should protect the whole team. Enterprise shares the lesson database across the org so a fix in one repo prevents the same mistake in every repo." } },
107
+ { "@type": "Question", "name": "Can I cancel anytime?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Pro and Enterprise are month-to-month with a 7-day refund window on the first charge. Cancel from the billing portal and your subscription ends at the period close." } }
108
+ ]
109
+ }
110
+ </script>
111
+
112
+ <style>
113
+ *, *::before, *::after { box-sizing: border-box; }
114
+
115
+ :root {
116
+ --bg: #0a0a0b;
117
+ --bg-raised: #111113;
118
+ --bg-card: #161618;
119
+ --border: #232327;
120
+ --text: #ececf1;
121
+ --text-muted: #9a9aa6;
122
+ --text-dim: #6b6b78;
123
+ --cyan: #22d3ee;
124
+ --cyan-dim: rgba(34, 211, 238, 0.12);
125
+ --cyan-glow: rgba(34, 211, 238, 0.22);
126
+ --green: #4ade80;
127
+ --green-dim: rgba(74, 222, 128, 0.12);
128
+ --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', Roboto, sans-serif;
129
+ --mono: 'SF Mono', 'Cascadia Code', 'JetBrains Mono', 'Fira Code', Consolas, monospace;
130
+ }
131
+
132
+ html { scroll-behavior: smooth; }
133
+ body {
134
+ margin: 0;
135
+ font-family: var(--font);
136
+ background:
137
+ radial-gradient(circle at top, rgba(34, 211, 238, 0.16) 0%, rgba(34, 211, 238, 0) 28%),
138
+ linear-gradient(180deg, #0a0a0b 0%, #0d1016 48%, #0a0a0b 100%);
139
+ color: var(--text);
140
+ line-height: 1.6;
141
+ -webkit-font-smoothing: antialiased;
142
+ }
143
+
144
+ a { color: inherit; }
145
+ .container { max-width: 1080px; margin: 0 auto; padding: 0 24px; }
146
+
147
+ /* NAV */
148
+ nav {
149
+ position: sticky; top: 0; z-index: 50;
150
+ backdrop-filter: blur(12px);
151
+ background: rgba(10, 10, 11, 0.86);
152
+ border-bottom: 1px solid rgba(35, 35, 39, 0.92);
153
+ }
154
+ nav .container { min-height: 68px; display: flex; align-items: center; justify-content: space-between; gap: 20px; }
155
+ .nav-logo { font-size: 15px; font-weight: 700; letter-spacing: -0.02em; text-decoration: none; }
156
+ .nav-links { display: flex; gap: 20px; align-items: center; }
157
+ .nav-links a { font-size: 13px; color: var(--text-muted); text-decoration: none; transition: color 0.15s; }
158
+ .nav-links a:hover { color: var(--text); }
159
+ .nav-cta { background: var(--cyan); color: var(--bg); padding: 7px 16px; border-radius: 6px; font-size: 13px; font-weight: 600; text-decoration: none; transition: opacity 0.15s; }
160
+ .nav-cta:hover { opacity: 0.85; }
161
+
162
+ /* HERO */
163
+ .pricing-hero { padding: 80px 0 24px; text-align: center; }
164
+ .pricing-hero h1 { font-size: clamp(28px, 4vw, 40px); font-weight: 700; letter-spacing: -0.03em; margin: 0 0 12px; }
165
+ .pricing-hero .lede { color: var(--text-muted); font-size: 17px; max-width: 560px; margin: 0 auto; }
166
+
167
+ /* GRID */
168
+ .pricing-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin: 40px 0 32px; }
169
+ @media (max-width: 768px) { .pricing-grid { grid-template-columns: 1fr; } }
170
+
171
+ /* CARDS */
172
+ .price-card {
173
+ background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px;
174
+ padding: 32px 28px; display: flex; flex-direction: column;
175
+ }
176
+ .price-card.highlight {
177
+ border-color: var(--cyan);
178
+ box-shadow: 0 0 40px var(--cyan-dim), inset 0 1px 0 rgba(34, 211, 238, 0.15);
179
+ position: relative;
180
+ }
181
+
182
+ .tier { font-size: 13px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); font-weight: 600; margin-bottom: 8px; }
183
+ .price-card.highlight .tier { color: var(--cyan); }
184
+
185
+ .price { font-size: 40px; font-weight: 700; letter-spacing: -0.03em; margin-bottom: 4px; }
186
+ .price span { font-size: 16px; color: var(--text-dim); }
187
+ .price-sub { font-size: 13px; color: var(--text-muted); margin-bottom: 24px; line-height: 1.55; }
188
+
189
+ .price-card ul { list-style: none; padding: 0; margin: 0 0 28px; }
190
+ .price-card li { font-size: 14px; color: var(--text-muted); padding: 6px 0; display: flex; align-items: flex-start; gap: 8px; }
191
+ .price-card li::before { content: "\2713"; color: var(--cyan); font-weight: 700; flex-shrink: 0; }
192
+
193
+ /* BUTTONS */
194
+ .btn-install {
195
+ display: block; text-align: center; padding: 12px; border: 1px solid var(--border);
196
+ border-radius: 8px; color: var(--text); text-decoration: none; font-size: 14px; font-weight: 500;
197
+ transition: border-color 0.15s; margin-top: auto;
198
+ }
199
+ .btn-install:hover { border-color: var(--text-muted); }
200
+
201
+ .btn-pro {
202
+ display: block; text-align: center; padding: 12px;
203
+ background: var(--cyan); color: var(--bg); border-radius: 8px;
204
+ text-decoration: none; font-size: 14px; font-weight: 600; transition: opacity 0.15s;
205
+ margin-top: auto;
206
+ }
207
+ .btn-pro:hover { opacity: 0.85; }
208
+
209
+ .btn-team {
210
+ display: block; text-align: center; padding: 12px;
211
+ background: rgba(74, 222, 128, 0.14); color: var(--green);
212
+ border: 1px solid rgba(74, 222, 128, 0.4); border-radius: 8px;
213
+ text-decoration: none; font-size: 14px; font-weight: 600;
214
+ transition: border-color 0.15s, transform 0.15s; margin-top: auto;
215
+ }
216
+ .btn-team:hover { border-color: var(--green); transform: translateY(-1px); }
217
+
218
+ .btn-sub { font-size: 11px; color: var(--text-muted); margin-top: 8px; text-align: center; }
219
+
220
+ /* FAQ */
221
+ .faq { padding: 48px 0; }
222
+ .faq h2 { text-align: center; font-size: 24px; margin-bottom: 24px; }
223
+ .faq-list { max-width: 640px; margin: 0 auto; }
224
+ .faq-item { border-bottom: 1px solid var(--border); }
225
+ .faq-q {
226
+ padding: 20px 0; font-size: 15px; font-weight: 600; cursor: pointer;
227
+ display: flex; justify-content: space-between; align-items: center;
228
+ }
229
+ .faq-q::after { content: "+"; font-size: 18px; color: var(--text-muted); transition: transform 0.2s; }
230
+ .faq-item.open .faq-q::after { transform: rotate(45deg); }
231
+ .faq-a { font-size: 14px; color: var(--text-muted); line-height: 1.65; padding-bottom: 20px; display: none; }
232
+ .faq-item.open .faq-a { display: block; }
233
+
234
+ /* FOOTER */
235
+ footer { border-top: 1px solid var(--border); padding: 32px 0; margin-top: 48px; }
236
+ footer .container { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; }
237
+ .footer-links { display: flex; gap: 20px; }
238
+ .footer-links a { color: var(--text-muted); text-decoration: none; font-size: 13px; transition: color 0.15s; }
239
+ .footer-links a:hover { color: var(--text); }
240
+ .footer-copy { font-size: 12px; color: var(--text-muted); }
241
+ </style>
242
+ <script>
243
+ !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace("/ingest","")+ "/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group identify setPersonProperties setPersonPropertiesForFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
244
+ posthog.init('__POSTHOG_API_KEY__', {
245
+ api_host: '/ingest',
246
+ ui_host: 'https://us.posthog.com',
247
+ person_profiles: 'identified_only',
248
+ });
249
+ posthog.capture('$pageview');
250
+ </script>
251
+ </head>
252
+ <body>
253
+
254
+ <nav>
255
+ <div class="container">
256
+ <a href="/" class="nav-logo">ThumbGate</a>
257
+ <div class="nav-links">
258
+ <a href="/#how-it-works">Features</a>
259
+ <a href="/pricing" style="color:var(--text);">Pricing</a>
260
+ <a href="/guide">Guide</a>
261
+ <a href="/dashboard">Dashboard</a>
262
+ <a class="nav-cta" href="/checkout/pro?confirm=1&utm_source=pricing&utm_medium=nav&utm_campaign=pricing_page&cta_id=pricing_nav_start_pro&cta_placement=nav&plan_id=pro&landing_path=%2Fpricing" data-pricing-cta data-cta-id="pricing_nav_start_pro" data-cta-placement="nav" data-tier="pro" data-plan-id="pro" data-billing-cycle="monthly" data-price="19">Start Pro</a>
263
+ </div>
264
+ </div>
265
+ </nav>
266
+
267
+ <section class="pricing-hero">
268
+ <div class="container">
269
+ <h1>Stop paying for the same AI mistake twice.</h1>
270
+ <p class="lede">One self-serve paid path for solo operators. Teams start with workflow scope so shared enforcement is mapped before checkout.</p>
271
+ </div>
272
+ </section>
273
+
274
+ <section class="container">
275
+ <div class="pricing-grid">
276
+
277
+ <div class="price-card">
278
+ <div class="tier" style="color:var(--cyan);">Free</div>
279
+ <div class="price">$0</div>
280
+ <div class="price-sub">Catch repeated mistakes daily. Forever free for solo devs.</div>
281
+ <ul>
282
+ <li>2 feedback captures/day (10 total) — enough to see the value</li>
283
+ <li>Up to 3 active prevention rules</li>
284
+ <li>All MCP integrations (Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode)</li>
285
+ <li>PreToolUse hook flags and logs risky calls — hard-blocks the catastrophic classes (secret exfil, rm -rf, supply-chain) by default; full hard enforcement in strict mode</li>
286
+ <li>Runs 100% local — no account, no signup, no data leaves your machine</li>
287
+ </ul>
288
+ <a class="btn-install" href="/go/install?utm_source=pricing&utm_medium=free_card&cta_id=pricing_install_free&cta_placement=free_card" data-pricing-cta data-cta-id="pricing_install_free" data-cta-placement="free_card" data-tier="free" data-plan-id="free" data-price="0" onclick="try{posthog.capture('pricing_cta_click',{cta:'install_free',tier:'free',placement:'pricing_page'})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'install_free',tier:'free'}})}catch(_){}">Install free</a>
289
+ </div>
290
+
291
+ <div class="price-card highlight" id="pro">
292
+ <div class="tier">Pro</div>
293
+ <div class="price">$19<span>/mo</span></div>
294
+ <div class="price-sub">
295
+ <strong>Don't buy a tool — buy proof + compatibility insurance.</strong> The free CLI runs your gates locally. Pro removes the solo caps and adds the personal dashboard, recall, exports, and active adapter maintenance to stay compatible with weekly breaking updates in Claude Code, Cursor, and Cline. Shared hosted lesson databases are Enterprise.
296
+ </div>
297
+ <ul>
298
+ <li><strong>Personal lesson recall</strong> — search and reuse your own corrections across sessions</li>
299
+ <li><strong>Managed adapter matrix</strong> — we track runtime changes in Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode so you don't</li>
300
+ <li><strong>Personal dashboard</strong> — see every flagged and blocked action and every rule that fired</li>
301
+ <li><strong>Unlimited prevention rules</strong> — free caps at 3 auto-promoted rules</li>
302
+ <li><strong>DPO + HuggingFace export</strong> — training data from your real corrections</li>
303
+ <li><strong>Auto-connect</strong> — new agent surfaces appear automatically after setup</li>
304
+ <li>7-day refund window. Cancel anytime.</li>
305
+ </ul>
306
+ <a class="btn-pro" href="/checkout/pro?confirm=1&utm_source=pricing&utm_medium=hero_card&utm_campaign=pricing_page&cta_id=pricing_pro&cta_placement=pricing&plan_id=pro&billing_cycle=monthly&landing_path=%2Fpricing" data-pricing-cta data-cta-id="pricing_pro" data-cta-placement="pricing" data-tier="pro" data-plan-id="pro" data-billing-cycle="monthly" data-price="19" onclick="try{posthog.capture('pricing_cta_click',{cta:'start_pro',tier:'pro',placement:'pricing_page',price:19})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'start_pro',tier:'pro'}})}catch(_){}">Start Pro — $19/mo</a>
307
+ <p class="btn-sub">or <a href="/checkout/pro?confirm=1&utm_source=pricing&utm_medium=hero_card_annual&utm_campaign=pricing_page&cta_id=pricing_pro_annual&cta_placement=pricing&plan_id=pro&billing_cycle=annual&landing_path=%2Fpricing" data-pricing-cta data-cta-id="pricing_pro_annual" data-cta-placement="pricing" data-tier="pro" data-plan-id="pro" data-billing-cycle="annual" data-price="149" onclick="try{posthog.capture('pricing_cta_click',{cta:'start_pro_annual',tier:'pro',placement:'pricing_page',price:149})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'start_pro_annual',tier:'pro'}})}catch(_){}" style="color:var(--cyan);text-decoration:none;font-weight:600;">$149/year (save 35%) →</a></p>
308
+ </div>
309
+
310
+ <div class="price-card enterprise-card" id="enterprise">
311
+ <div class="tier">Enterprise</div>
312
+ <div class="price">Custom<span> / scoped after intake</span></div>
313
+ <div class="price-sub">Shared enforcement for the whole team and regulated workflows. One engineer's save protects every agent.</div>
314
+ <ul>
315
+ <li>Everything in Pro, for every developer and agent</li>
316
+ <li><strong>Shared lesson database</strong> — one engineer's fix protects every agent on the team</li>
317
+ <li><strong>Org dashboard</strong> — visibility across all agent surfaces and developers</li>
318
+ <li><strong>Dialogflow CX fulfillment guard</strong> — put ThumbGate's pre-action gate in front of your Dialogflow CX webhook fulfillment, in your own GCP tenant, so risky or repeat turns are blocked before they touch a DB, CRM, or billing system (white-glove design-partner pilot)</li>
319
+ <li><strong>Vertex AI / VPC gating</strong> — route agent checks through Gemini in your own Google Cloud project (<code>npx thumbgate setup-vertex</code>)</li>
320
+ <li><strong>Regulatory gate templates</strong> — legal intake, financial compliance, healthcare</li>
321
+ <li>Custom policy layers, compliance audit export, approval boundaries, SSO, and dedicated onboarding with SLA</li>
322
+ <li>Rollout starts only after workflow and proof review are explicit</li>
323
+ </ul>
324
+ <a class="btn-team" href="/?utm_source=pricing&utm_medium=enterprise_card&utm_campaign=enterprise_intake&cta_id=pricing_enterprise_intake&cta_placement=pricing&plan_id=enterprise#workflow-sprint-intake" data-pricing-cta data-cta-id="pricing_enterprise_intake" data-cta-placement="pricing" data-tier="enterprise" data-plan-id="enterprise" data-price="0" onclick="try{posthog.capture('pricing_cta_click',{cta:'enterprise_intake',tier:'enterprise',placement:'pricing_page',price:0})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'enterprise_intake',tier:'enterprise'}})}catch(_){}">Talk to us</a>
325
+ <p class="btn-sub">Custom pricing, scoped through intake so the workflow is explicit before checkout.</p>
326
+ </div>
327
+
328
+ </div>
329
+
330
+ <div style="text-align:center;margin:32px 0;color:var(--text-muted);font-size:14px;">
331
+ Need founder help? Do not buy a blind diagnostic from a pricing table.
332
+ <a href="/?utm_source=pricing&utm_medium=scope_first&utm_campaign=enterprise_intake&cta_id=pricing_scope_first&cta_placement=pricing_note&plan_id=enterprise#workflow-sprint-intake" data-pricing-cta data-cta-id="pricing_scope_first" data-cta-placement="pricing_note" data-tier="enterprise" data-plan-id="enterprise" data-price="0" style="color:var(--cyan);text-decoration:none;font-weight:600;" onclick="try{posthog.capture('pricing_cta_click',{cta:'scope_first',tier:'enterprise',price:0})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'scope_first',tier:'enterprise'}})}catch(_){}">Send the workflow first</a> — then we scope the smallest paid rollout that can prove one repeated failure is blocked.
333
+ </div>
334
+ </section>
335
+
336
+ <section class="faq">
337
+ <div class="container">
338
+ <h2>Questions</h2>
339
+ <div class="faq-list">
340
+ <div class="faq-item">
341
+ <div class="faq-q">What does Pro add over the free CLI?</div>
342
+ <div class="faq-a">Free gives you 2 captures/day and 3 active rules, running on your machine. Pro removes solo caps and adds personal recall, dashboard proof, managed adapters, and DPO export. Enterprise adds shared hosted lessons and org visibility.</div>
343
+ </div>
344
+ <div class="faq-item">
345
+ <div class="faq-q">Why not just use an enterprise AI control plane?</div>
346
+ <div class="faq-a">Enterprise control planes govern agents from a server-side gateway, sold to platform teams on a Fortune-500 timeline. ThumbGate runs local-first, in the PreToolUse hook on your machine, and ships enforcement for the coding agents developers actually use today — Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode — with an <code>npm install</code> and minutes to value, not a procurement cycle.</div>
347
+ </div>
348
+ <div class="faq-item">
349
+ <div class="faq-q">Does ThumbGate send my code to the cloud?</div>
350
+ <div class="faq-a">No. The CLI is local-first and no source code leaves your machine. Pro adds personal proof and exports; Enterprise adds shared hosted lessons and org dashboards.</div>
351
+ </div>
352
+ <div class="faq-item">
353
+ <div class="faq-q">When should I pick Enterprise over Pro?</div>
354
+ <div class="faq-a">When one engineer's correction should protect the whole team. Enterprise shares the lesson database across the org so a fix in one repo prevents the same mistake in every repo.</div>
355
+ </div>
356
+ <div class="faq-item">
357
+ <div class="faq-q">Can I cancel anytime?</div>
358
+ <div class="faq-a">Yes. Pro and Enterprise are month-to-month with a 7-day refund window on the first charge. Cancel from the billing portal and your subscription ends at the period close.</div>
359
+ </div>
360
+ <div class="faq-item">
361
+ <div class="faq-q">What happens if I stop paying?</div>
362
+ <div class="faq-a">You keep the free CLI, capped at 3 active rules and 2 captures/day. Existing rules and captures stay on your machine. You lose the personal dashboard, managed adapters, exports, and higher limits. Shared hosted lessons and org dashboards are Enterprise.</div>
363
+ </div>
364
+ </div>
365
+ </div>
366
+ </section>
367
+
368
+ <footer>
369
+ <div class="container">
370
+ <div class="footer-links">
371
+ <a href="/">Home</a>
372
+ <a href="/guide">Guide</a>
373
+ <a href="/support">Support</a>
374
+ <a href="/privacy">Privacy</a>
375
+ <a href="/terms">Terms</a>
376
+ </div>
377
+ <span class="footer-copy">One source of truth for ThumbGate pricing. Numbers here override anything stale elsewhere.</span>
378
+ </div>
379
+ </footer>
380
+
381
+ <script>
382
+ document.querySelectorAll('.faq-q').forEach(function(q) {
383
+ q.addEventListener('click', function() {
384
+ this.parentElement.classList.toggle('open');
385
+ });
386
+ });
387
+ </script>
388
+ <script>
389
+ window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) };
390
+ </script>
391
+ </body>
392
+ </html>
package/public/pro.html CHANGED
@@ -842,7 +842,7 @@ __GA_BOOTSTRAP__
842
842
  <div class="container">
843
843
  <div class="section-label">Why operators pay</div>
844
844
  <h2 class="section-title">Pro is not "more memory." It is a tighter operating loop around one operator's real failures.</h2>
845
- <p class="section-intro">The paid story is simple: free helps you install and block repeated mistakes locally. Pro helps you debug those blocks faster, export the learning, and show proof when a workflow owner asks what changed.</p>
845
+ <p class="section-intro">The paid story is simple: free helps you install and catch repeated mistakes locally. Pro helps you debug those blocks faster, export the learning, and show proof when a workflow owner asks what changed.</p>
846
846
  <div class="grid-3">
847
847
  <div class="feature-card">
848
848
  <h3>Debug the exact block in minutes</h3>
@@ -880,7 +880,7 @@ __GA_BOOTSTRAP__
880
880
  <div class="split-card free">
881
881
  <div class="split-kicker">Stay on Free</div>
882
882
  <h3>The local install is still the right first step</h3>
883
- <p>If you only need local recall, Pre-Action Checks, MCP setup, and a way to stop repeated mistakes on one machine, keep the free install and move fast.</p>
883
+ <p>If you only need local recall, Pre-Action Checks, MCP setup, and a way to catch repeated mistakes on one machine, keep the free install and move fast.</p>
884
884
  <ul>
885
885
  <li>Local-first recall, lessons, and enforcement.</li>
886
886
  <li>No cloud account required.</li>