greenbump 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/README.zh-CN.md +213 -0
  4. package/action-dist/index.cjs +19695 -0
  5. package/action.yml +76 -0
  6. package/dist/action/github.js +70 -0
  7. package/dist/action/github.js.map +1 -0
  8. package/dist/action/main.js +99 -0
  9. package/dist/action/main.js.map +1 -0
  10. package/dist/agent/factory.js +72 -0
  11. package/dist/agent/factory.js.map +1 -0
  12. package/dist/agent/fixer.js +307 -0
  13. package/dist/agent/fixer.js.map +1 -0
  14. package/dist/agent/fixer.test.js +224 -0
  15. package/dist/agent/fixer.test.js.map +1 -0
  16. package/dist/agent/provider-anthropic.js +59 -0
  17. package/dist/agent/provider-anthropic.js.map +1 -0
  18. package/dist/agent/provider-openai.js +65 -0
  19. package/dist/agent/provider-openai.js.map +1 -0
  20. package/dist/agent/provider.js +4 -0
  21. package/dist/agent/provider.js.map +1 -0
  22. package/dist/cli.js +138 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/engine/batch.js +246 -0
  25. package/dist/engine/batch.js.map +1 -0
  26. package/dist/engine/batch.test.js +59 -0
  27. package/dist/engine/batch.test.js.map +1 -0
  28. package/dist/engine/changelog.js +66 -0
  29. package/dist/engine/changelog.js.map +1 -0
  30. package/dist/engine/checks.js +41 -0
  31. package/dist/engine/checks.js.map +1 -0
  32. package/dist/engine/checks.test.js +92 -0
  33. package/dist/engine/checks.test.js.map +1 -0
  34. package/dist/engine/detect.js +5 -0
  35. package/dist/engine/detect.js.map +1 -0
  36. package/dist/engine/ecosystems/bundler.js +59 -0
  37. package/dist/engine/ecosystems/bundler.js.map +1 -0
  38. package/dist/engine/ecosystems/cargo.js +83 -0
  39. package/dist/engine/ecosystems/cargo.js.map +1 -0
  40. package/dist/engine/ecosystems/cocoapods.js +47 -0
  41. package/dist/engine/ecosystems/cocoapods.js.map +1 -0
  42. package/dist/engine/ecosystems/composer.js +32 -0
  43. package/dist/engine/ecosystems/composer.js.map +1 -0
  44. package/dist/engine/ecosystems/conan.js +106 -0
  45. package/dist/engine/ecosystems/conan.js.map +1 -0
  46. package/dist/engine/ecosystems/elm.js +77 -0
  47. package/dist/engine/ecosystems/elm.js.map +1 -0
  48. package/dist/engine/ecosystems/go.js +72 -0
  49. package/dist/engine/ecosystems/go.js.map +1 -0
  50. package/dist/engine/ecosystems/gradle.js +90 -0
  51. package/dist/engine/ecosystems/gradle.js.map +1 -0
  52. package/dist/engine/ecosystems/index.js +67 -0
  53. package/dist/engine/ecosystems/index.js.map +1 -0
  54. package/dist/engine/ecosystems/maven.js +77 -0
  55. package/dist/engine/ecosystems/maven.js.map +1 -0
  56. package/dist/engine/ecosystems/mix.js +64 -0
  57. package/dist/engine/ecosystems/mix.js.map +1 -0
  58. package/dist/engine/ecosystems/npm.js +47 -0
  59. package/dist/engine/ecosystems/npm.js.map +1 -0
  60. package/dist/engine/ecosystems/nuget.js +50 -0
  61. package/dist/engine/ecosystems/nuget.js.map +1 -0
  62. package/dist/engine/ecosystems/parsers.test.js +255 -0
  63. package/dist/engine/ecosystems/parsers.test.js.map +1 -0
  64. package/dist/engine/ecosystems/pip.js +61 -0
  65. package/dist/engine/ecosystems/pip.js.map +1 -0
  66. package/dist/engine/ecosystems/pipenv.js +37 -0
  67. package/dist/engine/ecosystems/pipenv.js.map +1 -0
  68. package/dist/engine/ecosystems/pnpm.js +48 -0
  69. package/dist/engine/ecosystems/pnpm.js.map +1 -0
  70. package/dist/engine/ecosystems/poetry.js +42 -0
  71. package/dist/engine/ecosystems/poetry.js.map +1 -0
  72. package/dist/engine/ecosystems/pub.js +32 -0
  73. package/dist/engine/ecosystems/pub.js.map +1 -0
  74. package/dist/engine/ecosystems/python-shared.js +29 -0
  75. package/dist/engine/ecosystems/python-shared.js.map +1 -0
  76. package/dist/engine/ecosystems/swiftpm.js +102 -0
  77. package/dist/engine/ecosystems/swiftpm.js.map +1 -0
  78. package/dist/engine/ecosystems/types.js +19 -0
  79. package/dist/engine/ecosystems/types.js.map +1 -0
  80. package/dist/engine/ecosystems/uv.js +36 -0
  81. package/dist/engine/ecosystems/uv.js.map +1 -0
  82. package/dist/engine/ecosystems/yarn.js +62 -0
  83. package/dist/engine/ecosystems/yarn.js.map +1 -0
  84. package/dist/engine/exec.js +47 -0
  85. package/dist/engine/exec.js.map +1 -0
  86. package/dist/engine/git.js +42 -0
  87. package/dist/engine/git.js.map +1 -0
  88. package/dist/engine/git.test.js +111 -0
  89. package/dist/engine/git.test.js.map +1 -0
  90. package/dist/engine/pm.js +14 -0
  91. package/dist/engine/pm.js.map +1 -0
  92. package/dist/engine/run.js +167 -0
  93. package/dist/engine/run.js.map +1 -0
  94. package/dist/engine/run.test.js +47 -0
  95. package/dist/engine/run.test.js.map +1 -0
  96. package/dist/engine/upgrade.js +10 -0
  97. package/dist/engine/upgrade.js.map +1 -0
  98. package/dist/engine/workspace.js +155 -0
  99. package/dist/engine/workspace.js.map +1 -0
  100. package/dist/engine/workspace.test.js +95 -0
  101. package/dist/engine/workspace.test.js.map +1 -0
  102. package/dist/exitcode.js +51 -0
  103. package/dist/exitcode.js.map +1 -0
  104. package/dist/exitcode.test.js +62 -0
  105. package/dist/exitcode.test.js.map +1 -0
  106. package/dist/format.js +101 -0
  107. package/dist/format.js.map +1 -0
  108. package/dist/pr.js +63 -0
  109. package/dist/pr.js.map +1 -0
  110. package/dist/report.js +13 -0
  111. package/dist/report.js.map +1 -0
  112. package/dist/report.test.js +56 -0
  113. package/dist/report.test.js.map +1 -0
  114. package/dist/test-utils.js +36 -0
  115. package/dist/test-utils.js.map +1 -0
  116. package/package.json +56 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 greenbump contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,125 @@
