Documentation
¶
Index ¶
- type ActionsService
- func (s *ActionsService) CancelWorkflow(ctx context.Context, owner, repo string, runID int64) error
- func (s *ActionsService) DeleteArtifact(ctx context.Context, owner, repo string, artifactID int64) error
- func (s *ActionsService) DeleteCacheByID(ctx context.Context, owner, repo string, cacheID int64) error
- func (s *ActionsService) DeleteCachesByKey(ctx context.Context, owner, repo, key string, ref *string) error
- func (s *ActionsService) DownloadArtifact(ctx context.Context, owner, repo string, artifactID int64) (string, error)
- func (s *ActionsService) DownloadJobLogs(ctx context.Context, owner, repo string, jobID int64) (string, error)
- func (s *ActionsService) DownloadWorkflowLogs(ctx context.Context, owner, repo string, runID int64) (string, error)
- func (s *ActionsService) GetArtifact(ctx context.Context, owner, repo string, artifactID int64) (*github.Artifact, error)
- func (s *ActionsService) GetWorkflow(ctx context.Context, owner, repo, workflowIDOrFile string) (*Workflow, error)
- func (s *ActionsService) GetWorkflowJob(ctx context.Context, owner, repo string, jobID int64) (*WorkflowJob, error)
- func (s *ActionsService) GetWorkflowRun(ctx context.Context, owner, repo string, runID int64) (*WorkflowRun, error)
- func (s *ActionsService) ListArtifacts(ctx context.Context, owner, repo string, runID int64) ([]*github.Artifact, error)
- func (s *ActionsService) ListCaches(ctx context.Context, owner, repo string, ref *string) ([]*github.ActionsCache, error)
- func (s *ActionsService) ListWorkflowJobs(ctx context.Context, owner, repo string, runID int64, filter string) ([]*WorkflowJob, error)
- func (s *ActionsService) ListWorkflowRuns(ctx context.Context, owner, repo string, workflowIDOrFile string, ...) ([]*WorkflowRun, error)
- func (s *ActionsService) ListWorkflows(ctx context.Context, owner, repo string) ([]*Workflow, error)
- func (s *ActionsService) RerunFailedJobs(ctx context.Context, owner, repo string, runID int64) error
- func (s *ActionsService) RerunJob(ctx context.Context, owner, repo string, jobID int64) error
- func (s *ActionsService) RerunWorkflow(ctx context.Context, owner, repo string, runID int64) error
- func (s *ActionsService) TriggerWorkflow(ctx context.Context, owner, repo, workflowIDOrFile, ref string, ...) error
- type Client
- type GitRemoteParser
- type Issue
- type IssueCreateRequest
- type IssueUpdateRequest
- type IssuesService
- func (s *IssuesService) AddComment(ctx context.Context, owner, repo string, number int, body string) error
- func (s *IssuesService) AddLabels(ctx context.Context, owner, repo string, number int, labels []string) error
- func (s *IssuesService) AssignIssue(ctx context.Context, owner, repo string, number int, assignees []string) error
- func (s *IssuesService) CloseIssue(ctx context.Context, owner, repo string, number int) (*Issue, error)
- func (s *IssuesService) CreateIssue(ctx context.Context, owner, repo string, req *IssueCreateRequest) (*Issue, error)
- func (s *IssuesService) GetIssue(ctx context.Context, owner, repo string, number int) (*Issue, error)
- func (s *IssuesService) ListIssues(ctx context.Context, owner, repo string, state string, labels []string) ([]*Issue, error)
- func (s *IssuesService) RemoveLabel(ctx context.Context, owner, repo string, number int, label string) error
- func (s *IssuesService) UpdateIssue(ctx context.Context, owner, repo string, number int, req IssueUpdateRequest) (*Issue, error)
- type Milestone
- type MilestoneCreateRequest
- type MilestonesService
- func (s *MilestonesService) CloseMilestone(ctx context.Context, owner, repo string, number int) (*Milestone, error)
- func (s *MilestonesService) CreateMilestone(ctx context.Context, owner, repo string, req MilestoneCreateRequest) (*Milestone, error)
- func (s *MilestonesService) DeleteMilestone(ctx context.Context, owner, repo string, number int) error
- func (s *MilestonesService) GetMilestone(ctx context.Context, owner, repo string, number int) (*Milestone, error)
- func (s *MilestonesService) ListMilestones(ctx context.Context, owner, repo string, state string) ([]*Milestone, error)
- func (s *MilestonesService) UpdateMilestone(ctx context.Context, owner, repo string, number int, ...) (*Milestone, error)
- type Project
- type ProjectField
- type ProjectsService
- func (s *ProjectsService) GetOrganizationProject(ctx context.Context, org string, projectNumber int) (*Project, error)
- func (s *ProjectsService) GetUserProject(ctx context.Context, username string, projectNumber int) (*Project, error)
- func (s *ProjectsService) ListOrganizationProjects(ctx context.Context, org string) ([]*Project, error)
- func (s *ProjectsService) ListProjectFields(ctx context.Context, org string, projectNumber int) ([]*ProjectField, error)
- func (s *ProjectsService) ListUserProjects(ctx context.Context, username string) ([]*Project, error)
- type PullRequestService
- func (s *PullRequestService) GetPullRequestDiff(ctx context.Context, sessionID string) (string, error)
- func (s *PullRequestService) GetSessionPullRequest(ctx context.Context, sessionID string) (*github.PullRequest, error)
- func (s *PullRequestService) MergePullRequest(ctx context.Context, prURL string, mergeMethod string) error
- type Repository
- type RepositoryService
- func (s *RepositoryService) DiscoverCurrentRepo(ctx context.Context) (*Repository, error)
- func (s *RepositoryService) ListAccessibleRepos(ctx context.Context) ([]*Repository, error)
- func (s *RepositoryService) ListConnectedRepos(ctx context.Context) ([]*Repository, error)
- func (s *RepositoryService) SearchRepositories(ctx context.Context, query string, opts *github.SearchOptions) ([]*Repository, error)
- func (s *RepositoryService) SyncRepoWithJules(ctx context.Context, owner, repo string) error
- type SessionService
- type Workflow
- type WorkflowJob
- type WorkflowRun
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ActionsService ¶
type ActionsService struct {
// contains filtered or unexported fields
}
ActionsService handles GitHub Actions operations
func NewActionsService ¶
func NewActionsService(client *Client) *ActionsService
NewActionsService creates a new actions service
func (*ActionsService) CancelWorkflow ¶
CancelWorkflow cancels a workflow run
func (*ActionsService) DeleteArtifact ¶
func (s *ActionsService) DeleteArtifact(ctx context.Context, owner, repo string, artifactID int64) error
DeleteArtifact deletes an artifact
func (*ActionsService) DeleteCacheByID ¶
func (s *ActionsService) DeleteCacheByID(ctx context.Context, owner, repo string, cacheID int64) error
DeleteCacheByID deletes a cache by ID
func (*ActionsService) DeleteCachesByKey ¶
func (s *ActionsService) DeleteCachesByKey(ctx context.Context, owner, repo, key string, ref *string) error
DeleteCachesByKey deletes caches by key
func (*ActionsService) DownloadArtifact ¶
func (s *ActionsService) DownloadArtifact(ctx context.Context, owner, repo string, artifactID int64) (string, error)
DownloadArtifact downloads an artifact and returns the download URL
func (*ActionsService) DownloadJobLogs ¶
func (s *ActionsService) DownloadJobLogs(ctx context.Context, owner, repo string, jobID int64) (string, error)
DownloadJobLogs downloads logs for a specific job
func (*ActionsService) DownloadWorkflowLogs ¶
func (s *ActionsService) DownloadWorkflowLogs(ctx context.Context, owner, repo string, runID int64) (string, error)
DownloadWorkflowLogs downloads logs for a workflow run
func (*ActionsService) GetArtifact ¶
func (s *ActionsService) GetArtifact(ctx context.Context, owner, repo string, artifactID int64) (*github.Artifact, error)
GetArtifact gets a specific artifact by ID
func (*ActionsService) GetWorkflow ¶
func (s *ActionsService) GetWorkflow(ctx context.Context, owner, repo, workflowIDOrFile string) (*Workflow, error)
GetWorkflow gets a specific workflow by ID or filename
func (*ActionsService) GetWorkflowJob ¶
func (s *ActionsService) GetWorkflowJob(ctx context.Context, owner, repo string, jobID int64) (*WorkflowJob, error)
GetWorkflowJob gets a specific job by ID
func (*ActionsService) GetWorkflowRun ¶
func (s *ActionsService) GetWorkflowRun(ctx context.Context, owner, repo string, runID int64) (*WorkflowRun, error)
GetWorkflowRun gets a specific workflow run by ID
func (*ActionsService) ListArtifacts ¶
func (s *ActionsService) ListArtifacts(ctx context.Context, owner, repo string, runID int64) ([]*github.Artifact, error)
ListArtifacts lists artifacts for a repository or workflow run
func (*ActionsService) ListCaches ¶
func (s *ActionsService) ListCaches(ctx context.Context, owner, repo string, ref *string) ([]*github.ActionsCache, error)
ListCaches lists GitHub Actions caches for a repository
func (*ActionsService) ListWorkflowJobs ¶
func (s *ActionsService) ListWorkflowJobs(ctx context.Context, owner, repo string, runID int64, filter string) ([]*WorkflowJob, error)
ListWorkflowJobs lists jobs for a workflow run
func (*ActionsService) ListWorkflowRuns ¶
func (s *ActionsService) ListWorkflowRuns(ctx context.Context, owner, repo string, workflowIDOrFile string, opts *github.ListWorkflowRunsOptions) ([]*WorkflowRun, error)
ListWorkflowRuns lists workflow runs for a repository or specific workflow
func (*ActionsService) ListWorkflows ¶
func (s *ActionsService) ListWorkflows(ctx context.Context, owner, repo string) ([]*Workflow, error)
ListWorkflows lists all workflows in a repository
func (*ActionsService) RerunFailedJobs ¶
func (s *ActionsService) RerunFailedJobs(ctx context.Context, owner, repo string, runID int64) error
RerunFailedJobs re-runs only failed jobs in a workflow run
func (*ActionsService) RerunWorkflow ¶
RerunWorkflow re-runs a workflow run
func (*ActionsService) TriggerWorkflow ¶
func (s *ActionsService) TriggerWorkflow(ctx context.Context, owner, repo, workflowIDOrFile, ref string, inputs map[string]interface{}) error
TriggerWorkflow manually triggers a workflow dispatch event
type Client ¶
type Client struct {
*github.Client
// Specialized services - each responsible for a specific domain
Repositories *RepositoryService
Actions *ActionsService
PullRequests *PullRequestService
Sessions *SessionService
Issues *IssuesService
Milestones *MilestonesService
Projects *ProjectsService
// contains filtered or unexported fields
}
Client wraps the GitHub API client with Jules integration It acts as a facade that delegates to specialized services following SOLID principles: - Single Responsibility: Each service handles one domain area - Open/Closed: New services can be added without modifying existing code - Liskov Substitution: Services can be mocked for testing - Interface Segregation: Each service exposes only relevant methods - Dependency Inversion: Services depend on abstractions (interfaces)
type GitRemoteParser ¶
type GitRemoteParser struct{}
GitRemoteParser handles parsing of Git remote URLs and repository detection
func NewGitRemoteParser ¶
func NewGitRemoteParser() *GitRemoteParser
NewGitRemoteParser creates a new git remote parser
func (*GitRemoteParser) GetRepoFromGitRemote ¶
func (p *GitRemoteParser) GetRepoFromGitRemote() (*Repository, error)
GetRepoFromGitRemote detects the GitHub repository from the current directory's git remote
func (*GitRemoteParser) ParseGitHubURL ¶
func (p *GitRemoteParser) ParseGitHubURL(remoteURL string) (*Repository, error)
ParseGitHubURL parses a GitHub URL and extracts owner and repository name Supports both HTTPS and SSH URL formats: - https://github.com/owner/repo.git - git@github.com:owner/repo.git
type Issue ¶
type Issue struct {
Number int `json:"number"`
Title string `json:"title"`
Body string `json:"body"`
State string `json:"state"`
URL string `json:"url"`
HTMLURL string `json:"html_url"`
Milestone string `json:"milestone,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
ClosedAt *time.Time `json:"closed_at,omitempty"`
Assignees []string `json:"assignees"`
Labels []string `json:"labels"`
}
Issue represents a GitHub issue with relevant metadata.
type IssueCreateRequest ¶
type IssueCreateRequest struct {
Title string `json:"title"`
Body string `json:"body,omitempty"`
Assignees []string `json:"assignees,omitempty"`
Labels []string `json:"labels,omitempty"`
Milestone int `json:"milestone,omitempty"`
}
IssueCreateRequest represents parameters for creating a new issue
type IssueUpdateRequest ¶
type IssueUpdateRequest struct {
Title *string `json:"title,omitempty"`
Body *string `json:"body,omitempty"`
State *string `json:"state,omitempty"`
Assignees *[]string `json:"assignees,omitempty"`
Labels *[]string `json:"labels,omitempty"`
Milestone *int `json:"milestone,omitempty"`
}
IssueUpdateRequest represents parameters for updating an issue
type IssuesService ¶
type IssuesService struct {
// contains filtered or unexported fields
}
IssuesService handles GitHub Issues operations
func NewIssuesService ¶
func NewIssuesService(client *Client) *IssuesService
NewIssuesService creates a new issues service
func (*IssuesService) AddComment ¶
func (s *IssuesService) AddComment(ctx context.Context, owner, repo string, number int, body string) error
AddComment adds a comment to an issue
func (*IssuesService) AddLabels ¶
func (s *IssuesService) AddLabels(ctx context.Context, owner, repo string, number int, labels []string) error
AddLabels adds labels to an issue
func (*IssuesService) AssignIssue ¶
func (s *IssuesService) AssignIssue(ctx context.Context, owner, repo string, number int, assignees []string) error
AssignIssue assigns users to an issue
func (*IssuesService) CloseIssue ¶
func (s *IssuesService) CloseIssue(ctx context.Context, owner, repo string, number int) (*Issue, error)
CloseIssue closes an issue
func (*IssuesService) CreateIssue ¶
func (s *IssuesService) CreateIssue(ctx context.Context, owner, repo string, req *IssueCreateRequest) (*Issue, error)
CreateIssue creates a new issue in a repository.
func (*IssuesService) GetIssue ¶
func (s *IssuesService) GetIssue(ctx context.Context, owner, repo string, number int) (*Issue, error)
GetIssue retrieves a specific issue
func (*IssuesService) ListIssues ¶
func (s *IssuesService) ListIssues(ctx context.Context, owner, repo string, state string, labels []string) ([]*Issue, error)
ListIssues lists issues for a repository
func (*IssuesService) RemoveLabel ¶
func (s *IssuesService) RemoveLabel(ctx context.Context, owner, repo string, number int, label string) error
RemoveLabel removes a label from an issue
func (*IssuesService) UpdateIssue ¶
func (s *IssuesService) UpdateIssue(ctx context.Context, owner, repo string, number int, req IssueUpdateRequest) (*Issue, error)
UpdateIssue updates an existing issue
type Milestone ¶
type Milestone struct {
Number int `json:"number"`
Title string `json:"title"`
Description string `json:"description"`
State string `json:"state"`
URL string `json:"url"`
HTMLURL string `json:"html_url"`
OpenIssues int `json:"open_issues"`
ClosedIssues int `json:"closed_issues"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DueOn *time.Time `json:"due_on,omitempty"`
ClosedAt *time.Time `json:"closed_at,omitempty"`
}
Milestone represents a GitHub milestone.
type MilestoneCreateRequest ¶
type MilestoneCreateRequest struct {
Title string `json:"title"`
Description string `json:"description,omitempty"`
DueOn *time.Time `json:"due_on,omitempty"`
State string `json:"state,omitempty"`
}
MilestoneCreateRequest represents parameters for creating a milestone
type MilestonesService ¶
type MilestonesService struct {
// contains filtered or unexported fields
}
MilestonesService handles GitHub Milestones operations
func NewMilestonesService ¶
func NewMilestonesService(client *Client) *MilestonesService
NewMilestonesService creates a new milestones service
func (*MilestonesService) CloseMilestone ¶
func (s *MilestonesService) CloseMilestone(ctx context.Context, owner, repo string, number int) (*Milestone, error)
CloseMilestone closes a milestone
func (*MilestonesService) CreateMilestone ¶
func (s *MilestonesService) CreateMilestone(ctx context.Context, owner, repo string, req MilestoneCreateRequest) (*Milestone, error)
CreateMilestone creates a new milestone
func (*MilestonesService) DeleteMilestone ¶
func (s *MilestonesService) DeleteMilestone(ctx context.Context, owner, repo string, number int) error
DeleteMilestone deletes a milestone
func (*MilestonesService) GetMilestone ¶
func (s *MilestonesService) GetMilestone(ctx context.Context, owner, repo string, number int) (*Milestone, error)
GetMilestone retrieves a specific milestone
func (*MilestonesService) ListMilestones ¶
func (s *MilestonesService) ListMilestones(ctx context.Context, owner, repo string, state string) ([]*Milestone, error)
ListMilestones lists milestones for a repository
func (*MilestonesService) UpdateMilestone ¶
func (s *MilestonesService) UpdateMilestone(ctx context.Context, owner, repo string, number int, req MilestoneCreateRequest) (*Milestone, error)
UpdateMilestone updates an existing milestone
type Project ¶
type Project struct {
ID int64 `json:"id"`
Number int `json:"number"`
Title string `json:"title"`
Description string `json:"description"`
State string `json:"state"`
URL string `json:"url"`
HTMLURL string `json:"html_url"`
Public bool `json:"public"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
ClosedAt *time.Time `json:"closed_at,omitempty"`
}
Project represents a GitHub Project (v2).
type ProjectField ¶
type ProjectField struct {
ID int64 `json:"id"`
Name string `json:"name"`
DataType string `json:"data_type"`
Options []string `json:"options,omitempty"`
}
ProjectField represents a field in a GitHub Projects v2 project.
type ProjectsService ¶
type ProjectsService struct {
// contains filtered or unexported fields
}
ProjectsService handles GitHub Projects (v2) operations Note: Projects v2 uses GraphQL API for most operations This service provides helper methods for common use cases
func NewProjectsService ¶
func NewProjectsService(client *Client) *ProjectsService
NewProjectsService creates a new projects service
func (*ProjectsService) GetOrganizationProject ¶
func (s *ProjectsService) GetOrganizationProject(ctx context.Context, org string, projectNumber int) (*Project, error)
GetOrganizationProject retrieves a specific organization project
func (*ProjectsService) GetUserProject ¶
func (s *ProjectsService) GetUserProject(ctx context.Context, username string, projectNumber int) (*Project, error)
GetUserProject retrieves a specific user project
func (*ProjectsService) ListOrganizationProjects ¶
func (s *ProjectsService) ListOrganizationProjects(ctx context.Context, org string) ([]*Project, error)
ListOrganizationProjects lists Projects v2 for an organization
func (*ProjectsService) ListProjectFields ¶
func (s *ProjectsService) ListProjectFields(ctx context.Context, org string, projectNumber int) ([]*ProjectField, error)
ListProjectFields lists fields for a project
func (*ProjectsService) ListUserProjects ¶
func (s *ProjectsService) ListUserProjects(ctx context.Context, username string) ([]*Project, error)
ListUserProjects lists Projects v2 for a user
type PullRequestService ¶
type PullRequestService struct {
// contains filtered or unexported fields
}
PullRequestService handles pull request operations
func NewPullRequestService ¶
func NewPullRequestService(client *Client, julesClient *jules.Client) *PullRequestService
NewPullRequestService creates a new pull request service
func (*PullRequestService) GetPullRequestDiff ¶
func (s *PullRequestService) GetPullRequestDiff(ctx context.Context, sessionID string) (string, error)
GetPullRequestDiff retrieves the diff for a PR created by a Jules session
func (*PullRequestService) GetSessionPullRequest ¶
func (s *PullRequestService) GetSessionPullRequest(ctx context.Context, sessionID string) (*github.PullRequest, error)
GetSessionPullRequest retrieves the PR created by a Jules session
func (*PullRequestService) MergePullRequest ¶
func (s *PullRequestService) MergePullRequest(ctx context.Context, prURL string, mergeMethod string) error
MergePullRequest merges a PR created by Jules
type Repository ¶
type Repository struct {
Owner string `json:"owner"`
Name string `json:"name"`
FullName string `json:"full_name"`
Description string `json:"description,omitempty"`
Stars int `json:"stars"`
Forks int `json:"forks"`
OpenIssues int `json:"open_issues"`
DefaultBranch string `json:"default_branch"`
Private bool `json:"private"`
URL string `json:"url"`
UpdatedAt string `json:"updated_at,omitempty"`
}
Repository represents a GitHub repository with metadata
type RepositoryService ¶
type RepositoryService struct {
// contains filtered or unexported fields
}
RepositoryService handles repository-related operations
func NewRepositoryService ¶
func NewRepositoryService(client *Client, julesClient *jules.Client) *RepositoryService
NewRepositoryService creates a new repository service
func (*RepositoryService) DiscoverCurrentRepo ¶
func (s *RepositoryService) DiscoverCurrentRepo(ctx context.Context) (*Repository, error)
DiscoverCurrentRepo detects the GitHub repository from the current git remote
func (*RepositoryService) ListAccessibleRepos ¶
func (s *RepositoryService) ListAccessibleRepos(ctx context.Context) ([]*Repository, error)
ListAccessibleRepos lists repositories the user can access
func (*RepositoryService) ListConnectedRepos ¶
func (s *RepositoryService) ListConnectedRepos(ctx context.Context) ([]*Repository, error)
ListConnectedRepos fetches repositories connected to Jules
func (*RepositoryService) SearchRepositories ¶
func (s *RepositoryService) SearchRepositories(ctx context.Context, query string, opts *github.SearchOptions) ([]*Repository, error)
SearchRepositories searches for GitHub repositories using the GitHub Search API
func (*RepositoryService) SyncRepoWithJules ¶
func (s *RepositoryService) SyncRepoWithJules(ctx context.Context, owner, repo string) error
SyncRepoWithJules ensures a repository is connected to Jules
type SessionService ¶
type SessionService struct {
// contains filtered or unexported fields
}
SessionService handles Jules session operations with GitHub integration
func NewSessionService ¶
func NewSessionService(client *Client, julesClient *jules.Client, repoService *RepositoryService) *SessionService
NewSessionService creates a new session service
func (*SessionService) CreateSessionFromCurrentRepo ¶
func (s *SessionService) CreateSessionFromCurrentRepo(ctx context.Context, prompt string, branch string) (*jules.Session, error)
CreateSessionFromCurrentRepo creates a Jules session using git context
func (*SessionService) CreateSessionFromRepo ¶
func (s *SessionService) CreateSessionFromRepo(ctx context.Context, prompt, owner, repo, branch string) (*jules.Session, error)
CreateSessionFromRepo creates a Jules session for a specific GitHub repository
type Workflow ¶
type Workflow struct {
ID int64 `json:"id"`
Name string `json:"name"`
Path string `json:"path"`
State string `json:"state"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
URL string `json:"url"`
BadgeURL string `json:"badge_url"`
}
Workflow represents a GitHub Actions workflow
type WorkflowJob ¶
type WorkflowJob struct {
ID int64 `json:"id"`
RunID int64 `json:"run_id"`
Name string `json:"name"`
Status string `json:"status"`
Conclusion string `json:"conclusion,omitempty"`
StartedAt string `json:"started_at,omitempty"`
CompletedAt string `json:"completed_at,omitempty"`
URL string `json:"url"`
RunnerName string `json:"runner_name,omitempty"`
}
WorkflowJob represents a GitHub Actions workflow job
type WorkflowRun ¶
type WorkflowRun struct {
ID int64 `json:"id"`
Name string `json:"name"`
HeadBranch string `json:"head_branch"`
Status string `json:"status"`
Conclusion string `json:"conclusion,omitempty"`
WorkflowID int64 `json:"workflow_id"`
URL string `json:"url"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
RunNumber int `json:"run_number"`
Event string `json:"event"`
Actor string `json:"actor"`
RunAttempt int `json:"run_attempt"`
RunStartedAt string `json:"run_started_at,omitempty"`
}
WorkflowRun represents a GitHub Actions workflow run