thumbgate 1.27.17 → 1.27.19

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 (107) hide show
  1. package/.claude-plugin/marketplace.json +85 -0
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.well-known/mcp/server-card.json +1 -1
  4. package/README.md +33 -5
  5. package/adapters/chatgpt/openapi.yaml +1707 -0
  6. package/adapters/claude/.mcp.json +2 -2
  7. package/adapters/codex/config.toml +2 -2
  8. package/adapters/mcp/server-stdio.js +1 -1
  9. package/adapters/opencode/opencode.json +1 -1
  10. package/bin/cli.js +63 -54
  11. package/bin/postinstall.js +23 -14
  12. package/config/post-deploy-marketing-pages.json +19 -0
  13. package/config/tessl-tiles.json +1 -3
  14. package/package.json +99 -229
  15. package/public/guide.html +0 -4
  16. package/public/index.html +28 -49
  17. package/public/learn.html +0 -8
  18. package/public/numbers.html +2 -2
  19. package/scripts/agent-readiness.js +0 -147
  20. package/scripts/bot-detection.js +61 -3
  21. package/scripts/cli-feedback.js +4 -14
  22. package/scripts/cli-schema.js +7 -0
  23. package/scripts/durability/step.js +3 -3
  24. package/scripts/feedback-loop.js +10 -32
  25. package/scripts/gates-engine.js +72 -1
  26. package/scripts/hook-runtime.js +2 -2
  27. package/scripts/license.js +10 -9
  28. package/scripts/llm-client.js +44 -260
  29. package/scripts/mcp-config.js +7 -1
  30. package/scripts/published-cli.js +0 -8
  31. package/scripts/seo-gsd.js +0 -5
  32. package/src/api/server.js +111 -35
  33. package/.claude/commands/dashboard.md +0 -15
  34. package/.claude/commands/thumbgate-blocked.md +0 -27
  35. package/.claude/commands/thumbgate-dashboard.md +0 -15
  36. package/.claude/commands/thumbgate-doctor.md +0 -30
  37. package/.claude/commands/thumbgate-guard.md +0 -36
  38. package/.claude/commands/thumbgate-protect.md +0 -30
  39. package/.claude/commands/thumbgate-rules.md +0 -30
  40. package/adapters/gcp/dfcx-webhook-gate.js +0 -295
  41. package/adapters/letta/README.md +0 -41
  42. package/adapters/letta/thumbgate-letta-adapter.js +0 -133
  43. package/adapters/policy-engine/ethicore-guardian-client.js +0 -68
  44. package/adapters/policy-engine/thumbgate-policy-engine-adapter.js +0 -260
  45. package/bench/observability-eval-suite.json +0 -26
  46. package/bin/dashboard-cli.js +0 -7
  47. package/commands/dashboard.md +0 -15
  48. package/commands/thumbgate-dashboard.md +0 -15
  49. package/config/builtin-lessons.json +0 -23
  50. package/public/about.html +0 -162
  51. package/public/agent-manager.html +0 -179
  52. package/public/agents-cost-savings.html +0 -153
  53. package/public/ai-malpractice-prevention.html +0 -818
  54. package/public/assets/brand/github-social-preview.png +0 -0
  55. package/public/assets/brand/thumbgate-icon-512.png +0 -0
  56. package/public/assets/brand/thumbgate-icon-pro-512.png +0 -0
  57. package/public/assets/brand/thumbgate-icon-team-512.png +0 -0
  58. package/public/assets/brand/thumbgate-logo-1200x360.png +0 -0
  59. package/public/assets/brand/thumbgate-logo-transparent.svg +0 -22
  60. package/public/assets/brand/thumbgate-mark-inline-v3.svg +0 -19
  61. package/public/assets/brand/thumbgate-mark-pro.svg +0 -23
  62. package/public/assets/brand/thumbgate-mark-team.svg +0 -26
  63. package/public/assets/brand/thumbgate-mark.svg +0 -21
  64. package/public/assets/brand/thumbgate-wordmark.svg +0 -20
  65. package/public/assets/claude-thumbgate-statusbar.svg +0 -8
  66. package/public/assets/codex-thumbgate-statusbar-test.svg +0 -9
  67. package/public/assets/legal-intake-control-flow.svg +0 -66
  68. package/public/brand/thumbgate-mark.svg +0 -19
  69. package/public/brand/thumbgate-og.svg +0 -16
  70. package/public/chatgpt-app.html +0 -330
  71. package/public/codex-enterprise.html +0 -123
  72. package/public/js/buyer-intent.js +0 -672
  73. package/public/pricing.html +0 -399
  74. package/scripts/action-receipts.js +0 -324
  75. package/scripts/activation-quickstart.js +0 -187
  76. package/scripts/agent-operations-planner.js +0 -621
  77. package/scripts/ai-component-inventory.js +0 -367
  78. package/scripts/async-eval-observability.js +0 -236
  79. package/scripts/audit.js +0 -65
  80. package/scripts/aws-blocks-guardrails.js +0 -228
  81. package/scripts/bot-detector.js +0 -50
  82. package/scripts/classifier-routing.js +0 -130
  83. package/scripts/dashboard-chat.js +0 -332
  84. package/scripts/feedback-aggregate.js +0 -281
  85. package/scripts/feedback-sanitizer.js +0 -105
  86. package/scripts/hob-pack.js +0 -591
  87. package/scripts/hook-stop-anti-claim.js +0 -301
  88. package/scripts/install-shim.js +0 -87
  89. package/scripts/mcp-oauth.js +0 -293
  90. package/scripts/noop-detect.js +0 -285
  91. package/scripts/omlx-smoke.js +0 -192
  92. package/scripts/parallel-workflow-orchestrator.js +0 -293
  93. package/scripts/plan-gate.js +0 -243
  94. package/scripts/plausible-domain-config.js +0 -99
  95. package/scripts/qa-scenario-planner.js +0 -136
  96. package/scripts/repeat-metric.js +0 -137
  97. package/scripts/secret-fixture-tokens.js +0 -61
  98. package/scripts/secret-redaction.js +0 -166
  99. package/scripts/self-harness-optimizer.js +0 -141
  100. package/scripts/self-healing-check.js +0 -193
  101. package/scripts/silent-failure-cluster.js +0 -531
  102. package/scripts/statusline-cache-read.js +0 -57
  103. package/scripts/sync-telemetry-from-prod.js +0 -374
  104. package/scripts/tool-contract-validator.js +0 -76
  105. package/scripts/trajectory-scorer.js +0 -63
  106. package/scripts/verify-marketing-pages-deployed.js +0 -195
  107. package/scripts/visitor-journey.js +0 -172
