GitHub-shaped Issues and Projects API assessment
Date: 2026-08-22
Status: Repository-scoped subset implemented; bounded compatibility gaps remain
Intent
OpenAgents exposes a bounded /api/v3 subset so familiar GitHub-shaped clients
can interact with issues and project boards. The shape is a compatibility aid,
not a claim that the application implements the complete GitHub API.
The router and controller tests are the executable source of truth. This document records the intended subset and known gaps; it must not be used to infer authorization that the server does not enforce.
Implemented issue subset
| Concern | Methods and paths |
|---|---|
| Issues | GET, POST /repos/{owner}/{repo}/issues; GET, PUT, PATCH /repos/{owner}/{repo}/issues/{number} |
| Comments | GET, POST /repos/{owner}/{repo}/issues/{number}/comments; GET, PUT, PATCH, DELETE /repos/{owner}/{repo}/issues/comments/{id} |
| Labels | GET, POST /repos/{owner}/{repo}/labels; GET, PUT, PATCH, DELETE /repos/{owner}/{repo}/labels/{name} |
| Issue labels | GET, POST /repos/{owner}/{repo}/issues/{number}/labels; DELETE /repos/{owner}/{repo}/issues/{number}/labels/{name} |
| Assignees | GET /repos/{owner}/{repo}/assignees; GET /repos/{owner}/{repo}/assignees/{login}; GET, POST, DELETE /repos/{owner}/{repo}/issues/{number}/assignees |
| Milestones | GET, POST /repos/{owner}/{repo}/milestones; GET, PUT, PATCH, DELETE /repos/{owner}/{repo}/milestones/{number} |
Cross-repository issue lists, organization issue lists, event/timeline APIs, locks, dependencies, sub-issues, and suggestion APIs are not implemented.
Implemented Projects V2 subset
| Method | Path |
|---|---|
GET, POST |
/repos/{owner}/{repo}/projectsV2 |
GET |
/repos/{owner}/{repo}/projectsV2/{project_number} |
GET, POST |
/repos/{owner}/{repo}/projectsV2/{project_number}/items |
PATCH |
/repos/{owner}/{repo}/projectsV2/{project_number}/items/{item_id} |
GET, POST |
/repos/{owner}/{repo}/projectsV2/{project_number}/fields |
The project-creation endpoint is an OpenAgents extension because the comparable GitHub Projects V2 creation workflow is not supplied by the assessed REST surface. Project update/delete, item delete/read, field mutation, views, ordering, draft items, and organization projects remain unimplemented.
CLI access
@openagentsinc/cli@0.2.1 exposes the complete implemented surface through
openagents api. The published CLI does not yet provide named issue or
project commands.
openagents api 'repos/OWNER/REPOSITORY/issues?state=all'
openagents api repos/OWNER/REPOSITORY/projectsV2
See Call the API with the OpenAgents CLI for request bodies, response envelopes, Issues recipes, and Projects recipes.
Enforced authority contract
These are current measured behaviors:
/api/v3anonymous and optional-bearer reads and authenticated writes use separate pipelines. Writes require an expiring digest-onlyoa_pat_…bearer with exactforge:writescope. An authenticated person creates and revokes credentials at/settings/api-tokens; plaintext is shown once.- Owner and repository path values resolve a canonical repository row. Public reads expose only repositories marked public; writes additionally require a writable membership for the PAT principal.
- Resource reads and mutations include repository ownership in their database query. Composite foreign keys reject cross-repository comments, label and assignee links, and milestones. A project item stores separate project and source-issue repository identities, so one board can include a readable issue from another repository without weakening project write authority.
- Issue and milestone numbers are repository-local. Project numbers are also repository-local for the repository-shaped LiveView surface.
- Project list, show, item, update-item, and field actions resolve the repository from the route. Public repositories allow anonymous reads. Private reads and every write require membership in that repository.
- Item creation accepts either the legacy repository-local
issue_numberor anissueobject withowner,repo, andnumber. Cross-repository adds require write access to the project repository and read access to the source repository. Item lists omit source issues that the current viewer cannot read. - Assignee reads return active repository members with writable roles, and issue assignment accepts only those members.
Remaining compatibility gaps
These are compatibility limits, not authorization fallbacks:
- Issue creation with a nonexistent label returns 422; only the add-labels-to-issue endpoint creates labels on the fly, matching GitHub.
- Optional-bearer private reads cover repository, issue, and project base routes. Comment, label, assignee, and milestone read routes remain public-repository reads.
- Nonnumeric issue and milestone numbers can produce
500 Internal Server Errorinstead of404 Not Found. - Error envelopes and pagination/link headers are a bounded local contract,
not complete Octokit or
ghparity.
Closed on 2026-08-21, each pinned by tests: label rename through new_name,
create-on-add for missing labels at the issue-labels endpoint, 404 for
removing a label an issue does not wear, and path-correct percent-encoding of
label URLs so an advertised label URL resolves through the show endpoint.
Gate 6 supplied the explicit API principal and mutation policy. Gate 7 supplied repository entities, foreign keys, scoped uniqueness, ownership checks, and cross-repository isolation tests. Further compatibility work must preserve those authority boundaries.
Evidence
test/openagents_web/controllers/issue_controller_test.exstest/openagents_web/controllers/comment_controller_test.exstest/openagents_web/controllers/label_controller_test.exstest/openagents_web/controllers/issue_label_controller_test.exstest/openagents_web/controllers/assignee_controller_test.exstest/openagents_web/controllers/issue_assignee_controller_test.exstest/openagents_web/controllers/milestone_controller_test.exstest/openagents_web/controllers/project_controller_test.exstest/openagents_web/controllers/repository_isolation_controller_test.exstest/openagents/repositories_test.exs