Skill

claude-health

Install
1
Install the plugin
$
npx claudepluginhub sd0xdev/sd0x-dev-flow --plugin sd0x-dev-flow

Want just this skill?

Add to a custom plugin, then install with one command.

Description

Claude Code config health check + plugin sync. Use when: auditing .claude/ structure, checking naming, verifying hook setup, detecting plugin version drift, syncing installed assets. Not for: skill quality (use skill-health-check), code review (use codex-code-review). Output: health report + fix recommendations.

Tool Access

This skill is limited to using the following tools:

ReadGrepGlobBash(ls:*)Bash(find:*)Bash(wc:*)Bash(du:*)Bash(rm:*)Bash(git:*)
Supporting Assets
View in Repository
references/best-practices.md
Skill Content

Claude Health Check

Trigger

  • Keywords: health check, .claude check, config audit, lint .claude, claude health, plugin sync, version drift, upgrade check, doctor

When NOT to Use

  • Code review (use /codex-review-fast)
  • Doc review (use /codex-review-doc)
  • Security review (use /codex-security)

Scope

ArgumentDescription
--scope hygieneOnly run C1-C7 hygiene checks
--scope syncOnly run S1-S3 sync checks
--scope allRun both modules (default)

Workflow

[--scope] → Select modules → Scan → Classify → Report → Fix suggestions
               │                                  │
       ┌───────┴───────┐                     P0/P1/P2
       ▼               ▼                    + fix commands
  Hygiene (C1-C7)  Sync (S1-S3)

Hygiene Module — Checks (7 items)

#CheckMethodCriteria
1Junk filesfind .claude/ -name ".DS_Store" -o -name "*.zip" -o -name ".tmp*"Any exists → P1
2.gitignore existsls .claude/.gitignoreMissing → P1
3.gitignore completenessRead .claude/.gitignore, compare required itemsMissing required → P2
4Naming consistencyScan all skills/*/ for reference vs referencesInconsistent → P2
5README count syncCount actual vs README descriptionMismatch → P2
6Command-Skill pairingEach core skill should have corresponding commandMissing → P1
7Cache sizedu -sh .claude/cache/> 50M → P2

Check 1: Junk Files

find .claude/ -name ".DS_Store" -o -name "*.zip" -o -name ".tmp*" 2>/dev/null
  • Has results → P1: List files, suggest deletion
  • No results → ✅

Check 2-3: .gitignore

ls .claude/.gitignore 2>/dev/null || echo "MISSING"

Missing → P1. If exists, read content and compare required items:

Required ItemReason
.DS_StoremacOS generates continuously
settings.local.jsonPersonal config
cache/Runtime cache
.tmp*Temp files
*.tmpTemp files (suffix variant)
*.zipBackup archives
.claude_review_state.jsonReview state tracking

Missing any → P2

Check 4: Naming Consistency

# Scan all skill subdirectories
for dir in .claude/skills/*/; do
  if [ -d "${dir}reference" ]; then echo "INCONSISTENT: ${dir}reference"; fi
done

Has reference/ (singular) → P2, suggest renaming to references/

Check 5: README Count Sync

# Count actual items
ls .claude/commands/ 2>/dev/null | wc -l
ls .claude/skills/ 2>/dev/null | wc -l
ls .claude/agents/ 2>/dev/null | wc -l
ls .claude/rules/ 2>/dev/null | wc -l
ls .claude/hooks/*.sh 2>/dev/null | wc -l

Extract counts from README.md, compare. Mismatch → P2

Check 6: Command-Skill Pairing

Scan all skills/*/SKILL.md, exclude these types, then check for corresponding command:

Exclude TypeExamplesReason
Domain KBportfolio, aumReferenced by other skills, no standalone entry
Externalagent-browserNot maintained by this project

Remaining skills without command → P1

Check 7: Cache Size

du -sh .claude/cache/ 2>/dev/null
  • > 50M → P2, suggest cleanup
  • ≤ 50M → ✅

Sync Module — Checks (S1-S3)

Only runs when --scope sync or --scope all (default).

S1: Version Check

#CheckMethodCriteria
S1.1Manifest existsRead .sd0x/install-state.jsonMissing → P1
S1.2Manifest parseableJSON.parseParse error → P1
S1.3schema_version current== 1Mismatch → P2
S1.4plugin_version matchesmanifest vs .claude-plugin/plugin.json or package.jsonMismatch → P1
S1.5Manifest completenessHas rules + hook_scripts + scripts keysMissing key → P2 (MANIFEST_GAP)

