Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "shopware-ai-coding-tools",
"plugins": [
{
"name": "dev-tooling",
"source": {
"source": "local",
"path": "./plugins/dev-tooling"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Developer Tools"
}
]
}
4 changes: 2 additions & 2 deletions .claude/skills/plugin-updating/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,15 @@ PATCH — Everything else

For detailed triggers, public API definitions, and edge cases see `references/version-bump-reasoning.md`.

### Step 3: Bump plugin.json and all SKILL.md versions
### Step 3: Bump plugin.json, the Codex manifest and all SKILL.md versions

Run the bundled helper script:

```bash
bash "${CLAUDE_SKILL_DIR}/scripts/bump-plugin-version.sh" <plugin> <new-version>
```

It updates `plugins/<plugin>/.claude-plugin/plugin.json` (surgical text replacement that preserves formatting) and rewrites the `version:` field in every `plugins/<plugin>/skills/*/SKILL.md` frontmatter. Do not edit these files by hand.
It updates `plugins/<plugin>/.claude-plugin/plugin.json` (surgical text replacement that preserves formatting) and, when the plugin has a `.codex-plugin/plugin.json`, that file's `version` to the same value — failing if the two differ afterwards — and rewrites the `version:` field in every `plugins/<plugin>/skills/*/SKILL.md` frontmatter. Do not edit these files by hand.

### Step 4: Update CHANGELOG.md

Expand Down
46 changes: 35 additions & 11 deletions .claude/skills/plugin-updating/scripts/bump-plugin-version.sh
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
#!/usr/bin/env bash
#
# Bumps a plugin's version in plugin.json and all SKILL.md frontmatters.
# Bumps a plugin's version in plugin.json, its Codex manifest (when present) and all SKILL.md frontmatters.
#
# Usage: bump-plugin-version.sh <plugin-name> <new-version>
#
# Updates in-place:
# plugins/<plugin-name>/.claude-plugin/plugin.json (top-level "version" field)
# plugins/<plugin-name>/.codex-plugin/plugin.json (top-level "version" field, only when the file exists)
# plugins/<plugin-name>/skills/*/SKILL.md (frontmatter "version" field)
#
# Does NOT touch CHANGELOG.md (needs semantic content).
Expand Down Expand Up @@ -60,18 +61,41 @@ fi

rel() { printf '%s' "${1#"$REPO_ROOT"/}"; }

# 1. plugin.json — surgical text replacement to preserve existing formatting
tmp="$(mktemp)"
awk -v v="$NEW_VERSION" '
!done && /^[[:space:]]*"version"[[:space:]]*:/ {
sub(/:[[:space:]]*"[^"]*"/, ": \"" v "\"")
done = 1
}
{ print }
' "$PLUGIN_JSON" > "$tmp"
mv "$tmp" "$PLUGIN_JSON"
# 1. Manifests — surgical text replacement to preserve existing formatting
rewrite_manifest_version() {
local manifest="$1" out
out="$(mktemp)"
awk -v v="$NEW_VERSION" '
!done && /^[[:space:]]*"version"[[:space:]]*:/ {
sub(/:[[:space:]]*"[^"]*"/, ": \"" v "\"")
done = 1
}
{ print }
' "$manifest" > "$out"
mv "$out" "$manifest"
}

check_manifest_version() {
local manifest="$1" got
got="$(jq -r .version "$manifest")"
if [ "$got" != "$NEW_VERSION" ]; then
echo "Error: $(rel "$manifest") reads version '$got', expected '$NEW_VERSION'." >&2
exit 1
fi
}

rewrite_manifest_version "$PLUGIN_JSON"
check_manifest_version "$PLUGIN_JSON"
printf ' %s (%s -> %s)\n' "$(rel "$PLUGIN_JSON")" "$OLD_VERSION" "$NEW_VERSION"

# The Codex manifest carries the same version, and only some plugins have one
CODEX_JSON="$PLUGIN_DIR/.codex-plugin/plugin.json"
if [ -f "$CODEX_JSON" ]; then
rewrite_manifest_version "$CODEX_JSON"
check_manifest_version "$CODEX_JSON"
printf ' %s (-> %s)\n' "$(rel "$CODEX_JSON")" "$NEW_VERSION"
fi

