cicaddy-github 0.7.0__tar.gz → 0.8.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.
Files changed (52) hide show
  1. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/.agents/skills/cicaddy-action/SKILL.md +12 -6
  2. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/.github/workflows/pr-review.yml +7 -2
  3. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/AGENTS.md +6 -2
  4. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/PKG-INFO +122 -26
  5. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/README.md +120 -24
  6. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/action.yml +9 -1
  7. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/docs/delegation.md +1 -1
  8. cicaddy_github-0.8.0/docs/providers.md +269 -0
  9. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/entrypoint.sh +2 -0
  10. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/pyproject.toml +2 -2
  11. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/__init__.py +1 -1
  12. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/config/settings.py +10 -0
  13. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/github_integration/agents.py +194 -4
  14. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/github_integration/analyzer.py +77 -4
  15. cicaddy_github-0.8.0/tests/unit/test_inline_review.py +1369 -0
  16. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/test_settings.py +4 -4
  17. cicaddy_github-0.7.0/docs/providers.md +0 -178
  18. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/.github/dependabot.yml +0 -0
  19. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/.github/workflows/changelog.yml +0 -0
  20. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/.github/workflows/ci.yml +0 -0
  21. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/.github/workflows/release.yml +0 -0
  22. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/.gitignore +0 -0
  23. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/.pre-commit-config.yaml +0 -0
  24. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/CLAUDE.md +0 -0
  25. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/CODE_OF_CONDUCT.md +0 -0
  26. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/CONTRIBUTING.md +0 -0
  27. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/Dockerfile +0 -0
  28. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/LICENSE +0 -0
  29. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/config/__init__.py +0 -0
  30. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/github_integration/__init__.py +0 -0
  31. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/github_integration/detector.py +0 -0
  32. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/github_integration/go_dep_review_tools.py +0 -0
  33. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/github_integration/tools.py +0 -0
  34. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/plugin.py +0 -0
  35. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/security/__init__.py +0 -0
  36. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/security/leak_detector.py +0 -0
  37. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/src/cicaddy_github/validation.py +0 -0
  38. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tasks/changelog_report.yml +0 -0
  39. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tasks/go_dep_impact_review.yml +0 -0
  40. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tasks/pr_review.yml +0 -0
  41. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/templates/report_template.html +0 -0
  42. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/__init__.py +0 -0
  43. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/conftest.py +0 -0
  44. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/__init__.py +0 -0
  45. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/test_agents.py +0 -0
  46. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/test_analyzer.py +0 -0
  47. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/test_detector.py +0 -0
  48. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/test_go_dep_review.py +0 -0
  49. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/test_leak_detector.py +0 -0
  50. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/test_plugin.py +0 -0
  51. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/test_review_delegation_hooks.py +0 -0
  52. {cicaddy_github-0.7.0 → cicaddy_github-0.8.0}/tests/unit/test_tools.py +0 -0
