@github-tools/sdk 1.2.0 → 1.3.0
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.
- package/README.md +126 -13
- package/dist/agents-Cdb0a8CP.mjs +1455 -0
- package/dist/agents-Cdb0a8CP.mjs.map +1 -0
- package/dist/agents-CnwdZ0Wk.d.mts +692 -0
- package/dist/agents-CnwdZ0Wk.d.mts.map +1 -0
- package/dist/index.d.mts +250 -427
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +77 -776
- package/dist/index.mjs.map +1 -1
- package/dist/workflow.d.mts +649 -0
- package/dist/workflow.d.mts.map +1 -0
- package/dist/workflow.mjs +55 -0
- package/dist/workflow.mjs.map +1 -0
- package/package.json +22 -4
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
<img src="https://github.com/vercel-labs/github-tools/blob/main/assets/banner.jpg" width="100%" alt="GitHub Tools banner" />
|
|
2
|
+
|
|
1
3
|
# @github-tools/sdk
|
|
2
4
|
|
|
3
5
|
[](https://npmjs.com/package/@github-tools/sdk)
|
|
@@ -7,7 +9,7 @@
|
|
|
7
9
|
|
|
8
10
|
GitHub tools for the [AI SDK](https://ai-sdk.dev) — wrap GitHub's REST API as ready-to-use tools for any agent or `generateText` / `streamText` call.
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
36 tools covering repositories, branches, pull requests, issues, commits, search, gists, and workflows. Write operations support granular approval control out of the box.
|
|
11
13
|
|
|
12
14
|
## Installation
|
|
13
15
|
|
|
@@ -60,10 +62,11 @@ createGithubTools({ token, preset: ['code-review', 'issue-triage'] })
|
|
|
60
62
|
|
|
61
63
|
| Preset | Tools included |
|
|
62
64
|
|---|---|
|
|
63
|
-
| `code-review` | `getPullRequest`, `listPullRequests`, `getFileContent`, `listCommits`, `getCommit`, `getRepository`, `listBranches`, `searchCode`, `addPullRequestComment` |
|
|
65
|
+
| `code-review` | `getPullRequest`, `listPullRequests`, `getFileContent`, `listCommits`, `getCommit`, `getBlame`, `getRepository`, `listBranches`, `searchCode`, `addPullRequestComment` |
|
|
64
66
|
| `issue-triage` | `listIssues`, `getIssue`, `createIssue`, `addIssueComment`, `closeIssue`, `getRepository`, `searchRepositories`, `searchCode` |
|
|
65
|
-
| `repo-explorer` | All read-only tools (no write operations) |
|
|
66
|
-
| `
|
|
67
|
+
| `repo-explorer` | All read-only tools including gists and workflows (no write operations) |
|
|
68
|
+
| `ci-ops` | `listWorkflows`, `listWorkflowRuns`, `getWorkflowRun`, `listWorkflowJobs`, `triggerWorkflow`, `cancelWorkflowRun`, `rerunWorkflowRun`, `getRepository`, `listBranches`, `listCommits`, `getCommit` |
|
|
69
|
+
| `maintainer` | All 36 tools |
|
|
67
70
|
|
|
68
71
|
Omit `preset` to get all tools (same as `maintainer`).
|
|
69
72
|
|
|
@@ -72,16 +75,18 @@ Omit `preset` to get all tools (same as `maintainer`).
|
|
|
72
75
|
You can also import individual tool factories for full control:
|
|
73
76
|
|
|
74
77
|
```ts
|
|
75
|
-
import {
|
|
78
|
+
import { listPullRequests, createIssue } from '@github-tools/sdk'
|
|
76
79
|
|
|
77
|
-
const
|
|
80
|
+
const token = process.env.GITHUB_TOKEN!
|
|
78
81
|
|
|
79
82
|
const tools = {
|
|
80
|
-
listPullRequests: listPullRequests(
|
|
81
|
-
createIssue: createIssue(
|
|
83
|
+
listPullRequests: listPullRequests(token),
|
|
84
|
+
createIssue: createIssue(token),
|
|
82
85
|
}
|
|
83
86
|
```
|
|
84
87
|
|
|
88
|
+
Each tool factory accepts a `token` string. Tools use named module-level step functions with `"use step"` internally, ensuring proper step registration and full Node.js access when running inside a Vercel Workflow sandbox. See [Durable Agents](#durable-agents-vercel-workflow-sdk).
|
|
89
|
+
|
|
85
90
|
## Approval Control
|
|
86
91
|
|
|
87
92
|
Write operations (creating issues, merging PRs, pushing files, …) require user approval by default. This is designed for human-in-the-loop agent workflows.
|
|
@@ -108,10 +113,57 @@ createGithubTools({
|
|
|
108
113
|
})
|
|
109
114
|
```
|
|
110
115
|
|
|
111
|
-
Write tools: `createOrUpdateFile`, `createPullRequest`, `mergePullRequest`, `addPullRequestComment`, `createIssue`, `addIssueComment`, `closeIssue`.
|
|
116
|
+
Write tools: `createOrUpdateFile`, `createPullRequest`, `mergePullRequest`, `addPullRequestComment`, `createIssue`, `addIssueComment`, `closeIssue`, `createGist`, `updateGist`, `deleteGist`, `createGistComment`, `triggerWorkflow`, `cancelWorkflowRun`, `rerunWorkflowRun`.
|
|
112
117
|
|
|
113
118
|
All other tools are read-only and never require approval.
|
|
114
119
|
|
|
120
|
+
## Tool Selection with toolpick
|
|
121
|
+
|
|
122
|
+
With dozens of tools, context window usage adds up. [toolpick](https://github.com/pontusab/toolpick) selects only the most relevant tools per step so the model sees what it needs:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
import { createGithubTools } from '@github-tools/sdk'
|
|
126
|
+
import { createToolIndex } from 'toolpick'
|
|
127
|
+
import { generateText } from 'ai'
|
|
128
|
+
import { openai } from '@ai-sdk/openai'
|
|
129
|
+
|
|
130
|
+
const tools = createGithubTools()
|
|
131
|
+
const index = createToolIndex(tools, {
|
|
132
|
+
embeddingModel: openai.embeddingModel('text-embedding-3-small'),
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
const result = await generateText({
|
|
136
|
+
model: openai('gpt-4o'),
|
|
137
|
+
tools,
|
|
138
|
+
prepareStep: index.prepareStep(),
|
|
139
|
+
prompt: 'List open PRs on vercel/ai and summarize them.',
|
|
140
|
+
})
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Each step, toolpick picks the best ~5 tools using keyword + semantic search. All tools remain callable — only the visible set changes. See [toolpick docs](https://github.com/pontusab/toolpick) for LLM re-ranking, caching, and model-driven discovery options.
|
|
144
|
+
|
|
145
|
+
## Durable Agents (Vercel Workflow SDK)
|
|
146
|
+
|
|
147
|
+
All tools include `"use step"` directives with named, module-level step functions, making them natively compatible with the Vercel Workflow SDK. Each tool execution runs as a properly registered durable step with full Node.js access in the workflow sandbox.
|
|
148
|
+
|
|
149
|
+
Use `DurableAgent` via the `@github-tools/sdk/workflow` subpath to make every LLM call and tool execution a retryable, crash-safe step:
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
import { createDurableGithubAgent } from '@github-tools/sdk/workflow'
|
|
153
|
+
|
|
154
|
+
const agent = createDurableGithubAgent({
|
|
155
|
+
model: 'anthropic/claude-sonnet-4.6',
|
|
156
|
+
token: process.env.GITHUB_TOKEN!,
|
|
157
|
+
preset: 'maintainer',
|
|
158
|
+
})
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
All presets work with `createDurableGithubAgent`.
|
|
162
|
+
|
|
163
|
+
> **Approval control limitation**: `requireApproval` is accepted for forward-compatibility but is currently ignored by `DurableAgent`. The Workflow SDK does not yet support interactive tool approval — all tools execute immediately. Use `createGithubAgent` (standard `ToolLoopAgent`) when human-in-the-loop approval is required.
|
|
164
|
+
|
|
165
|
+
> `workflow` and `@workflow/ai` are optional peer dependencies — install them only when using the workflow subpath.
|
|
166
|
+
|
|
115
167
|
## Available Tools
|
|
116
168
|
|
|
117
169
|
### Repository
|
|
@@ -143,12 +195,37 @@ All other tools are read-only and never require approval.
|
|
|
143
195
|
| `addIssueComment` | Post a comment on an issue |
|
|
144
196
|
| `closeIssue` | Close an issue (completed or not planned) |
|
|
145
197
|
|
|
198
|
+
### Gists
|
|
199
|
+
|
|
200
|
+
| Tool | Description |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `listGists` | List gists for the authenticated user or a specific user |
|
|
203
|
+
| `getGist` | Get a gist including file contents |
|
|
204
|
+
| `listGistComments` | List comments on a gist |
|
|
205
|
+
| `createGist` | Create a new gist with one or more files |
|
|
206
|
+
| `updateGist` | Update a gist's description or files |
|
|
207
|
+
| `deleteGist` | Delete a gist permanently |
|
|
208
|
+
| `createGistComment` | Post a comment on a gist |
|
|
209
|
+
|
|
210
|
+
### Workflows
|
|
211
|
+
|
|
212
|
+
| Tool | Description |
|
|
213
|
+
|---|---|
|
|
214
|
+
| `listWorkflows` | List GitHub Actions workflows in a repository |
|
|
215
|
+
| `listWorkflowRuns` | List workflow runs filtered by workflow, branch, status, or event |
|
|
216
|
+
| `getWorkflowRun` | Get a workflow run's status, timing, and trigger info |
|
|
217
|
+
| `listWorkflowJobs` | List jobs in a workflow run with step-level status |
|
|
218
|
+
| `triggerWorkflow` | Trigger a workflow via workflow_dispatch event |
|
|
219
|
+
| `cancelWorkflowRun` | Cancel an in-progress workflow run |
|
|
220
|
+
| `rerunWorkflowRun` | Re-run a workflow run, optionally only failed jobs |
|
|
221
|
+
|
|
146
222
|
### Commits
|
|
147
223
|
|
|
148
224
|
| Tool | Description |
|
|
149
225
|
|---|---|
|
|
150
226
|
| `listCommits` | List commits, optionally filtered by file path, author, or date range |
|
|
151
227
|
| `getCommit` | Get a commit's full details including changed files and diffs |
|
|
228
|
+
| `getBlame` | Line-level git blame for a file (GitHub GraphQL) |
|
|
152
229
|
|
|
153
230
|
### Search
|
|
154
231
|
|
|
@@ -168,13 +245,18 @@ Create one at **GitHub → Settings → Developer settings → Personal access t
|
|
|
168
245
|
| Permission | Level | Required for |
|
|
169
246
|
|---|---|---|
|
|
170
247
|
| **Metadata** | Read-only | Always required (auto-included) |
|
|
171
|
-
| **Contents** | Read-only | `getRepository`, `listBranches`, `getFileContent`, `listCommits`, `getCommit` |
|
|
248
|
+
| **Contents** | Read-only | `getRepository`, `listBranches`, `getFileContent`, `listCommits`, `getCommit`, `getBlame` |
|
|
172
249
|
| **Contents** | Read and write | `createOrUpdateFile` |
|
|
173
250
|
| **Pull requests** | Read-only | `listPullRequests`, `getPullRequest` |
|
|
174
251
|
| **Pull requests** | Read and write | `createPullRequest`, `mergePullRequest`, `addPullRequestComment` |
|
|
175
252
|
| **Issues** | Read-only | `listIssues`, `getIssue` |
|
|
176
253
|
| **Issues** | Read and write | `createIssue`, `addIssueComment`, `closeIssue` |
|
|
177
254
|
|
|
255
|
+
| **Gists** | Read-only | `listGists`, `getGist`, `listGistComments` |
|
|
256
|
+
| **Gists** | Read and write | `createGist`, `updateGist`, `deleteGist`, `createGistComment` |
|
|
257
|
+
| **Actions** | Read-only | `listWorkflows`, `listWorkflowRuns`, `getWorkflowRun`, `listWorkflowJobs` |
|
|
258
|
+
| **Actions** | Read and write | `triggerWorkflow`, `cancelWorkflowRun`, `rerunWorkflowRun` |
|
|
259
|
+
|
|
178
260
|
Search tools (`searchCode`, `searchRepositories`) work with any token.
|
|
179
261
|
|
|
180
262
|
### Classic token
|
|
@@ -192,12 +274,12 @@ Returns an object of tools, ready to spread into `tools` of any AI SDK call.
|
|
|
192
274
|
|
|
193
275
|
```ts
|
|
194
276
|
type GithubToolsOptions = {
|
|
195
|
-
token
|
|
277
|
+
token?: string // defaults to process.env.GITHUB_TOKEN
|
|
196
278
|
requireApproval?: boolean | Partial<Record<GithubWriteToolName, boolean>>
|
|
197
279
|
preset?: GithubToolPreset | GithubToolPreset[]
|
|
198
280
|
}
|
|
199
281
|
|
|
200
|
-
type GithubToolPreset = 'code-review' | 'issue-triage' | 'repo-explorer' | 'maintainer'
|
|
282
|
+
type GithubToolPreset = 'code-review' | 'issue-triage' | 'repo-explorer' | 'ci-ops' | 'maintainer'
|
|
201
283
|
```
|
|
202
284
|
|
|
203
285
|
### `createGithubAgent(options)`
|
|
@@ -251,9 +333,40 @@ const stream = reviewer.stream({ prompt: 'Review PR #42 on vercel/ai' })
|
|
|
251
333
|
|
|
252
334
|
All other `ToolLoopAgent` options (`stopWhen`, `toolChoice`, `onStepFinish`, etc.) are passed through.
|
|
253
335
|
|
|
336
|
+
### `createDurableGithubAgent(options)`
|
|
337
|
+
|
|
338
|
+
Returns a `DurableAgent` instance for use inside Vercel Workflow SDK functions. Every LLM call and tool execution runs as a durable step with automatic retries and crash recovery.
|
|
339
|
+
|
|
340
|
+
Requires the optional peer dependencies `workflow` and `@workflow/ai`:
|
|
341
|
+
|
|
342
|
+
```sh
|
|
343
|
+
pnpm add workflow @workflow/ai
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
```ts
|
|
347
|
+
import { createDurableGithubAgent } from '@github-tools/sdk/workflow'
|
|
348
|
+
import { getWritable } from 'workflow'
|
|
349
|
+
import type { ModelMessage, UIMessageChunk } from 'ai'
|
|
350
|
+
|
|
351
|
+
async function chatWorkflow(messages: ModelMessage[], token: string) {
|
|
352
|
+
"use workflow"
|
|
353
|
+
const agent = createDurableGithubAgent({
|
|
354
|
+
model: 'anthropic/claude-sonnet-4.6',
|
|
355
|
+
token,
|
|
356
|
+
preset: 'code-review',
|
|
357
|
+
})
|
|
358
|
+
const writable = getWritable<UIMessageChunk>()
|
|
359
|
+
await agent.stream({ messages, writable })
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
All presets (`code-review`, `issue-triage`, `ci-ops`, `repo-explorer`, `maintainer`) work with `createDurableGithubAgent`. The options are the same as `createGithubAgent` except it returns a `DurableAgent` instead of a `ToolLoopAgent`.
|
|
364
|
+
|
|
365
|
+
> **Note:** `requireApproval` is accepted but currently ignored by `DurableAgent` — the Workflow SDK does not yet support interactive tool approval.
|
|
366
|
+
|
|
254
367
|
### `createOctokit(token)`
|
|
255
368
|
|
|
256
|
-
Returns a configured [
|
|
369
|
+
Returns a configured [`octokit`](https://github.com/octokit/octokit.js) instance. Useful for building custom tools.
|
|
257
370
|
|
|
258
371
|
## License
|
|
259
372
|
|