mcpbeat

Wjs Looping Feedback

jianshuo/wjs-looping-feedback

Use when the user wants to add an in-site feedback loop to a website repo — a floating "提个建议" button where allowlisted visitors submit suggestions that become a GitHub Issue, which GitHub Actions turns into an automatic code change via Claude Code, auto-merges and deploys, and records on a /_feedback dashboard with one-click revert. Triggers — "给网站加个反馈对话框", "提一句话就自动改网站", "装上反馈闭环", "feedback loop", "/wjs-looping-feedback".

8k tokens
context cost
the whole folder, loaded on every use
16
files
ships runnable scripts
0
copies elsewhere
how many repositories repackaged it
112
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/jianshuo/claude-skills --skill wjs-looping-feedback

What comes with it

29 370 bytes besides the instruction
.gitignore
README.md
assets/INSTRUCTIONS.md
assets/config.sample.json
assets/feedback-finalize.mjs
assets/feedback-ledger.json
assets/feedback-lib.mjs
assets/feedback-widget.html
assets/feedback.yml
package.json
references/install.md
scripts/detect-site.mjs
tests/detect-site.test.mjs
tests/finalize.test.mjs
tests/lib.test.mjs

The instruction itself

6 sections, as written by the author

wjs-looping-feedback

Installs a self-driving feedback loop into any website repo. Runs entirely on the repo

owner's own GitHub Actions, authenticated with their Pro/Max OAuth token or their own

ANTHROPIC_API_KEY — no extra service or backend.

What it installs

  • A floating feedback button (prefills a GitHub Issue — no backend, no keys client-side).
  • .github/workflows/feedback.yml — allowlist gate → Claude Code Action → auto-commit →

push to main (auto-deploy) → ledger + dashboard update → close issue.

  • /_feedback dashboard — every suggestion, what Claude did, commit, status, one-click revert.
  • .feedback/ runtime: feedback-lib.mjs, feedback-finalize.mjs, INSTRUCTIONS.md,

feedback-ledger.json, config.json.

How it works

visitor clicks button → fills suggestion → prefilled GitHub Issue (label feedback) →

Actions checks the author is in FEEDBACK_ALLOWLIST (else closes the issue) →

Claude Code edits the site per .feedback/INSTRUCTIONS.md → workflow commits to main,

updates the ledger + dashboard → the deploy ships it →

the issue gets a comment with the commit and a link to /_feedback.

Revert is the same loop driven by a revert: #N issue.

Deploy triggering — read before you install (common gotcha)

The workflow pushes to main with the built-in GITHUB_TOKEN. Two cases:

  • External push-deploy host (Cloudflare Pages git-connect, Vercel, Netlify): their

webhook fires on every push, so the bot's commit deploys automatically. Nothing to do.

  • Deploy is itself a GitHub Actions workflow in the SAME repo (e.g. GitHub Pages via

Actions): GitHub deliberately does NOT let a GITHUB_TOKEN push trigger another workflow

(recursion prevention), so the deploy workflow's on: push will NOT fire — the change

lands on main but never goes live. Bridge it by adding a workflow_run trigger to the

deploy workflow (see references/install.md step 4.5).

To install

Read references/install.md and follow it in the target repo. It detects the site type

(Hugo / Next.js / Astro / static), copies assets, injects the widget, and asks the user for

exactly two things: the allowlist of GitHub usernames and the auth (Pro/Max OAuth

token via claude setup-token, or an ANTHROPIC_API_KEY).

Scope (route 1)

Runs in the user's own repo with their own auth. Submitters need a GitHub account; only

allowlisted authors trigger work. Not a hosted service — no anonymous submit, no billing,

no multi-tenant. (A future GitHub-App packaging would reuse every asset here.)

How to use it

Copy the folder

Take jianshuo/wjs-looping-feedback from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.