@@ -127,10 +127,12 @@ can reference them as bash variables (`INPUT_AI_PROVIDER`, `INPUT_AI_API_KEY`, e
127
127
  | `task_prompt` | No | Inline task prompt |
128
128
  | `post_pr_comment` | No | Post results as PR comment (default: `false`) |
129
129
  | `submit_review` | No | Submit formal PR review with APPROVE/REQUEST_CHANGES (default: `false`) |
130
+ | `inline_review_comments` | No | Post AI findings as inline comments on PR diff lines (default: `false`) |
130
131
  | `run_govulncheck` | No | Run govulncheck for vulnerability reachability analysis (default: `false`) |
131
132
  | `dep_review_severity_threshold` | No | Minimum semver bump to analyze: `minor` or `major` (default: `minor`) |
132
133
  | `delegation_mode` | No | `none` (default) or `auto` for sub-agent delegation |
133
134
  | `max_sub_agents` | No | Max concurrent sub-agents, 1-10 (default: `3`) |
135
+ | `delegation_verify_findings` | No | Verify sub-agent findings against codebase (default: `false`) |
134
136
  | `github_token` | No | GitHub token (default: `${{ github.token }}`) |
135
137
  | `mcp_servers_config` | No | JSON array of MCP server configs |
136
138
  | `slack_webhook_url` | No | Slack webhook URL |
@@ -196,6 +198,8 @@ github = "cicaddy_github.plugin:validate"
196
198
  - `github_token`, `github_repository`, `github_ref`, `github_event_name`
197
199
  - `github_sha`, `github_run_id`, `github_pr_number`
198
200
  - `post_pr_comment` (bool)
201
+ - `submit_review` (bool)
202
+ - `inline_review_comments` (bool)
199
203
 
200
204
  All loaded from environment variables via `load_settings()`.
201
205
 
@@ -233,10 +237,10 @@ the `safe-to-review` label. The label is auto-removed on new pushes to prevent
233
237
  TOCTOU bypasses.
234
238
 
235
239
  ```yaml
236
- - uses: redhat-community-ai-tools/cicaddy-action@v0.7.0
240
+ - uses: redhat-community-ai-tools/cicaddy-action@v0.8.0
237
241
  with:
238
242
  ai_provider: gemini
239
- ai_model: gemini-3-flash-preview
243
+ ai_model: gemini-3.5-flash
240
244
  ai_api_key: ${{ secrets.AI_API_KEY }}
241
245
  task_file: tasks/pr_review.yml
242
246
  post_pr_comment: 'true'
@@ -252,7 +256,7 @@ file and use `uv run cicaddy run --env-file <file>`.
252
256
  ```bash
253
257
  # AI Provider
254
258
  AI_PROVIDER=gemini
255
- AI_MODEL=gemini-3-flash-preview
259
+ AI_MODEL=gemini-3.5-flash
256
260
  GEMINI_API_KEY=<key>
257
261
 
258
262
  # GitHub Configuration
@@ -329,11 +333,13 @@ cicaddy-action v0.5.0+ supports AI-powered sub-agent delegation via cicaddy>=0.8
329
333
  **Action Inputs:**
330
334
  - `delegation_mode`: `none` (default) or `auto`
331
335
  - `max_sub_agents`: 1-10 (default: `3`)
336
+ - `delegation_verify_findings`: `false` (default) — verify findings against codebase
332
337
 
333
338
  **Environment Variables:**
334
339
  - `DELEGATION_MODE`: `none` or `auto`
335
340
  - `MAX_SUB_AGENTS`: 1-10 (default: `3`)
336
- - `SUB_AGENT_MAX_ITERS`: 1-15 (default: `10`)
341
+ - `SUB_AGENT_MAX_ITERS`: 1-15 (default: `5`)
342
+ - `DELEGATION_VERIFY_FINDINGS`: verify findings against codebase (`true`/`false`)
337
343
  - `DELEGATION_AGENTS_DIR`: `.agents/delegation` (custom agent YAML directory)
338
344
  - `DELEGATION_AGENTS`: JSON array for inline custom agents
339
345
  - `TRIAGE_PROMPT`: Custom triage instructions
@@ -406,7 +412,7 @@ Or inline via `DELEGATION_AGENTS` JSON env var.
406
412
  - uses: redhat-community-ai-tools/cicaddy-action@main
407
413
  with:
408
414
  ai_provider: gemini
409
- ai_model: gemini-3-flash-preview
415
+ ai_model: gemini-3.5-flash
410
416
  ai_api_key: ${{ secrets.AI_API_KEY }}
411
417
  task_file: tasks/pr_review.yml
412
418
  post_pr_comment: 'true'
@@ -419,7 +425,7 @@ Or inline via `DELEGATION_AGENTS` JSON env var.
419
425
  ```bash
420
426
  # .env.my-review
421
427
  AI_PROVIDER=gemini
422
- AI_MODEL=gemini-3-flash-preview
428
+ AI_MODEL=gemini-3.5-flash
423
429
  GEMINI_API_KEY=<key>
424
430
  GITHUB_TOKEN=<token>
425
431
  GITHUB_REPOSITORY=owner/repo
@@ -49,15 +49,20 @@ jobs:
49
49
  fi
50
50
 
51
51
  - name: AI Code Review
52
- uses: redhat-community-ai-tools/cicaddy-action@v0.5.0
52
+ uses: redhat-community-ai-tools/cicaddy-action@v0.8.0
53
53
  id: review
54
54
  with:
55
55
  ai_provider: gemini
56
- ai_model: gemini-3-flash-preview
56
+ ai_model: gemini-3.5-flash
57
57
  ai_api_key: ${{ secrets.AI_API_KEY }}
58
58
  task_file: tasks/pr_review.yml
59
59
  post_pr_comment: 'true'
60
+ # submit_review and inline_review_comments intentionally omitted —
61
+ # this workflow uses pull_request_target for fork PR support, and
62
+ # formal reviews should not be combined with pull_request_target.
63
+ # See docs/providers.md#submit_review-and-fork-pull-requests
60
64
  delegation_mode: auto
65
+ delegation_verify_findings: 'true'
61
66
  mcp_servers_config: ${{ steps.mcp.outputs.config }}
62
67
  env:
63
68
  ANALYSIS_FOCUS: "general"
@@ -102,7 +102,7 @@ The cicaddy-github plugin provides:
102
102
  | `DELEGATION_AGENTS` | (empty) | JSON config for inline custom sub-agent definitions |
103
103
  | `TRIAGE_PROMPT` | (empty) | Custom triage instructions |
104
104
 
105
- Action inputs: `delegation_mode`, `max_sub_agents`
105
+ Action inputs: `delegation_mode`, `max_sub_agents`, `delegation_verify_findings`
106
106
  CLI flags: `--delegation-mode auto --max-sub-agents 2`
107
107
 
108
108
  See cicaddy's [sub-agent delegation docs](https://github.com/waynesun09/cicaddy/blob/main/docs/sub-agent-delegation.md) for built-in agents, custom YAML format, and tool filtering.
@@ -124,12 +124,16 @@ All inputs use **underscores** (not hyphens) for Docker container compatibility:
124
124
  | `task_prompt` | No | Inline task prompt |
125
125
  | `post_pr_comment` | No | Post results as PR comment (default: `false`) |
126
126
  | `submit_review` | No | Submit formal PR review with APPROVE/REQUEST_CHANGES (default: `false`) |
127
+ | `inline_review_comments` | No | Post AI findings as inline comments on PR diff lines (default: `false`) |
127
128
  | `github_token` | No | GitHub token (default: `${{ github.token }}`) |
128
129
  | `mcp_servers_config` | No | JSON array of MCP server configs |
129
130
  | `slack_webhook_url` | No | Slack webhook URL |
130
131
  | `report_template` | No | Custom HTML report template path |
132
+ | `run_govulncheck` | No | Run govulncheck for vulnerability reachability analysis (default: `false`) |
133
+ | `dep_review_severity_threshold` | No | Minimum semver bump to analyze: `minor` or `major` (default: `minor`) |
131
134
  | `delegation_mode` | No | `none` (default) or `auto` for sub-agent delegation |
132
135
  | `max_sub_agents` | No | Max concurrent sub-agents, 1-10 (default: `3`) |
136
+ | `delegation_verify_findings` | No | Verify sub-agent findings against codebase (default: `false`) |
133
137
 
134
138
  *Not required if provider-specific key is set via `env:`.
135
139
 
@@ -179,7 +183,7 @@ Create an env file and use `uv run cicaddy run --env-file <file>`:
179
183
  ```bash
180
184
  # AI Provider
181
185
  AI_PROVIDER=gemini
182
- AI_MODEL=gemini-3-flash-preview
186
+ AI_MODEL=gemini-3.5-flash
183
187
  GEMINI_API_KEY=<key>
184
188
 
185
189
  # GitHub Configuration
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cicaddy-github
3
- Version: 0.7.0
3
+ Version: 0.8.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
7
7
  Project-URL: Issues, https://github.com/redhat-community-ai-tools/cicaddy-action/issues
8
8
  Author: Wayne Sun
9
- License: Apache-2.0
9
+ License-Expression: Apache-2.0
10
10
  License-File: LICENSE
11
11
  Requires-Python: >=3.11
12
12
  Requires-Dist: cicaddy>=0.11.0
@@ -32,6 +32,29 @@ GitHub Action that wraps [cicaddy](https://github.com/waynesun09/cicaddy) for ru
32
32
  - **Secret redaction** via detect-secrets for safe public outputs
33
33
  - **DSPy YAML task definitions** for customizable analysis workflows
34
34
 
35
+ ## Prerequisites
36
+
37
+ The examples below use **Vertex AI with Workload Identity Federation (WIF)**
38
+ for keyless authentication. WIF eliminates static secrets — GitHub mints a
39
+ short-lived OIDC token per workflow run and GCP exchanges it for temporary
40
+ credentials scoped to that job.
41
+
42
+ **One-time GCP setup required:**
43
+
44
+ 1. Create a Workload Identity Pool and OIDC provider
45
+ 2. Create a service account with `roles/aiplatform.user`
46
+ 3. Bind the pool to the service account **scoped to your specific repository**
47
+ (the `--member` flag must use a `principalSet` with `attribute.repository/OWNER/REPO`
48
+ to enforce repository-level isolation)
49
+
50
+ Store the resulting values as GitHub
51
+ [repository variables](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables)
52
+ (`vars.GCP_WIF_PROVIDER`, `vars.GCP_SERVICE_ACCOUNT`, `vars.GCP_PROJECT_ID`).
53
+
54
+ See [docs/providers.md](docs/providers.md) for the full `gcloud` setup
55
+ commands, authentication method comparison (WIF vs SA key vs API key), and
56
+ alternative provider configurations (OpenAI, Claude, standalone Gemini API key).
57
+
35
58
  ## Quick Start
36
59
 
37
60
  ### AI PR Review
@@ -48,28 +71,44 @@ on:
48
71
  pull_request:
49
72
  types: [opened, synchronize]
50
73
 
51
- permissions:
52
- pull-requests: write
53
-
54
74
  jobs:
55
75
  review:
56
76
  runs-on: ubuntu-latest
77
+ permissions:
78
+ contents: read
79
+ id-token: write # Required for Workload Identity Federation
80
+ pull-requests: write
57
81
  steps:
58
82
  - uses: actions/checkout@v6
59
83
  with:
60
84
  fetch-depth: 0
61
85
 
86
+ - uses: google-github-actions/auth@v3
87
+ with:
88
+ workload_identity_provider: ${{ vars.GCP_WIF_PROVIDER }}
89
+ service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}
90
+
62
91
  - uses: redhat-community-ai-tools/cicaddy-action@main
63
92
  with:
64
- ai_provider: gemini
65
- ai_model: gemini-3-flash-preview
66
- ai_api_key: ${{ secrets.AI_API_KEY }}
93
+ ai_provider: gemini-vertex
94
+ ai_model: gemini-3.5-flash
95
+ google_cloud_project: ${{ vars.GCP_PROJECT_ID }}
67
96
  task_file: tasks/pr_review.yml
68
97
  post_pr_comment: 'true'
69
- env:
70
- DELEGATION_MODE: auto
98
+ submit_review: 'true'
99
+ inline_review_comments: 'true'
100
+ delegation_mode: auto
101
+ delegation_verify_findings: 'true'
71
102
  ```
72
103
 
104
+ > **Fork PRs**: The `pull_request` event cannot mint OIDC tokens for PRs
105
+ > from forks, so WIF authentication will fail. To support fork PRs, use
106
+ > `pull_request_target` with a label gate (e.g. `safe-to-review`) to
107
+ > prevent unauthorized code execution. See
108
+ > `.github/workflows/pr-review.yml` for an example and
109
+ > [docs/providers.md](docs/providers.md#submit_review-and-fork-pull-requests)
110
+ > for security details.
111
+
73
112
  > **Sub-Agent Delegation**: When `DELEGATION_MODE` is set to `auto`, the agent uses AI-powered triage to analyze the PR diff and spawns specialized sub-agents in parallel (e.g., code quality, security, performance). Each sub-agent runs with a focused scope and reduced token budget, and their results are aggregated into a single unified review. This produces deeper, more structured reviews compared to single-agent mode. Set `DELEGATION_MODE` to `none` to use a single agent instead. See [docs/delegation.md](docs/delegation.md) for details.
74
113
 
75
114
  ### Changelog Report on Release
@@ -84,16 +123,24 @@ on:
84
123
  jobs:
85
124
  changelog:
86
125
  runs-on: ubuntu-latest
126
+ permissions:
127
+ contents: read
128
+ id-token: write # Required for Workload Identity Federation
87
129
  steps:
88
130
  - uses: actions/checkout@v6
89
131
  with:
90
132
  fetch-depth: 0
91
133
 
134
+ - uses: google-github-actions/auth@v3
135
+ with:
136
+ workload_identity_provider: ${{ vars.GCP_WIF_PROVIDER }}
137
+ service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}
138
+
92
139
  - uses: redhat-community-ai-tools/cicaddy-action@main
93
140
  with:
94
- ai_provider: gemini
95
- ai_model: gemini-3-flash-preview
96
- ai_api_key: ${{ secrets.AI_API_KEY }}
141
+ ai_provider: gemini-vertex
142
+ ai_model: gemini-3.5-flash
143
+ google_cloud_project: ${{ vars.GCP_PROJECT_ID }}
97
144
  task_file: tasks/changelog_report.yml
98
145
  ```
99
146
 
@@ -114,23 +161,29 @@ on:
114
161
  - 'go.mod'
115
162
  - 'go.sum'
116
163
 
117
- permissions:
118
- contents: read
119
- pull-requests: write
120
-
121
164
  jobs:
122
165
  dep-review:
123
166
  runs-on: ubuntu-latest
167
+ permissions:
168
+ contents: read
169
+ id-token: write # Required for Workload Identity Federation
170
+ pull-requests: write
124
171
  steps:
125
172
  - uses: actions/checkout@v6
126
173
  - uses: actions/setup-go@v6
127
174
  with:
128
175
  go-version: '1.22'
176
+
177
+ - uses: google-github-actions/auth@v3
178
+ with:
179
+ workload_identity_provider: ${{ vars.GCP_WIF_PROVIDER }}
180
+ service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}
181
+
129
182
  - uses: redhat-community-ai-tools/cicaddy-action@main
