browser-validator
Automatically validate implementations in real browsers after code is written or when user says "test this", "test what you built in the browser", "check it in…
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. Handles DDEV isolation automatically (folder-derived project name, no pinned ports)
$ npx -y skills add kanopi/cms-cultivator --skill worktree-manager --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/worktree-managerContext preview
The summary Claude sees to decide when to auto-load this skill.
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. Handles DDEV isolation automatically (folder-derived project name, no pinned ports)
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. 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-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 (e.g. `tw1234`).
Branch (unchanged from Kanopi standards):
<type>/tw<ticketID>-<short-desc> # feature/tw1234-hero-block # bug/tw1235-menu-fix # hotfix/tw1236-login-error
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 to mirror the branch:
<repo>/ # main clone, stays on main <repo>-tw1234/ # worktree for feature/tw1234-hero-block <repo>-tw1235/ # worktree for bug/tw1235-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.
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** — ticket ID, short description (kebab-case, ≤4 words), type (default `feature`), base branch (default `main`). 2. **Sync base** so the worktree starts current:
git fetch origin
3. **Create the worktree + branch** off the up-to-date remote base:
git worktree add ../<repo>-tw<id> -b <type>/tw<id>-<short-desc> origin/<base>
If the branch already exists (resuming work), omit `-b`:
git worktree add ../<repo>-tw<id> <type>/tw<id>-<short-desc>
4. **Run platform setup** — see Platform Notes below. 5. **Report** the directory path, branch name, and (for DDEV projects) the local URL from `ddev describe`, plus the Tier 1 instructions for attaching a CLI or Desktop session.
DDEV isolation is automatic when the project name is folder-derived — i.e. `name:` is omitted from `.ddev/config.yaml`, so DDEV uses the directory name. Each worktree then gets its own hostname, database, and auto-assigned host ports, and the shared router keeps them from colliding. This is DDEV's documented recommendation for worktrees.
If a project still commits a `name:` (or pins host ports), the second worktree will collide when it runs `ddev start`. Don't try to fix that repo-wide as part of this skill — surface the collision clearly and let the developer resolve it in their own config when they hit it. The quick local fix is a gitignored `config.local.yaml` in the worktree with a unique `name:`; the cleaner long-term fix is dropping the committed `name:` line on that project, but that's the team's call, not this skill's.
Setup inside the new worktree:
cd ../<repo>-tw<id> ddev start ddev composer install ddev theme-install # WP/Drupal theme deps + build ddev db-refresh # each worktree gets its own DB
> Cost note: a worktree starts with an empty database, so it needs its own `ddev db-refresh` (or an imported snapshot). `vendor/` and `node_modules/` are directory-local, so they install per worktree — isolation by design, at the cost of disk + setup time.
On push, CircleCI spins up a per-branch Pantheon multidev, so each worktree's branch also gets its own remote preview without extra steps.
No DDEV. Create the worktree, then install and run the dev server on a distinct port:
cd ../<repo>-tw<id> npm install npm run dev -- -p 3001 # use a different port per parallel worktree
If platform is ambiguous (no `.ddev/`, no `next.config.*`), ask which platform is in scope before running setup.
**Confirmation gate:** state exactly what will be deleted (worktree directory, local branch if merged, DDEV project + database) and wait for explicit
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.
Repo: kanopi/cms-cultivator
Automatically validate implementations in real browsers after code is written or when user says "test this", "test what you built in the browser", "check it in…
Run the right linting, formatting, and static-analysis commands after changing code, and check it against PHPCS, ESLint, WordPress Coding Standards, or Drupal…
Automatically generate conventional commit messages when user has staged changes and mentions committing. Analyzes git diff and status to create properly…
Generate and maintain patches for Composer-installed packages (Drupal contrib modules, WordPress packages, PHP libraries) using cweagans/composer-patches.…
Automatically analyze test coverage when user asks which code is tested, mentions coverage gaps, or shows code asking about testing. Identifies untested code…
Deterministic cleanup of DDEV and Docker disk usage on OrbStack, Docker Desktop, or any Docker provider. Safely reclaims space by removing orphaned Docker…