From beislid
Audits Beislið workflow config in .beislid/workflow.md by probing capabilities against host session, reporting gaps in conversational prose, and caching results. Use /doctor, after editing config, or with --refresh.
npx claudepluginhub sandsower/beislidThis skill uses the workspace's default tool permissions.
Audit a project's Beislið workflow config end-to-end. Read `<repo>/.beislid/workflow.md`, probe each configured capability against the current host session, write a probe cache that orchestrators consume, and print a conversational audit.
Interactively configures Beislið project workflow in .beislid/workflow.md using git prechecks, ticket source detection, and conversational menus. Shows diffs before writes; activates on setup/configure intents.
Audits repository for baseline compliance across 9 categories: configuration, code quality, git hygiene, CI/CD, testing, security, documentation, Clank integration, MCP. Emits Markdown report and JSON sidecar.
Audits Claude Code project configuration for drift and collaboration issues across six layers (CLAUDE.md, rules, skills, hooks, subagents, verifiers), tiered by project complexity.
Share bugs, ideas, or general feedback.
Audit a project's Beislið workflow config end-to-end. Read <repo>/.beislid/workflow.md, probe each configured capability against the current host session, write a probe cache that orchestrators consume, and print a conversational audit.
Doctor is read-only on the repo and write-only on the cache. It does not modify workflow.md, install or remove skills, post comments, or invoke other orchestrators.
Pass --refresh to force a full re-probe even when the cache is fresh.
Run via Bash:
git rev-parse --show-toplevel
If exit code ≠ 0, hard-fail with this prose and stop:
🛑 Doctor needs a git repository. Beislið workflow config lives at
<repo>/.beislid/workflow.md. Rungit inithere, make at least one commit, then re-run/doctor.
Capture the repo root path for later steps ($git_root).
Also verify there is at least one commit:
git rev-list --max-parents=0 HEAD | head -1
If exit ≠ 0 or output is empty, hard-fail with the same prose pattern adjusted to "make at least one commit." No path-hash fallback.
Read three files in this order:
$git_root/.beislid/workflow.md — the config under audit. If the Read fails (file does not exist), hard-fail with the two-clause prose and stop:
🛑 No
workflow.mdfound in.beislid/. If this is a fresh project, run/setupto create one. If you moved your config, restore it to<repo>/.beislid/workflow.md.
probe-semantics.md (relative to this SKILL.md, resolved through the per-skill symlink). If the Read fails (broken symlink), hard-fail:
🛑 Doctor's probe-semantics aux is unreadable — likely a broken symlink. Re-run
~/Projects/beislid/install.shto repair it.
workflow-md-format.md (relative to this SKILL.md, same pattern). Same broken-symlink message tailored to the format spec.
The first line of workflow.md MUST match exactly:
<!-- beislid-workflow: v1 -->
If the first line is missing the stamp or shows a different version, hard-fail with prose that names what was found and offers two options:
⚠️ This
workflow.mdis<found>but doctor only knowsv1. Update Beislið (current version is X.Y), or downgradeworkflow.mdby hand to v1 syntax. Doctor will not silently mis-parse.
Stop. Do not write a cache file.
Two values are needed: the repo identity (used in the cache filename) and the workflow content hash (used to detect drift).
repo_hash=$(git rev-list --max-parents=0 HEAD | sort | head -c 12)
workflow_hash=$(git hash-object .beislid/workflow.md)
Sort makes multi-root histories deterministic. git hash-object is portable across Linux/macOS/BSD without depending on sha256sum.
State directory: ${BEISLID_STATE_DIR:-$HOME/.local/state/beislid}/probes/. Cache filename: <repo_hash>.json.
Read the cache file if it exists. Three outcomes:
schema field is anything other than 1 — treat as no file. Reprobe and write fresh at schema: 1. Don't surface.If the file parses as schema: 1 and --refresh was NOT in the user's invocation:
If workflow_hash in the cache matches the freshly computed hash AND (now - doctor_run_at) < ttl_hours from workflow.md or the cache (whichever is fresher), narrate that the cache is fresh and exit:
🩺 Workflow check on
<project_name>. Cache is fresh from <human time, e.g. "2 hours ago"> — nothing has changed since. Run/doctor --refreshto force a full re-probe.
Stop. No re-write needed.
Otherwise (hash mismatch or stale): full reprobe at step 7.
If --refresh is in the invocation, skip the freshness check entirely and reprobe.
<project_name> is the basename of $git_root: git rev-parse --show-toplevel | xargs basename.
mkdir -p "${BEISLID_STATE_DIR:-$HOME/.local/state/beislid}/probes/"
Don't write the cache file yet — write at step 10 after probing completes.
Identify section headings (## <Topic>) and the typed-key fenced blocks within each. The format spec at workflow-md-format.md defines canonical section names and capability keys.
For each fenced block with info string beislid:<key>:
Duplicate check. If this <key> was already encountered earlier in the file, the first occurrence wins. Add an inline ⚠️ warning to the output narrating "found a second beislid:<key> block on line N — using the first one." Skip this block. Use grep -n '^\``beislid:' .beislid/workflow.md` to map blocks to lines.
Unknown key check. If <key> is not in the canonical keys list (per the format spec), add an inline 💭 note: "I don't know what beislid:<key> is — skipping. If this is a new capability, check the format spec." Continue.
Disabled-state check. If the section's prose says "Disabled for this project" (or similar) AND no fenced block follows, record status: disabled, probe_supported not set, no probe run.
Probe. Otherwise, dispatch on type (or the key's canonical probe kind per probe-semantics.md) and run the probe. Record the result in the cache schema below.
Parse failure. If the YAML inside the fenced block doesn't parse, run grep -n '^\``beislid:' .beislid/workflow.md` to find the block start line, add the YAML parse-error offset within the block to compute the file line, and surface in prose:
⚠️ The
beislid:<key>block on line N doesn't parse as YAML — <one-line description of the parse error, e.g. "looks like a tab where there should be spaces.">
Mark this capability as status: failed, probe_supported: true, reason: "YAML parse error at line N: <details>". Continue probing other capabilities.
For each hard paired set (today: domain_expert.agent ↔ knowledge_store.path), check whether exactly one half is configured. If so, surface in prose (non-blocking):
⚠️
domain_expert.agentis set butknowledge_store.pathisn't — domain capture/recording steps will skip where they require the pair.
Both halves probed independently and recorded in the cache; no special status — the warning is purely narrative.
Also check the PR review soft pair:
pr_review_source alone is valid. Narrate it as read-only PR feedback handling; replies/re-request review will be manual if pr_review_update is absent or type: manual.pr_review_update without pr_review_source is a warning: update is configured without a source, so heard-chef can only use it after pasted PR feedback.pr_review_source.type: paste with pr_review_update configured is valid with a note: update is usable after pasted PR feedback.pr_review_update.type: manual is ok/no-probe; narrate it as manual-by-design, not missing.Read doctor-templates.md for the canonical cache JSON example and field-level rules (status enum semantics, when probe_supported: false applies, when value and reason are omitted, etc.).
Always write the cache, including failures. Orchestrators need full state for lazy-probing decisions.
Marshal the schema to JSON and write to <state_dir>/probes/<repo_hash>.json. Overwrite atomically if possible.
If the write fails (permissions, disk full, etc.), surface in prose with the path:
⚠️ Couldn't write the probe cache to
<path>: . The audit ran fine, but orchestrators won't see the cached results until you fix the underlying issue.
Continue to step 11 — the audit narration is still useful even without a cache write.
Default mode (no BEISLID_VERBOSE) emits prose narration. Char budgets:
Open with 🩺 **Workflow check on <project_name>.** then narrate what's configured, what was probed, and the cache status. Keep it conversational — no tables, no fixed-width columns, no checkmark grids.
Read doctor-templates.md for doctor's success and failure templates (worked examples). The three-clause failure shape (the rule), the 12-emoji palette, and the rules for placing inline ⚠️ and 💭 notes inside the narration come from output-templates.md.
When BEISLID_VERBOSE=1 is set in the environment, append structured stamps under the prose, separated by ---. Stamps are diagnostic, not narrative.
Read output-templates.md for the universal verbose-stamps layout rule (--- divider; "augment, don't replace"). Read doctor-templates.md for doctor's per-capability stamp layout and the stamp-symbol legend (✓ / ✗ / —). Verbose mode is gated entirely on the env var; default mode shows only the prose, never the stamps.
pr_review_source/pr_review_update as unknown keys. They are Phase 3 workflow.md keys. Source-only is valid; update-only is a warning; manual/paste variants are configured no-op probes.grep -n '^\``beislid:' .beislid/workflow.md` plus the YAML parse offset./doctor invocation. Stale cache invalidates the whole file; doctor doesn't reprobe per-capability mid-flight.git rev-list --max-parents=0 HEAD without sort gives non-deterministic order across runs. Always pipe through sort before truncating.---. Default-mode users never see them.