130
183
  with:
131
- ai_provider: gemini
132
- ai_model: gemini-3-flash-preview
133
- ai_api_key: ${{ secrets.AI_API_KEY }}
184
+ ai_provider: gemini-vertex
185
+ ai_model: gemini-3.5-flash
186
+ google_cloud_project: ${{ vars.GCP_PROJECT_ID }}
134
187
  task_file: tasks/go_dep_impact_review.yml
135
188
  post_pr_comment: 'true'
136
189
  run_govulncheck: 'true'
@@ -143,7 +196,9 @@ agent instead of the default PR code review agent. The `run_govulncheck`
143
196
  input enables vulnerability reachability analysis (requires Go and
144
197
  govulncheck installed in the runner).
145
198
 
146
- See [docs/providers.md](docs/providers.md) for provider-specific configuration including Claude via Vertex AI (GCP), OpenAI, and Anthropic API setup.
199
+ See [docs/providers.md](docs/providers.md) for the full WIF setup guide,
200
+ alternative providers (OpenAI, Claude, standalone Gemini API key), the
201
+ SA key fallback, and an authentication method comparison table.
147
202
 
148
203
  ## Inputs
149
204
 
@@ -162,12 +217,42 @@ See [docs/providers.md](docs/providers.md) for provider-specific configuration i
162
217
  | `slack_webhook_url` | No | Slack webhook URL for notifications |
163
218
  | `post_pr_comment` | No | Post results as PR comment (default: `false`) |
164
219
  | `submit_review` | No | Submit formal PR review with APPROVE/REQUEST_CHANGES (default: `false`) |
220
+ | `inline_review_comments` | No | Post AI findings as inline comments on PR diff lines (default: `false`) |
165
221
  | `run_govulncheck` | No | Run govulncheck for vulnerability reachability analysis (default: `false`) |
166
222
  | `dep_review_severity_threshold` | No | Minimum semver bump to analyze: `minor` or `major` (default: `minor`) |
167
223
  | `delegation_mode` | No | Enable AI-powered sub-agent delegation: `none` (default) or `auto` |
168
224
  | `max_sub_agents` | No | Maximum concurrent sub-agents, 1-10 (default: `3`) |
225
+ | `delegation_verify_findings` | No | Verify sub-agent findings against codebase to reduce false positives (default: `false`) |
169
226
  | `github_token` | No | GitHub token (default: `${{ github.token }}`) |
170
227
 
228
+ ### Review Output Options
229
+
230
+ The action supports three independent review output options that control how results appear on a PR. All three default to `false` and can be combined:
231
+
232
+ | Option | What it does |
233
+ |--------|-------------|
234
+ | `post_pr_comment` | Posts (or updates) a bot comment on the PR with the full review summary. On subsequent runs the same comment is updated in place. |
235
+ | `submit_review` | Submits a formal GitHub review (APPROVE / REQUEST_CHANGES / COMMENT) based on the AI analysis. |
236
+ | `inline_review_comments` | Attaches AI findings as inline comments on the exact diff lines. Requires `submit_review: 'true'` since inline comments are part of the GitHub review. |
237
+
238
+ **Recommended combinations:**
239
+
240
+ ```yaml
241
+ # Summary comment only (simplest)
242
+ post_pr_comment: 'true'
243
+
244
+ # Summary comment + inline diff comments (recommended for most teams)
245
+ post_pr_comment: 'true'
246
+ submit_review: 'true'
247
+ inline_review_comments: 'true'
248
+
249
+ # Formal review with inline comments, no standalone comment
250
+ submit_review: 'true'
251
+ inline_review_comments: 'true'
252
+ ```
253
+
254
+ > **Note:** `inline_review_comments` works best with `submit_review: 'true'` and `delegation_mode: auto`. Delegation produces structured findings with file/line info that inline comments need. Without `submit_review`, inline comments are posted as a `COMMENT` review (no approval/rejection verdict).
255
+
171
256
  ## Outputs
