github

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 28, 2026 License: Apache-2.0 Imports: 15 Imported by: 0

Documentation

Overview

Package github provides a GitHub App-authenticated client and a set of gollem agent tools (search, get_issue, get_pull_request, get_file, list_commits) that the AI agent can call against GitHub.

Both the Source pipeline (legacy fetch methods) and the agent tools are served by the same *Client. There is no Service interface — there is only one implementation, and tool-side fakes are wired through a package-private interface in tools.go.

Index

Constants

This section is empty.

Variables

View Source
var ErrIssueIsPR = errIssueIsPR

ErrIssueIsPR is the public alias for errIssueIsPR so callers (including the agent tool) can detect this case via errors.Is.

View Source
var ErrNotFound = goerr.New("github resource not found")

ErrNotFound is returned when a requested GitHub resource (issue, PR, file, commit) does not exist or is not accessible to the GitHub App installation. Callers can use errors.Is to detect this without parsing error messages.

Functions

func New

func New(client *Client) []gollem.Tool

New returns the GitHub-backed agent tools when client != nil; nil otherwise. Callers can append the result directly to gollem's tool list.

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client wraps the GitHub App-authenticated GraphQL v4 + REST clients. There is exactly one production implementation; tests inject a fake via the package-private interface in tools.go. Both clients are built eagerly in NewClient and never reassigned: a single *Client is shared across concurrent agent runs (CommonDeps.GitHubClient), so lazily populating restClient on first use would be a data race.

func NewClient

func NewClient(appID, installationID int64, privateKey string) (*Client, error)

NewClient creates a Client using GitHub App credentials. privateKey can be a PEM string or a file path to a PEM file.

Named NewClient (not New) so the package-level New is reserved for the agent-tool factory in tools.go.

func (*Client) FetchRecentIssues

func (c *Client) FetchRecentIssues(ctx context.Context, owner, repo string, since time.Time) iter.Seq2[*Issue, error]

FetchRecentIssues fetches issues (excluding PRs) created since the given time, with all comments.

func (*Client) FetchRecentPullRequests

func (c *Client) FetchRecentPullRequests(ctx context.Context, owner, repo string, since time.Time) iter.Seq2[*PullRequest, error]

FetchRecentPullRequests fetches PRs created since the given time using the GitHub GraphQL search.

func (*Client) FetchUpdatedIssueComments

func (c *Client) FetchUpdatedIssueComments(ctx context.Context, owner, repo string, since time.Time, excludeNumbers map[int]struct{}) iter.Seq2[*IssueWithComments, error]

FetchUpdatedIssueComments fetches issues/PRs that received new comments in the time range, excluding any numbers given in excludeNumbers.

func (*Client) GetFileContent

func (c *Client) GetFileContent(ctx context.Context, owner, repo, path, ref string) (*FileContent, error)

func (*Client) GetIssue

func (c *Client) GetIssue(ctx context.Context, owner, repo string, number int) (*Issue, error)

func (*Client) GetPullRequestDetail

func (c *Client) GetPullRequestDetail(ctx context.Context, owner, repo string, number int, includeFiles bool) (*PullRequestDetail, error)

func (*Client) ListCommits

func (c *Client) ListCommits(ctx context.Context, opts ListCommitsOptions) (*CommitList, error)

func (*Client) SearchIssuesAndPRs

func (c *Client) SearchIssuesAndPRs(ctx context.Context, opts SearchOptions) (*SearchResult, error)

func (*Client) ValidateRepository

func (c *Client) ValidateRepository(ctx context.Context, owner, repo string) (*RepositoryValidation, error)

ValidateRepository checks repository accessibility and returns metadata.

type Comment

type Comment struct {
	Author    string
	Body      string
	CreatedAt time.Time
	URL       string
}

Comment represents a comment on a GitHub issue or PR.

type Commit

type Commit struct {
	SHA           string
	AuthorLogin   string
	AuthorName    string
	AuthorEmail   string
	AuthoredDate  time.Time
	CommitterDate time.Time
	Message       string
	URL           string
}

Commit represents a single commit in a list response.

type CommitList

type CommitList struct {
	Items []Commit
}

