1283 lines
38 KiB
Markdown
1283 lines
38 KiB
Markdown
|
|
# 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:issue` can 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`
|
||
|
|
- 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:issue` for read-only issue access and `write:issue` for issue closing or mutation.
|
||
|
|
- Forgejo exposes an OpenAPI document at `/swagger.v1.json` on a Forgejo host.
|
||
|
|
- Forgejo's issue edit operation is `PATCH /api/v1/repos/{owner}/{repo}/issues/{index}`. Closing an issue should send a body with `state: "closed"`.
|
||
|
|
- Forgejo issue list endpoints are paginated with `page` and `limit`; 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/v1` in `backend/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.py` and `backend/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
|
||
|
|
|
||
|
|
1. Add Forgejo database models.
|
||
|
|
2. Add admin connection CRUD API.
|
||
|
|
3. Add admin tracked repository CRUD API.
|
||
|
|
4. Add Forgejo API client service.
|
||
|
|
5. Add backend connection validation API.
|
||
|
|
6. Add cached issue database model.
|
||
|
|
7. Add issue sync service and manual sync API.
|
||
|
|
8. Add human issue list/read APIs.
|
||
|
|
9. Add board-to-repository link database model.
|
||
|
|
10. Add board repository linking APIs.
|
||
|
|
11. Add agent issue read APIs.
|
||
|
|
12. Add close issue service.
|
||
|
|
13. Add human and agent close issue APIs.
|
||
|
|
14. Add issue tracking metrics.
|
||
|
|
15. Optional: add Forgejo webhook ingest.
|
||
|
|
|
||
|
|
## Recommended Frontend Order
|
||
|
|
|
||
|
|
1. Regenerate API client after backend routes are merged.
|
||
|
|
2. Add Git Projects navigation and shell page.
|
||
|
|
3. Add admin Forgejo connection UI.
|
||
|
|
4. Add admin tracked repository UI.
|
||
|
|
5. Add manual repository sync UI.
|
||
|
|
6. Add connection validation UI.
|
||
|
|
7. Add issue list view.
|
||
|
|
8. Add board repository linking UI.
|
||
|
|
9. Add board-level linked issues panel.
|
||
|
|
10. Add close issue action.
|
||
|
|
11. Add dashboard issue tracking widgets.
|
||
|
|
12. 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
|
||
|
|
|
||
|
|
- `ForgejoConnection`
|
||
|
|
- `id`
|
||
|
|
- `organization_id`
|
||
|
|
- `name`
|
||
|
|
- `base_url`
|
||
|
|
- `token`
|
||
|
|
- `token_last_eight`
|
||
|
|
- `active`
|
||
|
|
- `created_at`
|
||
|
|
- `updated_at`
|
||
|
|
- `ForgejoRepository`
|
||
|
|
- `id`
|
||
|
|
- `organization_id`
|
||
|
|
- `connection_id`
|
||
|
|
- `owner`
|
||
|
|
- `repo`
|
||
|
|
- `display_name`
|
||
|
|
- `default_branch`
|
||
|
|
- `active`
|
||
|
|
- `last_sync_at`
|
||
|
|
- `last_sync_error`
|
||
|
|
- `created_at`
|
||
|
|
- `updated_at`
|
||
|
|
|
||
|
|
### Acceptance Criteria
|
||
|
|
|
||
|
|
- Migration creates `forgejo_connections` and `forgejo_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.py` `require_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.py` `OkResponse`
|
||
|
|
|
||
|
|
### Suggested Endpoints
|
||
|
|
|
||
|
|
- `GET /api/v1/forgejo/connections`
|
||
|
|
- `POST /api/v1/forgejo/connections`
|
||
|
|
- `GET /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_token` and `token_last_eight`.
|
||
|
|
- `base_url` is normalized to a root Forgejo host URL, not a full API endpoint path.
|
||
|
|
- `base_url` accepts only `http` or `https`.
|
||
|
|
- 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/repositories`
|
||
|
|
- `POST /api/v1/forgejo/repositories`
|
||
|
|
- `GET /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 `owner` and `repo` are 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/repo` with 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}/validate`
|
||
|
|
- `POST /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 `ForgejoIssue` model.
|
||
|
|
- 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
|
||
|
|
|
||
|
|
- `id`
|
||
|
|
- `organization_id`
|
||
|
|
- `repository_id`
|
||
|
|
- `forgejo_issue_number`
|
||
|
|
- `title`
|
||
|
|
- `body_preview`
|
||
|
|
- `state`
|
||
|
|
- `is_pull_request`
|
||
|
|
- `labels`
|
||
|
|
- `assignees`
|
||
|
|
- `author`
|
||
|
|
- `html_url`
|
||
|
|
- `forgejo_created_at`
|
||
|
|
- `forgejo_updated_at`
|
||
|
|
- `forgejo_closed_at`
|
||
|
|
- `last_synced_at`
|
||
|
|
- `created_at`
|
||
|
|
- `updated_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 `page` and `limit`.
|
||
|
|
- 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_at` on success.
|
||
|
|
- Sync updates `last_sync_error` on 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/issues`
|
||
|
|
- `GET /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
|
||
|
|
|
||
|
|
- `id`
|
||
|
|
- `board_id`
|
||
|
|
- `repository_id`
|
||
|
|
- `organization_id`
|
||
|
|
- `created_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/repositories`
|
||
|
|
- `POST /api/v1/boards/{board_id}/forgejo/repositories`
|
||
|
|
- `DELETE /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.py` `list_tasks`
|
||
|
|
|
||
|
|
### Suggested Endpoints
|
||
|
|
|
||
|
|
- `GET /api/v1/agent/boards/{board_id}/git/issues`
|
||
|
|
- `GET /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}` with `state: "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.py` `get_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}/close`
|
||
|
|
- `POST /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 lint` passes.
|
||
|
|
- `npx tsc --noEmit` passes.
|
||
|
|
|
||
|
|
### 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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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.tsx`
|
||
|
|
- `frontend/src/app/git-projects/connections/new/page.tsx`
|
||
|
|
- `frontend/src/app/git-projects/connections/[connectionId]/edit/page.tsx`
|
||
|
|
- `frontend/src/components/git/ForgejoConnectionsTable.tsx`
|
||
|
|
- `frontend/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_eight` may be shown if returned by the API.
|
||
|
|
- Non-admin users do not see admin actions.
|
||
|
|
- Empty/loading/error states are present.
|
||
|
|
- `npm run lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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.tsx`
|
||
|
|
- `frontend/src/app/git-projects/repositories/new/page.tsx`
|
||
|
|
- `frontend/src/app/git-projects/repositories/[repositoryId]/edit/page.tsx`
|
||
|
|
- `frontend/src/components/git/ForgejoRepositoriesTable.tsx`
|
||
|
|
- `frontend/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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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.tsx`
|
||
|
|
- `frontend/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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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.tsx`
|
||
|
|
- `frontend/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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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.tsx`
|
||
|
|
- `frontend/src/components/git/ForgejoIssuesTable.tsx`
|
||
|
|
- `frontend/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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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.tsx`
|
||
|
|
- `frontend/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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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.tsx`
|
||
|
|
- `frontend/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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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.tsx`
|
||
|
|
- `frontend/src/components/git/CloseForgejoIssueDialog.tsx`
|
||
|
|
- `frontend/src/app/git-projects/issues/page.tsx`
|
||
|
|
- `frontend/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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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.tsx`
|
||
|
|
- `frontend/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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### 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 `Pipeline` and `Git Projects` consistently.
|
||
|
|
|
||
|
|
### 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 lint` and `npx tsc --noEmit` pass.
|
||
|
|
|
||
|
|
### Out Of Scope
|
||
|
|
|
||
|
|
- New backend behavior.
|
||
|
|
- New product features.
|
||
|
|
- Broad redesign outside Git Projects and touched dashboard widgets.
|