sourceweave-publishing — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sourceweave-publishing (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 skill is for publishing sourceweave-web-search autonomously and safely.
The repo already has a concrete release shape. Do not invent a new one unless the user explicitly asks. The core job is to make release metadata consistent, verify the release surface, publish the package/container artifacts, and only then publish MCP Registry metadata.
Apply KISS/YAGNI/DRY/SOLID when reviewing or editing release flow:
Publish SourceWeave with least surprising flow:
pyproject.tomlCHANGELOG.md so released changes move out of UnreleasedREADME.md if release changes user-facing behaviorserver.json to MCP RegistryTreat pyproject.toml as the release version source of truth.
Use this as the canonical release-metadata sync command:
uv run python scripts/sync_release_metadata.pyThe packaged script entry point is an equivalent alternative when that is more convenient:
uv run sourceweave-sync-release-metadataThe sync/check path covers:
src/sourceweave_web_search/tool.py header versionserver.json version and package versionsdocker-compose.yml publishable image tagDo not hand-edit those version fields unless the user explicitly asks for a one-off repair.
The sync script does not cover every literal version occurrence in repo.
It does not update:
artifacts/sourceweave_web_search.pyCHANGELOG.mdFor README work, do not hand-wave. If public behavior, install/run steps, or release surfaces changed enough that README may now be stale, explicitly load global create-readme skill and use it to review/update README.md before release verification.
Recent architectural context that matters for release validation:
search_web(query, domains?, urls?)read_pages(page_ids, focus?)read_urls(urls, focus?)read_pages is follow-up read by page_id; direct URL reading belongs to read_urlsCacheMode is intentionally used for search freshness and direct-read semantics, so release testing should include at least one normal search path and one direct URL read path when behavior changedThe generated OpenWebUI artifact is a separate derived surface. Keep it aligned with:
uv run sourceweave-build-openwebui
uv run sourceweave-build-openwebui --checkFor release work, treat the combined version-alignment flow as:
uv run python scripts/sync_release_metadata.py
uv run sourceweave-build-openwebuiAnd the combined verification flow as:
uv run python scripts/sync_release_metadata.py --check
uv run sourceweave-build-openwebui --checkFor autonomous releases, use this full local prep flow unless user explicitly narrows scope:
uv run python scripts/sync_release_metadata.py
uv run sourceweave-build-openwebui
uv run python scripts/sync_release_metadata.py --check
uv run sourceweave-build-openwebui --check
uv run pytest tests/test_tool.py tests/test_config.py tests/test_packaging.py -q -p no:cacheprovider
uv run ruff check src tests
uv run pyright src tests
uv build --no-sources --sdist --wheel --out-dir dist/release-check --clear --no-create-gitignore
docker build -t sourceweave-web-search-mcp:release-check .Release workflow:
.github/workflows/release.ymlRegistry workflow:
.github/workflows/publish-mcp-registry.ymlRelease gate:
.github/workflows/release-gate.ymlKey metadata files:
pyproject.tomlCHANGELOG.mdserver.jsonDockerfileREADME.mdRun these checks unless the user explicitly tells you to skip them:
uv run python scripts/sync_release_metadata.py --check
uv run sourceweave-build-openwebui --check
uv run pytest tests/test_tool.py tests/test_config.py tests/test_packaging.py -q -p no:cacheprovider
uv run ruff check src tests
uv run pyright src tests
uv build --no-sources --sdist --wheel --out-dir dist/release-check --clear --no-create-gitignoreIf the user asks whether the sync script covers "all occurrences," answer precisely: no. It covers the intended release metadata surfaces, while the OpenWebUI artifact has its own build/check path and changelog text is still maintained separately.
If the container story changed, also verify the local MCP image path:
docker compose build mcp
docker compose up -d --force-recreate mcpWhen the user cares about the running container identity, inspect labels with:
docker inspect sourceweave-web-search-mcp-1 --format '{{.Config.Image}} {{json .Config.Labels}}'Use this order unless the user explicitly changes it:
This order matters because MCP Registry metadata should point at already-published artifacts.
Do not skip commit/push in autonomous release mode. workflow_dispatch releases remote Git state, not local uncommitted edits.
Use .github/workflows/release.yml.
Important inputs:
tag: must match v{project.version}target_ref: usually mainprerelease: false for normal releasespublish_pypi: true when publishing the packagepublish_ghcr: true for the primary container publish pathpublish_dockerhub: only if the user wants the extra mirrorchangelog: markdown release notes bodyRecommended default invocation:
VERSION=$(python - <<'PY'
import tomllib
from pathlib import Path
data = tomllib.loads(Path("pyproject.toml").read_text())
print(data["project"]["version"])
PY
)
gh workflow run release.yml \
--ref main \
-f tag="v${VERSION}" \
-f target_ref=main \
-f prerelease=false \
-f publish_pypi=true \
-f publish_ghcr=true \
-f publish_dockerhub=false \
-f changelog="$(cat CHANGELOG.md)"After dispatch, wait for result and inspect logs:
gh run watch --exit-status
gh run list --workflow release.yml --limit 1Package name:
sourceweave-web-searchUse trusted publishing via the existing workflow. If PyPI trusted publishing fails, suspect a publisher-configuration mismatch first, not a build problem.
Expected trusted-publisher identity:
MRNAQAsourceweave-web-searchrelease.ymlPrimary image:
ghcr.io/mrnaqa/sourceweave-web-search-mcpPrefer GHCR as the default public container registry. It is the cheapest and simplest fit for this repo's GitHub-centered workflow.
Optional mirror only.
Default repository if enabled:
mrnaqa/sourceweave-web-search-mcpRequires:
DOCKERHUB_USERNAMEDOCKERHUB_TOKENRegistry server name:
io.github.MRNAQA/sourceweave-web-searchPublish only after PyPI and GHCR artifacts are live.
Workflow:
.github/workflows/publish-mcp-registry.ymlTypical invocation:
gh workflow run publish-mcp-registry.yml --ref main -f target_ref=mainAfter dispatch, wait for result and inspect logs:
gh run watch --exit-status
gh run list --workflow publish-mcp-registry.yml --limit 1Confirm the release itself:
VERSION=$(python - <<'PY'
import tomllib
from pathlib import Path
data = tomllib.loads(Path("pyproject.toml").read_text())
print(data["project"]["version"])
PY
)
gh release view "v${VERSION}" --json url,tagName,name,isPrerelease,assetsConfirm the PyPI package is installable:
VERSION=$(python - <<'PY'
import tomllib
from pathlib import Path
data = tomllib.loads(Path("pyproject.toml").read_text())
print(data["project"]["version"])
PY
)
uvx --from "sourceweave-web-search==${VERSION}" sourceweave-search --helpConfirm GHCR image exists:
VERSION=$(python - <<'PY'
import tomllib
from pathlib import Path
data = tomllib.loads(Path("pyproject.toml").read_text())
print(data["project"]["version"])
PY
)
docker manifest inspect "ghcr.io/mrnaqa/sourceweave-web-search-mcp:${VERSION}"If the user wants extra confidence, also confirm latest is updated when that tag was published.
Prefer CHANGELOG.md as the source for the release notes body unless the user gives a custom changelog.
Good release notes for this repo should answer:
Pause and ask the user before proceeding if:
If untracked temp eval files or scratch outputs exist, do not include them in release commit unless user explicitly wants them shipped.
When doing a publish task, report in this order:
Keep it operational and specific. The user should be able to tell at a glance whether the release is ready, running, blocked, or complete.
Example 1: Input: bump the version, update the changelog, and publish to pypi and ghcr Output: bump pyproject.toml, run metadata sync, update CHANGELOG.md, run verification, trigger release.yml with publish_pypi=true and publish_ghcr=true, verify PyPI install and GHCR manifest, then recommend running MCP Registry publish.
Example 2: Input: the pypi release failed with invalid-publisher, figure it out Output: inspect the workflow identity from the error, compare it against the expected trusted-publisher config for MRNAQA/sourceweave-web-search and release.yml, explain the mismatch, and tell the user exactly what to fix in PyPI.
Example 3: Input: publish this release everywhere and tell me the next command Output: verify release readiness, run or instruct release.yml, confirm PyPI and GHCR artifacts, then give the exact gh workflow run publish-mcp-registry.yml --ref main -f target_ref=main command.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.