legal-builder-hub-auto-updater · git:20260529.efece30 · 2026-05-29 · sha256 1785627d266dc52f

legal-builder-hub-auto-updater git:20260529.efece30A

Immutable. This exact content is served forever at /api/v1/blob/1785627d266dc52f.

---
name: legal-builder-hub-auto-updater
description: >
  检查已安装 skill 的更新:GitHub 用 commit SHA + diff;法律元力 工具包用 catalog 的 sha256/etag,
  站内 skill 用详情 version/updated;均需显式批准。见 references/yuanli-api.md。
argument-hint: "[--apply 应用指定更新 | --rollback 回滚 | 默认仅通知]"
---

# legal-builder-hub-auto-updater

> **对用户输出一律简体中文。** skills-qa 结论档:**可安装 / 有顾虑 / 重大顾虑 / 拒绝安装**。

1. 读取 `$LEGAL_AGENT_PROFILE_HOME/legal-builder-hub/profile.md` → 已安装列表、更新偏好。
2. 读取 `install-log.yaml` 中每条记录的 `source`、`sha256`/`etag`/`version`。
3. 按来源检查更新(见下)。
4. **禁止**未阅读 diff 且未获用户明确批准即覆盖文件。

---

## 目的

社区 skill 会演进。本 skill 发现变更、展示 diff,**仅在用户明确批准后**应用。无「静默自动升级」模式。

## 信任姿态

已安装 skill 在特权法律环境中运行。上游可被篡改、易主或改变行为。**设计原则:每次更新都必须有人读过 diff 并输入批准。**

## 流程

### Step 1:检查每条已安装记录

**GitHub 来源:**

- 拉取 registry 上**当前 commit SHA**(不用 tag/branch head——可被改写)
- 与 install-log 中钉扎 SHA 对比;不同 → 有更新

**法律元力 工具包(`source: yuanli`, `type: toolkit`):** `{BASE}` 默认 `https://yuanli.ailaw.cn`。

1. `GET {BASE}/api/toolkits/catalog`,找 `toolkits[].id`
2. 对比 install-log 的 `sha256` 或 `etag`;变化 → 有更新
3. 展示 `version`、`size_bytes`、`published_at`;**不**自动下载
4. 用户批准后:`GET {BASE}/api/toolkits/{id}/download`(可用 `If-None-Match`)→ 解压 → `python3 install.py`(installer 自动检测平台,必要时加 `--target <path>`)
5. 无 API:对比 `yuanli-toolkits.yaml` 或提示用户下载新 zip

**法律元力 站内 skill(`type: skill`):**

- `GET {BASE}/api/skills/{skill_id}`,对比 `version` / `updated`
- 有变 → `GET .../download` 替换目录(见 yuanli-api.md §2.3)

### Step 2:Diff 与信任检查(GitHub / 可 diff 的更新)

展示完整 unified diff,含:

- `SKILL.md`
- `hooks/hooks.json`(**重点**:可执行任意命令)
- `.mcp.json`(**重点**:MCP 凭你的环境运行)
- `allowed-tools` / `tools` frontmatter 扩大
- 新增外连 URL、skill 目录外写路径、`description` 目的变更

### Step 2.5:对新版本重跑 skills-qa(GlassWorm 门)

v1.0 干净、v1.1 投毒是已知模式。**应用前**对**新版本**跑完整 `legal-builder-hub-skills-qa`:

1. **回归即默认拒绝:** 新版本在 Step 1.5 任一类出现旧版没有的 finding → 默认拒绝更新
2. **安全审查维度变更须人工:** hooks / MCP / 工具权限 / 外连 / 目录外写 / description 变更 → 强制人工批准,不能因扫描「干净」跳过
3. **只读子 agent 扫描**(可用时):Read + WebFetch + Glob,无 Write/Bash
4. **拒绝安装**(窃密、改环境等)→ 不提供「仍要应用」;仅 `--rollback` 或卸载

### Step 2.6:时效(freshness)

从 **install-log**(非 live frontmatter——防篡改)读 `last_verified`、`freshness_window`、`freshness_category`。

有效窗口 = `min(作者 window, profile ## Freshness reminders 中用户阈值)`。

- 窗口已过且无新 commit → 提示用户自行核验 `verified_against` 或禁用
- 窗口已过且有新 commit → 仍须 diff + QA;若新版本 `last_verified` 未推进 → 显著标注「本次提交未重新核验捆绑法条」

### Step 3:按偏好处理

| 偏好 | 行为 |
|------|------|
| notify(默认) | 展示 diff +「是否应用?[y/n]」 |
| manual | 仅列出有更新的项;用户自行 `--apply <skill>` |

### Step 4:应用(用户批准后)

- 备份旧版到 `$LEGAL_AGENT_PROFILE_HOME/legal-builder-hub/backups/<skill>-<old-sha>/`
- 覆盖文件;更新 profile 与 install-log(新 SHA / sha256 / version)
- 法律元力 包:按 skill-installer 的 zip 流程

## 回滚

`legal-builder-hub-auto-updater --rollback <skill>` 从 backup 恢复。

## 禁止

- 自动应用更新(ever)
- 更新非 hub install-log 记录的 skill
- 信任 tag/分支;GitHub 仅钉 SHA