@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 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
  [![npm version](https://img.shields.io/npm/v/@github-tools/sdk?color=black)](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
- 18 tools covering repositories, pull requests, issues, commits, and search. Write operations support granular approval control out of the box.
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
- | `maintainer` | All 18 tools |
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 { createOctokit, listPullRequests, createIssue } from '@github-tools/sdk'
78
+ import { listPullRequests, createIssue } from '@github-tools/sdk'
76
79
 
77
- const octokit = createOctokit(process.env.GITHUB_TOKEN!)
80
+ const token = process.env.GITHUB_TOKEN!
78
81
 
79
82
  const tools = {
80
- listPullRequests: listPullRequests(octokit),
81
- createIssue: createIssue(octokit),
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: string
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 [`@octokit/rest`](https://github.com/octokit/rest.js) instance. Useful when cherry-picking individual tools or building custom ones.
369
+ Returns a configured [`octokit`](https://github.com/octokit/octokit.js) instance. Useful for building custom tools.
257
370
 
258
371
  ## License
259
372