
Marketplace Health Check
- 164 installs
- 1.3k repo stars
- Updated August 4, 2026
- daymade/claude-code-skills
Runs a 6-dimension parallel health check of a Claude Code skills marketplace repo, then reports findings by priority.
About
Runs a six-dimension parallel health check of a Claude Code skills marketplace repo covering code safety, docs consistency, PII, PR/issue triage, and manifest integrity. A developer uses it to audit the whole repo before a release.
- Six independent inspectors fan out in parallel via a workflow
- Covers code safety, docs, PII, PR/issue triage, and manifest integrity
Marketplace Health Check by the numbers
- 164 all-time installs (skills.sh)
- Ranked #366 of 1,352 Code Review & Quality skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/daymade/claude-code-skills --skill marketplace-health-checkAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 164 |
|---|---|
| repo stars | ★ 1.3k |
| Last updated | August 4, 2026 |
| Repository | daymade/claude-code-skills ↗ |
What it does
Runs a 6-dimension parallel health check of a Claude Code skills marketplace repo, then reports findings by priority.
Files
Marketplace Health Check
Run a comprehensive, evidence-based health check of this Claude Code skills marketplace repo using a parallel fan-out Dynamic Workflow. Six independent inspectors cover, in parallel:
1. Code & script safety — dangerous deletes, NO-FALLBACK secret leaks, hardcoded real paths, bare except, injection, missing shebangs 2. Documentation / SSOT consistency — version coherence across marketplace.json / README×2 / CHANGELOG / git release, skill & plugin counts, broken references, derived-value drift 3. Security / PII — keyword-free leaks gitleaks can't catch (real names, private domains), the .security-scan-passed marker gap, case-file audits 4. Open-PR triage — classify every PR (worth-merging / needs-changes / decline-as-promotion) 5. Open-issue triage — real bugs vs skill-requests vs promotion, plus the broken-install-command bug class 6. Marketplace-manifest integrity — check_marketplace.sh + check_doc_skill_lists.py, orphans, suite registration
Then YOU verify the serious findings and report by priority. The bundled script (scripts/repo-health-check.workflow.js) is the proven, ready-to-run workflow; this file is how to run and interpret it.
Why a workflow — and why it MUST run inline
The six dimensions are independent, so fanning them out across six parallel agents is far faster than one agent sweeping serially, and each inspector stays focused on one concern with its own structured output.
This skill must run inline (no `context: fork`). It orchestrates parallel agents through the Workflow tool, and a forked subagent cannot spawn subagents or launch a workflow — running it forked would silently break the fan-out. The Workflow tool also requires explicit user opt-in; a user asking to "run the health check" IS that opt-in, so proceed.
How to run
Step 1 — Scout the current scale (one quick pass, shared by all six agents)
The workflow script takes an args object so all agents share one accurate snapshot instead of each re-discovering it. Gather:
gh repo view --json nameWithOwner,stargazerCount,isPrivate | jq -c .
echo "skills: $(find . -name SKILL.md -not -path '*-workspace/*' | wc -l | tr -d ' ')"
echo "open PRs: $(gh pr list --state open --json number | jq length)"
echo "open issues: $(gh issue list --state open --json number | jq length)"
grep -A1 '"metadata"' .claude-plugin/marketplace.json | grep -oE '"version": "[^"]*"' | head -1
git rev-parse --short HEAD; gh release view --json tagName -q .tagName 2>/dev/nullConfirm isPrivate: false before treating PII as a publishing risk — the whole point is that this is a PUBLIC repo.
Step 2 — Launch the workflow
Read the bundled script and launch it inline via the `script` parameter (pass its contents, so there's no dependency on where the skill is installed):
Workflow({
script: <full contents of scripts/repo-health-check.workflow.js>,
args: { repo: "<owner/name>", scale: "<one-line summary from Step 1>" }
})It runs the six inspectors in parallel (~15-20 min, ~400-500k output tokens — tell the user the cost up front) and returns { checks: [...] }, one structured result per dimension: health + summary + findings[] (each with severity / title / detail / location / recommendation) + stats.
While it runs you can do other useful prep, but don't start editing files the inspectors are reading.
Step 3 — Counter-Review the serious findings BEFORE reporting
Agent findings are HYPOTHESES, not conclusions. Never relay them verbatim. For every high/critical finding, verify it yourself with a quick command — grep the leaked value, sed -n the broken line, gh repo view the claimed state — confirming it's (a) real, (b) located where the agent says, and (c) not over-reach. This catches false alarms AND, just as important, agent recommendations that are actively wrong. (In the session this skill was distilled from, a security inspector recommended adding the real private domains into the public .gitleaks.toml — an anti-target move that had to be rejected; see the methodology reference.)
Filter every finding through four questions: probability (does it really happen?), cost (fix vs ignore), real scenario (does it bite in practice?), verifiable (can a 1-line command confirm or refute it?).
Report format
Lead with the table, then layer by priority. Classify — don't dump:
- One-line verdict + a 6-dimension health table (good / minor-issues / needs-attention / critical per dimension)
- 🔴 Must-fix — each VERIFIED high/critical, with exact location + a concrete fix
- 🟠 Backlog — PR/issue triage outcomes, scan-marker gaps (decisions, often outward-facing — flag that they affect external contributors)
- 🟢 Optional — low/info nits, one line each
- 💡 Key insights — the meta-findings worth surfacing (a structural blind spot in tooling, a recurring bug class)
Tag each surfaced item ✅ real / ⚠️ partly / ❌ false-alarm. Most raw agent output is noise; your job is to surface the real risks the owner didn't already know, not to forward 25 findings for them to sift.
Judgment principles
Apply these when interpreting findings and proposing fixes. Full reasoning + the real failure cases behind each are in references/health-check-methodology.md — read it before acting on PII or PR/issue findings.
- Anti-target: never "fix" a PII leak by listing the real value in a public allowlist (e.g. the repo's own
.gitleaks.toml) — a public list enumerating real assets is itself a leak. Sanitize the value in place; detection rules for real private values belong in the owner's private global guard, not in this public repo. - History note: sanitizing the working copy cleans the current version, but a pre-existing leak still sits in git history. Flag the history exposure honestly; a history rewrite (force-push) is a separate high-risk decision that affects every fork — never do it unprompted.
- Scan marker = necessary-not-sufficient: a
.security-scan-passedmarker means "no known-format secret was found", NOT "sanitized". It is blind to keyword-free leaks, so pair it with a human/semantic read of any skill shipping real-data examples. - Mandatory version bump: any change to a skill's files requires bumping that skill's
versionin marketplace.json (and a CHANGELOG entry). External-contributor PRs almost always miss this — flag it, don't merge without it. - Promotion is declined by default: third-party directory / tool / marketplace promotion PRs and issues are declined — the repo is a personal curated marketplace, not an ecosystem directory. The decline-policy template is a reference doc at the repo root (outside this skill's bundle).
Bundled resources
scripts/repo-health-check.workflow.js— the six-inspector Dynamic Workflow. Run it via the Workflow tool'sscriptparam (Step 2). Edit it when you add/retire an inspector dimension.references/health-check-methodology.md— the Counter-Review filter, reporting discipline, and the anti-target / history / scan-marker / decline rules, each with the real failure case that motivated it.
Next step
After delivering the report, the typical follow-ups are owner decisions, not automated actions — fixing the verified HIGHs (sanitize PII, correct broken commands), or triaging the PR/issue backlog. Surface them as options; don't auto-fix or auto-comment on PRs/issues without the user's go-ahead, since those are outward-facing and affect external contributors.
Security scan passed
Scanned at: 2026-06-13T18:23:23.043483
Tool: gitleaks + pattern-based validation
Content hash: f64bfee28590626442a44c5730257108552a084e0ac6dfbc11a7ffb5f8a5ada1
Health-Check Methodology
The reasoning and real failure cases behind the judgment principles in SKILL.md. Read this before acting on PII or PR/issue findings — the rules look obvious in the abstract, but each one exists because the obvious-looking move was wrong in a real run. (Cases are described abstractly on purpose: naming the real leaked values here would re-leak them, which is the anti-target rule below.)
Counter-Review: agent findings are hypotheses, not conclusions
A fan-out of six inspectors is fast and broad, but breadth comes with noise. Each inspector is good at finding things and bad at weighing them — it lists every theoretically-possible problem without distinguishing a 0.1% edge case from a live one. So the inspectors' output is a risk list, not a verdict. Reporting it verbatim floods the user with noise and, worse, can launder a wrong fix into an action.
Before reporting any high/critical finding, run it through four questions:
1. Probability — does this really happen, or is it a fictional edge case? 2. Cost — what does fixing vs ignoring each cost? 3. Real scenario — does it actually bite in this repo's real usage? 4. Verifiable — can a one-line command confirm or refute it right now?
Then verify the survivors with a direct command (grep the value, sed -n the line, gh repo view the state). Two failure modes this catches:
- False alarms — a flagged "broken reference" that's actually an illustrative example; a "secret" that's a documented public placeholder; a
versionline inside a skill that teaches about versioning. - Wrong recommendations — the more dangerous case, where an inspector correctly finds a real problem and proposes a fix that makes things worse.
Case: the anti-target recommendation (rejected)
In the run this skill was distilled from, the security inspector correctly found real private values in shipped examples — and then recommended adding those exact values into the repo's own public .gitleaks.toml so future commits would be caught. That is backwards. .gitleaks.toml lives in the PUBLIC repo, so a list enumerating the owner's real private domains/handles is itself a published target map. The correct fix is two-part: sanitize the value in place, AND put the detection rule in the owner's PRIVATE global guard, which already scans future diffs. Verifying that global guard's coverage (it already had the domains; it lacked the names) is what converted a plausible-but-wrong recommendation into the right action. Relayed verbatim, it would have shipped a target list.
Anti-target: never publish the thing you're hiding
A public allowlist/denylist that names real private assets defeats itself. This applies to .gitleaks.toml, to "forbidden domains" comments, to any in-repo file in a public repo. In the public repo, only ever remove the value (replace with example.com, a neutral placeholder, <user>); never enumerate it. Detection rules for real private values belong in a private guard outside the repo. The same logic is why this very methodology file describes its cases abstractly.
History: working-copy sanitization is not a history scrub
Sanitizing a file cleans the current version. But a leak that was committed earlier (pre-existing) still sits in git history — git show <old-commit>:<file> reveals it. The honest report says: "current version clean; the value remains in history." A history rewrite (git filter-repo + force-push) is a separate, high-risk decision — it rewrites every commit hash and breaks every fork's sync, and the value is likely already forked/cached anyway, so the benefit is limited. Never rewrite history unprompted; present it as an option with its full cost, and let the owner decide (in practice they usually keep history and accept the residual exposure).
Scan marker = necessary, not sufficient
A .security-scan-passed marker records that the bundled security_scan.py (gitleaks + regex) found no KNOWN-FORMAT secret. It is structurally blind to keyword-free leaks: a real personal name in another language, a real private domain that matches no secret pattern, a verbatim transcript line. In the distillation run, two skills with GREEN markers nonetheless shipped a real private domain and a real personal handle — both invisible to the scanner, both caught only by a human semantic read. So: treat a missing marker as "unscanned, worth fixing", but never treat a present marker as "sanitized". Always pair it with a read-through for any skill shipping real-data examples (debugging case studies, transcript fixtures, financial samples).
Operational note: security_scan.py MUTATES the marker file when it runs. During a read-only audit, git checkout the marker afterward so the audit leaves no trace in the working tree.
The broken-install-command bug class
A recurring, high-leverage doc bug in a suite-based marketplace: install instructions that name a SUITE MEMBER as if it were a standalone plugin. claude plugin install <member>@<marketplace> FAILS — only the suite plugin is installable; members are invoked as <suite>:<member>. It bites hardest on the flagship skill's front-door command (the first thing a visitor copy-pastes), so a broken one is HIGH severity, not cosmetic. The check is mechanical: for every install command, confirm the named plugin is a top-level marketplace.json entry, NOT a name that only appears inside a suite's skills[] array. Internal inconsistency (one section correct, another wrong) is the tell that it's an oversight, not a design choice — and a sign the fix is doc-only, not a re-architecture.
Mandatory version bump + CHANGELOG
Any change to a skill's files requires bumping that skill's version in marketplace.json plus a CHANGELOG entry — that is how the marketplace tracks what changed, and it gates the install/update flow. External-contributor PRs almost always miss it (they don't know the convention). Flag such PRs as needs-changes; don't merge without it. For suite members, the version lives on the suite plugin, so a member-file change bumps the suite version, not a member version.
Promotion is declined by default
Third-party promotion — "add my external directory", "list my tool", revenue-share backlinks, a new "Community Skills" section — is declined per the repo's standing promotion-decline policy — a reference doc at the repo root, outside this skill's bundle. The repo is a personal curated marketplace, not an ecosystem directory. Decline politely with the policy's template; the contributor's own repo/marketplace already works standalone. This is the dominant pattern in the open-PR/issue queue, so triaging it correctly is what clears most of the backlog — but it's outward-facing, so surface the decline list to the owner rather than commenting on PRs/issues directly.
// Dynamic Workflow: 6-dimension health check for a Claude Code skills marketplace repo.
//
// HOW TO RUN (see SKILL.md): Read this file, then launch it with the Workflow tool via the
// `script` parameter (inline) so there is no path-resolution dependency on the installed
// skill location. Pass a pre-run scout result as args for accurate per-agent context:
//
// Workflow({ script: <contents of this file>, args: { repo: "owner/name", scale: "<one-liner>" } })
//
// args is OPTIONAL — if omitted, each inspector self-discovers the repo scale first.
// This is READ-ONLY: inspectors must not modify files, comment on PRs/issues, or push.
export const meta = {
name: 'marketplace-health-check',
description: 'Full 6-dimension health check of a Claude Code skills marketplace repo: code/scripts, docs/SSOT, security/PII, open PRs, open issues, marketplace integrity',
phases: [{ title: 'Inspect', detail: '6 parallel inspectors, one per dimension' }],
}
const CHECK_SCHEMA = {
type: 'object',
additionalProperties: false,
properties: {
dimension: { type: 'string' },
health: { type: 'string', enum: ['good', 'minor-issues', 'needs-attention', 'critical'] },
summary: { type: 'string' },
findings: {
type: 'array',
items: {
type: 'object',
additionalProperties: false,
properties: {
severity: { type: 'string', enum: ['critical', 'high', 'medium', 'low', 'info'] },
title: { type: 'string' },
detail: { type: 'string' },
location: { type: 'string' },
recommendation: { type: 'string' },
},
required: ['severity', 'title', 'detail', 'recommendation'],
},
},
stats: { type: 'string' },
},
required: ['dimension', 'health', 'summary', 'findings', 'stats'],
}
// Optional scout context passed in via args (recommended — scout once, share across all 6 agents).
const ctx = (args && typeof args === 'object') ? args : {}
const repoName = ctx.repo || 'this Claude Code skills marketplace repo'
const scale = ctx.scale || 'NOT pre-supplied — quickly self-discover it before inspecting (gh pr list --state open, gh issue list --state open, find . -name SKILL.md -not -path "*-workspace/*" | wc -l, and the metadata.version + skill count in .claude-plugin/marketplace.json).'
const COMMON = [
`You are ONE inspector in a full health check of ${repoName} — a PUBLIC GitHub repo, a Claude Code skills marketplace. Your cwd IS the repo root.`,
`Repo scale (as of this run): ${scale}`,
'Inspect ONLY your dimension. Work efficiently: prefer grep/find/gh/scripts over reading every file; sample the highest-risk targets. Return structured findings — each with severity, what, where (file / PR# / issue#), and a concrete recommendation. Set health honestly. This is READ-ONLY: do NOT modify files, comment on PRs/issues, or push. gh CLI is authenticated.',
'',
].join('\n')
const dims = [
{
key: 'code-and-script-safety',
prompt: [
'YOUR DIMENSION: Code & script quality + safety across all Python + Bash scripts in the repo.',
'Grep high-risk patterns across all scripts (find . -name "*.py" -o -name "*.sh", exclude *-workspace/), then deep-read 3-5 of the most safety-critical scripts.',
'Check for: (1) Dangerous deletes — rm -rf without confirmation, shutil.rmtree, os.remove/unlink without a guard — ESPECIALLY any file-deleting skill (e.g. macos-cleaner) and any cleanup / safe_delete script. (2) NO-FALLBACK violations (a repo CLAUDE.md rule): secret fallback like process.env.X || a-literal, apiKey/token default literals, || DEFAULT masking missing config. (3) Hardcoded real user paths /Users/<name>/ or /home/<name>/ (not placeholders). (4) Bare except: that swallows KeyboardInterrupt/SystemExit, and overly broad exception handling. (5) Dangerous eval/exec/os.system with interpolated input (injection). (6) Missing shebang / not executable on directly-run scripts.',
'Deep-read sample: any deletion-capable skill (e.g. macos-cleaner/scripts/safe_delete.py + cleanup_report.py), repomix-safe-mixer/*, financial-data-collector/*, anything touching credentials or deletion.',
'stats: how many scripts grepped, hits per pattern.',
].join('\n'),
},
{
key: 'doc-consistency',
prompt: [
'YOUR DIMENSION: Documentation SSOT consistency. SSOT = .claude-plugin/marketplace.json (versions + registration).',
'Check: (1) Version coherence — marketplace metadata.version vs README.md + README.zh-CN.md version badge vs CHANGELOG top archived version vs latest git release (gh release view); they should ALL match. (2) skill count — CLAUDE.md overview + README x2 badges/sentences + marketplace must all agree (run python3 daymade-claude-code/marketplace-dev/scripts/check_doc_skill_lists.py — authoritative). (3) plugin-entry count claimed in CLAUDE.md must match the actual number of plugin entries. (4) Broken references — for a sample of SKILL.md files, verify every referenced references/*.md and scripts/* file exists on disk. (5) SKILL.md must NOT contain its own version number (versions live only in marketplace.json) — grep, but EXCLUDE skill-creator instructional "Versioning" content (a known false positive). (6) Persisted derived-value drift (aggregate counts/badges that can go stale). (7) CHANGELOG structural issues — duplicate version-section headers, out-of-order versions.',
'stats: version-coherence result + count-check result.',
].join('\n'),
},
{
key: 'security-pii',
prompt: [
'YOUR DIMENSION: Sensitive-info / PII audit for a PUBLIC repo. A green tool scan is NOT enough — grep is blind to keyword-free private content, so ALSO read-judge sampled case files.',
'Grep across the whole repo (exclude *-workspace/ and .git/): (1) Real absolute user paths /Users/<name>/ or /home/<name>/ (exclude <username>/<user>/example placeholders). (2) Real personal names, esp. CJK names embedded in paths/examples (gitleaks cannot catch these). (3) Secrets: sk-[A-Za-z0-9]{10,}, Bearer tokens, api_key = literal, AWS keys. (4) Real personal emails (exclude the public repo-owner email visible in git history) and CN phone numbers. (5) Private domains/IPs (EXCLUDE RFC-reserved 203.0.113 / 198.51.100 / 192.0.2 / 198.18 / 10. / 127. / 0.0.0.0 and example.com).',
'SCAN MARKER GAP: compare the number of skills (SKILL.md files) to the number of .security-scan-passed markers — enumerate WHICH skill dirs are MISSING a marker (skill dir has SKILL.md but no sibling .security-scan-passed). Those shipped with no recorded scan. Treat the marker as necessary-not-sufficient: it catches known secret FORMATS, not keyword-free leaks.',
'Spot-run the bundled scanner on 2-3 real-data skills: cd daymade-skill/skill-creator && uv run python -m scripts.security_scan ../../<skill> --verbose (good targets: skills shipping real-data examples). NOTE: the scanner MUTATES the .security-scan-passed marker as a side effect — git-checkout-restore it afterward so this read-only audit leaves no trace.',
'Highest risk: case-study / incident-writeup files where real production detail leaks (e.g. debugging-network-issues/references/, skill-creator Phase 9 cases). Read-judge a couple. Distinguish REAL leaks from placeholders. ANTI-TARGET RULE: do NOT recommend adding the real private domains/names into the repo-local .gitleaks.toml — a public allowlist that enumerates real assets is itself a leak. Private-value rules belong in the owner global guard (~/scripts/git-pii-guard), not in this public repo.',
'stats: the marker-gap skill list + grep hit counts.',
].join('\n'),
},
{
key: 'pull-requests',
prompt: [
'YOUR DIMENSION: Triage ALL open PRs (fast and decisive, not a deep code audit).',
'Get them: gh pr list --state open --json number,title,headRefName,author,createdAt,additions,deletions,changedFiles. Where useful, gh pr view <n> --json mergeable,mergeStateStatus.',
'Produce ONE finding per PR classifying it: Type (new-skill / docs / fix / third-party-marketplace-promotion). Author (external contributor vs the repo owner). Mergeable (CLEAN / CONFLICTING / unknown). Verdict: worth-merging | needs-changes (most external new-skill PRs MISS the repo-mandatory version bump + CHANGELOG entry — flag that) | low-quality-or-spam | SHOULD-DECLINE (third-party marketplace/tool promotion — the repo has a standing decline policy documented at the repo root; declining is the default for "add my external directory/tool" PRs).',
'Flag stale PRs (old createdAt) and suspicious/spammy accounts. Use severity to encode priority (high = ready-to-merge or needs-owner-action; low = spam/decline).',
'stats: counts by verdict.',
].join('\n'),
},
{
key: 'issues',
prompt: [
'YOUR DIMENSION: Triage ALL open issues.',
'Get them: gh issue list --state open --json number,title,author,createdAt,labels. Read bodies of the substantive ones: gh issue view <n>.',
'Classify each: real-bug / skill-request / cross-list-or-promotion / question.',
'KNOWN BUG CLASS to ACTIVELY check (whether or not an issue reports it): do the README / QUICKSTART install commands ever use a SUITE-MEMBER skill name as if it were a standalone plugin? `claude plugin install <suite-member>@<marketplace>` FAILS — only the suite plugin is installable; members are invoked as `<suite>:<member>`. This is the front-door install instruction, so a broken one is HIGH severity. Cross-check each install command against marketplace.json (a name that ONLY appears inside a suite skills[] array is a member, not a plugin).',
'Flag promotion / cross-list issues (external directories, "list us", revenue-share backlinks) as DECLINE per the repo policy.',
'stats: counts by type.',
].join('\n'),
},
{
key: 'marketplace-integrity',
prompt: [
'YOUR DIMENSION: Marketplace manifest integrity.',
'Run and report exit codes + key output: (1) bash daymade-claude-code/marketplace-dev/scripts/check_marketplace.sh (JSON syntax, claude plugin validate, source+skills resolution, reverse-sync orphan WARN). (2) python3 daymade-claude-code/marketplace-dev/scripts/check_doc_skill_lists.py.',
'Check: (a) Orphan SKILL.md on disk not registered (reverse-sync WARN) — a gitignored *-workspace/ scratch dir is NOT a real orphan; confirm with git check-ignore before flagging. (b) Every suite (category=suite) entry: each skills[] member exists on disk, and no suite member is ALSO wrongly registered as a standalone plugin. (c) Version sanity: duplicate plugin names, obviously stale versions. (d) Counts reconcile: plugin-entry count and expanded-skill count match what the docs claim and what is on disk.',
'stats: script exit codes + orphan list.',
].join('\n'),
},
]
phase('Inspect')
const checks = await parallel(dims.map(d => () => agent(COMMON + d.prompt, { label: 'check:' + d.key, phase: 'Inspect', schema: CHECK_SCHEMA })))
return { checks: checks.filter(Boolean) }