publish-skill — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited publish-skill (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
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.
This is the meta-skill that publishes other skills. It is intentionally limited in scope: it assumes the project layout that this blueprint's skill-package/ example uses, and refuses to invent fields it doesn't have.
"register this skill in our registry" / "send this to skills hub"
pyproject.toml and src/<pkg>/skill_files/SKILL.md
organization, not just to test it locally
edit flow; do not auto-publish drafts)
a different flow, see the consumer scripts
pyproject.toml in the current directory — this skillcannot publish raw markdown without a packaging step
proceed and explain how to set them up
The work is delegated to a single Python script: scripts/publish.py. The script is parameterized — it reads defaults from ~/.skillpublish/config.toml and accepts CLI flags to override.
Always read resources/publish-skill-runbook.md before running anything. The runbook covers:
one fails)
namespace) decide where the skill lands
DRAFT → PENDING_APPROVAL → APPROVED lifecycle and who isexpected to push each transition
immutability) and their resolutions
The script reads ~/.skillpublish/config.toml:
[default]
region = "us-east-1"
codeartifact_domain = "skills-demo"
codeartifact_repository = "skills-prod"
registry_name = "skills-demo-registry"If the file is absent or a field is missing, the user must pass the value as a CLI flag. Refuse to proceed if any of --domain, --repository, --registry is unresolved.
This skill cannot bypass IAM. The script verifies:
sts:GetCallerIdentity)aws, twine)But it does NOT verify upfront that the principal has every required permission — that would require listing IAM, which most publishers don't have. Instead, it lets twine upload / CreateRegistryRecord fail naturally and surfaces the error. This is intentional: failures are clearer than a synthetic permission audit.
For the full permission set required to run this skill end-to-end, see docs/09-publishing-iam.md.
Two safeguards by default:
DRAFT. The author reviews via console / get-registry-record before running with --auto-submit to advance to PENDING_APPROVAL.
name already exists, the script exits and tells the author to bump the version in pyproject.toml.
If the user explicitly says "submit it for approval" / "go all the way", pass --auto-submit. Otherwise leave the conservative default.
can; their IAM grants UpdateRegistryRecordStatus).
any IAM resources — those are infrastructure provisioned by cdk deploy once per account.
policy compliance) — those belong on the curator's checklist or in an EventBridge-triggered scanner pipeline (see Phase 2).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.