Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,15 @@ review contract is .greptile/rules.md. 质量与安全项来自 README 审查标
changed; the new SemVer is greater than the version on `main`.
每个打包内容发生变化的插件都已 bump `ghost.json` 的 `version`,且新 SemVer
大于 `main` 上的当前版本。
- [ ] If `minCindyVersion` was added or raised, installed the packaged `.cindy`
on that exact Cindy version and recorded the result below. Lowering or
removing it is explicitly called out for maintainer review.
如新增或提高 `minCindyVersion`,已在该精确 Cindy 版本安装真实包并在下方记录;
如降低或删除,已明确标注交维护者人工 review。
- [ ] **Production Cindy verification / 生产版 Cindy 验证** — Installed every
changed plugin's packaged `.cindy` on a real device running a stable
production Cindy build and verified its core functionality. When a plugin
declares `minCindyVersion`, the verified Cindy version was greater than or
equal to it. 已在运行正式稳定版 Cindy 的实际设备上安装每个改动插件的真实
`.cindy` 包并验证核心功能;插件声明 `minCindyVersion` 时,验证所用 Cindy
版本不低于该最低版本。
- [ ] Lowering or removing `minCindyVersion` is explicitly called out for
maintainer review. 降低或删除 `minCindyVersion` 已明确标注交维护者人工 review。
- [ ] For a new plugin, linked the acknowledged proposal issue and recorded the
`provisioning.json` audience decision below.
新插件已关联维护者确认过的提案 issue,并在下方记录 audience 决策。
Expand All @@ -71,10 +75,7 @@ Agent behaviour — that description is the manual the Agent reads.
## Verification / 验证

<!--
Commands actually run and their results. If minCindyVersion was added/raised,
include the exact Cindy version, packaged .cindy install result, and core tools
verified. / 实际执行的命令和结果;如新增/提高 minCindyVersion,写明精确 Cindy
版本、真实 .cindy 安装结果和已验证的核心工具。
Commands actually run and their results. / 实际执行的命令和结果。
-->

## Sensitive changes / 敏感变更
Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/pr-verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ on:
- synchronize
- reopened
- ready_for_review
- edited
branches:
- main

Expand Down Expand Up @@ -140,3 +141,14 @@ jobs:
done
echo "::endgroup::"
done

- name: Require production Cindy verification attestation
if: ${{ steps.changes.outputs.plugins != '[]' }}
run: |
set -euo pipefail
pr_body="$(jq -r '.pull_request.body // ""' "${GITHUB_EVENT_PATH}")"
if ! grep -Eq '^- \[[xX]\] \*\*Production Cindy verification / 生产版 Cindy 验证\*\*' \
<<<"${pr_body}"; then
echo "::error::Check the Production Cindy verification / 生产版 Cindy 验证 box in the PR body after installing and exercising every changed plugin on a real device with a stable production Cindy build. If a plugin declares minCindyVersion, the verified Cindy version must be greater than or equal to it."
exit 1
fi
8 changes: 4 additions & 4 deletions .greptile/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
"includeConfidenceScore": true,
"shouldUpdateDescription": false,
"ignorePatterns": "**/.DS_Store\n**/THIRD-PARTY-LICENSES.txt",
"instructions": "这是 Cindy 官方插件仓:每个合入 main 的插件都会自动提交到 CN/Global 的 Plugin Platform 审核队列,批准后才对对应区域用户可见;安全与体验风险由真实用户承担,审查标准从严。审查依据按优先级:本目录 rules.md 的完整规则 > README.md 设计原则 > 一般工程判断。对安全类规则(凭证、网络边界、子进程、vendor):结论必须给出核查证据(查了哪些文件、grep 了什么、结果如何),不允许只写『未发现问题』。summary 首行必须显式列出所有未解决的 P1(如有),不要让『可安全合并』的措辞掩盖挂起的阻断项。以下变更属于敏感审查路由:新增插件目录;删除/重命名已有插件目录或修改已发布 id;新增、升级或删除第三方依赖及 vendor/dist/worker 生成物;新增/替换无法由文本 review 验证内容的图片、二进制文件或可执行资源;扩大 OAuth/API scope;修改凭证注入、认证或授权边界;新增 network.hosts、secret、slot、tool、Node 或子进程能力;降低或删除 minCindyVersion;放宽 provisioning audience;修改发布 workflow、OIDC、权限或 secrets;修改 .greptile/ 或 AGENTS.md 审查策略。仅修改版本号或 name/description/author/icon 路径等纯展示文本元数据不属于敏感变更。命中敏感审查路由时必须将 PR 风险标为 high 或 critical,使 riskCeiling 阻止自动 approve,并在 summary 首行标注『敏感变更,需要维护者人工 review』;审查路由本身不是实现缺陷,如果没有发现真实代码问题,不得仅因需要人工 review 而生成 P1/行级评论、降低 confidence score 或使 status check 失败。评论语言跟随 PR 作者的主语言:根据 PR 描述、commit message 与作者历史评论判断——中文作者用简体中文回复,英文作者用英文回复,其他语言作者用英文;无法判断时用英文。规则条文本身是中文不代表必须用中文回复。",
"instructions": "这是 Cindy 官方插件仓:每个合入 main 的插件都会自动提交到 CN/Global 的 Plugin Platform 审核队列,批准后才对对应区域用户可见;安全与体验风险由真实用户承担,审查标准从严。审查依据按优先级:本目录 rules.md 的完整规则 > README.md 设计原则 > 一般工程判断。对安全类规则(凭证、网络边界、子进程、vendor):结论必须给出核查证据(查了哪些文件、grep 了什么、结果如何),不允许只写『未发现问题』。summary 首行必须显式列出所有未解决的 P1(如有),不要让『可安全合并』的措辞掩盖挂起的阻断项。以下变更属于敏感审查路由:新增插件目录;删除/重命名已有插件目录或修改已发布 id;新增、升级或删除第三方依赖及 vendor/dist/worker 生成物;新增/替换无法由文本 review 验证内容的图片、二进制文件或可执行资源;扩大 OAuth/API scope;修改凭证注入、认证或授权边界;新增 network.hosts、secret、直接能力字段、tool、Node 或子进程能力;降低或删除 minCindyVersion;放宽 provisioning audience;修改发布 workflow、OIDC、权限或 secrets;修改 .greptile/ 或 AGENTS.md 审查策略。仅修改版本号或 name/description/author/icon 路径等纯展示文本元数据不属于敏感变更。命中敏感审查路由时必须将 PR 风险标为 high 或 critical,使 riskCeiling 阻止自动 approve,并在 summary 首行标注『敏感变更,需要维护者人工 review』;审查路由本身不是实现缺陷,如果没有发现真实代码问题,不得仅因需要人工 review 而生成 P1/行级评论、降低 confidence score 或使 status check 失败。评论语言跟随 PR 作者的主语言:根据 PR 描述、commit message 与作者历史评论判断——中文作者用简体中文回复,英文作者用英文回复,其他语言作者用英文;无法判断时用英文。规则条文本身是中文不代表必须用中文回复。",
"rules": [
{
"id": "no-hardcoded-secrets",
Expand All @@ -69,12 +69,12 @@
{
"id": "network-allowlist",
"severity": "high",
"rule": "main.js/settings.js/worker 中所有网络访问目标必须命中该插件 ghost.json 的 network.hosts 白名单。发现未声明的域名/IP、硬编码内网或调试地址(localhost/127.x/192.168.x/10.x)、或绕过 cindy.fetch 的直连(原生 fetch 到外部域名/XMLHttpRequest/WebSocket/EventSource)必须按 P1 指出。白名单本身新增条目时,必须能在 PR 描述或源码中找到必要性出处。例外:声明了 node slot 的插件,其 node/worker.cjs 的网络访问按 node 能力边界审查(固定 IMAP/SMTP/API 端点),不适用 network.hosts 白名单要求;此类审查参照 capability-minimization 规则。"
"rule": "插件自主联网(Panel/订阅/scheduler/常驻进程等脱离当前 Agent 调用的场景)的所有目标必须命中 ghost.json 的 network.hosts 白名单。当前 Agent 工具调用内的普通 HTTPS 可以经 cindy.fetch 携带 Host 下发且严格在途的 callId 复用 Agent 授权,review 不得因未声明该域名误报;此途径不得注入未在 manifest 声明并命中目标 host 的托管凭证。发现硬编码内网或调试地址(localhost/127.x/192.168.x/10.x)、或绕过 cindy.fetch 的直连(原生 fetch/XMLHttpRequest/WebSocket/EventSource)必须按 P1 指出。自主白名单新增条目时,必须能在 PR 描述或源码中找到必要性出处。例外:声明顶层 node 字段的插件,其 node/worker.cjs 网络按 node 自主能力边界审查(固定 IMAP/SMTP/API 端点)。"
},
{
"id": "capability-minimization",
"severity": "high",
"rule": "ghost.json 变更时:slots/node/network.hosts 只能最小化声明,新增任何能力(新 slot、新域名、新 secret、新 tool)必须在 PR 描述中有对应必要性说明。声明 node slot 的插件必须固定 entry/entries 入口;childSpawn 产生的子进程边界必须最小——固定命令、参数不可注入外部输入。任何 spawn/exec 调用路径的变更(包括从受控封装改回原生 spawn)都必须分析新的参数注入面并在评论中给出结论。"
"rule": "ghost.json 变更时:所有直接能力字段、node/network.hosts 只能最小化声明,新增任何能力(新顶层能力字段、新域名、新 secret、新 tool)必须在 PR 描述中有对应必要性说明。声明 node 的插件必须固定 entry/entries 入口;childSpawn 产生的子进程边界必须最小——固定命令、参数不可注入外部输入。任何 spawn/exec 调用路径的变更(包括从受控封装改回原生 spawn)都必须分析新的参数注入面并在评论中给出结论。新插件和实际打包内容有变化的现有插件必须使用 schemaVersion 3、填写不低于 0.1.61 的 minCindyVersion、移除 slots;未触及的 v2 插件不得被要求批量迁移。"
},
{
"id": "irreversible-side-effect-tri-state",
Expand Down Expand Up @@ -115,7 +115,7 @@
{
"id": "minimum-client-version-evidence",
"severity": "high",
"rule": "新增或提高 minCindyVersion 时,PR Verification 必须记录真实打包 .cindy 在声明的精确最低 Cindy 版本上安装成功,并列出实际验证的核心功能;缺失证据按 P1 要求补齐。降低或删除 minCindyVersion 会扩大支持范围,必须转维护者人工 review,不能只凭静态 CI 放行。"
"rule": "每个改动插件包的 PR Body 都必须勾选生产版 Cindy 验证项,确认真实打包 .cindy 已在运行正式稳定版 Cindy 的实际设备上安装并验证核心功能;CI 会确定性检查该勾选项。插件声明 minCindyVersion 时,验证所用 Cindy 版本必须不低于它。降低或删除 minCindyVersion 会扩大支持范围,必须转维护者人工 review,不能只凭静态 CI 放行。"
}
]
}
31 changes: 26 additions & 5 deletions .greptile/rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,15 @@

## 设计契约

### 授权跟随执行者

当前 Agent 工具调用内的普通 HTTPS 与 workdir 文件操作,使用 Host 下发且严格在途的
`callId` 复用 Cindy 既有 Agent 授权;CLI 继续走已有 Node 工作进程,工具是否执行由
当前 `ghost_call` 的既有 Agent 授权决定。不得仅为了预登记具体命令、域名或路径新增
Slot 或 Manifest 字段。只有 Panel、订阅、scheduler、常驻进程等脱离当前 Agent 调用的
自主 Host 能力,才必须在 `ghost.json` 直接声明;自主 Node Runtime 仍须声明顶层
`node`、固定入口和最小子进程边界。Host 托管凭证也仍须按声明守门。

### tool description 即契约

`ghost.json` 里每个 tool 的 `description` 与顶层 `whenToUse` 是 Agent 读到的唯一
Expand Down Expand Up @@ -82,13 +91,19 @@ manifest/icon/locale/Skill/Manual 单文件上限、安全路径、大小写路
`x-manager`);携带 Manual 的插件必须声明 `minCindyVersion`。不要用 Greptile 对
manifest schema 的猜测替代 CI 的确定性校验结果。

