thumbgate 1.26.5 → 1.26.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/.well-known/mcp/server-card.json +1 -1
- package/README.md +28 -0
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/mcp/server-stdio.js +1 -1
- package/adapters/opencode/opencode.json +1 -1
- package/package.json +2 -2
- package/public/dashboard.html +9 -5
- package/public/index.html +2 -2
- package/public/numbers.html +2 -2
- package/scripts/statusline-meta.js +11 -1
- package/scripts/statusline.sh +8 -9
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate-marketplace",
|
|
3
|
-
"version": "1.26.
|
|
3
|
+
"version": "1.26.6",
|
|
4
4
|
"owner": {
|
|
5
5
|
"name": "Igor Ganapolsky",
|
|
6
6
|
"email": "ig5973700@gmail.com"
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"source": "npm",
|
|
15
15
|
"package": "thumbgate"
|
|
16
16
|
},
|
|
17
|
-
"version": "1.26.
|
|
17
|
+
"version": "1.26.6",
|
|
18
18
|
"author": {
|
|
19
19
|
"name": "Igor Ganapolsky",
|
|
20
20
|
"email": "ig5973700@gmail.com",
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
3
|
"description": "One 👎 becomes a hard rule the agent cannot bypass. Captures thumbs-down feedback, distills it into PreToolUse Pre-Action Checks, enforced across every future Claude Code session.",
|
|
4
|
-
"version": "1.26.
|
|
4
|
+
"version": "1.26.6",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Igor Ganapolsky",
|
|
7
7
|
"email": "ig5973700@gmail.com",
|
|
8
8
|
"url": "https://thumbgate.ai"
|
|
9
9
|
},
|
|
10
10
|
"homepage": "https://thumbgate.ai",
|
|
11
|
-
"repository": "
|
|
11
|
+
"repository": "https://github.com/IgorGanapolsky/ThumbGate",
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"category": "developer-tools",
|
|
14
14
|
"keywords": [
|
package/README.md
CHANGED
|
@@ -335,8 +335,36 @@ npx thumbgate dashboard # open local dashboard
|
|
|
335
335
|
npx thumbgate serve # start MCP server on stdio
|
|
336
336
|
npx thumbgate bench # run reliability benchmark
|
|
337
337
|
npx thumbgate bench --programbench-smoke # include cleanroom whole-repo proof lane
|
|
338
|
+
npx thumbgate break-glass --reason="ThumbGate over-fired" # short TTL recovery for gate over-fire
|
|
338
339
|
```
|
|
339
340
|
|
|
341
|
+
### Recovery if a gate over-fires
|
|
342
|
+
|
|
343
|
+
ThumbGate should block repeated unsafe actions, not trap the operator. If a noisy rule or stale memory pattern blocks the hook/settings change you need to recover, open a short-lived break-glass window:
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
npx thumbgate break-glass --reason="ThumbGate over-fired and blocked operator recovery"
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
What this unlocks for up to 5 minutes:
|
|
350
|
+
|
|
351
|
+
- Edits to `.claude/settings.local.json`, `.claude/settings.json`, `.codex/config.toml`, and the same files inside nested workspaces.
|
|
352
|
+
- The short-lived proof gates used for PR recovery: `pr_create_allowed` and `pr_threads_checked`.
|
|
353
|
+
|
|
354
|
+
What stays gated:
|
|
355
|
+
|
|
356
|
+
- Force pushes, protected-branch pushes, broad `rm -rf`, unsafe `chmod`, package publishes/releases, and local-only remote side effects.
|
|
357
|
+
- Arbitrary protected files such as `README.md`, `AGENTS.md`, policy bundles, or credentials.
|
|
358
|
+
|
|
359
|
+
Verify the recovery window and runtime health before continuing:
|
|
360
|
+
|
|
361
|
+
```bash
|
|
362
|
+
npx thumbgate break-glass --reason="verify recovery path" --json
|
|
363
|
+
npx thumbgate doctor
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
If you change MCP or hook settings, restart the affected agent session so Claude Code, Cursor, Codex, or another runtime reloads `.mcp.json` and local settings.
|
|
367
|
+
|
|
340
368
|
---
|
|
341
369
|
|
|
342
370
|
## Pricing
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"thumbgate": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--yes", "--package", "thumbgate@1.26.
|
|
5
|
+
"args": ["--yes", "--package", "thumbgate@1.26.6", "thumbgate", "serve"]
|
|
6
6
|
}
|
|
7
7
|
},
|
|
8
8
|
"hooks": {
|
|
9
9
|
"preToolUse": {
|
|
10
10
|
"command": "npx",
|
|
11
|
-
"args": ["--yes", "--package", "thumbgate@1.26.
|
|
11
|
+
"args": ["--yes", "--package", "thumbgate@1.26.6", "thumbgate", "gate-check"]
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -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.26.
|
|
234
|
+
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.26.6' };
|
|
235
235
|
const COMMERCE_CATEGORIES = [
|
|
236
236
|
'product_recommendation',
|
|
237
237
|
'brand_compliance',
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.26.
|
|
3
|
+
"version": "1.26.6",
|
|
4
4
|
"description": "ThumbGate self-improving agent governance: thumbs-up/down turns every mistake into a prevention rule and blocks repeat patterns. 36 pre-action checks, budget enforcement, and self-protection for Claude Code, Cursor, Codex, Gemini CLI, and Amp.",
|
|
5
5
|
"homepage": "https://thumbgate.ai",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "
|
|
8
|
+
"url": "https://github.com/IgorGanapolsky/ThumbGate.git"
|
|
9
9
|
},
|
|
10
10
|
"bugs": {
|
|
11
11
|
"url": "https://github.com/IgorGanapolsky/ThumbGate/issues"
|
package/public/dashboard.html
CHANGED
|
@@ -646,25 +646,29 @@ async function connect(options) {
|
|
|
646
646
|
var input = document.getElementById('apiKey');
|
|
647
647
|
API_KEY = String(opts.key || input.value || '').trim();
|
|
648
648
|
if (!API_KEY) return;
|
|
649
|
+
|
|
650
|
+
const isEnterprise = API_KEY.startsWith('tg_op_') || API_KEY.startsWith('tg_creator_');
|
|
651
|
+
const tierName = isEnterprise ? 'Enterprise' : 'Pro';
|
|
652
|
+
|
|
649
653
|
const status = document.getElementById('authStatus');
|
|
650
654
|
const btn = document.getElementById('connectBtn');
|
|
651
655
|
btn.disabled = true;
|
|
652
656
|
status.className = 'auth-status';
|
|
653
|
-
status.textContent = opts.localPro ?
|
|
657
|
+
status.textContent = opts.localPro ? `Connecting local dashboard...` : 'Connecting...';
|
|
654
658
|
try {
|
|
655
659
|
const res = await fetch('/v1/feedback/stats', { headers: getHeaders() });
|
|
656
660
|
if (!res.ok) throw new Error('Invalid API key');
|
|
657
661
|
const data = await res.json();
|
|
658
662
|
status.className = 'auth-status ok';
|
|
659
|
-
status.textContent = opts.localPro ?
|
|
663
|
+
status.textContent = opts.localPro ? `✓ Local ${tierName} connected` : '✓ Connected';
|
|
660
664
|
document.getElementById('dashboardContent').style.display = 'block';
|
|
661
665
|
if (opts.localPro) {
|
|
662
666
|
input.value = 'local-license';
|
|
663
667
|
input.disabled = true;
|
|
664
|
-
input.placeholder =
|
|
668
|
+
input.placeholder = `Local ${tierName} auto-connected`;
|
|
665
669
|
btn.disabled = true;
|
|
666
670
|
document.getElementById('demoBtn').style.display = 'none';
|
|
667
|
-
document.getElementById('authHelp').textContent =
|
|
671
|
+
document.getElementById('authHelp').textContent = `Local ${tierName} is active on this machine. Your dashboard is using the saved license key automatically.`;
|
|
668
672
|
}
|
|
669
673
|
renderStats(data);
|
|
670
674
|
setSelectedCard('all');
|
|
@@ -677,7 +681,7 @@ async function connect(options) {
|
|
|
677
681
|
status.className = 'auth-status err';
|
|
678
682
|
status.textContent = '✗ ' + e.message;
|
|
679
683
|
if (opts.localPro) {
|
|
680
|
-
document.getElementById('authHelp').textContent =
|
|
684
|
+
document.getElementById('authHelp').textContent = `Local ${tierName} bootstrap failed. Paste your THUMBGATE_API_KEY manually or retry the local launcher.`;
|
|
681
685
|
}
|
|
682
686
|
}
|
|
683
687
|
if (!opts.localPro) {
|
package/public/index.html
CHANGED
|
@@ -20,7 +20,7 @@ __GOOGLE_SITE_VERIFICATION_META__
|
|
|
20
20
|
<meta property="og:image" content="https://thumbgate.ai/og.png">
|
|
21
21
|
<meta name="twitter:card" content="summary_large_image">
|
|
22
22
|
<meta name="twitter:image" content="https://thumbgate.ai/og.png">
|
|
23
|
-
<meta name="thumbgate-version" content="1.26.
|
|
23
|
+
<meta name="thumbgate-version" content="1.26.6">
|
|
24
24
|
<meta name="keywords" content="ThumbGate, thumbgate, AI agent orchestration, AI experience orchestration, agentic development cycle, AC/DC framework, Guide Generate Verify Solve, agent enforcement layer, save LLM tokens, reduce Claude API cost, reduce OpenAI cost, AI agent token savings, prevent LLM retries, prevent hallucination retries, stop AI token waste, pre-action checks, agent governance, Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode, workflow hardening, context engineering, AI authenticity, brand authenticity AI">
|
|
25
25
|
<link rel="canonical" href="__APP_ORIGIN__/">
|
|
26
26
|
<link rel="alternate" type="text/markdown" title="ThumbGate LLM context" href="__APP_ORIGIN__/llm-context.md">
|
|
@@ -1594,7 +1594,7 @@ __GA_BOOTSTRAP__
|
|
|
1594
1594
|
<a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
|
|
1595
1595
|
<a href="/blog">Blog</a>
|
|
1596
1596
|
</div>
|
|
1597
|
-
<span class="footer-copy">© 2026 ThumbGate · MIT License · npm v1.26.
|
|
1597
|
+
<span class="footer-copy">© 2026 ThumbGate · MIT License · npm v1.26.6</span>
|
|
1598
1598
|
</div>
|
|
1599
1599
|
</footer>
|
|
1600
1600
|
|
package/public/numbers.html
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"alternateName": "thumbgate",
|
|
26
26
|
"applicationCategory": "DeveloperApplication",
|
|
27
27
|
"operatingSystem": "Cross-platform, Node.js >=18.18.0",
|
|
28
|
-
"softwareVersion": "1.26.
|
|
28
|
+
"softwareVersion": "1.26.6",
|
|
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.26.
|
|
205
|
+
<div class="freshness">Updated: 2026-05-07 · Version 1.26.6</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>
|
|
@@ -8,10 +8,20 @@ function getStatuslineMeta(options = {}) {
|
|
|
8
8
|
const pkg = require(path.join(__dirname, '..', 'package.json'));
|
|
9
9
|
const env = options.env || process.env;
|
|
10
10
|
const homeDir = options.homeDir || env.HOME || env.USERPROFILE || '.';
|
|
11
|
+
|
|
12
|
+
// Enterprise detection based on key prefix
|
|
13
|
+
const apiKey = env.THUMBGATE_API_KEY || env.THUMBGATE_OPERATOR_KEY || '';
|
|
14
|
+
let activeTier = 'Free';
|
|
15
|
+
|
|
16
|
+
if (apiKey.startsWith('tg_op_') || apiKey.startsWith('tg_creator_')) {
|
|
17
|
+
activeTier = 'Enterprise';
|
|
18
|
+
} else if (isProLicensed({ homeDir }) || apiKey.startsWith('tg_pro_')) {
|
|
19
|
+
activeTier = 'Pro';
|
|
20
|
+
}
|
|
11
21
|
|
|
12
22
|
return {
|
|
13
23
|
version: String(pkg.version || '').trim() || 'unknown',
|
|
14
|
-
tier:
|
|
24
|
+
tier: activeTier,
|
|
15
25
|
};
|
|
16
26
|
}
|
|
17
27
|
|
package/scripts/statusline.sh
CHANGED
|
@@ -206,10 +206,10 @@ LINE="${LINE:+${LINE} · }ThumbGate v${TG_VERSION} · ${TG_TIER}"
|
|
|
206
206
|
if [[ "$UP" = "0" && "$DOWN" = "0" ]]; then
|
|
207
207
|
LINE="${D}${LINE}${RST} · no feedback yet"
|
|
208
208
|
[[ -n "$PR_LABEL" ]] && LINE="${LINE} · ${D}${PR_LABEL}${RST}"
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
209
|
+
|
|
210
|
+
LINE="${LINE} · ${C}${DASHBOARD_LINK}${RST} · ${M}${LESSONS_LINK}${RST}"
|
|
211
|
+
[[ -n "$LATEST_LESSON_LINK" ]] && LINE="${LINE} · ${D}${LATEST_LESSON_LINK}${RST}"
|
|
212
|
+
|
|
213
213
|
printf '%b\n' "$LINE"
|
|
214
214
|
else
|
|
215
215
|
LINE="${LINE} · ${G}${BD}${UP}${RST}${UP_LINK} ${R}${BD}${DOWN}${RST}${DOWN_LINK} ${ARROW}"
|
|
@@ -219,10 +219,9 @@ else
|
|
|
219
219
|
[[ "${AT_RISK:-0}" -gt 0 ]] && LINE="${LINE} ${R}${AT_RISK}⚠${RST}"
|
|
220
220
|
[[ "${ANOMALIES:-0}" -gt 0 ]] && LINE="${LINE} ${R}${ANOMALIES}☠${RST}"
|
|
221
221
|
[[ -n "$PR_LABEL" ]] && LINE="${LINE} · ${D}${PR_LABEL}${RST}"
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
222
|
+
|
|
223
|
+
LINE="${LINE} · ${C}${DASHBOARD_LINK}${RST} · ${M}${LESSONS_LINK}${RST}"
|
|
224
|
+
[[ -n "$LATEST_LESSON_LINK" ]] && LINE="${LINE} · ${D}${LATEST_LESSON_LINK}${RST}"
|
|
225
|
+
|
|
227
226
|
printf '%b\n' "$LINE"
|
|
228
227
|
fi
|