172
257
 
173
258
  | Output | Description |
@@ -199,10 +284,16 @@ uv pip install -e ".[test]"
199
284
  **2. Create an env file** (e.g. `.env.my-review`):
200
285
 
201
286
  ```bash
202
- # AI Provider
203
- AI_PROVIDER=gemini
204
- AI_MODEL=gemini-3-flash-preview
205
- GEMINI_API_KEY=<your-gemini-api-key>
287
+ # AI Provider (Gemini via Vertex AI — uses Google Cloud ADC, no API key needed)
288
+ AI_PROVIDER=gemini-vertex
289
+ AI_MODEL=gemini-3.5-flash
290
+ GOOGLE_CLOUD_PROJECT=your-gcp-project
291
+ # GOOGLE_CLOUD_LOCATION=global # optional, defaults to "global"
292
+
293
+ # AI Provider (standalone Gemini API key — alternative to Vertex AI)
294
+ # AI_PROVIDER=gemini
295
+ # AI_MODEL=gemini-3.5-flash
296
+ # GEMINI_API_KEY=<your-gemini-api-key>
206
297
 
207
298
  # GitHub Configuration
208
299
  GITHUB_TOKEN=<your-github-token>
@@ -212,6 +303,8 @@ GITHUB_PR_NUMBER=42
212
303
 
213
304
  # Agent Settings
214
305
  POST_PR_COMMENT=true
306
+ SUBMIT_REVIEW=true
307
+ INLINE_REVIEW_COMMENTS=true
215
308
  ENABLE_LOCAL_TOOLS=true
216
309
  LOCAL_TOOLS_WORKING_DIR=.
217
310
 
@@ -257,7 +350,7 @@ uv run cicaddy validate --env-file .env.my-review
257
350
  | Variable | Required | Description |
258
351
  |----------|----------|-------------|
259
352
  | `AI_PROVIDER` | Yes | `gemini`, `openai`, `claude`, `anthropic-vertex`, or `gemini-vertex` |
260
- | `AI_MODEL` | Yes | Model identifier (e.g. `gemini-3-flash-preview`) |
353
+ | `AI_MODEL` | Yes | Model identifier (e.g. `gemini-3.5-flash`) |
261
354
  | `GEMINI_API_KEY` / `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` | Yes* | API key matching the provider (*not needed for `anthropic-vertex` or `gemini-vertex`) |
262
355
  | `ANTHROPIC_VERTEX_PROJECT_ID` | No | GCP project ID (required for `anthropic-vertex`, falls back to `GOOGLE_CLOUD_PROJECT`) |
263
356
  | `GOOGLE_CLOUD_PROJECT` | No | GCP project ID for Vertex AI (required for `gemini-vertex`) |
@@ -267,9 +360,12 @@ uv run cicaddy validate --env-file .env.my-review
267
360
  | `GITHUB_EVENT_NAME` | No | Set to `pull_request` for auto-detection (optional if `GITHUB_PR_NUMBER` is set) |
268
361
  | `GITHUB_PR_NUMBER` | Yes | PR number to review |
269
362
  | `POST_PR_COMMENT` | No | Post results as PR comment (`true`/`false`) |
363
+ | `SUBMIT_REVIEW` | No | Submit formal PR review with APPROVE/REQUEST_CHANGES (`true`/`false`) |
364
+ | `INLINE_REVIEW_COMMENTS` | No | Post AI findings as inline comments on PR diff lines (`true`/`false`) |
270
365
  | `AGENT_TASKS` | No | Agent task type (e.g. `go_dep_review` for Go dependency analysis) |
271
366
  | `DELEGATION_MODE` | No | `auto` for AI-powered sub-agent delegation, `none` for single-agent (default: `none`) |
272
367
  | `MAX_SUB_AGENTS` | No | Max concurrent sub-agents for delegation, 1-10 (default: `3`) |
368
+ | `DELEGATION_VERIFY_FINDINGS` | No | Verify sub-agent findings against codebase to reduce false positives (`true`/`false`) |
273
369
  | `SUB_AGENT_MAX_ITERS` | No | Max iterations per sub-agent, 1-15 (default: `5`) |
274
370
  | `AI_TASK_FILE` | No | Path to DSPy YAML task file for custom workflows |
275
371
  | `RUN_GOVULNCHECK` | No | Run govulncheck for reachability analysis (`true`/`false`) |
@@ -12,6 +12,29 @@ GitHub Action that wraps [cicaddy](https://github.com/waynesun09/cicaddy) for ru
12
12
  - **Secret redaction** via detect-secrets for safe public outputs
13
13
  - **DSPy YAML task definitions** for customizable analysis workflows
14
14
 
15
+ ## Prerequisites
16
+
17
+ The examples below use **Vertex AI with Workload Identity Federation (WIF)**
18
+ for keyless authentication. WIF eliminates static secrets — GitHub mints a
19
+ short-lived OIDC token per workflow run and GCP exchanges it for temporary
20
+ credentials scoped to that job.
21
+
22
+ **One-time GCP setup required:**
23
+
24
+ 1. Create a Workload Identity Pool and OIDC provider
25
+ 2. Create a service account with `roles/aiplatform.user`
26
+ 3. Bind the pool to the service account **scoped to your specific repository**
27
+ (the `--member` flag must use a `principalSet` with `attribute.repository/OWNER/REPO`
28
+ to enforce repository-level isolation)
29
+
30
+ Store the resulting values as GitHub
31
+ [repository variables](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables)
32
+ (`vars.GCP_WIF_PROVIDER`, `vars.GCP_SERVICE_ACCOUNT`, `vars.GCP_PROJECT_ID`).
33
+
34
+ See [docs/providers.md](docs/providers.md) for the full `gcloud` setup
35
+ commands, authentication method comparison (WIF vs SA key vs API key), and
36
+ alternative provider configurations (OpenAI, Claude, standalone Gemini API key).
37
+
15
38
  ## Quick Start
16
39
 
17
40
  ### AI PR Review
@@ -28,28 +51,44 @@ on:
28
51
  pull_request:
29
52
  types: [opened, synchronize]
30
53
 
31
- permissions:
32
- pull-requests: write
33
-
34
54
  jobs:
35
55
  review:
36
56
  runs-on: ubuntu-latest
57
+ permissions:
58
+ contents: read
59
+ id-token: write # Required for Workload Identity Federation
60
+ pull-requests: write
37
61
  steps:
38
62
  - uses: actions/checkout@v6
39
63
  with:
40
64
  fetch-depth: 0
41
65
 
66
+ - uses: google-github-actions/auth@v3
67
+ with:
68
+ workload_identity_provider: ${{ vars.GCP_WIF_PROVIDER }}
69
+ service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}
70
+
42
71
  - uses: redhat-community-ai-tools/cicaddy-action@main
43
72
  with:
44
- ai_provider: gemini
45
- ai_model: gemini-3-flash-preview
46
- ai_api_key: ${{ secrets.AI_API_KEY }}
73
+ ai_provider: gemini-vertex
74
+ ai_model: gemini-3.5-flash
75
+ google_cloud_project: ${{ vars.GCP_PROJECT_ID }}
47
76
  task_file: tasks/pr_review.yml
48
77
  post_pr_comment: 'true'
49
- env:
50
- DELEGATION_MODE: auto
78
+ submit_review: 'true'
79
+ inline_review_comments: 'true'
80
+ delegation_mode: auto
81
+ delegation_verify_findings: 'true'
51
82
  ```
