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.
- package/.claude-plugin/marketplace.json +85 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/README.md +33 -5
- package/adapters/chatgpt/openapi.yaml +1707 -0
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/codex/config.toml +2 -2
- package/adapters/mcp/server-stdio.js +1 -1
- package/adapters/opencode/opencode.json +1 -1
- package/bin/cli.js +63 -54
- package/bin/postinstall.js +23 -14
- package/config/post-deploy-marketing-pages.json +19 -0
- package/config/tessl-tiles.json +1 -3
- package/package.json +99 -229
- package/public/guide.html +0 -4
- package/public/index.html +28 -49
- package/public/learn.html +0 -8
- package/public/numbers.html +2 -2
- package/scripts/agent-readiness.js +0 -147
- package/scripts/bot-detection.js +61 -3
- package/scripts/cli-feedback.js +4 -14
- package/scripts/cli-schema.js +7 -0
- package/scripts/durability/step.js +3 -3
- package/scripts/feedback-loop.js +10 -32
- package/scripts/gates-engine.js +72 -1
- package/scripts/hook-runtime.js +2 -2
- package/scripts/license.js +10 -9
- package/scripts/llm-client.js +44 -260
- package/scripts/mcp-config.js +7 -1
- package/scripts/published-cli.js +0 -8
- package/scripts/seo-gsd.js +0 -5
- package/src/api/server.js +111 -35
- package/.claude/commands/dashboard.md +0 -15
- package/.claude/commands/thumbgate-blocked.md +0 -27
- package/.claude/commands/thumbgate-dashboard.md +0 -15
- package/.claude/commands/thumbgate-doctor.md +0 -30
- package/.claude/commands/thumbgate-guard.md +0 -36
- package/.claude/commands/thumbgate-protect.md +0 -30
- package/.claude/commands/thumbgate-rules.md +0 -30
- package/adapters/gcp/dfcx-webhook-gate.js +0 -295
- package/adapters/letta/README.md +0 -41
- package/adapters/letta/thumbgate-letta-adapter.js +0 -133
- package/adapters/policy-engine/ethicore-guardian-client.js +0 -68
- package/adapters/policy-engine/thumbgate-policy-engine-adapter.js +0 -260
- package/bench/observability-eval-suite.json +0 -26
- package/bin/dashboard-cli.js +0 -7
- package/commands/dashboard.md +0 -15
- package/commands/thumbgate-dashboard.md +0 -15
- package/config/builtin-lessons.json +0 -23
- package/public/about.html +0 -162
- package/public/agent-manager.html +0 -179
- package/public/agents-cost-savings.html +0 -153
- package/public/ai-malpractice-prevention.html +0 -818
- package/public/assets/brand/github-social-preview.png +0 -0
- package/public/assets/brand/thumbgate-icon-512.png +0 -0
- package/public/assets/brand/thumbgate-icon-pro-512.png +0 -0
- package/public/assets/brand/thumbgate-icon-team-512.png +0 -0
- package/public/assets/brand/thumbgate-logo-1200x360.png +0 -0
- package/public/assets/brand/thumbgate-logo-transparent.svg +0 -22
- package/public/assets/brand/thumbgate-mark-inline-v3.svg +0 -19
- package/public/assets/brand/thumbgate-mark-pro.svg +0 -23
- package/public/assets/brand/thumbgate-mark-team.svg +0 -26
- package/public/assets/brand/thumbgate-mark.svg +0 -21
- package/public/assets/brand/thumbgate-wordmark.svg +0 -20
- package/public/assets/claude-thumbgate-statusbar.svg +0 -8
- package/public/assets/codex-thumbgate-statusbar-test.svg +0 -9
- package/public/assets/legal-intake-control-flow.svg +0 -66
- package/public/brand/thumbgate-mark.svg +0 -19
- package/public/brand/thumbgate-og.svg +0 -16
- package/public/chatgpt-app.html +0 -330
- package/public/codex-enterprise.html +0 -123
- package/public/js/buyer-intent.js +0 -672
- package/public/pricing.html +0 -399
- package/scripts/action-receipts.js +0 -324
- package/scripts/activation-quickstart.js +0 -187
- package/scripts/agent-operations-planner.js +0 -621
- package/scripts/ai-component-inventory.js +0 -367
- package/scripts/async-eval-observability.js +0 -236
- package/scripts/audit.js +0 -65
- package/scripts/aws-blocks-guardrails.js +0 -228
- package/scripts/bot-detector.js +0 -50
- package/scripts/classifier-routing.js +0 -130
- package/scripts/dashboard-chat.js +0 -332
- package/scripts/feedback-aggregate.js +0 -281
- package/scripts/feedback-sanitizer.js +0 -105
- package/scripts/hob-pack.js +0 -591
- package/scripts/hook-stop-anti-claim.js +0 -301
- package/scripts/install-shim.js +0 -87
- package/scripts/mcp-oauth.js +0 -293
- package/scripts/noop-detect.js +0 -285
- package/scripts/omlx-smoke.js +0 -192
- package/scripts/parallel-workflow-orchestrator.js +0 -293
- package/scripts/plan-gate.js +0 -243
- package/scripts/plausible-domain-config.js +0 -99
- package/scripts/qa-scenario-planner.js +0 -136
- package/scripts/repeat-metric.js +0 -137
- package/scripts/secret-fixture-tokens.js +0 -61
- package/scripts/secret-redaction.js +0 -166
- package/scripts/self-harness-optimizer.js +0 -141
- package/scripts/self-healing-check.js +0 -193
- package/scripts/silent-failure-cluster.js +0 -531
- package/scripts/statusline-cache-read.js +0 -57
- package/scripts/sync-telemetry-from-prod.js +0 -374
- package/scripts/tool-contract-validator.js +0 -76
- package/scripts/trajectory-scorer.js +0 -63
- package/scripts/verify-marketing-pages-deployed.js +0 -195
- 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.
|
|
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.
|
|
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 \"
|
|
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 \"
|
|
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.
|
|
234
|
+
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.27.15' };
|
|
235
235
|
const COMMERCE_CATEGORIES = [
|
|
236
236
|
'product_recommendation',
|
|
237
237
|
'brand_compliance',
|
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
|
|
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
|
|
107
|
-
|
|
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
|
|
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'
|
|
2776
|
-
whatWorked: signal === 'up'
|
|
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] [--
|
|
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');
|
package/bin/postinstall.js
CHANGED
|
@@ -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
|
|
26
|
+
│ ThumbGate installed. │
|
|
30
27
|
│ │
|
|
31
|
-
│
|
|
32
|
-
│
|
|
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
|
-
│
|
|
35
|
-
│
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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
|
}
|
package/config/tessl-tiles.json
CHANGED
|
@@ -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
|
{
|