{"formatVersion":"1","kind":"dock_integration","slug":"github-rest-api","title":"GitHub REST API","summary":"Import a Harbor-safe GitHub starter set for authenticated profile, repository, issue, pull request, branch, commit, and file-content flows.","description":"A Dock-hosted GitHub REST API starter integration for Harbor. Importing it creates a local http_api port shell plus a Harbor-safe GitHub action set for bounded authenticated-user reads, explicit repo-scoped reads, and approval-friendly writes such as issues, pull requests, merges, and single-file content updates. Tokens remain local to Harbor Node.","version":"0.4.0","publisher":{"slug":"github","name":"GitHub","websiteUrl":"https://docs.github.com/en/rest"},"category":"Developer Tools","tags":["github","developer","issues","repositories","pull-requests","commits"],"compatibility":{"harborNode":">=0.1.0","notes":"Requires local operator-configured auth after import. Repo-scoped templates use `input.path` values at execution time."},"requiredPlan":"pro","portTemplates":[{"kind":"http_api","label":"GitHub REST API","description":"GitHub REST API connection managed locally through Harbor.","baseUrl":"https://api.github.com/","authMode":"header_token","authHeaderName":"Authorization","authTokenPrefix":"Bearer"}],"actionTemplates":[{"slug":"get-authenticated-user","label":"Get Authenticated User","description":"Fetch the authenticated GitHub user profile for the local account.","method":"GET","path":"/user","approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-my-issues","label":"List My Issues","description":"List issues assigned to the authenticated user across visible repositories with typed pagination and filter inputs.","method":"GET","path":"/issues","inputs":{"parameters":[{"name":"filter","in":"query","schema":{"type":"string","enum":["assigned","created","mentioned","subscribed","repos","all"]},"description":"Issue filter to apply."},{"name":"state","in":"query","schema":{"type":"string","enum":["open","closed","all"]},"description":"Issue state filter."},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":30,"description":"Maximum number of issues to return."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Page number to fetch."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-my-repositories","label":"List My Repositories","description":"List repositories visible to the authenticated user with typed pagination and visibility filters.","method":"GET","path":"/user/repos","inputs":{"parameters":[{"name":"visibility","in":"query","schema":{"type":"string","enum":["all","public","private"]},"description":"Repository visibility filter."},{"name":"sort","in":"query","schema":{"type":"string","enum":["created","updated","pushed","full_name"]},"description":"Repository sort order."},{"name":"direction","in":"query","schema":{"type":"string","enum":["asc","desc"]},"description":"Sort direction."},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":30,"description":"Maximum number of repositories to return."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Page number to fetch."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-my-notifications","label":"List My Notifications","description":"List repository notifications for the authenticated user with typed pagination filters.","method":"GET","path":"/notifications","inputs":{"parameters":[{"name":"all","in":"query","schema":{"type":"boolean"},"description":"Whether to include notifications marked as read."},{"name":"participating","in":"query","schema":{"type":"boolean"},"description":"Whether to limit results to notifications the user is directly participating in."},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":30,"description":"Maximum number of notifications to return."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Page number to fetch."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-my-organizations","label":"List My Organizations","description":"List organizations visible to the authenticated user with typed pagination inputs.","method":"GET","path":"/user/orgs","inputs":{"parameters":[{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":30,"description":"Maximum number of organizations to return."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Page number to fetch."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-repository","label":"Get Repository","description":"Fetch repository metadata for a specific owner and repository.","method":"GET","path":"/repos/{owner}/{repo}","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-repository-issues","label":"List Repository Issues","description":"List issues for a specific repository with typed state, sort, and pagination inputs.","method":"GET","path":"/repos/{owner}/{repo}/issues","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"state","in":"query","schema":{"type":"string","enum":["open","closed","all"]},"description":"Issue state filter."},{"name":"sort","in":"query","schema":{"type":"string","enum":["created","updated","comments"]},"description":"Issue sort order."},{"name":"direction","in":"query","schema":{"type":"string","enum":["asc","desc"]},"description":"Sort direction."},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":30,"description":"Maximum number of issues to return."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Page number to fetch."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-issue","label":"Get Issue","description":"Fetch a specific issue from a repository using explicit repo and issue identifiers.","method":"GET","path":"/repos/{owner}/{repo}/issues/{issue_number}","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"issue_number","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Issue number."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-issue-comments","label":"List Issue Comments","description":"List comments for a specific issue with typed pagination inputs.","method":"GET","path":"/repos/{owner}/{repo}/issues/{issue_number}/comments","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"issue_number","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Issue number."},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":30,"description":"Maximum number of comments to return."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Page number to fetch."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-pull-requests","label":"List Pull Requests","description":"List pull requests for a repository with typed branch, state, and pagination filters.","method":"GET","path":"/repos/{owner}/{repo}/pulls","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"state","in":"query","schema":{"type":"string","enum":["open","closed","all"]},"description":"Pull request state filter."},{"name":"head","in":"query","schema":{"type":"string"},"description":"Filter by head branch in `owner:branch` form."},{"name":"base","in":"query","schema":{"type":"string"},"description":"Filter by base branch name."},{"name":"sort","in":"query","schema":{"type":"string","enum":["created","updated","popularity","long-running"]},"description":"Pull request sort order."},{"name":"direction","in":"query","schema":{"type":"string","enum":["asc","desc"]},"description":"Sort direction."},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":30,"description":"Maximum number of pull requests to return."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Page number to fetch."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-pull-request","label":"Get Pull Request","description":"Fetch a specific pull request using explicit repository and pull request identifiers.","method":"GET","path":"/repos/{owner}/{repo}/pulls/{pull_number}","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"pull_number","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Pull request number."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-branches","label":"List Branches","description":"List branches for a repository with typed protection and pagination filters.","method":"GET","path":"/repos/{owner}/{repo}/branches","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"protected","in":"query","schema":{"type":"boolean"},"description":"Whether to return only protected branches."},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":30,"description":"Maximum number of branches to return."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Page number to fetch."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-branch","label":"Get Branch","description":"Fetch metadata for a specific branch in a repository.","method":"GET","path":"/repos/{owner}/{repo}/branches/{branch}","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"branch","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Branch name."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-commits","label":"List Commits","description":"List commits for a repository with typed branch, path, author, and pagination filters.","method":"GET","path":"/repos/{owner}/{repo}/commits","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"sha","in":"query","schema":{"type":"string"},"description":"Branch or commit SHA to start from."},{"name":"path","in":"query","schema":{"type":"string"},"description":"Filter commits that touch a specific repository path."},{"name":"author","in":"query","schema":{"type":"string"},"description":"Filter by GitHub username or commit email."},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":30,"description":"Maximum number of commits to return."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1},"description":"Page number to fetch."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-commit","label":"Get Commit","description":"Fetch a specific commit by SHA or ref for a repository.","method":"GET","path":"/repos/{owner}/{repo}/commits/{ref}","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"ref","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Commit SHA or ref."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"compare-two-commits","label":"Compare Two Commits","description":"Compare two commits or refs using GitHub's `base...head` comparison form.","method":"GET","path":"/repos/{owner}/{repo}/compare/{basehead}","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"basehead","in":"path","required":true,"schema":{"type":"string","minLength":3},"description":"Comparison string in `base...head` form."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-repository-content","label":"Get Repository Content","description":"Fetch file or directory content for a specific repository path with an optional ref override.","method":"GET","path":"/repos/{owner}/{repo}/contents/{path}","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"path","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository-relative content path."},{"name":"ref","in":"query","schema":{"type":"string"},"description":"Optional branch, tag, or commit SHA."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-repository","label":"Create Repository","description":"Create a repository for the authenticated user using a bounded JSON payload and Harbor-managed local auth.","method":"POST","path":"/user/repos","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-issue","label":"Create Issue","description":"Create an issue in a specific repository using `input.path.owner`, `input.path.repo`, and a bounded JSON payload in `input.body`.","method":"POST","path":"/repos/{owner}/{repo}/issues","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-issue-comment","label":"Create Issue Comment","description":"Create a comment on a specific repository issue using explicit repo and issue identifiers.","method":"POST","path":"/repos/{owner}/{repo}/issues/{issue_number}/comments","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"issue_number","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Issue number."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"update-issue","label":"Update Issue","description":"Update a specific issue using explicit repo and issue identifiers plus a bounded JSON body.","method":"PATCH","path":"/repos/{owner}/{repo}/issues/{issue_number}","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"issue_number","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Issue number."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-pull-request","label":"Create Pull Request","description":"Create a pull request for a repository using explicit repo identifiers and a bounded JSON payload.","method":"POST","path":"/repos/{owner}/{repo}/pulls","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"merge-pull-request","label":"Merge Pull Request","description":"Merge a specific pull request using explicit repo and pull request identifiers.","method":"PUT","path":"/repos/{owner}/{repo}/pulls/{pull_number}/merge","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"pull_number","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Pull request number."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-or-update-file-contents","label":"Create Or Update File Contents","description":"Create or replace a single repository file using explicit repo and path identifiers plus a bounded JSON payload. This supports file writes, not full git push workflows.","method":"PUT","path":"/repos/{owner}/{repo}/contents/{path}","inputs":{"parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository owner."},{"name":"repo","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository name."},{"name":"path","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Repository-relative file path."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"}],"helpText":"Import to Harbor, configure local auth, then validate, test, and publish the GitHub actions you need. Use typed `input.path` values for repo-scoped actions, typed `input.query` values for list filters, and bounded JSON bodies for create, update, merge, and file-write actions. Keep mutating actions on approval unless local policy says otherwise.","installNotes":"Dock shares only safe metadata. Hidden auth must be configured locally inside Harbor after import. For repo-scoped actions, pass explicit typed values under `input.path` so Harbor can fill the stored path template safely. Use file-content writes for single-file updates only, not as a generic replacement for git push."}