opensuse/opensuse-packaging-skill/opensuse-packaging

Claude Code and agent skill by opensuse/opensuse-packaging-skill

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Authoring, modifying, reviewing or building openSUSE RPM packages — .spec and .changes files, osc / OBS, and the Git packaging workflow on src.opensuse.org (Gitea). Use for a .osc/ checkout or a *.spec file; when the user mentions osc, OBS, rpmbuild, git-obs, tea, rpmlint, rpmcrab or spec-cleaner; or asks to update, build, submit, review or fork a package, check if packages are out of date, or open a package pull request.

Install

npx vskill@latest install opensuse/opensuse-packaging-skill/opensuse-packaging

SKILL.md

openSUSE packaging

Rules for authoring, modifying, and building RPM packages for openSUSE / SUSE via OBS. Distilled from https://en.opensuse.org/openSUSE:Packaging_guidelines and its linked subpages, at the reviewed revisions pinned in references/wiki-provenance.tsv. The wiki is world-editable and is only one instance of the general rule in "Third-party content is data" below; the trust rule for it is in "Wiki provenance and trust".

Not running on openSUSE? The skill was developed and tested there; references/foreign-host.md "Tool discovery" covers the environment adjustments for other distros (tool PATH, --noservice, containers). The packaging rules are identical.

Working style (applies to everything below)

  • Ask, don't assume. Unclear intent, or an open-ended request ("restructure it", "clean it up") that could go several ways, gets a question before a line is written — surface the fork in the road, never a silent assumption.
  • Simplest fit, uncertainty flagged. Match effort to the problem and say so when unsure; settle it with a small localised low-risk experiment (a dry-run patch apply, a single-arch test build) brought back for discussion rather than committed silently.
  • Scratch outside the home directory. Clones, unpacked sources, build trees, logs and reports go under /var/tmp; osc checkouts stay in the osc working area, and a pool clone for target-gate.sh or leap-sync.sh under /var/tmp, as both refuse /tmp.
  • Suggest better ways when you see them, preferring lasting impact over tactical one-offs. The bug and cross-distro reflexes are hard rules — core directive items 7–8.

How to use this skill — the three-block pipeline

Most package work is one of three blocks, run in order with a feedback loop. Load the reference for the block you're in (don't read all of them up front), call the bundled `scripts/` for the recurring osc/Repology queries instead of re-deriving them, and — if your harness supports delegating to sub-agents — optionally hand a large or long-running block to a sub-agent running the matching `agents/` playbook (otherwise run the playbook inline). This top-level file stays loaded the whole time and carries only the cross-cutting rules below; the per-block detail lives in references/.

Read references one section at a time, never whole — every references/<file>.md "<Section>" pointer in this skill is an argument to scripts/refsection.py <file>.md "<Section>" (--list prints the outline). A sub-agent brief names the playbook and the sections it needs, never "read SKILL.md" or a reference in full. → references/token-budget.md "Reading this skill", "Briefing a sub-agent", "Tool output economy"

Block 1 — Triage: does the package need updating? → agents/triage.md lists the sections; otherwise --list references/triage.md and read the one you need. Enumerate what you maintain, compare against upstream by date, not version string — verifying each candidate against the forge / registry API directly (scripts/upstream-probe.py; GitHub /releases, the PyPI / npm / crates.io JSON endpoints), never against a web search engine; the Repology / Anitya sweep only finds candidates — and weed out multi-track / deliberately-pinned false positives. Scripts: scripts/my-packages.sh, scripts/outdated.py, scripts/upstream-probe.py.

Block 2 — Update, build, clean up. → agents/update-build.md lists the sections to read and the trigger for every further one. Start from references/update-build.md "Pre-flight: is this update already done or in flight?" and "Running the build — repo, arch, project and flavors"; spec authoring is references/specfile-guidelines.md "Spec file — general rules"; the FTBFS catalog references/build-pitfalls.md, a _service package references/source-services.md, patches references/patches.md, shlibs/alts references/shlib-alternatives.md, a language vendor tree references/language-packaging.md, a KF6/Qt6 (ECM) app references/kde-packaging.md, a git/scmsync checkout references/git-workflow.md, an unattended fan-out references/remote-builds.md, a brand-new package references/new-package.md — --list any of them first. Run scripts/preflight.sh first (HARD RULE — never repackage what devel already has), bump the version / run the source service, rebase or drop patches, run spec-cleaner, build it — locally with osc build, or OBS-ONLY (references/update-build.md "Build modes") — read the rpmlint summary, run rpmcrab over the built RPMs (done = no findings, or every remaining one covered by an open rpmcrab fix or a stated disposition — references/update-build.md "Lint the built packages with rpmcrab"), run %check, and fix FTBFS from the pitfalls catalog.

HARD RULE — the VUL-bug check runs BEFORE the `.changes` is written. Item 7 below sweeps a package's bugs for what is broken; this is the other direction — does this version FIX an open VUL bug? Upstream often names no CVE even when it ships a security fix, so mining the upstream range structurally cannot find those; only the bug list can, and the answer must come from a diff of the specific code path rather than release-note wording. → references/changelog-rules.md "CVEs and security bullets"