CommitList is the response of ListCommits.

type FileChange

type FileChange struct {
	Path           string
	Status         string // "added" | "modified" | "removed" | "renamed"
	Additions      int
	Deletions      int
	Patch          string
	PatchTruncated bool // true when Patch was truncated to fit the size cap
}

FileChange represents a single file's change set in a PR.

type FileContent

type FileContent struct {
	Path      string
	Ref       string // resolved commit SHA
	Size      int64
	Content   string // empty when IsBinary is true
	Truncated bool   // true when the content was truncated to fit the size cap
	IsBinary  bool
}

FileContent is the response of GetFileContent.

type Issue

type Issue struct {
	Number    int
	Title     string
	Body      string
	Author    string
	State     string
	URL       string
	Labels    []string
	CreatedAt time.Time
	UpdatedAt time.Time
	ClosedAt  *time.Time // nil when the issue is still open
	Comments  []Comment
}

Issue represents a GitHub issue with all comments.

type IssueWithComments

type IssueWithComments struct {
	Number    int
	Title     string
	Body      string
	Author    string
	State     string
	URL       string
	IsPR      bool
	CreatedAt time.Time
	Comments  []Comment
	// Since marks the boundary; comments at or after this timestamp are NEW.
	Since time.Time
}

IssueWithComments represents an issue or PR that received new comments since a given point in time, with the full comment history attached.

type ListCommitsOptions

type ListCommitsOptions struct {
	Owner   string
	Repo    string
	Ref     string    // branch / tag / SHA; empty means default branch
	Path    string    // limit to commits touching this path; empty for any
	Author  string    // GitHub login or email; empty for any
	Since   time.Time // zero value means no lower bound
	Until   time.Time // zero value means no upper bound
	PerPage int       // 1..50; 0 defaults to 20
}

ListCommitsOptions configures a ListCommits call.

type PullRequest

type PullRequest struct {
	Number    int
	Title     string
	Body      string
	Author    string
	State     string
	URL       string
	Labels    []string
	CreatedAt time.Time
	Comments  []Comment
	Reviews   []Review
}

PullRequest represents a GitHub pull request with all comments and reviews.

type PullRequestDetail

type PullRequestDetail struct {
	PullRequest
	Merged    bool
	Draft     bool
	BaseRef   string
	HeadRef   string
	UpdatedAt time.Time
	ClosedAt  *time.Time // nil when the PR is still open
	// Files is non-nil only when GetPullRequestDetail was called with
	// includeFiles=true.
	Files []FileChange
}

PullRequestDetail is a PR with extra metadata and optionally the file diff. Embeds PullRequest so all base fields (comments, reviews, labels) are accessible directly on the detail value.

type RepositoryValidation

type RepositoryValidation struct {
	Valid                bool
	Owner                string
	Repo                 string
	FullName             string
	Description          string
	IsPrivate            bool
	PullRequestCount     int
	IssueCount           int
	CanFetchPullRequests bool
	CanFetchIssues       bool
	ErrorMessage         string
}

RepositoryValidation holds the result of repository validation.

type Review

type Review struct {
	Author    string
	Body      string
	State     string
	CreatedAt time.Time
}

Review represents a PR review.

type SearchHit

type SearchHit struct {
	Number    int
	Title     string
	URL       string
	Author    string
	State     string
	CreatedAt time.Time
	Labels    []string
	IsPR      bool
	RepoOwner string
	RepoName  string
}

SearchHit is a single matched issue or PR in the search response.

type SearchOptions

type SearchOptions struct {
	// Query is the GitHub search query. Supports all GitHub search operators
	// (repo:, is:open, author:, label:, etc).
	Query string
	// Type narrows results: "issue", "pr", or "" / "both" for no narrowing.
	// When set, the corresponding "is:issue" / "is:pr" qualifier is appended
	// to Query if not already present.
	Type string
	// PerPage is the page size, clamped to [1, 50]. Zero defaults to 20.
	PerPage int
}

SearchOptions configures a SearchIssuesAndPRs call.

type SearchResult

type SearchResult struct {
	Total int
	Items []SearchHit
}

SearchResult is the response of a SearchIssuesAndPRs call.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL