Docs/claude code bleeding edge reference#257
Conversation
Single self-contained HTML at docs/claude-code-bleeding-edge.html covering post-May-2025 features (/btw, v2.1 permission modes, 2026 hook extensions), hidden/undocumented env vars (curated subset of ~330), CLI flags, settings.json power moves, Boris Cherny's top tips, and unusual community tricks. Prominent top-of-page callout corrects the widely-mistyped CLAUDE_CODE_EXPERIMENTAL_TEAM=1 to the actual CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 env var. Interactive: instant case-insensitive search, toggleable category filter pills, per-row copy-to-clipboard, deep-link anchors that auto-expand the targeted <details> section, dark-by-default with light-mode toggle. Inline CSS+JS, no CDN, no localStorage, WCAG-AA contrast, keyboard navigable, semantic HTML. Built on Thariq's pattern 14 (research-feature-explainer) DNA with the filter-pill + copy-button mechanics from pattern 18 (editor-triage-board), retoned to a dark Anthropic-coral palette. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Relocates docs/claude-code-bleeding-edge.html to plugins/html-effectiveness/claude-code-bleeding-edge.html so the artifact lives next to the skill that documents the production pattern it follows (pattern 14, research-feature-explainer). No sibling plugin has a docs/ folder; the monorepo's top-level docs/ holds cross-plugin guides (ARCHITECTURE.md, WORKFLOWS.md, etc.), not plugin-specific deliverables. The plugin root is the natural home. Wires the file into plugins/html-effectiveness/README.md alongside the existing otel-semconv-demo entry, with an open command and a one-line summary of the search/filter/copy interactions. File contents unchanged — pure relocation + README link. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fixed 2 file(s) based on 2 unresolved review comments. Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
Fixed 1 file(s) based on 1 unresolved review comment. Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
… canon Pivots the bleeding-edge reference to match the html-effectiveness skill's own canon (patterns.json): * Palette flip: coral becomes the default (was dark); github_dark moves to a `[data-theme="dark"]` toggle. Both palettes are taken verbatim from patterns.json:palettes — no invented "Anthropic-ish dark" mix. The original brief's #0d0e10/#e8e6e3 spec is overridden by the in-plugin source of truth, as requested. * Placement: moved from plugins/html-effectiveness/ to plugins/html-effectiveness/skills/html-effectiveness/assets/, where otel-semconv-demo.html and agent-spawn-deck-demo.html already live as pattern proof-of-concepts. This artifact is the same shape — a PoC for pattern 14 (research-feature-explainer) applied to a real reference catalog. * Active-state text color hardcoded to #141413 (slate) on accent/ success backgrounds so contrast passes AA in both palettes: #141413 on #D97757 (clay) ≈ 6.5:1; #141413 on #58a6ff (blue) ≈ 7.5:1; #141413 on #788C5D/#3fb950 (olive/green) ≈ 5:1+. * README updated: bullet rewritten as "third pattern-PoC alongside OTel and agent-spawn demos", open-command repointed to new path. * Theme toggle JS: `data-theme` attribute is absent in default coral mode, set to "dark" on toggle, removed again on toggle-back — cleaner than always-present attr with two values. No content changes; structure, sections, search/filter/copy/deep-link mechanics all preserved. 1543 LOC, 71KB. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fixed 2 file(s) based on 1 unresolved review comment. Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
Fixed 1 file(s) based on 1 unresolved review comment. Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
… canonical Anthropic practice
Skills (5):
- third-person canonical voice ("This skill should be used when the user asks to ...")
matching anthropics/claude-plugins-official plugin-dev meta-skill prescription
- add version: 0.1.0 + author: AncpLua to all frontmatters
- progressive disclosure: CCxxx-dense priorities replaced with pointers into
references/component-validators.md (eliminates 3x duplication)
- collapse verbose Commands/Workflow sections to lean Subcommands one-liners
- harmonize Reference -> References (plural) across all 5
Evaluator (src/evaluators/skill.js):
- CC203 regex now accepts "should be used when" alongside "use when" / "trigger";
the prior pattern flagged the canonical Anthropic voice as missing-trigger
- CC212 ALLOWED_FRONTMATTER_KEYS adds `version` (used by every plugin-dev
skill in claude-plugins-official) and `author` (ecosystem convention),
with rationale comments documenting the divergence from the May-2026
docs.claude.com SKILL.md spec
Manifest (.claude-plugin/plugin.json):
- description trimmed 258 -> 197 chars (clears CC105)
Result: per-skill score 60-66 (bronze) -> 91/100 (Gold per tonsofskills.com
rubric, B per the plugin's letter scale), 100/100 tests pass, 0 fail per
skill. Plugin-level F remains because the evaluator over-counts src/ as
deferred tokens (separate evaluator bug, not skill quality).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Both files were build-time scaffolding:
- SPEC.md (1195 lines, 93k) was the parallel-implementation spec
for Writers A/B/C. The plugin is built; README covers the load-bearing
mission and architecture-diff content; the code IS the current
architecture. References to /tmp/plugin-compare/ paths that no
longer exist.
- REVIEW.md (283 lines, 32k) was the 2026-05-05 pre-ship review with 4
CRIT findings. All four verified applied in current source:
CRIT-1 manifest "real-codex" string -> "real claude" (this branch
further trimmed to 197 chars)
CRIT-2 monitors.js:95 names.add(path.basename(fullPath))
CRIT-3 monitors.js CC605/CC608 size-gate removed
CRIT-4 hooks.js mcp_tool handler reads handler.server OR
handler.command.split("/")[0]
100/100 tests pass.
THIRD_PARTY_NOTICES.md kept (canonical MIT attribution). Git history
preserves both removed files for archaeology.
Bonus: removes ~31k tokens from the plugin's deferred-budget count,
which the evaluator currently over-counts (separate evaluator bug).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
@coderabbitai autofix |
Summary by CodeRabbit
WalkthroughPR expands plugin ecosystem by introducing nuget-opensrc (NuGet→GitHub commit resolver with CLI, command, and skill), standardizes cc-plugin-eval sub-skill metadata and workflow routing, adds interactive html-effectiveness bleeding-edge reference asset (1562 lines), normalizes html-effectiveness hardcoded paths to portable cache directory, refactors weave-validate.sh to use null-delimited file processing, and registers both plugins in marketplace with CHANGELOG entries. Estimated code review effort🎯 4 (Complex) | ⏱️ ~55 minutes Rationale: 65 files touched with substantial heterogeneous changes: new 254-line CLI with NuGet API fallback logic (medium density), 1562-line interactive HTML/JS asset with filtering/search/clipboard/theme state (high density), five SKILL.md rewrites across different concerns (workflow vs. metadata), shell script refactoring with null-delimiter semantics, and path normalization spanning six files. Cross-domain edits (CLI logic, HTML interactivity, manifest/docs) demand separate reasoning per checkpoint. Possibly related PRs
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (2 errors, 2 warnings)
✅ Passed checks (5 passed)
Comment |
|
Note Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it. Autofix skipped. No unresolved CodeRabbit review comments with fix instructions found. |
|
Claude encountered an error after 2s —— View job I'll analyze this and get back to you. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a9be3b2196
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| SHELL_FILES=$(find tooling plugins agents -type f -name "*.sh" 2>/dev/null) | ||
|
|
||
| if [ ${#SHELL_FILES[@]} -gt 0 ]; then | ||
| if ! shellcheck --severity=warning "${SHELL_FILES[@]}" 2>&1; then | ||
| if [ -n "$SHELL_FILES" ]; then | ||
| SHELL_COUNT=$(echo "$SHELL_FILES" | wc -l) | ||
| if ! echo "$SHELL_FILES" | xargs shellcheck --severity=warning 2>&1; then |
There was a problem hiding this comment.
Preserve null-delimited paths for ShellCheck inputs
find output is now stored as plain text and piped through xargs, which splits on whitespace; any *.sh path containing spaces/tabs/newlines will be broken into multiple arguments, so shellcheck can fail on non-existent paths or silently miss real files. This regresses the prior -print0 + array behavior and can make the hard-fail validation step unreliable when plugin/script paths are not whitespace-free.
Useful? React with 👍 / 👎.
Triage Bot report
Threads marked |
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 0 |
| Duplication | 0 |
AI Reviewer: first review requested successfully. AI can make mistakes. Always validate suggestions.
TIP This summary will be updated as you push new changes.
There was a problem hiding this comment.
Pull Request Overview
The PR introduces significant functional changes to the CI validation scripts and the Claude Code skill evaluator that are not fully covered by tests.
Key issues that should prevent merging:
- CI Regression: The refactor of
weave-validate.shintroduces a regression in path handling; filenames containing spaces will cause the ShellCheck and JSON validation loops to fail. - Portability: A hardcoded absolute local path (
~/RiderProjects/...) was detected in the documentation/assets, which will cause failures for other users and in CI environments. - Testing Gap: The expansion of regex patterns and allowed metadata keys in the
cc-plugin-evalvalidator lacks unit tests to ensure correct behavior and prevent regressions in skill validation.
While Codacy reports the PR as 'up to standards', these functional and portability issues require correction.
About this PR
- No unit tests were added to
plugins/cc-plugin-eval/src/evaluators/skill.jsto verify the new regex patterns for trigger phrases or the allowance of 'version' and 'author' keys. - The PR description underrepresents the scope of changes. It includes a 1,500-line HTML reference and refactors core CI scripts, which are unrelated to the stated intent of minor manifest updates.
1 comment outside of the diff
[REDACTED:HIGH_ENTROPY]
line 51🔴 HIGH RISK
The absolute path is hardcoded to a specific local directory (~/RiderProjects/...), which makes this command non-portable. Use a relative path from the plugin root or a placeholder like$(pwd)to make the example functional for other users.open ./skills/html-effectiveness/assets/claude-code-bleeding-edge.html
Test suggestions
- Verify 'triggerPattern' regex in
skill.jscorrectly matches 'should be used when' in addition to existing patterns. - Verify that 'version' and 'author' frontmatter keys in SKILL.md files are accepted as valid metadata by the evaluator.
- Verify the 'weave-validate.sh' script correctly identifies and iterates through shell and JSON files after the loop refactor.
Prompt proposal for missing tests
Consider implementing these tests if applicable:
1. Verify 'triggerPattern' regex in `skill.js` correctly matches 'should be used when' in addition to existing patterns.
2. Verify that 'version' and 'author' frontmatter keys in SKILL.md files are accepted as valid metadata by the evaluator.
3. Verify the 'weave-validate.sh' script correctly identifies and iterates through shell and JSON files after the loop refactor.
TIP Improve review quality by adding custom instructions
TIP How was this review? Give us feedback
| SHELL_FILES=$(find tooling plugins agents -type f -name "*.sh" 2>/dev/null) | ||
|
|
||
| if [ ${#SHELL_FILES[@]} -gt 0 ]; then | ||
| if ! shellcheck --severity=warning "${SHELL_FILES[@]}" 2>&1; then | ||
| if [ -n "$SHELL_FILES" ]; then | ||
| SHELL_COUNT=$(echo "$SHELL_FILES" | wc -l) | ||
| if ! echo "$SHELL_FILES" | xargs shellcheck --severity=warning 2>&1; then |
There was a problem hiding this comment.
🟡 MEDIUM RISK
This refactor introduces a regression in robustness. Using $(find ...) followed by xargs without null-termination splits on any whitespace. If any filename contains a space, the validation will fail. Revert to using find -print0 and xargs -0 (or the previous array-based logic) to safely handle filenames with spaces.
| JSON_FILES=$(find . -name "*.json" -not -path "*/node_modules/*" -not -path "*/.git/*" -type f 2>/dev/null) | ||
|
|
||
| if [ -n "$JSON_FILES" ]; then | ||
| while IFS= read -r f; do | ||
| JSON_COUNT=$((JSON_COUNT + 1)) | ||
| if ! jq . "$f" >/dev/null 2>&1; then | ||
| hard_fail "invalid JSON: $f" | ||
| JSON_ERRORS=$((JSON_ERRORS + 1)) | ||
| fi | ||
| done <<< "$JSON_FILES" |
There was a problem hiding this comment.
⚪ LOW RISK
This implementation relies on Bash here-strings and is brittle when handling paths with spaces. It is safer to pipe find results directly into the while loop using find . -name "*.json" ... -print0 | while IFS= read -r -d '' f; do ... for maximum robustness.
| // Accepts either canonical form: the official docs example "Use when..." or the | ||
| // plugin-dev/skill-development prescription "This skill should be used when...". | ||
| // Also matches "trigger" / "triggers on" for skills that document triggers explicitly. | ||
| const triggerPattern = /(use when|should be used when|trigger|triggers on)/i; |
There was a problem hiding this comment.
⚪ LOW RISK
Suggestion: Expanding the regex improves the detection of valid trigger sentences and reduces false-positive warnings for descriptions that use the 'This skill should be used when...' phrasing.
| // Not in the May-2026 docs.claude.com SKILL.md spec, but used by every plugin-dev | ||
| // skill in anthropics/claude-plugins-official (skill-development, hook-development, | ||
| // agent-development, command-development all ship `version: 0.1.0`). Tolerated. | ||
| "version", |
There was a problem hiding this comment.
⚪ LOW RISK
Suggestion: This logic change correctly identifies 'version' and 'author' as valid metadata keys often used in plugin-development skills.
Triage Bot report
Threads marked |
|
To use Codex here, create an environment for this repo. |
Triage Bot report
Threads marked |
|
To use Codex here, create an environment for this repo. |
1 similar comment
|
To use Codex here, create an environment for this repo. |
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 `@plugins/cc-plugin-eval/skills/cc-plugin-eval/SKILL.md`:
- Line 21: Replace the hardcoded user-specific path string
"~/.claude/plugins/cache/<plugin-id>" in SKILL.md with a neutral placeholder or
variable (e.g., "Claude plugin cache path" or "CLAUDE_PLUGIN_CACHE_PATH") so the
routing instruction is environment-agnostic; update the sentence that currently
reads `~/.claude/plugins/cache/<plugin-id>` to use the chosen placeholder and
ensure any surrounding text still indicates local-first resolution (then
repo-local `plugins/<name>` or `skills/<name>`), and remove any
absolute/home-directory references to satisfy the "no user-specific directories"
guideline.
In `@plugins/cc-plugin-eval/skills/evaluate-skill/SKILL.md`:
- Line 14: The README line embeds a user-specific home path
(~/.claude/plugins/cache/...), which must be replaced with a generic cache
location placeholder; update the skill-resolution instruction in SKILL.md (the
default entrypoint text "Evaluate this skill." and the following resolution
rule) to use a variable like <PLUGIN_CACHE_DIR> or ${PLUGIN_CACHE_DIR} (or "the
plugin cache directory") instead of the absolute ~ path, and state “resolve
under <PLUGIN_CACHE_DIR>/skills/<skill-name> first, then repo-local
skills/<skill-name>”; keep the ambiguity behavior (ask one short clarifying
question if ambiguous) unchanged.
In `@plugins/cc-plugin-eval/src/evaluators/skill.js`:
- Line 253: The current triggerPattern (/ (use when|should be used
when|trigger|triggers on)/i) is too permissive because the lone "trigger"
alternative causes false matches; update the triggerPattern variable (and any
similar patterns in the nearby block handling CC203 between lines 255-268) to
require phrase-level trigger wording such as "use when", "should be used when",
"triggered when", "triggers when", or "triggers on" (use word boundaries) so
standalone "trigger" doesn't match; adjust the regex to include these full
phrases (e.g., require "trigger" only when followed/preceded by contextual
words) and replace the existing triggerPattern with the tighter expression.
In
`@plugins/html-effectiveness/skills/html-effectiveness/assets/claude-code-bleeding-edge.html`:
- Around line 1521-1541: In openHashSection(), after the requestAnimationFrame
callback that calls el.scrollIntoView(...), set a temporary tabindex="-1" on the
target element (el), call el.focus() to give keyboard/screen-reader context, and
then remove that tabindex if the element did not originally have a tabindex;
ensure you treat el as an HTMLElement (the variable named el in openHashSection)
and perform the focus call inside the same requestAnimationFrame callback (after
scrollIntoView) so focus occurs post-scroll while respecting the existing
prefersReducedMotion logic.
In `@tooling/scripts/weave-validate.sh`:
- Around line 71-75: The current SHELL_FILES/SHELL_COUNT flow builds a
space/newline-delimited string from find and re-parses it with xargs which is
not path-safe; update the find invocation(s) that populate SHELL_FILES (and the
similar block at lines 128-137) to use null-delimited output (find ... -print0)
and then consume it with a null-safe consumer (either xargs -0 shellcheck ... or
a while IFS= read -r -d '' loop) so file paths with spaces/newlines are handled
correctly and counts are computed reliably (adjust SHELL_COUNT calculation to
count null-delimited entries rather than echo|wc -l). Ensure you replace
references to echo "$SHELL_FILES" | xargs ... with the null-safe alternative and
keep the same failure/exit behavior.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 8bef7b8d-d0c5-4066-9071-8cb20f04bcc9
📒 Files selected for processing (12)
plugins/cc-plugin-eval/.claude-plugin/plugin.jsonplugins/cc-plugin-eval/REVIEW.mdplugins/cc-plugin-eval/SPEC.mdplugins/cc-plugin-eval/skills/cc-plugin-eval/SKILL.mdplugins/cc-plugin-eval/skills/evaluate-plugin/SKILL.mdplugins/cc-plugin-eval/skills/evaluate-skill/SKILL.mdplugins/cc-plugin-eval/skills/improve-skill/SKILL.mdplugins/cc-plugin-eval/skills/metric-pack-designer/SKILL.mdplugins/cc-plugin-eval/src/evaluators/skill.jsplugins/html-effectiveness/README.mdplugins/html-effectiveness/skills/html-effectiveness/assets/claude-code-bleeding-edge.htmltooling/scripts/weave-validate.sh
💤 Files with no reviewable changes (2)
- plugins/cc-plugin-eval/REVIEW.md
- plugins/cc-plugin-eval/SPEC.md
📜 Review details
⏰ Context from checks skipped due to timeout of 120000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: copilot-pull-request-reviewer
- GitHub Check: Codacy Static Code Analysis
🧰 Additional context used
📓 Path-based instructions (10)
plugins/*/.claude-plugin/plugin.json
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Ensure
plugin.jsoncontains all required fields: name, version, description, author, and license
Files:
plugins/cc-plugin-eval/.claude-plugin/plugin.json
plugins/*/skills/*/SKILL.md
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
All SKILL.md files MUST have YAML frontmatter with name and description fields
Files:
plugins/cc-plugin-eval/skills/metric-pack-designer/SKILL.mdplugins/cc-plugin-eval/skills/cc-plugin-eval/SKILL.mdplugins/cc-plugin-eval/skills/evaluate-plugin/SKILL.mdplugins/cc-plugin-eval/skills/evaluate-skill/SKILL.mdplugins/cc-plugin-eval/skills/improve-skill/SKILL.md
**/*.md
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Markdown files must pass markdownlint validation and follow kebab-case naming convention
Files:
plugins/cc-plugin-eval/skills/metric-pack-designer/SKILL.mdplugins/cc-plugin-eval/skills/cc-plugin-eval/SKILL.mdplugins/html-effectiveness/README.mdplugins/cc-plugin-eval/skills/evaluate-plugin/SKILL.mdplugins/cc-plugin-eval/skills/evaluate-skill/SKILL.mdplugins/cc-plugin-eval/skills/improve-skill/SKILL.md
**/SKILL.md
📄 CodeRabbit inference engine (Custom checks)
SKILL.md files must include valid YAML frontmatter with name and description fields
Files:
plugins/cc-plugin-eval/skills/metric-pack-designer/SKILL.mdplugins/cc-plugin-eval/skills/cc-plugin-eval/SKILL.mdplugins/cc-plugin-eval/skills/evaluate-plugin/SKILL.mdplugins/cc-plugin-eval/skills/evaluate-skill/SKILL.mdplugins/cc-plugin-eval/skills/improve-skill/SKILL.md
plugins/**/SKILL.md
⚙️ CodeRabbit configuration file
plugins/**/SKILL.md: Skill definitions consumed by Claude Code agents. Review for: YAML frontmatter with required fields (name, description), name is kebab-case and max 64 chars, description is max 1024 chars and clearly explains WHEN to use the skill. Skill body should have clear workflow steps, verification criteria, and failure conditions. Flag phantom tool references (tools that don't exist in Claude Code). Flag skills that reference absolute paths or user-specific directories.
STRUCTURAL INVARIANTS — flag violations as blocking: 1. Every SKILL.md must start with valid YAML frontmatter (--- delimiters). 2. name and description fields are required in frontmatter. 3. Skills must not reference MCP tools that may not be installed. 4. Skills should not duplicate content already in CLAUDE.md.
Files:
plugins/cc-plugin-eval/skills/metric-pack-designer/SKILL.mdplugins/cc-plugin-eval/skills/cc-plugin-eval/SKILL.mdplugins/cc-plugin-eval/skills/evaluate-plugin/SKILL.mdplugins/cc-plugin-eval/skills/evaluate-skill/SKILL.mdplugins/cc-plugin-eval/skills/improve-skill/SKILL.md
plugins/**/*.{js,ts,py,rb,go}
📄 CodeRabbit inference engine (Custom checks)
No hardcoded absolute paths in plugin code — use CLAUDE_PLUGIN_ROOT or CLAUDE_SKILL_DIR environment variables instead
Files:
plugins/cc-plugin-eval/src/evaluators/skill.js
plugins/*/+(index|main|src)/**/*.{js,ts,py,rb,go}
📄 CodeRabbit inference engine (Custom checks)
If plugin code is modified under plugins//, verify: (1) plugin.json version was bumped, (2) .claude-plugin/marketplace.json matches
Files:
plugins/cc-plugin-eval/src/evaluators/skill.js
**/*.sh
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Shell scripts must use
set -euo pipefailat script start, quote all variables as"$var", and pass shellcheck validation
Files:
tooling/scripts/weave-validate.sh
tooling/scripts/**
⚙️ CodeRabbit configuration file
Build and validation scripts. weave-validate.sh is the single validation entrypoint — all CI checks must be reproducible locally through this script. Review for: shellcheck compliance, idempotency, clear error messages, and that new validation steps are added to both weave-validate.sh and ci.yml.
Files:
tooling/scripts/weave-validate.sh
**/*.html
📄 CodeRabbit inference engine (.claude-plugin/marketplace.json)
Route agent output to single self-contained .html files using Thariq Shihipar's html-effectiveness pattern catalog with data-driven decision tree for pattern selection
Files:
plugins/html-effectiveness/skills/html-effectiveness/assets/claude-code-bleeding-edge.html
🔇 Additional comments (8)
plugins/cc-plugin-eval/src/evaluators/skill.js (1)
32-37: LGTM!plugins/cc-plugin-eval/.claude-plugin/plugin.json (1)
5-5: LGTM!plugins/cc-plugin-eval/skills/evaluate-plugin/SKILL.md (1)
3-5: LGTM!Also applies to: 10-10, 14-19, 22-34, 38-43
plugins/cc-plugin-eval/skills/improve-skill/SKILL.md (1)
3-5: LGTM!Also applies to: 47-47
plugins/cc-plugin-eval/skills/metric-pack-designer/SKILL.md (1)
3-5: LGTM!Also applies to: 78-78
plugins/html-effectiveness/skills/html-effectiveness/assets/claude-code-bleeding-edge.html (2)
1-1073: LGTM!Also applies to: 1077-1520, 1542-1552
1074-1076: ⚡ Quick winUnescaped angle brackets in quoted attributes are valid HTML5; escaping is optional.
The
<and>characters inside a properly closed double-quoted attribute value conform to HTML5's tokenization rules. While escaping them (</>) improves consistency and silences non-conforming validators, it is not required for correctness. Consider escaping for uniformity across the file if other attributes follow that pattern, but this is not a blocking issue.> Likely an incorrect or invalid review comment.plugins/html-effectiveness/README.md (1)
10-17: LGTM!Also applies to: 21-25, 27-29, 33-37, 45-56
Triage Bot report
Threads marked |
1 similar comment
Triage Bot report
Threads marked |
|
@coderabbitai autofix |
|
Note Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it. Autofix skipped. No unresolved CodeRabbit review comments with fix instructions found. |
Addressed with commit |
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
plugins/nuget-opensrc/bin/nuget-opensrc (1)
43-87:⚠️ Potential issue | 🟠 Major | ⚡ Quick winKeep the timeout active until the body is consumed.
Line 44 and Line 72 clear the abort timers before
r1.json()/r2.arrayBuffer(), so a stalled body read can still hang this CLI indefinitely.Patch sketch
- let r1; + let r1; + let idx1 = null; try { r1 = await fetch(SEMVER1(lower), { signal: c1.signal }); - clearTimeout(t1); + if (r1.ok) idx1 = await r1.json(); } catch (e) { - clearTimeout(t1); if (e.name === 'AbortError') { throw new Error(`Request timeout after 15s for semver1 endpoint`); } throw e; + } finally { + clearTimeout(t1); } - if (r1.ok) { - const idx1 = await r1.json(); + if (r1.ok) {Apply the same pattern to both SemVer2 branches so
arrayBuffer()stays inside the timed scope as well.🤖 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/nuget-opensrc/bin/nuget-opensrc` around lines 43 - 87, The abort timers (t1, t2) are cleared before consuming the response body (r1.json() and r2.arrayBuffer()), which allows a stalled body read to hang; update the SEMVER1 and SEMVER2_GZ fetch flows so the clearTimeout(t1) and clearTimeout(t2) calls occur after the awaited body consumption (i.e., move clearTimeout(t1) to after await r1.json() and clearTimeout(t2) to after await r2.arrayBuffer()/gunzip handling), keeping the AbortController signal in scope so the timeout can still abort both the fetch and the body read.
🤖 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
`@plugins/html-effectiveness/skills/html-effectiveness/assets/agent-spawn-deck-demo.html`:
- Line 350: The shell redirection string that builds the path using ~ (e.g. " >
~/repo-audit/scans/" + t.id + ".log 2>&1 &") should quote the tilde-expanded
path so home directories with spaces are handled; update each occurrence (the
string concatenation that uses t.id) to wrap the path in quotes inside the shell
command (for example change > ~/repo-audit/... to > " ~/repo-audit/... " or
better > " ~/repo-audit/scans/" + t.id + ".log" 2>&1 &) ensuring proper escaping
for the surrounding JS/HTML string literal so the final shell sees a quoted
path.
In `@plugins/nuget-opensrc/bin/nuget-opensrc`:
- Around line 52-90: The current loop over idx1.items fetches SemVer1 pages to
check for wantedVersion but does not preserve the discovered item/page, causing
a second walk in findEntry(); update fetchRegistration() so when you find the
matching catalogEntry (inside the for (const page of idx1.items) / for (const it
of items) loops) you either return that matching item immediately (so
fetchRegistration() yields the versioned entry) or assign the fetched items back
to page.items (e.g., page.items = items) before returning idx1 so subsequent
findEntry() reuses the hydrated page and avoids re-fetching; ensure this change
references idx1, page, items, wantedVersion, and findEntry() so lookups stay
single-pass.
---
Duplicate comments:
In `@plugins/nuget-opensrc/bin/nuget-opensrc`:
- Around line 43-87: The abort timers (t1, t2) are cleared before consuming the
response body (r1.json() and r2.arrayBuffer()), which allows a stalled body read
to hang; update the SEMVER1 and SEMVER2_GZ fetch flows so the clearTimeout(t1)
and clearTimeout(t2) calls occur after the awaited body consumption (i.e., move
clearTimeout(t1) to after await r1.json() and clearTimeout(t2) to after await
r2.arrayBuffer()/gunzip handling), keeping the AbortController signal in scope
so the timeout can still abort both the fetch and the body read.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 51fbf347-cef7-41e4-8691-7fa41ca8a3d7
📒 Files selected for processing (3)
plugins/html-effectiveness/skills/html-effectiveness/assets/agent-spawn-deck-demo.htmlplugins/nuget-opensrc/bin/nuget-opensrctooling/scripts/weave-validate.sh
📜 Review details
⏰ Context from checks skipped due to timeout of 120000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Codacy Static Code Analysis
🧰 Additional context used
📓 Path-based instructions (2)
**/*.sh
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Shell scripts must use
set -euo pipefailat script start, quote all variables as"$var", and pass shellcheck validation
Files:
tooling/scripts/weave-validate.sh
tooling/scripts/**
⚙️ CodeRabbit configuration file
Build and validation scripts. weave-validate.sh is the single validation entrypoint — all CI checks must be reproducible locally through this script. Review for: shellcheck compliance, idempotency, clear error messages, and that new validation steps are added to both weave-validate.sh and ci.yml.
Files:
tooling/scripts/weave-validate.sh
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: ANcpLua/ancplua-claude-plugins
Timestamp: 2026-05-20T04:51:19.520Z
Learning: Rider IDE hints from the daemon must be applied to an isolated dry-run branch via JetBrains MCP server; never commit, push, or suppress hints
Learnt from: CR
Repo: ANcpLua/ancplua-claude-plugins
Timestamp: 2026-05-20T04:51:19.520Z
Learning: Release workflow for .NET repos must auto-detect three patterns: auto-bump on main, tag with manual approval, or tag-direct; never edit <Version> lines, never reassign ghost tags
Learnt from: CR
Repo: ANcpLua/ancplua-claude-plugins
Timestamp: 2026-05-20T04:51:19.520Z
Learning: Mutation-minded testing must prioritize kill power over code coverage; tests should focus on behavior-first quality with mutation testing as the signal
Learnt from: CR
Repo: ANcpLua/ancplua-claude-plugins
Timestamp: 2026-05-20T04:51:19.520Z
Learning: Code elegance is measured as problem-complexity / solution-complexity; prefer less code, compile-time solutions over runtime, and zero suppression
Learnt from: CR
Repo: ANcpLua/ancplua-claude-plugins
Timestamp: 2026-05-20T04:51:19.520Z
Learning: Multi-agent orchestration workflows must use reactive collaboration via Teams API (SendMessage) instead of fire-and-fire subagents
Learnt from: CR
Repo: ANcpLua/ancplua-claude-plugins
Timestamp: 2026-05-20T04:51:19.520Z
Learning: Commit integrity checks and CI verification scripts must be part of the cognitive amplification stack for epistemic validation
Learnt from: CR
Repo: ANcpLua/ancplua-claude-plugins
Timestamp: 2026-05-20T04:51:19.520Z
Learning: Agent output must be routed to single self-contained .html files based on Thariq Shihipar's html-effectiveness pattern catalog with 20 canonical patterns
Learnt from: CR
Repo: ANcpLua/ancplua-claude-plugins
Timestamp: 2026-05-20T04:51:19.520Z
Learning: Correctness in agent systems must be inferred exclusively from externally observable behavior, not code opaqueness
🔇 Additional comments (2)
tooling/scripts/weave-validate.sh (1)
71-94: LGTM!Also applies to: 141-147
plugins/html-effectiveness/skills/html-effectiveness/assets/agent-spawn-deck-demo.html (1)
348-348: LGTM!
| "--add-dir /Users/ancplua/repo-audit " + | ||
| "--add-dir \"$HOME/repo-audit\" " + | ||
| "'" + t.prompt.replace(/'/g, "'\\''") + "' \\", | ||
| " > ~/repo-audit/scans/" + t.id + ".log 2>&1 &" |
There was a problem hiding this comment.
Quote tilde-based paths to complete the portability pattern.
Lines 350, 361, and 370 use unquoted ~ expansion; breaks for home directories with spaces, same as the issue fixed on line 348.
Proposed fix
- " > ~/repo-audit/scans/" + t.id + ".log 2>&1 &"
+ " > \"$HOME/repo-audit/scans/" + t.id + ".log\" 2>&1 &"- "mkdir -p ~/repo-audit/scans",
+ "mkdir -p \"$HOME/repo-audit/scans\"",- lines.push("ls -la ~/repo-audit/scans/");
+ lines.push("ls -la \"$HOME/repo-audit/scans/\"");Also applies to: 361-361, 370-370
🤖 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/html-effectiveness/skills/html-effectiveness/assets/agent-spawn-deck-demo.html`
at line 350, The shell redirection string that builds the path using ~ (e.g. "
> ~/repo-audit/scans/" + t.id + ".log 2>&1 &") should quote the tilde-expanded
path so home directories with spaces are handled; update each occurrence (the
string concatenation that uses t.id) to wrap the path in quotes inside the shell
command (for example change > ~/repo-audit/... to > " ~/repo-audit/... " or
better > " ~/repo-audit/scans/" + t.id + ".log" 2>&1 &) ensuring proper escaping
for the surrounding JS/HTML string literal so the final shell sees a quoted
path.
| if (r1.ok) { | ||
| const idx1 = await r1.json(); | ||
| if (wantedVersion) { | ||
| let found = false; | ||
| for (const page of idx1.items) { | ||
| const items = page.items || (await fetchJson(page['@id'])).items; | ||
| for (const it of items) { | ||
| if (it.catalogEntry.version === wantedVersion) { | ||
| found = true; | ||
| break; | ||
| } | ||
| } | ||
| if (found) break; | ||
| } | ||
| if (!found) { | ||
| const c2 = new AbortController(); | ||
| const t2 = setTimeout(() => c2.abort(), 15000); | ||
| let r2; | ||
| try { | ||
| r2 = await fetch(SEMVER2_GZ(lower), { signal: c2.signal }); | ||
| clearTimeout(t2); | ||
| } catch (e) { | ||
| clearTimeout(t2); | ||
| if (e.name === 'AbortError') { | ||
| throw new Error(`Request timeout after 15s for gz-semver2 endpoint`); | ||
| } | ||
| throw e; | ||
| } | ||
| if (r2.status === 404) { | ||
| const err = new Error(`package not found on NuGet`); | ||
| err.status = 404; | ||
| throw err; | ||
| } | ||
| if (!r2.ok) throw new Error(`gz-semver2 endpoint returned HTTP ${r2.status}`); | ||
| const buf = Buffer.from(await r2.arrayBuffer()); | ||
| return JSON.parse(gunzipSync(buf).toString('utf8')); | ||
| } | ||
| } | ||
| return idx1; |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial | ⚡ Quick win
Do not walk the SemVer1 feed twice for Pkg@ver.
This probe fetches every SemVer1 page to decide whether to fall back, then Line 140 walks the same pages again in findEntry(). Return the matching item from fetchRegistration() or hydrate page.items once so versioned lookups stay single-pass.
Also applies to: 139-140
🤖 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/nuget-opensrc/bin/nuget-opensrc` around lines 52 - 90, The current
loop over idx1.items fetches SemVer1 pages to check for wantedVersion but does
not preserve the discovered item/page, causing a second walk in findEntry();
update fetchRegistration() so when you find the matching catalogEntry (inside
the for (const page of idx1.items) / for (const it of items) loops) you either
return that matching item immediately (so fetchRegistration() yields the
versioned entry) or assign the fetched items back to page.items (e.g.,
page.items = items) before returning idx1 so subsequent findEntry() reuses the
hydrated page and avoids re-fetching; ensure this change references idx1, page,
items, wantedVersion, and findEntry() so lookups stay single-pass.
Triage Bot report
Threads marked |
1 similar comment
Triage Bot report
Threads marked |
|
To use Codex here, create an environment for this repo. |
|
To use Codex here, create an environment for this repo. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 9478
What's actually in the code (confirmed current state)
Remaining blockers — all require manual dismissal only
No further code changes needed from me. This is now purely a manual dismissal exercise on the third-party bot threads. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 9721 🏁 Script executed: Length of output: 37864
🟡 iM6DXWVC —
|
| Thread | Bot | Status |
|---|---|---|
| iM6DV9KY, iM6DV9Kb | Codacy | weave-validate.sh now uses `find -print0 + tr -cd '\0' |
| iM6DV9Kc, iM6DV9Ke | Codacy | Informational (regex/key changes already applied) — dismiss |
| iM6DV9vD | Copilot | ShellCheck null-delimited fix confirmed — dismiss |
| iM6DXRSF | Copilot | Complains about grep -zc producing 0\n0 — current code uses tr-based counting instead, making this thread stale — dismiss |
| iM6DXRSM | Copilot | Unquoted $HOME — fixed in autofix commit 3e0f262 — dismiss |
| iM6DV9vM / iM6DXRSQ | Copilot | PR title says docs-only but includes validation/plugin additions — update the PR title to reflect actual scope or dismiss |
| iM6DV9vQ | Copilot | html-effectiveness already bumped to 1.2.1 in the manifest — dismiss |
| iM6DXINz, iM6DXIN1 | chatgpt-codex | Semver2 fallback for pinned versions — fixed in current fetchRegistration() — dismiss |
| iM6DXINv | chatgpt-codex | Claims gunzipSync double-decompresses: NuGet's registration5-gz-semver2 uses content-level gzip (Content-Type: application/gzip), not HTTP transport encoding — Node's fetch only auto-decodes Content-Encoding: gzip, so gunzipSync is correct. Dismiss after verifying locally with curl -I on the endpoint. |
| iM6DV9D5 | chatgpt-codex-connector | Configure a Codex environment or dismiss manually — won't self-resolve |
[resolve]
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 028918012b
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| const at = spec.indexOf('@'); | ||
| const id = at >= 0 ? spec.slice(0, at) : spec; | ||
| const wantedVersion = at >= 0 ? spec.slice(at + 1) : null; | ||
| if (!id) throw new Error(`empty package id in '${spec}'`); |
There was a problem hiding this comment.
Reject empty @Version in package specs
Treating spec with a trailing @ as valid causes silent mis-resolution: for input like Microsoft.Extensions.Logging@, wantedVersion becomes an empty string, and downstream checks (if (wantedVersion)) treat it as “no version provided,” so the command fetches the latest package instead of failing fast. In a commit-pinning tool this typo path can silently return the wrong source revision; it should be a usage error (exit 2) rather than defaulting to latest.
Useful? React with 👍 / 👎.
| if (!['path', 'info'].includes(cmd) || !spec) { | ||
| process.stderr.write('usage: nuget-opensrc (path|info) <Package.Id>[@<version>]\n'); | ||
| return 2; | ||
| } |
There was a problem hiding this comment.
Reject unexpected extra CLI arguments
The CLI accepts any additional tokens after <Pkg>[@<ver>] and silently ignores them because it only reads args[1]. That means invocations like nuget-opensrc path Microsoft.Extensions.Logging @8.0.0 resolve Microsoft.Extensions.Logging as if no version was requested, returning the latest commit instead of failing. For a commit-accuracy tool, extra positional arguments should be treated as invalid usage rather than partially parsed.
Useful? React with 👍 / 👎.
Triage Bot report
Threads marked |
1 similar comment
Triage Bot report
Threads marked |
|
To use Codex here, create an environment for this repo. |
|
To use Codex here, create an environment for this repo. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 24398
✅ Third-party threads — all stale, confirmed safe to dismiss
🔴 Remaining code fixesiM6DXWVC — Lines 350, 361, 370 in - " > ~/repo-audit/scans/" + t.id + ".log 2>&1 &"
+ " > \"$HOME/repo-audit/scans/" + t.id + ".log\" 2>&1 &"
- "mkdir -p ~/repo-audit/scans",
+ "mkdir -p \"$HOME/repo-audit/scans\"",
- lines.push("ls -la ~/repo-audit/scans/");
+ lines.push("ls -la \"$HOME/repo-audit/scans/\"");iM6DXWVE — iM6DXYrC (codex P2) — const wantedVersion = at >= 0 ? spec.slice(at + 1) : null;
if (!id) throw new Error(`empty package id in '${spec}'`);
+ if (at >= 0 && !wantedVersion) {
+ process.stderr.write('usage: nuget-opensrc (path|info) <Package.Id>[@<version>]\n');
+ return 2;
+ }iM6DXYrD (codex P2) — Extra args silently ignored; if (!['path', 'info'].includes(cmd) || !spec) {
+ if (args.length > 2) {
+ process.stderr.write('usage: nuget-opensrc (path|info) <Package.Id>[@<version>]\n');
+ return 2;
+ }Running autofix on the two CodeRabbit threads now. [resolve] |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 20107
✅ Confirmed already-fixed (stale triage entries)
🔴 My 2 threads — code fixes still needediM6DXWVC — - " > ~/repo-audit/scans/" + t.id + ".log 2>&1 &"
+ " > \"$HOME/repo-audit/scans/" + t.id + ".log\" 2>&1 &"
- "mkdir -p ~/repo-audit/scans",
+ "mkdir -p \"$HOME/repo-audit/scans\"",
- lines.push("ls -la ~/repo-audit/scans/");
+ lines.push("ls -la \"$HOME/repo-audit/scans/\"");iM6DXWVE — for (const page of idx1.items) {
- const items = page.items || (await fetchJson(page['`@id`'])).items;
+ const items = page.items ?? (await fetchJson(page['`@id`'])).items;
+ page.items = items; // hydrate so findEntry() reuses without re-fetching
for (const it of items) {
|
| Threads | Bot | Action |
|---|---|---|
| iM6DV9KY, iM6DV9Kb, iM6DV9Kc, iM6DV9Ke | Codacy | All underlying changes are in code — dismiss |
| iM6DV9vD, iM6DXRSF, iM6DXRSM | Copilot | Stale — fixes confirmed in code — dismiss |
| iM6DV9vM, iM6DXRSQ | Copilot | PR title/description scope mismatch — update PR title or dismiss |
| iM6DV9vQ | Copilot | Already at 1.2.1 — dismiss |
| iM6DXINv | chatgpt-codex | gunzipSync is correct: NuGet's gz-semver2 is content-level application/gzip, not Content-Encoding — Node fetch does not auto-decompress it — dismiss |
| iM6DXINz, iM6DXIN1 | chatgpt-codex | SemVer2 fallback is in fetchRegistration — dismiss |
| iM6DV9D5 | chatgpt-codex-connector | Configure a Codex environment or dismiss manually |
Bottom line: 3 lines across 2 files fix my threads; 4 lines in nuget-opensrc fix the chatgpt-codex P2 bugs.
This pull request makes a minor update to the plugin manifest by refining the plugin's description to be more concise and focused.
descriptionfield inplugin.jsonto clarify and streamline the explanation of the plugin's features, emphasizing its CLI nature and the main evaluation tasks it supports.