@@ -2,13 +2,13 @@
2
2
  "mcpServers": {
3
3
  "thumbgate": {
4
4
  "command": "npx",
5
- "args": ["--yes", "--package", "thumbgate@1.27.17", "thumbgate", "serve"]
5
+ "args": ["--yes", "--package", "thumbgate@1.27.15", "thumbgate", "serve"]
6
6
  }
7
7
  },
8
8
  "hooks": {
9
9
  "preToolUse": {
10
10
  "command": "npx",
11
- "args": ["--yes", "--package", "thumbgate@1.27.17", "thumbgate", "gate-check"]
11
+ "args": ["--yes", "--package", "thumbgate@1.27.15", "thumbgate", "gate-check"]
12
12
  }
13
13
  }
14
14
  }
@@ -3,9 +3,9 @@
3
3
  # ~/.codex/config.json with the ThumbGate hooks and status line.
4
4
  [mcp_servers.thumbgate]
5
5
  command = "sh"
6
- args = ["-lc", "mkdir -p \"$HOME/.thumbgate/runtime\" && npm \"install\" \"--prefix\" \"$HOME/.thumbgate/runtime\" \"--no-save\" \"--omit=dev\" \"thumbgate@latest\" >/dev/null 2>&1 && exec \"$HOME/.thumbgate/runtime/node_modules/.bin/thumbgate\" \"serve\""]
6
+ args = ["-lc", "[ -x \"$HOME/.thumbgate/runtime/node_modules/.bin/thumbgate\" ] && exec \"$HOME/.thumbgate/runtime/node_modules/.bin/thumbgate\" \"serve\" || mkdir -p \"$HOME/.thumbgate/runtime\" && exec npm \"exec\" \"--prefix\" \"$HOME/.thumbgate/runtime\" \"--yes\" \"--package\" \"thumbgate@latest\" \"--\" \"thumbgate\" \"serve\""]
7
7
 
