A cross-harness skill for LLM agents: analyzes git changes and prepares a manual testing checklist for the QA team. Supports Claude Code, Codex, and Cursor from a single shared core.
/qa-checklist # asks for the comparison base
/qa-checklist develop # directly against the develop branch
/qa-checklist HEAD~3 # against the given ref
/qa-checklist main..feature
If the base is not passed as an argument, the skill offers a choice: base branch
(auto-detected develop → main → master), last commit, uncommitted changes, or a
custom ref/range.
A finished checklist looks like the template below. It is written in English by
default, grouped by application surface, with one checkbox per user-observable
change. The Inspiration block is on by default — add without inspiration to
the invocation to omit it.
# QA checklist: feature/dark-mode compared to develop
## Summary of changes
This branch adds a dark-mode toggle to the settings page and validates discount
codes before payment in the checkout flow.
## Inspiration
Night falls on the page,
each code weighed before it pays —
ship calm, all is well.
## Checklist
### Settings
- [ ] **Dark-mode toggle**
- **Before / after:** Settings had no theme option; a dark-mode toggle is now available.
- **Expected behavior:** Toggling switches the theme immediately and the choice persists across reloads.
- **How to verify:** Open Settings, toggle dark mode, reload the page, and confirm the theme is retained.
### Checkout
- [ ] **Discount code validation**
- **Before / after:** Discount codes were applied without a validity check; they are now validated before payment.
- **Expected behavior:** An invalid code shows an error and is not applied; a valid code reduces the order total.
- **How to verify:** At checkout, enter an invalid code then a valid one, and confirm the messages and totals.
## Low risk / internal (manual testing not required)
- Internal refactor of the price-formatting helper (no user-visible change).scripts/detect-base.shdetermines the repository state and the base branch.- The user chooses the comparison base (via the harness adapter).
scripts/collect-diff.shcollects the diff for the chosen mode.- The shallow subagent reads the whole diff, groups changes by "application surface", and writes the summary; the orchestrator keeps only the compact map.
- The deep subagents (one per user-facing group) fetch their own diff slice and return checklist items.
- The orchestrator assembles the final markdown in English (or the language the
user explicitly requested), prints it to the chat, and on request saves it to
docs/qa/<date>-checklist.md.
skills/qa-checklist/SKILL.md— shared workflow coreskills/qa-checklist/references/— subagent instructions (English)skills/qa-checklist/adapters/— harness specifics (asking the user, spawning subagents)skills/qa-checklist/scripts/— git logic (bash)
The heavy logic (scripts, references, SKILL.md) is shared across all harnesses; only the thin adapters differ.
No local clone needed — install straight from GitHub. Add the repository as a plugin marketplace and install the plugin:
/plugin marketplace add TuiKiken/qa-checklist
/plugin install qa-checklist@qa-checklist-dev
/plugin marketplace add accepts the owner/repo GitHub shorthand, a full
Git URL, or a local path to a clone. Manifest:
.claude-plugin/marketplace.json (plugin qa-checklist, source: ./).
Claude discovers the skill in skills/qa-checklist/ automatically.
Codex installs from a local clone, so clone the repository first:
git clone https://github.com/TuiKiken/qa-checklist.git
cd qa-checklistThen symlink the skill into Codex's skills directory:
ln -s "$PWD/skills/qa-checklist" ~/.codex/skills/qa-checklist
# or repo-local:
ln -s "$PWD/skills/qa-checklist" .agents/skills/qa-checklistSubagent registration is not needed — the skill spawns Codex's built-in agents
(explorer/default) ad-hoc with an inline instruction pointing at the
reference files.
Cursor installs from a local clone, so clone the repository first:
git clone https://github.com/TuiKiken/qa-checklist.git
cd qa-checklistThen symlink the skill into Cursor's skills directory:
ln -s "$PWD/skills/qa-checklist" ~/.cursor/skills/qa-checklist
# or repo-local:
ln -s "$PWD/skills/qa-checklist" .agents/skills/qa-checklistbash tests/run.shUnit tests for the deterministic shell layer (detect-base.sh, collect-diff.sh)
run against temporary git fixture repositories and are bash 3.2 compatible.
The plugin version lives in four manifests and must stay in sync:
.claude-plugin/plugin.json, .claude-plugin/marketplace.json,
.codex-plugin/plugin.json, .cursor-plugin/plugin.json. Bumping it is what
makes harnesses pick up an update, so every change published to main needs a
new version.
Enable the guard hook once per clone:
git config core.hooksPath .githooksThen bump and push:
scripts/bump-version.sh patch # 0.1.0 -> 0.1.1 (also: minor | major | X.Y.Z)
git push --follow-tagsbump-version.sh rewrites all four manifests, commits chore: release vX.Y.Z,
and creates a vX.Y.Z tag. You can also raise the version by hand (e.g. a major
bump) — that works too.
The .githooks/pre-push hook does not auto-bump. It only blocks a push to
main when the version was not raised above what is already on the remote, so a
manual bump is never double-bumped and forgetting to bump is caught. Pushes to
other branches are not gated.