52
83
 
84
+ > **Fork PRs**: The `pull_request` event cannot mint OIDC tokens for PRs
85
+ > from forks, so WIF authentication will fail. To support fork PRs, use
86
+ > `pull_request_target` with a label gate (e.g. `safe-to-review`) to
87
+ > prevent unauthorized code execution. See
88
+ > `.github/workflows/pr-review.yml` for an example and
89
+ > [docs/providers.md](docs/providers.md#submit_review-and-fork-pull-requests)
90
+ > for security details.
91
+
53
92
  > **Sub-Agent Delegation**: When `DELEGATION_MODE` is set to `auto`, the agent uses AI-powered triage to analyze the PR diff and spawns specialized sub-agents in parallel (e.g., code quality, security, performance). Each sub-agent runs with a focused scope and reduced token budget, and their results are aggregated into a single unified review. This produces deeper, more structured reviews compared to single-agent mode. Set `DELEGATION_MODE` to `none` to use a single agent instead. See [docs/delegation.md](docs/delegation.md) for details.
54
93
 
55
94
  ### Changelog Report on Release
@@ -64,16 +103,24 @@ on:
64
103
  jobs:
65
104
  changelog:
66
105
  runs-on: ubuntu-latest
106
+ permissions:
107
+ contents: read
108
+ id-token: write # Required for Workload Identity Federation
67
109
  steps:
68
110
  - uses: actions/checkout@v6
69
111
  with:
70
112
  fetch-depth: 0
71
113
 
114
+ - uses: google-github-actions/auth@v3
115
+ with:
116
+ workload_identity_provider: ${{ vars.GCP_WIF_PROVIDER }}
117
+ service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}
118
+
72
119
  - uses: redhat-community-ai-tools/cicaddy-action@main
