github-agent 2.4.14__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 (72) 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 +3 -3
  5. github_agent/ontology/github.ttl +4 -5
  6. github_agent/ontology/mappings/source.yaml +1 -2
  7. github_agent/prompts/github-mcp-operator.json +347 -0
  8. github_agent/prompts/github-mcp-release-manager.json +203 -0
  9. github_agent/prompts/github-mcp-repository-administrator.json +171 -0
  10. github_agent/prompts/github-mcp-triage-lead.json +147 -0
  11. github_agent/skills/github-actions-ci-review/SKILL.md +24 -75
  12. github_agent/skills/github-agent-operations/SKILL.md +47 -19
  13. github_agent/skills/github-backlog-planner/SKILL.md +31 -97
  14. github_agent/skills/github-ci-failure-sweep/SKILL.md +24 -93
  15. github_agent/skills/github-ci-failure-sweep/scripts/summarize_runs.py +1 -1
  16. github_agent/skills/github-dependabot-review/SKILL.md +16 -88
  17. github_agent/skills/github-issue-tracking/SKILL.md +23 -80
  18. github_agent/skills/github-org-remediation-loop/SKILL.md +44 -262
  19. github_agent/skills/github-pr-review-sweep/SKILL.md +47 -106
  20. github_agent/skills/github-pr-review-sweep/scripts/summarize_prs.py +7 -5
  21. github_agent/skills/github-project-provisioner/SKILL.md +27 -44
  22. github_agent/skills/github-pull-request-create/SKILL.md +20 -66
  23. github_agent/skills/github-pull-request-review/SKILL.md +47 -126
  24. github_agent/skills/github-repository-management/SKILL.md +61 -94
  25. github_agent/skills/github-tools/SKILL.md +28 -128
  26. github_agent/skills/github-triage-resolver/SKILL.md +33 -104
  27. github_agent/skills/github-triage-resolver/scripts/classify_safe.py +2 -2
  28. github_agent/skills/github-triage-resolver/scripts/gh_write.py +3 -3
  29. {github_agent-2.4.14.dist-info → github_agent-2.4.15.dist-info}/METADATA +6 -42
  30. {github_agent-2.4.14.dist-info → github_agent-2.4.15.dist-info}/RECORD +36 -67
  31. tests/test_default_content_surfaces.py +2 -0
  32. tests/test_pages.py +0 -265
  33. github_agent/mcp/mcp_action.py +0 -296
  34. github_agent/mcp/mcp_branch.py +0 -153
  35. github_agent/mcp/mcp_collaborator.py +0 -125
  36. github_agent/mcp/mcp_commit.py +0 -94
  37. github_agent/mcp/mcp_content.py +0 -168
  38. github_agent/mcp/mcp_dependabot.py +0 -207
  39. github_agent/mcp/mcp_issue.py +0 -188
  40. github_agent/mcp/mcp_org.py +0 -359
  41. github_agent/mcp/mcp_pull.py +0 -353
  42. github_agent/mcp/mcp_release.py +0 -171
  43. github_agent/mcp/mcp_repo.py +0 -528
  44. github_agent/mcp/mcp_search.py +0 -82
  45. github_agent/skills/github-actions-ci-review/WORKFLOW.md +0 -82
  46. github_agent/skills/github-agent-operations/agents/openai.yaml +0 -4
  47. github_agent/skills/github-agent-operations/references/catalog.md +0 -17
  48. github_agent/skills/github-backlog-planner/WORKFLOW.md +0 -98
  49. github_agent/skills/github-ci-failure-sweep/WORKFLOW.md +0 -96
  50. github_agent/skills/github-ci-failure-sweep/references/actions-tool-cheatsheet.md +0 -60
  51. github_agent/skills/github-dependabot-review/WORKFLOW.md +0 -91
  52. github_agent/skills/github-issue-tracking/WORKFLOW.md +0 -83
  53. github_agent/skills/github-org-remediation-loop/WORKFLOW.md +0 -267
  54. github_agent/skills/github-pr-review-sweep/WORKFLOW.md +0 -95
  55. github_agent/skills/github-pr-review-sweep/references/pulls-tool-cheatsheet.md +0 -42
  56. github_agent/skills/github-project-provisioner/WORKFLOW.md +0 -51
  57. github_agent/skills/github-pull-request-create/WORKFLOW.md +0 -70
  58. github_agent/skills/github-pull-request-review/WORKFLOW.md +0 -121
  59. github_agent/skills/github-repository-management/WORKFLOW.md +0 -90
  60. github_agent/skills/github-tools/WORKFLOW.md +0 -141
  61. github_agent/skills/github-triage-resolver/WORKFLOW.md +0 -99
  62. tests/test_action_discovery.py +0 -177
  63. tests/test_comment_crud.py +0 -890
  64. tests/test_hardening.py +0 -114
  65. tests/test_mcp_coverage.py +0 -1343
  66. tests/test_mcp_package_dispatch.py +0 -785
  67. tests/test_org_crud.py +0 -626
  68. tests/test_repo_secrets_characterization.py +0 -198
  69. {github_agent-2.4.14.dist-info → github_agent-2.4.15.dist-info}/WHEEL +0 -0
  70. {github_agent-2.4.14.dist-info → github_agent-2.4.15.dist-info}/entry_points.txt +0 -0
  71. {github_agent-2.4.14.dist-info → github_agent-2.4.15.dist-info}/licenses/LICENSE +0 -0
  72. {github_agent-2.4.14.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
+ )