Plugin version resolution (priority order):

.claude-plugin/plugin.json → package.json → "unknown"

Plugin source location (same as /install-rules Phase 1):

Glob: ~/.claude/plugins/**/sd0x-dev-flow/rules/auto-loop.md
Glob: ${REPO_ROOT}/node_modules/sd0x-dev-flow/rules/auto-loop.md
Fallback: @rules/auto-loop.md (plugin-relative)

S2: Component Classification

For each managed component (rules, hooks, scripts), compute 3 hashes and classify:

manifest_hash  = manifest[category][filename].hash    # null if missing
local_hash     = git hash-object --no-filters <local-path>  # null if file missing
plugin_hash    = git hash-object --no-filters <plugin-path>  # source of truth

Classification table (read-only diagnostic; maps to install-rules states for delegation):

Doctor StateConditionSeverityinstall-rules Equivalent
OKlocal == manifest == pluginSKIP
MISSINGlocal_hash is null, plugin existsP1FRESH_INSTALL
OUTDATEDlocal == manifest, plugin != manifestP1AUTO_UPDATE
LOCAL_MODIFIEDlocal != manifest, plugin == manifestKEEP_LOCAL
CONFLICTlocal != manifest, plugin != manifestP2CONFLICT
LEGACYmanifest_hash is null, local existsP2LEGACY
MANIFEST_GAPmanifest category key missingP2N/A
TOMBSTONEDmanifest deleted: true, local missingSKIP_DELETED

Managed inventory (hardcoded):

