cicaddy-github 0.6.0__tar.gz → 0.7.0__tar.gz
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.
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/.agents/skills/cicaddy-action/SKILL.md +11 -3
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/AGENTS.md +9 -6
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/PKG-INFO +13 -14
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/README.md +11 -12
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/action.yml +12 -7
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/docs/delegation.md +2 -2
- cicaddy_github-0.7.0/docs/providers.md +178 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/entrypoint.sh +36 -8
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/pyproject.toml +2 -2
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/__init__.py +1 -1
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/config/settings.py +11 -1
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/test_settings.py +77 -0
- cicaddy_github-0.6.0/docs/providers.md +0 -93
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/.github/dependabot.yml +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/.github/workflows/changelog.yml +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/.github/workflows/ci.yml +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/.github/workflows/pr-review.yml +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/.github/workflows/release.yml +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/.gitignore +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/.pre-commit-config.yaml +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/CLAUDE.md +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/CODE_OF_CONDUCT.md +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/CONTRIBUTING.md +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/Dockerfile +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/LICENSE +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/config/__init__.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/__init__.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/agents.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/analyzer.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/detector.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/go_dep_review_tools.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/tools.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/plugin.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/security/__init__.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/security/leak_detector.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/validation.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tasks/changelog_report.yml +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tasks/go_dep_impact_review.yml +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tasks/pr_review.yml +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/templates/report_template.html +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/__init__.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/conftest.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/__init__.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/test_agents.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/test_analyzer.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/test_detector.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/test_go_dep_review.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/test_leak_detector.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/test_plugin.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/test_review_delegation_hooks.py +0 -0
- {cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/tests/unit/test_tools.py +0 -0
|
@@ -117,12 +117,20 @@ can reference them as bash variables (`INPUT_AI_PROVIDER`, `INPUT_AI_API_KEY`, e
|
|
|
117
117
|
|
|
118
118
|
| Input | Required | Description |
|
|
119
119
|
|-------|----------|-------------|
|
|
120
|
-
| `ai_provider` | Yes | `gemini`, `openai`, `claude` |
|
|
120
|
+
| `ai_provider` | Yes | `gemini`, `openai`, `claude`, `anthropic-vertex`, `gemini-vertex` |
|
|
121
121
|
| `ai_model` | Yes | Model identifier |
|
|
122
|
-
| `ai_api_key` |
|
|
122
|
+
| `ai_api_key` | No* | AI provider API key (not needed for `anthropic-vertex` or `gemini-vertex`) |
|
|
123
|
+
| `vertex_project_id` | No | GCP project ID for Vertex AI Claude (falls back to `google_cloud_project`) |
|
|
124
|
+
| `google_cloud_project` | No | GCP project ID for Vertex AI (required for `gemini-vertex`) |
|
|
125
|
+
| `google_cloud_location` | No | Vertex AI location (default: `global`) |
|
|
123
126
|
| `task_file` | No | Path to DSPy YAML task file |
|
|
124
127
|
| `task_prompt` | No | Inline task prompt |
|
|
125
128
|
| `post_pr_comment` | No | Post results as PR comment (default: `false`) |
|
|
129
|
+
| `submit_review` | No | Submit formal PR review with APPROVE/REQUEST_CHANGES (default: `false`) |
|
|
130
|
+
| `run_govulncheck` | No | Run govulncheck for vulnerability reachability analysis (default: `false`) |
|
|
131
|
+
| `dep_review_severity_threshold` | No | Minimum semver bump to analyze: `minor` or `major` (default: `minor`) |
|
|
132
|
+
| `delegation_mode` | No | `none` (default) or `auto` for sub-agent delegation |
|
|
133
|
+
| `max_sub_agents` | No | Max concurrent sub-agents, 1-10 (default: `3`) |
|
|
126
134
|
| `github_token` | No | GitHub token (default: `${{ github.token }}`) |
|
|
127
135
|
| `mcp_servers_config` | No | JSON array of MCP server configs |
|
|
128
136
|
| `slack_webhook_url` | No | Slack webhook URL |
|
|
@@ -225,7 +233,7 @@ the `safe-to-review` label. The label is auto-removed on new pushes to prevent
|
|
|
225
233
|
TOCTOU bypasses.
|
|
226
234
|
|
|
227
235
|
```yaml
|
|
228
|
-
- uses: redhat-community-ai-tools/cicaddy-action@v0.
|
|
236
|
+
- uses: redhat-community-ai-tools/cicaddy-action@v0.7.0
|
|
229
237
|
with:
|
|
230
238
|
ai_provider: gemini
|
|
231
239
|
ai_model: gemini-3-flash-preview
|
|
@@ -65,7 +65,7 @@ cicaddy-action/
|
|
|
65
65
|
|
|
66
66
|
### Dependencies
|
|
67
67
|
|
|
68
|
-
- Depends on `cicaddy>=0.
|
|
68
|
+
- Depends on `cicaddy>=0.11.0` (core library) and `PyGithub>=2.1.0`
|
|
69
69
|
- Follows the same agent/factory patterns as the core library
|
|
70
70
|
- Extends `BaseAIAgent` from cicaddy
|
|
71
71
|
|
|
@@ -97,7 +97,7 @@ The cicaddy-github plugin provides:
|
|
|
97
97
|
|----------|---------|-------------|
|
|
98
98
|
| `DELEGATION_MODE` | `none` | `none` or `auto` |
|
|
99
99
|
| `MAX_SUB_AGENTS` | `3` | Max concurrent sub-agents (1-10) |
|
|
100
|
-
| `SUB_AGENT_MAX_ITERS` | `
|
|
100
|
+
| `SUB_AGENT_MAX_ITERS` | `5` | Iterations per sub-agent (1-15) |
|
|
101
101
|
| `DELEGATION_AGENTS_DIR` | `.agents/delegation` | Custom agent YAML directory (relative to repo root) |
|
|
102
102
|
| `DELEGATION_AGENTS` | (empty) | JSON config for inline custom sub-agent definitions |
|
|
103
103
|
| `TRIAGE_PROMPT` | (empty) | Custom triage instructions |
|
|
@@ -113,14 +113,17 @@ All inputs use **underscores** (not hyphens) for Docker container compatibility:
|
|
|
113
113
|
|
|
114
114
|
| Input | Required | Description |
|
|
115
115
|
|-------|----------|-------------|
|
|
116
|
-
| `ai_provider` | Yes | `gemini`, `openai`, `claude`, `anthropic-vertex` |
|
|
116
|
+
| `ai_provider` | Yes | `gemini`, `openai`, `claude`, `anthropic-vertex`, `gemini-vertex` |
|
|
117
117
|
| `ai_model` | Yes | Model identifier |
|
|
118
|
-
| `ai_api_key` | No* | AI provider API key (not needed for `anthropic-vertex`) |
|
|
119
|
-
| `vertex_project_id` | No | GCP project ID (
|
|
120
|
-
| `cloud_ml_region` | No |
|
|
118
|
+
| `ai_api_key` | No* | AI provider API key (not needed for `anthropic-vertex` or `gemini-vertex`) |
|
|
119
|
+
| `vertex_project_id` | No | GCP project ID for Vertex AI Claude (falls back to `google_cloud_project`) |
|
|
120
|
+
| `cloud_ml_region` | No | **Deprecated**: use `google_cloud_location` |
|
|
121
|
+
| `google_cloud_project` | No | GCP project ID for Vertex AI (required for `gemini-vertex`) |
|
|
122
|
+
| `google_cloud_location` | No | Vertex AI location (default: `global`) |
|
|
121
123
|
| `task_file` | No | Path to DSPy YAML task file |
|
|
122
124
|
| `task_prompt` | No | Inline task prompt |
|
|
123
125
|
| `post_pr_comment` | No | Post results as PR comment (default: `false`) |
|
|
126
|
+
| `submit_review` | No | Submit formal PR review with APPROVE/REQUEST_CHANGES (default: `false`) |
|
|
124
127
|
| `github_token` | No | GitHub token (default: `${{ github.token }}`) |
|
|
125
128
|
| `mcp_servers_config` | No | JSON array of MCP server configs |
|
|
126
129
|
| `slack_webhook_url` | No | Slack webhook URL |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cicaddy-github
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: GitHub Actions plugin for cicaddy AI agent framework
|
|
5
5
|
Project-URL: Homepage, https://github.com/redhat-community-ai-tools/cicaddy-action
|
|
6
6
|
Project-URL: Repository, https://github.com/redhat-community-ai-tools/cicaddy-action.git
|
|
@@ -9,7 +9,7 @@ Author: Wayne Sun
|
|
|
9
9
|
License: Apache-2.0
|
|
10
10
|
License-File: LICENSE
|
|
11
11
|
Requires-Python: >=3.11
|
|
12
|
-
Requires-Dist: cicaddy>=0.
|
|
12
|
+
Requires-Dist: cicaddy>=0.11.0
|
|
13
13
|
Requires-Dist: detect-secrets>=1.4.0
|
|
14
14
|
Requires-Dist: pygithub>=2.1.0
|
|
15
15
|
Provides-Extra: test
|
|
@@ -28,7 +28,7 @@ GitHub Action that wraps [cicaddy](https://github.com/waynesun09/cicaddy) for ru
|
|
|
28
28
|
- **Sub-agent delegation** for parallel specialized reviews (security, architecture, performance, etc.)
|
|
29
29
|
- **Go dependency impact analysis** for Go dependency update PRs with risk classification
|
|
30
30
|
- **Changelog report generation** from git tag diffs and release notes
|
|
31
|
-
- **Multiple AI providers**: Gemini, OpenAI, Claude, Claude via Vertex AI
|
|
31
|
+
- **Multiple AI providers**: Gemini, OpenAI, Claude, Claude via Vertex AI, Gemini via Vertex AI
|
|
32
32
|
- **Secret redaction** via detect-secrets for safe public outputs
|
|
33
33
|
- **DSPy YAML task definitions** for customizable analysis workflows
|
|
34
34
|
|
|
@@ -149,11 +149,12 @@ See [docs/providers.md](docs/providers.md) for provider-specific configuration i
|
|
|
149
149
|
|
|
150
150
|
| Input | Required | Description |
|
|
151
151
|
|-------|----------|-------------|
|
|
152
|
-
| `ai_provider` | Yes | AI provider: `gemini`, `openai`, `claude`, `anthropic-vertex` |
|
|
152
|
+
| `ai_provider` | Yes | AI provider: `gemini`, `openai`, `claude`, `anthropic-vertex`, `gemini-vertex` |
|
|
153
153
|
| `ai_model` | Yes | Model identifier |
|
|
154
|
-
| `ai_api_key` | No | AI provider API key (not needed for `anthropic-vertex`) |
|
|
155
|
-
| `vertex_project_id` | No | GCP project ID (
|
|
156
|
-
| `
|
|
154
|
+
| `ai_api_key` | No | AI provider API key (not needed for `anthropic-vertex` or `gemini-vertex`) |
|
|
155
|
+
| `vertex_project_id` | No | GCP project ID for Vertex AI Claude (falls back to `google_cloud_project`) |
|
|
156
|
+
| `google_cloud_project` | No | GCP project ID for Vertex AI (required for `gemini-vertex`, optional fallback for `anthropic-vertex`) |
|
|
157
|
+
| `google_cloud_location` | No | Vertex AI location (default: `global`) |
|
|
157
158
|
| `task_file` | No | Path to DSPy YAML task file |
|
|
158
159
|
| `task_prompt` | No | Inline task prompt (alternative to task_file) |
|
|
159
160
|
| `report_template` | No | Path to custom HTML report template |
|
|
@@ -255,11 +256,12 @@ uv run cicaddy validate --env-file .env.my-review
|
|
|
255
256
|
|
|
256
257
|
| Variable | Required | Description |
|
|
257
258
|
|----------|----------|-------------|
|
|
258
|
-
| `AI_PROVIDER` | Yes | `gemini`, `openai`, `claude`, or `
|
|
259
|
+
| `AI_PROVIDER` | Yes | `gemini`, `openai`, `claude`, `anthropic-vertex`, or `gemini-vertex` |
|
|
259
260
|
| `AI_MODEL` | Yes | Model identifier (e.g. `gemini-3-flash-preview`) |
|
|
260
|
-
| `GEMINI_API_KEY` / `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` | Yes* | API key matching the provider (*not needed for `anthropic-vertex`) |
|
|
261
|
-
| `ANTHROPIC_VERTEX_PROJECT_ID` | No | GCP project ID (required for `anthropic-vertex`) |
|
|
262
|
-
| `
|
|
261
|
+
| `GEMINI_API_KEY` / `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` | Yes* | API key matching the provider (*not needed for `anthropic-vertex` or `gemini-vertex`) |
|
|
262
|
+
| `ANTHROPIC_VERTEX_PROJECT_ID` | No | GCP project ID (required for `anthropic-vertex`, falls back to `GOOGLE_CLOUD_PROJECT`) |
|
|
263
|
+
| `GOOGLE_CLOUD_PROJECT` | No | GCP project ID for Vertex AI (required for `gemini-vertex`) |
|
|
264
|
+
| `GOOGLE_CLOUD_LOCATION` | No | Vertex AI location (default: `global`) |
|
|
263
265
|
| `GITHUB_TOKEN` | Yes | GitHub personal access token |
|
|
264
266
|
| `GITHUB_REPOSITORY` | Yes | Target repo in `owner/repo` format |
|
|
265
267
|
| `GITHUB_EVENT_NAME` | No | Set to `pull_request` for auto-detection (optional if `GITHUB_PR_NUMBER` is set) |
|
|
@@ -271,9 +273,6 @@ uv run cicaddy validate --env-file .env.my-review
|
|
|
271
273
|
| `SUB_AGENT_MAX_ITERS` | No | Max iterations per sub-agent, 1-15 (default: `5`) |
|
|
272
274
|
| `AI_TASK_FILE` | No | Path to DSPy YAML task file for custom workflows |
|
|
273
275
|
| `RUN_GOVULNCHECK` | No | Run govulncheck for reachability analysis (`true`/`false`) |
|
|
274
|
-
| `DELEGATION_MODE` | No | `none` or `auto` for sub-agent delegation |
|
|
275
|
-
| `MAX_SUB_AGENTS` | No | Maximum concurrent sub-agents (default: `3`) |
|
|
276
|
-
| `SUB_AGENT_MAX_ITERS` | No | Max iterations per sub-agent (default: `10`) |
|
|
277
276
|
| `DELEGATION_AGENTS_DIR` | No | Custom agent YAML directory (default: `.agents/delegation`) |
|
|
278
277
|
| `DELEGATION_AGENTS` | No | JSON config for inline custom sub-agents |
|
|
279
278
|
| `TRIAGE_PROMPT` | No | Custom triage instructions |
|
|
@@ -8,7 +8,7 @@ GitHub Action that wraps [cicaddy](https://github.com/waynesun09/cicaddy) for ru
|
|
|
8
8
|
- **Sub-agent delegation** for parallel specialized reviews (security, architecture, performance, etc.)
|
|
9
9
|
- **Go dependency impact analysis** for Go dependency update PRs with risk classification
|
|
10
10
|
- **Changelog report generation** from git tag diffs and release notes
|
|
11
|
-
- **Multiple AI providers**: Gemini, OpenAI, Claude, Claude via Vertex AI
|
|
11
|
+
- **Multiple AI providers**: Gemini, OpenAI, Claude, Claude via Vertex AI, Gemini via Vertex AI
|
|
12
12
|
- **Secret redaction** via detect-secrets for safe public outputs
|
|
13
13
|
- **DSPy YAML task definitions** for customizable analysis workflows
|
|
14
14
|
|
|
@@ -129,11 +129,12 @@ See [docs/providers.md](docs/providers.md) for provider-specific configuration i
|
|
|
129
129
|
|
|
130
130
|
| Input | Required | Description |
|
|
131
131
|
|-------|----------|-------------|
|
|
132
|
-
| `ai_provider` | Yes | AI provider: `gemini`, `openai`, `claude`, `anthropic-vertex` |
|
|
132
|
+
| `ai_provider` | Yes | AI provider: `gemini`, `openai`, `claude`, `anthropic-vertex`, `gemini-vertex` |
|
|
133
133
|
| `ai_model` | Yes | Model identifier |
|
|
134
|
-
| `ai_api_key` | No | AI provider API key (not needed for `anthropic-vertex`) |
|
|
135
|
-
| `vertex_project_id` | No | GCP project ID (
|
|
136
|
-
| `
|
|
134
|
+
| `ai_api_key` | No | AI provider API key (not needed for `anthropic-vertex` or `gemini-vertex`) |
|
|
135
|
+
| `vertex_project_id` | No | GCP project ID for Vertex AI Claude (falls back to `google_cloud_project`) |
|
|
136
|
+
| `google_cloud_project` | No | GCP project ID for Vertex AI (required for `gemini-vertex`, optional fallback for `anthropic-vertex`) |
|
|
137
|
+
| `google_cloud_location` | No | Vertex AI location (default: `global`) |
|
|
137
138
|
| `task_file` | No | Path to DSPy YAML task file |
|
|
138
139
|
| `task_prompt` | No | Inline task prompt (alternative to task_file) |
|
|
139
140
|
| `report_template` | No | Path to custom HTML report template |
|
|
@@ -235,11 +236,12 @@ uv run cicaddy validate --env-file .env.my-review
|
|
|
235
236
|
|
|
236
237
|
| Variable | Required | Description |
|
|
237
238
|
|----------|----------|-------------|
|
|
238
|
-
| `AI_PROVIDER` | Yes | `gemini`, `openai`, `claude`, or `
|
|
239
|
+
| `AI_PROVIDER` | Yes | `gemini`, `openai`, `claude`, `anthropic-vertex`, or `gemini-vertex` |
|
|
239
240
|
| `AI_MODEL` | Yes | Model identifier (e.g. `gemini-3-flash-preview`) |
|
|
240
|
-
| `GEMINI_API_KEY` / `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` | Yes* | API key matching the provider (*not needed for `anthropic-vertex`) |
|
|
241
|
-
| `ANTHROPIC_VERTEX_PROJECT_ID` | No | GCP project ID (required for `anthropic-vertex`) |
|
|
242
|
-
| `
|
|
241
|
+
| `GEMINI_API_KEY` / `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` | Yes* | API key matching the provider (*not needed for `anthropic-vertex` or `gemini-vertex`) |
|
|
242
|
+
| `ANTHROPIC_VERTEX_PROJECT_ID` | No | GCP project ID (required for `anthropic-vertex`, falls back to `GOOGLE_CLOUD_PROJECT`) |
|
|
243
|
+
| `GOOGLE_CLOUD_PROJECT` | No | GCP project ID for Vertex AI (required for `gemini-vertex`) |
|
|
244
|
+
| `GOOGLE_CLOUD_LOCATION` | No | Vertex AI location (default: `global`) |
|
|
243
245
|
| `GITHUB_TOKEN` | Yes | GitHub personal access token |
|
|
244
246
|
| `GITHUB_REPOSITORY` | Yes | Target repo in `owner/repo` format |
|
|
245
247
|
| `GITHUB_EVENT_NAME` | No | Set to `pull_request` for auto-detection (optional if `GITHUB_PR_NUMBER` is set) |
|
|
@@ -251,9 +253,6 @@ uv run cicaddy validate --env-file .env.my-review
|
|
|
251
253
|
| `SUB_AGENT_MAX_ITERS` | No | Max iterations per sub-agent, 1-15 (default: `5`) |
|
|
252
254
|
| `AI_TASK_FILE` | No | Path to DSPy YAML task file for custom workflows |
|
|
253
255
|
| `RUN_GOVULNCHECK` | No | Run govulncheck for reachability analysis (`true`/`false`) |
|
|
254
|
-
| `DELEGATION_MODE` | No | `none` or `auto` for sub-agent delegation |
|
|
255
|
-
| `MAX_SUB_AGENTS` | No | Maximum concurrent sub-agents (default: `3`) |
|
|
256
|
-
| `SUB_AGENT_MAX_ITERS` | No | Max iterations per sub-agent (default: `10`) |
|
|
257
256
|
| `DELEGATION_AGENTS_DIR` | No | Custom agent YAML directory (default: `.agents/delegation`) |
|
|
258
257
|
| `DELEGATION_AGENTS` | No | JSON config for inline custom sub-agents |
|
|
259
258
|
| `TRIAGE_PROMPT` | No | Custom triage instructions |
|
|
@@ -6,26 +6,31 @@ branding:
|
|
|
6
6
|
|
|
7
7
|
inputs:
|
|
8
8
|
ai_provider:
|
|
9
|
-
description: 'AI provider: gemini, openai, claude, anthropic-vertex'
|
|
9
|
+
description: 'AI provider: gemini, openai, claude, anthropic-vertex, gemini-vertex'
|
|
10
10
|
required: true
|
|
11
11
|
ai_model:
|
|
12
12
|
description: 'Model identifier'
|
|
13
13
|
required: true
|
|
14
14
|
ai_api_key:
|
|
15
|
-
description: 'AI provider API key (not required for anthropic-vertex, which
|
|
15
|
+
description: 'AI provider API key (not required for anthropic-vertex or gemini-vertex, which use GCP ADC)'
|
|
16
16
|
required: false
|
|
17
17
|
vertex_project_id:
|
|
18
|
-
description: 'GCP project ID for Vertex AI Claude (
|
|
18
|
+
description: 'GCP project ID for Vertex AI Claude (falls back to google_cloud_project if not set)'
|
|
19
19
|
required: false
|
|
20
20
|
cloud_ml_region:
|
|
21
|
-
description: 'Vertex AI region
|
|
21
|
+
description: 'DEPRECATED: Use google_cloud_location instead. Vertex AI region for anthropic-vertex.'
|
|
22
|
+
required: false
|
|
23
|
+
google_cloud_project:
|
|
24
|
+
description: 'GCP project ID for Vertex AI (required for gemini-vertex, optional fallback for anthropic-vertex)'
|
|
25
|
+
required: false
|
|
26
|
+
google_cloud_location:
|
|
27
|
+
description: 'Vertex AI location (default: global)'
|
|
22
28
|
required: false
|
|
23
|
-
default: 'us-east5'
|
|
24
29
|
task_file:
|
|
25
30
|
description: 'Path to DSPy YAML task file'
|
|
26
31
|
required: false
|
|
27
32
|
task_prompt:
|
|
28
|
-
description: 'Inline task prompt (alternative to
|
|
33
|
+
description: 'Inline task prompt (alternative to task_file)'
|
|
29
34
|
required: false
|
|
30
35
|
report_template:
|
|
31
36
|
description: 'Path to custom HTML report template'
|
|
@@ -78,4 +83,4 @@ runs:
|
|
|
78
83
|
using: 'docker'
|
|
79
84
|
image: 'Dockerfile'
|
|
80
85
|
# After first GHCR publish, switch to pre-built image for faster startup:
|
|
81
|
-
# image: 'docker://ghcr.io/redhat-community-ai-tools/cicaddy-action:0.
|
|
86
|
+
# image: 'docker://ghcr.io/redhat-community-ai-tools/cicaddy-action:0.7.0'
|
|
@@ -45,7 +45,7 @@ uv run cicaddy run --env-file .env.my-review --delegation-mode auto --max-sub-ag
|
|
|
45
45
|
|-----------------|---------|-------------|
|
|
46
46
|
| `DELEGATION_MODE` / `delegation_mode` | `none` | `none` (single-agent) or `auto` (AI-powered delegation) |
|
|
47
47
|
| `MAX_SUB_AGENTS` / `max_sub_agents` | `3` | Maximum concurrent sub-agents (1-10) |
|
|
48
|
-
| `SUB_AGENT_MAX_ITERS` | `
|
|
48
|
+
| `SUB_AGENT_MAX_ITERS` | `5` | Max inference iterations per sub-agent (1-15, env var only) |
|
|
49
49
|
| `DELEGATION_AGENTS_DIR` | `.agents/delegation` | Directory for user-defined sub-agent YAML files (env var only) |
|
|
50
50
|
| `DELEGATION_AGENTS` | (empty) | JSON config for inline custom sub-agent definitions (env var only) |
|
|
51
51
|
| `TRIAGE_PROMPT` | (empty) | Optional custom instructions for the triage AI (env var only) |
|
|
@@ -156,7 +156,7 @@ When using `task_file` with `delegation_mode: auto`, the task definition is prov
|
|
|
156
156
|
|
|
157
157
|
## Cost Considerations
|
|
158
158
|
|
|
159
|
-
Delegation multiplies AI inference calls. With defaults (`MAX_SUB_AGENTS=3`, `SUB_AGENT_MAX_ITERS=
|
|
159
|
+
Delegation multiplies AI inference calls. With defaults (`MAX_SUB_AGENTS=3`, `SUB_AGENT_MAX_ITERS=5`), a single PR review can use up to 1 (triage) + 3×5 (sub-agents) + 1 (aggregation) = **17 AI calls** versus 1-15 for single-agent mode. Tune `MAX_SUB_AGENTS` and `SUB_AGENT_MAX_ITERS` based on your AI provider tier and rate limits.
|
|
160
160
|
|
|
161
161
|
## Troubleshooting
|
|
162
162
|
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# AI Provider Configuration
|
|
2
|
+
|
|
3
|
+
cicaddy-action supports multiple AI providers. This guide covers provider-specific setup.
|
|
4
|
+
|
|
5
|
+
## Gemini
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
9
|
+
with:
|
|
10
|
+
ai_provider: gemini
|
|
11
|
+
ai_model: gemini-3-flash-preview
|
|
12
|
+
ai_api_key: ${{ secrets.GEMINI_API_KEY }}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## OpenAI
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
19
|
+
with:
|
|
20
|
+
ai_provider: openai
|
|
21
|
+
ai_model: gpt-4.5
|
|
22
|
+
ai_api_key: ${{ secrets.OPENAI_API_KEY }}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Claude (Anthropic API)
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
29
|
+
with:
|
|
30
|
+
ai_provider: claude
|
|
31
|
+
ai_model: claude-sonnet-4-6
|
|
32
|
+
ai_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Claude via Vertex AI (GCP)
|
|
36
|
+
|
|
37
|
+
Uses Google Cloud Workload Identity Federation for keyless authentication — no
|
|
38
|
+
service account JSON keys to manage. This is the recommended approach for GCP.
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
name: PR Review (Vertex AI)
|
|
42
|
+
|
|
43
|
+
on:
|
|
44
|
+
pull_request:
|
|
45
|
+
types: [opened, synchronize]
|
|
46
|
+
|
|
47
|
+
permissions:
|
|
48
|
+
contents: read
|
|
49
|
+
id-token: write # Required for Workload Identity Federation
|
|
50
|
+
pull-requests: write
|
|
51
|
+
|
|
52
|
+
jobs:
|
|
53
|
+
review:
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v6
|
|
57
|
+
with:
|
|
58
|
+
fetch-depth: 0
|
|
59
|
+
|
|
60
|
+
- uses: google-github-actions/auth@v3
|
|
61
|
+
with:
|
|
62
|
+
workload_identity_provider: 'projects/123/locations/global/workloadIdentityPools/github/providers/my-repo'
|
|
63
|
+
service_account: 'cicaddy@my-project.iam.gserviceaccount.com'
|
|
64
|
+
|
|
65
|
+
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
66
|
+
with:
|
|
67
|
+
ai_provider: anthropic-vertex
|
|
68
|
+
ai_model: claude-sonnet-4-6
|
|
69
|
+
vertex_project_id: my-project
|
|
70
|
+
task_file: tasks/pr_review.yml
|
|
71
|
+
post_pr_comment: 'true'
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
> **Security**: Prefer Workload Identity Federation (shown above) over service
|
|
75
|
+
> account keys. If you must use a key, store the JSON as a GitHub secret and pass
|
|
76
|
+
> it via `google-github-actions/auth` with `credentials_json`:
|
|
77
|
+
> ```yaml
|
|
78
|
+
> - uses: google-github-actions/auth@v3
|
|
79
|
+
> with:
|
|
80
|
+
> credentials_json: ${{ secrets.GCP_SA_KEY }}
|
|
81
|
+
> ```
|
|
82
|
+
> The auth action sets `GOOGLE_APPLICATION_CREDENTIALS` automatically — never
|
|
83
|
+
> write keys to disk manually or echo them in scripts.
|
|
84
|
+
|
|
85
|
+
## Gemini via Vertex AI (GCP)
|
|
86
|
+
|
|
87
|
+
Uses Google Cloud authentication (Workload Identity Federation or service account)
|
|
88
|
+
to call Gemini models through the Vertex AI API — no Gemini API key needed.
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
name: PR Review (Gemini Vertex AI)
|
|
92
|
+
|
|
93
|
+
on:
|
|
94
|
+
pull_request:
|
|
95
|
+
types: [opened, synchronize]
|
|
96
|
+
|
|
97
|
+
permissions:
|
|
98
|
+
contents: read
|
|
99
|
+
id-token: write # Required for Workload Identity Federation
|
|
100
|
+
pull-requests: write
|
|
101
|
+
|
|
102
|
+
jobs:
|
|
103
|
+
review:
|
|
104
|
+
runs-on: ubuntu-latest
|
|
105
|
+
steps:
|
|
106
|
+
- uses: actions/checkout@v6
|
|
107
|
+
with:
|
|
108
|
+
fetch-depth: 0
|
|
109
|
+
|
|
110
|
+
- uses: google-github-actions/auth@v3
|
|
111
|
+
with:
|
|
112
|
+
workload_identity_provider: 'projects/123/locations/global/workloadIdentityPools/github/providers/my-repo'
|
|
113
|
+
service_account: 'cicaddy@my-project.iam.gserviceaccount.com'
|
|
114
|
+
|
|
115
|
+
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
116
|
+
with:
|
|
117
|
+
ai_provider: gemini-vertex
|
|
118
|
+
ai_model: gemini-3-flash-preview
|
|
119
|
+
google_cloud_project: my-project
|
|
120
|
+
task_file: tasks/pr_review.yml
|
|
121
|
+
post_pr_comment: 'true'
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
> **Note**: `google_cloud_project` is required for `gemini-vertex`. The
|
|
125
|
+
> `google-github-actions/auth` step sets `GOOGLE_APPLICATION_CREDENTIALS`
|
|
126
|
+
> automatically.
|
|
127
|
+
|
|
128
|
+
## Migration Notes
|
|
129
|
+
|
|
130
|
+
### Default Vertex AI location changed from `us-east5` to `global`
|
|
131
|
+
|
|
132
|
+
Previous versions defaulted to `us-east5` via the `cloud_ml_region` input. This
|
|
133
|
+
release changes the default to `global` (via the new `google_cloud_location`
|
|
134
|
+
input), which routes requests to the nearest available region.
|
|
135
|
+
|
|
136
|
+
If your workflow relied on the implicit `us-east5` default, add an explicit
|
|
137
|
+
location:
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
141
|
+
with:
|
|
142
|
+
google_cloud_location: us-east5 # pin to previous default
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### `cloud_ml_region` is deprecated
|
|
146
|
+
|
|
147
|
+
The `cloud_ml_region` input still works but emits a warning. Replace it with
|
|
148
|
+
`google_cloud_location` in your workflows.
|
|
149
|
+
|
|
150
|
+
## Security Considerations
|
|
151
|
+
|
|
152
|
+
### `submit_review` and fork pull requests
|
|
153
|
+
|
|
154
|
+
When `submit_review: 'true'` is set, the action submits a formal GitHub review
|
|
155
|
+
(APPROVE or REQUEST\_CHANGES) on behalf of the token owner. If your repository
|
|
156
|
+
accepts pull requests from forks and you use `pull_request_target` to expose
|
|
157
|
+
secrets, an attacker could craft a PR that tricks the AI into approving
|
|
158
|
+
malicious code.
|
|
159
|
+
|
|
160
|
+
Mitigations:
|
|
161
|
+
|
|
162
|
+
- Do **not** combine `submit_review: 'true'` with `pull_request_target` on
|
|
163
|
+
repositories that accept fork PRs.
|
|
164
|
+
- Use `pull_request` (not `pull_request_target`) when possible — it runs in the
|
|
165
|
+
fork's context and cannot access repository secrets.
|
|
166
|
+
- If you must use `pull_request_target`, restrict `submit_review` to trusted
|
|
167
|
+
contributors via a branch protection rule or a job-level `if:` condition.
|
|
168
|
+
|
|
169
|
+
## Provider Inputs Reference
|
|
170
|
+
|
|
171
|
+
| Input | Required | Description |
|
|
172
|
+
|-------|----------|-------------|
|
|
173
|
+
| `ai_provider` | Yes | `gemini`, `openai`, `claude`, `anthropic-vertex`, or `gemini-vertex` |
|
|
174
|
+
| `ai_model` | Yes | Model identifier |
|
|
175
|
+
| `ai_api_key` | No | API key (not needed for `anthropic-vertex` or `gemini-vertex`) |
|
|
176
|
+
| `vertex_project_id` | No | GCP project ID for Vertex AI Claude (falls back to `google_cloud_project`) |
|
|
177
|
+
| `google_cloud_project` | No | GCP project ID for Vertex AI (required for `gemini-vertex`, optional fallback for `anthropic-vertex`) |
|
|
178
|
+
| `google_cloud_location` | No | Vertex AI location (default: `global`) |
|
|
@@ -14,27 +14,53 @@ case "${AI_PROVIDER}" in
|
|
|
14
14
|
claude|anthropic) export ANTHROPIC_API_KEY="${INPUT_AI_API_KEY}" ;;
|
|
15
15
|
anthropic-vertex)
|
|
16
16
|
;; # handled below
|
|
17
|
+
gemini-vertex)
|
|
18
|
+
;; # handled below
|
|
17
19
|
*)
|
|
18
|
-
echo "ERROR: Unknown ai_provider '${AI_PROVIDER}'. Supported: gemini, openai, claude, anthropic, anthropic-vertex"
|
|
20
|
+
echo "ERROR: Unknown ai_provider '${AI_PROVIDER}'. Supported: gemini, openai, claude, anthropic, anthropic-vertex, gemini-vertex"
|
|
19
21
|
exit 3
|
|
20
22
|
;;
|
|
21
23
|
esac
|
|
22
24
|
|
|
23
25
|
# Validate API key for non-vertex providers
|
|
24
|
-
if [[ "${AI_PROVIDER}" !=
|
|
26
|
+
if [[ "${AI_PROVIDER}" != *-vertex && -z "${INPUT_AI_API_KEY}" ]]; then
|
|
25
27
|
echo "ERROR: ai_api_key is required for provider '${AI_PROVIDER}'"
|
|
26
28
|
exit 3
|
|
27
29
|
fi
|
|
28
30
|
|
|
31
|
+
# Export shared Vertex AI env vars
|
|
32
|
+
if [[ -n "${INPUT_GOOGLE_CLOUD_PROJECT}" ]]; then
|
|
33
|
+
export GOOGLE_CLOUD_PROJECT="${INPUT_GOOGLE_CLOUD_PROJECT}"
|
|
34
|
+
fi
|
|
35
|
+
if [[ -n "${INPUT_GOOGLE_CLOUD_LOCATION}" ]]; then
|
|
36
|
+
export GOOGLE_CLOUD_LOCATION="${INPUT_GOOGLE_CLOUD_LOCATION}"
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Handle gemini-vertex provider setup
|
|
40
|
+
if [[ "${AI_PROVIDER}" == "gemini-vertex" ]]; then
|
|
41
|
+
if [[ -z "${GOOGLE_CLOUD_PROJECT}" ]]; then
|
|
42
|
+
echo "ERROR: ai_provider 'gemini-vertex' requires google_cloud_project input"
|
|
43
|
+
exit 3
|
|
44
|
+
fi
|
|
45
|
+
if [[ -z "${GOOGLE_APPLICATION_CREDENTIALS}" ]]; then
|
|
46
|
+
echo "WARNING: GOOGLE_APPLICATION_CREDENTIALS not set. Use google-github-actions/auth before this step."
|
|
47
|
+
fi
|
|
48
|
+
export GOOGLE_CLOUD_LOCATION="${GOOGLE_CLOUD_LOCATION:-global}"
|
|
49
|
+
fi
|
|
50
|
+
|
|
29
51
|
# Handle anthropic-vertex provider setup
|
|
30
52
|
if [[ "${AI_PROVIDER}" == "anthropic-vertex" ]]; then
|
|
31
|
-
export ANTHROPIC_VERTEX_PROJECT_ID="${INPUT_VERTEX_PROJECT_ID}"
|
|
32
|
-
|
|
33
|
-
if [[ -
|
|
34
|
-
echo "
|
|
53
|
+
export ANTHROPIC_VERTEX_PROJECT_ID="${INPUT_VERTEX_PROJECT_ID:-$GOOGLE_CLOUD_PROJECT}"
|
|
54
|
+
# CLOUD_ML_REGION is deprecated in cicaddy core; use GOOGLE_CLOUD_LOCATION
|
|
55
|
+
if [[ -n "${INPUT_CLOUD_ML_REGION}" ]]; then
|
|
56
|
+
echo "WARNING: cloud_ml_region input is deprecated. Use google_cloud_location instead."
|
|
57
|
+
export GOOGLE_CLOUD_LOCATION="${GOOGLE_CLOUD_LOCATION:-${INPUT_CLOUD_ML_REGION}}"
|
|
58
|
+
fi
|
|
59
|
+
export GOOGLE_CLOUD_LOCATION="${GOOGLE_CLOUD_LOCATION:-global}"
|
|
60
|
+
if [[ -z "${ANTHROPIC_VERTEX_PROJECT_ID}" && -z "${GOOGLE_CLOUD_PROJECT}" ]]; then
|
|
61
|
+
echo "ERROR: ai_provider 'anthropic-vertex' requires vertex_project_id or google_cloud_project input"
|
|
35
62
|
exit 3
|
|
36
63
|
fi
|
|
37
|
-
# GOOGLE_APPLICATION_CREDENTIALS must be set by google-github-actions/auth
|
|
38
64
|
if [[ -z "${GOOGLE_APPLICATION_CREDENTIALS}" ]]; then
|
|
39
65
|
echo "WARNING: GOOGLE_APPLICATION_CREDENTIALS not set. Use google-github-actions/auth before this step."
|
|
40
66
|
fi
|
|
@@ -54,7 +80,9 @@ _to_abs() {
|
|
|
54
80
|
fi
|
|
55
81
|
local full_path="${WORKSPACE}/${path}"
|
|
56
82
|
# Resolve symlinks and .. components, then verify the result is under WORKSPACE
|
|
57
|
-
|
|
83
|
+
local resolved
|
|
84
|
+
resolved="$(realpath -m "$full_path")"
|
|
85
|
+
if [[ "$resolved" != "${WORKSPACE}/"* && "$resolved" != "${WORKSPACE}" ]]; then
|
|
58
86
|
echo "ERROR: Path traversal detected: $path" >&2
|
|
59
87
|
exit 1
|
|
60
88
|
fi
|
|
@@ -4,14 +4,14 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cicaddy-github"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.7.0"
|
|
8
8
|
description = "GitHub Actions plugin for cicaddy AI agent framework"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
license = {text = "Apache-2.0"}
|
|
12
12
|
authors = [{name = "Wayne Sun"}]
|
|
13
13
|
dependencies = [
|
|
14
|
-
"cicaddy>=0.
|
|
14
|
+
"cicaddy>=0.11.0",
|
|
15
15
|
"PyGithub>=2.1.0",
|
|
16
16
|
"detect-secrets>=1.4.0",
|
|
17
17
|
]
|
|
@@ -140,7 +140,17 @@ def load_settings() -> Settings:
|
|
|
140
140
|
if os.getenv("ANTHROPIC_VERTEX_PROJECT_ID"):
|
|
141
141
|
env_data["anthropic_vertex_project_id"] = os.getenv("ANTHROPIC_VERTEX_PROJECT_ID")
|
|
142
142
|
if os.getenv("CLOUD_ML_REGION"):
|
|
143
|
-
|
|
143
|
+
logger.warning("CLOUD_ML_REGION is deprecated; use GOOGLE_CLOUD_LOCATION instead")
|
|
144
|
+
gcp_project = os.getenv("GOOGLE_CLOUD_PROJECT")
|
|
145
|
+
if gcp_project:
|
|
146
|
+
env_data["google_cloud_project"] = gcp_project
|
|
147
|
+
elif gcp_project == "":
|
|
148
|
+
os.environ.pop("GOOGLE_CLOUD_PROJECT", None)
|
|
149
|
+
gcp_location = os.getenv("GOOGLE_CLOUD_LOCATION")
|
|
150
|
+
if gcp_location:
|
|
151
|
+
env_data["google_cloud_location"] = gcp_location
|
|
152
|
+
elif gcp_location == "":
|
|
153
|
+
os.environ.pop("GOOGLE_CLOUD_LOCATION", None)
|
|
144
154
|
|
|
145
155
|
# MCP server configuration
|
|
146
156
|
if os.getenv("MCP_SERVERS_CONFIG"):
|
|
@@ -202,3 +202,80 @@ class TestSettingsValidation:
|
|
|
202
202
|
|
|
203
203
|
settings = load_settings()
|
|
204
204
|
assert settings.submit_review is True
|
|
205
|
+
|
|
206
|
+
def test_google_cloud_project_passed_through(self):
|
|
207
|
+
"""GOOGLE_CLOUD_PROJECT is passed through to settings."""
|
|
208
|
+
env = {
|
|
209
|
+
"AI_PROVIDER": "gemini-vertex",
|
|
210
|
+
"AI_MODEL": "gemini-3-flash-preview",
|
|
211
|
+
"GOOGLE_CLOUD_PROJECT": "my-gcp-project",
|
|
212
|
+
"GOOGLE_CLOUD_LOCATION": "us-central1",
|
|
213
|
+
"MCP_SERVERS_CONFIG": "[]",
|
|
214
|
+
}
|
|
215
|
+
with patch.dict(os.environ, env, clear=False):
|
|
216
|
+
from cicaddy_github.config.settings import load_settings
|
|
217
|
+
|
|
218
|
+
settings = load_settings()
|
|
219
|
+
assert settings.google_cloud_project == "my-gcp-project"
|
|
220
|
+
assert settings.google_cloud_location == "us-central1"
|
|
221
|
+
|
|
222
|
+
def test_google_cloud_location_defaults_to_global(self):
|
|
223
|
+
"""GOOGLE_CLOUD_LOCATION defaults to 'global' when not set."""
|
|
224
|
+
env = {
|
|
225
|
+
"AI_PROVIDER": "gemini-vertex",
|
|
226
|
+
"AI_MODEL": "gemini-3-flash-preview",
|
|
227
|
+
"GOOGLE_CLOUD_PROJECT": "my-gcp-project",
|
|
228
|
+
"MCP_SERVERS_CONFIG": "[]",
|
|
229
|
+
}
|
|
230
|
+
with patch.dict(os.environ, env, clear=False):
|
|
231
|
+
os.environ.pop("GOOGLE_CLOUD_LOCATION", None)
|
|
232
|
+
from cicaddy_github.config.settings import load_settings
|
|
233
|
+
|
|
234
|
+
settings = load_settings()
|
|
235
|
+
assert settings.google_cloud_project == "my-gcp-project"
|
|
236
|
+
assert settings.google_cloud_location == "global"
|
|
237
|
+
|
|
238
|
+
def test_google_cloud_project_absent(self):
|
|
239
|
+
"""GOOGLE_CLOUD_PROJECT absent results in None."""
|
|
240
|
+
env = {
|
|
241
|
+
"AI_PROVIDER": "gemini",
|
|
242
|
+
"AI_MODEL": "gemini-3-flash-preview",
|
|
243
|
+
"MCP_SERVERS_CONFIG": "[]",
|
|
244
|
+
}
|
|
245
|
+
with patch.dict(os.environ, env, clear=False):
|
|
246
|
+
os.environ.pop("GOOGLE_CLOUD_PROJECT", None)
|
|
247
|
+
os.environ.pop("GOOGLE_CLOUD_LOCATION", None)
|
|
248
|
+
from cicaddy_github.config.settings import load_settings
|
|
249
|
+
|
|
250
|
+
settings = load_settings()
|
|
251
|
+
assert settings.google_cloud_project is None
|
|
252
|
+
|
|
253
|
+
def test_google_cloud_project_empty_string(self):
|
|
254
|
+
"""Empty string GOOGLE_CLOUD_PROJECT is not passed through."""
|
|
255
|
+
env = {
|
|
256
|
+
"AI_PROVIDER": "gemini",
|
|
257
|
+
"AI_MODEL": "gemini-3-flash-preview",
|
|
258
|
+
"GOOGLE_CLOUD_PROJECT": "",
|
|
259
|
+
"MCP_SERVERS_CONFIG": "[]",
|
|
260
|
+
}
|
|
261
|
+
with patch.dict(os.environ, env, clear=False):
|
|
262
|
+
from cicaddy_github.config.settings import load_settings
|
|
263
|
+
|
|
264
|
+
settings = load_settings()
|
|
265
|
+
assert settings.google_cloud_project is None
|
|
266
|
+
|
|
267
|
+
def test_anthropic_vertex_with_google_cloud_project(self):
|
|
268
|
+
"""anthropic-vertex provider uses GOOGLE_CLOUD_PROJECT for settings."""
|
|
269
|
+
env = {
|
|
270
|
+
"AI_PROVIDER": "anthropic-vertex",
|
|
271
|
+
"AI_MODEL": "claude-sonnet-4-20250514",
|
|
272
|
+
"GOOGLE_CLOUD_PROJECT": "my-gcp-project",
|
|
273
|
+
"ANTHROPIC_VERTEX_PROJECT_ID": "my-vertex-project",
|
|
274
|
+
"MCP_SERVERS_CONFIG": "[]",
|
|
275
|
+
}
|
|
276
|
+
with patch.dict(os.environ, env, clear=False):
|
|
277
|
+
from cicaddy_github.config.settings import load_settings
|
|
278
|
+
|
|
279
|
+
settings = load_settings()
|
|
280
|
+
assert settings.google_cloud_project == "my-gcp-project"
|
|
281
|
+
assert settings.anthropic_vertex_project_id == "my-vertex-project"
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# AI Provider Configuration
|
|
2
|
-
|
|
3
|
-
cicaddy-action supports multiple AI providers. This guide covers provider-specific setup.
|
|
4
|
-
|
|
5
|
-
## Gemini
|
|
6
|
-
|
|
7
|
-
```yaml
|
|
8
|
-
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
9
|
-
with:
|
|
10
|
-
ai_provider: gemini
|
|
11
|
-
ai_model: gemini-3-flash-preview
|
|
12
|
-
ai_api_key: ${{ secrets.GEMINI_API_KEY }}
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## OpenAI
|
|
16
|
-
|
|
17
|
-
```yaml
|
|
18
|
-
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
19
|
-
with:
|
|
20
|
-
ai_provider: openai
|
|
21
|
-
ai_model: gpt-4.5
|
|
22
|
-
ai_api_key: ${{ secrets.OPENAI_API_KEY }}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Claude (Anthropic API)
|
|
26
|
-
|
|
27
|
-
```yaml
|
|
28
|
-
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
29
|
-
with:
|
|
30
|
-
ai_provider: claude
|
|
31
|
-
ai_model: claude-sonnet-4-6
|
|
32
|
-
ai_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Claude via Vertex AI (GCP)
|
|
36
|
-
|
|
37
|
-
Uses Google Cloud Workload Identity Federation for keyless authentication — no
|
|
38
|
-
service account JSON keys to manage. This is the recommended approach for GCP.
|
|
39
|
-
|
|
40
|
-
```yaml
|
|
41
|
-
name: PR Review (Vertex AI)
|
|
42
|
-
|
|
43
|
-
on:
|
|
44
|
-
pull_request:
|
|
45
|
-
types: [opened, synchronize]
|
|
46
|
-
|
|
47
|
-
permissions:
|
|
48
|
-
contents: read
|
|
49
|
-
id-token: write # Required for Workload Identity Federation
|
|
50
|
-
pull-requests: write
|
|
51
|
-
|
|
52
|
-
jobs:
|
|
53
|
-
review:
|
|
54
|
-
runs-on: ubuntu-latest
|
|
55
|
-
steps:
|
|
56
|
-
- uses: actions/checkout@v6
|
|
57
|
-
with:
|
|
58
|
-
fetch-depth: 0
|
|
59
|
-
|
|
60
|
-
- uses: google-github-actions/auth@v3
|
|
61
|
-
with:
|
|
62
|
-
workload_identity_provider: 'projects/123/locations/global/workloadIdentityPools/github/providers/my-repo'
|
|
63
|
-
service_account: 'cicaddy@my-project.iam.gserviceaccount.com'
|
|
64
|
-
|
|
65
|
-
- uses: redhat-community-ai-tools/cicaddy-action@main
|
|
66
|
-
with:
|
|
67
|
-
ai_provider: anthropic-vertex
|
|
68
|
-
ai_model: claude-sonnet-4-6
|
|
69
|
-
vertex_project_id: my-project
|
|
70
|
-
task_file: tasks/pr_review.yml
|
|
71
|
-
post_pr_comment: 'true'
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
> **Security**: Prefer Workload Identity Federation (shown above) over service
|
|
75
|
-
> account keys. If you must use a key, store the JSON as a GitHub secret and pass
|
|
76
|
-
> it via `google-github-actions/auth` with `credentials_json`:
|
|
77
|
-
> ```yaml
|
|
78
|
-
> - uses: google-github-actions/auth@v3
|
|
79
|
-
> with:
|
|
80
|
-
> credentials_json: ${{ secrets.GCP_SA_KEY }}
|
|
81
|
-
> ```
|
|
82
|
-
> The auth action sets `GOOGLE_APPLICATION_CREDENTIALS` automatically — never
|
|
83
|
-
> write keys to disk manually or echo them in scripts.
|
|
84
|
-
|
|
85
|
-
## Provider Inputs Reference
|
|
86
|
-
|
|
87
|
-
| Input | Required | Description |
|
|
88
|
-
|-------|----------|-------------|
|
|
89
|
-
| `ai_provider` | Yes | `gemini`, `openai`, `claude`, or `anthropic-vertex` |
|
|
90
|
-
| `ai_model` | Yes | Model identifier |
|
|
91
|
-
| `ai_api_key` | No | API key (not needed for `anthropic-vertex`) |
|
|
92
|
-
| `vertex_project_id` | No | GCP project ID (required for `anthropic-vertex`) |
|
|
93
|
-
| `cloud_ml_region` | No | Vertex AI region (default: `us-east5`) |
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/__init__.py
RENAMED
|
File without changes
|
{cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/agents.py
RENAMED
|
File without changes
|
{cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/analyzer.py
RENAMED
|
File without changes
|
{cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/detector.py
RENAMED
|
File without changes
|
|
File without changes
|
{cicaddy_github-0.6.0 → cicaddy_github-0.7.0}/src/cicaddy_github/github_integration/tools.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|