browser-validator
Automatically validate implementations in real browsers after code is written or when user says "test this", "test what you built…
Create, list, and tear down git worktrees following Kanopi's branch naming conventions so developers and agents can work multiple tickets in parallel without clobbering each other's working tree. Creates a new branch, or attaches a worktree to a branch that already exists
Claude Code
$ npx -y skills add kanopi/cms-cultivator --skill worktree-manager --agent claude-code
Codex
$ npx skills add kanopi/cms-cultivator --skill worktree-manager -a codex -y
Cursor
$ npx skills add kanopi/cms-cultivator --skill worktree-manager -a cursor -y
Gemini CLI
$ npx skills add kanopi/cms-cultivator --skill worktree-manager -a gemini-cli -y
GitHub Copilot
$ npx skills add kanopi/cms-cultivator --skill worktree-manager -a github-copilot -y
OpenCode
$ npx skills add kanopi/cms-cultivator --skill worktree-manager -a opencode -y
Windsurf
$ npx skills add kanopi/cms-cultivator --skill worktree-manager -a windsurf -y
name: worktree-manager description: Create, list, and tear down git worktrees following Kanopi's branch naming conventions so developers and agents can work multiple tickets in parallel without clobbering each other's working tree. Creates a new branch, or attaches a worktree to a branch that already exists locally or on origin. Handles DDEV isolation automatically (folder-derived project name, no pinned ports) for Drupal and WordPress, and plain worktree setup for Next.js. Invoke when the user wants to start a ticket in a fresh worktree, run more than one Claude Code or Claude Desktop session at once, says "create a worktree", "new worktree for tw1234", "spin up a parallel branch", "work on two tickets at once", "worktree for an existing branch", "check out this branch in a worktree", "pick up a teammate's branch", "resume a branch I already have", "/worktree-manager", or asks how to clean up a finished worktree. Use this skill even if the user only says "I need to work on another ticket without losing my current one."
Create and tear down git worktrees that follow Kanopi's branch conventions and stay isolated at the DDEV layer, so multiple tickets — and multiple AI sessions — can run side by side from a single clone.
A worktree checks out a second branch into its own directory while sharing one `.git`. That is the primitive that lets two Claude Code sessions (or one CLI session and one Claude Desktop "code" session) work different tickets at the same time without `git checkout` thrash or stepping on each other's files. It maps one-to-one onto Kanopi's "one branch per ticket" rule.
If the user gives a Teamwork URL or task ID, parse the numeric ID from it: `tw1234` and a Teamwork task URL both yield `1234`. Branch names use the bare number.
**Default branch.** Never assume `main` — many Kanopi repos use `master`. Resolve it once and use it wherever this skill says `<default-branch>`:
DEFAULT=$(gh repo view --json defaultBranchRef --jq .defaultBranchRef.name 2>/dev/null \ || git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')
`--branch` is mutually exclusive with `<short-desc>`, `--type`, and `--base` — all three exist only to *derive* a new branch name, and there is nothing to derive when the branch is given. If the user supplies both, use `--branch` and say in the report that the others were ignored.
Branch — Kanopi standard, the bare Teamwork ID with no `tw` prefix:
<type>/<ticketID>-<short-desc> # feature/1234-hero-block # bug/1235-menu-fix # hotfix/1236-login-error # devops/1237-add-ddev
Types: `feature`, `bug`, `hotfix`, `devops` (infrastructure, tooling, CI/CD, dev environment). `commit-message-generator` reads the `Refs:` footer from this shape, so keep it exact.
For a sub-task or dependent feature, use the **parent** task ID, matching the complex-feature parent/child model.
Worktree directory — a sibling of the main clone, named for the ticket. The directory keeps the `tw` prefix: it becomes the DDEV project name and hostname, where `tw` makes the ticket readable at a glance.
<repo>/ # main clone, stays on the default branch <repo>-tw1234/ # worktree for feature/1234-hero-block <repo>-tw1235/ # worktree for bug/1235-menu-fix
Keep worktrees as siblings (not nested inside the main clone) so build tooling, IDE indexers, and DDEV file mounts don't recurse into them.
`--branch` may point at a branch with no ticket ID in it — a colleague's branch, a long-lived `develop`, a branch that predates the convention. Resolve `<worktree-dir>` in this order:
1. `--dir` if the user gave one. 2. `<repo>-tw<id>` if a ticket ID was supplied, or the branch name carries one — `<type>/<digits>-…`, or the older `<type>/tw<digits>-…`:
ID=$(printf '%s' "$BRANCH" | sed -nE 's@^[a-z]+/(tw)?([0-9]+)-.*@\2@p')
3. Otherwise `<repo>-<branch-slug>`, where the slug lowercases the branch and collapses every run of non-alphanumeric characters to a single `-`:
SLUG=$(printf '%s' "$BRANCH" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | tr -s '-' | sed 's/^-//; s/-$//') # update/worktree-manager-existing-branch → update-worktree-manager-existing-branch # ../<repo>-update-worktree-manager-existing-branch
Prefer the ticket-ID form whenever one is available: the DDEV project name is folder-derived, so the directory name is what the developer will see in `ddev list` and type into teardown.
When `Bash`/git execution is unavailable, output the exact commands for the user to run, then explain how to point their environment at the new directory:
Run the steps directly, pausing at the confirmation gate for destructive actions.
1. **Resolve inputs.**
With `--branch`, that name is `BRANCH` verbatim — do not normalize it, do not add a `<type>/` prefix, do not correct its spelling to match the convention. Otherwise derive `BRANCH=<type>/<id>
Specialist agents and auto-invoked skills for Drupal/WordPress development. Works in Claude Code, Claude Desktop, and OpenAI Codex. Full documentation: What changed in 2.0? CMS Cultivator now focuses on CMS development workflows.
Automatically validate implementations in real browsers after code is written or when user says "test this", "test what you built…
Run the right linting, formatting, and static-analysis commands after changing code, and check it against PHPCS, ESLint,…
Automatically generate conventional commit messages when user has staged changes and mentions committing. Analyzes git diff and…
Generate and maintain patches for Composer-installed packages (Drupal contrib modules, WordPress packages, PHP libraries) using…
Automatically analyze test coverage when user asks which code is tested, mentions coverage gaps, or shows code asking about…
Deterministic cleanup of DDEV and Docker disk usage on OrbStack, Docker Desktop, or any Docker provider. Safely reclaims space by…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.