From pnge-core
Marketplace health check — probe API credentials and endpoint reachability for every claude-pnge data-access skill across all 8 plugins, then summarize pass/fail/skipped with remediation hints. Trigger phrases - /doctor, plugin health check, are my api keys working, test pnge skills, check endpoint status.
How this command is triggered — by the user, by Claude, or both
Slash command
/pnge-core:doctorThe summary Claude sees in its command listing — used to decide when to auto-load this command
Run a comprehensive health check on the claude-pnge marketplace. $ARGUMENTS The /doctor command is shipped by `pnge-core` and carries a **static catalog** of every skill in the marketplace (8 plugins, 76 skills). It verifies two things: 1. **Credential presence** — for skills that require a key, is a key available either in `~/.config/<service>/credentials` or in the documented environment variable? 2. **Endpoint reachability** — does a lightweight probe URL return an HTTP status indicating the service is up? /doctor does **not** enumerate installed plugins. Claude Code installs each plu...
Run a comprehensive health check on the claude-pnge marketplace. $ARGUMENTS
The /doctor command is shipped by pnge-core and carries a static catalog of every skill in the marketplace (8 plugins, 76 skills). It verifies two things:
~/.config/<service>/credentials or in the documented environment variable?/doctor does not enumerate installed plugins. Claude Code installs each plugin in its own isolated cache, so pnge-core:/doctor cannot peek at sibling plugin directories. For the installed-plugin inventory, use the built-in /plugin slash command.
Skills that are purely computational (no network endpoint) are listed with SKIP status. Skills whose canonical endpoints are intermittent, geofenced, bot-blocked, or require session cookies are marked not network-testable — these must be verified manually in a browser.
Use the Bash tool to run every probe below. Keep the per-request timeout at 5 seconds (curl -m 5) so one stalled service cannot freeze the whole check. Follow redirects with -L. Send a normal User-Agent so gateways that block curl/* UAs don't return false negatives.
Standard probe pattern:
probe() {
local name="$1" url="$2"
local code
code=$(curl -s -o /dev/null -w "%{http_code}" -m 5 -L \
-A "Mozilla/5.0 (claude-pnge /doctor)" "$url")
if [ "$code" = "200" ] || [ "$code" = "400" ] || [ "$code" = "403" ]; then
echo "PASS $name (HTTP $code)"
else
echo "FAIL $name (HTTP $code — $url)"
fi
}
Why 400/403 count as PASS for some probes: endpoints like EIA v2, FRED, and BLS reject un-authenticated requests with 400/403. That response still proves the host is alive and the TLS path is healthy. These are flagged explicitly in the probe tables below with auth-reject OK. For every other probe, only HTTP 200 counts.
Check the credential file first, then the environment variable. Report each as FOUND (file), FOUND (env), or MISSING — and if missing, point to the corresponding section of docs/TOKENS.md.
creds() {
local service="$1" envvar="$2" file="$HOME/.config/$3/credentials"
if [ -f "$file" ] && grep -q '^api_key=' "$file" 2>/dev/null; then
local val
val=$(grep '^api_key=' "$file" | head -1 | cut -d= -f2)
if [ -n "$val" ]; then echo "FOUND (file) $service"; return 0; fi
fi
if [ -n "${!envvar}" ]; then echo "FOUND (env) $service (\$$envvar)"; return 0; fi
echo "MISSING $service (see docs/TOKENS.md#${3})"
return 1
}
creds "EIA Open Data" EIA_API_KEY eia
creds "NETL EDX" NETL_EDX_API_KEY netl-edx
creds "EPA api.data.gov" EPA_API_KEY epa
creds "FRED (St. Louis Fed)" FRED_API_KEY fred
creds "BEA" BEA_API_KEY bea
creds "US Census" CENSUS_API_KEY census
creds "OpenEI / GDR" OPENEI_API_KEY openei
creds "BLS (optional)" BLS_API_KEY bls
creds "UN Comtrade (optional)" COMTRADE_API_KEY comtrade
creds "NASA Earthdata (optional)" EARTHDATA_TOKEN earthdata
Required for basic plugin function: EIA, NETL EDX, FRED, BEA, Census, OpenEI. Optional (public tier works without a key, keys only raise rate limits): EPA, BLS, Comtrade, NASA Earthdata. No key at all: every other skill.
| Skill | Probe URL | Expected | Notes |
|---|---|---|---|
| pnge-core:eia-data | https://api.eia.gov/v2/ | 200 with key, 403 auth-reject without | 403 PASS |
| pnge-core:usgs-produced-waters | https://www.sciencebase.gov/catalog/item/64fa1e71d34ed30c2054ea11?format=json | 200 | v3.0 item (verified live) |
| pnge-core:usgs-minerals | https://data.usgs.gov/datacatalog/ | 200 | API endpoint 404s, portal is live |
| pnge-federal-data:usgs-earthquakes | https://earthquake.usgs.gov/fdsnws/event/1/count?format=text&minmagnitude=3 | 200 | |
| pnge-federal-data:usgs-waterdata | https://waterservices.usgs.gov/nwis/site/?format=rdb&stateCd=wv&siteType=GW&hasDataTypeCd=qw¶meterCd=00095&siteStatus=all | 200 | |
| pnge-federal-data:usgs-core-center | https://www.usgs.gov/core-research-center | not network-testable | Cloudflare UA challenge — verify manually |
| pnge-federal-data:usgs-tnm | https://tnmaccess.nationalmap.gov/api/v1/products?datasets=National+Map | 200 | |
| pnge-federal-data:netl-edx | https://edx.netl.doe.gov/api/3/action/status_show | 200 | |
| pnge-federal-data:netl-carbon-storage | https://edx.netl.doe.gov/group/carbon-storage-open-database | 200 | |
| pnge-federal-data:doe-geothermal | https://gdr.openei.org/ | 200 | GDR root; dataset API needs OpenEI key |
| pnge-federal-data:epa-regulatory | https://data.epa.gov/efservice/TRI_FACILITY/rows/0:1/JSON | 200 | UIC_WELL removed — permanently dead |
| pnge-federal-data:epa-treatability | https://tdb.epa.gov/tdb/home | not network-testable | ORD endpoints block curl UAs — verify manually |
| pnge-federal-data:boem-offshore | https://gis.boem.gov/arcgis/rest/services/BOEM_BSEE/MMC_Layers/MapServer?f=json | 200 | |
| pnge-federal-data:blm-mineral-records | https://glorecords.blm.gov/ | 200 | |
| pnge-federal-data:fracfocus | https://www.fracfocusdata.org/DisclosuresSearch/ | 200 | API proper is session-based; portal probe is the canary |
| pnge-federal-data:nasa-earthdata | https://cmr.earthdata.nasa.gov/search/health | 200 | |
| pnge-geochem-pw:phreeqc-geochem | — | computational | Skill wraps local PHREEQC; no endpoint |
| pnge-federal-data:ejscreen-cejst-svi | https://www.census.gov/programs-surveys/geography.html | not network-testable | EJScreen/CEJST domains geofence curl — verify manually at https://screeningtool.geoplatform.gov/ |
| Skill | Probe URL | Expected | Notes |
|---|---|---|---|
| pnge-state-regulatory:wvges-wells | https://tagis.dep.wv.gov/arcgis/rest/services/WVDEP_enterprise/oog/MapServer?f=json | 200 | Use WVDEP; legacy atlas.wvgs.wvnet.edu intermittent |
| pnge-state-regulatory:padep-wells | https://www.pa.gov/agencies/dep/programs-and-services/oil-and-gas/oil-and-gas-mapping.html | not network-testable | PA DEP GIS endpoints geofence/TLS-block curl — verify at https://www.depgis.state.pa.us/PaOilAndGasMapping/ |
| pnge-state-regulatory:odnr-wells | https://gis.ohiodnr.gov/arcgis/rest/services/OIL_GAS/WellsAndPermits/MapServer?f=json | 200 | |
| pnge-state-regulatory:tx-rrc | https://www.rrc.texas.gov/resource-center/research/data-sets-available-for-download/ | 200 | RRC has no REST API; bulk downloads only |
| pnge-state-regulatory:nm-ocd | https://wwwapps.emnrd.nm.gov/ocd/ocdpermitting/ | 200 | |
| pnge-state-regulatory:nd-dmr | https://www.dmr.nd.gov/oilgas/ | 200 | |
| pnge-state-regulatory:la-sonris | https://sonris.com/ | 200 | SONRIS Lite (sonlite.dnr.state.la.us) returns 401 on root; probe main portal |
| pnge-state-regulatory:ar-aogc | https://www.aogc.state.ar.us/welcome.aspx | not network-testable | AOGC returns 403 to automated clients — verify manually |
| pnge-state-regulatory:ok-occ | https://www.occ.ok.gov/ | 200 | occeweb.com blocks non-browser UAs |
| pnge-state-regulatory:calgem | https://www.conservation.ca.gov/calgem | 200 | WellSTAR public lookup has no stable anon URL |
| pnge-state-regulatory:co-ecmc | https://ecmc.state.co.us/ | 200 | ArcGIS subdomain intermittent |
| pnge-state-regulatory:appalachia-mineral-parcels | https://mapwv.gov/parcel/ | 200 | WV only; PA/OH parcels are county-level, not network-testable |
| Skill | Probe URL | Expected | Notes |
|---|---|---|---|
| pnge-economics:fred-prices | https://api.stlouisfed.org/fred/series?series_id=GDP&api_key=invalid&file_type=json | 400 | 400 auth-reject PASS — proves host live |
| pnge-economics:bls-data | https://api.bls.gov/publicAPI/v2/surveys | 200 | |
| pnge-economics:bea-data | https://apps.bea.gov/api/data/?UserID=TEST&method=GetDataSetList&ResultFormat=JSON | 200 | Returns 200 with an error body for bad UserID |
| pnge-economics:census-data | https://www.census.gov/data/developers.html | not network-testable | api.census.gov geofences/blocks this test environment — verify manually |
| pnge-economics:worldbank-energy | https://api.worldbank.org/v2/country/USA/indicator/EG.USE.ELEC.KH.PC?format=json | 200 | |
| pnge-economics:comtrade-minerals | https://comtradeapi.un.org/public/v1/preview/C/A/HS?reporterCode=842&period=2022&cmdCode=250300&flowCode=X | 200 | Public tier; rate-limited |
| pnge-economics:iea-open | https://www.iea.org/data-and-statistics | 200 | IEA has no public REST API |
| pnge-federal-data:wri-aqueduct | https://www.wri.org/applications/aqueduct/water-risk-atlas/ | 200 | |
| pnge-state-regulatory:ospar-discharges | https://odims.ospar.org/ | 200 | Use ODIMS; odata.ospar.org is intermittent |
| Skill | Probe URL | Expected | Notes |
|---|---|---|---|
| pnge-core:pnge-literature (USGS Pubs adapter) | https://pubs.er.usgs.gov/pubs-services/publication?q=lithium&page_size=1 | 200 | |
| pnge-core:pnge-literature (DOE OSTI adapter) | https://www.osti.gov/api/v1/records?q=lithium&rows=1 | 200 | |
| pnge-core:pnge-literature (OpenAlex adapter) | https://api.openalex.org/works?search=lithium&per-page=1 | 200 | |
| pnge-core:pnge-literature (CrossRef adapter) | https://api.crossref.org/works?query=lithium&rows=1 | 200 | |
| pnge-core:datacite-doi | https://api.datacite.org/heartbeat | 200 | Official heartbeat endpoint |
| pnge-well-engineering:kggs-well-logs | https://www.kgs.ku.edu/Magellan/Qualified/index.html | 200 | |
| pnge-well-engineering:macrostrat | https://macrostrat.org/api/v2/units?strat_name=Marcellus&response=short | 200 | |
| pnge-patents:patentsview | https://search.patentsview.org/ | not network-testable | PatentsView v2 requires API key + header auth; v1 retired (410). Verify manually via signed request |
These skills bundle algorithms, references, or local tooling. They have nothing to probe over the network and no filesystem check is attempted (installed plugins live in isolated caches that pnge-core:/doctor cannot reach):
pnge-well-engineering, pnge-engineering-science, and most of pnge-geochem-pw (PHREEQC speciation, NIST webbook, mass/energy balance, tNavigator emulation) — all pure computationalReport these as SKIP with reason "computational skill (no endpoint)".
Render the final report as a single markdown document in this exact structure:
Date: (ISO-8601 timestamp) Plugin: claude-pnge Probes run: N
| Service | Required? | Source | Status |
|---|---|---|---|
| EIA | yes | ~/.config/eia/credentials or $EIA_API_KEY | FOUND / MISSING |
| NETL EDX | yes | ~/.config/netl-edx/credentials or $NETL_EDX_API_KEY | FOUND / MISSING |
| FRED | yes | ~/.config/fred/credentials or $FRED_API_KEY | FOUND / MISSING |
| BEA | yes | ~/.config/bea/credentials or $BEA_API_KEY | FOUND / MISSING |
| Census | yes | ~/.config/census/credentials or $CENSUS_API_KEY | FOUND / MISSING |
| OpenEI / GDR | yes | ~/.config/openei/credentials or $OPENEI_API_KEY | FOUND / MISSING |
| EPA | optional | ~/.config/epa/credentials or $EPA_API_KEY | FOUND / MISSING |
| BLS | optional | ~/.config/bls/credentials or $BLS_API_KEY | FOUND / MISSING |
| Comtrade | optional | ~/.config/comtrade/credentials or $COMTRADE_API_KEY | FOUND / MISSING |
| NASA Earthdata | optional | ~/.config/earthdata/credentials or $EARTHDATA_TOKEN | FOUND / MISSING |
| Skill | HTTP | Status |
|---|---|---|
| pnge-core:eia-data | 403 | PASS (auth-reject; key checked separately) |
| pnge-core:usgs-produced-waters | 200 | PASS |
| pnge-core:usgs-minerals | 200 | PASS |
| pnge-federal-data:usgs-earthquakes | 200 | PASS |
| pnge-federal-data:usgs-waterdata | 200 | PASS |
| pnge-federal-data:usgs-core-center | — | SKIP (not network-testable) |
| pnge-federal-data:usgs-tnm | 200 | PASS |
| pnge-federal-data:netl-edx | 200 | PASS |
| pnge-federal-data:netl-carbon-storage | 200 | PASS |
| pnge-federal-data:doe-geothermal | 200 | PASS |
| pnge-federal-data:epa-regulatory | 200 | PASS |
| pnge-federal-data:epa-treatability | — | SKIP (not network-testable) |
| pnge-federal-data:boem-offshore | 200 | PASS |
| pnge-federal-data:blm-mineral-records | 200 | PASS |
| pnge-federal-data:fracfocus | 200 | PASS |
| pnge-federal-data:nasa-earthdata | 200 | PASS |
| pnge-federal-data:ejscreen-cejst-svi | — | SKIP (not network-testable) |
| pnge-geochem-pw:phreeqc-geochem | — | SKIP (computational, no endpoint) |
| Skill | HTTP | Status |
|---|---|---|
| pnge-state-regulatory:wvges-wells | 200 | PASS |
| pnge-state-regulatory:padep-wells | — | SKIP (not network-testable) |
| pnge-state-regulatory:odnr-wells | 200 | PASS |
| pnge-state-regulatory:tx-rrc | 200 | PASS |
| pnge-state-regulatory:nm-ocd | 200 | PASS |
| pnge-state-regulatory:nd-dmr | 200 | PASS |
| pnge-state-regulatory:la-sonris | 200 | PASS |
| pnge-state-regulatory:ar-aogc | — | SKIP (not network-testable) |
| pnge-state-regulatory:ok-occ | 200 | PASS |
| pnge-state-regulatory:calgem | 200 | PASS |
| pnge-state-regulatory:co-ecmc | 200 | PASS |
| pnge-state-regulatory:appalachia-mineral-parcels | 200 | PASS |
| Skill | HTTP | Status |
|---|---|---|
| pnge-economics:fred-prices | 400 | PASS (auth-reject) |
| pnge-economics:bls-data | 200 | PASS |
| pnge-economics:bea-data | 200 | PASS |
| pnge-economics:census-data | — | SKIP (not network-testable) |
| pnge-economics:worldbank-energy | 200 | PASS |
| pnge-economics:comtrade-minerals | 200 | PASS |
| pnge-economics:iea-open | 200 | PASS |
| pnge-federal-data:wri-aqueduct | 200 | PASS |
| pnge-state-regulatory:ospar-discharges | 200 | PASS |
| Skill | HTTP | Status |
|---|---|---|
| pnge-core:pnge-literature (USGS Pubs) | 200 | PASS |
| pnge-core:pnge-literature (DOE OSTI) | 200 | PASS |
| pnge-core:pnge-literature (OpenAlex) | 200 | PASS |
| pnge-core:pnge-literature (CrossRef) | 200 | PASS |
| pnge-core:datacite-doi | 200 | PASS |
| pnge-well-engineering:kggs-well-logs | 200 | PASS |
| pnge-well-engineering:macrostrat | 200 | PASS |
| pnge-patents:patentsview | — | SKIP (not network-testable) |
For every MISSING credential or FAIL probe, emit a concrete one-liner. Template:
~/.config/eia/credentials with api_key=.... See docs/TOKENS.md#eia.~/.config/netl-edx/credentials. See docs/TOKENS.md#netl-edx.~/.config/epa/credentials. See docs/TOKENS.md#epa.curl -v from the same shell.curl-style clients.For callers who prefer a compiled probe runner, the logic collapses to ~80 lines of stdlib Go. The skill skills/ directory holds the catalog; the script reads it, issues the probes in parallel, and prints the same markdown tables shown above.
package main
import (
"context"
"fmt"
"net/http"
"os"
"path/filepath"
"strings"
"sync"
"time"
)
type probe struct {
skill, url string
// passCodes lists HTTP status codes that count as PASS. Most probes
// are {200}; auth-reject probes are {200, 400, 403}.
passCodes []int
skip string // non-empty = not network-testable, explain why
}
var catalog = []probe{
{skill: "pnge-core:eia-data", url: "https://api.eia.gov/v2/", passCodes: []int{200, 403}},
{skill: "pnge-core:usgs-produced-waters", url: "https://www.sciencebase.gov/catalog/item/64fa1e71d34ed30c2054ea11?format=json", passCodes: []int{200}},
{skill: "pnge-core:usgs-minerals", url: "https://data.usgs.gov/datacatalog/", passCodes: []int{200}},
{skill: "pnge-federal-data:usgs-earthquakes", url: "https://earthquake.usgs.gov/fdsnws/event/1/count?format=text&minmagnitude=3", passCodes: []int{200}},
{skill: "pnge-federal-data:usgs-waterdata", url: "https://waterservices.usgs.gov/nwis/site/?format=rdb&stateCd=wv&siteType=GW&hasDataTypeCd=qw¶meterCd=00095&siteStatus=all", passCodes: []int{200}},
{skill: "pnge-federal-data:usgs-tnm", url: "https://tnmaccess.nationalmap.gov/api/v1/products?datasets=National+Map", passCodes: []int{200}},
{skill: "pnge-federal-data:netl-edx", url: "https://edx.netl.doe.gov/api/3/action/status_show", passCodes: []int{200}},
{skill: "pnge-federal-data:netl-carbon-storage", url: "https://edx.netl.doe.gov/group/carbon-storage-open-database", passCodes: []int{200}},
{skill: "pnge-federal-data:doe-geothermal", url: "https://gdr.openei.org/", passCodes: []int{200}},
{skill: "pnge-federal-data:epa-regulatory", url: "https://data.epa.gov/efservice/TRI_FACILITY/rows/0:1/JSON", passCodes: []int{200}},
{skill: "pnge-federal-data:boem-offshore", url: "https://gis.boem.gov/arcgis/rest/services/BOEM_BSEE/MMC_Layers/MapServer?f=json", passCodes: []int{200}},
{skill: "pnge-federal-data:blm-mineral-records", url: "https://glorecords.blm.gov/", passCodes: []int{200}},
{skill: "pnge-federal-data:fracfocus", url: "https://www.fracfocusdata.org/DisclosuresSearch/", passCodes: []int{200}},
{skill: "pnge-federal-data:nasa-earthdata", url: "https://cmr.earthdata.nasa.gov/search/health", passCodes: []int{200}},
{skill: "pnge-state-regulatory:wvges-wells", url: "https://tagis.dep.wv.gov/arcgis/rest/services/WVDEP_enterprise/oog/MapServer?f=json", passCodes: []int{200}},
{skill: "pnge-state-regulatory:odnr-wells", url: "https://gis.ohiodnr.gov/arcgis/rest/services/OIL_GAS/WellsAndPermits/MapServer?f=json", passCodes: []int{200}},
{skill: "pnge-state-regulatory:tx-rrc", url: "https://www.rrc.texas.gov/resource-center/research/data-sets-available-for-download/", passCodes: []int{200}},
{skill: "pnge-state-regulatory:nm-ocd", url: "https://wwwapps.emnrd.nm.gov/ocd/ocdpermitting/", passCodes: []int{200}},
{skill: "pnge-state-regulatory:nd-dmr", url: "https://www.dmr.nd.gov/oilgas/", passCodes: []int{200}},
{skill: "pnge-state-regulatory:la-sonris", url: "https://sonris.com/", passCodes: []int{200}},
{skill: "pnge-state-regulatory:ok-occ", url: "https://www.occ.ok.gov/", passCodes: []int{200}},
{skill: "pnge-state-regulatory:calgem", url: "https://www.conservation.ca.gov/calgem", passCodes: []int{200}},
{skill: "pnge-state-regulatory:co-ecmc", url: "https://ecmc.state.co.us/", passCodes: []int{200}},
{skill: "pnge-state-regulatory:appalachia-mineral-parcels", url: "https://mapwv.gov/parcel/", passCodes: []int{200}},
{skill: "pnge-economics:fred-prices", url: "https://api.stlouisfed.org/fred/series?series_id=GDP&api_key=invalid&file_type=json", passCodes: []int{200, 400}},
{skill: "pnge-economics:bls-data", url: "https://api.bls.gov/publicAPI/v2/surveys", passCodes: []int{200}},
{skill: "pnge-economics:bea-data", url: "https://apps.bea.gov/api/data/?UserID=TEST&method=GetDataSetList&ResultFormat=JSON", passCodes: []int{200}},
{skill: "pnge-economics:worldbank-energy", url: "https://api.worldbank.org/v2/country/USA/indicator/EG.USE.ELEC.KH.PC?format=json", passCodes: []int{200}},
{skill: "pnge-economics:comtrade-minerals", url: "https://comtradeapi.un.org/public/v1/preview/C/A/HS?reporterCode=842&period=2022&cmdCode=250300&flowCode=X", passCodes: []int{200}},
{skill: "pnge-economics:iea-open", url: "https://www.iea.org/data-and-statistics", passCodes: []int{200}},
{skill: "pnge-federal-data:wri-aqueduct", url: "https://www.wri.org/applications/aqueduct/water-risk-atlas/", passCodes: []int{200}},
{skill: "pnge-state-regulatory:ospar-discharges", url: "https://odims.ospar.org/", passCodes: []int{200}},
{skill: "pnge-core:pnge-literature (USGS Pubs)", url: "https://pubs.er.usgs.gov/pubs-services/publication?q=lithium&page_size=1", passCodes: []int{200}},
{skill: "pnge-core:pnge-literature (DOE OSTI)", url: "https://www.osti.gov/api/v1/records?q=lithium&rows=1", passCodes: []int{200}},
{skill: "pnge-core:pnge-literature (OpenAlex)", url: "https://api.openalex.org/works?search=lithium&per-page=1", passCodes: []int{200}},
{skill: "pnge-core:pnge-literature (CrossRef)", url: "https://api.crossref.org/works?query=lithium&rows=1", passCodes: []int{200}},
{skill: "pnge-core:datacite-doi", url: "https://api.datacite.org/heartbeat", passCodes: []int{200}},
{skill: "pnge-well-engineering:kggs-well-logs", url: "https://www.kgs.ku.edu/Magellan/Qualified/index.html", passCodes: []int{200}},
{skill: "pnge-well-engineering:macrostrat", url: "https://macrostrat.org/api/v2/units?strat_name=Marcellus&response=short", passCodes: []int{200}},
{skill: "pnge-federal-data:usgs-core-center", skip: "Cloudflare UA challenge"},
{skill: "pnge-federal-data:epa-treatability", skip: "ORD UA block"},
{skill: "pnge-federal-data:ejscreen-cejst-svi", skip: "EJScreen/CEJST geofenced"},
{skill: "pnge-state-regulatory:padep-wells", skip: "PA DEP GIS UA/TLS block"},
{skill: "pnge-state-regulatory:ar-aogc", skip: "AOGC UA block"},
{skill: "pnge-economics:census-data", skip: "api.census.gov intermittently geofenced"},
{skill: "pnge-patents:patentsview", skip: "Requires API key + header auth"},
{skill: "pnge-geochem-pw:phreeqc-geochem", skip: "Computational skill; no endpoint"},
}
func main() {
client := &http.Client{Timeout: 5 * time.Second}
var wg sync.WaitGroup
results := make([]string, len(catalog))
for i, p := range catalog {
if p.skip != "" {
results[i] = fmt.Sprintf("SKIP %s (%s)", p.skill, p.skip)
continue
}
wg.Add(1)
go func(i int, p probe) {
defer wg.Done()
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(ctx, "GET", p.url, nil)
if err != nil {
results[i] = fmt.Sprintf("FAIL %s (bad url: %v)", p.skill, err)
return
}
req.Header.Set("User-Agent", "Mozilla/5.0 (claude-pnge /doctor)")
resp, err := client.Do(req)
if err != nil {
results[i] = fmt.Sprintf("FAIL %s (request error: %v)", p.skill, err)
return
}
defer resp.Body.Close()
for _, c := range p.passCodes {
if resp.StatusCode == c {
results[i] = fmt.Sprintf("PASS %s (HTTP %d)", p.skill, resp.StatusCode)
return
}
}
results[i] = fmt.Sprintf("FAIL %s (HTTP %d — %s)", p.skill, resp.StatusCode, p.url)
}(i, p)
}
wg.Wait()
for _, r := range results { fmt.Println(r) }
// No filesystem walk: /doctor runs from an installed pnge-core cache
// and cannot see sibling plugin directories. Use the built-in /plugin
// slash command to inventory installed plugins.
_ = filepath.Join // keep import if unused above
_ = os.Stat
_ = strings.TrimSpace
}
Compile and run:
go run ./scripts/doctor/main.go
The shell version in §1–2 and the Go runner in §5 produce the same tables; pick whichever fits the workflow.
rows=1, max=1, page_size=1, count endpoints, status_show heartbeats). No probe should transfer more than a few KB.auth-reject OK. Do not generalize this to other probes — a 403 from data.epa.gov is a real failure, not an auth rejection.curl, and only then ship the skill. Skills without a probe entry count as untested.65b6d616d34e46cd33b3690e is 404 at the time of writing. Current USGS Produced Waters v3 item ids verified live: 64fa1e71d34ed30c2054ea11 (v3.0) and 59d25d63e4b05fe04cc235f9 (v2 legacy). The probe uses the v3.0 id.npx claudepluginhub jpfielding/claude.pnge --plugin pnge-core/doctorRuns diagnostic checks on pro-workflow and Claude Code setup including installation, hooks functionality, context health, CLAUDE.md size, git status, and settings.
/doctorDiagnoses the Repowise setup — checks installation, API keys, and index/store consistency — and optionally repairs drift.
/doctorDiagnoses babysitter run health (optional run-id uses most recent), checking 10 areas: journal integrity, state cache, effects, locks, sessions, logs, disk usage, and more. Produces structured report with PASS/WARN/FAIL statuses.
/doctorRuns Lean4 diagnostics on environment, plugin structure, workspace build, and MCP tools; detects legacy migrations and stale files for cleanup. Supports env, migrate [--global], cleanup [--apply] modes.
/doctorChecks KARIMO installation health across files, templates, GitHub auth, CLAUDE.md, and version. Provides issues and recommendations. Supports --test for quick 4-test verification.
/doctorDiagnoses OCR setup by checking installation files, Git availability, optional GitHub CLI authentication, and reports readiness status.