bubo 0.19.0__py3-none-any.whl

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 (50) hide show
  1. bubo/__init__.py +5 -0
  2. bubo/_assets/bubo.cron +36 -0
  3. bubo/_assets/bubo.service +45 -0
  4. bubo/_assets/bubo.timer +23 -0
  5. bubo/_assets/claude-settings.json +153 -0
  6. bubo/_assets/codex-config.toml +368 -0
  7. bubo/_assets/env.example.toml +610 -0
  8. bubo/_assets/plugins/superpowers/.codex-plugin/plugin.json +47 -0
  9. bubo/_assets/prompts/00-meta.md +170 -0
  10. bubo/_assets/skills/code-reviewer/SKILL.md +45 -0
  11. bubo/_http.py +101 -0
  12. bubo/cli.py +640 -0
  13. bubo/config_values.py +200 -0
  14. bubo/db.py +1714 -0
  15. bubo/env_config.py +277 -0
  16. bubo/events.py +50 -0
  17. bubo/findings.py +455 -0
  18. bubo/github.py +486 -0
  19. bubo/gitlab.py +240 -0
  20. bubo/governance_config.py +188 -0
  21. bubo/governance_policy.py +166 -0
  22. bubo/hash_utils.py +54 -0
  23. bubo/mcp.py +150 -0
  24. bubo/mcp_server.py +595 -0
  25. bubo/outcome_classifier.py +179 -0
  26. bubo/paths.py +79 -0
  27. bubo/poller.py +1775 -0
  28. bubo/prompt.py +57 -0
  29. bubo/provenance.py +173 -0
  30. bubo/report.py +375 -0
  31. bubo/review_config.py +421 -0
  32. bubo/scm/__init__.py +37 -0
  33. bubo/scm/base.py +248 -0
  34. bubo/scm/github.py +244 -0
  35. bubo/scm/gitlab.py +161 -0
  36. bubo/secrets.py +60 -0
  37. bubo/signals.py +71 -0
  38. bubo/statuses.py +75 -0
  39. bubo/subproc.py +86 -0
  40. bubo/telemetry/__init__.py +14 -0
  41. bubo/telemetry/config.py +76 -0
  42. bubo/telemetry/cost.py +74 -0
  43. bubo/telemetry/metrics.py +322 -0
  44. bubo/types.py +18 -0
  45. bubo/verification.py +279 -0
  46. bubo-0.19.0.dist-info/METADATA +198 -0
  47. bubo-0.19.0.dist-info/RECORD +50 -0
  48. bubo-0.19.0.dist-info/WHEEL +4 -0
  49. bubo-0.19.0.dist-info/entry_points.txt +4 -0
  50. bubo-0.19.0.dist-info/licenses/LICENSE +21 -0
