raj200501/ai-studio-shipcheck
GitHub: raj200501/ai-studio-shipcheck
ShipCheck 是一款 Gemini / AI Studio 应用的本地静态预检工具,在分享或部署前扫描仓库和 ZIP 导出文件并生成带证据和修复建议的就绪状态报告。
Stars: 0 | Forks: 0
# AI Studio ShipCheck
适用于 Gemini / AI Studio 应用的起飞前(Preflight)验证工具,用于在分享或部署前进行检查。
ShipCheck 会扫描代码仓库或 AI Studio 风格的 ZIP 导出文件,并生成一份 `SHIP`、`CAUTION` 或 `NO_SHIP` 报告,其中包含文件/行号证据、主要风险以及建议的修复方案。
```
shipcheck demo
```
```
Target: examples/ai-studio-export-bad.zip
Status: NO_SHIP
Score: 0 / 100
Findings: 4 high, 7 medium, 1 low
Top risks
1. Gemini API key is exposed in browser code.
2. Destructive tool can execute without approval.
3. App claims verified answers without grounding evidence.
```
## 概念验证
| 信号 | 签入的证据 |
| --- | --- |
| 静态检查 | 包含 12 条确定性规则,涵盖 secrets、Gemini 集成、tools、grounding、结构化输出、测试、traces、声明以及 prompt 边界。 |
| 固定测试数据 (Fixtures) | 包含错误/修复后的支持应用、错误/修复后的 AI Studio 风格导出文件、4 个 ZIP fixtures 以及 8 个对抗性测试用例。 |
| 报告产物 | 位于 `reports/` 目录下的 HTML、Markdown 和 JSON 报告,以及位于 `schemas/` 目录下的 JSON schema。 |
| 测试覆盖面 | 收集了 40 个 pytest 测试用例,并在 Python 3.10、3.11 和 3.12 上运行 CI。 |
| 离线运行 | `shipcheck demo` 可在没有 Gemini API key 的情况下执行扫描和报告生成。 |
## 检查内容
ShipCheck 侧重于在本地源码、文档、fixtures 和 ZIP 导出文件中可见的就绪状态信号。
| 规则 | 检查项 | 严重程度 |
| --- | --- | --- |
| SC001 | 客户端 Gemini API key 泄露 | 高 |
| SC002 | 浏览器直接调用 Gemini API | 中 |
| SC003 | 缺少环境变量模板 | 中 |
| SC004 | 具有破坏性的 tool 缺少审批边界 | 高 |
| SC005 | 权限过大的数据访问 tool | 中 |
| SC006 | 不支持的 grounding / 验证声明 | 高 |
| SC007 | 脆弱的结构化输出解析 | 中 |
| SC008 | Gemini API 调用缺少错误处理 | 中 |
| SC009 | 没有针对主要 AI 工作流的冒烟测试 | 中 |
| SC010 | Agentic flow 缺少 trace/日志产物 | 中 |
| SC011 | README 或 UI 过度夸大功能 | 低 |
| SC012 | 针对外部内容缺少 prompt injection 边界 | 高 |
每项发现都包含规则 ID、严重程度、可用时的路径和行号、证据片段、与 Gemini 相关的说明以及建议的修复方案。
## 产生背景
AI Studio 和 Gemini 让从创意到应用的转变变得非常迅速。这种速度在分享之前增加了一个实际的审查步骤:检查是否存在暴露的 key、危险的 tool 流程、不受支持的声明、脆弱的模型输出解析、缺失的 traces 以及缺失的冒烟测试。
ShipCheck 是有意设计为本地和静态的。它的目的是让接下来的几项修复工作变得显而易见,而不是充当托管的 dashboard 或一种保证。
## 小型 Gemini 构建者信任循环的一部分
- **ShipCheck** 会问:“我现在应该分享或部署这个 Gemini 应用了吗?”
- **Flight Recorder** 会问:“这次 Gemini 运行为什么失败,我能把它变成一个回归测试吗?”
- **Interactions Doctor** 会问:“这个 Gemini 应用测试框架是否正确接入了状态、tools、测试、traces 和迭代?”
这些工具是独立的本地实用程序,但关注的问题是相关的。这不是一家公司、一个平台,也不宣称与 Google 有官方关联。
## 可信度与局限性
ShipCheck 仅检查公开/本地产物:仓库文件、导出的 ZIP 文件、文档、示例、测试、schema 和报告 fixtures。它不会调用 Gemini、检查已部署的基础设施、执行不受信任的应用代码、读取 AI Studio 的私有内部数据,也不会验证事实质量。
当故意记录危险示例时、当审批或 grounding 是通过共享 helper 实现时,或者当服务端代码被放置在类似前端的文件夹中时,可能会出现误报。当 Gemini 调用、审批检查或证据路径隐藏在封装器、生成代码、远程配置或运行时行为之后时,可能会出现漏报。
请将输出结果作为分享或部署前的一项重点关注检查清单。它不能替代安全审查、产品审查、evals、observability 或特定所有权相关的发布标准。
## 安装
```
git clone https://github.com/raj200501/ai-studio-shipcheck.git
cd ai-studio-shipcheck
python -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"
```
Demo 和测试不需要 Gemini API key。如果存在 `GEMINI_API_KEY`,`shipcheck doctor` 会报告其存在,但不会将其打印出来。
## 用法
```
shipcheck scan ./examples/bad-support-agent
shipcheck scan ./examples/bad-support-agent --out ./reports/bad --html
shipcheck scan ./examples/ai-studio-export-bad.zip --out ./reports/zip-bad --html
shipcheck scan ./examples/bad-support-agent --format json
shipcheck scan ./examples/bad-support-agent --format markdown
shipcheck scan ./examples/bad-support-agent --strict
shipcheck rules
shipcheck doctor
shipcheck version
```
`--out` 会写入 `report.html`、`report.md` 和 `report.json`。正常的扫描在工具成功运行时会返回退出状态码 `0`,即使存在检查结果也是如此。在 CI 中使用 `--strict`,以便在出现 `NO_SHIP` 时以非零状态码退出。
ZIP 扫描是一等公民行为。ShipCheck 会将 ZIP 输入文件安全地解压到临时目录中,拒绝路径遍历条目,扫描解压后的内容,并在报告中保留原始 ZIP 路径。
## 开发
```
make verify
make test
make demo
make reports
```
CI 会在 Python 3.10、3.11 和 3.12 上安装该包,然后运行 `make verify`。
## 文档
- [报告 schema](docs/spec.md)
- [失败模式](docs/failure_modes.md)
- [评估说明](docs/evaluation.md)
- [套件定位](docs/suite.md)
- [schemas/](schemas/) 目录下的机器可读 schema
## 免责声明
ShipCheck 是一个独立的本地开发者工具。它不隶属于 Google,也不受 Google 认可或赞助。它不保证安全性、正确性、事实性、合规性、策略一致性或部署就绪状态。
标签:DLL 劫持, 云安全监控, 代码审查, 大语言模型, 安全规则引擎, 文档结构分析, 逆向工具, 静态分析