From 571edeffb72b9e01f3c52547607dbddb2c4d34a5 Mon Sep 17 00:00:00 2001 From: Igor Ganapolsky Date: Wed, 3 Jun 2026 12:59:50 -0400 Subject: [PATCH] Add ThumbGate plugin --- .cursor-plugin/marketplace.json | 5 + README.md | 1 + thumbgate/.cursor-plugin/plugin.json | 38 ++++++ thumbgate/CHANGELOG.md | 37 ++++++ thumbgate/LICENSE | 21 +++ thumbgate/README.md | 123 ++++++++++++++++++ thumbgate/agents/reliability-reviewer.md | 31 +++++ thumbgate/agents/sdk-run-governor.md | 35 +++++ thumbgate/assets/logo-400x400.png | Bin 0 -> 24887 bytes thumbgate/commands/capture-feedback.md | 33 +++++ thumbgate/commands/check-gates.md | 25 ++++ thumbgate/commands/show-lessons.md | 27 ++++ thumbgate/hooks/hooks.json | 14 ++ thumbgate/mcp.json | 14 ++ thumbgate/rules/feedback-capture.mdc | 34 +++++ thumbgate/rules/pre-action-gates.mdc | 30 +++++ thumbgate/rules/session-continuity.mdc | 28 ++++ thumbgate/scripts/gate-check.sh | 21 +++ thumbgate/skills/capture-feedback/SKILL.md | 48 +++++++ thumbgate/skills/prevention-rules/SKILL.md | 31 +++++ .../skills/programmatic-agent-runs/SKILL.md | 42 ++++++ thumbgate/skills/recall-context/SKILL.md | 30 +++++ thumbgate/skills/search-lessons/SKILL.md | 33 +++++ 23 files changed, 701 insertions(+) create mode 100644 thumbgate/.cursor-plugin/plugin.json create mode 100644 thumbgate/CHANGELOG.md create mode 100644 thumbgate/LICENSE create mode 100644 thumbgate/README.md create mode 100644 thumbgate/agents/reliability-reviewer.md create mode 100644 thumbgate/agents/sdk-run-governor.md create mode 100644 thumbgate/assets/logo-400x400.png create mode 100644 thumbgate/commands/capture-feedback.md create mode 100644 thumbgate/commands/check-gates.md create mode 100644 thumbgate/commands/show-lessons.md create mode 100644 thumbgate/hooks/hooks.json create mode 100644 thumbgate/mcp.json create mode 100644 thumbgate/rules/feedback-capture.mdc create mode 100644 thumbgate/rules/pre-action-gates.mdc create mode 100644 thumbgate/rules/session-continuity.mdc create mode 100755 thumbgate/scripts/gate-check.sh create mode 100644 thumbgate/skills/capture-feedback/SKILL.md create mode 100644 thumbgate/skills/prevention-rules/SKILL.md create mode 100644 thumbgate/skills/programmatic-agent-runs/SKILL.md create mode 100644 thumbgate/skills/recall-context/SKILL.md create mode 100644 thumbgate/skills/search-lessons/SKILL.md diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 49f6d8e..ca4d32f 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -72,6 +72,11 @@ "name": "pstack", "source": "pstack", "description": "if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence." + }, + { + "name": "thumbgate", + "source": "thumbgate", + "description": "Capture thumbs feedback and enforce deterministic pre-action checks so Cursor agents stop repeating mistakes." } ] } diff --git a/README.md b/README.md index b3348e8..c2cb3ac 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `cursor-sdk` | [Cursor SDK](cursor-sdk/) | Cursor | Developer Tools | Build apps, scripts, CI pipelines, and automations on top of the Cursor TypeScript SDK (@cursor/sdk) β€” runtime selection, auth, streaming, MCP, error handling, and ready-to-extend integration patterns. | | `orchestrate` | [Orchestrate](orchestrate/) | Cursor | Developer Tools | Fan large tasks out across parallel Cursor cloud agents with planners, workers, verifiers, and structured handoffs. | | `pstack` | [pstack](pstack/) | Lauren Tan | Developer Tools | if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence. | +| `thumbgate` | [ThumbGate](thumbgate/) | Igor Ganapolsky | Developer Tools | Capture thumbs feedback and enforce deterministic pre-action checks so Cursor agents stop repeating mistakes. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). diff --git a/thumbgate/.cursor-plugin/plugin.json b/thumbgate/.cursor-plugin/plugin.json new file mode 100644 index 0000000..753dfec --- /dev/null +++ b/thumbgate/.cursor-plugin/plugin.json @@ -0,0 +1,38 @@ +{ + "name": "thumbgate", + "displayName": "ThumbGate", + "description": "πŸ‘πŸ‘Ž Thumbs down a mistake β€” your AI agent won't repeat it. Thumbs up good work β€” it remembers the pattern.", + "version": "1.26.8", + "author": { + "name": "Igor Ganapolsky" + }, + "homepage": "https://thumbgate.ai", + "repository": "https://github.com/IgorGanapolsky/ThumbGate", + "license": "MIT", + "keywords": [ + "cursor", + "cursor-plugin", + "feedback", + "thumbs-up-down", + "thumbgate", + "ai-agent-memory", + "mistake-prevention", + "coding-agent", + "pre-action-gates", + "mcp" + ], + "logo": "assets/logo-400x400.png", + "category": "developer-tools", + "tags": [ + "agent-governance", + "feedback", + "mcp", + "pre-action-checks" + ], + "commands": "./commands/", + "agents": "./agents/", + "skills": "./skills/", + "rules": "./rules/", + "hooks": "./hooks/hooks.json", + "mcpServers": "./mcp.json" +} diff --git a/thumbgate/CHANGELOG.md b/thumbgate/CHANGELOG.md new file mode 100644 index 0000000..1f77787 --- /dev/null +++ b/thumbgate/CHANGELOG.md @@ -0,0 +1,37 @@ +# Changelog + +## 1.23.1 - 2026-05-25 + +- Added `interface` block to plugin.json (displayName, capabilities, brandColor, privacy/TOS URLs) +- Added UTM-tagged homepage URL +- Added MCP keyword to plugin keywords +- Version aligned with ThumbGate core + +## 0.8.1 - 2026-03-26 + +- Unified ThumbGate branding across all public surfaces (README, AGENTS.md, CLAUDE.md, GEMINI.md, landing page, package.json). +- Landing page SEO: "human-in-the-loop enforcement", "vibe coding" positioning, FAQPage JSON-LD schema for Google rich results. +- Added congruence CI check (`scripts/check-congruence.js`) β€” enforces version, branding, tech stack terms, and honest disclaimer across README and landing page on every PR. +- Performance: deferred non-critical side-effects in `captureFeedback` (contextFs, RLAIF self-audit) via `setImmediate`. +- Added `_captureMs` timing field to accepted feedback responses for observability. +- Added `mcpize.yaml` to version sync targets. +- Dead code removal: -1,551 lines (contract-audit.js, prove-rlaif.js, stale landing-page.html, 3 duplicate docs). +- Fixed GitGuardian incident #29200799: scrubbed hardcoded Google API key from git history. +- Social automation pipeline: post-everywhere CLI, reply monitor with AutoMod-safe Reddit posts. +- TDS article draft: "Beyond Prompt Rules: How Pre-Action Gates Stop AI Coding Agents From Repeating Mistakes". + +## 0.8.0 - 2026-03-25 + +- **Lesson DB:** SQLite + FTS5 full-text search replaces linear Jaccard token-overlap. Sub-millisecond ranked search indexed by signal, domain, tags, importance. +- **Corrective actions:** On negative feedback, `capture_feedback` returns `correctiveActions[]` β€” top 3 remediation steps inferred from similar past failures. +- **search_lessons MCP tool:** Exposes corrective actions, lifecycle state, linked rules, linked gates, and next harness fixes per lesson. +- **search_thumbgate MCP tool:** Searches raw ThumbGate state across feedback logs, ContextFS memory, and prevention rules. +- **Rejection ledger:** Tracks why vague feedback was rejected with revival conditions. +- **Bayesian belief updates:** Each memory carries a posterior that updates on new evidence; high-entropy contradictions auto-prune. + +## 0.7.4 - 2026-03-20 + +- Added `session_handoff` and `session_primer` MCP tools for seamless cross-session context continuity. +- New `session` namespace in ContextFS stores primer.json with auto-captured git state (branch, last 5 commits, modified files, working tree status), last completed task, next step, and blockers. +- `session_handoff` records provenance events for full audit trail of session transitions. +- Closes Layer 2 (primer.md) of the 5-layer memory stack β€” no manual primer file needed. diff --git a/thumbgate/LICENSE b/thumbgate/LICENSE new file mode 100644 index 0000000..be4fda0 --- /dev/null +++ b/thumbgate/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Igor Ganapolsky + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/thumbgate/README.md b/thumbgate/README.md new file mode 100644 index 0000000..7ce7be4 --- /dev/null +++ b/thumbgate/README.md @@ -0,0 +1,123 @@ +# ThumbGate β€” for Cursor + +`ThumbGate` is the human-facing plugin name in Cursor listings. +`thumbgate` stays the plugin slug, npm package, and launcher target. + +The canonical short description is: + +> πŸ‘πŸ‘Ž Thumbs down a mistake β€” your AI agent won't repeat it. Thumbs up good work β€” it remembers the pattern. + +How it works: + +- πŸ‘Ž **Thumbs down** a mistake β€” it gets blocked from happening again +- πŸ‘ **Thumbs up** good work β€” the agent remembers the pattern +- **History-aware lesson distillation** β€” vague thumbs-down signals can be grounded in up to 8 prior recorded entries and the failed tool call +- **Cross-session memory** β€” lessons persist between conversations +- **Automatic enforcement** β€” repeated failures become prevention rules +- **Zero config** β€” install and start giving feedback + +## What's included + +### Rules + +| File | Always on | Description | +|------|-----------|-------------| +| `rules/pre-action-gates.mdc` | Yes | Before risky tool calls (git push, rm -rf, npm publish, deploy), check prevention rules via the thumbgate MCP server. Blocks and explains if a rule matches. | +| `rules/feedback-capture.mdc` | No | After any mistake or unexpected behavior, prompt to capture structured feedback with context and tags. | +| `rules/session-continuity.mdc` | No | At session start, recall past context; at session end, hand off state for next session. | + +### Skills + +| Skill | Description | +|-------|-------------| +| `recall-context` | Recall relevant past failures, prevention rules, and context packs before starting a coding task. | +| `capture-feedback` | Capture structured thumbs up/down feedback with context, tags, and optional rubric scores. | +| `search-lessons` | Search promoted lessons for corrective actions, lifecycle state, linked rules, and linked gates. | +| `prevention-rules` | Generate and review prevention rules auto-promoted from repeated failure patterns. | + +### Agent + +| Agent | Description | +|-------|-------------| +| `reliability-reviewer` | A reliability-focused reviewer that checks code changes against known failure patterns from the project's ThumbGate memory. | + +### Commands + +| Command | Description | +|---------|-------------| +| `/check-gates` | Run a Pre-Action Gate check against prevention rules before executing a risky action. | +| `/show-lessons` | Display promoted lessons and their corrective actions. | +| `/capture-feedback` | Quick feedback capture with structured signals. | + +### Hooks + +| Hook | Trigger | Description | +|------|---------|-------------| +| `beforeShellExecution` | `git push`, `rm -rf`, `npm publish`, `deploy` | Runs `scripts/gate-check.sh` to evaluate the command through ThumbGate `gate-check` before execution. | + +### MCP Server + +| Server | Command | +|--------|---------| +| `thumbgate` | `npx --yes --package thumbgate@latest thumbgate serve` | + +## Install + +Install from Cursor with: + +```text +/add-plugin thumbgate +``` + +You can also open Cursor's plugin marketplace, search for `ThumbGate`, and add the plugin from there. + +For private team rollouts before broad adoption, Cursor Teams and Enterprise admins can import a repository-backed plugin through `Dashboard -> Settings -> Plugins -> Team Marketplaces`. + +### Manual setup + +Use the existing project bootstrap: + +```bash +npx thumbgate init --agent cursor +``` + +Or copy the plugin MCP config into `.cursor/mcp.json`: + +```json +{ + "mcpServers": { + "thumbgate": { + "command": "npx", + "args": ["--yes", "--package", "thumbgate@latest", "thumbgate", "serve"] + } + } +} +``` + +Full setup guide: https://thumbgate-production.up.railway.app/guide + +## Update behavior + +- Runtime updates: the plugin asks npm for `thumbgate@latest`, so new npm releases can flow into the Cursor runtime without editing the plugin config. +- Metadata updates: `npm publish` does not refresh the marketplace description, screenshots, README, or directory listing copy. Republish the plugin bundle when those assets change. +- Guaranteed rollouts: if you need deterministic behavior for a specific release, pin a version manually in local config instead of relying on `@latest`. + +## Feedback + +Use the `/capture-feedback` command or the `capture_feedback` MCP tool to send structured feedback directly to the ThumbGate memory system. Feedback drives prevention rule generation β€” repeated failure patterns are auto-promoted into enforceable gates. + +When the user only gives a quick `thumbs_down`, `wrong`, or `correct`, the Cursor plugin should include up to 8 prior recorded entries and the failed tool call in `chatHistory` so ThumbGate can propose the lesson automatically. If the explanation comes later, reuse the earlier event with `relatedFeedbackId` so the linked 60-second follow-up session refines the same feedback record instead of creating an isolated duplicate. + +## What makes this useful in Cursor + +ThumbGate gives Cursor agents a practical guardrail layer: + +- **Pre-Action Gates** block known-bad actions before tool use +- **Prevention rules** auto-generated from repeated failures +- **Context packs** keep relevant project history in scope +- **Feedback capture** with structured up/down signals and history-aware lesson proposals +- **Reliability reviewer** checks changes against known failure patterns + +Verification evidence for shipped behavior lives in `docs/VERIFICATION_EVIDENCE.md`. +Release and promotion rules live in `docs/CURSOR_PLUGIN_OPERATIONS.md`. +Proof-backed setup path: https://thumbgate-production.up.railway.app/guide diff --git a/thumbgate/agents/reliability-reviewer.md b/thumbgate/agents/reliability-reviewer.md new file mode 100644 index 0000000..33d0576 --- /dev/null +++ b/thumbgate/agents/reliability-reviewer.md @@ -0,0 +1,31 @@ +--- +name: reliability-reviewer +description: A reliability-focused reviewer agent that checks code changes against known failure patterns from the project's ThumbGate memory. Prioritizes preventing repeated mistakes. +--- + +# Reliability Reviewer + +You are a reliability-focused code reviewer. Your job is to check proposed code changes against the project's known failure patterns stored in ThumbGate memory. + +## Review process + +1. **Recall context** β€” Use the `recall` MCP tool to retrieve relevant prevention rules and past failures for the files being changed. +2. **Search lessons** β€” Use the `search_lessons` MCP tool to find promoted lessons related to the components being modified. +3. **Cross-reference changes** β€” Compare the proposed changes against known failure patterns. Flag any changes that match or resemble past failures. +4. **Check gates** β€” Use the `prevention_rules` MCP tool to verify no active prevention rules are violated by the changes. +5. **Report findings** β€” Summarize which past failures are relevant, what risks exist, and what corrective actions should be applied. + +## Review priorities + +1. **Repeated mistakes** β€” Changes that match previously captured failure patterns are highest priority. +2. **Missing gate checks** β€” Risky operations without corresponding pre-action gate checks. +3. **Untested paths** β€” Changes to code paths that previously caused failures without new test coverage. +4. **Feedback gaps** β€” Changes in areas with no captured feedback history (unknown risk). + +## Output format + +For each finding, include: +- The matched failure pattern or prevention rule +- The specific code change that triggered the match +- The recommended corrective action +- Severity: critical (matches active prevention rule), warning (matches past failure), or info (no history) diff --git a/thumbgate/agents/sdk-run-governor.md b/thumbgate/agents/sdk-run-governor.md new file mode 100644 index 0000000..2508b09 --- /dev/null +++ b/thumbgate/agents/sdk-run-governor.md @@ -0,0 +1,35 @@ +--- +name: sdk-run-governor +description: Reviews Cursor SDK agent launch plans, cloud VM runs, subagent scopes, and auto-PR settings against ThumbGate gates. +--- + +# SDK Run Governor + +You review planned or completed Cursor SDK agent runs before their output is trusted. + +## Review process + +1. Identify the runtime: local, cloud VM, or self-hosted worker. +2. Identify write scope: repo, branch, files, commands, and whether `autoCreatePR` is enabled. +3. Use `search_lessons` and `prevention_rules` to retrieve relevant ThumbGate lessons and gates. +4. Check subagents for narrow ownership and non-overlapping responsibilities. +5. Require evidence: tests, screenshots, logs, PR URL, or run transcript. +6. Recommend capture feedback for any repeated miss, scope violation, skipped proof, or noisy PR. + +## Findings to flag + +- Agent can push, publish, deploy, or create PRs without a prior gate check +- Cloud run started from an ambiguous ref or reused a dirty workspace +- Subagent prompt owns too much of the codebase +- Verification is only a summary with no linked artifact +- Known failure pattern appears in the requested command, diff, or PR body + +## Output format + +Return: + +- Verdict: allow, require changes, or block +- Relevant lessons and gates +- Runtime and scope risks +- Required verification evidence +- Feedback that should be captured diff --git a/thumbgate/assets/logo-400x400.png b/thumbgate/assets/logo-400x400.png new file mode 100644 index 0000000000000000000000000000000000000000..d89b6f4d313f2ead90908a350982130f5042e7d5 GIT binary patch literal 24887 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 bMHbsLb2B@AV~jGm5bT7}X~SZJi#PuVmjSFA literal 0 HcmV?d00001 diff --git a/thumbgate/commands/capture-feedback.md b/thumbgate/commands/capture-feedback.md new file mode 100644 index 0000000..6d3fb78 --- /dev/null +++ b/thumbgate/commands/capture-feedback.md @@ -0,0 +1,33 @@ +--- +name: capture-feedback +description: Quick feedback capture with structured signals. +--- + +# Capture Feedback + +Quickly capture structured feedback about the current task or action. + +## Usage + +Invoke this command to record a feedback signal with context and tags. If the user only gives a quick `thumbs_down`, `wrong`, or `correct`, the command should still call `capture_feedback` and pass recent context through `chatHistory`. + +## Steps + +1. Specify signal: `thumbs_up` or `thumbs_down`. +2. If the user already gave a clear explanation, pass it as `context`. +3. If the explanation is vague or omitted, gather up to 8 prior recorded entries plus the failed tool call into `chatHistory`. +4. Add tags for categorization. +5. If this is a later clarification for an existing feedback event, include `relatedFeedbackId`. +6. Call the `capture_feedback` MCP tool and show the proposed lesson or corrective rule back to the user. + +## Example + +``` +/capture-feedback thumbs_down "Tests broke after migration" database,migration +``` + +``` +/capture-feedback thumbs_down +``` + +In the second example, the command should rely on history-aware distillation instead of refusing the signal outright. If the user adds more detail later, reuse `relatedFeedbackId` so the linked 60-second follow-up session updates the same record. diff --git a/thumbgate/commands/check-gates.md b/thumbgate/commands/check-gates.md new file mode 100644 index 0000000..2fe5f43 --- /dev/null +++ b/thumbgate/commands/check-gates.md @@ -0,0 +1,25 @@ +--- +name: check-gates +description: Run a Pre-Action Gate check against prevention rules before executing a risky action. +--- + +# Check Gates + +Run a pre-action gate check to verify if a planned action is safe to execute. + +## Usage + +Invoke this command before performing risky operations like deployments, force pushes, or destructive file operations. + +## Steps + +1. Describe the action you are about to take. +2. The command queries the `prevention_rules` MCP tool to check for matching rules. +3. If a match is found, the blocked action and corrective action are displayed. +4. If no match is found, the action is cleared to proceed. + +## Example + +``` +/check-gates git push --force origin main +``` diff --git a/thumbgate/commands/show-lessons.md b/thumbgate/commands/show-lessons.md new file mode 100644 index 0000000..efaf271 --- /dev/null +++ b/thumbgate/commands/show-lessons.md @@ -0,0 +1,27 @@ +--- +name: show-lessons +description: Display promoted lessons and their corrective actions. +--- + +# Show Lessons + +Display promoted lessons from the project's ThumbGate memory along with their corrective actions and linked prevention rules. + +## Usage + +Invoke this command to review what the system has learned from past failures. + +## Steps + +1. The command calls the `search_lessons` MCP tool to retrieve all active promoted lessons. +2. Results are displayed with: + - Lesson description + - Corrective action + - Linked prevention rules (if any) + - Lifecycle state (active, archived, superseded) + +## Example + +``` +/show-lessons +``` diff --git a/thumbgate/hooks/hooks.json b/thumbgate/hooks/hooks.json new file mode 100644 index 0000000..f2f2782 --- /dev/null +++ b/thumbgate/hooks/hooks.json @@ -0,0 +1,14 @@ +{ + "hooks": { + "beforeShellExecution": [ + { + "command": "./scripts/gate-check.sh", + "matcher": "git push|rm -rf|npm publish|deploy" + }, + { + "command": "./scripts/gate-check.sh", + "matcher": "@cursor/sdk|cursor-agent|autoCreatePR|create pull request|open PR" + } + ] + } +} diff --git a/thumbgate/mcp.json b/thumbgate/mcp.json new file mode 100644 index 0000000..79be29f --- /dev/null +++ b/thumbgate/mcp.json @@ -0,0 +1,14 @@ +{ + "mcpServers": { + "thumbgate": { + "command": "npx", + "args": [ + "--yes", + "--package", + "thumbgate@latest", + "thumbgate", + "serve" + ] + } + } +} diff --git a/thumbgate/rules/feedback-capture.mdc b/thumbgate/rules/feedback-capture.mdc new file mode 100644 index 0000000..00e3351 --- /dev/null +++ b/thumbgate/rules/feedback-capture.mdc @@ -0,0 +1,34 @@ +--- +description: After any mistake or unexpected behavior, prompt to capture structured feedback with context, history-aware lesson distillation, and tags. +alwaysApply: false +--- + +# Feedback Capture + +After any mistake, unexpected behavior, or completed task, prompt to capture structured feedback. + +## When to trigger + +- A tool call produces an unexpected error +- A test fails after code changes +- The user corrects an approach mid-task +- A task completes successfully (capture positive signal) + +## How to capture + +1. Call the `capture_feedback` MCP tool with: + - `signal`: "thumbs_up" or "thumbs_down" + - `context`: Brief description of what happened when the explanation is already explicit + - `tags`: Relevant tags (e.g., "test-failure", "wrong-approach", "deployment-error") + - `chatHistory`: up to 8 prior recorded entries plus the failed tool call when the thumbs-down signal is vague and the lesson should be inferred from recent conversation + - `relatedFeedbackId`: use for a later clarification that should refine an existing feedback event + - `rubric_scores`: Optional structured scores if a rubric applies + +2. Include enough context so the feedback is useful for future prevention rule generation. +3. If the user only gives a bare thumbs signal or short correction, still capture it and let ThumbGate propose `whatWentWrong` / `whatToChange` from recent history. If the explanation arrives later, reuse `relatedFeedbackId` so the linked 60-second follow-up session refines the same record. + +## Examples + +- Test failure after refactor: signal=thumbs_down, tags=["test-failure", "refactor"], context="Tests broke after extracting helper function β€” missed internal dependency" +- Successful deployment: signal=thumbs_up, tags=["deployment", "success"], context="Clean deploy after running gate checks" +- Vague correction after failed tool use: signal=thumbs_down, chatHistory=[up to 8 prior recorded entries + failed tool call], tags=["wrong-approach", "tool-failure"] diff --git a/thumbgate/rules/pre-action-gates.mdc b/thumbgate/rules/pre-action-gates.mdc new file mode 100644 index 0000000..abda822 --- /dev/null +++ b/thumbgate/rules/pre-action-gates.mdc @@ -0,0 +1,30 @@ +--- +description: Before risky tool calls (git push, rm -rf, npm publish, deploy), check prevention rules via the thumbgate MCP server. If a rule matches, STOP and explain why. +alwaysApply: true +--- + +# Pre-Action Gates + +Before executing any of these risky actions, query the `prevention_rules` MCP tool to check for matching prevention rules: + +- `git push` (especially force push) +- `rm -rf` or recursive file deletion +- `npm publish` +- `deploy` commands (any deployment target) +- Database migration commands +- Secret or credential changes + +## Enforcement flow + +1. Extract the command or action about to be executed. +2. Call `prevention_rules` with the action description to check for matching rules. +3. If a rule matches: + - **STOP** the action immediately. + - Display the matched rule's description and corrective action. + - Ask the user to confirm before proceeding. +4. If no rules match, proceed normally. + +## After a blocked action + +- Suggest the corrective action from the matched prevention rule. +- Offer to capture feedback if the block was incorrect (false positive). diff --git a/thumbgate/rules/session-continuity.mdc b/thumbgate/rules/session-continuity.mdc new file mode 100644 index 0000000..05dd147 --- /dev/null +++ b/thumbgate/rules/session-continuity.mdc @@ -0,0 +1,28 @@ +--- +description: At session start, recall past context. At session end, hand off state for next session. +alwaysApply: false +--- + +# Session Continuity + +Maintain context across coding sessions using the ThumbGate memory system. + +## Session start + +1. Call the `recall` MCP tool to retrieve: + - Recent prevention rules relevant to the current project + - Past failure patterns and corrective actions + - Active context packs from previous sessions +2. Summarize recalled context before starting work. + +## Session end + +1. Capture any new feedback from the session using `capture_feedback`. +2. Note any unfinished work or pending decisions as context for the next session. +3. If new failure patterns emerged, flag them for potential prevention rule promotion. + +## Between sessions + +- Prevention rules persist automatically via the MCP server. +- Lessons promoted during the session are available in future recalls. +- Context packs expire based on configured retention policies. diff --git a/thumbgate/scripts/gate-check.sh b/thumbgate/scripts/gate-check.sh new file mode 100755 index 0000000..69a40f4 --- /dev/null +++ b/thumbgate/scripts/gate-check.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Pre-action gate check β€” runs before risky shell commands. +# Called by hooks/hooks.json beforeShellExecution hook. +# Delegates to the published ThumbGate gate-check entrypoint. + +set -euo pipefail + +INPUT=$(cat) +RESULT=$(echo "$INPUT" | npx --yes --package thumbgate@latest thumbgate gate-check 2>/dev/null) || true + +if [ -z "$RESULT" ]; then + exit 0 +fi + +echo "$RESULT" + +if echo "$RESULT" | grep -q '"permissionDecision":\s*"deny"'; then + exit 2 +fi + +exit 0 diff --git a/thumbgate/skills/capture-feedback/SKILL.md b/thumbgate/skills/capture-feedback/SKILL.md new file mode 100644 index 0000000..b141c65 --- /dev/null +++ b/thumbgate/skills/capture-feedback/SKILL.md @@ -0,0 +1,48 @@ +--- +name: capture-feedback +description: Capture structured thumbs up/down feedback with context, history-aware lesson distillation, tags, and optional rubric scores after completing a task. +--- + +# Capture Feedback + +Record structured feedback after completing a task or encountering an issue. + +## When to use + +- After completing a coding task (positive or negative outcome) +- When a tool call produces unexpected results +- After a test failure or deployment issue +- When the user explicitly wants to record feedback + +## How it works + +Use the `capture_feedback` MCP tool with: + +- **signal** β€” `"thumbs_up"` or `"thumbs_down"` +- **context** β€” Description of what happened and why when the user already said it clearly +- **tags** β€” Array of relevant tags for categorization (e.g., `["test-failure", "refactor"]`) +- **chatHistory** β€” Up to 8 prior recorded entries plus the failed tool call when the thumbs-down signal is vague and the lesson must be distilled from recent context +- **relatedFeedbackId** β€” Use when the user adds clarifying detail later and it should refine the existing feedback event +- **rubric_scores** β€” Optional object with structured quality scores + +## Example + +``` +Capture feedback: thumbs_down for the failed database migration. +Context: Migration script dropped the wrong index, causing query timeouts. +Tags: database, migration, production-incident +``` + +## Vague signal recovery + +If the user only says `thumbs_down`, `wrong`, `correct`, or `this failed`, do not stop there. Call `capture_feedback` with: + +- the signal +- any minimal context the user already gave +- `chatHistory` containing up to 8 prior recorded entries from the current correction thread +- the failed tool call or command when available +- `relatedFeedbackId` if the user is clarifying an already-open 60-second follow-up session + +That lets ThumbGate propose `whatWentWrong`, `whatToChange`, and a candidate rule automatically. + +Feedback feeds into the prevention rule promotion pipeline. Repeated failures with the same pattern are automatically promoted into enforceable prevention rules. diff --git a/thumbgate/skills/prevention-rules/SKILL.md b/thumbgate/skills/prevention-rules/SKILL.md new file mode 100644 index 0000000..399969b --- /dev/null +++ b/thumbgate/skills/prevention-rules/SKILL.md @@ -0,0 +1,31 @@ +--- +name: prevention-rules +description: Generate and review prevention rules auto-promoted from repeated failure patterns. +--- + +# Prevention Rules + +Manage prevention rules that are auto-generated from repeated failure patterns. + +## When to use + +- Reviewing current active prevention rules for the project +- Checking if a specific action is blocked by a prevention rule +- Understanding why an action was blocked +- Generating new prevention rules from observed patterns + +## How it works + +Use the `prevention_rules` MCP tool to: + +1. **List rules** β€” View all active prevention rules with their match patterns and corrective actions. +2. **Check rules** β€” Test if a specific action matches any prevention rule before execution. +3. **Review rule history** β€” See which feedback events led to a rule's promotion. + +## Example + +``` +Check prevention rules for "npm publish without running tests" to see if this action is blocked. +``` + +Prevention rules are auto-promoted when the same failure pattern appears multiple times in captured feedback. Each rule includes the original failure context and a corrective action. diff --git a/thumbgate/skills/programmatic-agent-runs/SKILL.md b/thumbgate/skills/programmatic-agent-runs/SKILL.md new file mode 100644 index 0000000..7822cc5 --- /dev/null +++ b/thumbgate/skills/programmatic-agent-runs/SKILL.md @@ -0,0 +1,42 @@ +--- +name: programmatic-agent-runs +description: Govern Cursor SDK local, cloud, self-hosted, and subagent coding runs before they create branches or PRs. +--- + +# Programmatic Agent Runs + +Use this skill before launching a coding agent through the Cursor SDK, Cursor cloud agents, self-hosted workers, or subagents. + +## When to use + +- A task starts from code, CI, a backend service, a kanban automation, or any unattended workflow +- The run can edit files, push a branch, create a PR, publish a package, deploy, or call shell tools +- The run delegates work to subagents with different prompts, models, or scopes + +## Launch checklist + +1. Recall lessons with `search_lessons` for the repo, branch, files, and intended action. +2. Check active gates with `prevention_rules` before enabling writes or `autoCreatePR`. +3. Use the narrowest runtime: local for developer-in-the-loop work, cloud for isolated async work, self-hosted for private network/data requirements. +4. Give each subagent a bounded file or responsibility scope. +5. Persist run metadata: runtime, repo URL, starting ref, run id, agent id, branch, PR URL, and linked ThumbGate evidence. +6. Require verification output before merge, publish, deploy, or customer-facing claims. + +## Cursor SDK guardrails + +- Attach ThumbGate MCP through the run environment so the agent can retrieve lessons and gates. +- Prefer a clean starting ref and a disposable branch for cloud VM runs. +- Do not set `autoCreatePR` for destructive, billing, release, or production tasks unless the gate check is clean. +- If a cloud run finishes while the developer is offline, inspect the run transcript and PR diff before treating the result as accepted. +- Capture `thumbs_down` feedback when a run violates scope, skips proof, repeats a known mistake, or opens a noisy PR. + +## Output + +For each governed run, report: + +- Runtime: local, cloud, or self-hosted +- Scope: files, modules, or workflow the agent may touch +- Gates checked and result +- Verification evidence +- Branch or PR URL +- Any feedback captured for future prevention diff --git a/thumbgate/skills/recall-context/SKILL.md b/thumbgate/skills/recall-context/SKILL.md new file mode 100644 index 0000000..23ba456 --- /dev/null +++ b/thumbgate/skills/recall-context/SKILL.md @@ -0,0 +1,30 @@ +--- +name: recall-context +description: Recall relevant past failures, prevention rules, and context packs before starting a coding task. +--- + +# Recall Context + +Retrieve relevant historical context before beginning work on a coding task. + +## When to use + +- Starting a new coding task or feature +- Before making changes to code that has failed before +- Resuming work from a previous session + +## How it works + +Use the `recall` MCP tool to retrieve: + +1. **Prevention rules** β€” Rules auto-promoted from repeated failure patterns that apply to the current task. +2. **Past failures** β€” Specific failure events with context, tags, and corrective actions. +3. **Context packs** β€” Bundled project context from previous sessions. + +## Example + +``` +Use the recall MCP tool to check for known issues with the authentication module before refactoring. +``` + +The tool returns structured context that helps avoid repeating past mistakes and surfaces corrective actions from promoted lessons. diff --git a/thumbgate/skills/search-lessons/SKILL.md b/thumbgate/skills/search-lessons/SKILL.md new file mode 100644 index 0000000..8fa30eb --- /dev/null +++ b/thumbgate/skills/search-lessons/SKILL.md @@ -0,0 +1,33 @@ +--- +name: search-lessons +description: Search promoted lessons for corrective actions, lifecycle state, linked rules, and linked gates. +--- + +# Search Lessons + +Search the promoted lessons database for corrective actions and guidance. + +## When to use + +- Looking for corrective actions for a specific failure pattern +- Checking if a known lesson applies to the current task +- Reviewing lifecycle state of lessons (active, archived, superseded) +- Finding linked prevention rules and gates for a topic + +## How it works + +Use the `search_lessons` MCP tool with a query string. The tool searches across: + +1. **Lesson descriptions** β€” What happened and why +2. **Corrective actions** β€” Specific steps to prevent recurrence +3. **Linked rules** β€” Prevention rules generated from the lesson +4. **Linked gates** β€” Pre-action gates that enforce the lesson +5. **Lifecycle state** β€” Whether the lesson is active, archived, or superseded + +## Example + +``` +Search lessons for "force push" to find corrective actions and prevention rules related to force pushing. +``` + +Results include the full lesson context, any linked enforcement rules, and the current lifecycle state.