deploy-setup — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited deploy-setup (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.
You are walking a developer through the first deploy of a Starter Series project. The project has been scaffolded (via create-starter skill / CLI / MCP) and is on disk; this skill takes it from "scaffolded" to "first release published."
.github/workflows/cd*.yml and package.json / pyproject.toml / Dockerfile.gh CLI is installed and authenticated (gh auth status). If not, instruct the user.gh repo create.Read these files to identify which starter the project came from:
| Signal | Template |
|---|---|
package.json#mcpName starts with io.github. and package.json#main exists, no electron dep | mcp-server (Node MCP) |
pyproject.toml references mcp package | mcp-server-python |
package.json#dependencies.discord.js | discord-bot |
package.json#dependencies.grammy | telegram-bot |
manifest.json#manifest_version === 3 | browser-extension |
package.json#engines.vscode | vscode-extension |
package.json#dependencies.electron (or devDependencies.electron) | electron-app |
package.json#dependencies.expo | react-native |
wrangler.toml exists | cloudflare-pages |
Dockerfile at root + no package.json | docker-deploy |
package.json#publishConfig.access === "public" and no other signal | npm-package |
Report the detected template name to the user.
Read .github/workflows/cd.yml (or cd-android.yml + cd-ios.yml for react-native, or cd-firefox.yml for browser-extension). Extract:
secrets.X referenced in with: / env: / if: blocks. These are the secrets that must be set.id-token: write in permissions: and npm publish --provenance / pypa/gh-action-pypi-publish in steps). If yes, the publish step needs no token secret — only registry-side configuration (web UI). If no, a token secret is required.If the user wants verbatim guidance, use this table:
| Template | Required GitHub secrets | Registry-side setup |
|---|---|---|
mcp-server | (none — OIDC via npm) | npm: enable trusted publisher for the package |
npm-package | (none — OIDC via npm) | npm: enable trusted publisher |
mcp-server-python | (none — OIDC via PyPI) | PyPI: register trusted publisher under https://pypi.org/manage/account/publishing/ |
vscode-extension | VSCE_PAT (required), OVSX_PAT (optional) | Azure DevOps: create PAT with Marketplace > Manage scope |
browser-extension | CHROME_REFRESH_TOKEN, CHROME_CLIENT_ID, CHROME_CLIENT_SECRET, CHROME_EXTENSION_ID, AMO_JWT_ISSUER, AMO_JWT_SECRET | CWS: OAuth client. AMO: API key |
electron-app | GH_TOKEN (or use GITHUB_TOKEN); platform code-signing certs (optional) | None for first run; signing certs for release |
react-native | EXPO_TOKEN, APPLE_ID, APPLE_APP_SPECIFIC_PASSWORD, APPLE_TEAM_ID, ASC_API_KEY_*, ANDROID_KEYSTORE_BASE64, etc. | Expo: account; App Store Connect API key; Play Console service account |
cloudflare-pages | CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID | Cloudflare: API token with Pages:Edit |
discord-bot | RAILWAY_TOKEN + RAILWAY_SERVICE_ID (Railway path) or FLY_API_TOKEN (Fly path) | Railway: project + service; Fly: app create |
telegram-bot | Same as discord-bot | Same |
docker-deploy | VPS_HOST, VPS_USER, VPS_SSH_KEY, APP_PORT (optional) | VPS reachable; ~/.env.app exists on host |
Run gh secret list -R <owner>/<repo> to see what's already set. Subtract from the required list. For each missing secret, ask the user:
"I need a value forVSCE_PAT. This is a Personal Access Token withMarketplace > Managescope from https://dev.azure.com/_usersSettings/tokens. Paste the token (it will be masked):"
Then run gh secret set VSCE_PAT --body "$value" -R <owner>/<repo>.
Never echo the value to the conversation, never write it to disk, never include it in git commit messages.
For mcp-server, npm-package, create-starter, mcp-server-python:
The CD workflow requires registry-side trusted publisher registration before the first publish. Provide the user with:
These steps cannot be automated via gh — they're registry-side web UI. Provide the URL and exact field values.
Once secrets are in place and OIDC is registered:
# Bump version first (some templates require this; check cd.yml's version-guard step)
npm run version:patch # or version:minor, or version:major
# Commit + push the version bump
git commit -am "chore: bump version for first release"
git push
# Trigger the CD workflow
gh workflow run cd.yml -R <owner>/<repo>
# Watch the run
gh run watch -R <owner>/<repo>For tag-triggered repos (docker-deploy uses push: tags: v*), instead:
git tag v0.1.0
git push origin v0.1.0After the run finishes:
gh release view -R <owner>/<repo>For npm: npm view <package-name> shows the published version. For PyPI: pip index versions <package-name> (or visit pypi.org/p/<name>). For Marketplace: visit https://marketplace.visualstudio.com/items?itemName=<publisher>.<name>. For GHCR: docker pull ghcr.io/<owner>/<repo>:<version>.
If the user asks for a dry run, do everything except gh secret set and gh workflow run. Print the would-be commands and the secret names you'd request. Useful for review before committing to a deploy.
Walk the user through one numbered step at a time. After each interactive prompt, summarize what got set / what's pending. End with a "Next: trigger cd.yml" once secrets and OIDC are in place.
gh repo create <name> --public --source=. --push and re-detect after.secrets.GITHUB_TOKEN automatically with read+write to the same repo. Don't ask the user to set it.cd.yml, surface the failure with gh run view <id> --log-failed | head -50 so we don't blindly retrigger..deploy-setup.checkpoint file at repo root listing which secrets/OIDC steps are done, and resume from there next invocation. (Optional — only if user asks.)gh secret set --body "$VALUE".~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.