38 KiB
Forgejo Issue Integration Batches
Planning artifact for adding Forgejo issue visibility and issue-closing workflows to Pipeline.
This document is written so each section can be copied into a git issue and assigned to an implementation agent. Batches are intentionally small and split by backend-only or frontend-only work. Do not combine backend and frontend work in one implementation issue unless the issue explicitly says it is a coordination step.
Ground Rules For Agents
- Keep backend issues backend-only: models, migrations, services, API routes, schemas, tests, docs.
- Keep frontend issues frontend-only: generated clients, pages, components, UI tests, styling.
- Do not hand-edit generated frontend API files except in the explicit Orval regeneration issue.
- Do not expose Forgejo tokens in API responses, activity messages, logs, or frontend state.
- Treat Forgejo tokens as high-risk secrets because
write:issuecan mutate external projects. - Treat Forgejo base URLs as outbound network targets. Validate scheme and normalization deliberately to avoid accidental SSRF footguns.
- Prefer existing Pipeline patterns:
- Backend routers:
backend/app/api/*.py - Backend schemas:
backend/app/schemas/*.py - Backend models:
backend/app/models/*.py - Backend tests:
backend/tests/test_* - Frontend pages:
frontend/src/app/**/page.tsx - Frontend generated hooks:
frontend/src/api/generated/** - Frontend tables:
frontend/src/components/tables/DataTable.tsx - Frontend shell/sidebar:
frontend/src/components/templates/DashboardPageLayout.tsx,frontend/src/components/organisms/DashboardSidebar.tsx
- Backend routers:
- Add focused tests for each batch. Avoid relying on future batches.
- If a batch needs an API from an earlier batch, assume that earlier batch is already merged.
Assumptions
- Git project integration means Forgejo or Gitea-compatible git projects.
- Pipeline stores Forgejo tokens server-side only.
- Humans should be able to view tracked issues in Pipeline.
- Agents should be able to view issues through agent-scoped APIs.
- Only board lead agents can close issues in the first implementation pass.
- Closing an issue should update Forgejo and then update Pipeline's local tracking cache.
- Generated frontend API clients come from Orval after backend OpenAPI routes exist.
Reference Notes
- Forgejo API usage supports
Authorization: token ...and paginated API responses. - Forgejo access tokens should use
read:issuefor read-only issue access andwrite:issuefor issue closing or mutation. - Forgejo exposes an OpenAPI document at
/swagger.v1.jsonon a Forgejo host. - Forgejo's issue edit operation is
PATCH /api/v1/repos/{owner}/{repo}/issues/{index}. Closing an issue should send a body withstate: "closed". - Forgejo issue list endpoints are paginated with
pageandlimit; hosts can cap page sizes. The default and max values are available from/api/v1/settings/api. - Forgejo issue APIs may include pull requests depending on endpoint/query options. MVP issue sync should exclude pull requests.
Sources:
- https://forgejo.codeberg.page/docs/v7.0/user/api-usage/
- https://forgejo.org/docs/v11.0/user/token-scope/
- https://docs.rs/forgejo-api/latest/forgejo_api/
Current Pipeline Fit
Pipeline already has useful architecture for this work:
- FastAPI routers mounted under
/api/v1inbackend/app/main.py. - SQLModel models and Alembic migrations.
- Organization, board, and agent access dependencies in
backend/app/api/deps.py. - Agent-scoped API routes in
backend/app/api/agent.py. - Activity events in
backend/app/models/activity_events.pyandbackend/app/services/activity_log.py. - Dashboard metrics aggregation in
backend/app/api/metrics.py. - Frontend generated React Query hooks via
frontend/orval.config.ts. - Existing dashboard, table, settings, and admin page patterns.
Recommended Backend Order
- Add Forgejo database models.
- Add admin connection CRUD API.
- Add admin tracked repository CRUD API.
- Add Forgejo API client service.
- Add backend connection validation API.
- Add cached issue database model.
- Add issue sync service and manual sync API.
- Add human issue list/read APIs.
- Add board-to-repository link database model.
- Add board repository linking APIs.
- Add agent issue read APIs.
- Add close issue service.
- Add human and agent close issue APIs.
- Add issue tracking metrics.
- Optional: add Forgejo webhook ingest.
Recommended Frontend Order
- Regenerate API client after backend routes are merged.
- Add Git Projects navigation and shell page.
- Add admin Forgejo connection UI.
- Add admin tracked repository UI.
- Add manual repository sync UI.
- Add connection validation UI.
- Add issue list view.
- Add board repository linking UI.
- Add board-level linked issues panel.
- Add close issue action.
- Add dashboard issue tracking widgets.
- Final UI polish and theme review.
Backend Issue 1: Add Forgejo Database Models
Labels: backend, database, forgejo
Goal
Add the database foundation for Forgejo connections and tracked repositories.
Scope
- Add SQLModel models for Forgejo connections and tracked repositories.
- Add an Alembic migration.
- Add model imports where Pipeline expects metadata discovery.
- Do not add API routes in this issue.
Suggested Implementation References
- Existing models:
backend/app/models/gateways.py,backend/app/models/boards.py - Existing migrations:
backend/migrations/versions/* - Model registry import patterns:
backend/app/models/__init__.py
Suggested Model Shape
ForgejoConnectionidorganization_idnamebase_urltokentoken_last_eightactivecreated_atupdated_at
ForgejoRepositoryidorganization_idconnection_idownerrepodisplay_namedefault_branchactivelast_sync_atlast_sync_errorcreated_atupdated_at
Acceptance Criteria
- Migration creates
forgejo_connectionsandforgejo_repositories. - Foreign keys and indexes support organization-scoped lookup.
- Token is nullable only if intentionally supported by validation later.
- Store a token hint such as the last eight characters so admins can identify which token is configured without exposing it.
- Prefer encrypted token storage if Pipeline already has a secret-encryption utility available; otherwise document that this batch follows the existing gateway-token storage pattern and leave encryption as a separate security hardening issue.
- No API routes are added.
- A focused model/migration test or metadata test passes.
Out Of Scope
- CRUD endpoints.
- Forgejo HTTP calls.
- Issue syncing.
- Frontend UI.
Backend Issue 2: Add Admin Forgejo Connection CRUD API
Labels: backend, api, forgejo, admin
Goal
Allow organization admins to manage Forgejo connections.
Scope
- Add Forgejo connection schemas.
- Add admin-only list/create/read/update/delete endpoints for connections.
- Redact tokens from all read responses.
- Keep repository management out of this issue.
Suggested Implementation References
- Admin dependency:
backend/app/api/deps.pyrequire_org_admin - Gateway CRUD style:
backend/app/api/gateways.py,backend/app/schemas/gateways.py - Router wiring:
backend/app/main.py - Response wrapper:
backend/app/schemas/common.pyOkResponse
Suggested Endpoints
GET /api/v1/forgejo/connectionsPOST /api/v1/forgejo/connectionsGET /api/v1/forgejo/connections/{connection_id}PATCH /api/v1/forgejo/connections/{connection_id}DELETE /api/v1/forgejo/connections/{connection_id}
Acceptance Criteria
- Only organization admins can create/update/delete connections.
- Connection list/read responses never include the token.
- Updating token with an empty string leaves existing token unchanged or clears it only if the schema explicitly supports clearing.
- Read responses include only safe token metadata such as
has_tokenandtoken_last_eight. base_urlis normalized to a root Forgejo host URL, not a full API endpoint path.base_urlaccepts onlyhttporhttps.- Cross-organization access returns 404 or 403 consistently with existing Pipeline APIs.
- Tests cover create, list redaction, update, delete, and non-admin rejection.
Out Of Scope
- Repository CRUD.
- Calling Forgejo.
- Frontend UI.
Backend Issue 3: Add Admin Tracked Repository CRUD API
Labels: backend, api, forgejo, admin
Goal
Allow organization admins to register Forgejo repositories that Pipeline should track.
Scope
- Add repository schemas.
- Add admin-only list/create/read/update/delete endpoints for tracked repositories.
- Validate the selected connection belongs to the caller's organization.
- Do not sync issues in this issue.
Suggested Implementation References
- Gateway list/create patterns:
backend/app/api/gateways.py - Board list patterns:
backend/app/api/boards.py - Pagination helper:
backend/app/db/pagination.py
Suggested Endpoints
GET /api/v1/forgejo/repositoriesPOST /api/v1/forgejo/repositoriesGET /api/v1/forgejo/repositories/{repository_id}PATCH /api/v1/forgejo/repositories/{repository_id}DELETE /api/v1/forgejo/repositories/{repository_id}
Acceptance Criteria
- Admins can manage tracked repositories.
- Repository read includes connection id and safe connection display metadata.
- Duplicate active repository records for the same organization/connection/owner/repo are rejected.
- Repository
ownerandrepoare normalized by trimming whitespace. - Store raw display values and normalized lookup values if needed to enforce duplicate checks without losing original casing.
- Tests cover CRUD, duplicate rejection, and cross-organization connection rejection.
Out Of Scope
- Issue cache.
- Issue sync.
- Board links.
- Frontend UI.
Backend Issue 4: Add Forgejo API Client Service
Labels: backend, forgejo, api-client
Goal
Create a small internal service for Forgejo REST calls.
Scope
- Add a service wrapper around Forgejo issue APIs.
- Use
httpx.AsyncClient. - Support configured base URL and token auth.
- Normalize Forgejo API errors into Pipeline service exceptions.
- Support issue list and close issue operations.
Suggested Implementation References
- HTTP client style:
backend/app/services/souls_directory.py - Logging policy:
backend/app/core/logging.py - Backend dependencies:
backend/pyproject.toml
Suggested Service API
list_issues(owner, repo, state, page, limit)close_issue(owner, repo, issue_number)get_repository(owner, repo)
Acceptance Criteria
- Client sends
Authorization: token <token>. - Client sets a short connect/read timeout.
- Client sends a Pipeline-specific user agent.
- Client can list issues for
owner/repowith state, page, and limit. - Client excludes pull requests from issue sync when Forgejo returns issue and pull-request data together.
- Client can close one issue by owner, repo, and issue number using
PATCH /api/v1/repos/{owner}/{repo}/issues/{index}and{"state": "closed"}. - Client can fetch repository metadata to validate owner/repo and token access.
- Client handles non-2xx responses with clear error messages.
- Tests mock HTTP responses and do not require a real Forgejo server.
Out Of Scope
- Database models.
- API routes.
- Frontend UI.
Backend Issue 5: Add Backend Connection Validation API
Labels: backend, api, forgejo, validation
Goal
Let admins validate that a Forgejo connection and tracked repository are reachable before relying on sync.
Scope
- Add a lightweight validation endpoint for a connection.
- Add a lightweight validation endpoint for a tracked repository.
- Use the Forgejo API client from Backend Issue 4.
- Do not persist issues in this issue.
Suggested Implementation References
- Backend gateway admin patterns:
backend/app/api/gateways.py - Gateway runtime compatibility checks:
backend/app/services/openclaw/admin_service.py - Forgejo API client from Backend Issue 4.
Suggested Endpoints
POST /api/v1/forgejo/connections/{connection_id}/validatePOST /api/v1/forgejo/repositories/{repository_id}/validate
Acceptance Criteria
- Connection validation confirms the configured base URL and token can make an authenticated API request.
- Repository validation confirms owner/repo exists and token can read issue data.
- Errors are safe for display and never include token values.
- Tests cover success, bad token, missing repo, and remote timeout.
Out Of Scope
- Issue sync.
- Frontend UI.
Backend Issue 6: Add Cached Issue Database Model
Labels: backend, database, forgejo, issues
Goal
Add a local cache table for Forgejo issues.
Scope
- Add
ForgejoIssuemodel. - Add migration for cached issue fields.
- Add read schema for cached issue records.
- Do not add sync logic in this issue.
Suggested Implementation References
- Task model timestamp/status style:
backend/app/models/tasks.py - Activity event model simplicity:
backend/app/models/activity_events.py - Schema style:
backend/app/schemas/tasks.py
Suggested Model Shape
idorganization_idrepository_idforgejo_issue_numbertitlebody_previewstateis_pull_requestlabelsassigneesauthorhtml_urlforgejo_created_atforgejo_updated_atforgejo_closed_atlast_synced_atcreated_atupdated_at
Acceptance Criteria
- Migration creates
forgejo_issues. - Unique constraint or unique index prevents duplicate issue numbers per tracked repository.
- JSON fields use existing SQLModel JSON column patterns.
- Model can represent pull-request rows if they are accidentally received, but MVP sync should mark and ignore them in issue views.
- Read schema excludes secrets and includes enough display fields for frontend tables.
- Tests cover model construction and uniqueness behavior if practical.
Out Of Scope
- Forgejo HTTP calls.
- Sync endpoint.
- Frontend UI.
Backend Issue 7: Add Issue Sync Service And Manual Sync API
Labels: backend, forgejo, sync, issues
Goal
Fetch issues from Forgejo and upsert them into Pipeline's local issue cache.
Scope
- Add a sync service that uses the Forgejo API client.
- Add admin-only manual sync endpoint for one tracked repository.
- Upsert issues into
forgejo_issues. - Update repository sync metadata.
Suggested Implementation References
- Service tests with mocked calls:
backend/tests/test_board_webhooks_api.py - Activity recording:
backend/app/services/activity_log.py - CRUD helpers:
backend/app/db/crud.py
Suggested Endpoint
POST /api/v1/forgejo/repositories/{repository_id}/sync
Acceptance Criteria
- Sync paginates through Forgejo issues using
pageandlimit. - Sync stores open and closed issues.
- Sync excludes pull requests from MVP issue counts and issue views.
- Sync returns created, updated, open, closed, and total counts.
- Sync updates
last_sync_aton success. - Sync updates
last_sync_erroron failure without leaking token values. - Tests cover pagination, idempotent upsert, and Forgejo failure.
Out Of Scope
- Human issue list API.
- Agent issue API.
- Frontend UI.
Backend Issue 8: Add Human Issue List And Read APIs
Labels: backend, api, forgejo, issues
Goal
Allow authenticated Pipeline users to view cached Forgejo issues through Pipeline APIs.
Scope
- Add list/read endpoints for cached Forgejo issues.
- Enforce organization access.
- Support useful filters.
- Return paginated responses.
Suggested Implementation References
- User/org access dependencies:
backend/app/api/deps.py - Activity list filtering style:
backend/app/api/activity.py - Task list filtering style:
backend/app/api/tasks.py - Pagination response:
backend/app/schemas/pagination.py
Suggested Endpoints
GET /api/v1/forgejo/issuesGET /api/v1/forgejo/issues/{issue_id}
Acceptance Criteria
- Users can list issues by repository id, state, label text, assignee text, and search text.
- Users can read one cached issue by id.
- Users cannot read issues from another organization.
- Pull requests are excluded from issue list responses in MVP.
- Responses never include connection tokens.
- Tests cover allowed access, forbidden cross-org access, filters, and pagination.
Out Of Scope
- Board-scoped repository links.
- Issue closing.
- Agent routes.
- Frontend UI.
Backend Issue 9: Add Board-To-Repository Link Database Model
Labels: backend, database, forgejo, boards
Goal
Add the data model for linking tracked Forgejo repositories to Pipeline boards.
Scope
- Add mapping model between boards and tracked repositories.
- Add migration.
- Add basic schema if needed.
- Do not add API routes in this issue.
Suggested Implementation References
- Task dependency model:
backend/app/models/task_dependencies.py - Organization board access model:
backend/app/models/organization_board_access.py - Migration examples:
backend/migrations/versions/*
Suggested Model Shape
idboard_idrepository_idorganization_idcreated_at
Acceptance Criteria
- Migration creates board/repository link table.
- Unique constraint prevents duplicate board/repository links.
- Foreign keys reference boards and Forgejo repositories.
- Indexes support lookup by board and repository.
Out Of Scope
- Board link API.
- Frontend UI.
Backend Issue 10: Add Board Repository Linking APIs
Labels: backend, api, forgejo, boards
Goal
Let Pipeline boards declare which tracked Forgejo repositories belong to that board.
Scope
- Add board-scoped endpoints to attach, detach, and list linked repositories.
- Enforce board write access for attach/detach.
- Enforce board read access for list.
- Ensure repository belongs to same organization as board.
Suggested Implementation References
- Board access dependencies:
backend/app/api/deps.py - Board webhooks nested route style:
backend/app/api/board_webhooks.py - Board memory nested route style:
backend/app/api/board_memory.py
Suggested Endpoints
GET /api/v1/boards/{board_id}/forgejo/repositoriesPOST /api/v1/boards/{board_id}/forgejo/repositoriesDELETE /api/v1/boards/{board_id}/forgejo/repositories/{repository_id}
Acceptance Criteria
- Board writers can attach a tracked repository to a board.
- Board writers can detach a tracked repository from a board.
- Board readers can list linked repositories.
- Duplicate links are rejected or treated idempotently.
- Tests cover access checks, duplicate behavior, and cross-organization rejection.
Out Of Scope
- Agent issue routes.
- Issue closing.
- Frontend UI.
Backend Issue 11: Add Agent Issue Read APIs
Labels: backend, agent-api, forgejo, issues
Goal
Allow agents to discover and inspect Forgejo issues for their accessible boards.
Scope
- Add agent-scoped issue list/read routes.
- Restrict results to repositories linked to the target board.
- Add OpenAPI LLM routing hints consistent with existing agent routes.
Suggested Implementation References
- Existing agent route hints:
backend/app/api/agent.py_agent_board_openapi_hints - Agent board access guard:
backend/app/api/agent.py_guard_board_access - Agent task list route:
backend/app/api/agent.pylist_tasks
Suggested Endpoints
GET /api/v1/agent/boards/{board_id}/git/issuesGET /api/v1/agent/boards/{board_id}/git/issues/{issue_id}
Acceptance Criteria
- Board-scoped agents only see issues for their assigned board.
- Main agents are constrained by organization/gateway scope.
- Agents only see issues for repositories linked to the board.
- Pull requests are excluded from agent issue responses in MVP.
- Routes include LLM guidance metadata.
- Tests cover board-scoped access and forbidden cross-board access.
Out Of Scope
- Closing issues.
- Frontend UI.
Backend Issue 12: Add Close Issue Service
Labels: backend, forgejo, service, issues
Goal
Create reusable backend service logic for closing a Forgejo issue and updating local cache.
Scope
- Add service function that closes the remote Forgejo issue.
- Update cached issue only after Forgejo succeeds.
- Return normalized result payload or model.
- Record no HTTP routes in this issue.
Suggested Implementation References
- Forgejo client service from Backend Issue 4.
- Sync upsert helpers from Backend Issue 7.
- Activity logging style:
backend/app/services/activity_log.py
Suggested Service API
close_cached_issue(session, issue, actor_agent_id=None, actor_user_id=None)
Acceptance Criteria
- Service does not close local cache if Forgejo call fails.
- Service uses Forgejo's issue edit endpoint:
PATCH /api/v1/repos/{owner}/{repo}/issues/{index}withstate: "closed". - Service treats already closed local issues consistently.
- Service updates state, closed timestamp, and last synced timestamp.
- Unit tests cover success, remote failure, and already-closed behavior.
Out Of Scope
- Human API route.
- Agent API route.
- Frontend UI.
Backend Issue 13: Add Human And Agent Close Issue APIs
Labels: backend, api, agent-api, forgejo, audit
Goal
Expose issue close mutations to authorized humans and board lead agents.
Scope
- Add human close endpoint.
- Add agent close endpoint.
- Use the close issue service from Backend Issue 12.
- Record activity events.
- Enforce authorization.
Suggested Implementation References
- User board write dependency:
backend/app/api/deps.pyget_board_for_user_write - Agent lead check:
backend/app/api/agent.py_require_board_lead - Activity events:
backend/app/services/activity_log.py - Task delete lead-only route:
backend/app/api/agent.py
Suggested Endpoints
POST /api/v1/forgejo/issues/{issue_id}/closePOST /api/v1/agent/boards/{board_id}/git/issues/{issue_id}/close
Acceptance Criteria
- Human board writers/admins can close linked issues.
- Board lead agents can close linked issues.
- Non-lead worker agents cannot close issues.
- Issue must be linked to the target board before a board-scoped human or agent can close it.
- Forgejo failure does not mark the local issue closed.
- Successful close records an activity event with board id, actor, repository, and issue number.
- Tests cover success, forbidden worker agent, Forgejo failure, and cache update.
Out Of Scope
- Reopening issues.
- Creating issues.
- Frontend UI.
Backend Issue 14: Add Issue Tracking Metrics
Labels: backend, metrics, forgejo
Goal
Expose aggregate tracking data for Forgejo issues in Pipeline metrics.
Scope
- Add issue counters to metrics service or add a focused issue metrics endpoint.
- Support organization, board, and repository scopes.
- Include last sync health.
Suggested Implementation References
- Existing metrics endpoint:
backend/app/api/metrics.py - Existing metrics schemas:
backend/app/schemas/metrics.py - Existing metrics tests:
backend/tests/test_metrics_kpis.py
Suggested Metrics
- Open issues.
- Closed issues.
- Issues closed in selected range.
- Stale open issues.
- Last successful sync timestamp.
- Repository sync error count.
Acceptance Criteria
- Metrics can be filtered by board and repository where applicable.
- Empty scope returns zeroes.
- Pull requests are excluded from issue metrics in MVP.
- Tests cover mixed open/closed data and stale issue calculation.
- Existing dashboard metrics tests continue to pass.
Out Of Scope
- Frontend dashboard widgets.
- Webhook ingest.
Backend Issue 15: Optional Forgejo Webhook Ingest For Issue Updates
Labels: backend, forgejo, webhooks, optional
Goal
Allow Forgejo webhooks to update cached issues without waiting for manual sync.
Scope
- Add webhook receiver for issue opened, edited, closed, and reopened events.
- Validate a shared secret.
- Update cached issue records.
- Record activity events.
Suggested Implementation References
- Existing board webhook security patterns:
backend/app/api/board_webhooks.py - Webhook tests:
backend/tests/test_security_fixes.py,backend/tests/test_board_webhooks_api.py
Suggested Endpoint
POST /api/v1/forgejo/webhooks/{repository_id}
Acceptance Criteria
- Webhook rejects invalid signatures.
- Webhook updates cached issue state and metadata.
- Webhook ignores pull-request events in MVP unless a later issue explicitly adds PR tracking.
- Webhook records activity for close/reopen events.
- Manual sync still works and remains the repair path.
Out Of Scope
- First-pass MVP.
- Frontend UI.
Frontend Issue 1: Regenerate API Client After Forgejo Backend Routes
Labels: frontend, api-client, forgejo
Goal
Regenerate Orval clients after backend Forgejo routes are available.
Scope
- Run Orval against the backend OpenAPI schema.
- Commit generated model and hook files.
- Ensure TypeScript still passes.
Suggested Implementation References
- Orval config:
frontend/orval.config.ts - Existing generated APIs:
frontend/src/api/generated/** - API mutator:
frontend/src/api/mutator.ts
Acceptance Criteria
- Generated client includes Forgejo connection, repository, issue, sync, metrics, and close endpoints available at that point.
npm run lintpasses.npx tsc --noEmitpasses.
Out Of Scope
- Handwritten UI.
- Backend changes.
Frontend Issue 2: Add Git Projects Navigation And Shell Page
Labels: frontend, navigation, forgejo
Goal
Add a landing page for Git Projects inside Pipeline.
Scope
- Add sidebar navigation item.
- Add route for Git Projects.
- Use
DashboardPageLayout. - Show loading, empty, and error states.
Suggested Implementation References
- Sidebar:
frontend/src/components/organisms/DashboardSidebar.tsx - Page layout:
frontend/src/components/templates/DashboardPageLayout.tsx - Boards page pattern:
frontend/src/app/boards/page.tsx
Suggested Files
frontend/src/app/git-projects/page.tsx
Acceptance Criteria
- Signed-in users can navigate to Git Projects.
- Page lists tracked repositories or shows an empty state.
- Uses generated API hooks.
- No mutations in this batch.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Connection forms.
- Issue list table.
- Close action.
Frontend Issue 3: Add Admin Forgejo Connection UI
Labels: frontend, admin, forgejo
Goal
Let admins configure Forgejo connections.
Scope
- Add connection list table.
- Add connection create/edit form.
- Add delete confirmation.
- Keep repository management out of this issue.
Suggested Implementation References
- Gateway admin page:
frontend/src/app/gateways/page.tsx - Gateway form pattern:
frontend/src/components/gateways/GatewayForm.tsx - Confirm dialog:
frontend/src/components/ui/confirm-action-dialog.tsx
Suggested Files
frontend/src/app/git-projects/connections/page.tsxfrontend/src/app/git-projects/connections/new/page.tsxfrontend/src/app/git-projects/connections/[connectionId]/edit/page.tsxfrontend/src/components/git/ForgejoConnectionsTable.tsxfrontend/src/components/git/ForgejoConnectionForm.tsx
Acceptance Criteria
- Admins can add and edit Forgejo base URL and token.
- Token is write-only and never displayed after save.
- Safe token metadata such as
token_last_eightmay be shown if returned by the API. - Non-admin users do not see admin actions.
- Empty/loading/error states are present.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Repository management.
- Issue list.
- Close issue action.
Frontend Issue 4: Add Admin Tracked Repository UI
Labels: frontend, admin, forgejo, repositories
Goal
Let admins register Forgejo repositories for Pipeline tracking.
Scope
- Add tracked repository table.
- Add create/edit form.
- Select connection from existing Forgejo connections.
- Add delete confirmation.
Suggested Implementation References
- Tables:
frontend/src/components/tables/DataTable.tsx - Boards table pattern:
frontend/src/components/boards/BoardsTable.tsx - Searchable select:
frontend/src/components/ui/searchable-select.tsx
Suggested Files
frontend/src/app/git-projects/repositories/page.tsxfrontend/src/app/git-projects/repositories/new/page.tsxfrontend/src/app/git-projects/repositories/[repositoryId]/edit/page.tsxfrontend/src/components/git/ForgejoRepositoriesTable.tsxfrontend/src/components/git/ForgejoRepositoryForm.tsx
Acceptance Criteria
- Admins can add tracked repositories by connection, owner, and repo.
- Admins can edit display fields and active state.
- Repository table shows last sync status if available.
- Non-admin users do not see admin actions.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Manual sync button.
- Issue list.
- Board linking UI.
Frontend Issue 5: Add Manual Repository Sync UI
Labels: frontend, admin, forgejo, sync
Goal
Let admins trigger manual issue sync for tracked repositories.
Scope
- Add sync action to repository table or repository detail.
- Show sync in-progress, success, and error states.
- Refetch repository and issue data after sync.
Suggested Implementation References
- Optimistic/invalidation helper:
frontend/src/lib/list-delete.ts - Existing mutation patterns:
frontend/src/app/gateways/page.tsx - Button component:
frontend/src/components/ui/button.tsx
Suggested Files
frontend/src/components/git/ForgejoRepositoriesTable.tsxfrontend/src/app/git-projects/repositories/page.tsx
Acceptance Criteria
- Admin can trigger sync from repository row.
- UI prevents duplicate clicks while sync is pending.
- Success shows created/updated/open/closed counts.
- Failure shows backend error message.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Backend sync implementation.
- Issue list table.
Frontend Issue 6: Add Connection Validation UI
Labels: frontend, admin, forgejo, validation
Goal
Let admins validate Forgejo connections and tracked repositories from the UI.
Scope
- Add "Validate" actions for connections and repositories.
- Show success/failure status inline.
- Keep validation separate from manual sync.
Suggested Implementation References
- Gateway connection check UX:
frontend/src/components/gateways/GatewayForm.tsx - Mutation/error patterns:
frontend/src/app/gateways/page.tsx - Badge component:
frontend/src/components/ui/badge.tsx
Suggested Files
frontend/src/components/git/ForgejoConnectionsTable.tsxfrontend/src/components/git/ForgejoRepositoriesTable.tsx
Acceptance Criteria
- Admin can validate a connection.
- Admin can validate a repository.
- Validation errors show safe backend messages.
- Pending state prevents duplicate validation clicks.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Manual sync.
- Backend validation implementation.
Frontend Issue 7: Add Issue List View
Labels: frontend, issues, forgejo
Goal
Show cached Forgejo issues across tracked repositories.
Scope
- Add issue list table.
- Add filters for repository, state, and search text.
- Link each issue to its Forgejo URL.
Suggested Implementation References
- Activity page filtering/list pattern:
frontend/src/app/activity/page.tsx - Data table:
frontend/src/components/tables/DataTable.tsx - Cell formatters:
frontend/src/components/tables/cell-formatters.tsx
Suggested Files
frontend/src/app/git-projects/issues/page.tsxfrontend/src/components/git/ForgejoIssuesTable.tsxfrontend/src/components/git/ForgejoIssueFilters.tsx
Acceptance Criteria
- Table columns include repository, number, title, state, labels, assignee, and updated time.
- Users can filter by repo and state.
- Users can search by title/body text when backend supports it.
- Forgejo issue links open in a new tab.
- Pull requests are not shown in MVP issue lists.
- Empty/loading/error states are present.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Close action.
- Board detail integration.
Frontend Issue 8: Add Board Repository Linking UI
Labels: frontend, boards, forgejo, admin
Goal
Let authorized users link tracked Forgejo repositories to a Pipeline board.
Scope
- Add board repository link management UI.
- Allow attach/detach using backend board repository link APIs.
- Keep issue rendering out of this issue.
Suggested Implementation References
- Board edit/detail page:
frontend/src/app/boards/[boardId]/page.tsx - Searchable select:
frontend/src/components/ui/searchable-select.tsx - Confirm dialog:
frontend/src/components/ui/confirm-action-dialog.tsx
Suggested Files
frontend/src/components/git/BoardForgejoRepositoryLinks.tsxfrontend/src/app/boards/[boardId]/page.tsx
Acceptance Criteria
- Board users with write access can attach repositories.
- Board users with write access can detach repositories.
- Board readers can see linked repositories without edit actions.
- Empty/loading/error states are present.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Issue panel.
- Close issue action.
Frontend Issue 9: Add Board-Level Linked Issues Panel
Labels: frontend, boards, forgejo, issues
Goal
Show Forgejo issues that belong to repositories linked to a board.
Scope
- Add a panel or tab on board detail.
- Show linked repository issues.
- Include state filter.
Suggested Implementation References
- Board page:
frontend/src/app/boards/[boardId]/page.tsx - Existing board panels/components in
frontend/src/components - Table empty state:
frontend/src/components/ui/table-state.tsx
Suggested Files
frontend/src/components/git/BoardForgejoIssuesPanel.tsxfrontend/src/components/git/ForgejoIssuesTable.tsx
Acceptance Criteria
- Board page shows linked repository issues.
- Empty state explains that no repositories are linked.
- Panel refetches on normal board refresh cadence.
- No close action in this batch.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Repository linking management.
- Close action.
Frontend Issue 10: Add Close Issue Action
Labels: frontend, issues, forgejo, mutation
Goal
Allow authorized users to close Forgejo issues from Pipeline.
Scope
- Add close button/action where issue rows are shown.
- Add confirmation dialog.
- Invalidate/refetch issue queries after success.
- Show API errors clearly.
Suggested Implementation References
- Confirm dialog:
frontend/src/components/ui/confirm-action-dialog.tsx - Existing delete mutation pattern:
frontend/src/app/boards/page.tsx - Generated mutation hooks from Frontend Issue 1.
Suggested Files
frontend/src/components/git/ForgejoIssuesTable.tsxfrontend/src/components/git/CloseForgejoIssueDialog.tsxfrontend/src/app/git-projects/issues/page.tsxfrontend/src/components/git/BoardForgejoIssuesPanel.tsx
Acceptance Criteria
- Open issues show a close action when the API/user role allows it.
- Pull requests do not show a close action in MVP issue surfaces.
- Confirmation dialog names repository and issue number.
- Successful close updates UI state.
- Failed close shows the backend error.
- Closed issues do not show an active close action.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Agent UI.
- Reopen action.
Frontend Issue 11: Add Dashboard Issue Tracking Widgets
Labels: frontend, dashboard, metrics, forgejo
Goal
Add high-level Forgejo issue tracking to Pipeline dashboard.
Scope
- Display issue metrics from backend.
- Link widgets to Git Projects issue list.
- Keep dashboard layout consistent with existing cards.
Suggested Implementation References
- Dashboard page:
frontend/src/app/dashboard/page.tsx - Existing generated metrics hook:
frontend/src/api/generated/metrics/metrics.ts - Number/date formatting:
frontend/src/lib/formatters.ts
Suggested Files
frontend/src/components/git/ForgejoIssueMetricCards.tsxfrontend/src/app/dashboard/page.tsx
Acceptance Criteria
- Dashboard shows open issues, recently closed issues, stale open issues, and last sync health.
- Widgets link to relevant filtered issue list views.
- Empty metrics render cleanly.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- Backend metrics changes.
- Connection management UI.
Frontend Issue 12: Final UI Polish And Theme Review
Labels: frontend, design, polish, forgejo
Goal
Review the completed Forgejo/Git Projects UI end-to-end and make it fit Pipeline's modern dark-default theme.
Scope
- Review Git Projects pages, repository admin pages, issue lists, board panels, close dialogs, and dashboard widgets.
- Align spacing, colors, empty states, loading states, table density, focus states, and responsive behavior.
- Ensure dark mode is the default and light mode remains readable.
- Ensure UI copy says
PipelineandGit Projectsconsistently.
Suggested Implementation References
- Global theme tokens:
frontend/src/app/globals.css - Theme provider/toggle:
frontend/src/components/providers/ThemeProvider.tsx,frontend/src/components/organisms/ThemeToggle.tsx - Dashboard shell:
frontend/src/components/templates/DashboardShell.tsx - Design style guidance in repo docs:
docs/style-guide.md
Acceptance Criteria
- Git Projects UI feels consistent with Pipeline's dashboard and admin surfaces.
- No hard-coded light-only table surfaces remain in new Git Projects UI.
- Text does not overflow on mobile or narrow desktop widths.
- Empty, loading, error, success, and destructive states are visually polished.
- Close issue dialog is clear and not alarming beyond the action's real risk.
- Verified in both dark and light modes.
npm run lintandnpx tsc --noEmitpass.
Out Of Scope
- New backend behavior.
- New product features.
- Broad redesign outside Git Projects and touched dashboard widgets.