@github-tools/sdk 0.0.1 → 1.1.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
@@ -34,9 +34,42 @@ const result = await generateText({
34
34
  })
35
35
  ```
36
36
 
37
+ ### Presets
38
+
39
+ Use `preset` to get only the tools relevant to a specific use case:
40
+
41
+ ```ts
42
+ // Code-review agent — PRs, commits, file content, and comments
43
+ createGithubTools({ token, preset: 'code-review' })
44
+
45
+ // Issue triage — read/create/close issues, search
46
+ createGithubTools({ token, preset: 'issue-triage' })
47
+
48
+ // Read-only exploration — browse repos without write access
49
+ createGithubTools({ token, preset: 'repo-explorer' })
50
+
51
+ // Full maintenance — all tools
52
+ createGithubTools({ token, preset: 'maintainer' })
53
+ ```
54
+
55
+ Presets are composable — pass an array to combine them:
56
+
57
+ ```ts
58
+ createGithubTools({ token, preset: ['code-review', 'issue-triage'] })
59
+ ```
60
+
61
+ | Preset | Tools included |
62
+ |---|---|
63
+ | `code-review` | `getPullRequest`, `listPullRequests`, `getFileContent`, `listCommits`, `getCommit`, `getRepository`, `listBranches`, `searchCode`, `addPullRequestComment` |
64
+ | `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
+
68
+ Omit `preset` to get all tools (same as `maintainer`).
69
+
37
70
  ### Cherry-Picking Tools
38
71
 
39
- You can import individual tool factories instead of the full set:
72
+ You can also import individual tool factories for full control:
40
73
 
41
74
  ```ts
42
75
  import { createOctokit, listPullRequests, createIssue } from '@github-tools/sdk'
@@ -155,15 +188,69 @@ Search tools (`searchCode`, `searchRepositories`) work with any token.
155
188
 
156
189
  ### `createGithubTools(options)`
157
190
 
158
- Returns an object of all 18 tools, ready to spread into `tools` of any AI SDK call.
191
+ Returns an object of tools, ready to spread into `tools` of any AI SDK call.
159
192
 
160
193
  ```ts
161
194
  type GithubToolsOptions = {
162
195
  token: string
163
196
  requireApproval?: boolean | Partial<Record<GithubWriteToolName, boolean>>
197
+ preset?: GithubToolPreset | GithubToolPreset[]
164
198
  }
199
+
200
+ type GithubToolPreset = 'code-review' | 'issue-triage' | 'repo-explorer' | 'maintainer'
165
201
  ```
166
202
 
203
+ ### `createGithubAgent(options)`
204
+
205
+ Returns a `ToolLoopAgent` instance with `.generate()` and `.stream()` methods, pre-configured with GitHub tools and tailored instructions.
206
+
207
+ ```ts
208
+ import { createGithubAgent } from '@github-tools/sdk'
209
+
210
+ // Minimal — all tools, generic prompt
211
+ const agent = createGithubAgent({
212
+ model: 'anthropic/claude-sonnet-4-6',
213
+ token: process.env.GITHUB_TOKEN!,
214
+ })
215
+
216
+ // With preset — scoped tools + tailored prompt
217
+ const reviewer = createGithubAgent({
218
+ model: 'anthropic/claude-sonnet-4-6',
219
+ token: process.env.GITHUB_TOKEN!,
220
+ preset: 'code-review',
221
+ })
222
+
223
+ // Add context to the built-in prompt
224
+ const triager = createGithubAgent({
225
+ model: 'anthropic/claude-sonnet-4-6',
226
+ token: process.env.GITHUB_TOKEN!,
227
+ preset: 'issue-triage',
228
+ additionalInstructions: 'Focus on the nuxt/ui repository. Always respond in French.',
229
+ })
230
+
231
+ // Full override — replace the built-in prompt entirely
232
+ const custom = createGithubAgent({
233
+ model: 'anthropic/claude-sonnet-4-6',
234
+ token: process.env.GITHUB_TOKEN!,
235
+ instructions: 'You are a security auditor. Only flag security-related issues.',
236
+ })
237
+
238
+ // Use the agent
239
+ const result = await reviewer.generate({ prompt: 'Review PR #42 on vercel/ai' })
240
+ const stream = reviewer.stream({ prompt: 'Review PR #42 on vercel/ai' })
241
+ ```
242
+
243
+ | Option | Description |
244
+ |---|---|
245
+ | `model` | Language model — string (`'anthropic/claude-sonnet-4-6'`) or provider instance |
246
+ | `token` | GitHub personal access token |
247
+ | `preset` | Optional preset or array of presets to scope tools |
248
+ | `requireApproval` | Approval config (same as `createGithubTools`) |
249
+ | `instructions` | Replaces the built-in system prompt entirely |
250
+ | `additionalInstructions` | Appended to the built-in system prompt |
251
+
252
+ All other `ToolLoopAgent` options (`stopWhen`, `toolChoice`, `onStepFinish`, etc.) are passed through.
253
+
167
254
  ### `createOctokit(token)`
168
255
 
169
256
  Returns a configured [`@octokit/rest`](https://github.com/octokit/rest.js) instance. Useful when cherry-picking individual tools or building custom ones.
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Octokit, Octokit as Octokit$1 } from "@octokit/rest";
2
2
  import * as ai from "ai";
3
+ import { ToolLoopAgent, ToolLoopAgentSettings } from "ai";
3
4
 
4
5
  //#region src/client.d.ts
5
6
  declare function createOctokit(token: string): Octokit$1;
@@ -329,6 +330,47 @@ declare const getCommit: (octokit: Octokit) => ai.Tool<{
329
330
  }[] | undefined;
330
331
  }>;
331
332
  //#endregion
333
+ //#region src/agents.d.ts
334
+ type AgentOptions = Omit<ToolLoopAgentSettings, 'model' | 'tools' | 'instructions'>;
335
+ type CreateGithubAgentOptions = AgentOptions & {
336
+ model: ToolLoopAgentSettings['model'];
337
+ /**
338
+ * GitHub personal access token.
339
+ * Falls back to `process.env.GITHUB_TOKEN` when omitted.
340
+ */
341
+ token?: string;
342
+ preset?: GithubToolPreset | GithubToolPreset[];
343
+ requireApproval?: ApprovalConfig;
344
+ instructions?: string;
345
+ additionalInstructions?: string;
346
+ };
347
+ /**
348
+ * Create a pre-configured GitHub agent powered by the AI SDK's `ToolLoopAgent`.
349
+ *
350
+ * Returns a `ToolLoopAgent` instance with `.generate()` and `.stream()` methods.
351
+ *
352
+ * @example
353
+ * ```ts
354
+ * import { createGithubAgent } from '@github-tools/sdk'
355
+ *
356
+ * const agent = createGithubAgent({
357
+ * model: 'anthropic/claude-sonnet-4-6',
358
+ * token: process.env.GITHUB_TOKEN!,
359
+ * preset: 'code-review',
360
+ * })
361
+ *
362
+ * const result = await agent.generate({ prompt: 'Review PR #42 on vercel/ai' })
363
+ * ```
364
+ */
365
+ declare function createGithubAgent({
366
+ token,
367
+ preset,
368
+ requireApproval,
369
+ instructions,
370
+ additionalInstructions,
371
+ ...agentOptions
372
+ }: CreateGithubAgentOptions): ToolLoopAgent<never, {}, never>;
373
+ //#endregion
332
374
  //#region src/index.d.ts
333
375
  type GithubWriteToolName = 'createOrUpdateFile' | 'createPullRequest' | 'mergePullRequest' | 'addPullRequestComment' | 'createIssue' | 'addIssueComment' | 'closeIssue';
334
376
  /**
@@ -339,7 +381,6 @@ type GithubWriteToolName = 'createOrUpdateFile' | 'createPullRequest' | 'mergePu
339
381
  *
340
382
  * @example
341
383
  * ```ts
