Add GitHub comments to WYSIWYG (vibe-kanban) (#1449)
* The implementation is complete. Here's a summary of what was added:
## Summary
I've implemented the endpoint to fetch all GitHub PR comments for a task attempt. The new endpoint is:
**`GET /api/task-attempts/{id}/pr/comments`**
### Files Modified
1. **`crates/services/src/services/github/cli.rs`**
- Added `PrCommentAuthor` and `PrComment` types
- Added `get_pr_comments()` method to `GhCli` that runs `gh pr view N --repo owner/repo --json comments`
- Added `parse_pr_comments()` helper to parse the JSON response
2. **`crates/services/src/services/github.rs`**
- Exported `PrComment` and `PrCommentAuthor` types
- Added async `get_pr_comments()` method with retry logic (exponential backoff)
3. **`crates/server/src/routes/task_attempts.rs`**
- Added `PrCommentsResponse` struct
- Added `GetPrCommentsError` enum with variants: `NoPrAttached`, `GithubCliNotInstalled`, `GithubCliNotLoggedIn`
- Added `get_pr_comments()` handler function
- Registered the route at `/pr/comments`
4. **`crates/server/src/bin/generate_types.rs`**
- Registered all new types for TypeScript generation
### Generated TypeScript Types
```typescript
type PrCommentsResponse = { comments: Array<PrComment> };
type GetPrCommentsError =
| { "type": "no_pr_attached" }
| { "type": "github_cli_not_installed" }
| { "type": "github_cli_not_logged_in" };
type PrComment = {
id: string,
author: PrCommentAuthor,
authorAssociation: string,
body: string,
createdAt: string,
url: string
};
type PrCommentAuthor = { login: string };
```
* The enhancement is complete. Here's a summary of the changes:
## Summary
Enhanced the `GET /api/task-attempts/{id}/pr/comments` endpoint to fetch **both** general PR comments AND inline review comments, merged into a unified timeline.
### Response Format
```json
{
"success": true,
"data": {
"comments": [
{
"comment_type": "general",
"id": "IC_kwDOO7s21M7XzqRP",
"author": "stunningpixels",
"author_association": "MEMBER",
"body": "Testing comments",
"created_at": "2025-12-06T16:15:10Z",
"url": "https://github.com/BloopAI/vibe-kanban/pull/1447#issuecomment-..."
},
{
"comment_type": "review",
"id": 2595085092,
"author": "stunningpixels",
"author_association": "MEMBER",
"body": "undo this",
"created_at": "2025-12-06T16:15:18Z",
"url": "https://github.com/BloopAI/vibe-kanban/pull/1447#discussion_r...",
"path": "frontend/src/components/layout/Navbar.tsx",
"line": 23,
"diff_hunk": "@@ -20,7 +20,6 @@ import {...}"
}
]
}
}
```
### TypeScript Types
```typescript
type UnifiedPrComment =
| { comment_type: "general"; id: string; author: string; author_association: string; body: string; created_at: string; url: string; }
| { comment_type: "review"; id: bigint; author: string; author_association: string; body: string; created_at: string; url: string; path: string; line: bigint | null; diff_hunk: string; };
```
* Add GitHub review comments (vibe-kanban b9ab9ab2)
frontend/src/components/tasks/TaskFollowUpSection.tsx
- New button to the right of attachment with github comment icon
- If user clicks, opens dialog
- Dialog will display list of comments, format like this:
```javascript
{
"comments": [
{
"id": "IC_kwDOO7s21M7XAc3c",
"author": {
"login": "LSRCT"
},
"authorAssociation": "MEMBER",
"body": "Hi! I tried to get claude to use the `AskUserQuestion` tool in vibe kanban but did not manage, it does not seem to have access to the tool at all. Could you give me a hint on how to best test this PR?",
"createdAt": "2025-12-03T14:46:49Z",
"includesCreatedEdit": false,
"isMinimized": false,
"minimizedReason": "",
"reactionGroups": [],
"url": "https://github.com/BloopAI/vibe-kanban/pull/1395#issuecomment-3607219676",
"viewerDidAuthor": false
},
{
"id": "IC_kwDOO7s21M7Xc1Pi",
"author": {
"login": "davidrudduck"
},
"authorAssociation": "NONE",
"body": "> Hi! I tried to get claude to use the `AskUserQuestion` tool in vibe kanban but did not manage, it does not seem to have access to the tool at all. Could you give me a hint on how to best test this PR?\r\n\r\nI must have been having a daft night when I submitted this - am fixing this at the moment.",
"createdAt": "2025-12-04T22:57:18Z",
"includesCreatedEdit": false,
"isMinimized": false,
"minimizedReason": "",
"reactionGroups": [],
"url": "https://github.com/BloopAI/vibe-kanban/pull/1395#issuecomment-3614659554",
"viewerDidAuthor": false
}
]
}
```
The user will select a comment, this will then be added as a component to the chat.
The component should be fully serializable/deserializable as markdown <> WYSIWYG, just like we do for images atm.
The backend will be implemented separately so just hardcode a mock response in the frontend for now.
* PR 1449 failed because of i18n regressions (vibe-kanban 723e309c)
Please resolve the 7 hardcoded strings this PR introduces https://github.com/BloopAI/vibe-kanban/pull/1449
* PR 1449 failed because of i18n regressions (vibe-kanban 723e309c)
Please resolve the 7 hardcoded strings this PR introduces https://github.com/BloopAI/vibe-kanban/pull/1449
This commit is contained in:
committed by
GitHub
parent
86705f9c8e
commit
9107b4b384
@@ -258,6 +258,14 @@ conflicted_files: Array<string>, };
|
||||
|
||||
export type RunScriptError = { "type": "no_script_configured" } | { "type": "process_already_running" };
|
||||
|
||||
export type AttachPrResponse = { pr_attached: boolean, pr_url: string | null, pr_number: bigint | null, pr_status: MergeStatus | null, };
|
||||
|
||||
export type PrCommentsResponse = { comments: Array<UnifiedPrComment>, };
|
||||
|
||||
export type GetPrCommentsError = { "type": "no_pr_attached" } | { "type": "github_cli_not_installed" } | { "type": "github_cli_not_logged_in" };
|
||||
|
||||
export type UnifiedPrComment = { "comment_type": "general", id: string, author: string, author_association: string, body: string, created_at: string, url: string, } | { "comment_type": "review", id: bigint, author: string, author_association: string, body: string, created_at: string, url: string, path: string, line: bigint | null, diff_hunk: string, };
|
||||
|
||||
export type DirectoryEntry = { name: string, path: string, is_directory: boolean, is_git_repo: boolean, last_modified: bigint | null, };
|
||||
|
||||
export type DirectoryListResponse = { entries: Array<DirectoryEntry>, current_path: string, };
|
||||
|
||||
Reference in New Issue
Block a user