Browse Source

Fix Claude Code marketplace plugin initialization

Replicate complete plugin installation structure for Claude Code Action:

- Create full ~/.claude/plugins/ directory structure
- Check out ai-plugins repo directly to expected location
- Generate all required registry files:
  - config.json (repository configuration)
  - known_marketplaces.json (marketplace source tracking)
  - installed_plugins.json (plugin installation metadata)
  - settings.json (enabled plugins configuration)
- Remove settings parameter from action (auto-discovered from ~/.claude/)
- Add debug output for all generated registry files
- Track git commit SHA for version management

This ensures Claude Code Action recognizes plugins as properly installed
from a GitHub marketplace source.
pull/510/head
Patrick Honkonen 2 weeks ago
parent
commit
2da8c107be
  1. 137
      .github/workflows/_review-code.yml

137
.github/workflows/_review-code.yml

@ -127,84 +127,132 @@ jobs:
owner: ${{ github.repository_owner }} owner: ${{ github.repository_owner }}
repositories: ai-plugins repositories: ai-plugins
- name: Create temporary directory for marketplace - name: Create Claude Code plugin directories
id: mktemp
run: | run: |
TEMP_DIR=$(mktemp -d -p .) mkdir -p ~/.claude/plugins/marketplaces
echo "temp_dir=$TEMP_DIR" >> "$GITHUB_OUTPUT" mkdir -p ~/.claude/plugins/repos
echo "✅ Created temporary directory: $TEMP_DIR" echo "✅ Created Claude Code plugin directory structure"
- name: Check out AI plugins marketplace - name: Check out AI plugins marketplace
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with: with:
repository: bitwarden/ai-plugins repository: bitwarden/ai-plugins
path: ${{ steps.mktemp.outputs.temp_dir }} path: ~/.claude/plugins/marketplaces/bitwarden-marketplace
token: ${{ steps.app-token.outputs.token }} token: ${{ steps.app-token.outputs.token }}
persist-credentials: false persist-credentials: false
- name: Configure Claude Code with local marketplace - name: Initialize Claude Code plugin system
id: configure-marketplace id: init-plugins
env:
MARKETPLACE_DIR: ${{ steps.mktemp.outputs.temp_dir }}
run: | run: |
MARKETPLACE_PATH="$HOME/.claude/plugins/marketplaces/bitwarden-marketplace"
# Verify marketplace directory exists # Verify marketplace directory exists
if [ ! -d "$MARKETPLACE_DIR" ]; then if [ ! -d "$MARKETPLACE_PATH" ]; then
echo "❌ Error: Marketplace directory $MARKETPLACE_DIR does not exist" echo "❌ Error: Marketplace directory $MARKETPLACE_PATH does not exist"
exit 1 exit 1
fi fi
echo "✅ Found marketplace at: $MARKETPLACE_DIR" echo "✅ Found marketplace at: $MARKETPLACE_PATH"
# Verify required plugin directories exist # Verify required plugin directories exist
if [ ! -d "$MARKETPLACE_DIR/plugins/claude-config-validator" ]; then if [ ! -d "$MARKETPLACE_PATH/plugins/claude-config-validator" ]; then
echo "❌ Error: Plugin 'claude-config-validator' not found" echo "❌ Error: Plugin 'claude-config-validator' not found"
exit 1 exit 1
fi fi
echo "✅ Found plugin: claude-config-validator" echo "✅ Found plugin: claude-config-validator"
if [ ! -d "$MARKETPLACE_DIR/plugins/bitwarden-code-review" ]; then if [ ! -d "$MARKETPLACE_PATH/plugins/bitwarden-code-review" ]; then
echo "❌ Error: Plugin 'bitwarden-code-review' not found" echo "❌ Error: Plugin 'bitwarden-code-review' not found"
exit 1 exit 1
fi fi
echo "✅ Found plugin: bitwarden-code-review" echo "✅ Found plugin: bitwarden-code-review"
# Verify agent file exists # Verify plugin metadata files exist
if [ -f "$MARKETPLACE_DIR/plugins/bitwarden-code-review/.claude-plugin/plugin.json" ]; then if [ -f "$MARKETPLACE_PATH/plugins/claude-config-validator/.claude-plugin/plugin.json" ]; then
echo "✅ Plugin metadata found in expected location." echo "✅ Plugin metadata found: claude-config-validator"
else
echo "❌ Error: Plugin metadata not found for claude-config-validator"
exit 1
fi
if [ -f "$MARKETPLACE_PATH/plugins/bitwarden-code-review/.claude-plugin/plugin.json" ]; then
echo "✅ Plugin metadata found: bitwarden-code-review"
else else
echo "⚠ Warning: Plugin metadata not found at expected location" echo "❌ Error: Plugin metadata not found for bitwarden-code-review"
exit 1
fi fi
mkdir -p ~/.claude # Get git commit SHA for tracking
echo "✅ Created Claude Code configuration directory" cd "$MARKETPLACE_PATH"
GIT_SHA=$(git rev-parse HEAD)
cd - > /dev/null
echo "✅ Git commit SHA: $GIT_SHA"
# Create config.json
echo '{"repositories": {}}' > ~/.claude/plugins/config.json
echo "✅ Created config.json"
echo "📄 Contents of config.json:"
cat ~/.claude/plugins/config.json
# Create Claude Code configuration JSON # Create known_marketplaces.json
SETTINGS_JSON=$(jq -n \ jq -n \
--arg path "$(realpath "$MARKETPLACE_DIR")" \ --arg path "$MARKETPLACE_PATH" \
--arg timestamp "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
'{ '{
extraKnownMarketplaces: { "bitwarden-marketplace": {
"bitwarden-marketplace": { "source": {
source: { "source": "git",
source: "directory", "url": "https://github.com/bitwarden/ai-plugins.git"
path: $path },
} "installLocation": $path,
} "lastUpdated": $timestamp
},
enabledPlugins: {
"claude-config-validator@bitwarden-marketplace": true,
"bitwarden-code-review@bitwarden-marketplace": true
} }
}') }' > ~/.claude/plugins/known_marketplaces.json
echo "✅ Created known_marketplaces.json"
echo "📄 Contents of known_marketplaces.json:"
cat ~/.claude/plugins/known_marketplaces.json
# Write to file for debugging # Create installed_plugins.json
echo "$SETTINGS_JSON" > ~/.claude/settings.json jq -n \
echo "✅ Created settings file at ~/.claude/settings.json" --arg path "$MARKETPLACE_PATH" \
--arg sha "$GIT_SHA" \
--arg timestamp "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
'{
"version": 1,
"plugins": {
"claude-config-validator@bitwarden-marketplace": {
"version": "1.0.0",
"installedAt": $timestamp,
"lastUpdated": $timestamp,
"installPath": ($path + "/plugins/claude-config-validator"),
"gitCommitSha": $sha,
"isLocal": true
},
"bitwarden-code-review@bitwarden-marketplace": {
"version": "1.2.0",
"installedAt": $timestamp,
"lastUpdated": $timestamp,
"installPath": ($path + "/plugins/bitwarden-code-review"),
"gitCommitSha": $sha,
"isLocal": true
}
}
}' > ~/.claude/plugins/installed_plugins.json
echo "✅ Created installed_plugins.json"
echo "📄 Contents of installed_plugins.json:"
cat ~/.claude/plugins/installed_plugins.json
# Output JSON to GitHub Actions output for passing to action # Create settings.json with enabledPlugins
echo "settings_json<<EOF" >> "$GITHUB_OUTPUT" jq -n '{
echo "$SETTINGS_JSON" >> "$GITHUB_OUTPUT" "enabledPlugins": {
echo "EOF" >> "$GITHUB_OUTPUT" "claude-config-validator@bitwarden-marketplace": true,
"bitwarden-code-review@bitwarden-marketplace": true
}
}' > ~/.claude/settings.json
echo "✅ Created settings.json"
echo "📄 Contents of settings.json:"
cat ~/.claude/settings.json
echo "✅ Claude Code configured with local marketplace" echo "✅ Claude Code plugin system fully initialized"
- name: Review with Claude Code - name: Review with Claude Code
timeout-minutes: 10 timeout-minutes: 10
@ -213,7 +261,6 @@ jobs:
anthropic_api_key: ${{ steps.get-kv-secrets.outputs.ANTHROPIC-CODE-REVIEW-API-KEY }} anthropic_api_key: ${{ steps.get-kv-secrets.outputs.ANTHROPIC-CODE-REVIEW-API-KEY }}
track_progress: true track_progress: true
use_sticky_comment: true use_sticky_comment: true
settings: ${{ steps.configure-marketplace.outputs.settings_json }}
prompt: | prompt: |
Use bitwarden-code-reviewer agent to review the currently checked out pull request changes. Use bitwarden-code-reviewer agent to review the currently checked out pull request changes.
claude_args: | claude_args: |

Loading…
Cancel
Save