342
- * // Only merging and file changes need approval, comments are fine
343
384
  * requireApproval: {
344
385
  * mergePullRequest: true,
345
386
  * createOrUpdateFile: true,
@@ -349,43 +390,72 @@ type GithubWriteToolName = 'createOrUpdateFile' | 'createPullRequest' | 'mergePu
349
390
  * ```
350
391
  */
351
392
  type ApprovalConfig = boolean | Partial<Record<GithubWriteToolName, boolean>>;
393
+ /**
394
+ * Predefined tool presets for common use cases.
395
+ *
396
+ * - `'code-review'` — Review PRs: read PRs, file content, commits, and post comments
397
+ * - `'issue-triage'` — Triage issues: read/create/close issues, search, and comment
398
+ * - `'repo-explorer'` — Explore repos: read-only access to repos, branches, code, and search
399
+ * - `'maintainer'` — Full maintenance: all read + create PRs, merge, manage issues
400
+ */
401
+ type GithubToolPreset = 'code-review' | 'issue-triage' | 'repo-explorer' | 'maintainer';
352
402
  type GithubToolsOptions = {
353
- token: string;
403
+ /**
404
+ * GitHub personal access token.
405
+ * Falls back to `process.env.GITHUB_TOKEN` when omitted.
406
+ */
407
+ token?: string;
354
408
  requireApproval?: ApprovalConfig;
409
+ /**
410
+ * Restrict the returned tools to a predefined preset.
411
+ * Omit to get all tools.
412
+ *
413
+ * @example
414
+ * ```ts
415
+ * // Only code-review tools
416
+ * createGithubTools({ token, preset: 'code-review' })
417
+ *
418
+ * // Combine presets
419
+ * createGithubTools({ token, preset: ['code-review', 'issue-triage'] })
420
+ * ```
421
+ */
422
+ preset?: GithubToolPreset | GithubToolPreset[];
355
423
  };
356
424
  /**
357
425
  * Create a set of GitHub tools for the Vercel AI SDK.
358
426
  *
359
427
  * Write operations require user approval by default.
360
428
  * Control this globally or per-tool via `requireApproval`.
429
+ * Use `preset` to get only the tools you need.
361
430
  *
362
431
  * @example
363
432
  * ```ts
364
- * // All writes need approval (default)
433
+ * // All tools (default)
365
434
  * createGithubTools({ token })
366
435
  *
367
- * // No approval at all
368
- * createGithubTools({ token, requireApproval: false })
436
+ * // Code-review agent only PR & commit tools
437
+ * createGithubTools({ token, preset: 'code-review' })
438
+ *
439
+ * // Combine presets
440
+ * createGithubTools({ token, preset: ['code-review', 'issue-triage'] })
369
441
  *
370
- * // Granular: only destructive actions need approval
442
+ * // Granular approval
371
443
  * createGithubTools({
372
444
  * token,
445
+ * preset: 'maintainer',
373
446
  * requireApproval: {
374
447
  * mergePullRequest: true,
375
448
  * createOrUpdateFile: true,
376
- * closeIssue: true,
377
- * createPullRequest: false,
378
449
  * addPullRequestComment: false,
379
- * createIssue: false,
380
- * addIssueComment: false,
381
450
  * }
382
451
  * })
383
452
  * ```
384
453
  */
385
454
  declare function createGithubTools({
386
455
  token,
387
- requireApproval
388
- }: GithubToolsOptions): {
456
+ requireApproval,
457
+ preset
458
+ }?: GithubToolsOptions): Partial<{
389
459
  getRepository: ai.Tool<{
390
460
  owner: string;
391
461
  repo: string;
@@ -682,8 +752,8 @@ declare function createGithubTools({
682
752
  url: string;
683
753
  closedAt: string | null;
684
754
  }>;
685
- };
755
+ }>;
686
756
  type GithubTools = ReturnType<typeof createGithubTools>;
687
757
  //#endregion
688
- export { ApprovalConfig, GithubTools, GithubToolsOptions, GithubWriteToolName, type Octokit, type ToolOptions, addIssueComment, addPullRequestComment, closeIssue, createGithubTools, createIssue, createOctokit, createOrUpdateFile, createPullRequest, getCommit, getFileContent, getIssue, getPullRequest, getRepository, listBranches, listCommits, listIssues, listPullRequests, mergePullRequest, searchCode, searchRepositories };
758
+ export { ApprovalConfig, type CreateGithubAgentOptions, GithubToolPreset, GithubTools, GithubToolsOptions, GithubWriteToolName, type Octokit, type ToolOptions, addIssueComment, addPullRequestComment, closeIssue, createGithubAgent, createGithubTools, createIssue, createOctokit, createOrUpdateFile, createPullRequest, getCommit, getFileContent, getIssue, getPullRequest, getRepository, listBranches, listCommits, listIssues, listPullRequests, mergePullRequest, searchCode, searchRepositories };
689
759
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/client.ts","../src/types.ts","../src/tools/repository.ts","../src/tools/pull-requests.ts","../src/tools/issues.ts","../src/tools/search.ts","../src/tools/commits.ts","../src/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/client.ts","../src/types.ts","../src/tools/repository.ts","../src/tools/pull-requests.ts","../src/tools/issues.ts","../src/tools/search.ts","../src/tools/commits.ts","../src/agents.ts","../src/index.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Octokit } from "@octokit/rest";
2
- import { tool } from "ai";
2
+ import { ToolLoopAgent, tool } from "ai";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region src/client.ts
@@ -561,45 +561,196 @@ const getCommit = (octokit) => tool({
561
561
  }
562
562
  });
563
563
 
564
+ //#endregion
565
+ //#region src/agents.ts
566
+ const SHARED_RULES = `When a tool execution is denied by the user, do not retry it. Briefly acknowledge the decision and move on.`;
567
+ const DEFAULT_INSTRUCTIONS = `You are a helpful GitHub assistant. You can read and explore repositories, issues, pull requests, commits, and code. You can also create issues, pull requests, comments, and update files when asked.
568
+
569
+ ${SHARED_RULES}`;
570
+ const PRESET_INSTRUCTIONS = {
571
+ "code-review": `You are a code review assistant. Your job is to review pull requests thoroughly and provide constructive feedback.
572
+
573
+ When reviewing a PR:
574
+ - Read the PR description and changed files carefully
575
+ - Check for bugs, logic errors, and edge cases
576
+ - Suggest improvements when you spot issues
577
+ - Be constructive — explain why something is a problem and how to fix it
578
+ - Post your review as PR comments when asked
579
+
580
+ ${SHARED_RULES}`,
581
+ "issue-triage": `You are an issue triage assistant. Your job is to help manage and organize GitHub issues.
582
+
583
+ When triaging issues:
584
+ - Read issue descriptions carefully to understand the problem
585
+ - Identify duplicates when possible
586
+ - Help categorize and prioritize issues
587
+ - Respond to users with clear, helpful information
588
+ - Create new issues when asked, with clear titles and descriptions
589
+
590
+ ${SHARED_RULES}`,
591
+ "repo-explorer": `You are a repository explorer. Your job is to help users understand codebases and find information across GitHub repositories.
592
+
593
+ When exploring repos:
594
+ - Answer questions about code structure and organization
595
+ - Summarize recent activity (commits, PRs, issues)
596
+ - Find specific files, functions, or patterns in code
597
+ - Explain how different parts of the codebase work together
598
+ - You have read-only access — you cannot make changes
599
+
600
+ ${SHARED_RULES}`,
601
+ "maintainer": `You are a repository maintainer assistant. You have full access to manage repositories, issues, and pull requests.
602
+
603
+ When maintaining repos:
604
+ - Be careful with write operations — review before acting
605
+ - Create well-structured issues and PRs with clear descriptions
606
+ - Use merge strategies appropriate for the repository
607
+ - Keep commit messages clean and descriptive
608
+ - When closing issues, provide a clear reason
609
+
610
+ ${SHARED_RULES}`
611
+ };
612
+ /**
613
+ * Create a pre-configured GitHub agent powered by the AI SDK's `ToolLoopAgent`.
614
+ *
615
+ * Returns a `ToolLoopAgent` instance with `.generate()` and `.stream()` methods.
616
+ *
617
+ * @example
618
+ * ```ts
619
+ * import { createGithubAgent } from '@github-tools/sdk'
620
+ *
621
+ * const agent = createGithubAgent({
622
+ * model: 'anthropic/claude-sonnet-4-6',
623
+ * token: process.env.GITHUB_TOKEN!,
624
+ * preset: 'code-review',
625
+ * })
626
+ *
627
+ * const result = await agent.generate({ prompt: 'Review PR #42 on vercel/ai' })
628
+ * ```
629
+ */
630
+ function createGithubAgent({ token, preset, requireApproval, instructions, additionalInstructions, ...agentOptions }) {
631
+ const tools = createGithubTools({
632
+ token,
633
+ requireApproval,
634
+ preset
635
+ });
636
+ const defaultPrompt = preset && !Array.isArray(preset) ? PRESET_INSTRUCTIONS[preset] : DEFAULT_INSTRUCTIONS;
637
+ let resolvedInstructions;
638
+ if (instructions) resolvedInstructions = instructions;
639
+ else if (additionalInstructions) resolvedInstructions = `${defaultPrompt}\n\n${additionalInstructions}`;
640
+ else resolvedInstructions = defaultPrompt;
641
+ return new ToolLoopAgent({
642
+ ...agentOptions,
643
+ tools,
644
+ instructions: resolvedInstructions
645
+ });
646
+ }
647
+
564
648
  //#endregion
565
649
  //#region src/index.ts
650
+ const PRESET_TOOLS = {
651
+ "code-review": [
652
+ "getPullRequest",
653
+ "listPullRequests",
654
+ "getFileContent",
655
+ "listCommits",
656
+ "getCommit",
657
+ "getRepository",
658
+ "listBranches",
659
+ "searchCode",
660
+ "addPullRequestComment"
661
+ ],
662
+ "issue-triage": [
663
+ "listIssues",
664
+ "getIssue",
665
+ "createIssue",
666
+ "addIssueComment",
667
+ "closeIssue",
668
+ "getRepository",
669
+ "searchRepositories",
670
+ "searchCode"
671
+ ],
672
+ "repo-explorer": [
673
+ "getRepository",
674
+ "listBranches",
675
+ "getFileContent",
676
+ "listPullRequests",
677
+ "getPullRequest",
678
+ "listIssues",
679
+ "getIssue",
680
+ "listCommits",
681
+ "getCommit",
682
+ "searchCode",
683
+ "searchRepositories"
684
+ ],
685
+ "maintainer": [
686
+ "getRepository",
687
+ "listBranches",
688
+ "getFileContent",
689
+ "createOrUpdateFile",
690
+ "listPullRequests",
691
+ "getPullRequest",
692
+ "createPullRequest",
693
+ "mergePullRequest",
694
+ "addPullRequestComment",
695
+ "listIssues",
696
+ "getIssue",
697
+ "createIssue",
698
+ "addIssueComment",
699
+ "closeIssue",
700
+ "listCommits",
701
+ "getCommit",
702
+ "searchCode",
703
+ "searchRepositories"
704
+ ]
705
+ };
566
706
  function resolveApproval(toolName, config) {
567
707
  if (typeof config === "boolean") return config;
568
708
  return config[toolName] ?? true;
569
709
  }
710
+ function resolvePresetTools(preset) {
711
+ if (!preset) return null;
712
+ const presets = Array.isArray(preset) ? preset : [preset];
713
+ const tools = /* @__PURE__ */ new Set();
714
+ for (const p of presets) for (const t of PRESET_TOOLS[p]) tools.add(t);
715
+ return tools;
716
+ }
570
717
  /**
571
718
  * Create a set of GitHub tools for the Vercel AI SDK.
572
719
  *
573
720
  * Write operations require user approval by default.
574
721
  * Control this globally or per-tool via `requireApproval`.
722
+ * Use `preset` to get only the tools you need.
575
723
  *
576
724
  * @example
577
725
  * ```ts
578
- * // All writes need approval (default)
726
+ * // All tools (default)
579
727
  * createGithubTools({ token })
580
728
  *
581
- * // No approval at all
582
- * createGithubTools({ token, requireApproval: false })
729
+ * // Code-review agent only PR & commit tools
730
+ * createGithubTools({ token, preset: 'code-review' })
731
+ *
732
+ * // Combine presets
733
+ * createGithubTools({ token, preset: ['code-review', 'issue-triage'] })
583
734
  *
584
- * // Granular: only destructive actions need approval
735
+ * // Granular approval
585
736
  * createGithubTools({
586
737
  * token,
738
+ * preset: 'maintainer',
587
739
  * requireApproval: {
588
740
  * mergePullRequest: true,
589
741
  * createOrUpdateFile: true,
590
- * closeIssue: true,
591
- * createPullRequest: false,
592
742
  * addPullRequestComment: false,
593
- * createIssue: false,
594
- * addIssueComment: false,
595
743
  * }
596
744
  * })
597
745
  * ```
598
746
  */
599
- function createGithubTools({ token, requireApproval = true }) {
600
- const octokit = createOctokit(token);
747
+ function createGithubTools({ token, requireApproval = true, preset } = {}) {
748
+ const resolvedToken = token || process.env.GITHUB_TOKEN;
749
+ if (!resolvedToken) throw new Error("GitHub token is required. Pass it as `token` or set the GITHUB_TOKEN environment variable.");
750
+ const octokit = createOctokit(resolvedToken);
601
751
  const approval = (name) => ({ needsApproval: resolveApproval(name, requireApproval) });
602
- return {
752
+ const allowed = preset ? resolvePresetTools(preset) : null;
753
+ const allTools = {
603
754
  getRepository: getRepository(octokit),
604
755
  listBranches: listBranches(octokit),
605
756
  getFileContent: getFileContent(octokit),
@@ -619,8 +770,10 @@ function createGithubTools({ token, requireApproval = true }) {
619
770
  addIssueComment: addIssueComment(octokit, approval("addIssueComment")),
620
771
  closeIssue: closeIssue(octokit, approval("closeIssue"))
621
772
  };
773
+ if (!allowed) return allTools;
774
+ return Object.fromEntries(Object.entries(allTools).filter(([name]) => allowed.has(name)));
622
775
  }
623
776
 
624
777
  //#endregion
625
- export { addIssueComment, addPullRequestComment, closeIssue, createGithubTools, createIssue, createOctokit, createOrUpdateFile, createPullRequest, getCommit, getFileContent, getIssue, getPullRequest, getRepository, listBranches, listCommits, listIssues, listPullRequests, mergePullRequest, searchCode, searchRepositories };
778
+ export { addIssueComment, addPullRequestComment, closeIssue, createGithubAgent, createGithubTools, createIssue, createOctokit, createOrUpdateFile, createPullRequest, getCommit, getFileContent, getIssue, getPullRequest, getRepository, listBranches, listCommits, listIssues, listPullRequests, mergePullRequest, searchCode, searchRepositories };
626
779
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/client.ts","../src/tools/repository.ts","../src/tools/pull-requests.ts","../src/tools/issues.ts","../src/tools/search.ts","../src/tools/commits.ts","../src/index.ts"],"sourcesContent":["import { Octokit } from '@octokit/rest'\n\nexport function createOctokit(token: string): Octokit {\n return new Octokit({ auth: token })\n}\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit, ToolOptions } from '../types'\n\nexport const getRepository = (octokit: Octokit) =>\n tool({\n description: 'Get information about a GitHub repository including description, stars, forks, language, and default branch',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner (user or organization)'),\n repo: z.string().describe('Repository name'),\n }),\n execute: async ({ owner, repo }) => {\n const { data } = await octokit.repos.get({ owner, repo })\n return {\n name: data.name,\n fullName: data.full_name,\n description: data.description,\n url: data.html_url,\n defaultBranch: data.default_branch,\n stars: data.stargazers_count,\n forks: data.forks_count,\n openIssues: data.open_issues_count,\n language: data.language,\n private: data.private,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n }\n },\n })\n\nexport const listBranches = (octokit: Octokit) =>\n tool({\n description: 'List branches in a GitHub repository',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n perPage: z.number().optional().default(30).describe('Number of branches to return (max 100)'),\n }),\n execute: async ({ owner, repo, perPage }) => {\n const { data } = await octokit.repos.listBranches({ owner, repo, per_page: perPage })\n return data.map(branch => ({\n name: branch.name,\n sha: branch.commit.sha,\n protected: branch.protected,\n }))\n },\n })\n\nexport const getFileContent = (octokit: Octokit) =>\n tool({\n description: 'Get the content of a file from a GitHub repository',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n path: z.string().describe('Path to the file in the repository'),\n ref: z.string().optional().describe('Branch, tag, or commit SHA (defaults to the default branch)'),\n }),\n execute: async ({ owner, repo, path, ref }) => {\n const { data } = await octokit.repos.getContent({ owner, repo, path, ref })\n if (Array.isArray(data)) {\n return { type: 'directory', entries: data.map(e => ({ name: e.name, type: e.type, path: e.path })) }\n }\n if (data.type !== 'file') {\n return { type: data.type, path: data.path }\n }\n const content = Buffer.from(data.content, 'base64').toString('utf-8')\n return {\n type: 'file',\n path: data.path,\n sha: data.sha,\n size: data.size,\n content,\n }\n },\n })\n\nexport const createOrUpdateFile = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Create or update a file in a GitHub repository. Provide the SHA when updating an existing file.',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n path: z.string().describe('Path to the file in the repository'),\n message: z.string().describe('Commit message'),\n content: z.string().describe('File content (plain text, will be base64-encoded automatically)'),\n branch: z.string().optional().describe('Branch to commit to (defaults to the default branch)'),\n sha: z.string().optional().describe('SHA of the file being replaced (required when updating an existing file)'),\n }),\n execute: async ({ owner, repo, path, message, content, branch, sha }) => {\n const encoded = Buffer.from(content).toString('base64')\n const { data } = await octokit.repos.createOrUpdateFileContents({\n owner,\n repo,\n path,\n message,\n content: encoded,\n branch,\n sha,\n })\n return {\n path: data.content?.path,\n sha: data.content?.sha,\n commitSha: data.commit.sha,\n commitUrl: data.commit.html_url,\n }\n },\n })\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit, ToolOptions } from '../types'\n\nexport const listPullRequests = (octokit: Octokit) =>\n tool({\n description: 'List pull requests for a GitHub repository',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n state: z.enum(['open', 'closed', 'all']).optional().default('open').describe('Filter by state'),\n perPage: z.number().optional().default(30).describe('Number of results to return (max 100)'),\n }),\n execute: async ({ owner, repo, state, perPage }) => {\n const { data } = await octokit.pulls.list({ owner, repo, state, per_page: perPage })\n return data.map(pr => ({\n number: pr.number,\n title: pr.title,\n state: pr.state,\n url: pr.html_url,\n author: pr.user?.login,\n branch: pr.head.ref,\n base: pr.base.ref,\n draft: pr.draft,\n createdAt: pr.created_at,\n updatedAt: pr.updated_at,\n }))\n },\n })\n\nexport const getPullRequest = (octokit: Octokit) =>\n tool({\n description: 'Get detailed information about a specific pull request',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n pullNumber: z.number().describe('Pull request number'),\n }),\n execute: async ({ owner, repo, pullNumber }) => {\n const { data } = await octokit.pulls.get({ owner, repo, pull_number: pullNumber })\n return {\n number: data.number,\n title: data.title,\n body: data.body,\n state: data.state,\n url: data.html_url,\n author: data.user?.login,\n branch: data.head.ref,\n base: data.base.ref,\n draft: data.draft,\n merged: data.merged,\n mergeable: data.mergeable,\n additions: data.additions,\n deletions: data.deletions,\n changedFiles: data.changed_files,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n mergedAt: data.merged_at,\n }\n },\n })\n\nexport const createPullRequest = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Create a new pull request in a GitHub repository',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n title: z.string().describe('Pull request title'),\n body: z.string().optional().describe('Pull request description (supports Markdown)'),\n head: z.string().describe('Branch containing the changes (format: branch or username:branch)'),\n base: z.string().describe('Branch to merge into'),\n draft: z.boolean().optional().default(false).describe('Create as draft pull request'),\n }),\n execute: async ({ owner, repo, title, body, head, base, draft }) => {\n const { data } = await octokit.pulls.create({ owner, repo, title, body, head, base, draft })\n return {\n number: data.number,\n title: data.title,\n url: data.html_url,\n state: data.state,\n draft: data.draft,\n branch: data.head.ref,\n base: data.base.ref,\n }\n },\n })\n\nexport const mergePullRequest = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Merge a pull request',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n pullNumber: z.number().describe('Pull request number'),\n commitTitle: z.string().optional().describe('Title for the automatic merge commit'),\n commitMessage: z.string().optional().describe('Extra detail to append to automatic commit message'),\n mergeMethod: z.enum(['merge', 'squash', 'rebase']).optional().default('merge').describe('Merge strategy'),\n }),\n execute: async ({ owner, repo, pullNumber, commitTitle, commitMessage, mergeMethod }) => {\n const { data } = await octokit.pulls.merge({\n owner,\n repo,\n pull_number: pullNumber,\n commit_title: commitTitle,\n commit_message: commitMessage,\n merge_method: mergeMethod,\n })\n return {\n merged: data.merged,\n message: data.message,\n sha: data.sha,\n }\n },\n })\n\nexport const addPullRequestComment = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Add a comment to a pull request',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n pullNumber: z.number().describe('Pull request number'),\n body: z.string().describe('Comment text (supports Markdown)'),\n }),\n execute: async ({ owner, repo, pullNumber, body }) => {\n const { data } = await octokit.issues.createComment({ owner, repo, issue_number: pullNumber, body })\n return {\n id: data.id,\n url: data.html_url,\n body: data.body,\n author: data.user?.login,\n createdAt: data.created_at,\n }\n },\n })\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit, ToolOptions } from '../types'\n\nexport const listIssues = (octokit: Octokit) =>\n tool({\n description: 'List issues for a GitHub repository (excludes pull requests)',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n state: z.enum(['open', 'closed', 'all']).optional().default('open').describe('Filter by state'),\n labels: z.string().optional().describe('Comma-separated list of label names to filter by'),\n perPage: z.number().optional().default(30).describe('Number of results to return (max 100)'),\n }),\n execute: async ({ owner, repo, state, labels, perPage }) => {\n const { data } = await octokit.issues.listForRepo({\n owner,\n repo,\n state,\n labels,\n per_page: perPage,\n })\n return data\n .filter(issue => !issue.pull_request)\n .map(issue => ({\n number: issue.number,\n title: issue.title,\n state: issue.state,\n url: issue.html_url,\n author: issue.user?.login,\n labels: issue.labels.map(l => (typeof l === 'string' ? l : l.name)),\n createdAt: issue.created_at,\n updatedAt: issue.updated_at,\n }))\n },\n })\n\nexport const getIssue = (octokit: Octokit) =>\n tool({\n description: 'Get detailed information about a specific issue',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n issueNumber: z.number().describe('Issue number'),\n }),\n execute: async ({ owner, repo, issueNumber }) => {\n const { data } = await octokit.issues.get({ owner, repo, issue_number: issueNumber })\n return {\n number: data.number,\n title: data.title,\n body: data.body,\n state: data.state,\n url: data.html_url,\n author: data.user?.login,\n assignees: data.assignees?.map(a => a.login),\n labels: data.labels.map(l => (typeof l === 'string' ? l : l.name)),\n comments: data.comments,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n closedAt: data.closed_at,\n }\n },\n })\n\nexport const createIssue = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Create a new issue in a GitHub repository',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n title: z.string().describe('Issue title'),\n body: z.string().optional().describe('Issue description (supports Markdown)'),\n labels: z.array(z.string()).optional().describe('Labels to apply to the issue'),\n assignees: z.array(z.string()).optional().describe('GitHub usernames to assign to the issue'),\n }),\n execute: async ({ owner, repo, title, body, labels, assignees }) => {\n const { data } = await octokit.issues.create({ owner, repo, title, body, labels, assignees })\n return {\n number: data.number,\n title: data.title,\n url: data.html_url,\n state: data.state,\n labels: data.labels.map(l => (typeof l === 'string' ? l : l.name)),\n }\n },\n })\n\nexport const addIssueComment = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Add a comment to a GitHub issue',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n issueNumber: z.number().describe('Issue number'),\n body: z.string().describe('Comment text (supports Markdown)'),\n }),\n execute: async ({ owner, repo, issueNumber, body }) => {\n const { data } = await octokit.issues.createComment({ owner, repo, issue_number: issueNumber, body })\n return {\n id: data.id,\n url: data.html_url,\n body: data.body,\n author: data.user?.login,\n createdAt: data.created_at,\n }\n },\n })\n\nexport const closeIssue = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Close an open GitHub issue',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n issueNumber: z.number().describe('Issue number to close'),\n stateReason: z.enum(['completed', 'not_planned']).optional().default('completed').describe('Reason for closing'),\n }),\n execute: async ({ owner, repo, issueNumber, stateReason }) => {\n const { data } = await octokit.issues.update({\n owner,\n repo,\n issue_number: issueNumber,\n state: 'closed',\n state_reason: stateReason,\n })\n return {\n number: data.number,\n title: data.title,\n state: data.state,\n url: data.html_url,\n closedAt: data.closed_at,\n }\n },\n })\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit } from '../types'\n\nexport const searchCode = (octokit: Octokit) =>\n tool({\n description: 'Search for code in GitHub repositories. Use qualifiers like \"repo:owner/name\" to scope the search.',\n inputSchema: z.object({\n query: z.string().describe('Search query. Supports GitHub search qualifiers, e.g. \"useState repo:facebook/react\"'),\n perPage: z.number().optional().default(10).describe('Number of results to return (max 30)'),\n }),\n execute: async ({ query, perPage }) => {\n const { data } = await octokit.search.code({ q: query, per_page: perPage })\n return {\n totalCount: data.total_count,\n items: data.items.map(item => ({\n name: item.name,\n path: item.path,\n url: item.html_url,\n repository: item.repository.full_name,\n sha: item.sha,\n })),\n }\n },\n })\n\nexport const searchRepositories = (octokit: Octokit) =>\n tool({\n description: 'Search for GitHub repositories by keyword, topic, language, or other qualifiers',\n inputSchema: z.object({\n query: z.string().describe('Search query. Supports GitHub search qualifiers, e.g. \"nuxt language:typescript stars:>1000\"'),\n perPage: z.number().optional().default(10).describe('Number of results to return (max 30)'),\n sort: z.enum(['stars', 'forks', 'help-wanted-issues', 'updated']).optional().describe('Sort field'),\n order: z.enum(['asc', 'desc']).optional().default('desc').describe('Sort order'),\n }),\n execute: async ({ query, perPage, sort, order }) => {\n const { data } = await octokit.search.repos({ q: query, per_page: perPage, sort, order })\n return {\n totalCount: data.total_count,\n items: data.items.map(repo => ({\n name: repo.name,\n fullName: repo.full_name,\n description: repo.description,\n url: repo.html_url,\n stars: repo.stargazers_count,\n forks: repo.forks_count,\n language: repo.language,\n topics: repo.topics,\n })),\n }\n },\n })\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit } from '../types'\n\nexport const listCommits = (octokit: Octokit) =>\n tool({\n description: 'List commits for a GitHub repository. Filter by file path to see who changed a specific file and when (git blame alternative). Filter by author, branch, or date range.',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n path: z.string().optional().describe('Only commits containing this file path'),\n sha: z.string().optional().describe('Branch name or commit SHA to start listing from'),\n author: z.string().optional().describe('GitHub username or email to filter commits by'),\n since: z.string().optional().describe('Only commits after this date (ISO 8601 format)'),\n until: z.string().optional().describe('Only commits before this date (ISO 8601 format)'),\n perPage: z.number().optional().default(30).describe('Number of results to return (max 100)'),\n }),\n execute: async ({ owner, repo, path, sha, author, since, until, perPage }) => {\n const { data } = await octokit.repos.listCommits({\n owner,\n repo,\n path,\n sha,\n author,\n since,\n until,\n per_page: perPage,\n })\n return data.map(commit => ({\n sha: commit.sha,\n message: commit.commit.message,\n author: commit.commit.author?.name,\n authorLogin: commit.author?.login,\n date: commit.commit.author?.date,\n url: commit.html_url,\n }))\n },\n })\n\nexport const getCommit = (octokit: Octokit) =>\n tool({\n description: 'Get detailed information about a specific commit, including the list of files changed with additions and deletions',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n ref: z.string().describe('Commit SHA, branch name, or tag'),\n }),\n execute: async ({ owner, repo, ref }) => {\n const { data } = await octokit.repos.getCommit({ owner, repo, ref })\n return {\n sha: data.sha,\n message: data.commit.message,\n author: data.commit.author?.name,\n authorLogin: data.author?.login,\n date: data.commit.author?.date,\n url: data.html_url,\n stats: data.stats ? {\n additions: data.stats.additions,\n deletions: data.stats.deletions,\n total: data.stats.total,\n } : null,\n files: data.files?.map(file => ({\n filename: file.filename,\n status: file.status,\n additions: file.additions,\n deletions: file.deletions,\n patch: file.patch,\n })),\n }\n },\n })\n","import { createOctokit } from './client'\nimport { getRepository, listBranches, getFileContent, createOrUpdateFile } from './tools/repository'\nimport { listPullRequests, getPullRequest, createPullRequest, mergePullRequest, addPullRequestComment } from './tools/pull-requests'\nimport { listIssues, getIssue, createIssue, addIssueComment, closeIssue } from './tools/issues'\nimport { searchCode, searchRepositories } from './tools/search'\nimport { listCommits, getCommit } from './tools/commits'\n\nexport type GithubWriteToolName =\n | 'createOrUpdateFile'\n | 'createPullRequest'\n | 'mergePullRequest'\n | 'addPullRequestComment'\n | 'createIssue'\n | 'addIssueComment'\n | 'closeIssue'\n\n/**\n * Whether write operations require user approval.\n * - `true` — all write tools need approval (default)\n * - `false` — no approval needed for any write tool\n * - object — per-tool override; unspecified write tools default to `true`\n *\n * @example\n * ```ts\n * // Only merging and file changes need approval, comments are fine\n * requireApproval: {\n * mergePullRequest: true,\n * createOrUpdateFile: true,\n * addPullRequestComment: false,\n * addIssueComment: false,\n * }\n * ```\n */\nexport type ApprovalConfig = boolean | Partial<Record<GithubWriteToolName, boolean>>\n\nexport type GithubToolsOptions = {\n token: string\n requireApproval?: ApprovalConfig\n}\n\nfunction resolveApproval(toolName: GithubWriteToolName, config: ApprovalConfig): boolean {\n if (typeof config === 'boolean') return config\n return config[toolName] ?? true\n}\n\n/**\n * Create a set of GitHub tools for the Vercel AI SDK.\n *\n * Write operations require user approval by default.\n * Control this globally or per-tool via `requireApproval`.\n *\n * @example\n * ```ts\n * // All writes need approval (default)\n * createGithubTools({ token })\n *\n * // No approval at all\n * createGithubTools({ token, requireApproval: false })\n *\n * // Granular: only destructive actions need approval\n * createGithubTools({\n * token,\n * requireApproval: {\n * mergePullRequest: true,\n * createOrUpdateFile: true,\n * closeIssue: true,\n * createPullRequest: false,\n * addPullRequestComment: false,\n * createIssue: false,\n * addIssueComment: false,\n * }\n * })\n * ```\n */\nexport function createGithubTools({ token, requireApproval = true }: GithubToolsOptions) {\n const octokit = createOctokit(token)\n const approval = (name: GithubWriteToolName) => ({ needsApproval: resolveApproval(name, requireApproval) })\n\n return {\n // Read-only — never need approval\n getRepository: getRepository(octokit),\n listBranches: listBranches(octokit),\n getFileContent: getFileContent(octokit),\n listPullRequests: listPullRequests(octokit),\n getPullRequest: getPullRequest(octokit),\n listIssues: listIssues(octokit),\n getIssue: getIssue(octokit),\n searchCode: searchCode(octokit),\n searchRepositories: searchRepositories(octokit),\n listCommits: listCommits(octokit),\n getCommit: getCommit(octokit),\n // Write — approval controlled per tool\n createOrUpdateFile: createOrUpdateFile(octokit, approval('createOrUpdateFile')),\n createPullRequest: createPullRequest(octokit, approval('createPullRequest')),\n mergePullRequest: mergePullRequest(octokit, approval('mergePullRequest')),\n addPullRequestComment: addPullRequestComment(octokit, approval('addPullRequestComment')),\n createIssue: createIssue(octokit, approval('createIssue')),\n addIssueComment: addIssueComment(octokit, approval('addIssueComment')),\n closeIssue: closeIssue(octokit, approval('closeIssue')),\n }\n}\n\nexport type GithubTools = ReturnType<typeof createGithubTools>\n\n// Re-export individual tool factories for cherry-picking\nexport { createOctokit } from './client'\nexport { getRepository, listBranches, getFileContent, createOrUpdateFile } from './tools/repository'\nexport { listPullRequests, getPullRequest, createPullRequest, mergePullRequest, addPullRequestComment } from './tools/pull-requests'\nexport { listIssues, getIssue, createIssue, addIssueComment, closeIssue } from './tools/issues'\nexport { searchCode, searchRepositories } from './tools/search'\nexport { listCommits, getCommit } from './tools/commits'\nexport type { Octokit, ToolOptions } from './types'\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/client.ts","../src/tools/repository.ts","../src/tools/pull-requests.ts","../src/tools/issues.ts","../src/tools/search.ts","../src/tools/commits.ts","../src/agents.ts","../src/index.ts"],"sourcesContent":["import { Octokit } from '@octokit/rest'\n\nexport function createOctokit(token: string): Octokit {\n return new Octokit({ auth: token })\n}\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit, ToolOptions } from '../types'\n\nexport const getRepository = (octokit: Octokit) =>\n tool({\n description: 'Get information about a GitHub repository including description, stars, forks, language, and default branch',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner (user or organization)'),\n repo: z.string().describe('Repository name'),\n }),\n execute: async ({ owner, repo }) => {\n const { data } = await octokit.repos.get({ owner, repo })\n return {\n name: data.name,\n fullName: data.full_name,\n description: data.description,\n url: data.html_url,\n defaultBranch: data.default_branch,\n stars: data.stargazers_count,\n forks: data.forks_count,\n openIssues: data.open_issues_count,\n language: data.language,\n private: data.private,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n }\n },\n })\n\nexport const listBranches = (octokit: Octokit) =>\n tool({\n description: 'List branches in a GitHub repository',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n perPage: z.number().optional().default(30).describe('Number of branches to return (max 100)'),\n }),\n execute: async ({ owner, repo, perPage }) => {\n const { data } = await octokit.repos.listBranches({ owner, repo, per_page: perPage })\n return data.map(branch => ({\n name: branch.name,\n sha: branch.commit.sha,\n protected: branch.protected,\n }))\n },\n })\n\nexport const getFileContent = (octokit: Octokit) =>\n tool({\n description: 'Get the content of a file from a GitHub repository',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n path: z.string().describe('Path to the file in the repository'),\n ref: z.string().optional().describe('Branch, tag, or commit SHA (defaults to the default branch)'),\n }),\n execute: async ({ owner, repo, path, ref }) => {\n const { data } = await octokit.repos.getContent({ owner, repo, path, ref })\n if (Array.isArray(data)) {\n return { type: 'directory', entries: data.map(e => ({ name: e.name, type: e.type, path: e.path })) }\n }\n if (data.type !== 'file') {\n return { type: data.type, path: data.path }\n }\n const content = Buffer.from(data.content, 'base64').toString('utf-8')\n return {\n type: 'file',\n path: data.path,\n sha: data.sha,\n size: data.size,\n content,\n }\n },\n })\n\nexport const createOrUpdateFile = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Create or update a file in a GitHub repository. Provide the SHA when updating an existing file.',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n path: z.string().describe('Path to the file in the repository'),\n message: z.string().describe('Commit message'),\n content: z.string().describe('File content (plain text, will be base64-encoded automatically)'),\n branch: z.string().optional().describe('Branch to commit to (defaults to the default branch)'),\n sha: z.string().optional().describe('SHA of the file being replaced (required when updating an existing file)'),\n }),\n execute: async ({ owner, repo, path, message, content, branch, sha }) => {\n const encoded = Buffer.from(content).toString('base64')\n const { data } = await octokit.repos.createOrUpdateFileContents({\n owner,\n repo,\n path,\n message,\n content: encoded,\n branch,\n sha,\n })\n return {\n path: data.content?.path,\n sha: data.content?.sha,\n commitSha: data.commit.sha,\n commitUrl: data.commit.html_url,\n }\n },\n })\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit, ToolOptions } from '../types'\n\nexport const listPullRequests = (octokit: Octokit) =>\n tool({\n description: 'List pull requests for a GitHub repository',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n state: z.enum(['open', 'closed', 'all']).optional().default('open').describe('Filter by state'),\n perPage: z.number().optional().default(30).describe('Number of results to return (max 100)'),\n }),\n execute: async ({ owner, repo, state, perPage }) => {\n const { data } = await octokit.pulls.list({ owner, repo, state, per_page: perPage })\n return data.map(pr => ({\n number: pr.number,\n title: pr.title,\n state: pr.state,\n url: pr.html_url,\n author: pr.user?.login,\n branch: pr.head.ref,\n base: pr.base.ref,\n draft: pr.draft,\n createdAt: pr.created_at,\n updatedAt: pr.updated_at,\n }))\n },\n })\n\nexport const getPullRequest = (octokit: Octokit) =>\n tool({\n description: 'Get detailed information about a specific pull request',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n pullNumber: z.number().describe('Pull request number'),\n }),\n execute: async ({ owner, repo, pullNumber }) => {\n const { data } = await octokit.pulls.get({ owner, repo, pull_number: pullNumber })\n return {\n number: data.number,\n title: data.title,\n body: data.body,\n state: data.state,\n url: data.html_url,\n author: data.user?.login,\n branch: data.head.ref,\n base: data.base.ref,\n draft: data.draft,\n merged: data.merged,\n mergeable: data.mergeable,\n additions: data.additions,\n deletions: data.deletions,\n changedFiles: data.changed_files,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n mergedAt: data.merged_at,\n }\n },\n })\n\nexport const createPullRequest = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Create a new pull request in a GitHub repository',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n title: z.string().describe('Pull request title'),\n body: z.string().optional().describe('Pull request description (supports Markdown)'),\n head: z.string().describe('Branch containing the changes (format: branch or username:branch)'),\n base: z.string().describe('Branch to merge into'),\n draft: z.boolean().optional().default(false).describe('Create as draft pull request'),\n }),\n execute: async ({ owner, repo, title, body, head, base, draft }) => {\n const { data } = await octokit.pulls.create({ owner, repo, title, body, head, base, draft })\n return {\n number: data.number,\n title: data.title,\n url: data.html_url,\n state: data.state,\n draft: data.draft,\n branch: data.head.ref,\n base: data.base.ref,\n }\n },\n })\n\nexport const mergePullRequest = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Merge a pull request',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n pullNumber: z.number().describe('Pull request number'),\n commitTitle: z.string().optional().describe('Title for the automatic merge commit'),\n commitMessage: z.string().optional().describe('Extra detail to append to automatic commit message'),\n mergeMethod: z.enum(['merge', 'squash', 'rebase']).optional().default('merge').describe('Merge strategy'),\n }),\n execute: async ({ owner, repo, pullNumber, commitTitle, commitMessage, mergeMethod }) => {\n const { data } = await octokit.pulls.merge({\n owner,\n repo,\n pull_number: pullNumber,\n commit_title: commitTitle,\n commit_message: commitMessage,\n merge_method: mergeMethod,\n })\n return {\n merged: data.merged,\n message: data.message,\n sha: data.sha,\n }\n },\n })\n\nexport const addPullRequestComment = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Add a comment to a pull request',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n pullNumber: z.number().describe('Pull request number'),\n body: z.string().describe('Comment text (supports Markdown)'),\n }),\n execute: async ({ owner, repo, pullNumber, body }) => {\n const { data } = await octokit.issues.createComment({ owner, repo, issue_number: pullNumber, body })\n return {\n id: data.id,\n url: data.html_url,\n body: data.body,\n author: data.user?.login,\n createdAt: data.created_at,\n }\n },\n })\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit, ToolOptions } from '../types'\n\nexport const listIssues = (octokit: Octokit) =>\n tool({\n description: 'List issues for a GitHub repository (excludes pull requests)',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n state: z.enum(['open', 'closed', 'all']).optional().default('open').describe('Filter by state'),\n labels: z.string().optional().describe('Comma-separated list of label names to filter by'),\n perPage: z.number().optional().default(30).describe('Number of results to return (max 100)'),\n }),\n execute: async ({ owner, repo, state, labels, perPage }) => {\n const { data } = await octokit.issues.listForRepo({\n owner,\n repo,\n state,\n labels,\n per_page: perPage,\n })\n return data\n .filter(issue => !issue.pull_request)\n .map(issue => ({\n number: issue.number,\n title: issue.title,\n state: issue.state,\n url: issue.html_url,\n author: issue.user?.login,\n labels: issue.labels.map(l => (typeof l === 'string' ? l : l.name)),\n createdAt: issue.created_at,\n updatedAt: issue.updated_at,\n }))\n },\n })\n\nexport const getIssue = (octokit: Octokit) =>\n tool({\n description: 'Get detailed information about a specific issue',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n issueNumber: z.number().describe('Issue number'),\n }),\n execute: async ({ owner, repo, issueNumber }) => {\n const { data } = await octokit.issues.get({ owner, repo, issue_number: issueNumber })\n return {\n number: data.number,\n title: data.title,\n body: data.body,\n state: data.state,\n url: data.html_url,\n author: data.user?.login,\n assignees: data.assignees?.map(a => a.login),\n labels: data.labels.map(l => (typeof l === 'string' ? l : l.name)),\n comments: data.comments,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n closedAt: data.closed_at,\n }\n },\n })\n\nexport const createIssue = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Create a new issue in a GitHub repository',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n title: z.string().describe('Issue title'),\n body: z.string().optional().describe('Issue description (supports Markdown)'),\n labels: z.array(z.string()).optional().describe('Labels to apply to the issue'),\n assignees: z.array(z.string()).optional().describe('GitHub usernames to assign to the issue'),\n }),\n execute: async ({ owner, repo, title, body, labels, assignees }) => {\n const { data } = await octokit.issues.create({ owner, repo, title, body, labels, assignees })\n return {\n number: data.number,\n title: data.title,\n url: data.html_url,\n state: data.state,\n labels: data.labels.map(l => (typeof l === 'string' ? l : l.name)),\n }\n },\n })\n\nexport const addIssueComment = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Add a comment to a GitHub issue',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n issueNumber: z.number().describe('Issue number'),\n body: z.string().describe('Comment text (supports Markdown)'),\n }),\n execute: async ({ owner, repo, issueNumber, body }) => {\n const { data } = await octokit.issues.createComment({ owner, repo, issue_number: issueNumber, body })\n return {\n id: data.id,\n url: data.html_url,\n body: data.body,\n author: data.user?.login,\n createdAt: data.created_at,\n }\n },\n })\n\nexport const closeIssue = (octokit: Octokit, { needsApproval = true }: ToolOptions = {}) =>\n tool({\n description: 'Close an open GitHub issue',\n needsApproval,\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n issueNumber: z.number().describe('Issue number to close'),\n stateReason: z.enum(['completed', 'not_planned']).optional().default('completed').describe('Reason for closing'),\n }),\n execute: async ({ owner, repo, issueNumber, stateReason }) => {\n const { data } = await octokit.issues.update({\n owner,\n repo,\n issue_number: issueNumber,\n state: 'closed',\n state_reason: stateReason,\n })\n return {\n number: data.number,\n title: data.title,\n state: data.state,\n url: data.html_url,\n closedAt: data.closed_at,\n }\n },\n })\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit } from '../types'\n\nexport const searchCode = (octokit: Octokit) =>\n tool({\n description: 'Search for code in GitHub repositories. Use qualifiers like \"repo:owner/name\" to scope the search.',\n inputSchema: z.object({\n query: z.string().describe('Search query. Supports GitHub search qualifiers, e.g. \"useState repo:facebook/react\"'),\n perPage: z.number().optional().default(10).describe('Number of results to return (max 30)'),\n }),\n execute: async ({ query, perPage }) => {\n const { data } = await octokit.search.code({ q: query, per_page: perPage })\n return {\n totalCount: data.total_count,\n items: data.items.map(item => ({\n name: item.name,\n path: item.path,\n url: item.html_url,\n repository: item.repository.full_name,\n sha: item.sha,\n })),\n }\n },\n })\n\nexport const searchRepositories = (octokit: Octokit) =>\n tool({\n description: 'Search for GitHub repositories by keyword, topic, language, or other qualifiers',\n inputSchema: z.object({\n query: z.string().describe('Search query. Supports GitHub search qualifiers, e.g. \"nuxt language:typescript stars:>1000\"'),\n perPage: z.number().optional().default(10).describe('Number of results to return (max 30)'),\n sort: z.enum(['stars', 'forks', 'help-wanted-issues', 'updated']).optional().describe('Sort field'),\n order: z.enum(['asc', 'desc']).optional().default('desc').describe('Sort order'),\n }),\n execute: async ({ query, perPage, sort, order }) => {\n const { data } = await octokit.search.repos({ q: query, per_page: perPage, sort, order })\n return {\n totalCount: data.total_count,\n items: data.items.map(repo => ({\n name: repo.name,\n fullName: repo.full_name,\n description: repo.description,\n url: repo.html_url,\n stars: repo.stargazers_count,\n forks: repo.forks_count,\n language: repo.language,\n topics: repo.topics,\n })),\n }\n },\n })\n","import { tool } from 'ai'\nimport { z } from 'zod'\nimport type { Octokit } from '../types'\n\nexport const listCommits = (octokit: Octokit) =>\n tool({\n description: 'List commits for a GitHub repository. Filter by file path to see who changed a specific file and when (git blame alternative). Filter by author, branch, or date range.',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n path: z.string().optional().describe('Only commits containing this file path'),\n sha: z.string().optional().describe('Branch name or commit SHA to start listing from'),\n author: z.string().optional().describe('GitHub username or email to filter commits by'),\n since: z.string().optional().describe('Only commits after this date (ISO 8601 format)'),\n until: z.string().optional().describe('Only commits before this date (ISO 8601 format)'),\n perPage: z.number().optional().default(30).describe('Number of results to return (max 100)'),\n }),\n execute: async ({ owner, repo, path, sha, author, since, until, perPage }) => {\n const { data } = await octokit.repos.listCommits({\n owner,\n repo,\n path,\n sha,\n author,\n since,\n until,\n per_page: perPage,\n })\n return data.map(commit => ({\n sha: commit.sha,\n message: commit.commit.message,\n author: commit.commit.author?.name,\n authorLogin: commit.author?.login,\n date: commit.commit.author?.date,\n url: commit.html_url,\n }))\n },\n })\n\nexport const getCommit = (octokit: Octokit) =>\n tool({\n description: 'Get detailed information about a specific commit, including the list of files changed with additions and deletions',\n inputSchema: z.object({\n owner: z.string().describe('Repository owner'),\n repo: z.string().describe('Repository name'),\n ref: z.string().describe('Commit SHA, branch name, or tag'),\n }),\n execute: async ({ owner, repo, ref }) => {\n const { data } = await octokit.repos.getCommit({ owner, repo, ref })\n return {\n sha: data.sha,\n message: data.commit.message,\n author: data.commit.author?.name,\n authorLogin: data.author?.login,\n date: data.commit.author?.date,\n url: data.html_url,\n stats: data.stats ? {\n additions: data.stats.additions,\n deletions: data.stats.deletions,\n total: data.stats.total,\n } : null,\n files: data.files?.map(file => ({\n filename: file.filename,\n status: file.status,\n additions: file.additions,\n deletions: file.deletions,\n patch: file.patch,\n })),\n }\n },\n })\n","import { ToolLoopAgent } from 'ai'\nimport type { ToolLoopAgentSettings } from 'ai'\nimport { createGithubTools } from './index'\nimport type { GithubToolPreset, ApprovalConfig } from './index'\n\nconst SHARED_RULES = `When a tool execution is denied by the user, do not retry it. Briefly acknowledge the decision and move on.`\n\nconst DEFAULT_INSTRUCTIONS = `You are a helpful GitHub assistant. You can read and explore repositories, issues, pull requests, commits, and code. You can also create issues, pull requests, comments, and update files when asked.\n\n${SHARED_RULES}`\n\nconst PRESET_INSTRUCTIONS: Record<GithubToolPreset, string> = {\n 'code-review': `You are a code review assistant. Your job is to review pull requests thoroughly and provide constructive feedback.\n\nWhen reviewing a PR:\n- Read the PR description and changed files carefully\n- Check for bugs, logic errors, and edge cases\n- Suggest improvements when you spot issues\n- Be constructive — explain why something is a problem and how to fix it\n- Post your review as PR comments when asked\n\n${SHARED_RULES}`,\n\n 'issue-triage': `You are an issue triage assistant. Your job is to help manage and organize GitHub issues.\n\nWhen triaging issues:\n- Read issue descriptions carefully to understand the problem\n- Identify duplicates when possible\n- Help categorize and prioritize issues\n- Respond to users with clear, helpful information\n- Create new issues when asked, with clear titles and descriptions\n\n${SHARED_RULES}`,\n\n 'repo-explorer': `You are a repository explorer. Your job is to help users understand codebases and find information across GitHub repositories.\n\nWhen exploring repos:\n- Answer questions about code structure and organization\n- Summarize recent activity (commits, PRs, issues)\n- Find specific files, functions, or patterns in code\n- Explain how different parts of the codebase work together\n- You have read-only access — you cannot make changes\n\n${SHARED_RULES}`,\n\n 'maintainer': `You are a repository maintainer assistant. You have full access to manage repositories, issues, and pull requests.\n\nWhen maintaining repos:\n- Be careful with write operations — review before acting\n- Create well-structured issues and PRs with clear descriptions\n- Use merge strategies appropriate for the repository\n- Keep commit messages clean and descriptive\n- When closing issues, provide a clear reason\n\n${SHARED_RULES}`\n}\n\ntype AgentOptions = Omit<ToolLoopAgentSettings, 'model' | 'tools' | 'instructions'>\n\nexport type CreateGithubAgentOptions = AgentOptions & {\n model: ToolLoopAgentSettings['model']\n /**\n * GitHub personal access token.\n * Falls back to `process.env.GITHUB_TOKEN` when omitted.\n */\n token?: string\n preset?: GithubToolPreset | GithubToolPreset[]\n requireApproval?: ApprovalConfig\n instructions?: string\n additionalInstructions?: string\n}\n\n/**\n * Create a pre-configured GitHub agent powered by the AI SDK's `ToolLoopAgent`.\n *\n * Returns a `ToolLoopAgent` instance with `.generate()` and `.stream()` methods.\n *\n * @example\n * ```ts\n * import { createGithubAgent } from '@github-tools/sdk'\n *\n * const agent = createGithubAgent({\n * model: 'anthropic/claude-sonnet-4-6',\n * token: process.env.GITHUB_TOKEN!,\n * preset: 'code-review',\n * })\n *\n * const result = await agent.generate({ prompt: 'Review PR #42 on vercel/ai' })\n * ```\n */\nexport function createGithubAgent({\n token,\n preset,\n requireApproval,\n instructions,\n additionalInstructions,\n ...agentOptions\n}: CreateGithubAgentOptions) {\n const tools = createGithubTools({ token, requireApproval, preset })\n\n const defaultPrompt = preset && !Array.isArray(preset)\n ? PRESET_INSTRUCTIONS[preset]\n : DEFAULT_INSTRUCTIONS\n\n let resolvedInstructions: string\n if (instructions) {\n resolvedInstructions = instructions\n } else if (additionalInstructions) {\n resolvedInstructions = `${defaultPrompt}\\n\\n${additionalInstructions}`\n } else {\n resolvedInstructions = defaultPrompt\n }\n\n return new ToolLoopAgent({\n ...agentOptions,\n tools,\n instructions: resolvedInstructions\n })\n}\n","import { createOctokit } from './client'\nimport { getRepository, listBranches, getFileContent, createOrUpdateFile } from './tools/repository'\nimport { listPullRequests, getPullRequest, createPullRequest, mergePullRequest, addPullRequestComment } from './tools/pull-requests'\nimport { listIssues, getIssue, createIssue, addIssueComment, closeIssue } from './tools/issues'\nimport { searchCode, searchRepositories } from './tools/search'\nimport { listCommits, getCommit } from './tools/commits'\n\nexport type GithubWriteToolName =\n | 'createOrUpdateFile'\n | 'createPullRequest'\n | 'mergePullRequest'\n | 'addPullRequestComment'\n | 'createIssue'\n | 'addIssueComment'\n | 'closeIssue'\n\n/**\n * Whether write operations require user approval.\n * - `true` — all write tools need approval (default)\n * - `false` — no approval needed for any write tool\n * - object — per-tool override; unspecified write tools default to `true`\n *\n * @example\n * ```ts\n * requireApproval: {\n * mergePullRequest: true,\n * createOrUpdateFile: true,\n * addPullRequestComment: false,\n * addIssueComment: false,\n * }\n * ```\n */\nexport type ApprovalConfig = boolean | Partial<Record<GithubWriteToolName, boolean>>\n\n/**\n * Predefined tool presets for common use cases.\n *\n * - `'code-review'` — Review PRs: read PRs, file content, commits, and post comments\n * - `'issue-triage'` — Triage issues: read/create/close issues, search, and comment\n * - `'repo-explorer'` — Explore repos: read-only access to repos, branches, code, and search\n * - `'maintainer'` — Full maintenance: all read + create PRs, merge, manage issues\n */\nexport type GithubToolPreset = 'code-review' | 'issue-triage' | 'repo-explorer' | 'maintainer'\n\nconst PRESET_TOOLS: Record<GithubToolPreset, string[]> = {\n 'code-review': [\n 'getPullRequest', 'listPullRequests', 'getFileContent', 'listCommits', 'getCommit',\n 'getRepository', 'listBranches', 'searchCode',\n 'addPullRequestComment'\n ],\n 'issue-triage': [\n 'listIssues', 'getIssue', 'createIssue', 'addIssueComment', 'closeIssue',\n 'getRepository', 'searchRepositories', 'searchCode'\n ],\n 'repo-explorer': [\n 'getRepository', 'listBranches', 'getFileContent',\n 'listPullRequests', 'getPullRequest',\n 'listIssues', 'getIssue',\n 'listCommits', 'getCommit',\n 'searchCode', 'searchRepositories'\n ],\n 'maintainer': [\n 'getRepository', 'listBranches', 'getFileContent', 'createOrUpdateFile',\n 'listPullRequests', 'getPullRequest', 'createPullRequest', 'mergePullRequest', 'addPullRequestComment',\n 'listIssues', 'getIssue', 'createIssue', 'addIssueComment', 'closeIssue',\n 'listCommits', 'getCommit',\n 'searchCode', 'searchRepositories'\n ]\n}\n\nexport type GithubToolsOptions = {\n /**\n * GitHub personal access token.\n * Falls back to `process.env.GITHUB_TOKEN` when omitted.\n */\n token?: string\n requireApproval?: ApprovalConfig\n /**\n * Restrict the returned tools to a predefined preset.\n * Omit to get all tools.\n *\n * @example\n * ```ts\n * // Only code-review tools\n * createGithubTools({ token, preset: 'code-review' })\n *\n * // Combine presets\n * createGithubTools({ token, preset: ['code-review', 'issue-triage'] })\n * ```\n */\n preset?: GithubToolPreset | GithubToolPreset[]\n}\n\nfunction resolveApproval(toolName: GithubWriteToolName, config: ApprovalConfig): boolean {\n if (typeof config === 'boolean') return config\n return config[toolName] ?? true\n}\n\nfunction resolvePresetTools(preset: GithubToolPreset | GithubToolPreset[]): Set<string> | null {\n if (!preset) return null\n const presets = Array.isArray(preset) ? preset : [preset]\n const tools = new Set<string>()\n for (const p of presets) {\n for (const t of PRESET_TOOLS[p]) tools.add(t)\n }\n return tools\n}\n\n/**\n * Create a set of GitHub tools for the Vercel AI SDK.\n *\n * Write operations require user approval by default.\n * Control this globally or per-tool via `requireApproval`.\n * Use `preset` to get only the tools you need.\n *\n * @example\n * ```ts\n * // All tools (default)\n * createGithubTools({ token })\n *\n * // Code-review agent — only PR & commit tools\n * createGithubTools({ token, preset: 'code-review' })\n *\n * // Combine presets\n * createGithubTools({ token, preset: ['code-review', 'issue-triage'] })\n *\n * // Granular approval\n * createGithubTools({\n * token,\n * preset: 'maintainer',\n * requireApproval: {\n * mergePullRequest: true,\n * createOrUpdateFile: true,\n * addPullRequestComment: false,\n * }\n * })\n * ```\n */\nexport function createGithubTools({ token, requireApproval = true, preset }: GithubToolsOptions = {}) {\n const resolvedToken = token || process.env.GITHUB_TOKEN\n if (!resolvedToken) {\n throw new Error('GitHub token is required. Pass it as `token` or set the GITHUB_TOKEN environment variable.')\n }\n const octokit = createOctokit(resolvedToken)\n const approval = (name: GithubWriteToolName) => ({ needsApproval: resolveApproval(name, requireApproval) })\n const allowed = preset ? resolvePresetTools(preset) : null\n\n const allTools = {\n getRepository: getRepository(octokit),\n listBranches: listBranches(octokit),\n getFileContent: getFileContent(octokit),\n listPullRequests: listPullRequests(octokit),\n getPullRequest: getPullRequest(octokit),\n listIssues: listIssues(octokit),\n getIssue: getIssue(octokit),\n searchCode: searchCode(octokit),\n searchRepositories: searchRepositories(octokit),\n listCommits: listCommits(octokit),\n getCommit: getCommit(octokit),\n createOrUpdateFile: createOrUpdateFile(octokit, approval('createOrUpdateFile')),\n createPullRequest: createPullRequest(octokit, approval('createPullRequest')),\n mergePullRequest: mergePullRequest(octokit, approval('mergePullRequest')),\n addPullRequestComment: addPullRequestComment(octokit, approval('addPullRequestComment')),\n createIssue: createIssue(octokit, approval('createIssue')),\n addIssueComment: addIssueComment(octokit, approval('addIssueComment')),\n closeIssue: closeIssue(octokit, approval('closeIssue')),\n }\n\n if (!allowed) return allTools\n\n return Object.fromEntries(\n Object.entries(allTools).filter(([name]) => allowed.has(name))\n ) as Partial<typeof allTools>\n}\n\nexport type GithubTools = ReturnType<typeof createGithubTools>\n\n// Re-export individual tool factories for cherry-picking\nexport { createOctokit } from './client'\nexport { getRepository, listBranches, getFileContent, createOrUpdateFile } from './tools/repository'\nexport { listPullRequests, getPullRequest, createPullRequest, mergePullRequest, addPullRequestComment } from './tools/pull-requests'\nexport { listIssues, getIssue, createIssue, addIssueComment, closeIssue } from './tools/issues'\nexport { searchCode, searchRepositories } from './tools/search'\nexport { listCommits, getCommit } from './tools/commits'\nexport type { Octokit, ToolOptions } from './types'\nexport { createGithubAgent } from './agents'\nexport type { CreateGithubAgentOptions } from './agents'\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@github-tools/sdk",
3
- "version": "0.0.1",
4
- "description": "GitHub tools for the Vercel AI SDK wrap GitHub's API as AI SDK v6 tools ready to plug into any agent",
3
+ "version": "1.1.0",
4
+ "description": "GitHub tools for the Vercel AI SDK, wrap GitHub's API as AI SDK tools ready to plug into any agent",
5
5
  "author": "HugoRCD <hugo.richard@vercel.com",
6
6
  "repository": {
7
7
  "type": "git",
@@ -35,16 +35,16 @@
35
35
  ],
36
36
  "license": "MIT",
37
37
  "dependencies": {
38
- "@octokit/rest": "^21.1.1"
38
+ "@octokit/rest": "^22.0.1"
39
39
  },
40
40
  "peerDependencies": {
41
- "ai": "^6.0.0",
42
- "zod": "^4.0.0"
41
+ "ai": "^6.0.97",
42
+ "zod": "^4.3.6"
43
43
  },
44
44
  "devDependencies": {
45
- "@types/node": "^24.0.0",
45
+ "@types/node": "^24.10.13",
46
46
  "tsdown": "^0.20.3",
47
- "typescript": "^5.0.0"
47
+ "typescript": "^5.9.3"
48
48
  },
49
49
  "publishConfig": {
50
50
  "access": "public"