1
+ # 🌱 greenbump
2
+
3
+ **The Renovate that actually fixes your code.**
4
+
5
+ Dependabot and Renovate bump your version numbers — then hand you a red PR and walk away. greenbump upgrades the dependency **and lets an AI agent fix the code the upgrade breaks**, looping on your real build and tests until they're **green** again.
6
+
7
+ ```bash
8
+ npx greenbump react
9
+ ```
10
+
11
+ ```
12
+ 🌱 greenbump
13
+ · target: react 18.3.1 → 19.2.0
14
+ · created branch greenbump/react-19.2.0
15
+ · running baseline build + tests…
16
+ · installing react@19.2.0…
17
+ · upgrade broke test — starting AI fix loop
18
+ · round 1: read_file src/App.tsx
19
+ · round 2: write_file src/App.tsx
20
+ · round 3: run_check
21
+ · round 3: check passed — fixed
22
+
23
+ ✓ Fixed: react 18.3.1 → 19.2.0 broke the build, agent repaired 2 file(s), now green.
24
+ branch: greenbump/react-19.2.0 (committed)
25
+ tokens: 41,201 in / 3,338 out
26
+ ```
27
+
28
+ ## Why
29
+
30
+ > Every version bump is a chore that ends in the same place: something broke, and now *you* read the changelog, find the renamed export, and patch the call sites. greenbump does that part.
31
+
32
+ - **Bring your own key.** greenbump uses *your* Anthropic API key — you pay only for the tokens a fix actually costs. No server, no subscription, nothing phones home.
33
+ - **Verifies against your real suite.** It only calls a run "fixed" when *your* `build` and `test` scripts pass. No guessing.
34
+ - **Safe by default.** Works on a fresh git branch, never auto-merges, never edits your lockfile to cheat, never deletes tests to go green.
35
+ - **Bounded cost.** The fix loop is capped (`--max-rounds`) so a hard upgrade can't run away with your tokens.
36
+
37
+ ## Install / Use
38
+
39
+ ```bash
40
+ export ANTHROPIC_API_KEY=sk-ant-...
41
+
42
+ # upgrade a specific dependency to latest
43
+ npx greenbump react
44
+
45
+ # pin a target version
46
+ npx greenbump eslint --to 9.15.0
47
+
48
+ # let greenbump pick the most-outdated dependency
49
+ npx greenbump
50
+ ```
51
+
52
+ ### Options
53
+
54
+ | Flag | Description |
55
+ |---|---|
56
+ | `[dep]` | Dependency to upgrade. Omit to pick the most-outdated one. |
57
+ | `--to <version>` | Target version (default: `latest`). |
58
+ | `--ecosystem <id>` | Dependency ecosystem (`npm`, `poetry`, `cargo`, `maven`, …). Auto-detected if omitted. |
59
+ | `--list-ecosystems` | List every supported ecosystem and exit. |
60
+ | `--build-cmd <cmd>` | Override the build command, e.g. `"make build"`. |
61
+ | `--test-cmd <cmd>` | Override the test command, e.g. `"make test"`. |
62
+ | `--provider <name>` | Model provider preset (`anthropic`, `openai`, `deepseek`, `groq`, …). |
63
+ | `--model <model>` | Model id for the fix agent (default: per provider). |
64
+ | `--max-rounds <n>` | Cap fix-loop rounds / token spend (default: `15`). |
65
+ | `--no-git` | Operate in place instead of on a new branch. |
66
+ | `--pr-body` | Print a ready-to-paste PR body. |
67
+
68
+ ## Ecosystems
69
+
70
+ greenbump auto-detects the ecosystem from your project's lockfile/manifest. Run `greenbump --list-ecosystems` for the current list.
71
+
72
+ **"Verified" (self-reported, manually smoke-tested once by the maintainer, not CI-checked):** npm, Yarn, pnpm, pip, Poetry, uv, Pipenv, Cargo, Go modules, Bundler, Composer, Gradle, Maven, NuGet (.NET), Mix (Hex), Pub (Dart/Flutter), Swift Package Manager, CocoaPods, Conan (C/C++), Elm.
73
+
74
+ "Verified" here means the maintainer personally ran the detect → outdated → install → build/test chain against a real project for that ecosystem at least once — it is **not** an automated guarantee, and CI does not re-run every real toolchain on every change (that would require installing 20 separate language runtimes and package managers). The `verified` field is self-reported per adapter in [`src/engine/ecosystems/types.ts`](src/engine/ecosystems/types.ts); parser logic for each ecosystem is unit-tested (see [`parsers.test.ts`](src/engine/ecosystems/parsers.test.ts)), but the underlying CLI tools themselves are not exercised in CI.
75
+
76
+ Please [report an issue](https://github.com/shidesheng0218/greenbump/issues) if one of these doesn't work as expected on your machine — real-world edge cases (unusual manifest styles, less common CLI flags) are the best signal for tightening these adapters further.
77
+
78
+ ## GitHub Action
79
+
80
+ Let greenbump upgrade a dependency on a schedule and open the PR for you. Add `.github/workflows/greenbump.yml`:
81
+
82
+ ```yaml
83
+ name: greenbump
84
+ on:
85
+ schedule:
86
+ - cron: "0 6 * * 1" # Mondays
87
+ workflow_dispatch:
88
+ permissions:
89
+ contents: write
90
+ pull-requests: write
91
+ jobs:
92
+ bump:
93
+ runs-on: ubuntu-latest
94
+ steps:
95
+ - uses: actions/checkout@v4
96
+ - uses: actions/setup-node@v4
97
+ with: { node-version: 20 }
98
+ - run: npm ci
99
+ - uses: shidesheng0218/greenbump@v0
100
+ with:
101
+ anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
102
+ ```
103
+
104
+ Replace `shidesheng0218/greenbump` above with wherever you publish this repo. Add your key as the `ANTHROPIC_API_KEY` repo secret. greenbump opens a normal PR when build + tests are green, or a **draft** PR (flagged for review) when it couldn't fully fix the upgrade or the repo has nothing to verify against.
105
+
106
+ > **Want CI to run on the PR?** PRs opened with the default `GITHUB_TOKEN` don't trigger other workflows (a GitHub safeguard against loops). Pass a personal access token as `github-token:` if you need your CI to fire on greenbump's PRs.
107
+
108
+ Full example with inputs: [examples/greenbump.yml](examples/greenbump.yml).
109
+
110
+ ## How it works
111
+
112
+ 1. **Detect** the ecosystem and the outdated dependency (e.g. `npm outdated`, `poetry show -o`, `cargo` vs. crates.io, …).
113
+ 2. **Isolate** on a fresh `greenbump/<dep>-<version>` branch.
114
+ 3. **Baseline** — run your build + tests. If they're already red, greenbump stops (so it never chases pre-existing failures).
115
+ 4. **Upgrade** the dependency.
116
+ 5. **Fix loop** — if the upgrade breaks anything, an AI agent reads the failure, edits the source, and re-runs your checks until they pass or the round cap is hit.
117
+ 6. **Commit** the branch and hand you a PR body.
118
+
119
+ ## Status
120
+
121
+ Early MVP, one dependency at a time. Roadmap: batch upgrades, wider provider coverage, deeper per-ecosystem verification.
122
+
123
+ ## License
124
+
125
+ MIT
@@ -0,0 +1,213 @@
1
+ # 🌱 greenbump
2
+
3
+ [English](README.md) | 简体中文
4
+
5
+ **真正能修复代码的依赖升级工具。**
6
+
7
+ Dependabot 和 Renovate 只会升级版本号,然后给你一个失败的 PR 就不管了。greenbump 不仅升级依赖,**还会让 AI 智能体修复升级导致的代码问题**,在你真实的构建和测试上循环迭代,直到**全部通过**。
8
+
9
+ ```bash
10
+ npx greenbump react
11
+ ```
12
+
13
+ ```
14
+ 🌱 greenbump
15
+ · 目标:react 18.3.1 → 19.2.0
16
+ · 创建分支 greenbump/react-19.2.0
17
+ · 运行基准构建和测试…
18
+ · 安装 react@19.2.0…
19
+ · 升级破坏了测试 — 启动 AI 修复循环
20
+ · 第 1 轮:read_file src/App.tsx
21
+ · 第 2 轮:write_file src/App.tsx
22
+ · 第 3 轮:run_check
23
+ · ✓ 所有检查通过
24
+ · 已提交修复,推送到远程
25
+ ```
26
+
27
+ ---
28
+
29
+ ## 特性
30
+
31
+ - **自动修复破坏性变更** — AI 智能体读取错误日志,编辑代码,重新运行测试,直到通过
32
+ - **支持 20+ 包管理器** — npm、yarn、pnpm、cargo、pip、poetry、go mod、maven、gradle 等
33
+ - **GitHub Actions 集成** — 在 CI 中作为 scheduled workflow 运行,自动创建 PR
34
+ - **完整可见性** — 每一轮都显示智能体调用的工具和令牌使用量
35
+ - **可配置** — 设置最大修复轮数、选择 AI 模型、限制令牌预算
36
+
37
+ ---
38
+
39
+ ## 快速开始
40
+
41
+ ### CLI 使用
42
+
43
+ ```bash
44
+ # 升级 React 到最新版本
45
+ npx greenbump react
46
+
47
+ # 升级多个依赖
48
+ npx greenbump react typescript @types/react
49
+
50
+ # 指定目标版本
51
+ npx greenbump lodash@4.17.21
52
+
53
+ # 使用不同的 AI 模型
54
+ npx greenbump --provider openai --model gpt-4o react
55
+ ```
56
+
57
+ **需要 API 密钥:**
58
+ - Anthropic(默认):`export ANTHROPIC_API_KEY=sk-ant-...`
59
+ - OpenAI:`export OPENAI_API_KEY=sk-...`
60
+
61
+ ### GitHub Actions
62
+
63
+ 创建 `.github/workflows/greenbump.yml`:
64
+
65
+ ```yaml
66
+ name: greenbump
67
+ on:
68
+ schedule:
69
+ - cron: '0 2 * * 1' # 每周一凌晨 2 点
70
+ workflow_dispatch:
71
+
72
+ jobs:
73
+ upgrade:
74
+ runs-on: ubuntu-latest
75
+ permissions:
76
+ contents: write
77
+ pull-requests: write
78
+ steps:
79
+ - uses: actions/checkout@v4
80
+ - uses: shidesheng0218/greenbump@v0
81
+ with:
82
+ packages: 'react typescript lodash'
83
+ anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
84
+ ```
85
+
86
+ 在仓库设置中添加 `ANTHROPIC_API_KEY` secret。
87
+
88
+ ---
89
+
90
+ ## 工作原理
91
+
92
+ 1. **检测生态系统** — 自动识别 package.json、Cargo.toml、go.mod 等
93
+ 2. **运行基准测试** — 在升级前运行构建和测试,确保它们通过
94
+ 3. **升级依赖** — 安装目标版本
95
+ 4. **检查是否破坏** — 重新运行测试,如果失败则启动 AI 修复循环
96
+ 5. **AI 修复循环** — 智能体可以:
97
+ - `read_file` — 读取源代码和错误日志
98
+ - `write_file` — 编辑代码文件
99
+ - `run_check` — 重新运行构建和测试
100
+ - 循环直到所有检查通过或达到最大轮数
101
+ 6. **提交并推送** — 创建描述性提交信息和 PR 正文
102
+
103
+ ---
104
+
105
+ ## CLI 选项
106
+
107
+ ```
108
+ npx greenbump [选项] <包名...>
109
+
110
+ 选项:
111
+ --provider <名称> AI 提供商:anthropic | openai(默认:anthropic)
112
+ --model <名称> 模型名称(默认:claude-3-7-sonnet-20250219)
113
+ --max-rounds <数字> 每个包的最大修复轮数(默认:15)
114
+ --max-total-tokens <数字> 令牌预算限制(可选)
115
+ --no-push 本地提交但不推送到远程
116
+ --help 显示帮助信息
117
+ ```
118
+
119
+ ---
120
+
121
+ ## 支持的包管理器
122
+
123
+ | 生态系统 | 清单文件 | 安装命令 |
124
+ |---------|---------|---------|
125
+ | **JavaScript** | package.json | npm/yarn/pnpm/bun |
126
+ | **Python** | requirements.txt, pyproject.toml | pip/poetry/pipenv/uv |
127
+ | **Rust** | Cargo.toml | cargo |
128
+ | **Go** | go.mod | go get |
129
+ | **Java** | pom.xml, build.gradle | mvn/gradle |
130
+ | **Ruby** | Gemfile | bundler |
131
+ | **PHP** | composer.json | composer |
132
+ | **Dart** | pubspec.yaml | pub/flutter |
133
+ | **Swift** | Package.swift | swift |
134
+ | **Elixir** | mix.exs | mix |
135
+ | **Elm** | elm.json | elm |
136
+ | **C#** | *.csproj | dotnet |
137
+ | **C++** | conanfile.txt | conan |
138
+ | **iOS** | Podfile | pod |
139
+
140
+ 每个适配器实现:
141
+ - `detect()` — 查找清单文件
142
+ - `outdated()` — 检查可用更新
143
+ - `install()` — 安装特定版本
144
+
145
+ ---
146
+
147
+ ## 贡献
148
+
149
+ 欢迎提交 Issue 和 Pull Request!
150
+
151
+ 查看 [CONTRIBUTING.md](CONTRIBUTING.md) 了解:
152
+ - 如何设置开发环境
153
+ - 如何添加新的包管理器支持
154
+ - 代码风格指南
155
+ - 如何运行测试
156
+
157
+ ---
158
+
159
+ ## 安全
160
+
161
+ 如果你发现安全漏洞,请查看 [SECURITY.md](SECURITY.md) 了解如何负责任地报告。
162
+
163
+ **关键安全边界:**
164
+ - AI 智能体只能访问项目目录内的文件(路径遍历保护)
165
+ - 所有文件操作都经过 `safePath()` 验证
166
+ - 智能体不能执行任意 shell 命令
167
+ - 发送给 AI 提供商的数据:错误日志、差异、文件内容(不包含 secrets)
168
+
169
+ ---
170
+
171
+ ## 许可证
172
+
173
+ MIT License — 详见 [LICENSE](LICENSE)
174
+
175
+ ---
176
+
177
+ ## 常见问题
178
+
179
+ **Q: greenbump 和 Renovate/Dependabot 有什么区别?**
180
+
181
+ A: Renovate 和 Dependabot 只升级版本号。如果升级破坏了代码(例如 API 变更),它们会创建一个失败的 PR,由你来修复。greenbump 使用 AI 智能体自动修复破坏性变更,循环运行测试直到通过。
182
+
183
+ **Q: AI 修复需要多长时间?**
184
+
185
+ A: 取决于破坏的复杂度。简单的 API 重命名通常 1-2 轮(30-60 秒)。复杂的架构变更可能需要 5-10 轮(2-5 分钟)。你可以用 `--max-rounds` 限制。
186
+
187
+ **Q: 费用是多少?**
188
+
189
+ A: 使用你自己的 API 密钥,按 AI 提供商的定价付费。典型的修复消耗 10k-50k tokens(Claude Sonnet 约 $0.15-$0.75)。可以用 `--max-total-tokens` 设置预算上限。
190
+
191
+ **Q: 支持私有包吗?**
192
+
193
+ A: 支持。greenbump 使用你本地的包管理器配置,如果 `npm install` 能访问你的私有 registry,greenbump 也能。
194
+
195
+ **Q: 能修复所有破坏性变更吗?**
196
+
197
+ A: 不能保证。AI 能处理大多数常见的 API 变更、导入重命名、配置更新等。对于需要深度架构改动的变更可能会达到 `--max-rounds` 限制。你总是可以在智能体的工作基础上继续手动修复。
198
+
199
+ **Q: 安全吗?**
200
+
201
+ A: 智能体被限制在项目目录内,不能执行任意命令。但它**会修改你的代码**,所以:
202
+ - 在干净的 git 工作树上运行(有未提交的变更会被拒绝)
203
+ - 审查修复后的 PR 再合并
204
+ - 在非关键分支上先测试
205
+ - 查看 [SECURITY.md](SECURITY.md) 了解完整的安全模型
206
+
207
+ ---
208
+
209
+ ## 反馈
210
+
211
+ 遇到问题或有建议?请在 [GitHub Issues](https://github.com/shidesheng0218/greenbump/issues) 提交。
212
+
213
+ 开发者:[@shidesheng0218](https://github.com/shidesheng0218)