73
120
  with:
74
- ai_provider: gemini
75
- ai_model: gemini-3-flash-preview
76
- ai_api_key: ${{ secrets.AI_API_KEY }}
121
+ ai_provider: gemini-vertex
122
+ ai_model: gemini-3.5-flash
123
+ google_cloud_project: ${{ vars.GCP_PROJECT_ID }}
77
124
  task_file: tasks/changelog_report.yml
78
125
  ```
79
126
 
@@ -94,23 +141,29 @@ on:
94
141
  - 'go.mod'
95
142
  - 'go.sum'
96
143
 
97
- permissions:
98
- contents: read
99
- pull-requests: write
100
-
101
144
  jobs:
102
145
  dep-review:
103
146
  runs-on: ubuntu-latest
147
+ permissions:
148
+ contents: read
149
+ id-token: write # Required for Workload Identity Federation
150
+ pull-requests: write
104
151
  steps:
105
152
  - uses: actions/checkout@v6
106
153
  - uses: actions/setup-go@v6
107
154
  with:
108
155
  go-version: '1.22'
156
+
157
+ - uses: google-github-actions/auth@v3
158
+ with:
159
+ workload_identity_provider: ${{ vars.GCP_WIF_PROVIDER }}
160
+ service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}
161
+
109
162
  - uses: redhat-community-ai-tools/cicaddy-action@main
110
163
  with:
111
- ai_provider: gemini
112
- ai_model: gemini-3-flash-preview
113
- ai_api_key: ${{ secrets.AI_API_KEY }}
164
+ ai_provider: gemini-vertex
165
+ ai_model: gemini-3.5-flash
166
+ google_cloud_project: ${{ vars.GCP_PROJECT_ID }}
114
167
  task_file: tasks/go_dep_impact_review.yml
115
168
  post_pr_comment: 'true'
116
169
  run_govulncheck: 'true'
@@ -123,7 +176,9 @@ agent instead of the default PR code review agent. The `run_govulncheck`
123
176
  input enables vulnerability reachability analysis (requires Go and
124
177
  govulncheck installed in the runner).
125
178
 
126
- See [docs/providers.md](docs/providers.md) for provider-specific configuration including Claude via Vertex AI (GCP), OpenAI, and Anthropic API setup.
179
+ See [docs/providers.md](docs/providers.md) for the full WIF setup guide,
180
+ alternative providers (OpenAI, Claude, standalone Gemini API key), the
181
+ SA key fallback, and an authentication method comparison table.
127
182
 
128
183
  ## Inputs
129
184
 
@@ -142,12 +197,42 @@ See [docs/providers.md](docs/providers.md) for provider-specific configuration i
142
197
  | `slack_webhook_url` | No | Slack webhook URL for notifications |
143
198
  | `post_pr_comment` | No | Post results as PR comment (default: `false`) |
144
199
  | `submit_review` | No | Submit formal PR review with APPROVE/REQUEST_CHANGES (default: `false`) |
200
+ | `inline_review_comments` | No | Post AI findings as inline comments on PR diff lines (default: `false`) |
145
201
  | `run_govulncheck` | No | Run govulncheck for vulnerability reachability analysis (default: `false`) |
146
202
  | `dep_review_severity_threshold` | No | Minimum semver bump to analyze: `minor` or `major` (default: `minor`) |
147
203
  | `delegation_mode` | No | Enable AI-powered sub-agent delegation: `none` (default) or `auto` |
148
204
  | `max_sub_agents` | No | Maximum concurrent sub-agents, 1-10 (default: `3`) |
205
+ | `delegation_verify_findings` | No | Verify sub-agent findings against codebase to reduce false positives (default: `false`) |
149
206
  | `github_token` | No | GitHub token (default: `${{ github.token }}`) |
150
207
 
208
+ ### Review Output Options
209
+
210
+ The action supports three independent review output options that control how results appear on a PR. All three default to `false` and can be combined:
211
+
212
+ | Option | What it does |
213
+ |--------|-------------|
214
+ | `post_pr_comment` | Posts (or updates) a bot comment on the PR with the full review summary. On subsequent runs the same comment is updated in place. |
215
+ | `submit_review` | Submits a formal GitHub review (APPROVE / REQUEST_CHANGES / COMMENT) based on the AI analysis. |
216
+ | `inline_review_comments` | Attaches AI findings as inline comments on the exact diff lines. Requires `submit_review: 'true'` since inline comments are part of the GitHub review. |
217
+
218
+ **Recommended combinations:**
219
+
220
+ ```yaml
221
+ # Summary comment only (simplest)
222
+ post_pr_comment: 'true'
223
+
224
+ # Summary comment + inline diff comments (recommended for most teams)
225
+ post_pr_comment: 'true'
226
+ submit_review: 'true'
227
+ inline_review_comments: 'true'
228
+
229
+ # Formal review with inline comments, no standalone comment
230
+ submit_review: 'true'
231
+ inline_review_comments: 'true'
232
+ ```
233
+
234
+ > **Note:** `inline_review_comments` works best with `submit_review: 'true'` and `delegation_mode: auto`. Delegation produces structured findings with file/line info that inline comments need. Without `submit_review`, inline comments are posted as a `COMMENT` review (no approval/rejection verdict).
235
+
151
236
  ## Outputs
152
237
 
153
238
  | Output | Description |
@@ -179,10 +264,16 @@ uv pip install -e ".[test]"
179
264
  **2. Create an env file** (e.g. `.env.my-review`):
180
265
 
181
266
  ```bash
