publish — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited publish (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.
Publish a package from this monorepo via GitHub release. The publish workflow always publishes to all supported registries for the package (see table below) — there is no way to select individual registries.
Arguments are optional and positional — any can be omitted:
package: mcp-wallet-signer, browser-evm-signer, or browser-tron-signerbump: patch, minor, or majorNote: wallet-signer-core is an internal-only monorepo package — it's inlined into both chain packages by dnt, so no consumer would install it directly from npm. Don't publish it.
When arguments are omitted, infer them from context:
git diff HEAD~3 --stat -- packages/ to find which package(s) changed recently. If exactly one, use it. If ambiguous, ask the user.| Package | Dir | Version field in deno.jsonc | npm name | JSR name | Supported registries |
|---|---|---|---|---|---|
| mcp-wallet-signer | packages/mcp-wallet-signer | npm.version | mcp-wallet-signer | — | npm |
| browser-evm-signer | packages/browser-evm-signer | top-level version | browser-evm-signer | @nikicat/browser-evm-signer | npm, jsr |
| browser-tron-signer | packages/browser-tron-signer | top-level version | browser-tron-signer | @nikicat/browser-tron-signer | npm, jsr |
New npm packages need a one-time manual bootstrap before the GitHub-Actions OIDC flow works. For the very first publish of a new package:
cd packages/<dir> && deno task build:npmcd packages/<dir>/npm && npm login && npm publish --provenance --access public (interactive — user runs)cd packages/<dir> && deno publish --allow-dirtyrelease: created and fail because the version is already on the registry.GitHub Actions, owner nikicat, repo mcp-wallet-signer, workflow publish.yml, environment blank.Without this, the workflow's npm publish --provenance fails with ENEEDAUTH — secrets.NPM_TOKEN is unset in this repo on purpose; the workflow relies entirely on OIDC.
nikicat/mcp-wallet-signer.Without this, deno publish --allow-dirty fails with actorNotAuthorized. Authorization is per-package — granting it for one package does not carry over to a sibling under the same scope.
mcp-wallet-signerThe MCP build remaps each chain-pkg mod.ts import to an npm dependency with a fixed version range — see packages/mcp-wallet-signer/scripts/build-npm.ts, in mappings. For pre-1.0 versions, `^0.1.0` only matches `>=0.1.0 <0.2.0`, so a chain minor bump (0.1.x → 0.2.0) leaves the MCP package pinned to the old major-zero band and npx mcp-wallet-signer keeps installing the stale version.
When publishing mcp-wallet-signer after a chain package's minor bump, also bump the range to the new band (e.g. ^0.1.0 → ^0.2.0) and verify the built npm/package.json carries it before tagging:
grep -E '"browser-(evm|tron)-signer"' packages/mcp-wallet-signer/npm/package.jsonTags use the monorepo convention: <npm-name>@<version> (e.g., [email protected], [email protected]). The publish workflow parses the package name from the tag.
Resolve package from arguments or inference (see above).
Before doing any work, check what's already been done so the skill can resume a partial publish:
deno.jsonc (see table above for which field).git tag -l '<npm-name>@*' --sort=-v:refname | head -1.git tag -l '<npm-name>@<current-version>'.gh release view <npm-name>@<current-version> 2>&1.npm view <npm-name> versiondeno info jsr:<jsr-name>@<current-version>Based on this state, determine the resume point:
| Tag exists? | Release exists? | Published? | Action |
|---|---|---|---|
| No | — | — | Need to bump version, tag, and publish (full flow from step 3) |
| Yes (local only) | No | No | Push tag, then continue from step 5 (CI) |
| Yes (remote) | No | No | Continue from step 5 (CI) |
| Yes (remote) | Yes | No | Continue from step 7 (wait for publish workflow) |
| Yes (remote) | Yes | Yes | Already fully published — inform user and stop |
If a full flow is needed (no tag for current version):
git log <latest-tag>..HEAD --oneline -- packages/<package-dir> to get commits since the last release.Skip this step if resuming past it.
Run from the package directory:
cd packages/<package-dir> && deno task build:npmVerify the build succeeds before continuing.
Skip steps that are already done (e.g., if tag already exists, don't re-create it).
packages/<package-dir>/deno.jsonc.version fields in the root server.json (top-level and packages[0].version).Bump <npm-name> version to <new-version><npm-name>@<new-version>git push && git push --tagsImportant: Always verify the tag is on the remote before proceeding. If the tag exists locally but not on the remote, push it with git push --tags.
Wait for the CI workflow to pass on the pushed commit using gh run watch $(gh run list --workflow=ci.yml --limit=1 --json databaseId --jq '.[0].databaseId') with a timeout of 5 minutes.
If CI fails, show the logs with gh run view <run-id> --log-failed and stop — do not create a release with failing checks.
Run:
gh release create <npm-name>@<new-version> --title "<npm-name>@<new-version>" --generate-notesThis triggers the publish.yml GitHub Actions workflow which parses the package name from the tag, builds, and publishes to all supported registries:
deno task build:npm and publishes with npm publish --provenancejsr: true in the workflow (currently browser-evm-signer, browser-tron-signer)Get the run ID from gh run list --workflow=publish.yml --limit=1 and watch it with gh run watch <run-id>. Use a timeout of 5 minutes.
If the workflow fails:
gh run view <run-id> --log-failed.npm error code ENEEDAUTH → trusted publisher missing on npm for this package. See "First publish of a new package" step 5 — same fix applies to a package that was bootstrapped manually but never wired up for CI.error: ... actorNotAuthorized from deno publish → JSR repo authorization missing for this package.gh run rerun <run-id> --failed. The GitHub release is already created, so a fresh push won't re-trigger anything.Check all supported registries for the package:
npm view <npm-name> version and confirm the output matches <new-version>.deno info jsr:<jsr-name>@<new-version> from inside the workspace — Deno resolves the JSR specifier to the local workspace member and reports the in-tree source, so the check always "passes" regardless of what's actually on the registry. Hit JSR's meta API directly instead: curl -s "https://jsr.io/<jsr-name>/meta.json" | python3 -c "import sys, json; print(list(json.load(sys.stdin).get('versions', {}).keys()))"Confirm <new-version> appears in the list.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.