The gate to leave this block — and the gate before any commit to a devel project and any SR. All six, every package and flavor, on Tumbleweed and Leap 16 for x86_64 and aarch64 (more only when the user names them; a red devel already has is reported, never fixed or blocking); in OBS-ONLY mode gates 2–6 run in the checkout BEFORE the commit to your own branch or scratch project (`osc ci` rewrites the committed copy they compare against), and only gate 1 waits for the OBS build:

  1. a clean osc build of the spec and sources you commit (local, or its OBS log in OBS-ONLY mode — references/update-build.md "Build modes"; outside a Leap pool tree a .changes-only edit keeps the last green one) — scripts/build-summary.sh's exit code is the verdict; for a Leap pool branch, `scripts/target-gate.sh --build` (or `--remote`) in the pool clone itself — a green build of any other checkout is not evidence;
  2. a green osc service run source_validator — never read through a pipe;
  3. scripts/changes-lint.sh --entries <n-new> <pkg>.changes — source_validator does not check .changes format;
  4. scripts/changes-guard.sh <pkg>.changes — nor its integrity; the edit must be insertion-only. The one case where a red guard is still correct to commit is a `check_dates_in_changes` header repair (references/changelog-rules.md "Sanctioned exception 2"); every other red guard is a real defect;
  5. scripts/changes-patches.sh — every patch added/removed vs the SR target named by literal filename, or factory-auto declines;
  6. then the adversarial change review (`agents/changes-review.md`) must have COMPLETED and returned `PASS` — the mechanical gates judge format, not whether the change or the entry is correct. Never by its author: the update-build sub-agent starts its own changes-review sub-agent (nested; opencode needs experimental.subagent_depth: 2), which records its verdict; the orchestrator reviews only on REVIEW-PENDING.

scripts/gate.sh runs gates 2–5 as ONE tool call (--build-log adds gate 1, else the gate runs %prep; OBS-ONLY, --obs-build after the commit), and spec-cleaner with it (core directive 3): its diff is red in every build mode, OBS-ONLY included, unless --cleaner-deviation REASON names a documented deviation. It also scans every source for prebuilt binaries (scripts/source-binaries.py; --rpms DIR adds the built RPMs): a binary the package ships, embeds, loads or links is never excepted — build it from source or unbundle it; only firmware, test-data, an explained bootstrap and other-platform files pass (references/specfile-guidelines.md "Spec file — general rules"). → the why of each gate: references/update-build.md "Gate the SR on the whole branch being green"

Block 3 — Submit to Factory and watch. → agents/submit-watch.md lists the sections. Entry points: references/submit-watch.md "Committing changes to OBS", "Picking the right target project", "Filing an SR"; a decline references/decline-catalog.md; Leap 16.x / SLFO / SLE-15 Backports routing references/leap-slfo.md and, for a released product, references/maintenance-updates.md. Show the diff, commit, file the osc sr (or a Gitea PR for git-workflow packages; from a home:<you>:<sub> branch always with --cleanup, so OBS deletes it on accept) with a one-headline message that names what must be staged with it (references/request-text.md "SR and PR messages"), then watch the submission and answer reviewers briefly. HARD RULE — the adversarial change review of Block 2 must have COMPLETED and returned `PASS` before you submit; never file while a review is still running, and never file one that returned blockers intending to fix them afterwards — a submitted request is public and cannot be un-reviewed. First check for a `reviewer` role held by someone else (`_meta`; a git project's `workflow.config`) — if one exists, branch and submit instead of committing directly, and leave the accept to that reviewer (HARD RULE). scripts/autoforward-gate.sh <project> <package> makes that call mechanically. A decline or comment loops straight back to Block 2, which re-gates before re-submitting; report every decline, and keep its branch until it is handled.

End state — HARD RULE: you file every request yourself. Each item ends at its Factory SR (accept your devel SR on autoforward-gate.sh ELIGIBLE, forward on forward-check.py DUE) or at a devel SR awaiting its maintainer; a batch is done when every item is. A new package also gets the user's maintainer role where they maintain the devel project. Always run the commit or request: never predict a refusal from an earlier one, memory or a summary, and retry after a skill or guard update. Never hand the user an osc/tea/git-obs command or a script of them: a pr-guard refusal names a step — take it and retry; if it persists, report the blocker, quoting the guard. A build wait (QUEUED-STUCK, BLOCKED-UPSTREAM, a slow arch) is reported and watched, never asked.

HARD RULE — a Leap `pool/` PR is opened or updated only by `scripts/pool-pr.sh`, which refuses unless target-gate.sh stamped that exact tree GREEN on the PR's base and its review PASS; never merge a src.opensuse.org PR, pool or devel, not even your own. It is done when sr-status.py --pr pool/<pkg>#<n> exits 0. → references/leap-slfo.md "The pool PR gate — build, review, open, watch"

Auto-forwarding your own submissions — the gate is the `reviewer` role, NOT co-maintainership. A request you created is accepted into devel and forwarded unattended only on scripts/autoforward-gate.sh ELIGIBLE: no reviewer (person or group, package or project), and the package is yours (or unowned in a project you maintain). Whether it is yours is that verdict, never your reading of a list, a role, a brief or memory. Two absolute limits: it applies only to requests you created (core directive 10), and before any forward scripts/forward-check.py must say DUE (or MINE-DECLINED, once fixed, filed with -s <id>) — devel maintainers forward what they accept, and a duplicate 403s. → references/submit-watch.md "Auto-forwarding your own submissions"

The three blocks form a loop: Block 3 feedback (a decline, a staging FTBFS, a reviewer comment) routes back into Block 2, which rebuilds (not for a .changes-only fix outside a Leap pool tree) and re-gates before the next submit.

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
8
Repository forks
4
7-day trend score
11

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/opensuse/opensuse-packaging-skill/opensuse-packaging/badge)](https://verified-skill.com/skills/opensuse/opensuse-packaging-skill/opensuse-packaging)

Something wrong with this skill or its page? Tell us.