8
8
  # Hard PreToolUse hook for Codex
9
9
  [hooks.pre_tool_use]
10
10
  command = "sh"
11
- args = ["-lc", "mkdir -p \"$HOME/.thumbgate/runtime\" && npm \"install\" \"--prefix\" \"$HOME/.thumbgate/runtime\" \"--no-save\" \"--omit=dev\" \"thumbgate@latest\" >/dev/null 2>&1 && exec \"$HOME/.thumbgate/runtime/node_modules/.bin/thumbgate\" \"gate-check\""]
11
+ args = ["-lc", "[ -x \"$HOME/.thumbgate/runtime/node_modules/.bin/thumbgate\" ] && exec \"$HOME/.thumbgate/runtime/node_modules/.bin/thumbgate\" \"gate-check\" || mkdir -p \"$HOME/.thumbgate/runtime\" && exec npm \"exec\" \"--prefix\" \"$HOME/.thumbgate/runtime\" \"--yes\" \"--package\" \"thumbgate@latest\" \"--\" \"thumbgate\" \"gate-check\""]
@@ -231,7 +231,7 @@ const {
231
231
  finalizeSession: finalizeFeedbackSession,
232
232
  } = require('../../scripts/feedback-session');
233
233
 
234
- const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.27.17' };
234
+ const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.27.15' };
235
235
  const COMMERCE_CATEGORIES = [
236
236
  'product_recommendation',
237
237
  'brand_compliance',
@@ -7,7 +7,7 @@
7
7
  "npx",
8
8
  "--yes",
9
9
  "--package",
10
- "thumbgate@1.27.17",
10
+ "thumbgate@1.27.15",
11
11
  "thumbgate",
12
12
  "serve"
13
13
  ],
package/bin/cli.js CHANGED
@@ -23,6 +23,7 @@
23
23
  * npx thumbgate background-governance # background-agent run report + risk check
24
24
  * npx thumbgate cfo # local operational billing summary
25
25
  * npx thumbgate pro # solo dashboard + exports side lane
26
+ * npx thumbgate diagnostic # team workflow diagnostic intake + checkout path
26
27
  * npx thumbgate audit <file> # audit an agent transcript for repeat-mistake token waste
27
28
  */
28
29
 
@@ -33,7 +34,7 @@ const os = require('os');
33
34
  const path = require('path');
34
35
  const crypto = require('crypto');
35
36
  const http = require('http');
36
- const { execSync, execFileSync, execFile, spawn, spawnSync } = require('child_process');
37
+ const { execSync, execFileSync, execFile, spawn } = require('child_process');
37
38
  const {
38
39
  codexAutoUpdateCliEntry,
39
40
  codexAutoUpdateMcpEntry,
@@ -90,6 +91,32 @@ function pricingUrlFor(source, content) {
90
91
  }
91
92
  }
92
93
 