`.tests/plugin-contract.test.mjs` 同时接受未改动的 legacy v2 与合法 v3;但新插件,
以及实际打包内容发生变化的现有插件,必须在同一 PR 迁移到 `schemaVersion: 3`、
填写不低于 `0.1.61` 的 `minCindyVersion`、移除 `slots` 并保持直接能力声明等价。
只改仓库级文档、CI 或其它插件时,不得要求顺手迁移无关的 v2 清单。

### 最低客户端版本

`minCindyVersion` 表示这个 release 能被安装和运行的最低 Cindy 版本。新增或提高
该字段时,PR 描述必须记录真实打包 `.cindy` 在声明的精确版本上安装成功,并列出实际
验证的核心功能;没有证据按 P1 要求补齐。降低或删除该字段会扩大支持范围,静态 CI
无法证明旧客户端可用,必须转维护者人工 review。未声明字段的旧插件继续按现有兼容
语义处理,不要求为了补字段而批量修改。
每个改动插件包的 PR Body 都必须勾选生产版 Cindy 验证项,确认真实打包 `.cindy` 已在
运行正式稳定版 Cindy 的实际设备上安装并验证核心功能;CI 会确定性检查该勾选项。
`minCindyVersion` 表示这个 release 能被安装和运行的最低 Cindy 版本,插件声明该字段
时,验证所用 Cindy 版本必须不低于它。降低或删除该字段会扩大支持范围,静态 CI 无法
证明旧客户端可用,必须转维护者人工 review。未声明字段的旧插件继续按现有兼容语义
处理,不要求为了补字段而批量修改。

### 发布与审核链路

Expand Down Expand Up @@ -120,6 +135,8 @@ PR 新增插件目录(出现新的 `ghost.json`)时,必须通读仓内现

新插件 PR 缺以下任何一项时逐条指出:

- `ghost.json` 使用 `schemaVersion: 3`、填写 `minCindyVersion`(不得低于 `0.1.61`)、
不含 `slots`,并以直接顶层字段声明能力;
- `provisioning.json` 有对应条目,且 audience 取值有 PR 描述里的决策依据
(尤其 `"all"`);
- 四语言 locale 资源齐全(zh-CN/en/ja/ko,`.tests/localization.test.mjs` 口径);
Expand All @@ -130,6 +147,10 @@ PR 新增插件目录(出现新的 `ghost.json`)时,必须通读仓内现
- PR 描述包含实机验证说明(在 Cindy 客户端安装 `.cindy` 包实测过哪些工具);
没有实测的必须如实标注,reviewer 应在 summary 里显式提示「未经实机验证」。

现有 v2 插件不做专项批量迁移;但 PR 一旦改变该插件目录内会进入 `.cindy` 的实际
打包内容,就必须在同一 PR 把清单迁移到 v3,并保持能力等价。只改仓库级文档、CI 或
其它插件时,不得要求顺手迁移未触及的 v2 清单。

## 其他判定口径

### 图片资源
Expand Down
Loading
Loading