obs打包技巧
Claude代码技能 开放构建服务 包装维护。跟踪您的开发项目,查找需要更新的内容,分支包,修复构建,在OBS上验证,并在提交请求之前停止——您可以保持控制。
适用于 osc mcp 如果可用,则回退到 osc CLI。
为什么用这个而不是问克劳德?
Claude代码已经可以运行 osc 命令。但是如果没有这些技能,每一次会话都是从零开始的——克劳德不知道你维护了哪些包,它们是什么版本,上游是什么,预计会出现哪些构建失败,或者你的项目是如何构建的。你每次都会重新解释同样的背景。
这个技能体系给了克劳德一个 为您的包裹提供持久的大脑:
| 无技能 | 有技能 |
|---|---|
| “我要维护哪些包?”--Claude不知道 | Registry跟踪所有39个包、它们的生态系统、上游来源 |
| “ansible创建者是最新的吗?”--Claude必须从头开始查找 | Scanner在30秒内根据PyPI/GitHub/crates.io检查所有包 |
| “修复构建”——Claude读取日志,猜测修复情况 | 诊断表将12种常见故障模式映射到精确修复 |
| 15.6版本的构建再次失败——“这是意料之中的吗?” | 已知问题在会话中持续存在——已标记但未发出警报 |
克劳德尝试 osc sr 要“完成工作” | 三层护栏:MCP服务器不能,挂钩挡住它,技能不知道 |
| 直接在devel项目上工作 | 始终先分支,提交到您的分支,验证OBS构建 |
| 手动版本更新:编辑规范、编辑服务、编辑变更日志、构建、检查、提交 | 自动:读取上游变更日志、更新deps、调整补丁、提交、监视OBS、迭代失败 |
特性
- 车队扫描 --并行检查devel项目中的所有包与上游(PyPI、GitHub、Go代理、crates.io)的关系。显示一个包含过时、构建失败、断开链接和CVE警报的仪表板。
- CVE监控 --查询 OSV 每个包的当前版本的漏洞数据库。如果CVE影响您,它会显示哪个版本修复了它。
- 自动分支 --如果一个包需要工作,但还不在你的分支中,它会自动从devel分支。这就是OBS的工作流程——不需要确认。
- 构建诊断修复循环 --承诺OBS,观察
osc results -w在所有repos完成之前,读取构建日志以查找故障,应用修复程序(缺少deps、补丁模糊、文件列表不匹配、错误的Python构建系统等),重新提交并再次验证。在寻求帮助之前,最多需要5次迭代。 - 生态系统意识 --知道如何打包Python(pyproject.toml、setuptools、hatchling、flit)、Go(Go_modules、vendor)和Rust(货物打包)。根据规范检测构建系统并应用正确的模式。
- 每个包上下文 --随着时间的推移,积累关于每个包的知识:存在哪些补丁以及为什么,跳过哪些测试以及为什么,每个仓库的已知构建问题,共同维护者信息。上下文仅在处理该包时加载,不会使会话膨胀。
- 语境工程 --在处理完一个包后,代理会向其知识库中添加内容。您可以审查和接受/拒绝,就像为代理人自己的记忆批准PR一样。
- 三层SR护栏 --osc-mcp没有SR工具(不能),PreTool使用挂钩块
osc sr在执行之前(不会),技能说明说不(知道)。准备就绪后,您可以手动创建提交请求。 - 自治分支机构承诺 --代理显示差异以提高透明度,但会立即提交到您的分支。真正的验证是OBS构建结果,而不是人工审查差异。唯一的手动门是SR。
快速开始
先决条件
- 振荡 --已安装并配置了凭据
sudo zypper install osc # openSUSE/SUSE
osc -A https://api.opensuse.org ls # configure credentials- 克劳德代码 — CLI、桌面或IDE扩展
- osc mcp _(可选,推荐)_ — 从源代码构建
单线设置
git clone https://github.com/Spectro34/obs-package-skill.git
cd obs-package-skill
bash setup.sh安装脚本:
- 检查先决条件(
osc已安装和配置) - 安装技能、扫描脚本和安全挂钩
- 提示您输入OBS-devel项目和用户名
- 发现所有包并创建注册表
您还可以传递参数以跳过提示:
bash setup.sh --project systemsmanagement:ansible --user myuser
bash setup.sh --skip-init # install skills + hook only, set up packages later手动安装
如果你喜欢一步一步地做:
# Skills + scripts
mkdir -p ~/.claude/skills/obs-package ~/.claude/skills/obs-agent
cp skill/SKILL.md ~/.claude/skills/obs-package/SKILL.md
cp skill/AGENT.md ~/.claude/skills/obs-agent/SKILL.md
cp scripts/*.sh ~/.claude/skills/obs-agent/
chmod +x ~/.claude/skills/obs-agent/*.sh
# Safety hooks
mkdir -p ~/.claude/hooks
cp hooks/block-osc-sr.sh ~/.claude/hooks/block-osc-sr.sh
cp hooks/block-secrets.sh ~/.claude/hooks/block-secrets.sh
chmod +x ~/.claude/hooks/block-osc-sr.sh ~/.claude/hooks/block-secrets.sh
# Add hooks to settings (merge if you have existing hooks)
# See settings-example.json for the full format添加 ~/.claude/settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "bash ~/.claude/hooks/block-osc-sr.sh", "timeout": 3 },
{ "type": "command", "command": "bash ~/.claude/hooks/block-secrets.sh", "timeout": 3 }
]
},
{
"matcher": "Read",
"hooks": [
{ "type": "command", "command": "bash ~/.claude/hooks/block-secrets.sh", "timeout": 3 }
]
}
]
}
}初始化包注册表:
bash ~/.claude/skills/obs-agent/init-registry.sh \
--project systemsmanagement:ansible \
--user your-obs-username可选:添加osc-mcp
添加到您的项目 .mcp.json:
{
"mcpServers": {
"osc-mcp": {
"type": "stdio",
"command": "/path/to/osc-mcp",
"args": []
}
}
}不要将凭据放入MCP配置中--osc-MCP从中读取 ~/.config/osc/oscrc 或自动设置系统密钥环。
用法
扫描您的包裹
> scan my packages显示devel项目中所有包的仪表板:
## Package Dashboard — 2026-03-28
## Devel: systemsmanagement:ansible (39 packages)
### Outdated (2)
| Package | OBS | Upstream | Branched? | Action |
|-----------------|---------|----------|-----------|--------------|
| ansible-creator | 25.12.0 | 26.3.2 | no | Branch + bump|
| python-libtmux | 0.54.0 | 0.55.0 | no | Branch + bump|
### Build Failures (3)
| Package | TW | 15.6 | Branched? | Known? |
|------------------|-----------|--------------|-----------|--------|
| molecule-plugins | succeeded | unresolvable | yes | yes |
| python-ruamel | succeeded | failed | yes | no |
### CVE Alerts (0)
### Up to Date (34)
ansible-lint, ansible-navigator, ansible-runner, ...处理一个包
> work on python-ruamel.yaml代理加载包的上下文文件,并将其交给工作技能:
- 读取规格、变更日志、上游变更、构建日志
- 诊断故障(例如,错误
.dist-infoSLE路径15) - 应用修复程序
- 自主向您的分支机构承诺
- 手表
osc results -w直到所有6个repos完成 - 如果有任何失败,读取日志、修复、重新提交——最多5次
- 报告:“所有构建均已通过。运行
osc sr当准备好。"
如果包尚未分支,则首先从devel分支。
教它预期的失败
> molecule failing on 15.6 is expected, those repos don't have ansible-navigator已保存到包的已知问题。未来的扫描显示它是“已知的”,而不是“需要关注”。
复习所学内容
> review context显示对包知识的拟议添加。接受或拒绝每一个。
安排自动扫描
Claude Code可以使用以下命令在会话中按cron计划运行提示 /schedule 技能。预定的提示会像任何正常消息一样触发obs代理技能——所有安装的技能都是可用的。
> /schedule create --cron "3 8 * * 1" --prompt "obs scan — report outdated packages, CVE alerts, and build failures that aren't known issues. Keep it brief."当您的Claude Code会话正在运行时,它会在每周一早上8点左右触发。提示与obs代理触发器(“obs扫描”)匹配,因此技能可以使用完整的仪表板来处理它。
其他有用的时间表:
# Daily CVE + outdated check
> /schedule create --cron "7 7 * * *" --prompt "scan my packages — only report CVE alerts and newly outdated packages, skip build status"
# Durable schedule (survives session restarts, saved to .claude/scheduled_tasks.json)
> /schedule create --cron "3 8 * * 1" --durable --prompt "obs scan — full dashboard"注意:非持久计划会在7天后自动过期,并且仅在REPL空闲时(而不是在对话中)才会触发。使用 --durable 对于应该在会话中生存的时间表。
管理时间表:
> /schedule list # see all active schedules
> /schedule delete ID # remove a schedule运作原理
~/.claude/
├── obs-packages.json # What you maintain (auto-generated)
├── obs-packages/
│ └── context/ # Per-package knowledge (grows over time)
│ ├── ansible-creator.md
│ └── molecule.md
├── hooks/
│ ├── block-osc-sr.sh # Blocks submit requests
│ └── block-secrets.sh # Blocks reads/commands that expose secrets
└── skills/
├── obs-agent/ # Fleet management
│ ├── SKILL.md # Scan, track, triage, context
│ ├── scan-packages.sh # Parallel scanner (OBS + upstream + CVE)
│ ├── init-registry.sh # First-run package discovery
│ └── generate-context.sh # Per-package context generator
└── obs-package/ # Single-package worker
└── SKILL.md # Full workflow: context → fix → build → verify工作流程
"scan packages" → obs-agent
│
scan-packages.sh
(checks 39 packages in ~30s)
│
Dashboard: "3 need attention"
│
"work on python-ruamel.yaml"
│
Not branched? → osc branch
│
obs-package skill
Phase 0: gather context
Phase 1: make changes
Phase 2: local pre-flight (optional)
Phase 3: commit → osc results -w → diagnose → fix → repeat
Phase 4: all green → "run osc sr when ready"护栏
三个独立的层防止意外提交请求:
| 层 | 机制 | 可以绕过吗? |
|---|---|---|
| osc mcp服务器 | 二进制文件中不存在SR创建工具 | 否 |
| PreTool使用挂钩 | block-osc-sr.sh 击杀 osc sr 执行前的命令 | 否 |
| 技能指导 | 告诉克劳德在承诺后停止 | 软,但有两个硬层支持 |
分支提交是自主的——代理向您的分支提交并通过OBS构建进行验证。唯一的手动步骤是在您满意时创建提交请求。
凭证安全
此项目中未存储凭据。身份验证由以下人员处理:
oscCLI:读取~/.config/osc/oscrc(配置过程中osc设置)osc-mcp:从oscrc、内核密钥环或D-Bus特勤局读取- 这
.gitignore排除obs-packages.json和obs-packages/防止意外提交用户特定的数据
秘密编辑钩子
hooks/block-secrets.sh 是一个PreToolUse护栏,防止秘密进入克劳德的上下文。它着火了 两者 Bash 和 Read 并拒绝(退出2)会暴露凭据的操作:
| 类别 | 块 |
|---|---|
| oscrc证书 | cat ~/.oscrc, osc config --dump[-full] |
| SSH私钥 | 读取 ~/.ssh/id_*, *.pem, *.key, id_rsa/id_ed25519/id_ecdsa/id_dsa (但允许 *.pub) |
| GPG机密材料 | gpg --export-secret-keys, --export-secret-subkeys,阅读下面 ~/.gnupg/private-keys-v1.d/ |
| Shell凭据文件 | ~/.netrc, ~/.authinfo |
| 云凭据 | ~/.aws/credentials, ~/.config/gh/hosts.yml |
| 内联HTTP身份验证 | curl/wget 随着 Authorization: 标题或 -u user:pass |
| 凭证环境变量 | env/printenv 结合 TOKEN, PASSWORD, API_KEY, AWS_SECRET, GH_TOKEN等等。 |
| Git凭据泄漏 | git config --get *.password / *.token |
为什么是预工具使用而不是后工具使用: Claude Code的PostToolUse钩子无法重写工具输出-- additionalContext 仅附加,以及 decision: "block" 中止整个任务。真正编校的唯一方法是在执行read/命令之前停止它。因此,PreToolUse阻断器是秘密遏制的规范机制。
项目结构
.
├── README.md # This file
├── setup.sh # One-line setup script
├── skill/
│ ├── SKILL.md # Single-package workflow (the worker)
│ └── AGENT.md # Fleet management (scan, track, triage)
├── scripts/
│ ├── scan-packages.sh # Parallel package scanner (OBS + upstream + CVE)
│ ├── init-registry.sh # First-run: discover all packages, create registry
│ └── generate-context.sh # Generate context file for one package
├── hooks/
│ ├── block-osc-sr.sh # PreToolUse hook — blocks submit requests
│ └── block-secrets.sh # PreToolUse hook — blocks reads/commands that expose secrets
├── registry-example.json # Example registry template
├── context-example.md # Example per-package context file
├── mcp-config-example.json # Example .mcp.json for osc-mcp
├── settings-example.json # Example Claude Code settings with hook
└── .gitignore # Excludes user-specific data许可证
阿帕奇-2.0