94
+ function diagnosticUrlFor(source, content) {
95
+ try {
96
+ const url = new URL('/diagnostic', PRO_URL);
97
+ url.searchParams.set('utm_source', source || 'cli');
98
+ url.searchParams.set('utm_medium', 'cli');
99
+ url.searchParams.set('utm_campaign', 'workflow_hardening_diagnostic');
100
+ if (content) url.searchParams.set('utm_content', content);
101
+ return url.toString();
102
+ } catch (_) {
103
+ return `${PRO_URL}/diagnostic`;
104
+ }
105
+ }
106
+
107
+ function diagnosticCheckoutUrlFor(source, content) {
108
+ try {
109
+ const url = new URL('/go/diagnostic', PRO_URL);
110
+ url.searchParams.set('utm_source', source || 'cli');
111
+ url.searchParams.set('utm_medium', 'cli');
112
+ url.searchParams.set('utm_campaign', 'workflow_hardening_diagnostic');
113
+ if (content) url.searchParams.set('utm_content', content);
114
+ return url.toString();
115
+ } catch (_) {
116
+ return `${PRO_URL}/go/diagnostic`;
117
+ }
118
+ }
119
+
93
120
  function trialDeadlineLabel(now = new Date()) {
94
121
  const deadline = new Date(now.getTime() + (TRIAL_DAYS * 24 * 60 * 60 * 1000));
95
122
  return deadline.toISOString().slice(0, 10);
@@ -102,15 +129,36 @@ function upgradeNudge() {
102
129
  if (isProTier()) return;
103
130
  } catch (_) { return; }
104
131
  const pricingUrl = pricingUrlFor('cli_upgrade_nudge', COMMAND || 'general');
132
+ const diagnosticUrl = diagnosticUrlFor('cli_upgrade_nudge', COMMAND || 'general');
105
133
  process.stderr.write(
106
- '\n Team rollout: start with the Workflow Hardening Sprint\n' +
107
- ' https://thumbgate.ai/#workflow-sprint-intake\n' +
134
+ '\n Team rollout: start with the $499 Workflow Hardening Diagnostic\n' +
135
+ ` ${diagnosticUrl}\n` +
108
136
  `\n Solo side lane: Pro — ${PRO_PRICE_LABEL}\n` +
109
137
  ' Keeps lessons, rules, and the dashboard synced across machines and agent runtimes.\n' +
110
138
  ` ${pricingUrl}\n\n`
111
139
  );
112
140
  }
113
141
 
