A small, growing catalog of Claude Code / Codex skills, exposed as
individual plugins and a full-bundle plugin via the host's native
/plugin install flow. Skills are plain SKILL.md files; each
plugin entry adds a thin manifest plus a skills/ directory of
symlinks back to the canonical skills/<name>/. A legacy
install.sh script remains available as a fallback for sandboxed
environments and older Codex versions.
- Catalog
- Layout
- Install — Claude Code plugin (recommended)
- Install — Codex plugin (recommended)
- Install — script (legacy / fallback)
- Migrating from
debedb/skillz - Catalog manifest
- Updating
- Verify
- Collections
- Plugins
- Validation
- Related code-review approaches
- PR review workflow stack
| Name | Type | Hosts | Purpose |
|---|---|---|---|
| work-on-pr | skill | Claude, Codex | Author-side PR iteration loop |
| review-pr-loop | skill | Claude, Codex | Reviewer-side PR iteration loop |
| codex-adversarial-pr-review | skill | Claude, Codex | Post /codex:adversarial-review findings as a batched GitHub PR review (inline + out-of-diff rollup) |
| continuous-learning | skill | Codex | End-of-task retrospective: extract reusable, verified learnings as Codex skills |
| cmux-search | skill | Claude, Codex | Search all open cmux workspaces/tabs/panes - live scrollback + agent transcripts |
| macos-sparkle-update-quarantine-relaunch | skill | Claude, Codex | Sparkle updater error 4005 / 'Failed to create installation cache directory' persists after stripping quarantine; relaunch the un-quarantined bundle |
| cmux-agent-tabs | skill | Claude, Codex | Make AI agents show as watchable cmux tabs; Claude needs the claude-teams wrapper, Codex via codex-teams/hooks |
| cmux-autoresume-after-reboot | skill | Claude, Codex | Why cmux does not resume agent sessions after a macOS reboot despite autoResumeAgentSessions |
| python-ast-static-analyzer-scoping | skill | Claude, Codex | Build a Python ast analyzer: import-alias resolution + load-time vs deferred scoping |
| wordpress-com-publish | skill | Claude, Codex | Acquire a WordPress.com OAuth2 token (authorization-code flow) and publish/update posts |
| git-graft-worktree-onto-remote | skill | Claude, Codex | Graft a local worktree's commits onto a remote branch without re-cloning |
| multi-phase-feature-pr-worktrees | skill | Claude, Codex | Run a multi-phase feature as stacked worktree PRs, each reviewed independently |
| gist-to-repo-migration | skill | Claude, Codex | Migrate a gist's full revision history into a real git repo |
| neon-vercel-db-identify-and-migrate | skill | Claude, Codex | Identify which Neon project backs a Vercel app and migrate/split it; safe non-destructive cutover |
| claudeception | skill | Claude | Continuous-learning meta-skill: procedures become catalog skills via PR; specifics go to memory (local or shared vault) |
| claude-code-codex-plugin-parity | skill | Claude, Codex | Port a Claude Code plugin to the Codex CLI (or back); where the two systems match vs diverge |
| claude-code-plugin-from-existing-repo | skill | Claude, Codex | Convert a repo that ships CC commands/hooks (manual copy-in) into an installable plugin |
| claude-code-plugin-python-bootstrap | skill | Claude, Codex | Bootstrap Python deps from a CC plugin hook so /plugin install is one-click (PEP 668-safe) |
| claude-code-plugin-update-flow | skill | Claude, Codex | Update a CC plugin via /plugin marketplace update + /reload-plugins, not the picker /plugin update |
| claude-code-plugin-publish-anthropic-marketplace | skill | Claude, Codex | Publish a CC plugin to Anthropic's marketplace, plus the pre-submission validation pass |
| claude-json-mcp-migration-slice | skill | Claude, Codex | The exact ~/.claude.json slice that carries MCP config for migration vs session bookkeeping |
| playwright-mcp-upload-hidden-file-input | skill | Claude, Codex | Upload to a hidden <input type=file> via Playwright MCP (unhide+tag, upload, verify via CDN URL) |
| agent-team-orchestration | skill | Claude, Codex | Run a team of agents over a repo's open issues: architect plans the parallel set, per-issue squads (dev + adversarial reviewer + SDET + productivity engineer), each individually watchable |
| istio-multicluster-endpointless-mesh-service | skill | Claude, Codex | Istio multi-cluster endpoint-less away-Service: use a decoy selector (not an omitted one) so an EndpointSlice anchor exists for the mesh to merge remote endpoints into; for cross-region write-routing / home-away Service topologies |
| pre-open-source-credential-audit | skill | Claude, Codex | Audit a git repo for leaked secrets before making it public: scan tracked files AND full history, avoid the git grep -E word-boundary false-negative, catch tracked editor-backup files, decide rewrite+rotate vs. accept an inert identifier |
| terraform-state-version-apply-forensics | skill | Claude, Codex | Prove a terraform change really was applied to an env: census versioned S3 tfstate objects (serial + resource-type counts) + cross-check CloudTrail; separates a real apply from a reverted one, identifies which variant of a stacked change ran, and tells untracked orphans from failed destroys |
| terraform-ecs-capacity-provider-staged-teardown | skill | Claude, Codex | Tear down an ECS-on-EC2 capacity-provider stack when one apply deadlocks on ResourceInUseException: destroy order is reverse-dependency, so compute tears down before the workload; split into two sequential untargeted applies, workload first |
| gh-pr-merge-delete-branch-closes-dependent-pr | skill | Claude, Codex | Stacked PRs: merging the upstream PR with branch deletion auto-CLOSES the dependent PR instead of retargeting it, and gh pr reopen then fails because the base ref is gone; recover by recreating the ref, or prevent by retargeting downstream PRs first |
skillz plugin |
plugin | Claude, Codex | Full repo bundle: every skill |
pr-loop plugin |
plugin | Claude, Codex | Paired author + reviewer PR-loop skills |
work-on-pr plugin |
plugin | Claude, Codex | Single-skill plugin: work-on-pr |
review-pr-loop plugin |
plugin | Claude, Codex | Single-skill plugin: review-pr-loop |
cmux-search plugin |
plugin | Claude, Codex | Single-skill plugin: search all open cmux panes |
cmux-agent-tabs plugin |
plugin | Claude, Codex | Single-skill plugin: cmux-agent-tabs |
python-ast-static-analyzer-scoping plugin |
plugin | Claude, Codex | Single-skill plugin: python-ast-static-analyzer-scoping |
wordpress-com-publish plugin |
plugin | Claude, Codex | Single-skill plugin: WordPress.com token + publish |
git-graft-worktree-onto-remote plugin |
plugin | Claude, Codex | Single-skill plugin: git-graft-worktree-onto-remote |
multi-phase-feature-pr-worktrees plugin |
plugin | Claude, Codex | Single-skill plugin: multi-phase-feature-pr-worktrees |
gist-to-repo-migration plugin |
plugin | Claude, Codex | Single-skill plugin: gist-to-repo-migration |
neon-vercel-db-identify-and-migrate plugin |
plugin | Claude, Codex | Single-skill plugin: neon-vercel-db-identify-and-migrate |
claude-code-codex-plugin-parity plugin |
plugin | Claude, Codex | Single-skill plugin: claude-code-codex-plugin-parity |
claude-code-plugin-from-existing-repo plugin |
plugin | Claude, Codex | Single-skill plugin: claude-code-plugin-from-existing-repo |
claude-code-plugin-python-bootstrap plugin |
plugin | Claude, Codex | Single-skill plugin: claude-code-plugin-python-bootstrap |
claude-code-plugin-update-flow plugin |
plugin | Claude, Codex | Single-skill plugin: claude-code-plugin-update-flow |
claude-json-mcp-migration-slice plugin |
plugin | Claude, Codex | Single-skill plugin: claude-json-mcp-migration-slice |
continuous-learning plugin |
plugin | Codex | Single-skill plugin (no hooks) |
playwright-mcp-upload-hidden-file-input plugin |
plugin | Claude, Codex | Single-skill plugin: playwright-mcp-upload-hidden-file-input |
codex-continuous-learning plugin |
plugin | Codex | continuous-learning skill plus UserPromptSubmit + Stop hooks |
agent-team-orchestration plugin |
plugin | Claude, Codex | Single-skill plugin: agent-team-orchestration |
istio-multicluster-endpointless-mesh-service plugin |
plugin | Claude, Codex | Single-skill plugin: istio-multicluster-endpointless-mesh-service |
pre-open-source-credential-audit plugin |
plugin | Claude, Codex | Single-skill plugin: pre-open-source-credential-audit |
terraform-state-version-apply-forensics plugin |
plugin | Claude, Codex | Single-skill plugin: terraform-state-version-apply-forensics |
terraform-ecs-capacity-provider-staged-teardown plugin |
plugin | Claude, Codex | Single-skill plugin: terraform-ecs-capacity-provider-staged-teardown |
gh-pr-merge-delete-branch-closes-dependent-pr plugin |
plugin | Claude, Codex | Single-skill plugin: gh-pr-merge-delete-branch-closes-dependent-pr |
codex-adversarial-pr-review plugin |
plugin | Claude, Codex | Single-skill plugin: codex-adversarial-pr-review |
| pr-loop | collection (legacy) | Claude, Codex | install.sh selector. Prefer the pr-loop plugin entry. |
Machine-readable index: catalog.json. The
installer and validation script both read from it, so new entries
land in the docs and tooling at the same time.
catalog.json # machine-readable catalog index
collections/
pr-loop.json # legacy install.sh selector (kept for backcompat)
skills/ # canonical skill content
work-on-pr/SKILL.md
review-pr-loop/SKILL.md
continuous-learning/SKILL.md
cmux-search/SKILL.md
gh-git-heredoc-body-file/SKILL.md
claude-code-static-allow-bypasses-hook/SKILL.md
python-ast-static-analyzer-scoping/SKILL.md
wordpress-com-publish/SKILL.md
git-add-u-rename-pitfall/SKILL.md
git-branch-cleanup-script-races/SKILL.md
git-graft-worktree-onto-remote/SKILL.md
multi-phase-feature-pr-worktrees/SKILL.md
gist-to-repo-migration/SKILL.md
vercel-token-deploy-branch-domains/SKILL.md
s3-presigned-upload-fails-nonexistent-bucket/SKILL.md
neon-vercel-db-identify-and-migrate/SKILL.md
gh-api-f-vs-F-body-file/SKILL.md
gh-api-jq-no-arg/SKILL.md
gh-fork-issues-disabled/SKILL.md
gh-pr-graphql-401-rest-fallback/SKILL.md
gh-pr-merge-delete-branch-closes-dependent-pr/SKILL.md
gh-workflow-run-matching/SKILL.md
github-api-list-endpoint-staleness-fresh-pr/SKILL.md
github-closing-keywords-default-branch-only/SKILL.md
github-private-repo-readme-image-rendering/SKILL.md
claude-code-claudemd-symlink-write-refused/SKILL.md
claude-code-codex-plugin-parity/SKILL.md
claude-code-piebald-lsp-binary-on-path/SKILL.md
claude-code-plugin-from-existing-repo/SKILL.md
claude-code-plugin-python-bootstrap/SKILL.md
claude-code-plugin-update-flow/SKILL.md
claude-json-mcp-migration-slice/SKILL.md
macos-bash-3.2-compat/SKILL.md
emacs-batch-package-verify-pitfalls/SKILL.md
python-symtable-no-col-offset-pairing/SKILL.md
.claude-plugin/
marketplace.json # Claude Code marketplace (lists all plugin entries)
.codex-plugin/
marketplace.json # Codex marketplace (lists all plugin entries)
plugins/ # per-plugin manifests + skill symlinks
skillz/ # full bundle (per-host skill dirs)
.claude-plugin/plugin.json # "skills": "./skills-claude/"
.codex-plugin/plugin.json # "skills": "./skills-codex/"
skills-claude/ # every claude-hosted skill (excludes continuous-learning, codex-only)
work-on-pr -> ../../../skills/work-on-pr
claudeception -> ../../../skills/claudeception
... # symlink per claude-hosted catalog skill
skills-codex/ # every codex-hosted skill (excludes claudeception, claude-only)
work-on-pr -> ../../../skills/work-on-pr
continuous-learning -> ../../../skills/continuous-learning
... # symlink per codex-hosted catalog skill
pr-loop/ # work-on-pr + review-pr-loop only
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/
work-on-pr -> ../../../skills/work-on-pr
review-pr-loop -> ../../../skills/review-pr-loop
work-on-pr/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/work-on-pr -> ../../../skills/work-on-pr
review-pr-loop/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/review-pr-loop -> ../../../skills/review-pr-loop
cmux-search/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/cmux-search -> ../../../skills/cmux-search
gh-git-heredoc-body-file/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/gh-git-heredoc-body-file -> ../../../skills/gh-git-heredoc-body-file
claude-code-static-allow-bypasses-hook/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/claude-code-static-allow-bypasses-hook -> ../../../skills/claude-code-static-allow-bypasses-hook
python-ast-static-analyzer-scoping/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/python-ast-static-analyzer-scoping -> ../../../skills/python-ast-static-analyzer-scoping
wordpress-com-publish/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/wordpress-com-publish -> ../../../skills/wordpress-com-publish
git-add-u-rename-pitfall/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/git-add-u-rename-pitfall -> ../../../skills/git-add-u-rename-pitfall
git-branch-cleanup-script-races/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/git-branch-cleanup-script-races -> ../../../skills/git-branch-cleanup-script-races
git-graft-worktree-onto-remote/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/git-graft-worktree-onto-remote -> ../../../skills/git-graft-worktree-onto-remote
multi-phase-feature-pr-worktrees/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/multi-phase-feature-pr-worktrees -> ../../../skills/multi-phase-feature-pr-worktrees
gist-to-repo-migration/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/gist-to-repo-migration -> ../../../skills/gist-to-repo-migration
vercel-token-deploy-branch-domains/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/vercel-token-deploy-branch-domains -> ../../../skills/vercel-token-deploy-branch-domains
s3-presigned-upload-fails-nonexistent-bucket/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/s3-presigned-upload-fails-nonexistent-bucket -> ../../../skills/s3-presigned-upload-fails-nonexistent-bucket
neon-vercel-db-identify-and-migrate/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/neon-vercel-db-identify-and-migrate -> ../../../skills/neon-vercel-db-identify-and-migrate
gh-api-f-vs-F-body-file/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/gh-api-f-vs-F-body-file -> ../../../skills/gh-api-f-vs-F-body-file
gh-api-jq-no-arg/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/gh-api-jq-no-arg -> ../../../skills/gh-api-jq-no-arg
gh-fork-issues-disabled/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/gh-fork-issues-disabled -> ../../../skills/gh-fork-issues-disabled
gh-pr-graphql-401-rest-fallback/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/gh-pr-graphql-401-rest-fallback -> ../../../skills/gh-pr-graphql-401-rest-fallback
gh-pr-merge-delete-branch-closes-dependent-pr/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/gh-pr-merge-delete-branch-closes-dependent-pr -> ../../../skills/gh-pr-merge-delete-branch-closes-dependent-pr
gh-workflow-run-matching/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/gh-workflow-run-matching -> ../../../skills/gh-workflow-run-matching
github-api-list-endpoint-staleness-fresh-pr/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/github-api-list-endpoint-staleness-fresh-pr -> ../../../skills/github-api-list-endpoint-staleness-fresh-pr
github-closing-keywords-default-branch-only/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/github-closing-keywords-default-branch-only -> ../../../skills/github-closing-keywords-default-branch-only
github-private-repo-readme-image-rendering/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/github-private-repo-readme-image-rendering -> ../../../skills/github-private-repo-readme-image-rendering
claude-code-claudemd-symlink-write-refused/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/claude-code-claudemd-symlink-write-refused -> ../../../skills/claude-code-claudemd-symlink-write-refused
claude-code-codex-plugin-parity/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/claude-code-codex-plugin-parity -> ../../../skills/claude-code-codex-plugin-parity
claude-code-piebald-lsp-binary-on-path/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/claude-code-piebald-lsp-binary-on-path -> ../../../skills/claude-code-piebald-lsp-binary-on-path
claude-code-plugin-from-existing-repo/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/claude-code-plugin-from-existing-repo -> ../../../skills/claude-code-plugin-from-existing-repo
claude-code-plugin-python-bootstrap/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/claude-code-plugin-python-bootstrap -> ../../../skills/claude-code-plugin-python-bootstrap
claude-code-plugin-update-flow/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/claude-code-plugin-update-flow -> ../../../skills/claude-code-plugin-update-flow
claude-json-mcp-migration-slice/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/claude-json-mcp-migration-slice -> ../../../skills/claude-json-mcp-migration-slice
macos-bash-3.2-compat/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/macos-bash-3.2-compat -> ../../../skills/macos-bash-3.2-compat
emacs-batch-package-verify-pitfalls/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/emacs-batch-package-verify-pitfalls -> ../../../skills/emacs-batch-package-verify-pitfalls
python-symtable-no-col-offset-pairing/ # single-skill plugin
.claude-plugin/plugin.json
.codex-plugin/plugin.json
skills/python-symtable-no-col-offset-pairing -> ../../../skills/python-symtable-no-col-offset-pairing
continuous-learning/ # Codex-only single-skill plugin (no hooks)
.codex-plugin/plugin.json
skills/continuous-learning -> ../../../skills/continuous-learning
codex-continuous-learning/ # Codex skill + hooks bundle
.codex-plugin/plugin.json
skills/continuous-learning -> ../../../skills/continuous-learning
hooks/
hooks.json
continuous_learning_prompt.py
continuous_learning_stop.py
install.sh # catalog-driven installer (legacy / fallback)
scripts/
validate-catalog.sh # CI/local catalog validation
README.md
Each plugins/<name>/skills/<skill> is a symlink back to the
canonical skills/<skill>/, so every plugin reads from a single
source of truth. The root .claude-plugin/marketplace.json and
.codex-plugin/marketplace.json enumerate every plugin entry so
hosts can offer them individually in /plugin install.
This repo replaced gist 5f606018eb36a75dc292016268f08e7c. The full
gist revision history was imported as the first 13 commits on
master and the gist now redirects here.
The marketplace exposes every plugin entry individually, so you can install exactly the subset you want. From inside Claude Code:
/plugin marketplace add voitta-ai/skillz
# Full bundle (every skill):
/plugin install skillz@skillz
# Author + reviewer PR-loop pair:
/plugin install pr-loop@skillz
# Single-skill plugins:
/plugin install work-on-pr@skillz
/plugin install review-pr-loop@skillz
Each plugin's skills/ directory is a set of symlinks back to
skills/<name>/, so installing one plugin does not duplicate skill
content on disk.
If you previously installed via install.sh --target claude,
remove the old copies to avoid duplicates:
rm -rf ~/.claude/skills/work-on-pr ~/.claude/skills/review-pr-loopRequires Codex CLI 0.117.0 or newer. Check with codex --version.
From any shell, add this repo as a Codex marketplace:
codex plugin marketplace add voitta-ai/skillzThen open Codex's plugin browser and install whichever plugin entry
you want from the skillz marketplace — same set as Claude Code,
plus two Codex-only entries:
/plugins
skillz— full bundle (host-aware: the Claude manifest loadsskills-claude/, the Codex manifest loadsskills-codex/, so a claude-only skill likeclaudeceptionnever lands in a Codex install and a codex-only skill likecontinuous-learningnever lands in a Claude install)pr-loop— work-on-pr + review-pr-loopwork-on-pr— single skillreview-pr-loop— single skillcontinuous-learning— single skill, no hookscodex-continuous-learning— skill + UserPromptSubmit/Stop hooks
From a local checkout, point Codex at the repo root instead:
codex plugin marketplace add /absolute/path/to/skillzIf you add a local checkout, keep that checkout up to date yourself
with git pull in the clone.
Remove old direct-copy installs after switching:
rm -rf ~/.codex/skills/work-on-pr ~/.codex/skills/review-pr-loopinstall.sh predates the per-plugin marketplace entries above. Use
it when the plugin path is unavailable (older Codex, locked Claude
Code config, sandboxed environment) or when you want to drop skills
directly into ~/.claude/skills/ / ~/.codex/skills/ without going
through /plugin.
# Default: install the pr-loop collection (work-on-pr + review-pr-loop)
bash <(curl -sL https://raw.githubusercontent.com/voitta-ai/skillz/master/install.sh)
# Single skill
bash <(curl -sL https://raw.githubusercontent.com/voitta-ai/skillz/master/install.sh) -- --skill work-on-pr
# Named collection
bash <(curl -sL https://raw.githubusercontent.com/voitta-ai/skillz/master/install.sh) -- --collection pr-loop
# Everything in the catalog
bash <(curl -sL https://raw.githubusercontent.com/voitta-ai/skillz/master/install.sh) -- --all
# Force a target host
bash <(curl -sL https://raw.githubusercontent.com/voitta-ai/skillz/master/install.sh) -- --target codex
bash <(curl -sL https://raw.githubusercontent.com/voitta-ai/skillz/master/install.sh) -- --target claude
bash <(curl -sL https://raw.githubusercontent.com/voitta-ai/skillz/master/install.sh) -- --target both
# Dry-run shows what would happen without writing anything
bash <(curl -sL https://raw.githubusercontent.com/voitta-ai/skillz/master/install.sh) -- --all --dry-run--skill and --collection are repeatable. --target accepts
auto (default), codex, claude, or both. Override the
destination directly with SKILLS_DEST_ROOT. CODEX_HOME and
CLAUDE_SKILLS_DIR are honored.
From a clone:
git clone https://github.com/voitta-ai/skillz.git /tmp/skillz
/tmp/skillz/install.sh --target both --collection pr-loopBackward compatibility: invoking install.sh with no selection
flags installs the pr-loop collection, matching the prior default.
This repo previously lived at
debedb/skillz. It has moved
to voitta-ai/skillz.
GitHub redirects the old URL indefinitely (until the
debedb/skillz name is reused), so existing installs continue to
work without changes. The notes below cover the few cases where a
manual switch is worth doing.
Script install (install.sh). Re-run the curl one-liner
against the new raw URL — it overwrites in place, same skill paths,
no orphan files:
bash <(curl -sL https://raw.githubusercontent.com/voitta-ai/skillz/master/install.sh)The old debedb URL still resolves via the GitHub redirect, so
nothing breaks if you keep using it; the new URL is just the
canonical one going forward.
Claude Code plugin. The redirect also covers /plugin marketplace add / /plugin update, so existing installs keep
updating from the renamed repo automatically. To switch the
marketplace entry to the new owner explicitly:
/plugin uninstall skillz@skillz
/plugin marketplace remove skillz
/plugin marketplace add voitta-ai/skillz
/plugin install skillz@skillz
Codex plugin. Same pattern — the marketplace source URL redirects, so existing installs keep working. To switch the configured marketplace entry to the new owner explicitly:
codex plugin marketplace remove skillz
codex plugin marketplace add voitta-ai/skillzThen reopen /plugins, select the skillz marketplace, and
reinstall or update the same plugin entry you were already using.
This section will be removed once the rename has aged enough that nobody is hitting the old URL anymore — see #22.
catalog.json is the single source of truth for
what the repo ships. It lists:
- Every skill (
name,path, supportedhosts, one-line summary). - Every collection (
name, member skill names, optional path to a per-collection JSON file). - Plugin bundles (
name, paths to host manifests). - A default for the no-arg install (currently
pr-loop).
install.sh parses this file at runtime. Adding a new skill is a
two-file change: drop in skills/<name>/SKILL.md and add an entry
under skills in catalog.json. No installer edits required.
- Claude Code plugin:
/plugin update(or/plugin marketplace update skillz) re-fetchesmasterfrom this repo. - Codex plugin (GitHub marketplace source): open
/plugins, selectskillz, run the update action. - Codex plugin (local checkout source):
git pullinside the checkout you added, then reopen/pluginsif needed. - Script: re-run the curl one-liner, or
git pull && ./install.shfrom a clone.
Plugin install (Claude Code):
/plugin list
Plugin install (Codex):
/plugins
Script install:
ls ~/.codex/skills/work-on-pr/SKILL.md ~/.codex/skills/review-pr-loop/SKILL.md
ls ~/.claude/skills/work-on-pr/SKILL.md ~/.claude/skills/review-pr-loop/SKILL.mdCheck only the host(s) you actually use.
Collections are an install.sh-only concept; Claude Code and Codex
do not have a native notion of "collection." New work should use
the equivalent plugin entries (e.g. install pr-loop@skillz via
/plugin install). Collections remain documented here for users
still on the script install path.
Paired skills that drive the iterative back-and-forth of a GitHub pull request review cycle. Install as one unit via:
./install.sh --collection pr-loopThe same pairing is also available as the pr-loop plugin entry —
/plugin install pr-loop@skillz is the preferred path on Claude
Code and on Codex CLI ≥ 0.117.
The two skills:
- work-on-pr (SKILL.md):
author-side loop. Watches for new review comments, issue comments,
and inline threads; waits when feedback has not landed; addresses
each in a worktree; runs tests; commits; pushes; replies with the
commit SHA. Also accepts an issue reference and creates the PR if
one does not yet exist (ensuring
Closes #<issue>is in the body). - review-pr-loop (SKILL.md): reviewer-side loop. Each round re-reads the linked issue(s) and all prior reviews, issue comments, and inline threads before reviewing only the new diff or the author's latest response. Leaves structured feedback (REQUEST_CHANGES, COMMENT, APPROVE) and continues until approved, merged, or closed.
Each skill owns the watch loop. Every pass should surface which watch mode is active:
watch-mode=durable: a realScheduleWakeup-style continuation was scheduled and survives turn end.watch-mode=in-process-only: no durable wake-up exists, so the current invocation must stay alive withsleep+ re-poll.
Invoking before comments exist is expected, and an idle poll is not
completion. In-process polling only works while the current
invocation stays alive; a terminal/final handoff ends it.
watch stopped:* is only valid when the invocation is actually
ending, not on an ordinary idle pass.
Usage:
/work-on-pr <N> # author side (or pass an issue ref to start a PR)
/review-pr-loop <N> # reviewer side
The author-side loop pushes commits, posts comments, and replies to
review threads several rounds per PR. Without the right
permissions.allow patterns in ~/.claude/settings.json, Claude
Code prompts for each write every round and the loop stalls.
The recommended allow block lives in
skills/work-on-pr/SKILL.md, under
"Auto-approved operations (self-PR workflow)". Two pitfalls worth
calling out up front:
- Never chain
cd <worktree> && git .... Claude Code matches each allow entry against the full command string. The compound starts withcd, so a pattern likeBash(git push origin feature/*)does not fire even though the second segment would match on its own. The host's Bash-tool docs say this explicitly: "never prependcd <current-directory>to agitcommand — the compound triggers a permission prompt." Usegit -C <worktree-path> <subcommand>instead, and add the matchingBash(git -C * <subcommand>:*)entries from the SKILL's allow block. The same rule applies to chains likegit -C X commit ... && git -C X push ...— issue them as separate Bash tool calls, not a single&&string. python3 -c "<inline>"does not auto-allow. Read-only introspection likecat ~/.claude/settings.json | python3 -c "<parse>"still prompts because Claude Code (and the YOLT hook, where installed) treats an inline-cscript as opaque. Pull the snippet into a real.pyfile and invokepython3 path/to/script.pyto make it analyzable, or accept the one-off prompt.
See skills/work-on-pr/SKILL.md → "Auto-approved operations" for
the full pattern list and the rationale behind every entry that is
intentionally NOT auto-approved (git push origin master,
git push --force, gh repo delete, etc.).
A Codex-native counterpart of
Claudeception. Bundles the
continuous-learning skill
with two Codex hooks:
- UserPromptSubmit — injects a one-line reminder that any reusable, verified learning from this turn should be captured before exit.
- Stop — forces a brief end-of-task retrospective. The agent
either invokes
continuous-learningand acts on its output, or emits the literal lineNo reusable learning.and exits.
Design intent: capture only learnings that pass four retrospective
gates (real discovery cost, recurrence likelihood, verifiable
trigger, verified result). Most turns terminate with
No reusable learning. — that escape hatch is the point. See the
skill for the full policy and skill-shape requirements.
Layout:
plugins/codex-continuous-learning/
.codex-plugin/plugin.json # Codex plugin manifest
skills/continuous-learning -> ../../../skills/continuous-learning
hooks/
hooks.json # UserPromptSubmit + Stop wiring
continuous_learning_prompt.py # UserPromptSubmit hook
continuous_learning_stop.py # Stop hook
The skills/continuous-learning directory inside the plugin is a
relative symlink to the canonical
skills/continuous-learning/ at the
repo root, so the bundle stays a single source of truth.
Hook scripts are dependency-free Python (python3 only, no
third-party imports, no filesystem writes, no network) and both fail
open via on_error: ignore in hooks.json. A hook crash never
breaks the user's session.
This bundle is Codex-only and not exposed via the Claude Code
plugin or the pr-loop collection. Claude Code users who want
similar end-of-task behavior should install Claudeception directly.
Install (when supported by the local Codex CLI):
/plugins
# add this repo as a marketplace source, then install
# codex-continuous-learning
Or, from a clone, point Codex at plugins/codex-continuous-learning/
as a local plugin folder.
./scripts/validate-catalog.shThe script:
- Confirms every catalog-referenced skill path exists.
- Confirms every
SKILL.mdopens with YAML frontmatter containingname:anddescription:. - Confirms every collection references only known skills.
- Confirms plugin-manifest paths declared in
catalog.jsonexist. - Runs
install.sh --dry-runfor the no-arg default,--collection pr-loop,--skill work-on-pr, and--all.
Run it before opening a PR that touches the catalog or installer.
When a skill is authored on a client / day-job machine and promoted here, its
SKILL.md (and any shipped code) can leak content the public repo must never
carry — account IDs, keys/tokens, client names, internal domains, infra
topology. Run the gate before opening the PR:
./scripts/check-sensitive-terms.sh skills/<new-skill>/It greps for structural leaks that are safe to enumerate publicly (AWS
account-id / access-key shapes, Slack xox*/xapp- and GitHub/OpenAI/Google
token shapes, PRIVATE KEY blocks, RFC-1918 IPs, .internal/.corp domains)
and exits non-zero on any hit.
Client/account names can't live in a denylist in this public repo, so the
script reads them from a private, out-of-repo wordlist — one term per line,
blank lines and # comments ignored, each term matched case-insensitively
(names get written Foo, foo, and FOO). It defaults to
~/.config/skillz/sensitive-terms.txt, so once that file exists the name
check runs with no flags:
mkdir -p ~/.config/skillz
cat >> ~/.config/skillz/sensitive-terms.txt <<'EOF'
# employer / client names, internal repo + service prefixes
EOF
./scripts/check-sensitive-terms.sh skills/<new-skill>/Point SKILLZ_SENSITIVE_TERMS_FILE elsewhere to override the default. If it
is set to a path that doesn't exist the script exits 2 rather than quietly
downgrading to structural-only — a typo'd path should fail loudly, not look
clean.
Without a wordlist you get structural checks only, and the script says so. That is the expected state for anyone outside the org: the names that matter are exactly the ones this repo must not carry.
Clean exit = safe to promote. This is the automated form of the hard rule "the public repo must never contain account IDs, client names, domains, or infra topology" — make it a step in the claudeception / skill-promotion flow.
Both gates run automatically, split across two places because one of them cannot run in public CI.
CI (.github/workflows/checks.yml) — on every pull request and every push
to master:
bash scripts/validate-catalog.sh
bash scripts/check-sensitive-terms.sh skills/ docs/ plugins/ README.md catalog.jsonAdvisory: it reports pass/fail on the PR but nothing is a required check yet.
Neither script needs network — install.sh reads the local catalog.json
when run from a checkout, so the dry-run smoke test validates that PR's
catalog rather than master's.
Pre-push hook (hooks/pre-push) — enable it per clone with git's own
hooks path:
git config core.hooksPath hooksOne command, no installer, and the hook updates itself when you pull. Skip a
run deliberately with git push --no-verify.
The hook exists because the sensitive-term gate has two halves and CI can only do one. The structural half (key/token/account-id shapes, private IPs, internal-domain hostnames) runs fine in Actions. The name half reads a wordlist that must stay out of this public repo — and an Actions secret would not reach fork PRs, so the job would report green without having checked anything. A check that silently no-ops is worse than no check. Names are therefore enforced pre-push, on the machine where the wordlist already lives.
The pr-loop collection operates at the workflow layer — when to
review, how often, what to compare against across rounds. Several
other projects address the content layer (what to say in a
single review) and are complementary, not competing. They can be
stacked: review-pr-loop driving the cycle while internally invoking
a formatter and/or an adversarial subagent per round.
| Feature | caveman-review | ce-adversarial-reviewer | claudskills adversarial-review | voitta-ai/skillz review-pr-loop |
|---|---|---|---|---|
| Type | Skill | Agent (subagent) | Skill | Skill (paired with work-on-pr) |
| Job | Compress review prose | Chaos-engineer failure scenarios | PASS/FAIL adversarial verdict | Drive multi-round PR review loop |
| Adversarial methodology | No (format only) | Yes (4 techniques) | Yes (claimed) | No — orchestration, not methodology |
| Verdict | None | Advisory findings | Binary PASS/FAIL | REQUEST_CHANGES / COMMENT / APPROVE |
| Confidence calibration | No | Anchored 100/75/50/25 | Anchoring-bias prevention | N/A |
| Scope discipline | Reviews only | Defers to 8 siblings | Standalone | Owns whole review cycle |
| Single-shot vs iterative | Single | Single | Single | Iterative — re-reads issue, prior threads, only-new-diff each round |
| Output | PR-paste comments | Structured JSON | Unknown | GitHub PR review (via gh) + commit replies |
| State across rounds | None | None | None | Yes — tracks addressed vs new, waits when quiet |
| Conditional trigger | Manual | Auto (size / risk) | Manual | Manual (/review-pr-loop N) |
| Exit conditions | N/A (one-shot) | N/A | N/A | Approve, merge, close, user stop |
| Polling discipline | N/A | N/A | N/A | Paced against prompt-cache TTL, ScheduleWakeup-aware |
| Host targets | Claude Code | Claude Code | Claude Code (+ Pro app) | Claude Code + Codex |
| Orchestration | Standalone | Part of /ce-code-review fleet |
Standalone | Paired with work-on-pr (author side) |
See also: claudskills registry,
Anthropic Claude Code skills docs,
vercel-labs/skills (upstream
profile catalog used by npx skills add).
The skills here are the workflow layer. They compose with
subagents, Agent Teams, and the Agent SDK rather than competing with
them. docs/pr-review-workflow.md
writes that down: which layer does which job, the rule that subagents
cannot spawn subagents (so review-pr-loop must run in the main
session when it delegates a specialist sweep), how to use PR Review
Toolkit agents as advisory-only subagents, when an Agent Team is worth
the overhead, the SDK boundary, and the same-identity reviewer caveat.