# 发布与审核

## 准备认证和展示信息

使用具备 plugins:read、plugins:write、releases:write 的 PAT，并先取得管理员批准的命名空间。
创建 metadata.json，包含 display_name、summary、description，以及可空的 icon_url、docs_url、support_url。

```json
{
  "display_name": "我的插件",
  "summary": "一句话用途",
  "description": "完整说明",
  "icon_url": null,
  "docs_url": null,
  "support_url": null
}
```

## 提交平台归档

```sh
pluginctl publish --name my-team/my-plugin --metadata ./metadata.json --artifacts-dir ./artifacts --journal ./publish-1.0.0.json --endpoint https://market.example/v1/graphql --json
```

首次创建展示草稿，并与首个版本一起提交一次审核；已有名称必须属于你当前有权管理的插件。
artifacts-dir 放置 pack 生成的 tar.gz 与 .pack.json。使用 source-url 时与 artifacts-dir 互斥，并明确 version 和 family。
publish 本地预检名称和字节，稳定记录 command ID，然后上传并等待校验达到 pending_review。

## 等待明确审核

```sh
pluginctl status --name my-team/my-plugin --endpoint https://market.example/v1/graphql --json
```

临时上传和候选材料保留 7 天，校验、审核与重试不会延期。上传 URL 有效期为 15 分钟；
材料过期后使用新的上传和候选重提未发布版本。

pending_review 和 publishing 都不是 published。管理员在审核队列核对 listing 与精确 release，并明确批准或拒绝。
最终鉴权并提交持久发布承诺后，系统写公开字节、snapshot与HTML，再独立确认两channel。
承诺前失权会拒绝候选；承诺后的ownership变化不取消原授权发布。后续版本不改变展示可见性。
通用 publish 不自行审批，即使调用者是管理员。

## 确认真实交付

使用distribution地址和authority UUID匿名show；按平台download并校验SHA-256/大小。
只取得 accepted receipt 或看到上传成功都不能证明审核通过或可下载。

```sh
pluginctl publication-status --command-id <original-command-uuid> --endpoint https://market.example/v1/graphql --json
```

结果区分stable/preview和HTML进度。failed/unknown由管理员按当前revision显式恢复原publication：

```sh
pluginctl publication-recover --publication-id <publication-uuid> --revision <current-revision> --command-id <recovery-command-uuid> --endpoint https://market.example/v1/graphql --json
```

保留原publication和原发布命令，不重传或换版本制造第二次发布。恢复命令applied只证明已重新排队。
