github-agent 2.4.12__py3-none-any.whl → 2.4.15__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 (73) hide show
  1. github_agent/connector_contracts.py +1191 -0
  2. github_agent/mcp/__init__.py +1 -33
  3. github_agent/mcp_server.py +122 -3402
  4. github_agent/ontology/certification.json +33 -0
  5. github_agent/ontology/github.ttl +4 -5
  6. github_agent/ontology/mappings/source.yaml +1 -2
  7. github_agent/ontology/shapes/connector.shacl.ttl +104 -0
  8. github_agent/prompts/github-mcp-operator.json +347 -0
  9. github_agent/prompts/github-mcp-release-manager.json +203 -0
  10. github_agent/prompts/github-mcp-repository-administrator.json +171 -0
  11. github_agent/prompts/github-mcp-triage-lead.json +147 -0
  12. github_agent/skills/github-actions-ci-review/SKILL.md +24 -75
  13. github_agent/skills/github-agent-operations/SKILL.md +47 -19
  14. github_agent/skills/github-backlog-planner/SKILL.md +31 -97
  15. github_agent/skills/github-ci-failure-sweep/SKILL.md +24 -93
  16. github_agent/skills/github-ci-failure-sweep/scripts/summarize_runs.py +1 -1
  17. github_agent/skills/github-dependabot-review/SKILL.md +16 -88
  18. github_agent/skills/github-issue-tracking/SKILL.md +23 -80
  19. github_agent/skills/github-org-remediation-loop/SKILL.md +44 -262
  20. github_agent/skills/github-pr-review-sweep/SKILL.md +47 -106
  21. github_agent/skills/github-pr-review-sweep/scripts/summarize_prs.py +7 -5
  22. github_agent/skills/github-project-provisioner/SKILL.md +27 -44
  23. github_agent/skills/github-pull-request-create/SKILL.md +20 -66
  24. github_agent/skills/github-pull-request-review/SKILL.md +47 -126
  25. github_agent/skills/github-repository-management/SKILL.md +61 -94
  26. github_agent/skills/github-tools/SKILL.md +28 -128
  27. github_agent/skills/github-triage-resolver/SKILL.md +33 -104
  28. github_agent/skills/github-triage-resolver/scripts/classify_safe.py +2 -2
  29. github_agent/skills/github-triage-resolver/scripts/gh_write.py +3 -3
  30. {github_agent-2.4.12.dist-info → github_agent-2.4.15.dist-info}/METADATA +6 -42
  31. {github_agent-2.4.12.dist-info → github_agent-2.4.15.dist-info}/RECORD +37 -66
  32. tests/test_default_content_surfaces.py +2 -0
  33. tests/test_pages.py +0 -265
  34. github_agent/mcp/mcp_action.py +0 -296
  35. github_agent/mcp/mcp_branch.py +0 -153
  36. github_agent/mcp/mcp_collaborator.py +0 -125
  37. github_agent/mcp/mcp_commit.py +0 -94
  38. github_agent/mcp/mcp_content.py +0 -168
  39. github_agent/mcp/mcp_dependabot.py +0 -207
  40. github_agent/mcp/mcp_issue.py +0 -188
  41. github_agent/mcp/mcp_org.py +0 -359
  42. github_agent/mcp/mcp_pull.py +0 -353
  43. github_agent/mcp/mcp_release.py +0 -171
  44. github_agent/mcp/mcp_repo.py +0 -528
  45. github_agent/mcp/mcp_search.py +0 -82
  46. github_agent/skills/github-actions-ci-review/WORKFLOW.md +0 -82
  47. github_agent/skills/github-agent-operations/agents/openai.yaml +0 -4
  48. github_agent/skills/github-agent-operations/references/catalog.md +0 -17
  49. github_agent/skills/github-backlog-planner/WORKFLOW.md +0 -98
  50. github_agent/skills/github-ci-failure-sweep/WORKFLOW.md +0 -96
  51. github_agent/skills/github-ci-failure-sweep/references/actions-tool-cheatsheet.md +0 -60
  52. github_agent/skills/github-dependabot-review/WORKFLOW.md +0 -91
  53. github_agent/skills/github-issue-tracking/WORKFLOW.md +0 -83
  54. github_agent/skills/github-org-remediation-loop/WORKFLOW.md +0 -267
  55. github_agent/skills/github-pr-review-sweep/WORKFLOW.md +0 -95
  56. github_agent/skills/github-pr-review-sweep/references/pulls-tool-cheatsheet.md +0 -42
  57. github_agent/skills/github-project-provisioner/WORKFLOW.md +0 -51
  58. github_agent/skills/github-pull-request-create/WORKFLOW.md +0 -70
  59. github_agent/skills/github-pull-request-review/WORKFLOW.md +0 -121
  60. github_agent/skills/github-repository-management/WORKFLOW.md +0 -90
  61. github_agent/skills/github-tools/WORKFLOW.md +0 -141
  62. github_agent/skills/github-triage-resolver/WORKFLOW.md +0 -99
  63. tests/test_action_discovery.py +0 -177
  64. tests/test_comment_crud.py +0 -890
  65. tests/test_hardening.py +0 -114
  66. tests/test_mcp_coverage.py +0 -1343
  67. tests/test_mcp_package_dispatch.py +0 -785
  68. tests/test_org_crud.py +0 -626
  69. tests/test_repo_secrets_characterization.py +0 -198
  70. {github_agent-2.4.12.dist-info → github_agent-2.4.15.dist-info}/WHEEL +0 -0
  71. {github_agent-2.4.12.dist-info → github_agent-2.4.15.dist-info}/entry_points.txt +0 -0
  72. {github_agent-2.4.12.dist-info → github_agent-2.4.15.dist-info}/licenses/LICENSE +0 -0
  73. {github_agent-2.4.12.dist-info → github_agent-2.4.15.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1191 @@
1
+ """Tool-use contracts, surface links, data locations and business roles of github-mcp.
2
+
3
+ The SDK serves this declaration as the connector's surface ontology and checks it
4
+ against the served tools, prompts and skills (SCION-CONNECTOR-CONTROL-R916).
5
+ """
6
+
7
+ # ruff: noqa: E501
8
+ from __future__ import annotations
9
+
10
+ from scion_sdk.surface_contracts import (
11
+ BusinessRole,
12
+ DataLocation,
13
+ Refusal,
14
+ SurfaceLink,
15
+ ToolStep,
16
+ ToolUseContract,
17
+ )
18
+
19
+ CONTRACTS: tuple[ToolUseContract, ...] = (
20
+ ToolUseContract(
21
+ "find-repositories",
22
+ description="Find repositories and read their details",
23
+ steps=(
24
+ ToolStep(
25
+ "github_get_org_repos",
26
+ params=("org",),
27
+ result=("result",),
28
+ refusals=(
29
+ Refusal(
30
+ "access_denied", "the credential lacks access to the system"
31
+ ),
32
+ Refusal("not_found", "the named object does not exist"),
33
+ ),
34
+ ),
35
+ ToolStep(
36
+ "github_get_organization",
37
+ params=("org",),
38
+ result=("result",),
39
+ refusals=(Refusal("not_found", "the named object does not exist"),),
40
+ ),
41
+ ToolStep(
42
+ "github_get_repositories",
43
+ params=("max_pages", "page", "per_page"),
44
+ result=("result",),
45
+ refusals=(),
46
+ ),
47
+ ToolStep(
48
+ "github_get_repository",
49
+ params=("owner", "repo"),
50
+ result=("result",),
51
+ refusals=(Refusal("not_found", "the named object does not exist"),),
52
+ ),
53
+ ToolStep(
54
+ "github_list_organizations",
55
+ params=("max_pages", "page", "per_page"),
56
+ result=("result",),
57
+ refusals=(),
58
+ ),
59
+ ToolStep(
60
+ "github_search_repositories",
61
+ params=("q",),
62
+ result=("result",),
63
+ refusals=(),
64
+ ),
65
+ ),
66
+ ),
67
+ ToolUseContract(
68
+ "provision-a-repository",
69
+ description="Create a repository, set branch protection, secrets and Pages",
70
+ steps=(
71
+ ToolStep(
72
+ "github_create_or_update_repo_secret",
73
+ params=("owner", "repo", "secret_name", "encrypted_value", "key_id"),
74
+ result=("result",),
75
+ refusals=(
76
+ Refusal(
77
+ "access_denied", "the credential lacks access to the system"
78
+ ),
79
+ ),
80
+ ),
81
+ ToolStep(
82
+ "github_create_organization_repository",
83
+ params=("org", "name"),
84
+ result=("result",),
85
+ refusals=(),
86
+ ),
87
+ ToolStep(
88
+ "github_create_pages",
89
+ params=("owner", "repo"),
90
+ result=("result",),
91
+ refusals=(),
92
+ ),
93
+ ToolStep(
94
+ "github_create_repository",
95
+ params=("name",),
96
+ result=("result",),
97
+ refusals=(),
98
+ ),
99
+ ToolStep(
100
+ "github_get_branch_protection",
101
+ params=("owner", "repo", "branch"),
102
+ result=("result",),
103
+ refusals=(Refusal("not_found", "the named object does not exist"),),
104
+ ),
105
+ ToolStep(
106
+ "github_get_pages",
107
+ params=("owner", "repo"),
108
+ result=("result",),
109
+ refusals=(Refusal("not_found", "the named object does not exist"),),
110
+ ),
111
+ ToolStep(
112
+ "github_get_pages_build_latest",
113
+ params=("owner", "repo"),
114
+ result=("result",),
115
+ refusals=(Refusal("not_found", "the named object does not exist"),),
116
+ ),
117
+ ToolStep(
118
+ "github_get_repo_secret_public_key",
119
+ params=("owner", "repo"),
120
+ result=("result",),
121
+ refusals=(Refusal("not_found", "the named object does not exist"),),
122
+ ),
123
+ ToolStep(
124
+ "github_get_repo_secrets",
125
+ params=("owner", "repo"),
126
+ result=("result",),
127
+ refusals=(Refusal("not_found", "the named object does not exist"),),
128
+ ),
129
+ ToolStep(
130
+ "github_list_pages_builds",
131
+ params=("owner", "repo"),
132
+ result=("result",),
133
+ refusals=(),
134
+ ),
135
+ ToolStep(
136
+ "github_request_pages_build",
137
+ params=("owner", "repo"),
138
+ result=("result",),
139
+ refusals=(),
140
+ ),
141
+ ToolStep(
142
+ "github_update_branch_protection",
143
+ params=("owner", "repo", "branch", "protection_config"),
144
+ result=("result",),
145
+ refusals=(Refusal("not_found", "the named object does not exist"),),
146
+ ),
147
+ ToolStep(
148
+ "github_update_pages",
149
+ params=("owner", "repo"),
150
+ result=("result",),
151
+ refusals=(Refusal("not_found", "the named object does not exist"),),
152
+ ),
153
+ ToolStep(
154
+ "github_update_repository",
155
+ params=("owner", "repo"),
156
+ result=("result",),
157
+ refusals=(Refusal("not_found", "the named object does not exist"),),
158
+ ),
159
+ ),
160
+ ),
161
+ ToolUseContract(
162
+ "retire-a-repository",
163
+ description="Delete a repository, secret, branch protection or Pages site",
164
+ steps=(
165
+ ToolStep(
166
+ "github_delete_branch_protection",
167
+ params=("owner", "repo", "branch"),
168
+ result=("result",),
169
+ refusals=(
170
+ Refusal(
171
+ "access_denied", "the credential lacks access to the system"
172
+ ),
173
+ Refusal(
174
+ "confirmation_required",
175
+ "the destructive call omits confirm=true",
176
+ ),
177
+ Refusal("not_found", "the named object does not exist"),
178
+ ),
179
+ ),
180
+ ToolStep(
181
+ "github_delete_pages",
182
+ params=("owner", "repo"),
183
+ result=("result",),
184
+ refusals=(
185
+ Refusal(
186
+ "confirmation_required",
187
+ "the destructive call omits confirm=true",
188
+ ),
189
+ Refusal("not_found", "the named object does not exist"),
190
+ ),
191
+ ),
192
+ ToolStep(
193
+ "github_delete_repo_secret",
194
+ params=("owner", "repo", "secret_name"),
195
+ result=("result",),
196
+ refusals=(
197
+ Refusal(
198
+ "confirmation_required",
199
+ "the destructive call omits confirm=true",
200
+ ),
201
+ Refusal("not_found", "the named object does not exist"),
202
+ ),
203
+ ),
204
+ ToolStep(
205
+ "github_delete_repository",
206
+ params=("owner", "repo"),
207
+ result=("result",),
208
+ refusals=(
209
+ Refusal(
210
+ "confirmation_required",
211
+ "the destructive call omits confirm=true",
212
+ ),
213
+ Refusal("not_found", "the named object does not exist"),
214
+ ),
215
+ ),
216
+ ),
217
+ ),
218
+ ToolUseContract(
219
+ "work-issues",
220
+ description="Read, open, change and comment on issues",
221
+ steps=(
222
+ ToolStep(
223
+ "github_create_issue",
224
+ params=("owner", "repo", "title"),
225
+ result=("result",),
226
+ refusals=(
227
+ Refusal(
228
+ "access_denied", "the credential lacks access to the system"
229
+ ),
230
+ ),
231
+ ),
232
+ ToolStep(
233
+ "github_create_issue_comment",
234
+ params=("owner", "repo", "issue_number", "body"),
235
+ result=("result",),
236
+ refusals=(),
237
+ ),
238
+ ToolStep(
239
+ "github_delete_issue_comment",
240
+ params=("owner", "repo", "comment_id"),
241
+ result=("result",),
242
+ refusals=(
243
+ Refusal(
244
+ "confirmation_required",
245
+ "the destructive call omits confirm=true",
246
+ ),
247
+ Refusal("not_found", "the named object does not exist"),
248
+ ),
249
+ ),
250
+ ToolStep(
251
+ "github_get_issue",
252
+ params=("owner", "repo", "number"),
253
+ result=("result",),
254
+ refusals=(Refusal("not_found", "the named object does not exist"),),
255
+ ),
256
+ ToolStep(
257
+ "github_get_issue_comment",
258
+ params=("owner", "repo", "comment_id"),
259
+ result=("result",),
260
+ refusals=(Refusal("not_found", "the named object does not exist"),),
261
+ ),
262
+ ToolStep(
263
+ "github_get_issues",
264
+ params=("owner", "repo"),
265
+ result=("result",),
266
+ refusals=(Refusal("not_found", "the named object does not exist"),),
267
+ ),
268
+ ToolStep(
269
+ "github_list_issue_comments",
270
+ params=("owner", "repo", "issue_number"),
271
+ result=("result",),
272
+ refusals=(),
273
+ ),
274
+ ToolStep(
275
+ "github_list_repo_issue_comments",
276
+ params=("owner", "repo"),
277
+ result=("result",),
278
+ refusals=(),
279
+ ),
280
+ ToolStep(
281
+ "github_search_issues", params=("q",), result=("result",), refusals=()
282
+ ),
283
+ ToolStep(
284
+ "github_update_issue",
285
+ params=("owner", "repo", "number"),
286
+ result=("result",),
287
+ refusals=(Refusal("not_found", "the named object does not exist"),),
288
+ ),
289
+ ToolStep(
290
+ "github_update_issue_comment",
291
+ params=("owner", "repo", "comment_id", "body"),
292
+ result=("result",),
293
+ refusals=(Refusal("not_found", "the named object does not exist"),),
294
+ ),
295
+ ),
296
+ ),
297
+ ToolUseContract(
298
+ "create-a-pull-request",
299
+ description="Branch, commit content and open a pull request",
300
+ steps=(
301
+ ToolStep(
302
+ "github_create_branch",
303
+ params=("owner", "repo", "branch", "ref"),
304
+ result=("result",),
305
+ refusals=(
306
+ Refusal(
307
+ "access_denied", "the credential lacks access to the system"
308
+ ),
309
+ ),
310
+ ),
311
+ ToolStep(
312
+ "github_create_content",
313
+ params=("owner", "repo", "path", "message", "content"),
314
+ result=("result",),
315
+ refusals=(),
316
+ ),
317
+ ToolStep(
318
+ "github_create_pull_request",
319
+ params=("owner", "repo", "title", "head", "base"),
320
+ result=("result",),
321
+ refusals=(),
322
+ ),
323
+ ToolStep(
324
+ "github_get_branch",
325
+ params=("owner", "repo", "branch"),
326
+ result=("result",),
327
+ refusals=(Refusal("not_found", "the named object does not exist"),),
328
+ ),
329
+ ToolStep(
330
+ "github_get_branches",
331
+ params=("owner", "repo"),
332
+ result=("result",),
333
+ refusals=(Refusal("not_found", "the named object does not exist"),),
334
+ ),
335
+ ToolStep(
336
+ "github_get_contents",
337
+ params=("owner", "repo", "path"),
338
+ result=("result",),
339
+ refusals=(Refusal("not_found", "the named object does not exist"),),
340
+ ),
341
+ ToolStep(
342
+ "github_request_reviewers",
343
+ params=("owner", "repo", "number"),
344
+ result=("result",),
345
+ refusals=(),
346
+ ),
347
+ ToolStep(
348
+ "github_update_content",
349
+ params=("owner", "repo", "path", "message", "content", "sha"),
350
+ result=("result",),
351
+ refusals=(Refusal("not_found", "the named object does not exist"),),
352
+ ),
353
+ ),
354
+ ),
355
+ ToolUseContract(
356
+ "review-a-pull-request",
357
+ description="Read a pull request, review it, comment on lines and resolve comments",
358
+ steps=(
359
+ ToolStep(
360
+ "github_create_commit_comment",
361
+ params=("owner", "repo", "sha", "body"),
362
+ result=("result",),
363
+ refusals=(
364
+ Refusal(
365
+ "access_denied", "the credential lacks access to the system"
366
+ ),
367
+ ),
368
+ ),
369
+ ToolStep(
370
+ "github_create_pull_request_review",
371
+ params=("owner", "repo", "number"),
372
+ result=("result",),
373
+ refusals=(),
374
+ ),
375
+ ToolStep(
376
+ "github_create_review_comment",
377
+ params=("owner", "repo", "pull_number", "body"),
378
+ result=("result",),
379
+ refusals=(),
380
+ ),
381
+ ToolStep(
382
+ "github_create_review_comment_reply",
383
+ params=("owner", "repo", "pull_number", "comment_id", "body"),
384
+ result=("result",),
385
+ refusals=(),
386
+ ),
387
+ ToolStep(
388
+ "github_delete_commit_comment",
389
+ params=("owner", "repo", "comment_id"),
390
+ result=("result",),
391
+ refusals=(
392
+ Refusal(
393
+ "confirmation_required",
394
+ "the destructive call omits confirm=true",
395
+ ),
396
+ Refusal("not_found", "the named object does not exist"),
397
+ ),
398
+ ),
399
+ ToolStep(
400
+ "github_delete_review_comment",
401
+ params=("owner", "repo", "comment_id"),
402
+ result=("result",),
403
+ refusals=(
404
+ Refusal(
405
+ "confirmation_required",
406
+ "the destructive call omits confirm=true",
407
+ ),
408
+ Refusal("not_found", "the named object does not exist"),
409
+ ),
410
+ ),
411
+ ToolStep(
412
+ "github_get_commit",
413
+ params=("owner", "repo", "sha"),
414
+ result=("result",),
415
+ refusals=(Refusal("not_found", "the named object does not exist"),),
416
+ ),
417
+ ToolStep(
418
+ "github_get_commit_comment",
419
+ params=("owner", "repo", "comment_id"),
420
+ result=("result",),
421
+ refusals=(Refusal("not_found", "the named object does not exist"),),
422
+ ),
423
+ ToolStep(
424
+ "github_get_commits",
425
+ params=("owner", "repo"),
426
+ result=("result",),
427
+ refusals=(Refusal("not_found", "the named object does not exist"),),
428
+ ),
429
+ ToolStep(
430
+ "github_get_pull_request",
431
+ params=("owner", "repo", "number"),
432
+ result=("result",),
433
+ refusals=(Refusal("not_found", "the named object does not exist"),),
434
+ ),
435
+ ToolStep(
436
+ "github_get_pull_requests",
437
+ params=("owner", "repo"),
438
+ result=("result",),
439
+ refusals=(Refusal("not_found", "the named object does not exist"),),
440
+ ),
441
+ ToolStep(
442
+ "github_get_review_comment",
443
+ params=("owner", "repo", "comment_id"),
444
+ result=("result",),
445
+ refusals=(Refusal("not_found", "the named object does not exist"),),
446
+ ),
447
+ ToolStep(
448
+ "github_list_commit_comments",
449
+ params=("owner", "repo", "sha"),
450
+ result=("result",),
451
+ refusals=(),
452
+ ),
453
+ ToolStep(
454
+ "github_list_repo_commit_comments",
455
+ params=("owner", "repo"),
456
+ result=("result",),
457
+ refusals=(),
458
+ ),
459
+ ToolStep(
460
+ "github_list_repo_review_comments",
461
+ params=("owner", "repo"),
462
+ result=("result",),
463
+ refusals=(),
464
+ ),
465
+ ToolStep(
466
+ "github_list_review_comments",
467
+ params=("owner", "repo", "pull_number"),
468
+ result=("result",),
469
+ refusals=(),
470
+ ),
471
+ ToolStep(
472
+ "github_update_commit_comment",
473
+ params=("owner", "repo", "comment_id", "body"),
474
+ result=("result",),
475
+ refusals=(Refusal("not_found", "the named object does not exist"),),
476
+ ),
477
+ ToolStep(
478
+ "github_update_review_comment",
479
+ params=("owner", "repo", "comment_id", "body"),
480
+ result=("result",),
481
+ refusals=(Refusal("not_found", "the named object does not exist"),),
482
+ ),
483
+ ),
484
+ ),
485
+ ToolUseContract(
486
+ "land-a-pull-request",
487
+ description="Update, merge or auto-merge a pull request and delete its branch",
488
+ steps=(
489
+ ToolStep(
490
+ "github_delete_branch",
491
+ params=("owner", "repo", "branch"),
492
+ result=("result",),
493
+ refusals=(
494
+ Refusal(
495
+ "access_denied", "the credential lacks access to the system"
496
+ ),
497
+ Refusal(
498
+ "confirmation_required",
499
+ "the destructive call omits confirm=true",
500
+ ),
501
+ Refusal("not_found", "the named object does not exist"),
502
+ ),
503
+ ),
504
+ ToolStep(
505
+ "github_merge_pull_request",
506
+ params=("owner", "repo", "number"),
507
+ result=("result",),
508
+ refusals=(),
509
+ ),
510
+ ToolStep(
511
+ "github_pulls_disable_auto_merge",
512
+ params=("owner", "repo", "number"),
513
+ result=("result",),
514
+ refusals=(),
515
+ ),
516
+ ToolStep(
517
+ "github_pulls_enable_auto_merge",
518
+ params=("owner", "repo", "number"),
519
+ result=("result",),
520
+ refusals=(),
521
+ ),
522
+ ToolStep(
523
+ "github_update_pull_request",
524
+ params=("owner", "repo", "number"),
525
+ result=("result",),
526
+ refusals=(Refusal("not_found", "the named object does not exist"),),
527
+ ),
528
+ ),
529
+ ),
530
+ ToolUseContract(
531
+ "review-ci-results",
532
+ description="Read workflow runs, jobs and logs of a repository",
533
+ steps=(
534
+ ToolStep(
535
+ "github_get_workflow_job_logs",
536
+ params=("owner", "repo", "job_id"),
537
+ result=("result",),
538
+ refusals=(
539
+ Refusal(
540
+ "access_denied", "the credential lacks access to the system"
541
+ ),
542
+ Refusal("not_found", "the named object does not exist"),
543
+ ),
544
+ ),
545
+ ToolStep(
546
+ "github_get_workflow_run",
547
+ params=("owner", "repo", "run_id"),
548
+ result=("result",),
549
+ refusals=(Refusal("not_found", "the named object does not exist"),),
550
+ ),
551
+ ToolStep(
552
+ "github_get_workflow_run_jobs",
553
+ params=("owner", "repo", "run_id"),
554
+ result=("result",),
555
+ refusals=(Refusal("not_found", "the named object does not exist"),),
556
+ ),
557
+ ToolStep(
558
+ "github_get_workflow_runs",
559
+ params=("owner", "repo"),
560
+ result=("result",),
561
+ refusals=(Refusal("not_found", "the named object does not exist"),),
562
+ ),
563
+ ToolStep(
564
+ "github_get_workflows",
565
+ params=("owner", "repo"),
566
+ result=("result",),
567
+ refusals=(Refusal("not_found", "the named object does not exist"),),
568
+ ),
569
+ ToolStep(
570
+ "github_ingest_pipelines",
571
+ params=("owner", "repo"),
572
+ result=("result",),
573
+ refusals=(),
574
+ ),
575
+ ),
576
+ ),
577
+ ToolUseContract(
578
+ "run-ci",
579
+ description="Trigger, re-run, cancel and delete workflow runs",
580
+ steps=(
581
+ ToolStep(
582
+ "github_cancel_workflow_run",
583
+ params=("owner", "repo", "run_id"),
584
+ result=("result",),
585
+ refusals=(
586
+ Refusal(
587
+ "access_denied", "the credential lacks access to the system"
588
+ ),
589
+ ),
590
+ ),
591
+ ToolStep(
592
+ "github_delete_workflow_run",
593
+ params=("owner", "repo", "run_id"),
594
+ result=("result",),
595
+ refusals=(
596
+ Refusal(
597
+ "confirmation_required",
598
+ "the destructive call omits confirm=true",
599
+ ),
600
+ Refusal("not_found", "the named object does not exist"),
601
+ ),
602
+ ),
603
+ ToolStep(
604
+ "github_rerun_workflow_run",
605
+ params=("owner", "repo", "run_id"),
606
+ result=("result",),
607
+ refusals=(),
608
+ ),
609
+ ToolStep(
610
+ "github_trigger_workflow_dispatch",
611
+ params=("owner", "repo", "workflow_id", "ref"),
612
+ result=("result",),
613
+ refusals=(),
614
+ ),
615
+ ),
616
+ ),
617
+ ToolUseContract(
618
+ "review-dependabot-alerts",
619
+ description="Read and dismiss Dependabot alerts of a repository or organization",
620
+ steps=(
621
+ ToolStep(
622
+ "github_get_dependabot_alert",
623
+ params=("owner", "repo", "alert_number"),
624
+ result=("result",),
625
+ refusals=(
626
+ Refusal(
627
+ "access_denied", "the credential lacks access to the system"
628
+ ),
629
+ Refusal("not_found", "the named object does not exist"),
630
+ ),
631
+ ),
632
+ ToolStep(
633
+ "github_get_dependabot_alerts",
634
+ params=("owner", "repo"),
635
+ result=("result",),
636
+ refusals=(Refusal("not_found", "the named object does not exist"),),
637
+ ),
638
+ ToolStep(
639
+ "github_get_org_dependabot_alerts",
640
+ params=("org",),
641
+ result=("result",),
642
+ refusals=(Refusal("not_found", "the named object does not exist"),),
643
+ ),
644
+ ToolStep(
645
+ "github_update_dependabot_alert",
646
+ params=("owner", "repo", "alert_number", "state"),
647
+ result=("result",),
648
+ refusals=(Refusal("not_found", "the named object does not exist"),),
649
+ ),
650
+ ),
651
+ ),
652
+ ToolUseContract(
653
+ "publish-a-release",
654
+ description="Create, change and delete releases",
655
+ steps=(
656
+ ToolStep(
657
+ "github_create_release",
658
+ params=("owner", "repo", "tag_name"),
659
+ result=("result",),
660
+ refusals=(
661
+ Refusal(
662
+ "access_denied", "the credential lacks access to the system"
663
+ ),
664
+ ),
665
+ ),
666
+ ToolStep(
667
+ "github_delete_release",
668
+ params=("owner", "repo", "release_id"),
669
+ result=("result",),
670
+ refusals=(
671
+ Refusal(
672
+ "confirmation_required",
673
+ "the destructive call omits confirm=true",
674
+ ),
675
+ Refusal("not_found", "the named object does not exist"),
676
+ ),
677
+ ),
678
+ ToolStep(
679
+ "github_get_release",
680
+ params=("owner", "repo", "release_id"),
681
+ result=("result",),
682
+ refusals=(Refusal("not_found", "the named object does not exist"),),
683
+ ),
684
+ ToolStep(
685
+ "github_get_releases",
686
+ params=("owner", "repo"),
687
+ result=("result",),
688
+ refusals=(Refusal("not_found", "the named object does not exist"),),
689
+ ),
690
+ ToolStep(
691
+ "github_update_release",
692
+ params=("owner", "repo", "release_id"),
693
+ result=("result",),
694
+ refusals=(Refusal("not_found", "the named object does not exist"),),
695
+ ),
696
+ ),
697
+ ),
698
+ ToolUseContract(
699
+ "manage-collaborators",
700
+ description="Add and remove repository collaborators",
701
+ steps=(
702
+ ToolStep(
703
+ "github_add_collaborator",
704
+ params=("owner", "repo", "username"),
705
+ result=("result",),
706
+ refusals=(
707
+ Refusal(
708
+ "access_denied", "the credential lacks access to the system"
709
+ ),
710
+ ),
711
+ ),
712
+ ToolStep(
713
+ "github_get_collaborators",
714
+ params=("owner", "repo"),
715
+ result=("result",),
716
+ refusals=(Refusal("not_found", "the named object does not exist"),),
717
+ ),
718
+ ToolStep(
719
+ "github_remove_collaborator",
720
+ params=("owner", "repo", "username"),
721
+ result=("result",),
722
+ refusals=(
723
+ Refusal(
724
+ "confirmation_required",
725
+ "the destructive call omits confirm=true",
726
+ ),
727
+ Refusal("not_found", "the named object does not exist"),
728
+ ),
729
+ ),
730
+ ),
731
+ ),
732
+ ToolUseContract(
733
+ "administer-organization",
734
+ description="Manage organization membership, teams and settings",
735
+ steps=(
736
+ ToolStep(
737
+ "github_create_organization",
738
+ params=("login", "admin"),
739
+ result=("result",),
740
+ refusals=(
741
+ Refusal(
742
+ "access_denied", "the credential lacks access to the system"
743
+ ),
744
+ ),
745
+ ),
746
+ ToolStep(
747
+ "github_delete_organization",
748
+ params=("org",),
749
+ result=("result",),
750
+ refusals=(
751
+ Refusal(
752
+ "confirmation_required",
753
+ "the destructive call omits confirm=true",
754
+ ),
755
+ Refusal("not_found", "the named object does not exist"),
756
+ ),
757
+ ),
758
+ ToolStep(
759
+ "github_get_org_members",
760
+ params=("org",),
761
+ result=("result",),
762
+ refusals=(Refusal("not_found", "the named object does not exist"),),
763
+ ),
764
+ ToolStep(
765
+ "github_get_org_teams",
766
+ params=("org",),
767
+ result=("result",),
768
+ refusals=(Refusal("not_found", "the named object does not exist"),),
769
+ ),
770
+ ToolStep(
771
+ "github_get_organization_membership",
772
+ params=("org", "username"),
773
+ result=("result",),
774
+ refusals=(Refusal("not_found", "the named object does not exist"),),
775
+ ),
776
+ ToolStep(
777
+ "github_remove_organization_member",
778
+ params=("org", "username"),
779
+ result=("result",),
780
+ refusals=(
781
+ Refusal(
782
+ "confirmation_required",
783
+ "the destructive call omits confirm=true",
784
+ ),
785
+ Refusal("not_found", "the named object does not exist"),
786
+ ),
787
+ ),
788
+ ToolStep(
789
+ "github_set_organization_membership",
790
+ params=("org", "username"),
791
+ result=("result",),
792
+ refusals=(),
793
+ ),
794
+ ToolStep(
795
+ "github_update_organization",
796
+ params=("org",),
797
+ result=("result",),
798
+ refusals=(Refusal("not_found", "the named object does not exist"),),
799
+ ),
800
+ ),
801
+ ),
802
+ ToolUseContract(
803
+ "search-code",
804
+ description="Search code across repositories",
805
+ steps=(
806
+ ToolStep(
807
+ "github_search_code",
808
+ params=("q",),
809
+ result=("result",),
810
+ refusals=(
811
+ Refusal(
812
+ "access_denied", "the credential lacks access to the system"
813
+ ),
814
+ ),
815
+ ),
816
+ ),
817
+ ),
818
+ ToolUseContract(
819
+ "query-graphql",
820
+ description="Run a GraphQL query or discover the schema for fleet-wide reads",
821
+ steps=(
822
+ ToolStep(
823
+ "github_discover_graphql_schema",
824
+ params=("type_name",),
825
+ result=("result",),
826
+ refusals=(
827
+ Refusal(
828
+ "access_denied", "the credential lacks access to the system"
829
+ ),
830
+ ),
831
+ ),
832
+ ToolStep(
833
+ "github_graphql", params=("query",), result=("result",), refusals=()
834
+ ),
835
+ ),
836
+ ),
837
+ ToolUseContract(
838
+ "ingest-repositories",
839
+ description="Mirror repositories into the knowledge graph",
840
+ steps=(
841
+ ToolStep(
842
+ "github_get_repositories",
843
+ params=("max_pages", "page", "per_page"),
844
+ result=("result",),
845
+ refusals=(
846
+ Refusal(
847
+ "access_denied", "the credential lacks access to the system"
848
+ ),
849
+ ),
850
+ ),
851
+ ToolStep(
852
+ "github_ingest_repos",
853
+ params=("visibility", "affiliation", "type"),
854
+ result=("result",),
855
+ refusals=(),
856
+ ),
857
+ ),
858
+ ),
859
+ ToolUseContract(
860
+ "other-operations",
861
+ description="Operations not covered by a named workflow",
862
+ steps=(
863
+ ToolStep(
864
+ "github_delete_content",
865
+ params=("owner", "repo", "path", "message", "sha"),
866
+ result=("result",),
867
+ refusals=(
868
+ Refusal(
869
+ "access_denied", "the credential lacks access to the system"
870
+ ),
871
+ Refusal(
872
+ "confirmation_required",
873
+ "the destructive call omits confirm=true",
874
+ ),
875
+ Refusal("not_found", "the named object does not exist"),
876
+ ),
877
+ ),
878
+ ),
879
+ ),
880
+ )
881
+
882
+ LINKS: tuple[SurfaceLink, ...] = (
883
+ SurfaceLink(
884
+ "find-repositories",
885
+ tools=(
886
+ "github_get_org_repos",
887
+ "github_get_organization",
888
+ "github_get_repositories",
889
+ "github_get_repository",
890
+ "github_list_organizations",
891
+ "github_search_repositories",
892
+ ),
893
+ prompts=(
894
+ "github-mcp-operator",
895
+ "github-mcp-repository-administrator",
896
+ "github-mcp-triage-lead",
897
+ ),
898
+ skills=(
899
+ "github-agent-operations",
900
+ "github-backlog-planner",
901
+ "github-repository-management",
902
+ ),
903
+ ),
904
+ SurfaceLink(
905
+ "provision-a-repository",
906
+ tools=(
907
+ "github_create_or_update_repo_secret",
908
+ "github_create_organization_repository",
909
+ "github_create_pages",
910
+ "github_create_repository",
911
+ "github_get_branch_protection",
912
+ "github_get_pages",
913
+ "github_get_pages_build_latest",
914
+ "github_get_repo_secret_public_key",
915
+ "github_get_repo_secrets",
916
+ "github_list_pages_builds",
917
+ "github_request_pages_build",
918
+ "github_update_branch_protection",
919
+ "github_update_pages",
920
+ "github_update_repository",
921
+ ),
922
+ prompts=("github-mcp-operator", "github-mcp-repository-administrator"),
923
+ skills=("github-project-provisioner", "github-repository-management"),
924
+ ),
925
+ SurfaceLink(
926
+ "retire-a-repository",
927
+ tools=(
928
+ "github_delete_branch_protection",
929
+ "github_delete_pages",
930
+ "github_delete_repo_secret",
931
+ "github_delete_repository",
932
+ ),
933
+ prompts=("github-mcp-operator", "github-mcp-repository-administrator"),
934
+ skills=("github-repository-management",),
935
+ ),
936
+ SurfaceLink(
937
+ "work-issues",
938
+ tools=(
939
+ "github_create_issue",
940
+ "github_create_issue_comment",
941
+ "github_delete_issue_comment",
942
+ "github_get_issue",
943
+ "github_get_issue_comment",
944
+ "github_get_issues",
945
+ "github_list_issue_comments",
946
+ "github_list_repo_issue_comments",
947
+ "github_search_issues",
948
+ "github_update_issue",
949
+ "github_update_issue_comment",
950
+ ),
951
+ prompts=("github-mcp-operator", "github-mcp-triage-lead"),
952
+ skills=(
953
+ "github-backlog-planner",
954
+ "github-issue-tracking",
955
+ "github-triage-resolver",
956
+ ),
957
+ ),
958
+ SurfaceLink(
959
+ "create-a-pull-request",
960
+ tools=(
961
+ "github_create_branch",
962
+ "github_create_content",
963
+ "github_create_pull_request",
964
+ "github_get_branch",
965
+ "github_get_branches",
966
+ "github_get_contents",
967
+ "github_request_reviewers",
968
+ "github_update_content",
969
+ ),
970
+ prompts=("github-mcp-operator", "github-mcp-release-manager"),
971
+ skills=(
972
+ "github-org-remediation-loop",
973
+ "github-pull-request-create",
974
+ "github-triage-resolver",
975
+ ),
976
+ ),
977
+ SurfaceLink(
978
+ "review-a-pull-request",
979
+ tools=(
980
+ "github_create_commit_comment",
981
+ "github_create_pull_request_review",
982
+ "github_create_review_comment",
983
+ "github_create_review_comment_reply",
984
+ "github_delete_commit_comment",
985
+ "github_delete_review_comment",
986
+ "github_get_commit",
987
+ "github_get_commit_comment",
988
+ "github_get_commits",
989
+ "github_get_pull_request",
990
+ "github_get_pull_requests",
991
+ "github_get_review_comment",
992
+ "github_list_commit_comments",
993
+ "github_list_repo_commit_comments",
994
+ "github_list_repo_review_comments",
995
+ "github_list_review_comments",
996
+ "github_update_commit_comment",
997
+ "github_update_review_comment",
998
+ ),
999
+ prompts=("github-mcp-operator", "github-mcp-release-manager"),
1000
+ skills=("github-pr-review-sweep", "github-pull-request-review"),
1001
+ ),
1002
+ SurfaceLink(
1003
+ "land-a-pull-request",
1004
+ tools=(
1005
+ "github_delete_branch",
1006
+ "github_merge_pull_request",
1007
+ "github_pulls_disable_auto_merge",
1008
+ "github_pulls_enable_auto_merge",
1009
+ "github_update_pull_request",
1010
+ ),
1011
+ prompts=("github-mcp-operator", "github-mcp-release-manager"),
1012
+ skills=(
1013
+ "github-org-remediation-loop",
1014
+ "github-pr-review-sweep",
1015
+ "github-pull-request-review",
1016
+ ),
1017
+ ),
1018
+ SurfaceLink(
1019
+ "review-ci-results",
1020
+ tools=(
1021
+ "github_get_workflow_job_logs",
1022
+ "github_get_workflow_run",
1023
+ "github_get_workflow_run_jobs",
1024
+ "github_get_workflow_runs",
1025
+ "github_get_workflows",
1026
+ "github_ingest_pipelines",
1027
+ ),
1028
+ prompts=("github-mcp-operator", "github-mcp-release-manager"),
1029
+ skills=(
1030
+ "github-actions-ci-review",
1031
+ "github-agent-operations",
1032
+ "github-ci-failure-sweep",
1033
+ ),
1034
+ ),
1035
+ SurfaceLink(
1036
+ "run-ci",
1037
+ tools=(
1038
+ "github_cancel_workflow_run",
1039
+ "github_delete_workflow_run",
1040
+ "github_rerun_workflow_run",
1041
+ "github_trigger_workflow_dispatch",
1042
+ ),
1043
+ prompts=("github-mcp-operator", "github-mcp-release-manager"),
1044
+ skills=("github-actions-ci-review", "github-ci-failure-sweep"),
1045
+ ),
1046
+ SurfaceLink(
1047
+ "review-dependabot-alerts",
1048
+ tools=(
1049
+ "github_get_dependabot_alert",
1050
+ "github_get_dependabot_alerts",
1051
+ "github_get_org_dependabot_alerts",
1052
+ "github_update_dependabot_alert",
1053
+ ),
1054
+ prompts=("github-mcp-operator", "github-mcp-triage-lead"),
1055
+ skills=("github-dependabot-review", "github-org-remediation-loop"),
1056
+ ),
1057
+ SurfaceLink(
1058
+ "publish-a-release",
1059
+ tools=(
1060
+ "github_create_release",
1061
+ "github_delete_release",
1062
+ "github_get_release",
1063
+ "github_get_releases",
1064
+ "github_update_release",
1065
+ ),
1066
+ prompts=("github-mcp-operator", "github-mcp-release-manager"),
1067
+ skills=("github-agent-operations", "github-tools"),
1068
+ ),
1069
+ SurfaceLink(
1070
+ "manage-collaborators",
1071
+ tools=(
1072
+ "github_add_collaborator",
1073
+ "github_get_collaborators",
1074
+ "github_remove_collaborator",
1075
+ ),
1076
+ prompts=("github-mcp-operator", "github-mcp-repository-administrator"),
1077
+ skills=("github-repository-management",),
1078
+ ),
1079
+ SurfaceLink(
1080
+ "administer-organization",
1081
+ tools=(
1082
+ "github_create_organization",
1083
+ "github_delete_organization",
1084
+ "github_get_org_members",
1085
+ "github_get_org_teams",
1086
+ "github_get_organization_membership",
1087
+ "github_remove_organization_member",
1088
+ "github_set_organization_membership",
1089
+ "github_update_organization",
1090
+ ),
1091
+ prompts=("github-mcp-operator", "github-mcp-repository-administrator"),
1092
+ skills=("github-org-remediation-loop",),
1093
+ ),
1094
+ SurfaceLink(
1095
+ "search-code",
1096
+ tools=("github_search_code",),
1097
+ prompts=("github-mcp-operator", "github-mcp-triage-lead"),
1098
+ skills=("github-tools",),
1099
+ ),
1100
+ SurfaceLink(
1101
+ "query-graphql",
1102
+ tools=("github_discover_graphql_schema", "github_graphql"),
1103
+ prompts=("github-mcp-operator", "github-mcp-triage-lead"),
1104
+ skills=("github-agent-operations", "github-tools"),
1105
+ ),
1106
+ SurfaceLink(
1107
+ "ingest-repositories",
1108
+ tools=("github_get_repositories", "github_ingest_repos"),
1109
+ prompts=("github-mcp-operator", "github-mcp-triage-lead"),
1110
+ skills=("github-tools",),
1111
+ ),
1112
+ SurfaceLink(
1113
+ "other-operations",
1114
+ tools=("github_delete_content",),
1115
+ prompts=("github-mcp-operator",),
1116
+ skills=(),
1117
+ ),
1118
+ )
1119
+
1120
+ LOCATIONS: tuple[DataLocation, ...] = (
1121
+ DataLocation(
1122
+ "github-repositories",
1123
+ ("SoftwareProject", "Repository"),
1124
+ "GITHUB_URL",
1125
+ "github_get_repositories",
1126
+ federation_key="repo",
1127
+ ),
1128
+ DataLocation(
1129
+ "github-issues",
1130
+ ("Issue",),
1131
+ "GITHUB_URL",
1132
+ "github_get_issues",
1133
+ federation_key="number",
1134
+ ),
1135
+ DataLocation(
1136
+ "github-pull-requests",
1137
+ ("PullRequest",),
1138
+ "GITHUB_URL",
1139
+ "github_get_pull_requests",
1140
+ federation_key="number",
1141
+ ),
1142
+ DataLocation(
1143
+ "github-actions-runs",
1144
+ ("Deployment",),
1145
+ "GITHUB_URL",
1146
+ "github_get_workflow_runs",
1147
+ federation_key="run_id",
1148
+ ),
1149
+ DataLocation(
1150
+ "github-organizations",
1151
+ ("Organization", "Person"),
1152
+ "GITHUB_URL",
1153
+ "github_get_organization",
1154
+ federation_key="org",
1155
+ ),
1156
+ )
1157
+
1158
+ ROLES: tuple[BusinessRole, ...] = (
1159
+ BusinessRole(
1160
+ "release-manager",
1161
+ tasks=(
1162
+ "create-a-pull-request",
1163
+ "review-a-pull-request",
1164
+ "land-a-pull-request",
1165
+ "review-ci-results",
1166
+ "run-ci",
1167
+ "publish-a-release",
1168
+ ),
1169
+ ),
1170
+ BusinessRole(
1171
+ "repository-administrator",
1172
+ tasks=(
1173
+ "find-repositories",
1174
+ "provision-a-repository",
1175
+ "retire-a-repository",
1176
+ "manage-collaborators",
1177
+ "administer-organization",
1178
+ ),
1179
+ ),
1180
+ BusinessRole(
1181
+ "triage-lead",
1182
+ tasks=(
1183
+ "work-issues",
1184
+ "review-dependabot-alerts",
1185
+ "search-code",
1186
+ "query-graphql",
1187
+ "ingest-repositories",
1188
+ "find-repositories",
1189
+ ),
1190
+ ),
1191
+ )