Skip to content

补充plugin的josn文件#11

Open
jony-del wants to merge 1 commit into
LING71671:mainfrom
jony-del:main
Open

补充plugin的josn文件#11
jony-del wants to merge 1 commit into
LING71671:mainfrom
jony-del:main

Conversation

@jony-del
Copy link
Copy Markdown

@jony-del jony-del commented May 21, 2026

Summary by CodeRabbit

  • Chores

    • Updated plugin marketplace metadata structure for improved organization.
    • Added local settings to gitignore to prevent unintended tracking.
    • Added new plugin metadata configuration for plugin-dev.
  • Documentation

    • Reformatted agent descriptions in multiple plugins for improved readability and consistency.
    • Enhanced agent documentation with clearer formatting and additional examples.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 21, 2026

📝 Walkthrough

Walkthrough

This 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.

Changes

Configuration and Agent Standardization

Layer / File(s) Summary
Plugin metadata structure updates
\.claude-plugin/marketplace.json, plugins/plugin-dev/.claude-plugin/plugin.json
Marketplace metadata is reorganized by removing $schema and moving version and description into a new metadata object. A new plugin manifest for plugin-dev is introduced with plugin identity, description, semantic version, and author contact details.
Agent description formatting standardization
plugins/hookify/agents/conversation-analyzer.md, plugins/plugin-dev/agents/agent-creator.md, plugins/plugin-dev/agents/plugin-validator.md, plugins/plugin-dev/agents/skill-reviewer.md, plugins/pr-review-toolkit/agents/code-reviewer.md, plugins/pr-review-toolkit/agents/code-simplifier.md, plugins/pr-review-toolkit/agents/comment-analyzer.md, plugins/pr-review-toolkit/agents/pr-test-analyzer.md, plugins/pr-review-toolkit/agents/silent-failure-hunter.md
Nine agent markdown files convert their description fields from single-line YAML strings to multiline YAML block scalars. Two agents add explicit name fields. Description content, examples, and agent logic remain unchanged; only YAML formatting and indentation are adjusted for consistency.
Type design analyzer agent enhancement
plugins/pr-review-toolkit/agents/type-design-analyzer.md
The type-design-analyzer agent's description expands with multiline YAML block formatting and includes two new example and commentary sections documenting usage scenarios. The output format section is updated with "Invariant Expression" and "Invariant Usefulness" rating headings, placeholder lines, and adjusted spacing.
Repository configuration
\.gitignore, agent-team-test-artifacts/agent-1/npm-cache/_cacache/index-v5/8e/df/5472fe1cc0e8f0c6de8ab9638dcb0eb4220317269f225ef94e7896902fd7
settings.local.json is added to the gitignore list to prevent local environment settings from being tracked. A new npm cacache index record is added with package tarball metadata including integrity, timestamp, and file size.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Poem

A rabbit hops through formatting neat,
With YAML blocks so clean and sweet,
Agent descriptions now align,
Metadata restructured, oh so fine,
Standards unified, the code's pristine! 🐰✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title '补充plugin的josn文件' references adding JSON plugin files, which aligns with multiple file changes including new .claude-plugin/plugin.json and YAML frontmatter reformatting across agent files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Warning

⚠️ This pull request might be slop. It has been flagged by CodeRabbit slop detection and should be reviewed carefully.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between e54c5af and 38e9ce7.

📒 Files selected for processing (16)
  • .claude-plugin/marketplace.json
  • .gitignore
  • agent-team-test-artifacts/agent-1/npm-cache/_cacache/content-v2/sha512/ba/43/2d6190a2d08edc0f7aedf3dae75f2db40ff66f9341a3fd25bad3161fcf5ef34ec94bcfe56e857c3f28f6feda7769dff01369d25dc8d12a74a42570d93b9d
  • agent-team-test-artifacts/agent-1/npm-cache/_cacache/index-v5/8e/df/5472fe1cc0e8f0c6de8ab9638dcb0eb4220317269f225ef94e7896902fd7
  • agent-team-test-artifacts/agent-1/npm-cache/_update-notifier-last-checked
  • plugins/hookify/agents/conversation-analyzer.md
  • plugins/plugin-dev/.claude-plugin/plugin.json
  • plugins/plugin-dev/agents/agent-creator.md
  • plugins/plugin-dev/agents/plugin-validator.md
  • plugins/plugin-dev/agents/skill-reviewer.md
  • plugins/pr-review-toolkit/agents/code-reviewer.md
  • plugins/pr-review-toolkit/agents/code-simplifier.md
  • plugins/pr-review-toolkit/agents/comment-analyzer.md
  • plugins/pr-review-toolkit/agents/pr-test-analyzer.md
  • plugins/pr-review-toolkit/agents/silent-failure-hunter.md
  • plugins/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
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

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.

Suggested change
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.

Comment on lines +3 to +4
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>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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"
done

Repository: 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.md
  • plugins/pr-review-toolkit/agents/code-reviewer.md
  • plugins/pr-review-toolkit/agents/code-simplifier.md
  • plugins/pr-review-toolkit/agents/comment-analyzer.md
  • plugins/pr-review-toolkit/agents/pr-test-analyzer.md
  • plugins/pr-review-toolkit/agents/silent-failure-hunter.md
  • plugins/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.

Comment on lines +2 to +4
"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",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 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"' || true

Repository: 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)}")
PY

Repository: 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$" || true

Repository: 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' . || true

Repository: 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')}")
PY

Repository: 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
PY

Repository: 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
PY

Repository: 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.

Comment on lines +3 to +4
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>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

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.

Suggested change
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.

Comment on lines +3 to +4
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>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant