Skip to content

feat: add thariq-skills plugin - #53

Merged
kyle-sexton merged 3 commits into
mainfrom
feat/publish-thariq-skills
Jul 11, 2026
Merged

feat: add thariq-skills plugin#53
kyle-sexton merged 3 commits into
mainfrom
feat/publish-thariq-skills

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Closes melodic-software/medley#1294.

Publishes the thariq-skills plugin per docs/MIGRATION-PLAYBOOK.md (per-plugin gate + acceptance security review).

What ships

  • plugins/thariq-skills/ — one knowledge skill (/thariq-skills:thariq-skills): Anthropic's internal skill-authoring playbook (9 skill categories, 9 authoring tips, distribution guidance), distilled from Thariq's March 17, 2026 post.
  • Verbatim upstream baseline at skills/thariq-skills/vendor/SKILL.md (SHA-verified byte-identical to the source repo copy) for drift detection.
  • Maintainer-facing scripts/update.sh (--check read-only drift report / --apply vendor + frontmatter sync; distilled-body integration stays manual) with self-contained update.test.sh (18 checks, network-free).
  • Marketplace entry: category: learning, tags knowledge + component tags. Explicit version: 0.1.0 in plugin.json only.
  • Vendor-scoped nested .markdownlint-cli2.jsonc (default: false) — verbatim third-party content is exempted from local style rules without touching the managed root config (nested-config merge verified locally in the exact CI invocation form).

Gate evidence

  • claude plugin validate ./plugins/thariq-skills --strict — PASS
  • claude plugin validate . --strict (catalog manifest) — PASS
  • claude plugin details token cost: ~248 tok always-on, ~2.8k on-invoke (single skill)
  • --plugin-dir smoke test in a clean non-source repo — PASS: skill invoked, content answered correctly, namespace confirmed as thariq-skills:thariq-skills
  • update.test.sh 18/18 PASS; shellcheck (repo rcfile) clean; shfmt clean; markdownlint 0 errors; typos clean; editorconfig-checker clean

Security review (playbook acceptance)

  • No hooks, no MCP servers, no agents, no userConfig — pure skill content.
  • Code execution surface: scripts/update.sh only, run solely on explicit maintainer invocation (never automatic). Sole network egress: curl to https://howborisusesclaudecode.com/api/install-thariq (the upstream source) — no other outbound calls, no eval, no untrusted input into shell.
  • Cache isolation: no ../ reach-outs; script resolves paths relative to itself.
  • No PII / secrets.

Repo-agnostic: no source-repo references; body + script rewritten for plugin form (namespaced self-references, script-relative path resolution).


Note

Low Risk
Documentation-only skill surface for consumers; limited risk from optional maintainer update script that fetches a fixed upstream URL and writes only within the plugin tree.

Overview
Adds a new thariq-skills marketplace plugin that exposes Anthropic’s skill-authoring playbook as an on-demand knowledge skill (/thariq-skills:thariq-skills), and registers it in marketplace.json and the root README catalog (learning category).

The plugin ships a distilled SKILL.md (nine skill categories, nine authoring tips, distribution guidance) plus a verbatim vendor/SKILL.md baseline for drift checks. Maintainers can run scripts/update.sh (--check / --apply) to compare or refresh the vendor copy and bump frontmatter metadata; merging upstream changes into the distilled body stays manual. update.test.sh covers the script helpers without network access, and vendor/.markdownlint-cli2.jsonc disables lint on third-party vendor content.

No hooks, MCP, agents, or userConfig — normal use is read-only skill content; only the explicit maintainer update path uses curl to the upstream install URL.

Reviewed by Cursor Bugbot for commit 83ac699. Bugbot is set up for automated code reviews on this repo. Configure here.

Ships Anthropic's internal skill-authoring playbook as an on-demand
knowledge skill: 9 skill categories, 9 authoring tips, and distribution
guidance, distilled from Thariq's March 17, 2026 post. Bundles the
verbatim upstream baseline under vendor/ plus a maintainer-facing
drift-check update script (--check/--apply) with self-contained
regression tests. A vendor-scoped nested markdownlint config exempts the
verbatim third-party baseline from local style rules without touching
the managed root config.

Co-Authored-By: Claude <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 11, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_8517580f-37db-449c-a95c-4aa3cbb755a9)

@claude

claude Bot commented Jul 11, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 3m 26s —— View job


PR Review: feat: add thariq-skills plugin

  • Gather context and read changed files
  • Review plugin structure and manifest files
  • Review skill content (SKILL.md)
  • Review vendor baseline and markdownlint config
  • Review update scripts (update.sh, update.test.sh)
  • Check security surface (egress, code execution, isolation)
  • Check repo-agnostic / plugin-form compliance
  • Compile findings and post review

Overall this is a well-structured, thoughtfully documented submission. Plugin form compliance is solid (explicit version, repo-agnostic, no ../ reach-outs, no PII/secrets, single declared egress point). Below are findings ranked by severity.


Medium

1. Content attribution in distilled SKILL.md

The distilled skill is described as "Anthropic's internal skill-authoring playbook" in its frontmatter description and in the source attribution at the bottom — but Tip #7 and the Quick Reference table contain content that is not present in the vendored upstream (${CLAUDE_EFFORT} paragraph and the "Adapt to effort" Quick Reference row).

Comparing:

The distillation enhancement is reasonable, but framing all content as Anthropic's playbook misattributes the additions. The description frontmatter or the "Source" line should clarify that ${CLAUDE_EFFORT} is a plugin-layer enhancement, not from the original post. A maintainer doing drift review (git diff HEAD -- vendor/SKILL.md) would also have no signal that this delta is intentional rather than accidental.

Suggested fix: Add a brief note (e.g. ``) adjacent to the added content, or qualify the attribution line as "distilled from and extended from @trq212's post."

Fix this →


2. Third-party domain for upstream source without content validation

update.sh line 28:

INSTALL_URL="https://howborisusesclaudecode.com/api/install-thariq"

howborisusesclaudecode.com is an informal third-party domain. The --apply path replaces vendor/SKILL.md verbatim with whatever is served there — no content structure check, no pinned expected SHA. If the domain expires or changes hands, a future maintainer running --apply would silently overwrite the vendor file with arbitrary content.

The blast radius is limited (vendor baseline only, not the installed skill), and it's maintainer-only, but the risk is worth mitigating. A pinned known-good SHA stored in the repository and checked before cp would eliminate the silent-overwrite risk. This is essentially a supply-chain concern for the vendor baseline, not the installed skill itself.


Low

3. fetch_upstream suppresses all curl diagnostics

update.sh line 82:

curl -sSL --fail --max-time 30 "$INSTALL_URL" -o "$out" 2>/dev/null || return 1

2>/dev/null drops all curl stderr. On failure, run_check emits only "network or DNS issue" with no actionable diagnostic (no HTTP status, no SSL error, no timeout detail). Removing the suppression or capturing stderr to a temp file and surfacing it on failure would make debugging easier for maintainers.

Fix this →

4. replace_metadata_field interpolates field name directly into sed ERE

update.sh lines 99–100:

sed -E "s|^([[:space:]]+${field}:[[:space:]]+).*\$|\\1${value_safe}|" \
  "$FRONTMATTER_FILE" >"$tmp"

$field is interpolated directly into the regex. Currently safe because all callers pass known-safe strings (upstream-version, synced). But upstream-version contains -, which is harmless outside a character class; if a future field name contained ., *, or [, the pattern would silently match incorrectly. A minor robustness gap, not an active bug.

5. Update subcommand path ambiguity in SKILL.md

SKILL.md line 15:

/thariq-skills:thariq-skills update runs scripts/update.sh

The instruction refers to scripts/update.sh without grounding it in ${CLAUDE_PLUGIN_ROOT}. In a maintainer checkout (the intended context) the relative path works. If a consumer invokes /thariq-skills:thariq-skills update from their own project, Claude would look for scripts/update.sh relative to CWD and fail. Explicitly saying ${CLAUDE_PLUGIN_ROOT}/skills/thariq-skills/scripts/update.sh or hardening the instruction to say "run from the plugin checkout directory" would eliminate ambiguity.

Fix this →


Informational

6. run_check / run_apply not covered by tests

update.test.sh covers arg parsing, source guard, and all pure helper functions. The two core orchestration functions (run_check, run_apply) are untested because they require network access. This is acknowledged in the test file comment and is a reasonable trade-off for a network-dependent script. The 18/18 pass claim covers only the pure-function surface.

7. Marketplace tags vs plugin.json keywords minor inconsistency

plugin.json has "skills" (plural); the marketplace entry has "skill" (singular). These serve different purposes and there's no schema requirement to align them, but it may cause confusion when filtering by tag.


Checklist

Item Status
Explicit version in plugin.json 0.1.0
Repo-agnostic (no hardcoded paths)
plugin.json $schema present
Marketplace $schema present
No ../ reach-outs
No PII / secrets
Single declared egress point howborisusesclaudecode.com (maintainer-only)
No hooks / MCP / agents
userConfig not needed, not present
Source guard for test-sourceability BASH_SOURCE[0] == ${0}
Cleanup trap on script exit
set -uo pipefail (no set -e, intentional)
Content delta from vendor accounted for ⚠️ ${CLAUDE_EFFORT} added, attribution should clarify

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale comment

Risk: medium. Not approving: Cursor Bugbot completed with a skipped status and left no review comment, so the required automated review signal is incomplete. Human review is needed; no reviewers were assigned because no suitable non-author maintainers were identified in this repository.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router and Approver

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fb6367b82c

ℹ️ 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".

Comment thread plugins/thariq-skills/skills/thariq-skills/SKILL.md Outdated
Comment thread plugins/thariq-skills/skills/thariq-skills/SKILL.md Outdated
Claude Code substitutes ${CLAUDE_PLUGIN_DATA} and ${CLAUDE_EFFORT}
inline in skill content, so the teaching prose now names them without
the dollar-brace wrapper; the update action path is anchored via
${CLAUDE_SKILL_DIR} so it resolves from any working directory.

Co-Authored-By: Claude <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 11, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_59a80e9d-b6ab-45d8-898a-e1469989ce0b)

@claude

claude Bot commented Jul 11, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 3m 4s —— View job


PR Review: feat: add thariq-skills plugin

  • Gather context and understand request
  • Read changed files (HEAD: 414ca52)
  • Verify previous findings are addressed (placeholder escaping, update script path)
  • Review manifest, marketplace entry, README
  • Review skill content and vendor baseline
  • Review update scripts
  • Post findings

This is a clean, well-scoped additive plugin. The latest commit (414ca52) correctly addresses both issues raised in the previous automated review round. Findings below are ordered by severity; two Mediums from the first round remain open.


Fixed since first review ✅

Placeholder variable substitution (Codex P2 / previous review #1 table)
SKILL.md lines 97–103${CLAUDE_PLUGIN_DATA} and ${CLAUDE_EFFORT} are now written without their dollar-brace wrapper in teaching prose, and the Quick Reference table uses plain backtick names. The explanatory note at line 103 makes the intent unambiguous. Correct fix.

Update script path (Codex P2 / previous Low #5)
SKILL.md line 15 — path now anchored via ${CLAUDE_SKILL_DIR}, which Claude Code substitutes to the directory containing this SKILL.md at load time. Resolves the CWD-ambiguity concern.


Medium — still open

1. CLAUDE_EFFORT tip is an addition over the upstream; attribution doesn't say so

The distilled skill adds a CLAUDE_EFFORT paragraph (lines 101–103) and a tenth "Adapt to effort" row to the Quick Reference table that are absent from vendor/SKILL.md. The source line at line 158 still reads:

Source: @trq212's March 17, 2026 post

Without any note that the skill extends the original. A maintainer running git diff HEAD -- vendor/SKILL.md to spot intentional vs accidental drift has no signal that this delta is deliberate. The fix from the previous round (explanatory note about placeholder syntax) is unrelated to this concern.

One-liner fix: change Source: to Source (distilled and extended): or add `` adjacent to the added content.

Fix this →

2. Vendor sync fetches from an informal third-party domain without SHA pinning

update.sh line 28:

INSTALL_URL="https://howborisusesclaudecode.com/api/install-thariq"

--apply replaces vendor/SKILL.md verbatim with whatever is served at this URL — no content structure check, no last-known-good SHA guard. If the domain expires or changes hands, a future --apply run silently overwrites the vendor file with arbitrary content. Blast radius is limited (vendor baseline only, not the installed skill), and it's maintainer-only, but it's worth mitigating.

Suggested mitigation: store a PINNED_SHA constant in update.sh matching the SHA committed to vendor/SKILL.md, and after downloading in --apply compare the SHA and abort (with a message directing the maintainer to review and update the pin) if it has changed unexpectedly.


Low

3. curl diagnostic suppression in fetch_upstream

update.sh line 82:

curl -sSL --fail --max-time 30 "$INSTALL_URL" -o "$out" 2>/dev/null || return 1

2>/dev/null drops all curl stderr. On failure both run_check and run_apply emit only "network or DNS issue" or "failed to fetch" — no HTTP status, no SSL error, no timeout detail. Capturing stderr and forwarding it on failure would save maintainers a manual repro step.

Fix this →

4. replace_metadata_field interpolates $field into sed ERE without escaping

update.sh lines 99–100$field goes directly into the regex pattern. Currently safe (callers pass upstream-version and synced; - is harmless outside a character class). A future field containing ., *, or [ would silently match incorrectly. Not an active bug, but a small robustness gap.


Informational

5. run_check / run_apply not covered by tests

The 18 checks in update.test.sh cover all pure helper functions and the arg/flag contract; the two orchestration functions require network access and are intentionally out of scope. This is acknowledged in the test file and is a reasonable trade-off — the PR's "18/18 PASS" claim is accurate for the covered surface.

6. Marketplace tags vs plugin.json keywords minor inconsistency

plugin.json uses "skills" (plural); the marketplace entry uses "skill" (singular). No schema constraint requires alignment, but worth noting for filtering consistency.


Checklist

Item Status
Explicit version in plugin.json 0.1.0
Repo-agnostic (no hardcoded paths)
$schema in plugin.json and marketplace.json
No ../ reach-outs
No PII / secrets
Single declared egress point howborisusesclaudecode.com (maintainer-only)
No hooks / MCP / agents
userConfig not needed, not present
${CLAUDE_SKILL_DIR} anchors update script path ✅ fixed in 414ca52
Taught placeholders won't be substituted at load time ✅ fixed in 414ca52
Vendor vendor/SKILL.md SHA-verified pinning ⚠️ unpinned (Medium #2)
Added content attributed as plugin-layer extension ⚠️ attribution says "Based on" (Medium #1)

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale comment

Risk: medium. Not approving: Cursor Bugbot completed with a skipped status (usage limit reached) and did not produce a clean review signal. Human review is needed; no reviewers were assigned because no suitable non-author maintainers were identified in this repository.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router and Approver

…kills

# Conflicts:
#	.claude-plugin/marketplace.json
#	README.md
@cursor

cursor Bot commented Jul 11, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_2b5d781c-40da-48cb-8ee5-3af0ee0ce5c5)

@claude

claude Bot commented Jul 11, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 34s —— View job


PR Review: feat: add thariq-skills plugin

  • Gather context and read changed files (HEAD: 83ac699)
  • Check what changed since last review round (414ca5283ac699)
  • Verify open findings from prior reviews
  • Post findings

The latest commit (83ac699) is a merge of origin/main into this branch — it brings in the context7 plugin (#54) and nothing else. No files in plugins/thariq-skills/ changed since 414ca52, so the two open Mediums from the previous round remain unaddressed.


Fixed ✅

Finding Status
Placeholder variables substituted on load (Codex P2) Fixed in 414ca52
Update script path unanchored (Low #5 prior round) Fixed in 414ca52 via ${CLAUDE_SKILL_DIR}

Medium — still open

1. Distilled body adds content absent from vendor; attribution doesn't say so

SKILL.md line 158:

Source: @trq212's March 17, 2026 post

The distilled skill adds a CLAUDE_EFFORT paragraph (lines 101–103) and a tenth "Adapt to effort" row in the Quick Reference (line 152) that are absent from vendor/SKILL.md, which has 9 Quick Reference rows and no CLAUDE_EFFORT guidance. The source line implies all content originates from the upstream post. A maintainer doing drift review has no signal that this delta is intentional rather than accidental.

Minimum fix — change line 158 from:

Source: [@trq212's March 17, 2026 post]()

to:

Source (distilled and extended): [@trq212's March 17, 2026 post]()

Fix this →


2. --apply overwrites vendor baseline without SHA guard

update.sh line 28 + lines 177–179:

INSTALL_URL="https://howborisusesclaudecode.com/api/install-thariq"
…
cp "$upstream_md" "$VENDOR_FILE"

--apply replaces vendor/SKILL.md verbatim with whatever is served at this informal third-party domain — no content structure check, no last-known-good SHA guard. If the domain expires or changes hands, a future --apply silently overwrites the vendor file with arbitrary content. Blast radius is limited to the vendor baseline (not the installed skill), and this is maintainer-only, but worth pinning.

Suggested mitigation: store a PINNED_VENDOR_SHA constant in update.sh matching the SHA committed to vendor/SKILL.md, compare after download, and abort with a "review and update the pin" message if the SHA changed unexpectedly.

Fix this →


Low

3. fetch_upstream suppresses all curl diagnostics

update.sh line 82:

curl -sSL --fail --max-time 30 "$INSTALL_URL" -o "$out" 2>/dev/null || return 1

2>/dev/null discards all curl stderr. On failure both run_check and run_apply print only "network or DNS issue" / "failed to fetch" — no HTTP status, no SSL error, no timeout detail. Capturing stderr and forwarding it on failure would save maintainers a manual repro step.

Fix this →

4. replace_metadata_field interpolates $field into sed ERE without escaping

update.sh lines 99–100$field is interpolated directly into the regex. Currently safe (callers pass upstream-version and synced; - is harmless outside a character class). A future field containing ., *, or [ would silently match incorrectly. Not an active bug, but a robustness gap for a maintainer who adds a new field name later.


Informational

5. run_check / run_apply not covered by unit tests — acknowledged as a reasonable trade-off (network dependency). The "18/18 PASS" claim accurately reflects the covered surface (pure helpers + arg/flag contract).

6. keywords vs marketplace tags minor inconsistencyplugin.json uses "skills" (plural); the marketplace entry uses "skill" (singular). No schema constraint requires alignment, but worth noting for filtering consistency.


Checklist

Item Status
Explicit version in plugin.json 0.1.0
Repo-agnostic (no hardcoded paths)
$schema in plugin.json and marketplace.json
No ../ reach-outs
No PII / secrets
Single declared egress point howborisusesclaudecode.com (maintainer-only)
No hooks / MCP / agents
userConfig not needed, not present
${CLAUDE_SKILL_DIR} anchors update script path ✅ fixed in 414ca52
Taught placeholders won't be substituted at load time ✅ fixed in 414ca52
Vendor SHA pinning in --apply ⚠️ not pinned (Medium #2)
Added content attributed as plugin-layer extension ⚠️ Source: not qualified (Medium #1)

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Risk: medium. Not approving: Cursor Bugbot completed with a skipped status (usage limit reached) and did not produce a clean review signal. Human review is needed; no reviewers were assigned because no suitable non-author maintainers were identified in this repository.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router and Approver

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 83ac699aa8

ℹ️ 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".

Comment thread plugins/thariq-skills/skills/thariq-skills/scripts/update.sh
Comment thread plugins/thariq-skills/skills/thariq-skills/scripts/update.sh
@kyle-sexton
kyle-sexton merged commit b966293 into main Jul 11, 2026
22 checks passed
@kyle-sexton
kyle-sexton deleted the feat/publish-thariq-skills branch July 11, 2026 11:28
kyle-sexton added a commit that referenced this pull request Jul 11, 2026
Closes melodic-software/medley#1292.

Publishes the `boris` plugin per `docs/MIGRATION-PLAYBOOK.md`
(per-plugin gate + acceptance security review).

## What ships

- `plugins/boris/` — one knowledge skill (`/boris:boris`): Boris
Cherny's Claude Code workflow tips (howborisusesclaudecode.com), 107
tips across 95 sections, hub SKILL.md + eight topic reference files
(progressive disclosure).
- Verbatim upstream baseline at `skills/boris/vendor/SKILL.md`
(SHA-verified byte-identical to the source repo copy) for drift
detection.
- Maintainer-facing `scripts/update.sh` (`--check` read-only drift
report / `--apply` vendor + frontmatter sync; reference-file integration
stays manual) with self-contained `update.test.sh` (19 checks,
network-free).
- Marketplace entry: `category: learning`, tags `knowledge` + component
tags. Explicit `version: 0.1.0` in `plugin.json` only.
- Vendor-scoped nested `.markdownlint-cli2.jsonc` (`default: false`) —
verbatim third-party content exempted from local style rules without
touching the managed root config (same pattern as PR #53).

## Gate evidence

- `claude plugin validate ./plugins/boris --strict` — PASS
- `claude plugin validate . --strict` (catalog manifest) — PASS
- `claude plugin details` token cost: **~211 tok always-on**, ~3.7k
on-invoke (single skill)
- `--plugin-dir` smoke test in a clean non-source repo — PASS: skill
invoked, routed worktrees question to `reference/worktrees.md`,
namespace confirmed as `boris:boris`
- `update.test.sh` 19/19 PASS; shellcheck (repo rcfile) clean; shfmt
clean; markdownlint 0 errors (11 files); typos clean;
editorconfig-checker clean

## Security review (playbook acceptance)

- No hooks, no MCP servers, no agents, no `userConfig` — pure skill
content.
- Code execution surface: `scripts/update.sh` only, run solely on
explicit maintainer invocation (never automatic). Sole network egress:
`curl` to `https://howborisusesclaudecode.com/api/version` and
`/api/install` (the upstream source, which publishes these endpoints for
exactly this consumption) — no other outbound calls, no `eval`, no
untrusted input into shell.
- Cache isolation: no `../` reach-outs; script resolves paths relative
to itself; update path in the skill body anchored via
`${CLAUDE_SKILL_DIR}`.
- Taught placeholder names are written without their dollar-brace
wrapper so Claude Code's inline substitution cannot rewrite the teaching
content (lesson from PR #53 review).
- No PII / secrets.

Repo-agnostic: no source-repo references; body + script rewritten for
plugin form (namespaced self-references, script-relative path
resolution).

Merge note: expected `marketplace.json` + root `README.md` conflict with
PR #53 (thariq-skills) — the playbook prescribes serializing final
merges; whichever lands second rebases the two shared files.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Read-only knowledge skill with no hooks or MCP; network use is limited
to maintainer-invoked `update.sh` against the documented upstream URLs.
> 
> **Overview**
> Adds the **`boris`** marketplace plugin: Boris Cherny’s Claude Code
tips from howborisusesclaudecode.com, packaged like **`thariq-skills`**
with progressive disclosure instead of one huge skill file.
> 
> **Catalog:** `boris` is registered in
**`.claude-plugin/marketplace.json`** (`learning`) and summarized in the
root **`README.md`**.
> 
> **Skill shape:** Hub **`SKILL.md`** (`/boris:boris`) with a topic
index, quick reference, and **`update`** actions; eight
**`reference/*.md`** topic slices (foundations through orchestration);
verbatim **`vendor/SKILL.md`** for SHA drift checks. The hub tells
agents to treat vendor content as untrusted (ignore upstream’s
self-install **UPDATE CHECK** block).
> 
> **Maintainer tooling:** **`scripts/update.sh`** (`--check` /
`--apply`) hits the site’s version/install APIs, syncs vendor +
frontmatter, and leaves reference integration manual;
**`update.test.sh`** covers helpers offline; vendor gets a nested
**markdownlint** off config so third-party text isn’t restyled locally.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
7b85408. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude <noreply@anthropic.com>
@claude claude Bot mentioned this pull request Jul 11, 2026
kyle-sexton added a commit that referenced this pull request Jul 11, 2026
Closes melodic-software/medley#1285.

Publishes the `docs-hygiene` plugin per `docs/MIGRATION-PLAYBOOK.md`
(per-plugin gate + acceptance security review). One cohesive capability
— documentation hygiene — bundling five skills.

## What ships

- `/docs-hygiene:compress` — flavor-trims markdown behind a mandatory
fresh-context semantic-diff audit that reverts any semantic loss;
optional `caveman` plugin backend (qualified `/caveman:compress`
invocation, graceful in-session Edit fallback); optional snapshots
persist under the plugin data directory.
- `/docs-hygiene:declutter` — read-only classifier for five markdown
noise shapes with internalized shape definitions, tier semantics,
exemptions, and opt-out markers (no source-repo rule dependencies).
- `/docs-hygiene:extract-ssot` — Rule-of-Three deduplication into a
single source of truth with refuse-fast verification gates and
internalized evidence discipline.
- `/docs-hygiene:encapsulation-audit` — detects citations into
skill-private surfaces; ships its own
`context/public-surface-contract.md`; detector generalized to scan any
consumer repo's instruction surfaces.
- `/docs-hygiene:rename-references` — 12-form stale-reference pattern
library (slash tokens, moved-file relative paths, frontmatter
chains/globs) with audit, half-rename, and apply modes.

Adaptation notes: source-repo rule citations internalized or routed to
the consuming repo's own CLAUDE.md/rules; scripts resolve paths via
BASH_SOURCE and scan the repo they run in; `${CLAUDE_SKILL_DIR}` anchors
all script invocations; taught placeholder names written without
dollar-brace wrappers (substitution lesson from PR #53); eval suites
intentionally NOT shipped (the eval runner is authoring-repo-side;
shipping them would be dead weight with broken references).

## Gate evidence

- `claude plugin validate ./plugins/docs-hygiene --strict` — PASS;
`claude plugin validate . --strict` (catalog) — PASS
- `claude plugin details` token cost: **~1,161 tok always-on** (compress
~340, declutter ~280, encapsulation-audit ~150, extract-ssot ~170,
rename-references ~230); on-invoke ~2.6k–6.4k per skill
- Script tests: 73 checks across 4 self-contained suites (compress 9,
declutter 17, encapsulation-audit 32, extract-ssot 15) — all pass,
network-free, fixture-repo based
- shellcheck (repo rcfile) clean on all 9 shell files; shfmt clean;
markdownlint 0 errors (24 files); typos clean; editorconfig-checker
clean
- `--plugin-dir` smoke test in a clean non-source repo — PASS:
`/docs-hygiene:declutter` invoked, answered the five noise shapes,
namespace confirmed as `docs-hygiene:declutter`

## Security review (playbook acceptance)

- No hooks, no MCP servers, no agents, no `userConfig`.
- Code execution surface: bundled scripts are read-only detectors and
fact emitters (grep/awk over the consuming repo's tracked files). **Zero
network egress** — verified by grep over all shell files (no
curl/wget/nc; the only `http` hit is a URL string inside a test
fixture).
- Cross-plugin trust: `compress` can delegate mechanical compression to
the third-party `caveman` plugin ONLY when the consumer has installed
it; detection is capability-probing, invocation is the qualified
`/caveman:compress` form, and the built-in fallback keeps the skill
fully functional without it. No other plugin is referenced.
- Cache isolation: no `../` reach-outs; state (optional compress
snapshots) goes to the plugin data directory.
- No PII / secrets.

Merge note: PRs #53 and #56 also touch `marketplace.json` + root
`README.md` — the playbook prescribes serializing final merges;
whichever lands later rebases the two shared files.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Documentation and read-only/local shell tooling only—no hooks, MCP,
network calls, or automatic repo writes beyond what users invoke via
skills; optional third-party `caveman` compression is opt-in.
> 
> **Overview**
> Adds the **`docs-hygiene`** plugin to the marketplace catalog and root
README, bundling five on-demand skills for keeping tracked markdown
lean, deduplicated, and correctly referenced in any consumer repo.
> 
> **`/docs-hygiene:compress`** tightens prose by cutting flavor while a
mandatory fresh-context semantic-diff pass reverts semantic loss; it
optionally uses the **`caveman`** plugin as a mechanical backend with an
in-session Edit fallback, snapshots, and `markdownlint-cli2` gates.
**`declutter`** is read-only noise classification (five shapes, tiered
findings) backed by **`detect.sh`** and shared shape detectors.
**`extract-ssot`** encodes Rule-of-Three markdown dedup with `identify`
/ `verify` / `plan` / `execute` / `batch` / `unwind`, private action
docs, and **`emit-verify-facts.sh`**. **`encapsulation-audit`** ships
**`public-surface-contract.md`** plus **`detect.sh`** (private skill
paths, heading anchors, schemas; `scripts/` carve-out).
**`rename-references`** is documented as the post-rename sweep skill
(12-form patterns); sibling skills cite it after migrations.
> 
> Scripts are repo-local, read-only where applicable, always-exit-0 or
explicit exit codes for audits, and covered by self-contained bash test
suites (`detect-caveman`, declutter, encapsulation-audit, extract-ssot).
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
e19b05c. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude <noreply@anthropic.com>
kyle-sexton added a commit that referenced this pull request Jul 11, 2026
Closes melodic-software/medley#1293.

Publishes the `fable-5-playbook` plugin per `docs/MIGRATION-PLAYBOOK.md`
(per-plugin gate + acceptance security review).

## What ships

- `plugins/fable-5-playbook/` — one knowledge skill
(`/fable-5-playbook:fable-5-playbook`): Claude Fable 5's operating
doctrine, authored by Fable 5 as introspected standing instructions.
Core doctrine arms the session on invocation; twelve trigger-routed
chapters under `context/` (calibration, reasoning-moves,
problem-framing, planning, execution, debugging, orchestration,
verification, communication, recovery, context-economy,
trust-and-authority) plus `context/opus-adaptation.md` for non-Fable
models.
- Marketplace entry: `category: learning`, tags `knowledge` + component
tags. Explicit `version: 0.1.0` in `plugin.json` only.
- The source skill was already repo-agnostic (no repo-specific paths,
tools, or slash references); the only content deltas from the source are
the frontmatter description compressed to two sentences and one typo fix
(`mis-framed` → `misframed`).

## Gate evidence

- `claude plugin validate ./plugins/fable-5-playbook --strict` — PASS;
`claude plugin validate . --strict` (catalog) — PASS
- `claude plugin details` token cost: **~207 tok always-on**, ~4.7k
on-invoke (single skill)
- markdownlint 0 errors (15 files); typos clean; editorconfig-checker
clean
- `--plugin-dir` smoke test in a clean non-source repo — PASS: skill
invoked, answered the four meta-rules (Precedence, One home per
doctrine, Model adaptation, Silent application), namespace confirmed as
`fable-5-playbook:fable-5-playbook`

## Security review (playbook acceptance)

- Pure knowledge skill: no hooks, no MCP servers, no agents, no
`userConfig`, no scripts, no state, zero network access.
- Cache isolation: all references are skill-internal (`context/*.md`
self-citations); no `../` reach-outs.
- No PII / secrets.

Merge note: open PRs #53, #56, #57 also touch `marketplace.json` + root
`README.md` — merge serially; later ones rebase/merge the two shared
files (this branch is based on post-context7 main, so it conflicts only
with those unmerged siblings).

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Markdown-only plugin packaging and catalog updates; no executable
code, credentials, or runtime side effects beyond skill text loaded into
Claude Code.
> 
> **Overview**
> Adds the **`fable-5-playbook`** plugin to the marketplace and root
catalog — a pure knowledge skill (no hooks, MCP, scripts, or
`userConfig`) that arms sessions with Claude Fable 5’s operating
doctrine.
> 
> **`SKILL.md`** loads core standing instructions on invoke (bare /
`full` / chapter name), defines four meta-rules, effort floors, a
chapter routing table, and cites twelve on-demand **`context/*.md`**
chapters (calibration through trust-and-authority) plus mandatory
**`opus-adaptation.md`** for non-Fable models. Plugin **`README.md`**
and **`plugin.json`** (`0.1.0`, learning category) document install and
scope.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
03fa989. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude <noreply@anthropic.com>
kyle-sexton added a commit that referenced this pull request Jul 11, 2026
Closes melodic-software/medley#1296.

Publishes the `firecrawl` plugin per `docs/MIGRATION-PLAYBOOK.md`
(per-plugin gate + acceptance security review).

## What ships

- `plugins/firecrawl/` — one skill (`/firecrawl:firecrawl`): wraps the
`firecrawl-cli` binary for
scrape/search/crawl/map/parse/interact/agent/monitor with the core
write-to-disk-then-Read pattern (results land in tempfiles via `-o`; the
agent reads only the needed slice — 32–35× token savings vs the MCP per
the Scalekit benchmark cited in the skill).
- `context/commands.md` (full flag tables, carried verbatim),
`context/configuration.md` + `context/update-flow.md` (adapted
repo-agnostic).
- Maintainer-facing `scripts/update.sh` (`--check` read-only CLI-version
+ upstream-SHA drift report; `--apply` npm upgrade + `UPSTREAM.md`
rewrite behind approval gates; never touches SKILL.md — content
integration is a gated manual step) with a new self-contained
`update.test.sh` (17 checks, network-free).
- `UPSTREAM.md` sidecar (SHA-tracking sync state + rollback version).
- Marketplace entry: `category: utilities`. Explicit `version: 0.1.0` in
`plugin.json` only.

## Gate evidence

- `claude plugin validate ./plugins/firecrawl --strict` — PASS; catalog
`--strict` — PASS
- `claude plugin details` token cost: **~253 tok always-on**, ~4.9k
on-invoke
- `update.test.sh` 17/17 PASS; shellcheck (repo rcfile) clean; shfmt
clean; markdownlint 0 errors; typos clean; editorconfig-checker clean
- Smoke test via `--plugin-dir` — PASS: skill body loaded, answered the
write-to-disk flag (`-o`) from the body, namespace confirmed as
`firecrawl:firecrawl`. The smoke run surfaced two real
headless-permission defects that are fixed in this PR: a
credential-shaped `printenv FIRECRAWL_API_KEY` preamble line was
rejected by permission preflight (removed — `firecrawl --status` already
reports auth), and the status/sync preamble lines needed narrow
`allowed-tools` grants (`Bash(command -v firecrawl*)`, `Bash(firecrawl
--status*)`, `Bash(grep -m1 *UPSTREAM.md*)`). Caveat: in a fully
sandboxed scratch dir the preamble lines may still fall back to their
error text; the skill body loads and functions regardless.

## Security review (playbook acceptance)

- No hooks, no MCP servers, no agents, no `userConfig`.
- Data egress (normal invocation): the user-installed `firecrawl-cli`
calls `api.firecrawl.dev` (or a self-hosted `FIRECRAWL_API_URL`) — that
is the plugin's documented purpose. The credential is the consumer-owned
`FIRECRAWL_API_KEY` env var; never stored in or written by the plugin.
Env-var auth is preferred over `firecrawl login`/`config` explicitly to
avoid a second credential store.
- Data egress (update path, maintainer-invoked only):
`registry.npmjs.org` (version metadata) + `www.firecrawl.dev` (upstream
skill source, hashed in a tmpdir). `npm install -g` and any SKILL.md
rewrite sit behind two explicit approval gates; `--check` is read-only.
- The skill hard-prohibits `firecrawl init` (would install a parallel
MCP + skill copy) and documents the login/config divergence risk.
- Cache isolation: script resolves paths relative to itself; preamble
reads its own `UPSTREAM.md` via the skill-dir substitution; no `../`
reach-outs.
- No PII / secrets.

Merge note: open PRs #53, #56, #57, #59 also touch `marketplace.json` +
root `README.md` — merge serially; later ones need a conflict-merge of
the two shared files.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> New plugin steers agents toward external Firecrawl API egress and
credit use via a user-installed CLI and `FIRECRAWL_API_KEY`; maintainer
`--apply` runs `npm install -g`, but there are no hooks/MCP and updates
are gated.
> 
> **Overview**
> **Adds a new `firecrawl` plugin** to the marketplace and root catalog,
shipping `/firecrawl:firecrawl` as the maintained `firecrawl-cli`
integration (scrape, search, crawl, map, parse, interact, agent,
monitor) instead of the Firecrawl MCP.
> 
> The skill centers on **write-to-disk then `Read`** (`-o` tempfiles)
with escalation tables for when to use Firecrawl vs WebFetch, narrow
**`allowed-tools`** for the status/sync preamble (`firecrawl --status`,
`UPSTREAM.md` grep), and prohibitions against `firecrawl init` /
login-style config drift. Supporting **`context/`** docs cover flags,
env defaults, and the maintainer update pipeline; **`UPSTREAM.md`**
records upstream SHA and CLI rollback versions.
> 
> **Maintainer tooling:** `scripts/update.sh` (`--check` read-only drift
vs npm + upstream skill; `--apply` global `npm install` + `UPSTREAM.md`
rewrite only, not `SKILL.md`) and network-free **`update.test.sh`**
regression checks.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
3184b4e. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude <noreply@anthropic.com>
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