bubo/__init__.py ADDED
@@ -0,0 +1,5 @@
1
+ """LLM code review poller package."""
2
+
3
+ __all__ = ["__version__"]
4
+
5
+ __version__ = "0.19.0"
bubo/_assets/bubo.cron ADDED
@@ -0,0 +1,36 @@
1
+ # Example cron(8) entry for the bubo poller.
2
+ #
3
+ # Copy or symlink the relevant lines into /etc/cron.d/bubo (root) or
4
+ # `crontab -e` (per-user) and adjust BUBO_ROOT to your install
5
+ # path. Each `bubo-poller` invocation is a single poll cycle that
6
+ # exits — there is no daemon mode.
7
+ #
8
+ # The poller forks per-MR workers in detached sessions; the parent exits as
9
+ # soon as the work is queued, so a tight cron interval is safe. The
10
+ # in-flight backpressure inside poll() prevents overlapping cycles from
11
+ # stacking up if a worker stalls.
12
+ #
13
+ # Each role uses a SEPARATE flock file. Do NOT collapse them into one
14
+ # shared lock: at the :45 mark both `*/15` poll and `*/5` health probe
15
+ # fire on the same minute, and a shared lock would cause one to silently
16
+ # skip — usually the slower poll loses to the fast-acquiring health.
17
+ # `flock -n` returns immediately when the lock is held, so overlapping
18
+ # runs of the SAME role drop the duplicate rather than queue up.
19
+ #
20
+ # Schedule columns: minute hour dom month dow
21
+
22
+ BUBO_ROOT={{ROOT}}
23
+ BUBO_LOCK_DIR=/var/run/bubo
24
+ PATH=/usr/local/bin:/usr/bin:/bin
25
+
26
+ # Poll every 15 minutes.
27
+ */15 * * * * bubo flock -n $BUBO_LOCK_DIR/poller.lock $BUBO_ROOT/bin/bubo poll >> $BUBO_ROOT/var/log/poller.log 2>&1
28
+
29
+ # Outcome sync hourly — checks GitLab discussion state for posted findings.
30
+ 17 * * * * bubo flock -n $BUBO_LOCK_DIR/outcome-sync.lock $BUBO_ROOT/bin/bubo poll --sync-outcomes >> $BUBO_ROOT/var/log/outcome-sync.log 2>&1
31
+
32
+ # Health probe every 5 minutes — non-zero exit triggers your alerting MTA.
33
+ */5 * * * * bubo flock -n $BUBO_LOCK_DIR/health.lock $BUBO_ROOT/bin/bubo poll --health >> $BUBO_ROOT/var/log/health.log 2>&1
34
+
35
+ # Before installing, create the lock dir owned by the runtime user:
36
+ # sudo install -d -o bubo -g bubo -m 0755 /var/run/bubo
@@ -0,0 +1,45 @@
1
+ # systemd unit for one poll cycle. Pair with `bubo.timer` for
2
+ # scheduling. Copy to /etc/systemd/system/ and `systemctl daemon-reload`.
3
+ #
4
+ # The service is Type=oneshot: each timer firing runs one poll cycle and
5
+ # exits. SIGTERM is handled cooperatively — the poll loop drains the
6
+ # current MR batch and exits cleanly.
7
+
8
+ [Unit]
9
+ Description=LLM Reviewer poll cycle
10
+ After=network-online.target
11
+ Wants=network-online.target
12
+
13
+ [Service]
14
+ Type=oneshot
15
+ User=bubo
16
+ Group=bubo
17
+
18
+ # Adjust to your install path.
19
+ Environment=BUBO_ROOT={{ROOT}}
20
+
21
+ # Inject secrets through systemd credentials rather than baking them into
22
+ # config/env.toml. Reference them in TOML via `${VAR}` interpolation:
23
+ #
24
+ # [gitlab]
25
+ # token = "${GITLAB_TOKEN}"
26
+ #
27
+ # Set the credential files in /etc/bubo/credentials/ with mode 0400.
28
+ LoadCredential=GITLAB_TOKEN:/etc/bubo/credentials/gitlab-token
29
+ LoadCredential=LLM_API_KEY:/etc/bubo/credentials/llm-api-key
30
+ Environment=GITLAB_TOKEN=%d/GITLAB_TOKEN
31
+ Environment=LLM_API_KEY=%d/LLM_API_KEY
32
+
33
+ ExecStart={{ROOT}}/bin/bubo poll
34
+ TimeoutStopSec=120s
35
+
36
+ # Hardening — the poller does not need root or write access outside its
37
+ # state directory.
38
+ NoNewPrivileges=true
39
+ ProtectSystem=strict
40
+ ProtectHome=read-only
41
+ PrivateTmp=true
42
+ ReadWritePaths={{ROOT}}/var
43
+
44
+ [Install]
45
+ WantedBy=multi-user.target
@@ -0,0 +1,23 @@
1
+ # systemd timer that fires the poll cycle defined in
2
+ # `bubo.service`. Copy to /etc/systemd/system/ and:
3
+ #
4
+ # systemctl daemon-reload
5
+ # systemctl enable --now bubo.timer
6
+ #
7
+ # Pair with `bubo-outcome-sync.timer` (separate file) for periodic
8
+ # outcome sync; or put `OnCalendar=*:17` etc. on a `Type=oneshot --sync-outcomes`
9
+ # service in a sibling unit.
10
+
11
+ [Unit]
12
+ Description=Run the LLM Reviewer poll cycle every 15 minutes
13
+ Requires=bubo.service
14
+
15
+ [Timer]
16
+ OnBootSec=2min
17
+ OnUnitActiveSec=15min
18
+ AccuracySec=30s
19
+ Unit=bubo.service
20
+ Persistent=true
21
+
22
+ [Install]
23
+ WantedBy=timers.target
@@ -0,0 +1,153 @@
1
+ {
2
+ "extraKnownMarketplaces": {
3
+ "llm-code-review": {
4
+ "source": {
5
+ "source": "directory",
6
+ "path": "{{ROOT}}"
7
+ }
8
+ }
9
+ },
10
+ "enabledPlugins": {
11
+ "superpowers@llm-code-review": true
12
+ },
13
+ "permissions": {
14
+ "allow": [
15
+ "mcp__git__git_status",
16
+ "mcp__git__git_diff_unstaged",
17
+ "mcp__git__git_diff_staged",
18
+ "mcp__git__git_diff",
19
+ "mcp__git__git_log",
20
+ "mcp__git__git_show",
21
+ "mcp__git__git_branch",
22
+ "mcp__gitlab__discover_tools",
23
+ "mcp__gitlab__health_check",
24
+ "mcp__gitlab__search_repositories",
25
+ "mcp__gitlab__search_code",
26
+ "mcp__gitlab__search_project_code",
27
+ "mcp__gitlab__search_group_code",
28
+ "mcp__gitlab__execute_graphql",
29
+ "mcp__gitlab__get_file_contents",
30
+ "mcp__gitlab__get_merge_request",
31
+ "mcp__gitlab__get_merge_request_diffs",
32
+ "mcp__gitlab__list_merge_request_changed_files",
33
+ "mcp__gitlab__list_merge_request_diffs",
34
+ "mcp__gitlab__get_merge_request_file_diff",
35
+ "mcp__gitlab__list_merge_request_versions",
36
+ "mcp__gitlab__get_merge_request_version",
37
+ "mcp__gitlab__get_branch",
38
+ "mcp__gitlab__list_branches",
39
+ "mcp__gitlab__get_branch_diffs",
40
+ "mcp__gitlab__list_merge_request_pipelines",
41
+ "mcp__gitlab__get_merge_request_note",
42
+ "mcp__gitlab__get_merge_request_notes",
43
+ "mcp__gitlab__get_draft_note",
44
+ "mcp__gitlab__list_draft_notes",
45
+ "mcp__gitlab__mr_discussions",
46
+ "mcp__gitlab__list_issues",
47
+ "mcp__gitlab__list_todos",
48
+ "mcp__gitlab__my_issues",
49
+ "mcp__gitlab__list_merge_requests",
50
+ "mcp__gitlab__get_issue",
51
+ "mcp__gitlab__list_issue_links",
52
+ "mcp__gitlab__list_issue_discussions",
53
+ "mcp__gitlab__get_issue_link",
54
+ "mcp__gitlab__list_namespaces",
55
+ "mcp__gitlab__get_namespace",
56
+ "mcp__gitlab__verify_namespace",
57
+ "mcp__gitlab__get_project",
58
+ "mcp__gitlab__list_projects",
59
+ "mcp__gitlab__list_project_members",
60
+ "mcp__gitlab__get_pipeline",
61
+ "mcp__gitlab__list_pipelines",
62
+ "mcp__gitlab__list_deployments",
63
+ "mcp__gitlab__get_deployment",
64
+ "mcp__gitlab__list_environments",
65
+ "mcp__gitlab__get_environment",
66
+ "mcp__gitlab__list_pipeline_jobs",
67
+ "mcp__gitlab__list_pipeline_trigger_jobs",
68
+ "mcp__gitlab__get_pipeline_job",
69
+ "mcp__gitlab__get_pipeline_job_output",
70
+ "mcp__gitlab__validate_ci_lint",
71
+ "mcp__gitlab__validate_project_ci_lint",
72
+ "mcp__gitlab__list_job_artifacts",
73
+ "mcp__gitlab__download_job_artifacts",
74
+ "mcp__gitlab__get_job_artifact_file",
75
+ "mcp__gitlab__list_labels",
76
+ "mcp__gitlab__get_label",
77
+ "mcp__gitlab__list_group_projects",
78
+ "mcp__gitlab__get_repository_tree",
79
+ "mcp__gitlab__list_milestones",
80
+ "mcp__gitlab__get_milestone",
81
+ "mcp__gitlab__get_milestone_issue",
82
+ "mcp__gitlab__get_milestone_merge_requests",
83
+ "mcp__gitlab__get_milestone_burndown_events",
84
+ "mcp__gitlab__list_wiki_pages",
85
+ "mcp__gitlab__get_wiki_page",
86
+ "mcp__gitlab__list_group_wiki_pages",
87
+ "mcp__gitlab__get_group_wiki_page",
88
+ "mcp__gitlab__get_users",
89
+ "mcp__gitlab__get_user",
90
+ "mcp__gitlab__whoami",
91
+ "mcp__gitlab__list_commits",
92
+ "mcp__gitlab__get_commit",
93
+ "mcp__gitlab__get_commit_diff",
94
+ "mcp__gitlab__get_file_blame",
95
+ "mcp__gitlab__list_commit_statuses",
96
+ "mcp__gitlab__list_group_iterations",
97
+ "mcp__gitlab__get_group_iteration",
98
+ "mcp__gitlab__download_attachment",
99
+ "mcp__gitlab__list_events",
100
+ "mcp__gitlab__get_project_events",
101
+ "mcp__gitlab__list_releases",
102
+ "mcp__gitlab__get_release",
103
+ "mcp__gitlab__download_release_asset",
104
+ "mcp__gitlab__list_tags",
105
+ "mcp__gitlab__get_tag",
106
+ "mcp__gitlab__get_tag_signature",
107
+ "mcp__gitlab__get_merge_request_approval_state",
108
+ "mcp__gitlab__get_work_item",
109
+ "mcp__gitlab__list_work_items",
110
+ "mcp__gitlab__list_work_item_statuses",
111
+ "mcp__gitlab__list_custom_field_definitions",
112
+ "mcp__gitlab__list_work_item_notes",
113
+ "mcp__gitlab__list_merge_request_emoji_reactions",
114
+ "mcp__gitlab__list_merge_request_note_emoji_reactions",
115
+ "mcp__gitlab__list_issue_emoji_reactions",
116
+ "mcp__gitlab__list_issue_note_emoji_reactions",
117
+ "mcp__gitlab__list_work_item_emoji_reactions",
118
+ "mcp__gitlab__list_work_item_note_emoji_reactions",
119
+ "mcp__gitlab__get_timeline_events",
120
+ "mcp__gitlab__get_merge_request_conflicts",
121
+ "mcp__gitlab__list_webhooks",
122
+ "mcp__gitlab__list_webhook_events",
123
+ "mcp__gitlab__get_webhook_event"
124
+ ],
125
+ "deny": [
126
+ "mcp__git__git_add",
127
+ "mcp__git__git_commit",
128
+ "mcp__git__git_reset",
129
+ "mcp__git__git_create_branch",
130
+ "mcp__git__git_checkout",
131
+ "mcp__gitlab__delete_branch",
132
+ "mcp__gitlab__delete_draft_note",
133
+ "mcp__gitlab__delete_group_wiki_page",
134
+ "mcp__gitlab__delete_issue",
135
+ "mcp__gitlab__delete_issue_emoji_reaction",
136
+ "mcp__gitlab__delete_issue_link",
137
+ "mcp__gitlab__delete_issue_note_emoji_reaction",
138
+ "mcp__gitlab__delete_label",
139
+ "mcp__gitlab__delete_merge_request_discussion_note",
140
+ "mcp__gitlab__delete_merge_request_emoji_reaction",
141
+ "mcp__gitlab__delete_merge_request_note",
142
+ "mcp__gitlab__delete_merge_request_note_emoji_reaction",
143
+ "mcp__gitlab__delete_milestone",
144
+ "mcp__gitlab__delete_release",
145
+ "mcp__gitlab__delete_tag",
146
+ "mcp__gitlab__delete_wiki_page",
147
+ "mcp__gitlab__delete_work_item_emoji_reaction",
148
+ "mcp__gitlab__delete_work_item_note_emoji_reaction",
149
+ "mcp__gitlab__merge_merge_request",
150
+ "mcp__gitlab__push_files"
151
+ ]
152
+ }
153
+ }
@@ -0,0 +1,368 @@
1
+ [history]
2
+ persistence = "none"
3
+ max_bytes = 1048576
4
+
5
+ [features]
6
+ shell_snapshot = true
7
+ unified_exec = true
8
+ skill_mcp_dependency_install = true
9
+ memories = false
10
+
11
+ [shell_environment_policy]
12
+ inherit = "all"
13
+
14
+ # Codex profile used by the default reviewer_command as
15
+ # codex --ask-for-approval never exec --profile bubo ...
16
+ # (see [agents].reviewer_command / [agents].codex_profile in
17
+ # config/env.toml). MUST live in the main config under [profiles.NAME] —
18
+ # Codex does NOT auto-load `~/.codex/<NAME>.config.toml` for `--profile`,
19
+ # despite what the filename suggests. Edits here change every review run
20
+ # on this host.
21
+ [profiles.bubo]
22
+ model = "gpt-5.5"
23
+ model_reasoning_effort = "medium"
24
+ model_reasoning_summary = "none"
25
+ model_verbosity = "low"
26
+ review_model = "gpt-5.5"
27
+ approval_policy = "never"
28
+ sandbox_mode = "read-only"
29
+ web_search = "disabled"
30
+ project_doc_max_bytes = 8192
31
+ hide_agent_reasoning = true
32
+
33
+ [marketplaces.llm-code-review]
34
+ last_updated = "2026-05-20T20:11:22Z"
35
+ source_type = "local"
36
+ source = "{{ROOT}}"
37
+
38
+ [plugins."superpowers@llm-code-review"]
39
+ enabled = true
40
+
41
+ [mcp_servers.git]
42
+ command = "/usr/local/bin/uvx"
43
+ args = ["mcp-server-git==2026.1.14"]
44
+ startup_timeout_sec = 20.0
45
+ tool_timeout_sec = 60.0
46
+ default_tools_approval_mode = "approve"
47
+ enabled_tools = ["git_status", "git_diff_unstaged", "git_diff_staged", "git_diff", "git_log", "git_show", "git_branch"]
48
+
49
+ [mcp_servers.bubo]
50
+ command = "{{ROOT}}/bin/bubo"
51
+ args = ["mcp"]
52
+ startup_timeout_sec = 20
53
+ # Must be >= [review].timeout_seconds because `review_change` blocks on
54
+ # the underlying reviewer_command subprocess. The read-only metrics
55
+ # tools complete in milliseconds so the long ceiling costs nothing.
56
+ tool_timeout_sec = 1800
57
+
58
+ [mcp_servers.gitlab]
59
+ command = "{{ROOT}}/bin/bubo"
60
+ args = ["mcp-upstream", "gitlab"]
61
+ startup_timeout_sec = 30
62
+ tool_timeout_sec = 120
63
+
64
+ [mcp_servers.gitlab.tools.discover_tools]
65
+ approval_mode = "approve"
66
+
67
+ [mcp_servers.gitlab.tools.health_check]
68
+ approval_mode = "approve"
69
+
70
+ [mcp_servers.gitlab.tools.search_repositories]
71
+ approval_mode = "approve"
72
+
73
+ [mcp_servers.gitlab.tools.search_code]
74
+ approval_mode = "approve"
75
+
76
+ [mcp_servers.gitlab.tools.search_project_code]
77
+ approval_mode = "approve"
78
+
79
+ [mcp_servers.gitlab.tools.search_group_code]
80
+ approval_mode = "approve"
81
+
82
+ [mcp_servers.gitlab.tools.execute_graphql]
83
+ approval_mode = "approve"
84
+
85
+ [mcp_servers.gitlab.tools.get_file_contents]
86
+ approval_mode = "approve"
87
+
88
+ [mcp_servers.gitlab.tools.get_merge_request]
89
+ approval_mode = "approve"
90
+
91
+ [mcp_servers.gitlab.tools.get_merge_request_diffs]
92
+ approval_mode = "approve"
93
+
94
+ [mcp_servers.gitlab.tools.list_merge_request_changed_files]
95
+ approval_mode = "approve"
96
+
97
+ [mcp_servers.gitlab.tools.list_merge_request_diffs]
98
+ approval_mode = "approve"
99
+
100
+ [mcp_servers.gitlab.tools.get_merge_request_file_diff]
101
+ approval_mode = "approve"
102
+
103
+ [mcp_servers.gitlab.tools.list_merge_request_versions]
104
+ approval_mode = "approve"
105
+
106
+ [mcp_servers.gitlab.tools.get_merge_request_version]
107
+ approval_mode = "approve"
108
+
109
+ [mcp_servers.gitlab.tools.get_branch]
110
+ approval_mode = "approve"
111
+
112
+ [mcp_servers.gitlab.tools.list_branches]
113
+ approval_mode = "approve"
114
+
115
+ [mcp_servers.gitlab.tools.get_branch_diffs]
116
+ approval_mode = "approve"
117
+
118
+ [mcp_servers.gitlab.tools.list_merge_request_pipelines]
119
+ approval_mode = "approve"
120
+
121
+ [mcp_servers.gitlab.tools.get_merge_request_note]
122
+ approval_mode = "approve"
123
+
124
+ [mcp_servers.gitlab.tools.get_merge_request_notes]
125
+ approval_mode = "approve"
126
+
127
+ [mcp_servers.gitlab.tools.get_draft_note]
128
+ approval_mode = "approve"
129
+
130
+ [mcp_servers.gitlab.tools.list_draft_notes]
131
+ approval_mode = "approve"
132
+
133
+ [mcp_servers.gitlab.tools.mr_discussions]
134
+ approval_mode = "approve"
135
+
136
+ [mcp_servers.gitlab.tools.list_issues]
137
+ approval_mode = "approve"
138
+
139
+ [mcp_servers.gitlab.tools.list_todos]
140
+ approval_mode = "approve"
141
+
142
+ [mcp_servers.gitlab.tools.my_issues]
143
+ approval_mode = "approve"
144
+
145
+ [mcp_servers.gitlab.tools.list_merge_requests]
146
+ approval_mode = "approve"
147
+
148
+ [mcp_servers.gitlab.tools.get_issue]
149
+ approval_mode = "approve"
150
+
151
+ [mcp_servers.gitlab.tools.list_issue_links]
152
+ approval_mode = "approve"
153
+
154
+ [mcp_servers.gitlab.tools.list_issue_discussions]
155
+ approval_mode = "approve"
156
+
157
+ [mcp_servers.gitlab.tools.get_issue_link]
158
+ approval_mode = "approve"
159
+
160
+ [mcp_servers.gitlab.tools.list_namespaces]
161
+ approval_mode = "approve"
162
+
163
+ [mcp_servers.gitlab.tools.get_namespace]
164
+ approval_mode = "approve"
165
+
166
+ [mcp_servers.gitlab.tools.verify_namespace]
167
+ approval_mode = "approve"
168
+
169
+ [mcp_servers.gitlab.tools.get_project]
170
+ approval_mode = "approve"
171
+
172
+ [mcp_servers.gitlab.tools.list_projects]
173
+ approval_mode = "approve"
174
+
175
+ [mcp_servers.gitlab.tools.list_project_members]
176
+ approval_mode = "approve"
177
+
178
+ [mcp_servers.gitlab.tools.get_pipeline]
179
+ approval_mode = "approve"
180
+
181
+ [mcp_servers.gitlab.tools.list_pipelines]
182
+ approval_mode = "approve"
183
+
184
+ [mcp_servers.gitlab.tools.list_deployments]
185
+ approval_mode = "approve"
186
+
187
+ [mcp_servers.gitlab.tools.get_deployment]
188
+ approval_mode = "approve"
189
+
190
+ [mcp_servers.gitlab.tools.list_environments]
191
+ approval_mode = "approve"
192
+
193
+ [mcp_servers.gitlab.tools.get_environment]
194
+ approval_mode = "approve"
195
+
196
+ [mcp_servers.gitlab.tools.list_pipeline_jobs]
197
+ approval_mode = "approve"
198
+
199
+ [mcp_servers.gitlab.tools.list_pipeline_trigger_jobs]
200
+ approval_mode = "approve"
201
+
202
+ [mcp_servers.gitlab.tools.get_pipeline_job]
203
+ approval_mode = "approve"
204
+
205
+ [mcp_servers.gitlab.tools.get_pipeline_job_output]
206
+ approval_mode = "approve"
207
+
208
+ [mcp_servers.gitlab.tools.validate_ci_lint]
209
+ approval_mode = "approve"
210
+
211
+ [mcp_servers.gitlab.tools.validate_project_ci_lint]
212
+ approval_mode = "approve"
213
+
214
+ [mcp_servers.gitlab.tools.list_job_artifacts]
215
+ approval_mode = "approve"
216
+
217
+ [mcp_servers.gitlab.tools.download_job_artifacts]
218
+ approval_mode = "approve"
219
+
220
+ [mcp_servers.gitlab.tools.get_job_artifact_file]
221
+ approval_mode = "approve"
222
+
223
+ [mcp_servers.gitlab.tools.list_labels]
224
+ approval_mode = "approve"
225
+
226
+ [mcp_servers.gitlab.tools.get_label]
227
+ approval_mode = "approve"
228
+
229
+ [mcp_servers.gitlab.tools.list_group_projects]
230
+ approval_mode = "approve"
231
+
232
+ [mcp_servers.gitlab.tools.get_repository_tree]
233
+ approval_mode = "approve"
234
+
235
+ [mcp_servers.gitlab.tools.list_milestones]
236
+ approval_mode = "approve"
237
+
238
+ [mcp_servers.gitlab.tools.get_milestone]
239
+ approval_mode = "approve"
240
+
241
+ [mcp_servers.gitlab.tools.get_milestone_issue]
242
+ approval_mode = "approve"
243
+
244
+ [mcp_servers.gitlab.tools.get_milestone_merge_requests]
245
+ approval_mode = "approve"
246
+
247
+ [mcp_servers.gitlab.tools.get_milestone_burndown_events]
248
+ approval_mode = "approve"
249
+
250
+ [mcp_servers.gitlab.tools.list_wiki_pages]
251
+ approval_mode = "approve"
252
+
253
+ [mcp_servers.gitlab.tools.get_wiki_page]
254
+ approval_mode = "approve"
255
+
256
+ [mcp_servers.gitlab.tools.list_group_wiki_pages]
257
+ approval_mode = "approve"
258
+
259
+ [mcp_servers.gitlab.tools.get_group_wiki_page]
260
+ approval_mode = "approve"
261
+
262
+ [mcp_servers.gitlab.tools.get_users]
263
+ approval_mode = "approve"
264
+
265
+ [mcp_servers.gitlab.tools.get_user]
266
+ approval_mode = "approve"
267
+
268
+ [mcp_servers.gitlab.tools.whoami]
269
+ approval_mode = "approve"
270
+
271
+ [mcp_servers.gitlab.tools.list_commits]
272
+ approval_mode = "approve"
273
+
274
+ [mcp_servers.gitlab.tools.get_commit]
275
+ approval_mode = "approve"
276
+
277
+ [mcp_servers.gitlab.tools.get_commit_diff]
278
+ approval_mode = "approve"
279
+
280
+ [mcp_servers.gitlab.tools.get_file_blame]
281
+ approval_mode = "approve"
282
+
283
+ [mcp_servers.gitlab.tools.list_commit_statuses]
284
+ approval_mode = "approve"
285
+
286
+ [mcp_servers.gitlab.tools.list_group_iterations]
287
+ approval_mode = "approve"
288
+
289
+ [mcp_servers.gitlab.tools.get_group_iteration]
290
+ approval_mode = "approve"
291
+
292
+ [mcp_servers.gitlab.tools.download_attachment]
293
+ approval_mode = "approve"
294
+
295
+ [mcp_servers.gitlab.tools.list_events]
296
+ approval_mode = "approve"
297
+
298
+ [mcp_servers.gitlab.tools.get_project_events]
299
+ approval_mode = "approve"
300
+
301
+ [mcp_servers.gitlab.tools.list_releases]
302
+ approval_mode = "approve"
303
+
304
+ [mcp_servers.gitlab.tools.get_release]
305
+ approval_mode = "approve"
306
+
307
+ [mcp_servers.gitlab.tools.download_release_asset]
308
+ approval_mode = "approve"
309
+
310
+ [mcp_servers.gitlab.tools.list_tags]
311
+ approval_mode = "approve"
312
+
313
+ [mcp_servers.gitlab.tools.get_tag]
314
+ approval_mode = "approve"
315
+
316
+ [mcp_servers.gitlab.tools.get_tag_signature]
317
+ approval_mode = "approve"
318
+
319
+ [mcp_servers.gitlab.tools.get_merge_request_approval_state]
320
+ approval_mode = "approve"
321
+
322
+ [mcp_servers.gitlab.tools.get_work_item]
323
+ approval_mode = "approve"
324
+
325
+ [mcp_servers.gitlab.tools.list_work_items]
326
+ approval_mode = "approve"
327
+
328
+ [mcp_servers.gitlab.tools.list_work_item_statuses]
329
+ approval_mode = "approve"
330
+
331
+ [mcp_servers.gitlab.tools.list_custom_field_definitions]
332
+ approval_mode = "approve"
333
+
334
+ [mcp_servers.gitlab.tools.list_work_item_notes]
335
+ approval_mode = "approve"
336
+
337
+ [mcp_servers.gitlab.tools.list_merge_request_emoji_reactions]
338
+ approval_mode = "approve"
339
+
340
+ [mcp_servers.gitlab.tools.list_merge_request_note_emoji_reactions]
341
+ approval_mode = "approve"
342
+
343
+ [mcp_servers.gitlab.tools.list_issue_emoji_reactions]
344
+ approval_mode = "approve"
345
+
346
+ [mcp_servers.gitlab.tools.list_issue_note_emoji_reactions]
347
+ approval_mode = "approve"
348
+
349
+ [mcp_servers.gitlab.tools.list_work_item_emoji_reactions]
350
+ approval_mode = "approve"
351
+
352
+ [mcp_servers.gitlab.tools.list_work_item_note_emoji_reactions]
353
+ approval_mode = "approve"
354
+
355
+ [mcp_servers.gitlab.tools.get_timeline_events]
356
+ approval_mode = "approve"
357
+
358
+ [mcp_servers.gitlab.tools.get_merge_request_conflicts]
359
+ approval_mode = "approve"
360
+
361
+ [mcp_servers.gitlab.tools.list_webhooks]
362
+ approval_mode = "approve"
363
+
364
+ [mcp_servers.gitlab.tools.list_webhook_events]
365
+ approval_mode = "approve"
366
+
367
+ [mcp_servers.gitlab.tools.get_webhook_event]
368
+ approval_mode = "approve"