142
+ function diagnostic() {
143
+ const intakeUrl = diagnosticUrlFor('cli_diagnostic', COMMAND || 'diagnostic');
144
+ const checkoutUrl = diagnosticCheckoutUrlFor('cli_diagnostic', COMMAND || 'diagnostic');
145
+ console.log('');
146
+ console.log(' ThumbGate Workflow Hardening Diagnostic');
147
+ console.log(' ---------------------------------------');
148
+ console.log(' Use this when one repeated AI-agent workflow failure is already costing');
149
+ console.log(' review time, release confidence, customer trust, or money.');
150
+ console.log('');
151
+ console.log(' Best fit: one workflow, one repeated failure, one owner who can review proof.');
152
+ console.log(' Output: failure taxonomy, block/warn/human-review split, and proof checklist.');
153
+ console.log('');
154
+ console.log(' Start with intake:');
155
+ console.log(` ${intakeUrl}`);
156
+ console.log('');
157
+ console.log(' Ready to pay now:');
158
+ console.log(` ${checkoutUrl}`);
159
+ console.log('');
160
+ }
161
+
114
162
  function appendLocalTelemetry(payload) {
115
163
  try {
116
164
  const { getFeedbackPaths } = require(path.join(PKG_ROOT, 'scripts', 'feedback-loop'));
@@ -1328,45 +1376,7 @@ function feedbackSelfTest() {
1328
1376
  const memoryId = result.memoryRecord && result.memoryRecord.id;
1329
1377
  const feedbackStored = Boolean(feedbackId && feedbackRows.some((row) => row.id === feedbackId));
1330
1378
  const memoryStored = Boolean(memoryId && memoryRows.some((row) => row.id === memoryId));
1331
-
1332
- let hookProbe = null;
1333
- if (args.hook) {
1334
- const hookPrompt = args['hook-prompt'] || (
1335
- normalized === 'down'
1336
- ? `thumbs down ${context}`
1337
- : `thumbs up ${context}`
1338
- );
1339
- const hookResult = spawnSync(process.execPath, [__filename, 'hook-auto-capture'], {
1340
- encoding: 'utf8',
1341
- timeout: 10000,
1342
- env: {
1343
- ...process.env,
1344
- THUMBGATE_FEEDBACK_DIR: paths.FEEDBACK_DIR,
1345
- THUMBGATE_NO_NUDGE: '1',
1346
- CLAUDE_USER_PROMPT: hookPrompt,
1347
- },
1348
- });
1349
- const hookFeedbackRows = readJsonlEntries(paths.FEEDBACK_LOG_PATH);
1350
- const hookMemoryRows = readJsonlEntries(paths.MEMORY_LOG_PATH);
1351
- const hookLatestFeedback = hookFeedbackRows[hookFeedbackRows.length - 1] || null;
1352
- const hookLatestMemory = hookMemoryRows[hookMemoryRows.length - 1] || null;
1353
- hookProbe = {
1354
- ok: hookResult.status === 0
1355
- && Boolean(hookLatestFeedback)
1356
- && hookLatestFeedback.submittedContext === hookPrompt
1357
- && hookLatestFeedback.actionType !== 'no-action'
1358
- && Boolean(hookLatestMemory),
1359
- prompt: hookPrompt,
1360
- exitCode: hookResult.status,
1361
- feedbackId: hookLatestFeedback ? hookLatestFeedback.id : null,
1362
- memoryId: hookLatestMemory ? hookLatestMemory.id : null,
1363
- actionType: hookLatestFeedback ? hookLatestFeedback.actionType : null,
1364
- stdoutPreview: String(hookResult.stdout || '').slice(0, 500),
1365
- stderrPreview: String(hookResult.stderr || '').slice(0, 500),
1366
- };
1367
- }
1368
-
1369
- const ok = Boolean(result.accepted && feedbackStored && memoryStored && (!hookProbe || hookProbe.ok));
1379
+ const ok = Boolean(result.accepted && feedbackStored && memoryStored);
1370
1380
 
1371
1381
  const payload = {
1372
1382
  ok,
@@ -1379,7 +1389,6 @@ function feedbackSelfTest() {
1379
1389
  memoryStored,
1380
1390
  isolated,
1381
1391
  feedbackDir: paths.FEEDBACK_DIR,
1382
- hookProbe,
1383
1392
  nextDogfoodCommand: `npx thumbgate capture --feedback=${normalized} --context=${shellSingleQuote(context)}`,
1384
1393
  };
1385
1394
 
@@ -1392,9 +1401,6 @@ function feedbackSelfTest() {
1392
1401
  console.log(` Stored lesson: ${memoryId}`);
1393
1402
  console.log(` Storage : ${paths.FEEDBACK_DIR}`);
1394
1403
  console.log(` Mode : ${isolated ? 'isolated test store' : 'active ThumbGate store'}`);
1395
- if (hookProbe) {
1396
- console.log(` Hook capture : PASS (${hookProbe.feedbackId}, ${hookProbe.memoryId})`);
1397
- }
1398
1404
  console.log('\nDogfood in chat with:');
1399
1405
  console.log(` thumbs ${normalized}: ${context}`);
1400
1406
  } else {
@@ -1403,9 +1409,6 @@ function feedbackSelfTest() {
1403
1409
  console.log(` Accepted : ${payload.accepted}`);
1404
1410
  console.log(` Feedback stored: ${feedbackStored}`);
1405
1411
  console.log(` Memory stored : ${memoryStored}`);
1406
- if (hookProbe) {
1407
- console.log(` Hook capture : ${hookProbe.ok ? 'true' : 'false'} (${hookProbe.actionType || 'no-action'})`);
1408
- }
1409
1412
  console.log(` Storage : ${paths.FEEDBACK_DIR}`);
1410
1413
  }
1411
1414
 
@@ -2736,7 +2739,7 @@ function hookAutoCapture() {
2736
2739
  || readStdinText().trim();
2737
2740
  const { evaluatePromptGuard } = require(path.join(PKG_ROOT, 'scripts', 'prompt-guard'));
2738
2741
  const { processInlineFeedback, formatCliOutput } = require(path.join(PKG_ROOT, 'scripts', 'cli-feedback'));
2739
- const { detectFeedbackSignal, isGenericFeedbackText } = require(path.join(PKG_ROOT, 'scripts', 'feedback-quality'));
2742
+ const { detectFeedbackSignal } = require(path.join(PKG_ROOT, 'scripts', 'feedback-quality'));
2740
2743
  const { loadOptionalModule } = require(path.join(PKG_ROOT, 'scripts', 'private-core-boundary'));
2741
2744
  const { recordConversationEntry, readRecentConversationWindow } = loadOptionalModule(
2742
2745
  path.join(PKG_ROOT, 'scripts', 'feedback-history-distiller'),
@@ -2764,7 +2767,6 @@ function hookAutoCapture() {
2764
2767
  }
2765
2768
 
2766
2769
  const signal = detected.signal;
2767
- const genericPrompt = isGenericFeedbackText(prompt, signal === 'down' ? 'negative' : 'positive');
2768
2770
  const conversationWindow = readRecentConversationWindow({ limit: 8 });
2769
2771
  const result = processInlineFeedback({
2770
2772
  signal,
@@ -2772,8 +2774,8 @@ function hookAutoCapture() {
2772
2774
  chatHistory: signal === 'down'
2773
2775
  ? conversationWindow.map((entry) => ({ role: entry.author === 'assistant' ? 'assistant' : 'user', content: entry.text || '' }))
2774
2776
  : undefined,
2775
- whatWentWrong: signal === 'down' && !genericPrompt ? prompt : undefined,
2776
- whatWorked: signal === 'up' && !genericPrompt ? prompt : undefined,
2777
+ whatWentWrong: signal === 'down' ? prompt : undefined,
2778
+ whatWorked: signal === 'up' ? prompt : undefined,
2777
2779
  });
2778
2780
  process.stdout.write(formatCliOutput(result) + '\n');
2779
2781
  }
@@ -3069,6 +3071,7 @@ function help() {
3069
3071
  console.log(' break-glass --reason="..." Short TTL recovery if gates over-fire');
3070
3072
  console.log(' brain [--write] Build the agent-readable context brain (lessons + rules + gates)');
3071
3073
  console.log(' pro ThumbGate Pro (dashboard, exports, sync)');
3074
+ console.log(' diagnostic $499 Workflow Hardening Diagnostic for one repeated team failure');
3072
3075
  console.log(' subscribe <email> Get the 5-min setup guide + weekly tips by email');
3073
3076
  console.log('');
3074
3077
  console.log('More:');
@@ -3208,11 +3211,12 @@ const _wantsHelp = _cliSubArgs.includes('--help') || _cliSubArgs.includes('-h');
3208
3211
  const SUBCOMMAND_HELP = {
3209
3212
  capture: 'Usage: npx thumbgate capture --feedback=up|down --context="..." [--what-worked="..."] [--what-went-wrong="..."] [--what-to-change="..."] [--tags=a,b]',
3210
3213
  feedback: 'Usage: npx thumbgate feedback --feedback=up|down --context="..." [--what-worked="..."] [--what-went-wrong="..."] [--what-to-change="..."] [--tags=a,b]',
3211
- 'feedback-self-test': 'Usage: npx thumbgate feedback-self-test [--json] [--persist] [--hook] [--feedback=up|down]\n\nCapture a synthetic thumbs signal and verify feedback-log + memory-log writes. Defaults to an isolated test store; use --hook to also prove UserPromptSubmit-style raw prompt auto-capture.',
3214
+ 'feedback-self-test': 'Usage: npx thumbgate feedback-self-test [--json] [--persist] [--feedback=up|down]\n\nCapture a synthetic thumbs signal and verify feedback-log + memory-log writes. Defaults to an isolated test store; use --persist to dogfood the active ThumbGate store.',
3212
3215
  dogfood: 'Usage: npx thumbgate dogfood [--json] [--persist] [--feedback=up|down]\n\nAlias for feedback-self-test.',
3213
3216
  stats: 'Usage: npx thumbgate stats\n\nShow gate enforcement statistics: blocked/warned counts, active gates, time saved.',
3214
3217
  trial: 'Usage: npx thumbgate trial\n\nShow Pro trial status, remaining days, and upgrade path.',
3215
3218
  pro: 'Usage: npx thumbgate pro [--activate <key>]\n\nLaunch the local Pro dashboard or activate a Pro license key.',
3219
+ diagnostic: 'Usage: npx thumbgate diagnostic\n\nShow the $499 Workflow Hardening Diagnostic intake and checkout paths for teams with one repeated AI-agent workflow failure.',
3216
3220
  subscribe: 'Usage: npx thumbgate subscribe <email>\n\nSubscribe to the 5-minute setup guide + trial reminders.',
3217
3221
  lessons: 'Usage: npx thumbgate lessons [--query="..."] [--limit=N]\n\nSearch the lesson database (Pro feature).',
3218
3222
  search: 'Usage: npx thumbgate search <query>\n\nSearch ThumbGate knowledge base (Pro feature).',
@@ -3885,6 +3889,11 @@ switch (COMMAND) {
3885
3889
  case 'pro':
3886
3890
  pro();
3887
3891
  break;
3892
+ case 'diagnostic':
3893
+ case 'workflow-diagnostic':
3894
+ case 'sprint-diagnostic':
3895
+ diagnostic();
3896
+ break;
3888
3897
  case 'activate':
3889
3898
  // Top-level alias: npx thumbgate activate <key>
3890
3899
  process.argv.splice(3, 0, '--activate');
@@ -15,32 +15,41 @@ if (isCI || isQuiet) process.exit(0);
15
15
  const {
16
16
  PRO_MONTHLY_PAYMENT_LINK,
17
17
  PRO_PRICE_LABEL,
18
- TEAM_PRICE_LABEL,
19
18
  } = require('../scripts/commercial-offer');
20
19
 
21
20
  // Tracked click-through path: /go/pro → /checkout/pro → Stripe.
22
- // This captures UTM attribution in our funnel before handing off to Stripe.
23
21
  const PRO_CTA_URL = 'https://thumbgate.ai/go/pro?utm_source=npm&utm_medium=postinstall&utm_campaign=first_dollar';
24
- const WORKFLOW_SPRINT_URL = 'https://thumbgate.ai/#workflow-sprint-intake';
25
22
  const DASHBOARD_URL = 'https://thumbgate.ai/dashboard?utm_source=npm&utm_medium=postinstall&utm_campaign=dashboard_nudge';
26
23
 
27
24
  process.stderr.write(`
28
25
  ╭─────────────────────────────────────────────────────╮
29
- │ ThumbGate installed — 7-day Pro trial is live.
26
+ │ ThumbGate installed.
30
27
  │ │
31
- Start now: npx thumbgate init
32
- Updates: npx thumbgate subscribe you@company.com
28
+ Every repeat-mistake your agent makes costs
29
+ tokens. ThumbGate blocks known-bad tool calls
30
+ │ BEFORE the model sees them — zero tokens spent │
31
+ │ on mistakes you've already corrected. │
33
32
  │ │
34
- Free after trial: 3 rules, 2 captures/day.
35
- Pro ($19/mo): unlimited everything.
33
+ Start free (local-only, never expires):
34
+ npx thumbgate init
35
+ │ npx thumbgate stats │
36
+ │ │
37
+ │ See your gates firing live: │
38
+ │ ${DASHBOARD_URL.slice(0, 47).padEnd(47, ' ')} │
36
39
  ╰─────────────────────────────────────────────────────╯
37
40
 
38
- Trial unlocks: unlimited rules, lesson search, DPO export,
39
- hosted dashboard. After 7 days, free tier limits apply.
40
- Subscribe for the 5-min setup guide + weekly tips:
41
- npx thumbgate subscribe you@company.com
41
+ Pro ${PRO_PRICE_LABEL}
42
+ Hosted lesson sync across all your machines.
43
+ Adapter matrix kept current for Claude Code,
44
+ Cursor, Codex, Gemini, Amp, Cline, OpenCode.
45
+ Org dashboard. DPO export. 24×7 ops.
46
+ Upgrade: ${PRO_CTA_URL}
47
+ Direct: ${PRO_MONTHLY_PAYMENT_LINK}
48
+
49
+ ⚡ LAUNCH PROMO: 50% off first 3 months with code THUMB50
50
+ One-click (discount applied): https://buy.stripe.com/eVqeVd62o0aO19v7mb3sI3g
51
+ Limited to first 50 customers. July 2026
42
52
 
43
- Dashboard: ${DASHBOARD_URL}
44
- Keep Pro: ${PRO_CTA_URL}
53
+ Or run: npx thumbgate pro
45
54
 
46
55
  `);
@@ -12,6 +12,20 @@
12
12
  "sentinel": "ThumbGate Pro",
13
13
  "description": "Pro landing page"
14
14
  },
15
+ {
16
+ "route": "/checkout/pro",
17
+ "sentinel": "Optional. Stripe can collect your email on the secure checkout page.",
18
+ "mustNotContain": [
19
+ "Required for your Stripe receipt and checkout recovery link."
20
+ ],
21
+ "userAgent": "curl/8.0.0",
22
+ "description": "Pro checkout interstitial must not require email before Stripe"
23
+ },
24
+ {
25
+ "route": "/diagnostic",
26
+ "sentinel": "Workflow Hardening Diagnostic",
27
+ "description": "Workflow Hardening Diagnostic intake page for high-intent warm traffic"
28
+ },
15
29
  {
16
30
  "route": "/dashboard",
17
31
  "sentinel": "ThumbGate Dashboard",
@@ -56,6 +70,11 @@
56
70
  "route": "/about",
57
71
  "sentinel": "Igor Ganapolsky",
58
72
  "description": "About page for GEO discoverability"
73
+ },
74
+ {
75
+ "route": "/leash-beta",
76
+ "sentinel": "Stop Runaway AI Agents From Freezing Your Machine",
77
+ "description": "Hermes Mobile founding beta / Leash Pro pricing landing"
59
78
  }
60
79
  ]
61
80
  }
@@ -2,9 +2,7 @@
2
2
  "version": 1,
3
3
  "defaultWorkspace": "thumbgate",
4
4
  "proofLinks": {
5
- "verificationEvidence": "https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/VERIFICATION_EVIDENCE.md",
6
- "compatibilityReport": "https://github.com/IgorGanapolsky/ThumbGate/blob/main/proof/compatibility/report.json",
7
- "automationReport": "https://github.com/IgorGanapolsky/ThumbGate/blob/main/proof/automation/report.json"
5
+ "verificationEvidence": "https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/VERIFICATION_EVIDENCE.md"
8
6
  },
9
7
  "tiles": [
10
8
  {