learn-profile — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited learn-profile (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Read-only inspection of a reference repo. Writes one JSON file (the new profile) to the user's profile root. Never touches the reference repo itself.
Need two things:
the current working directory only if the user says "this repo"; otherwise ask for the path explicitly. Profile learning from the wrong repo produces a confusing profile, so err on the side of confirming.
^[a-z0-9][a-z0-9-]*$. If the user offers a name with spaces or caps (e.g. "My Next Starter"), propose a slug (my-next-starter) and confirm before running.
Optional:
~/.claude/nyann. Only passexplicitly when the user wants a different root.
without writing it to disk. Useful for "show me what you'd save".
repo, say so — the inference loses most of its signal (branching strategy comes from branches + tags, commit convention from subject history). Offer to continue anyway, but warn.
<user-root>/profiles/<name>.json. If it does, ask the user whether to overwrite or pick a different name. Never silently clobber.
bin/learn-profile.sh \
--target <resolved-path> \
--name <slug> \
[--user-root <dir>] \
[--stdout]Expected exit codes:
| Code | Meaning | What to do |
|---|---|---|
| 0 | profile written | Tell the user the path + show the inferred summary |
| 1 | bad input (missing target, invalid name, etc.) | Surface the error verbatim; fix and retry |
| other | internal failure | Surface stderr and stop — don't paper over |
On success, show the user:
~/.claude/nyann/profiles/<name>.json).framework, branching strategy, commit_format, hook list). Any field marked "inferred": true in the output came from heuristics rather than explicit config; call those out so the user knows to double-check.
bootstrap-project with --profile <name>" (or the matching natural language).
learn-profile reads:
detect-stack.sh output → stack block.husky/, .pre-commit-config.yaml, commitlint.config.*, installedgit hooks → hooks block
conventions.commit_formatbranching.strategy.editorconfig, .gitignore → extras blockWhen evidence is thin (e.g. a fresh repo with 2 commits), the inferred profile will be sparse. That's fine — flag it to the user ("I could only infer X and Y; everything else defaults"). Don't invent data to fill gaps.
bootstrap-projectwith --profile <name>.
inspect-profile or readthe JSON directly.
add-team-source for the team-profile side; learn-profile itself only writes to the user root.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.