CategoryLocal PathPlugin SourceFiles
Rules.claude/rules/*.mdrules/*.mdauto-loop.md, codex-invocation.md, fix-all-issues.md, framework.md, testing.md, security.md, git-workflow.md, logging.md, docs-writing.md, docs-numbering.md, self-improvement.md, context-management.md
Hooks.claude/hooks/*.shhooks/*.shpre-edit-guard.sh, post-edit-format.sh, post-tool-review-state.sh, stop-guard.sh, post-compact-auto-loop.sh
Scripts.claude/scripts/scripts/precommit-runner.js, verify-runner.js, dep-audit.sh, commit-msg-guard.sh, pre-push-gate.sh, lib/utils.js

S2.5: Override Safeguard Checks

5 checks for project override files (e.g., auto-loop-project.md):

#CheckSeverityDetectionRecommendation
1Override driftP2based_on hash comment in project file vs current base file hash"Base auto-loop updated since override authored; review your overrides"
2Policy contradictionP1Override's Auto-Trigger table omits a command that stop-guard.sh requires"Override conflicts with stop-guard enforcement"
3Missing referenceP1.claude/CLAUDE.md has @rules/auto-loop-project.md but file missing, OR file exists but not referenced/install-rules to recreate or add reference
4Wrong-layer editP2Base auto-loop.md has LOCAL_MODIFIED, CONFLICT, or LEGACY state while project override exists"Move customization to auto-loop-project.md"
5Duplicate headingP2Override file has multiple active ## <heading> with same text"Keep one, remove duplicates. Last occurrence takes effect."

Policy contradiction detection: Parse the project override's Auto-Trigger table for required check commands. Cross-reference against hook-enforced sentinels: if override omits /codex-review-fast for code changes or /codex-review-doc for .md changes, flag as P1.

Override drift detection: Read the <!-- Based on: auto-loop.md @ <hash> --> comment from the project file. Compare against git hash-object --no-filters .claude/rules/auto-loop.md | cut -c1-7. If different, the base has been updated since the override was authored. Uses blob hash for content-level comparison; accepts legacy commit-style hashes (any 7+ hex chars) during backward-compat transition.

S3: Settings Compatibility

Check both settings.json and settings.local.json (precedence: settings.local.json > settings.json). A hook entry in either file satisfies the integrity check.

#CheckMethodCriteria
S3.1Legacy hook pathsGrep both settings files for bare .claude/hooks/ without $CLAUDE_PROJECT_DIRFound → P2
S3.2STOP_GUARD_MODE presentRead env.STOP_GUARD_MODE from either settings file (also check legacy hooks_config.stop_guard_mode)Missing from both → P2 (info). Legacy hooks_config found → P2 (migration recommended). Install-time default: strict; runtime fallback: warn
S3.3Hook entry integrityEach installed hook script has matching entry in either settings fileMissing from both → P1
S3.4Orphan hook entriesEither settings file references script that doesn't exist on diskOrphan → P2

Settings file precedence: settings.local.json overrides settings.json at runtime. When delegating S3 fixes, use /install-hooks --local if the issue is in settings.local.json.

Legacy path detection:

Grep for: "\.claude/hooks/[^"]+\.sh"  (without leading "$CLAUDE_PROJECT_DIR")
Applied to both: settings.json and settings.local.json

Fix Tiers

Only applies when --fix-safe or --fix is specified alongside sync scope.

TierFlagDescription
Report(default)Diagnosis only — output actionable recommendations
Safe--fix-safeAuto-fix P1 hygiene + safe sync fixes
Guided--fixAuto-fix P1 hygiene + guided sync remediation (interactive)

Category-specific safe fix delegation:

CategoryMISSINGOUTDATEDCONFLICT/LEGACY
Rules/install-rules <names>/install-rules <names> (smart merge AUTO_UPDATE)Skip (report only)
Hooks/install-hooks <names>Report only + suggest /install-hooks <names> --forceSkip (report only)
Scripts/install-scripts <names>Report only + suggest /install-scripts <names> --forceSkip (report only)

Why hooks/scripts OUTDATED is report-only in safe tier: /install-hooks and /install-scripts use skip/force semantics (no manifest-aware smart merge). Only /install-rules has 7-state classification for safe auto-update.

S3 settings fix delegation: All settings mutations delegate to /install-hooks (sync module never writes JSON directly).

--fix tier: Delegates all actionable states (including CONFLICT, LEGACY) to /install-* commands which handle interactive resolution.

Argument conflict: --fix and --fix-safe are mutually exclusive. If both specified, error.

Output

# .claude/ Health Check Report

## Hygiene Summary (C1-C7)

| Item | Status | Notes |
|------|--------|-------|
| Junk files | ✅/⛔ | ... |
| .gitignore | ✅/⛔ | ... |
| Naming consistency | ✅/⛔ | ... |
| README count | ✅/⛔ | ... |
| Command-Skill | ✅/⛔ | ... |
| Cache size | ✅/⛔ | ... |

## Sync Summary (S1-S3)

### S1: Version
| Check | Status | Detail |
|-------|--------|--------|
| Manifest | ✅/⛔ | Found / Missing |
| Plugin version | ✅/⛔ | 2.0.3 == 2.0.3 / 1.8.12 → 2.0.3 |
| Manifest keys | ✅/⛔ | Complete / Missing: hook_scripts, scripts |

### S2: Component Status
| File | Category | Status | Action |
|------|----------|--------|--------|
| auto-loop.md | Rules | OUTDATED | `/install-rules auto-loop` |
| security.md | Rules | OK | — |
| stop-guard.sh | Hooks | MISSING | `/install-hooks stop-guard` |
| ... | ... | ... | ... |

### S3: Settings Compatibility
| Check | Status | Detail |
|-------|--------|--------|
| Hook paths | ✅/⛔ | Modern / Legacy found |
| Guard mode | ✅/⛔ | strict / Missing |
| Entry integrity | ✅/⛔ | All matched / N missing |
| Orphan entries | ✅/⛔ | None / N orphans |

## Statistics

| Category | Count |
|----------|-------|
| Commands | N |
| Skills | N |
| Rules | N (installed) / N (managed) |
| Hooks | N |

## Issues

### P1
- [Issue] → [Fix recommendation / command]

### P2
- [Issue] → [Fix recommendation]

## Gate
✅ All Pass / ⛔ N issues need fixing

Verification

  • Hygiene: All 7 checks executed (when scope includes hygiene)
  • Sync: S1-S3 checks executed (when scope includes sync)
  • Each check has clear ✅/⛔ status
  • P1 issues have specific fix commands
  • S2 classification covers all 23 managed files
  • Fix delegation uses targeted file names (not --all)

References

  • references/best-practices.md — Best practices for .claude/ directory structure

Examples

Input: /claude-health
Action: Scan hygiene (7 items) + sync (S1-S3) → Generate consolidated report

Input: /claude-health --scope sync
Action: Scan S1-S3 only → Report version drift + component status

Input: /claude-health --fix-safe
Action: Scan all → Auto-fix safe items → Delegate to /install-* → Report

Input: Is my plugin up to date?
Action: Trigger sync check → Report version + component drift
Stats
Stars90
Forks12
Last CommitMar 21, 2026
Actions

Similar Skills