补充plugin的josn文件#11
Conversation
📝 WalkthroughWalkthroughThis PR applies configuration and formatting standardization across the repository. It restructures plugin metadata by consolidating version and description fields, standardizes YAML formatting for agent descriptions across nine files, enhances the type-design-analyzer agent with expanded guidance and output format details, and updates repository configuration for local settings and npm cache management. ChangesConfiguration and Agent Standardization
Estimated code review effort🎯 2 (Simple) | ⏱️ ~8 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment Warning |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@agent-team-test-artifacts/agent-1/npm-cache/_cacache/index-v5/8e/df/5472fe1cc0e8f0c6de8ab9638dcb0eb4220317269f225ef94e7896902fd7`:
- Line 2: The committed cacache artifact contains a machine-specific absolute
path (see the cached entry with key "pacote:tarball:file:...") and must be
removed and ignored: delete this file from the repo history/working tree, run
git rm --cached on the file (or the entire npm-cache/_cacache directory), add an
appropriate ignore rule (e.g., ignore npm-cache/ or _cacache/ or the specific
pattern matching pacote tarball cache) to .gitignore, and commit the removal so
future commits do not include these generated, environment-specific cache files.
In `@plugins/hookify/agents/conversation-analyzer.md`:
- Around line 3-4: The YAML "description: |-" blocks contain literal backslash+n
sequences instead of real line breaks; for each listed file
(plugins/hookify/agents/conversation-analyzer.md and the six
plugins/pr-review-toolkit/agents/*.md files) edit the YAML description value
(the "description: |-" block) and replace occurrences of the two-character
sequence "\n" with actual newline characters so the text is rendered as
intended; ensure you preserve the surrounding YAML block indicator ("|-") and
any inline example/commentary markers while converting those literal "\n"
sequences into real multi-line content.
In `@plugins/plugin-dev/.claude-plugin/plugin.json`:
- Around line 2-4: The plugin description for "plugin-dev" is inconsistent
between the plugin manifest key "description" in
plugins/plugin-dev/.claude-plugin/plugin.json and the corresponding entry in
.claude-plugin/marketplace.json; update them so they match (either copy the
canonical "description" from plugin.json into the marketplace.json entry for
"plugin-dev" or remove the duplicated "description" field from the marketplace
entry so plugin.json is the single source of truth), and repeat the same
alignment for the other plugins with mismatched "description" values to
eliminate repo-wide drift.
In `@plugins/pr-review-toolkit/agents/silent-failure-hunter.md`:
- Around line 3-4: The YAML block under description: |- contains literal "\n"
escape sequences instead of actual newlines, so the examples are not rendered as
intended; edit the agents/silent-failure-hunter.md description block (the lines
under description: |-) to remove the backslash-n sequences and replace them with
real line breaks and proper indentation for each example and paragraph so the
examples appear as separate lines/blocks; ensure you keep the existing example
markers (<example> ... </example>) and formatting but with real newlines rather
than "\n" character sequences.
In `@plugins/pr-review-toolkit/agents/type-design-analyzer.md`:
- Around line 3-4: The YAML description block contains literal "\n" sequences
inside the pipe scalar (the description field) so examples and commentary are
not rendered as multiline content; edit the description block to replace the
literal "\n" escapes with real line breaks so each <example>, user/assistant
lines, and <commentary> appear on separate lines, preserving the existing
indentation and the surrounding tags (<example>, <commentary>) and keeping the
block scalar (description: |-) style; ensure the examples and commentary
sections are formatted as true multiline text rather than escaped sequences so
the type-design-analyzer prompt renders correctly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: d9814ddb-0d92-4294-9f9b-9657901c4c7c
📒 Files selected for processing (16)
.claude-plugin/marketplace.json.gitignoreagent-team-test-artifacts/agent-1/npm-cache/_cacache/content-v2/sha512/ba/43/2d6190a2d08edc0f7aedf3dae75f2db40ff66f9341a3fd25bad3161fcf5ef34ec94bcfe56e857c3f28f6feda7769dff01369d25dc8d12a74a42570d93b9dagent-team-test-artifacts/agent-1/npm-cache/_cacache/index-v5/8e/df/5472fe1cc0e8f0c6de8ab9638dcb0eb4220317269f225ef94e7896902fd7agent-team-test-artifacts/agent-1/npm-cache/_update-notifier-last-checkedplugins/hookify/agents/conversation-analyzer.mdplugins/plugin-dev/.claude-plugin/plugin.jsonplugins/plugin-dev/agents/agent-creator.mdplugins/plugin-dev/agents/plugin-validator.mdplugins/plugin-dev/agents/skill-reviewer.mdplugins/pr-review-toolkit/agents/code-reviewer.mdplugins/pr-review-toolkit/agents/code-simplifier.mdplugins/pr-review-toolkit/agents/comment-analyzer.mdplugins/pr-review-toolkit/agents/pr-test-analyzer.mdplugins/pr-review-toolkit/agents/silent-failure-hunter.mdplugins/pr-review-toolkit/agents/type-design-analyzer.md
| @@ -0,0 +1,2 @@ | |||
|
|
|||
| c0aca304189825d07d68f12a85ca4c4f5d53e58b {"key":"pacote:tarball:file:E:/ZNGZ/Code_copy/learning_proj/Open-ClaudeCode/package","integrity":"sha512-ukMtYZCi0I7cD3rt89rnXy20D/Zvk0Gj/SW60xYfz17zTslLz+VuhXw/KPb+2ndp3/ATadJdyNEqdKQlcNk7nQ==","time":1779353697479,"size":31196633} No newline at end of file | |||
There was a problem hiding this comment.
Do not commit npm cacache artifacts with machine-specific absolute paths.
This file is generated cache state and includes a local absolute path (E:/...). It should be removed from version control and ignored to avoid noisy diffs and environment leakage.
Suggested cleanup
diff --git a/agent-team-test-artifacts/agent-1/npm-cache/_cacache/index-v5/8e/df/5472fe1cc0e8f0c6de8ab9638dcb0eb4220317269f225ef94e7896902fd7 b/agent-team-test-artifacts/agent-1/npm-cache/_cacache/index-v5/8e/df/5472fe1cc0e8f0c6de8ab9638dcb0eb4220317269f225ef94e7896902fd7
deleted file mode 100644
index 0000000..0000000
--- a/agent-team-test-artifacts/agent-1/npm-cache/_cacache/index-v5/8e/df/5472fe1cc0e8f0c6de8ab9638dcb0eb4220317269f225ef94e7896902fd7
+++ /dev/null
@@ -1,2 +0,0 @@
-
-c0aca304189825d07d68f12a85ca4c4f5d53e58b {"key":"pacote:tarball:file:E:/ZNGZ/Code_copy/learning_proj/Open-ClaudeCode/package","integrity":"sha512-ukMtYZCi0I7cD3rt89rnXy20D/Zvk0Gj/SW60xYfz17zTslLz+VuhXw/KPb+2ndp3/ATadJdyNEqdKQlcNk7nQ==","time":1779353697479,"size":31196633}
diff --git a/.gitignore b/.gitignore
@@
+# npm cache artifacts (test artifacts/local runs)
+agent-team-test-artifacts/**/npm-cache/📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| c0aca304189825d07d68f12a85ca4c4f5d53e58b {"key":"pacote:tarball:file:E:/ZNGZ/Code_copy/learning_proj/Open-ClaudeCode/package","integrity":"sha512-ukMtYZCi0I7cD3rt89rnXy20D/Zvk0Gj/SW60xYfz17zTslLz+VuhXw/KPb+2ndp3/ATadJdyNEqdKQlcNk7nQ==","time":1779353697479,"size":31196633} |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@agent-team-test-artifacts/agent-1/npm-cache/_cacache/index-v5/8e/df/5472fe1cc0e8f0c6de8ab9638dcb0eb4220317269f225ef94e7896902fd7`
at line 2, The committed cacache artifact contains a machine-specific absolute
path (see the cached entry with key "pacote:tarball:file:...") and must be
removed and ignored: delete this file from the repo history/working tree, run
git rm --cached on the file (or the entire npm-cache/_cacache directory), add an
appropriate ignore rule (e.g., ignore npm-cache/ or _cacache/ or the specific
pattern matching pacote tarball cache) to .gitignore, and commit the removal so
future commits do not include these generated, environment-specific cache files.
| description: |- | ||
| Use this agent when analyzing conversation transcripts to find behaviors worth preventing with hooks. Examples: <example>Context: User is running /hookify command without arguments\nuser: "/hookify"\nassistant: "I'll analyze the conversation to find behaviors you want to prevent"\n<commentary>The /hookify command without arguments triggers conversation analysis to find unwanted behaviors.</commentary></example><example>Context: User wants to create hooks from recent frustrations\nuser: "Can you look back at this conversation and help me create hooks for the mistakes you made?"\nassistant: "I'll use the conversation-analyzer agent to identify the issues and suggest hooks."\n<commentary>User explicitly asks to analyze conversation for mistakes that should be prevented.</commentary></example> |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
🏁 Script executed:
#!/bin/bash
# Verify block-scalar descriptions that still contain literal "\n"
rg -n --type=md '^description:\s*\|-' plugins | cut -d: -f1 | sort -u | while read -r f; do
awk '
BEGIN {in_desc=0}
/^description:[[:space:]]*\|-/ {in_desc=1; next}
in_desc && /^[^[:space:]]/ {in_desc=0}
in_desc && /\\n/ {print FILENAME ":" NR ":" $0}
' "$f"
doneRepository: LING71671/Open-ClaudeCode
Length of output: 10009
Fix YAML description: |- to remove literal \n
description: |- in these files contains literal backslash+n (\n) text, which YAML preserves instead of converting to real line breaks. Replace those \n sequences with actual newlines in:
plugins/hookify/agents/conversation-analyzer.mdplugins/pr-review-toolkit/agents/code-reviewer.mdplugins/pr-review-toolkit/agents/code-simplifier.mdplugins/pr-review-toolkit/agents/comment-analyzer.mdplugins/pr-review-toolkit/agents/pr-test-analyzer.mdplugins/pr-review-toolkit/agents/silent-failure-hunter.mdplugins/pr-review-toolkit/agents/type-design-analyzer.md
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/hookify/agents/conversation-analyzer.md` around lines 3 - 4, The YAML
"description: |-" blocks contain literal backslash+n sequences instead of real
line breaks; for each listed file
(plugins/hookify/agents/conversation-analyzer.md and the six
plugins/pr-review-toolkit/agents/*.md files) edit the YAML description value
(the "description: |-" block) and replace occurrences of the two-character
sequence "\n" with actual newline characters so the text is rendered as
intended; ensure you preserve the surrounding YAML block indicator ("|-") and
any inline example/commentary markers while converting those literal "\n"
sequences into real multi-line content.
| "name": "plugin-dev", | ||
| "description": "Comprehensive toolkit for developing Claude Code plugins. Includes expert skills covering hooks, MCP integration, commands, agents, and best practices.", | ||
| "version": "0.1.0", |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Confirm whether other plugins in this repo also duplicate manifest fields in marketplace.json
fd -t f 'plugin.json' plugins -x sh -c 'echo "=== {} ==="; cat {}'Repository: LING71671/Open-ClaudeCode
Length of output: 51
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# 1) Show the relevant manifest snippet
echo "---- plugin-dev/.claude-plugin/plugin.json (lines 1-40) ----"
nl -ba plugins/plugin-dev/.claude-plugin/plugin.json | sed -n '1,40p'
# 2) Show the relevant marketplace snippet around the plugin-dev entry
echo "---- plugins/.claude-plugin/marketplace.json (around plugin-dev) ----"
ls -la plugins/*/.claude-plugin/marketplace.json 2>/dev/null || true
# Try the path mentioned by the comment (from repo root)
if [ -f plugins/plugin-dev/.claude-plugin/marketplace.json ]; then
target="plugins/plugin-dev/.claude-plugin/marketplace.json"
else
# Fallback: search for marketplace.json in repo
target="$(fd -t f 'marketplace.json' . | head -n 1)"
fi
echo "Using marketplace.json: $target"
nl -ba "$target" | sed -n '90,140p' | cat
# 3) Identify how marketplace.json represents plugin entries (especially plugin-dev)
echo "---- plugin-dev entry block (best-effort) ----"
rg -n '"plugin-dev"' "$target" || true
rg -n '"name"[[:space:]]*:[[:space:]]*"plugin-dev"' "$target" || true
rg -n '"name"[[:space:]]*:[[:space:]]*"plugin-dev"' plugins/plugin-dev -S || true
# 4) Scan for drift: compare plugin.json description vs marketplace.json description where both exist
# We'll extract all plugin.json descriptions and then look for corresponding marketplace entries.
tmpdir="$(mktemp -d)"
echo "Using temp dir: $tmpdir"
# Extract plugin.json descriptions: <pluginPath>\t<description>
fd -t f 'plugin.json' plugins -x sh -c '
f="{}";
desc="$(jq -r ".description // empty" "$f" 2>/dev/null || true)";
if [ -n "$desc" ]; then
plugin="$(dirname "$f")";
printf "%s\t%s\n" "$plugin" "$desc";
fi
' > "$tmpdir/plugin_descriptions.tsv" || true
echo "---- Sample extracted plugin.json descriptions (first 20) ----"
head -n 20 "$tmpdir/plugin_descriptions.tsv" || true
# For marketplace.json files, look for description under entries containing plugin-dev and any other plugin names.
# We'll find all marketplace.json and check whether they include a "description" field that differs from manifest for the same plugin dir name.
fd -t f 'marketplace.json' plugins -x sh -c '
mf="{}";
echo "== Checking $mf ==";
# Extract candidate plugin name -> description from marketplace.json
# Assumes top-level array or object containing entries; handle common shapes.
jq -r '"'"'if (type=="array") then (.[].name // .[].name) else empty end'"'"'' "$mf" >/dev/null 2>&1 || true
jq -r '"'"'
def norm(x): (x|tostring);
if (type=="array") then
.[]
| .name as $n
| "\($n)\t"+( .description // "" )
else
to_entries[]
| .value
| .name as $n
| "\($n)\t"+( .description // "" )
end
'"'"'' "$mf" 2>/dev/null | head -n 3 || true
' || true
# 5) Specifically count occurrences where marketplace.json includes "description" with markdown emphasis (like **7**),
# as a proxy for manifest drift patterns.
fd -t f 'marketplace.json' plugins -x rg -n '"description"' || trueRepository: LING71671/Open-ClaudeCode
Length of output: 191
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Locate relevant files
echo "---- marketplace.json files under plugins/ ----"
fd -t f 'marketplace.json' plugins | sed -n '1,200p'
echo "---- plugin-dev manifest ----"
ls -la plugins/plugin-dev/.claude-plugin/plugin.json
echo "plugin.json (lines 1-20)"
cat -n plugins/plugin-dev/.claude-plugin/plugin.json | sed -n '1,25p'
# Find the marketplace.json that contains plugin-dev entry (best-effort)
echo "---- searching for plugin-dev in marketplace.json ----"
fd -t f 'marketplace.json' plugins -x sh -c 'echo "== $1 =="; rg -n "\"plugin-dev\"" "$1" || true' sh {}
echo "---- show nearby block for plugin-dev (best-effort) ----"
# Use rg to find the line number, then print a window around it.
target_mf="$(fd -t f 'marketplace.json' plugins | head -n 50 | xargs -I{} sh -c 'rg -q "\"plugin-dev\"" "{}" && echo "{}"' | head -n 1 || true)"
if [ -n "${target_mf}" ]; then
echo "Using marketplace.json: $target_mf"
# Find first match line number
line="$(rg -n "\"plugin-dev\"" "$target_mf" | head -n 1 | cut -d: -f1 || true)"
echo "Match line: ${line}"
start=$(( line>10 ? line-10 : 1 ))
end=$(( line+40 ))
echo "---- $target_mf (lines ${start}-${end}) ----"
sed -n "${start},${end}p" "$target_mf"
else
echo "No marketplace.json containing \"plugin-dev\" found under plugins/."
fi
echo "---- drift scan: compare plugin.json description vs marketplace.json description ----"
python3 - <<'PY'
import json, os, sys, glob
def find_files(root, name):
out=[]
for dirpath, dirnames, filenames in os.walk(root):
if name in filenames:
out.append(os.path.join(dirpath, name))
return out
plugin_jsons = []
for p in find_files("plugins", "plugin.json"):
if "/.claude-plugin/" in p.replace("\\","/"):
plugin_jsons.append(p)
marketplaces = find_files("plugins", "marketplace.json")
def collect_entries(obj, path=""):
# collect objects that look like {name:..., description:...}
res=[]
if isinstance(obj, dict):
if "name" in obj and "description" in obj:
res.append((obj.get("name"), obj.get("description"), path))
for k,v in obj.items():
res.extend(collect_entries(v, path + f"/{k}"))
elif isinstance(obj, list):
for i,v in enumerate(obj):
res.extend(collect_entries(v, path + f"[{i}]"))
return res
# Parse all plugin manifests
manifest_by_name = {}
for pj in plugin_jsons:
try:
with open(pj, "r", encoding="utf-8") as f:
data=json.load(f)
name=data.get("name")
desc=data.get("description")
if name:
manifest_by_name[name]=desc
except Exception as e:
print(f"Failed to parse {pj}: {e}", file=sys.stderr)
# Parse marketplace files and compare
mismatches=[]
found_entries=0
for mf in marketplaces:
try:
with open(mf, "r", encoding="utf-8") as f:
data=json.load(f)
except Exception as e:
print(f"Failed to parse {mf}: {e}", file=sys.stderr)
continue
entries=collect_entries(data)
# index marketplace descriptions by name (first occurrence)
desc_by_name={}
for nm, desc, path in entries:
if nm not in desc_by_name:
desc_by_name[nm]=desc
for nm, mdesc in manifest_by_name.items():
if nm in desc_by_name:
found_entries+=1
if (mdesc or "") != (desc_by_name[nm] or ""):
mismatches.append((nm, mdesc, desc_by_name[nm], mf))
# also count how many plugin names matched
# Output results
print(f"Manifest plugins found: {len(manifest_by_name)}")
print(f"Marketplace.json files found: {len(marketplaces)}")
print(f"Marketplace entries matched to manifests: {found_entries}")
print("---- mismatches (up to 50) ----")
for i,(nm, mdesc, pdesc, mf) in enumerate(mismatches[:50], 1):
print(f"{i}) {nm} @ {mf}")
print(" manifest description:", (mdesc or "")[:200].replace("\n","\\n"))
print(" marketplace description:", (pdesc or "")[:200].replace("\n","\\n"))
print(f"Total mismatches: {len(mismatches)}")
PYRepository: LING71671/Open-ClaudeCode
Length of output: 1052
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "---- locate marketplace.json anywhere in repo ----"
fd -t f 'marketplace.json' .
echo "---- search for plugin-dev in any marketplace.json ----"
fd -t f 'marketplace.json' . | xargs -I{} sh -c 'echo "== {} =="; rg -n "\"plugin-dev\"" "{}" || true'
echo "---- search for marketplace.json under any .claude-plugin dirs ----"
fd -t f 'marketplace.json' . -g '*.json' -E node_modules . || true
echo "---- locate any .claude-plugin/marketplace.json specifically ----"
fd -t f 'marketplace.json' . -E node_modules | rg -n "\\.claude-plugin/marketplace\\.json$" || trueRepository: LING71671/Open-ClaudeCode
Length of output: 381
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "---- fd for marketplace.json (include hidden) ----"
fd -t f --hidden 'marketplace.json' . || true
echo "---- rg for 'marketplace.json' references (include hidden) ----"
rg -n --hidden --no-ignore -S 'marketplace\.json' . || true
echo "---- find any .claude-plugin/marketplace.* (include hidden) ----"
fd -t f --hidden '.*/.claude-plugin/marketplace.*' . || true
echo "---- list all .claude-plugin directories (include hidden) ----"
fd -t d --hidden '.claude-plugin' . || trueRepository: LING71671/Open-ClaudeCode
Length of output: 50383
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "---- marketplace.json files (all) ----"
fd -t f --hidden 'marketplace.json' .
echo "---- plugin-dev entry excerpt from .claude-plugin/marketplace.json (lines 95-135, best-effort) ----"
mf=".claude-plugin/marketplace.json"
if [ -f "$mf" ]; then
awk '{print NR "\t" $0}' "$mf" | sed -n '95,135p'
else
echo "Missing $mf"
fi
echo "---- drift scan: manifest vs marketplace description ----"
python3 - <<'PY'
import json, os, sys
from pathlib import Path
def load_json(p):
with open(p, "r", encoding="utf-8") as f:
return json.load(f)
def find_manifest_plugins(root="plugins"):
out = {}
for p in Path(root).glob("*/.claude-plugin/plugin.json"):
try:
d = load_json(p)
name = d.get("name")
if name:
out[name] = d.get("description","") or ""
except Exception as e:
print(f"Failed to parse manifest {p}: {e}", file=sys.stderr)
return out
def collect_objects_with_keys(obj):
# returns list of tuples (name, description)
res=[]
def walk(x):
if isinstance(x, dict):
if "name" in x and "description" in x:
res.append((x.get("name"), x.get("description","") or ""))
for v in x.values():
walk(v)
elif isinstance(x, list):
for it in x:
walk(it)
walk(obj)
return res
manifest = find_manifest_plugins("plugins")
marketplace_files = []
for p in Path(".").rglob("marketplace.json"):
if ".git" in p.parts:
continue
marketplace_files.append(p)
mismatches=[]
matched=0
for mf in marketplace_files:
try:
data = load_json(mf)
except Exception as e:
print(f"Failed to parse marketplace {mf}: {e}", file=sys.stderr)
continue
entries = collect_objects_with_keys(data)
desc_by_name = {}
for nm, desc in entries:
if nm is None:
continue
if nm not in desc_by_name:
desc_by_name[nm] = (desc or "")
for nm, mdesc in manifest.items():
if nm in desc_by_name:
matched += 1
if (mdesc or "") != (desc_by_name.get(nm) or ""):
mismatches.append((nm, str(mf), mdesc or "", desc_by_name[nm] or ""))
# done
print(f"Manifest plugins found: {len(manifest)}")
print(f"Marketplace.json files found: {len(marketplace_files)}")
print(f"Matched manifest->marketplace entries: {matched}")
print(f"Mismatches (manifest description != marketplace description): {len(mismatches)}")
# Show up to 20 mismatches
for i, (nm, mf, mdesc, pdesc) in enumerate(mismatches[:20], 1):
print(f"{i}) {nm} @ {mf}")
print(f" manifest description: {mdesc[:160].replace(chr(10),'\\n')}")
print(f" marketplace description: {pdesc[:160].replace(chr(10),'\\n')}")
PYRepository: LING71671/Open-ClaudeCode
Length of output: 2336
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python3 - <<'PY'
import json
from pathlib import Path
def load_json(p):
with open(p, "r", encoding="utf-8") as f:
return json.load(f)
def manifest_descriptions():
out = {}
for p in Path("plugins").glob("*/.claude-plugin/plugin.json"):
try:
d = load_json(p)
name = d.get("name")
if name:
out[name] = d.get("description") or ""
except Exception as e:
print(f"Failed to parse manifest {p}: {e}")
return out
def collect_objects_with_keys(obj, acc=None):
if acc is None:
acc = []
if isinstance(obj, dict):
if "name" in obj and "description" in obj:
acc.append((obj.get("name"), obj.get("description") or ""))
for v in obj.values():
collect_objects_with_keys(v, acc)
elif isinstance(obj, list):
for it in obj:
collect_objects_with_keys(it, acc)
return acc
manifest = manifest_descriptions()
marketplace_files = [p for p in Path(".").rglob("marketplace.json") if ".git" not in p.parts]
mismatches = []
matched = 0
for mf in marketplace_files:
try:
data = load_json(mf)
except Exception as e:
print(f"Failed to parse marketplace {mf}: {e}")
continue
entries = collect_objects_with_keys(data)
desc_by_name = {}
for nm, desc in entries:
if nm is None:
continue
if nm not in desc_by_name:
desc_by_name[nm] = desc
for nm, mdesc in manifest.items():
if nm in desc_by_name:
matched += 1
pdesc = desc_by_name.get(nm) or ""
if (mdesc or "") != pdesc:
mismatches.append((nm, str(mf), mdesc, pdesc))
print(f"Manifest plugins found: {len(manifest)}")
print(f"Marketplace.json files found: {len(marketplace_files)}")
print(f"Matched manifest->marketplace entries: {matched}")
print(f"Mismatches: {len(mismatches)}")
# show the plugin-dev mismatch and then a few others
def show_one(i):
nm, mf, mdesc, pdesc = mismatches[i]
def esc(s): return s[:160].replace("\n","\\n")
print(f"\n{i+1}) {nm} @ {mf}")
print(f" manifest description: {esc(mdesc)}")
print(f" marketplace description: {esc(pdesc)}")
# prioritize plugin-dev
idxs = [i for i,(nm,_,_,_) in enumerate(mismatches) if nm=="plugin-dev"]
if idxs:
show_one(idxs[0])
for i in range(len(mismatches)):
nm, _, _, _ = mismatches[i]
if nm=="plugin-dev":
continue
if mismatches and len([x for x in mismatches if x[0]=="plugin-dev"])==0:
pass
# show up to 10 non-plugin-dev mismatches
if sum(1 for x in mismatches[:i] if x[0]!="plugin-dev") >= 10:
break
# just show next few
PYRepository: LING71671/Open-ClaudeCode
Length of output: 599
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python3 - <<'PY'
import json
from pathlib import Path
def load_json(p):
with open(p, "r", encoding="utf-8") as f:
return json.load(f)
def manifest_descriptions():
out = {}
for p in Path("plugins").glob("*/.claude-plugin/plugin.json"):
d = load_json(p)
name = d.get("name")
if name:
out[name] = d.get("description","") or ""
return out
def collect_objects_with_keys(obj, acc):
if isinstance(obj, dict):
if "name" in obj and "description" in obj:
acc.append((obj.get("name"), obj.get("description") or ""))
for v in obj.values():
collect_objects_with_keys(v, acc)
elif isinstance(obj, list):
for it in obj:
collect_objects_with_keys(it, acc)
manifest = manifest_descriptions()
marketplace_files = [p for p in Path(".").rglob("marketplace.json") if ".git" not in p.parts]
assert marketplace_files, "No marketplace.json found"
mismatches=[]
for mf in marketplace_files:
data = load_json(mf)
entries=[]
collect_objects_with_keys(data, entries)
desc_by_name={}
for nm, desc in entries:
if nm not in desc_by_name:
desc_by_name[nm]=desc
for nm, mdesc in manifest.items():
if nm in desc_by_name and (mdesc or "") != (desc_by_name[nm] or ""):
mismatches.append((nm, str(mf)))
print("MISMATCH count:", len(mismatches))
print("MISMATCH names:", ", ".join([nm for nm,_ in mismatches]))
print("Has plugin-dev mismatch:", any(nm=="plugin-dev" for nm,_ in mismatches))
PY
# Find repo docs/schema language about marketplace entries allowing manifest fields
echo "---- rg: marketplace entry schema/docs ----"
rg -n "PluginMarketplaceEntrySchema|marketplace entry|Prefer marketplace.json over plugin.json|description.*marketplace" src/utils/plugins/validatePlugin.ts src/utils/plugins/schemas.ts src/utils/plugins/pluginLoader.ts src/utils/plugins/marketplaceManager.ts || true
echo "---- show validatePlugin lines around 'Prefer marketplace.json over plugin.json' ----"
rg -n "Prefer marketplace\\.json over plugin\\.json" -n src/utils/plugins/validatePlugin.ts
python3 - <<'PY'
import subprocess, re, os, textwrap, sys
# Extract the block around the match line number from validatePlugin.ts
import pathlib
p=pathlib.Path("src/utils/plugins/validatePlugin.ts")
s=p.read_text(encoding="utf-8").splitlines()
# find match
for i,line in enumerate(s, start=1):
if "Prefer marketplace.json over plugin.json" in line:
start=max(1,i-20); end=min(len(s), i+20)
for j in range(start,end+1):
print(f"{j}\t{s[j-1]}")
break
PYRepository: LING71671/Open-ClaudeCode
Length of output: 7245
Align plugin description between plugin.json and marketplace entry to prevent user-facing drift
plugins/plugin-dev/.claude-plugin/plugin.json (lines 2-4) has:
"name": "plugin-dev",
"description": "Comprehensive toolkit for developing Claude Code plugins. Includes expert skills covering hooks, MCP integration, commands, agents, and best practices.",
"version": "0.1.0",…but .claude-plugin/marketplace.json (line 107–115) declares a different description for plugin-dev (“Includes 7 expert skills…” and “AI-assisted plugin creation and validation.”).
Repo-wide drift exists: 7 of 13 plugins have mismatched description values between plugins/*/.claude-plugin/plugin.json and .claude-plugin/marketplace.json. Recommendation: align the strings or remove the duplicated description from the marketplace entry so plugin.json is the source of truth.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/plugin-dev/.claude-plugin/plugin.json` around lines 2 - 4, The plugin
description for "plugin-dev" is inconsistent between the plugin manifest key
"description" in plugins/plugin-dev/.claude-plugin/plugin.json and the
corresponding entry in .claude-plugin/marketplace.json; update them so they
match (either copy the canonical "description" from plugin.json into the
marketplace.json entry for "plugin-dev" or remove the duplicated "description"
field from the marketplace entry so plugin.json is the single source of truth),
and repeat the same alignment for the other plugins with mismatched
"description" values to eliminate repo-wide drift.
| description: |- | ||
| Use this agent when reviewing code changes in a pull request to identify silent failures, inadequate error handling, and inappropriate fallback behavior. This agent should be invoked proactively after completing a logical chunk of work that involves error handling, catch blocks, fallback logic, or any code that could potentially suppress errors. Examples:\n\n<example>\nContext: Daisy has just finished implementing a new feature that fetches data from an API with fallback behavior.\nDaisy: "I've added error handling to the API client. Can you review it?"\nAssistant: "Let me use the silent-failure-hunter agent to thoroughly examine the error handling in your changes."\n<Task tool invocation to launch silent-failure-hunter agent>\n</example>\n\n<example>\nContext: Daisy has created a PR with changes that include try-catch blocks.\nDaisy: "Please review PR #1234"\nAssistant: "I'll use the silent-failure-hunter agent to check for any silent failures or inadequate error handling in this PR."\n<Task tool invocation to launch silent-failure-hunter agent>\n</example>\n\n<example>\nContext: Daisy has just refactored error handling code.\nDaisy: "I've updated the error handling in the authentication module"\nAssistant: "Let me proactively use the silent-failure-hunter agent to ensure the error handling changes don't introduce silent failures."\n<Task tool invocation to launch silent-failure-hunter agent>\n</example> |
There was a problem hiding this comment.
Use real line breaks in the block scalar, not \n escape text.
With description: |-, the \n sequences at Line 4 become literal characters, so the examples/commentary won’t be structured as intended.
Suggested fix
description: |-
- Use this agent when reviewing code changes in a pull request to identify silent failures, inadequate error handling, and inappropriate fallback behavior. This agent should be invoked proactively after completing a logical chunk of work that involves error handling, catch blocks, fallback logic, or any code that could potentially suppress errors. Examples:\n\n<example>\nContext: Daisy has just finished implementing a new feature that fetches data from an API with fallback behavior.\nDaisy: "I've added error handling to the API client. Can you review it?"\nAssistant: "Let me use the silent-failure-hunter agent to thoroughly examine the error handling in your changes."\n<Task tool invocation to launch silent-failure-hunter agent>\n</example>\n\n<example>\nContext: Daisy has created a PR with changes that include try-catch blocks.\nDaisy: "Please review PR `#1234`"\nAssistant: "I'll use the silent-failure-hunter agent to check for any silent failures or inadequate error handling in this PR."\n<Task tool invocation to launch silent-failure-hunter agent>\n</example>\n\n<example>\nContext: Daisy has just refactored error handling code.\nDaisy: "I've updated the error handling in the authentication module"\nAssistant: "Let me proactively use the silent-failure-hunter agent to ensure the error handling changes don't introduce silent failures."\n<Task tool invocation to launch silent-failure-hunter agent>\n</example>
+ Use this agent when reviewing code changes in a pull request to identify silent failures, inadequate error handling, and inappropriate fallback behavior. This agent should be invoked proactively after completing a logical chunk of work that involves error handling, catch blocks, fallback logic, or any code that could potentially suppress errors. Examples:
+
+ <example>
+ Context: Daisy has just finished implementing a new feature that fetches data from an API with fallback behavior.
+ Daisy: "I've added error handling to the API client. Can you review it?"
+ Assistant: "Let me use the silent-failure-hunter agent to thoroughly examine the error handling in your changes."
+ <Task tool invocation to launch silent-failure-hunter agent>
+ </example>
+
+ <example>
+ Context: Daisy has created a PR with changes that include try-catch blocks.
+ Daisy: "Please review PR `#1234`"
+ Assistant: "I'll use the silent-failure-hunter agent to check for any silent failures or inadequate error handling in this PR."
+ <Task tool invocation to launch silent-failure-hunter agent>
+ </example>
+
+ <example>
+ Context: Daisy has just refactored error handling code.
+ Daisy: "I've updated the error handling in the authentication module"
+ Assistant: "Let me proactively use the silent-failure-hunter agent to ensure the error handling changes don't introduce silent failures."
+ <Task tool invocation to launch silent-failure-hunter agent>
+ </example>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| description: |- | |
| Use this agent when reviewing code changes in a pull request to identify silent failures, inadequate error handling, and inappropriate fallback behavior. This agent should be invoked proactively after completing a logical chunk of work that involves error handling, catch blocks, fallback logic, or any code that could potentially suppress errors. Examples:\n\n<example>\nContext: Daisy has just finished implementing a new feature that fetches data from an API with fallback behavior.\nDaisy: "I've added error handling to the API client. Can you review it?"\nAssistant: "Let me use the silent-failure-hunter agent to thoroughly examine the error handling in your changes."\n<Task tool invocation to launch silent-failure-hunter agent>\n</example>\n\n<example>\nContext: Daisy has created a PR with changes that include try-catch blocks.\nDaisy: "Please review PR #1234"\nAssistant: "I'll use the silent-failure-hunter agent to check for any silent failures or inadequate error handling in this PR."\n<Task tool invocation to launch silent-failure-hunter agent>\n</example>\n\n<example>\nContext: Daisy has just refactored error handling code.\nDaisy: "I've updated the error handling in the authentication module"\nAssistant: "Let me proactively use the silent-failure-hunter agent to ensure the error handling changes don't introduce silent failures."\n<Task tool invocation to launch silent-failure-hunter agent>\n</example> | |
| description: |- | |
| Use this agent when reviewing code changes in a pull request to identify silent failures, inadequate error handling, and inappropriate fallback behavior. This agent should be invoked proactively after completing a logical chunk of work that involves error handling, catch blocks, fallback logic, or any code that could potentially suppress errors. Examples: | |
| <example> | |
| Context: Daisy has just finished implementing a new feature that fetches data from an API with fallback behavior. | |
| Daisy: "I've added error handling to the API client. Can you review it?" | |
| Assistant: "Let me use the silent-failure-hunter agent to thoroughly examine the error handling in your changes." | |
| <Task tool invocation to launch silent-failure-hunter agent> | |
| </example> | |
| <example> | |
| Context: Daisy has created a PR with changes that include try-catch blocks. | |
| Daisy: "Please review PR `#1234`" | |
| Assistant: "I'll use the silent-failure-hunter agent to check for any silent failures or inadequate error handling in this PR." | |
| <Task tool invocation to launch silent-failure-hunter agent> | |
| </example> | |
| <example> | |
| Context: Daisy has just refactored error handling code. | |
| Daisy: "I've updated the error handling in the authentication module" | |
| Assistant: "Let me proactively use the silent-failure-hunter agent to ensure the error handling changes don't introduce silent failures." | |
| <Task tool invocation to launch silent-failure-hunter agent> | |
| </example> |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/pr-review-toolkit/agents/silent-failure-hunter.md` around lines 3 -
4, The YAML block under description: |- contains literal "\n" escape sequences
instead of actual newlines, so the examples are not rendered as intended; edit
the agents/silent-failure-hunter.md description block (the lines under
description: |-) to remove the backslash-n sequences and replace them with real
line breaks and proper indentation for each example and paragraph so the
examples appear as separate lines/blocks; ensure you keep the existing example
markers (<example> ... </example>) and formatting but with real newlines rather
than "\n" character sequences.
| description: |- | ||
| Use this agent when you need expert analysis of type design in your codebase. Specifically use it: (1) when introducing a new type to ensure it follows best practices for encapsulation and invariant expression, (2) during pull request creation to review all types being added, (3) when refactoring existing types to improve their design quality. The agent will provide both qualitative feedback and quantitative ratings on encapsulation, invariant expression, usefulness, and enforcement.\n\n<example>\nContext: Daisy is writing code that introduces a new UserAccount type and wants to ensure it has well-designed invariants.\nuser: "I've just created a new UserAccount type that handles user authentication and permissions"\nassistant: "I'll use the type-design-analyzer agent to review the UserAccount type design"\n<commentary>\nSince a new type is being introduced, use the type-design-analyzer to ensure it has strong invariants and proper encapsulation.\n</commentary>\n</example>\n\n<example>\nContext: Daisy is creating a pull request and wants to review all newly added types.\nuser: "I'm about to create a PR with several new data model types"\nassistant: "Let me use the type-design-analyzer agent to review all the types being added in this PR"\n<commentary>\nDuring PR creation with new types, use the type-design-analyzer to review their design quality.\n</commentary>\n</example> |
There was a problem hiding this comment.
Block scalar still contains literal \n escapes.
At Line 4, \n is preserved as text under |-. Convert those escapes to actual line breaks so examples/commentary render as structured prompt content.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@plugins/pr-review-toolkit/agents/type-design-analyzer.md` around lines 3 - 4,
The YAML description block contains literal "\n" sequences inside the pipe
scalar (the description field) so examples and commentary are not rendered as
multiline content; edit the description block to replace the literal "\n"
escapes with real line breaks so each <example>, user/assistant lines, and
<commentary> appear on separate lines, preserving the existing indentation and
the surrounding tags (<example>, <commentary>) and keeping the block scalar
(description: |-) style; ensure the examples and commentary sections are
formatted as true multiline text rather than escaped sequences so the
type-design-analyzer prompt renders correctly.
Summary by CodeRabbit
Chores
Documentation