Shared AI assets for webhub GmbH — guidelines, Skills, and slash-commands used across our Laravel and Craft CMS projects, and uploaded to our claude.ai Team workspace.
cd into your dev directory first (~/reps, ~/code, whatever you use), then run:
[ -d ai ] || git clone https://github.com/webhubworks/ai.git && cd ai && git pull && ./bootstrap.shClones webhubworks/ai into the current directory if it isn't already there, pulls the latest, then runs bootstrap.sh to wire commands and guidelines into ~/.claude. Safe to re-run any time — it's the update path too.
ai/
├── bootstrap.sh # One-shot installer that links this repo into ~/.claude
├── guidelines/ # Plain-markdown guidelines
│ ├── README.md
│ ├── webhub.md # stack-agnostic webhub baseline
│ ├── webhub-laravel.md # Laravel/PHP
│ └── webhub-craft-cms.md # Craft CMS (scaffold)
├── skills/ # Skills — linked into ~/.claude/skills by bootstrap.sh,
│ │ # and each subfolder also zips up into one claude.ai Skill
│ ├── laravel/
│ │ ├── SKILL.md # thin wrapper - the rules live in the guideline
│ │ └── reference.md # → ../../guidelines/webhub-laravel.md (symlink)
│ ├── craft-cms/
│ │ ├── SKILL.md # thin wrapper - the rules live in the guideline
│ │ └── reference.md # → ../../guidelines/webhub-craft-cms.md (symlink)
│ └── craft-upgrade/ # Craft major-version upgrade playbook
│ ├── SKILL.md # orchestrator (only its description loads per session)
│ ├── upgrading-across-multiple-major-versions.md
│ ├── v2-to-v3/ v3-to-v4/ v4-to-v5/ # per-leg docs, read on demand
│ └── v5-to-v6/ # placeholder until the first 5→6 upgrade
└── commands/ # Slash-commands for Claude Code
├── laravel/ # → /webhub:laravel:<name>
│ ├── commit-and-simplify.md
│ └── simplify.md
├── plan-issue.md # → /webhub:plan-issue
└── security-review.md # → /webhub:security-review
See the one-liner above. What bootstrap.sh does, idempotently:
- Symlinks
commands/into~/.claude/commands/webhub/, so every slash-command in this repo is available as/webhub:<name>(subdirs add namespace segments — e.g./webhub:laravel:simplify). - Symlinks each
skills/<name>/folder into~/.claude/skills/<name>/, so every skill is discoverable in Claude Code — available as/<name>and auto-invoked from itsdescription. Only the description loads each session; a skill's body and any bundled reference docs are read on demand. A pre-existing non-symlink~/.claude/skills/<name>is left untouched (your personal skills are safe). - Appends an
@<path>import for the stack-agnosticwebhub.mdto~/.claude/CLAUDE.md, so the webhub baseline applies to every session regardless of stack. Existing content in~/.claude/CLAUDE.mdis left untouched.
Stack-specific guidelines (webhub-laravel.md, webhub-craft-cms.md) are intentionally not loaded globally — they're pulled into each project repo by their starter packages (laravel-starter's webhub:post-autoload hook, future craft-starter, …) and committed there. That way Claude only sees Laravel rules in Laravel work and Craft rules in Craft work.
To update: re-run the one-liner from the directory above the clone, or cd into the clone and run git pull && ./bootstrap.sh. Symlinks pick up new commands automatically; re-running bootstrap.sh is only required when new globally-imported guidelines are added.
From inside your clone of this repo, same effect by hand:
ln -sfn "$PWD/commands" ~/.claude/commands/webhub
echo "@$PWD/guidelines/webhub.md" >> ~/.claude/CLAUDE.mdPlain markdown files consumed by AI tooling in our projects.
- User-level (this repo, via
bootstrap.sh): imports the full set into~/.claude/CLAUDE.md. - Project-level: Laravel apps pull
webhub-laravel.md(+ spatie'slaravel-php-ai-guidelines.md) into.ai/guidelines/automatically — bothphp artisan webhub:installandwebhub:updatedo this, and thewebhub:post-autoloadhook keeps them fresh on everycomposer dump-autoload. - Raw URL pattern:
https://raw.githubusercontent.com/webhubworks/ai/main/guidelines/<file>— keepmainstable.
To add a new guideline file, drop it into guidelines/ and:
- Add it to the
GUIDELINES=( … )array inbootstrap.shif it should apply user-level. - Add a
curlline inlaravel-starter'spublishCustomAiGuidelines()if it should land in every Laravel project.
Each subfolder under skills/ is one Skill, consumed in two places:
- Claude Code (local):
bootstrap.shsymlinks every skill into~/.claude/skills/, so they're discoverable automatically — available as/<name>and auto-invoked from theirdescription. Nothing else to do. - claude.ai org-wide: upload each as a
.zipwithSKILL.md(and any bundled files) at the root of the zip — no wrapper directory.
cd skills/laravel && zip ../laravel.zip SKILL.md reference.md && cd - # zip follows the symlink, so the guideline content lands as reference.md
cd skills/craft-cms && zip ../craft-cms.zip SKILL.md reference.md && cd - # same — keeps the upload self-contained
cd skills/craft-upgrade && zip -r ../craft-upgrade.zip . && cd - # bundles SKILL.md + reference docsThe
laravelandcraft-cmsskills are thin wrappers: theirSKILL.mdjust points to a bundledreference.md, which is a symlink to the correspondingguidelines/webhub-*.md(the single source of truth). Editing the guideline updates the skill everywhere - locally the symlink resolves live; for claude.ai thezipabove dereferences it into the archive. Never duplicate guideline content intoSKILL.md.
Then in claude.ai: Settings → Skills → Organization skills → + Add → pick the .zip. Only the org owner can publish org-wide skills.
When a skill grows extra files (examples, scripts, reference docs — like craft-upgrade's per-leg docs), zip the contents of its folder so siblings of SKILL.md sit at the zip root.
craft-upgrade bundles large per-leg reference docs (Craft's official upgrade docs, plus webhub's pitfalls/protocols). These are not loaded every session: only SKILL.md's description loads at session start. Claude reads the body when an upgrade task begins, and then reads only the version-specific docs matching the from→to versions. That's why a Craft upgrade playbook can live here without bloating every unrelated session.
- Edit the file here.
- Commit + push.
- Consumers re-pull:
- User-level (
~/.claude/…):git -C ~/reps/ai pull— symlinks update commands automatically; new guidelines need a re-run ofbootstrap.sh. - Laravel projects:
php artisan webhub:update(or justcomposer dump-autoloadthanks to thewebhub:post-autoloadhook). - claude.ai Skills: re-zip and re-upload via the admin UI.
- User-level (