182
- # AI Provider
183
- AI_PROVIDER=gemini
184
- AI_MODEL=gemini-3-flash-preview
185
- GEMINI_API_KEY=<your-gemini-api-key>
267
+ # AI Provider (Gemini via Vertex AI — uses Google Cloud ADC, no API key needed)
268
+ AI_PROVIDER=gemini-vertex
269
+ AI_MODEL=gemini-3.5-flash
270
+ GOOGLE_CLOUD_PROJECT=your-gcp-project
271
+ # GOOGLE_CLOUD_LOCATION=global # optional, defaults to "global"
272
+
273
+ # AI Provider (standalone Gemini API key — alternative to Vertex AI)
274
+ # AI_PROVIDER=gemini
275
+ # AI_MODEL=gemini-3.5-flash
276
+ # GEMINI_API_KEY=<your-gemini-api-key>
186
277
 
187
278
  # GitHub Configuration
188
279
  GITHUB_TOKEN=<your-github-token>
@@ -192,6 +283,8 @@ GITHUB_PR_NUMBER=42
192
283
 
193
284
  # Agent Settings
194
285
  POST_PR_COMMENT=true
286
+ SUBMIT_REVIEW=true
287
+ INLINE_REVIEW_COMMENTS=true
195
288
  ENABLE_LOCAL_TOOLS=true
196
289
  LOCAL_TOOLS_WORKING_DIR=.
197
290
 
@@ -237,7 +330,7 @@ uv run cicaddy validate --env-file .env.my-review
237
330
  | Variable | Required | Description |
238
331
  |----------|----------|-------------|
239
332
  | `AI_PROVIDER` | Yes | `gemini`, `openai`, `claude`, `anthropic-vertex`, or `gemini-vertex` |
240
- | `AI_MODEL` | Yes | Model identifier (e.g. `gemini-3-flash-preview`) |
333
+ | `AI_MODEL` | Yes | Model identifier (e.g. `gemini-3.5-flash`) |
241
334
  | `GEMINI_API_KEY` / `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` | Yes* | API key matching the provider (*not needed for `anthropic-vertex` or `gemini-vertex`) |
242
335
  | `ANTHROPIC_VERTEX_PROJECT_ID` | No | GCP project ID (required for `anthropic-vertex`, falls back to `GOOGLE_CLOUD_PROJECT`) |
243
336
  | `GOOGLE_CLOUD_PROJECT` | No | GCP project ID for Vertex AI (required for `gemini-vertex`) |
@@ -247,9 +340,12 @@ uv run cicaddy validate --env-file .env.my-review
247
340
  | `GITHUB_EVENT_NAME` | No | Set to `pull_request` for auto-detection (optional if `GITHUB_PR_NUMBER` is set) |
248
341
  | `GITHUB_PR_NUMBER` | Yes | PR number to review |
249
342
  | `POST_PR_COMMENT` | No | Post results as PR comment (`true`/`false`) |
343
+ | `SUBMIT_REVIEW` | No | Submit formal PR review with APPROVE/REQUEST_CHANGES (`true`/`false`) |
344
+ | `INLINE_REVIEW_COMMENTS` | No | Post AI findings as inline comments on PR diff lines (`true`/`false`) |
250
345
  | `AGENT_TASKS` | No | Agent task type (e.g. `go_dep_review` for Go dependency analysis) |
251
346
  | `DELEGATION_MODE` | No | `auto` for AI-powered sub-agent delegation, `none` for single-agent (default: `none`) |
252
347
  | `MAX_SUB_AGENTS` | No | Max concurrent sub-agents for delegation, 1-10 (default: `3`) |
348
+ | `DELEGATION_VERIFY_FINDINGS` | No | Verify sub-agent findings against codebase to reduce false positives (`true`/`false`) |
253
349
  | `SUB_AGENT_MAX_ITERS` | No | Max iterations per sub-agent, 1-15 (default: `5`) |
254
350
  | `AI_TASK_FILE` | No | Path to DSPy YAML task file for custom workflows |
255
351
  | `RUN_GOVULNCHECK` | No | Run govulncheck for reachability analysis (`true`/`false`) |