# 2. SKILL.md frontmatters
SKILLS_DIR="$PLUGIN_DIR/skills"
missing_version=()
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ on:
paths:
- 'plugins/**'
- 'plugin-tests/**'
- '.agents/**'
- '.claude-plugin/**'
- '.mcp-sdk.lock'
- 'pyproject.toml'
- 'uv.lock'
Expand All @@ -16,6 +18,8 @@ on:
paths:
- 'plugins/**'
- 'plugin-tests/**'
- '.agents/**'
- '.claude-plugin/**'
- '.mcp-sdk.lock'
- 'pyproject.toml'
- 'uv.lock'
Expand Down
14 changes: 12 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ Add the marketplace, then install the plugins you need:

Restart Claude Code after installing plugins that include MCP servers. Once setup is complete, you can uninstall `plugin-setup` to free up description budget (`/plugin uninstall plugin-setup@shopware-ai-coding-tools`).

On OpenAI Codex, add the same marketplace and install `dev-tooling` — the only plugin here with a Codex manifest:

```bash
codex plugin marketplace add shopwareLabs/ai-coding-tools
codex plugin add dev-tooling@shopware-ai-coding-tools
```

## 🛠️ Recommended Setup

These plugins work best alongside a few Claude Code tweaks. Turn on `ENABLE_TOOL_SEARCH=1` for deferred MCP tool loading. Add complementary marketplaces like Anthropic's `superpowers` and `it-bens/ai-tools` (for `llm-author` and `redundant-read-blocker`). Pre-approve common tools in `settings.json`.
Expand All @@ -41,18 +48,21 @@ These plugins work best alongside a few Claude Code tweaks. Turn on `ENABLE_TOOL

### dev-tooling

Three MCP servers for PHP and JavaScript operations plus an optional phpactor LSP for active PHP code discovery. Supports native, Docker, Docker Compose, Vagrant, and DDEV environments.
Three MCP servers for PHP and JavaScript operations plus an optional phpactor LSP for active PHP code discovery. Supports native, Docker, Docker Compose, Vagrant, and DDEV environments. Runs on Claude Code and on OpenAI Codex, where the servers start without a project root and bind one on demand; the LSP, the runner agent, and the worktree reminder hook are Claude Code only.

```bash
/plugin install dev-tooling@shopware-ai-coding-tools
# Codex
codex plugin marketplace add shopwareLabs/ai-coding-tools
codex plugin add dev-tooling@shopware-ai-coding-tools
```

- **PHP:** PHPStan static analysis, ECS code style, PHPUnit test runner with coverage gap analysis, Symfony Console, Rector
- **Administration JS:** ESLint, Stylelint, Prettier, Jest, TypeScript, Vite builds
- **Storefront JS:** ESLint, Stylelint, Jest, Webpack builds
- **PHP LSP (optional):** document symbols, hover, go-to-definition, and references via [phpactor](https://github.com/phpactor/phpactor)

After installing, also install `plugin-setup@shopware-ai-coding-tools`, then ask Claude to help you set up the plugin — the `dev-tooling-setting-up` skill walks you through configuration. Prerequisites: `jq`, restart after install. For LSP: `phpactor` binary available on the host (native) or inside the container (docker/docker-compose/vagrant/ddev).
After installing, also install `plugin-setup@shopware-ai-coding-tools`, then ask Claude to help you set up the plugin — the `dev-tooling-setting-up` skill walks you through configuration. Prerequisites: `bash` 4.1+ (macOS's stock `/bin/bash` is 3.2), `jq`, and a restart after install. For LSP: `phpactor` binary available on the host (native) or inside the container (docker/docker-compose/vagrant/ddev). On Codex, trust the plugin hooks when Codex asks: the SessionStart directive then names the session directory, and the model binds each server by calling `set_project_root` itself. A server binds only to a project that already holds its configuration file (`.mcp-php-tooling.json` for `php-tooling`, `.mcp-js-tooling.json` for the two JS servers) unless `MCP_PHP_TOOLING_CONFIG` or `MCP_JS_TOOLING_CONFIG` names an existing file, and `plugin-setup` has no Codex manifest, so write that file by hand. Exporting `PROJECT_ROOT` before starting Codex is the alternative; see the [plugin README](./plugins/dev-tooling/README.md) for its caveat.

See [full documentation](./plugins/dev-tooling/README.md) for configuration and tool reference.

Expand Down
Loading
Loading