一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
445 行
40 KiB
JSON
445 行
40 KiB
JSON
{
|
||
"issue": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/14933",
|
||
"repository_url": "https://api.github.com/repos/laurent22/joplin",
|
||
"labels_url": "https://api.github.com/repos/laurent22/joplin/issues/14933/labels{/name}",
|
||
"comments_url": "https://api.github.com/repos/laurent22/joplin/issues/14933/comments",
|
||
"events_url": "https://api.github.com/repos/laurent22/joplin/issues/14933/events",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14933",
|
||
"id": 4160206187,
|
||
"node_id": "PR_kwDOBLftOs7OR0m8",
|
||
"number": 14933,
|
||
"title": "All: Fixed potential TypeError in syncedCount, deletedItemCount, and itemType when no rows are found",
|
||
"user": {
|
||
"login": "rattnak",
|
||
"id": 82812258,
|
||
"node_id": "MDQ6VXNlcjgyODEyMjU4",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/82812258?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/rattnak",
|
||
"html_url": "https://github.com/rattnak",
|
||
"followers_url": "https://api.github.com/users/rattnak/followers",
|
||
"following_url": "https://api.github.com/users/rattnak/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/rattnak/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/rattnak/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/rattnak/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/rattnak/orgs",
|
||
"repos_url": "https://api.github.com/users/rattnak/repos",
|
||
"events_url": "https://api.github.com/users/rattnak/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/rattnak/received_events",
|
||
"type": "User",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"labels": [
|
||
{
|
||
"id": 519700741,
|
||
"node_id": "MDU6TGFiZWw1MTk3MDA3NDE=",
|
||
"url": "https://api.github.com/repos/laurent22/joplin/labels/bug",
|
||
"name": "bug",
|
||
"color": "cf353b",
|
||
"default": true,
|
||
"description": "It's a bug"
|
||
},
|
||
{
|
||
"id": 1366675015,
|
||
"node_id": "MDU6TGFiZWwxMzY2Njc1MDE1",
|
||
"url": "https://api.github.com/repos/laurent22/joplin/labels/sync",
|
||
"name": "sync",
|
||
"color": "91ca55",
|
||
"default": false,
|
||
"description": "sync related issue"
|
||
},
|
||
{
|
||
"id": 2431153506,
|
||
"node_id": "MDU6TGFiZWwyNDMxMTUzNTA2",
|
||
"url": "https://api.github.com/repos/laurent22/joplin/labels/plugins",
|
||
"name": "plugins",
|
||
"color": "91ca55",
|
||
"default": false,
|
||
"description": "Anything related to Joplin's plugin system"
|
||
}
|
||
],
|
||
"state": "closed",
|
||
"locked": false,
|
||
"assignees": [],
|
||
"milestone": null,
|
||
"comments": 4,
|
||
"created_at": "2026-03-28T14:35:24Z",
|
||
"updated_at": "2026-03-29T14:41:20Z",
|
||
"closed_at": "2026-03-29T10:37:10Z",
|
||
"assignee": null,
|
||
"author_association": "NONE",
|
||
"active_lock_reason": null,
|
||
"draft": false,
|
||
"pull_request": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/pulls/14933",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14933",
|
||
"diff_url": "https://github.com/laurent22/joplin/pull/14933.diff",
|
||
"patch_url": "https://github.com/laurent22/joplin/pull/14933.patch",
|
||
"merged_at": null
|
||
},
|
||
"body": "## Problem\r\n\r\nThree methods access the result of `selectOne()` without checking for null first. `selectOne()` returns `null` when no rows match the query, which causes a `TypeError` at runtime:\r\n\r\n- `BaseItem.syncedCount()` — accesses `r.total` directly; throws for sync targets with no history\r\n- `BaseItem.deletedItemCount()` — accesses `r['total']` directly; throws for sync targets with no deletions\r\n- `JoplinData.itemType()` — declared return type is `Promise<ModelType>` but the method returns `null` when the item is not found, misleading plugin developers into skipping a null check\r\n\r\n## Solution\r\n\r\nApplied the existing null-safe pattern `r ? r.total : 0` already used in `BaseItem.ts` (line 874) to `syncedCount` and `deletedItemCount`. No logic was changed in either method.\r\n\r\nFor `itemType`, updated the return type from `Promise<ModelType>` to `Promise<ModelType | null>` to accurately reflect the existing behaviour. No logic was changed.\r\n\r\n## Test Plan\r\n\r\nAdded tests to `BaseItem.test.ts` verifying that `syncedCount` and `deletedItemCount` return `0` when no rows exist for the given sync target, instead of throwing.\r\n\r\nAdded `JoplinData.test.ts` covering three cases for `itemType`: returns `ModelType.Note` for an existing note, returns `ModelType.Folder` for an existing folder, and returns `null` for a non-existent ID.\r\n\r\n## AI Assistance Disclosure\r\n\r\nAI tools were used to help identify the affected methods. All fixes and tests were written and reviewed by me.\r\n",
|
||
"closed_by": {
|
||
"login": "laurent22",
|
||
"id": 1285584,
|
||
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/laurent22",
|
||
"html_url": "https://github.com/laurent22",
|
||
"followers_url": "https://api.github.com/users/laurent22/followers",
|
||
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/laurent22/orgs",
|
||
"repos_url": "https://api.github.com/users/laurent22/repos",
|
||
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/laurent22/received_events",
|
||
"type": "User",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/14933/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"timeline_url": "https://api.github.com/repos/laurent22/joplin/issues/14933/timeline",
|
||
"performed_via_github_app": null,
|
||
"state_reason": null
|
||
},
|
||
"comments": [
|
||
{
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4148181371",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14933#issuecomment-4148181371",
|
||
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14933",
|
||
"id": 4148181371,
|
||
"node_id": "IC_kwDOBLftOs73QDl7",
|
||
"user": {
|
||
"login": "github-actions[bot]",
|
||
"id": 41898282,
|
||
"node_id": "MDM6Qm90NDE4OTgyODI=",
|
||
"avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/github-actions%5Bbot%5D",
|
||
"html_url": "https://github.com/apps/github-actions",
|
||
"followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
|
||
"following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
|
||
"repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
|
||
"events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
|
||
"type": "Bot",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"created_at": "2026-03-28T14:35:38Z",
|
||
"updated_at": "2026-03-29T10:37:21Z",
|
||
"body": "****CLA Assistant Lite bot**** All contributors have signed the CLA ✍️ ✅",
|
||
"author_association": "CONTRIBUTOR",
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4148181371/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"performed_via_github_app": {
|
||
"id": 15368,
|
||
"client_id": "Iv1.05c79e9ad1f6bdfa",
|
||
"slug": "github-actions",
|
||
"node_id": "MDM6QXBwMTUzNjg=",
|
||
"owner": {
|
||
"login": "github",
|
||
"id": 9919,
|
||
"node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/github",
|
||
"html_url": "https://github.com/github",
|
||
"followers_url": "https://api.github.com/users/github/followers",
|
||
"following_url": "https://api.github.com/users/github/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/github/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/github/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/github/orgs",
|
||
"repos_url": "https://api.github.com/users/github/repos",
|
||
"events_url": "https://api.github.com/users/github/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/github/received_events",
|
||
"type": "Organization",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"name": "GitHub Actions",
|
||
"description": "Automate your workflow from idea to production",
|
||
"external_url": "https://help.github.com/en/actions",
|
||
"html_url": "https://github.com/apps/github-actions",
|
||
"created_at": "2018-07-30T09:30:17Z",
|
||
"updated_at": "2026-05-05T14:51:38Z",
|
||
"permissions": {
|
||
"actions": "write",
|
||
"administration": "read",
|
||
"artifact_metadata": "write",
|
||
"attestations": "write",
|
||
"checks": "write",
|
||
"code_quality": "write",
|
||
"contents": "write",
|
||
"copilot_requests": "write",
|
||
"deployments": "write",
|
||
"discussions": "write",
|
||
"issues": "write",
|
||
"merge_queues": "write",
|
||
"metadata": "read",
|
||
"models": "read",
|
||
"packages": "write",
|
||
"pages": "write",
|
||
"pull_requests": "write",
|
||
"repository_hooks": "write",
|
||
"repository_projects": "write",
|
||
"security_events": "write",
|
||
"statuses": "write",
|
||
"vulnerability_alerts": "read"
|
||
},
|
||
"events": [
|
||
"branch_protection_rule",
|
||
"check_run",
|
||
"check_suite",
|
||
"create",
|
||
"delete",
|
||
"deployment",
|
||
"deployment_status",
|
||
"discussion",
|
||
"discussion_comment",
|
||
"fork",
|
||
"gollum",
|
||
"issues",
|
||
"issue_comment",
|
||
"label",
|
||
"merge_group",
|
||
"milestone",
|
||
"page_build",
|
||
"public",
|
||
"pull_request",
|
||
"pull_request_review",
|
||
"pull_request_review_comment",
|
||
"push",
|
||
"registry_package",
|
||
"release",
|
||
"repository",
|
||
"repository_dispatch",
|
||
"status",
|
||
"watch",
|
||
"workflow_dispatch",
|
||
"workflow_run"
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4148181746",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14933#issuecomment-4148181746",
|
||
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14933",
|
||
"id": 4148181746,
|
||
"node_id": "IC_kwDOBLftOs73QDry",
|
||
"user": {
|
||
"login": "coderabbitai[bot]",
|
||
"id": 136622811,
|
||
"node_id": "BOT_kgDOCCSy2w",
|
||
"avatar_url": "https://avatars.githubusercontent.com/in/347564?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/coderabbitai%5Bbot%5D",
|
||
"html_url": "https://github.com/apps/coderabbitai",
|
||
"followers_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/followers",
|
||
"following_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/orgs",
|
||
"repos_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/repos",
|
||
"events_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/received_events",
|
||
"type": "Bot",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"created_at": "2026-03-28T14:35:52Z",
|
||
"updated_at": "2026-03-28T18:06:47Z",
|
||
"body": "<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review paused by coderabbit.ai -->\n\n> [!NOTE]\n> ## Reviews paused\n> \n> It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the `reviews.auto_review.auto_pause_after_reviewed_commits` setting.\n> \n> Use the following commands to manage reviews:\n> - `@coderabbitai resume` to resume automatic reviews.\n> - `@coderabbitai review` to trigger a single review.\n> \n> Use the checkboxes below for quick actions:\n> - [ ] <!-- {\"checkboxId\": \"7f6cc2e2-2e4e-497a-8c31-c9e4573e93d1\"} --> ▶️ Resume reviews\n> - [ ] <!-- {\"checkboxId\": \"e9bb8d72-00e8-4f67-9cb2-caf3b22574fe\"} --> 🔍 Trigger review\n\n<!-- end of auto-generated comment: review paused by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThis PR fixes null handling in BaseItem count methods, updates the JoplinData.itemType return type signature to accurately reflect null support, adds comprehensive tests for both changes, and updates ignore patterns for generated test artefacts.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**BaseItem null handling fixes** <br> `packages/lib/models/BaseItem.ts`, `packages/lib/models/BaseItem.test.ts`|Updated `syncedCount()` and `deletedItemCount()` to safely return `0` when `selectOne` yields undefined/falsy results. Added test cases verifying both methods return `0` for non-existent sync targets.|\n|**JoplinData itemType return type updates** <br> `packages/lib/services/plugins/api/JoplinData.ts`, `packages/generator-joplin/generators/app/templates/api/JoplinData.d.ts`, `packages/app-cli/tests/support/plugins/.../api/JoplinData.d.ts`|Updated `itemType(itemId: string)` return type from `Promise<ModelType>` to `Promise<ModelType \\| null>` across main implementation and 22 test declaration files to reflect the method's actual behaviour of returning null for missing items.|\n|**JoplinData test suite** <br> `packages/lib/services/plugins/JoplinData.test.ts`|Added new Jest test suite verifying `itemType()` returns `ModelType.Note` for existing notes, `ModelType.Folder` for existing folders, and `null` for non-existent item IDs.|\n|**Build artefact ignore patterns** <br> `.eslintignore`, `.gitignore`|Added `packages/lib/services/plugins/JoplinData.test.js` to ignore lists for generated test artefacts.|\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 4</summary>\n\n<details>\n<summary>✅ Passed checks (4 passed)</summary>\n\n| Check name | Status | Explanation |\n| :-----------------------------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Title check | ✅ Passed | The title accurately summarizes the main change: fixing potential TypeErrors in three methods by adding null checks and updating type signatures. |\n| Description check | ✅ Passed | The description is well-related to the changeset, clearly explaining the problem, solution, test plan, and AI assistance disclosure for the null-handling fixes. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n| Pr Description Must Follow Guidelines | ✅ Passed | The pull request description includes all three required sections: Problem describing the TypeError risk, Solution detailing the null-safe pattern and type updates, and Test Plan describing verification tests. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing Touches</summary>\n\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} --> Create PR with unit tests\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=laurent22/joplin&utm_content=14933)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->",
|
||
"author_association": "CONTRIBUTOR",
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4148181746/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"performed_via_github_app": {
|
||
"id": 347564,
|
||
"client_id": "Iv1.6aaafe4fe882736b",
|
||
"slug": "coderabbitai",
|
||
"node_id": "A_kwHOB96YWc4ABU2s",
|
||
"owner": {
|
||
"login": "coderabbitai",
|
||
"id": 132028505,
|
||
"node_id": "O_kgDOB96YWQ",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/132028505?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/coderabbitai",
|
||
"html_url": "https://github.com/coderabbitai",
|
||
"followers_url": "https://api.github.com/users/coderabbitai/followers",
|
||
"following_url": "https://api.github.com/users/coderabbitai/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/coderabbitai/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/coderabbitai/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/coderabbitai/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/coderabbitai/orgs",
|
||
"repos_url": "https://api.github.com/users/coderabbitai/repos",
|
||
"events_url": "https://api.github.com/users/coderabbitai/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/coderabbitai/received_events",
|
||
"type": "Organization",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"name": "coderabbitai",
|
||
"description": "# Transforming Code Reviews with AI\r\n\r\n## Features\r\n\r\n**Automated Reviews**: Continuous reviews of the pull requests including incremental commits. \r\n\r\n**Summarization**: Generates high-level summary and a technical walkthrough of the PR changes. \r\n\r\n**Line-by-line review**: Provides line-by-line suggestions committable with one click.\r\n\r\n**Codebase verification**: Verifies the impact on the overall codebase and identifies missing changes.\r\n\r\n**Insights into your code**: Ask any questions on your codebase within the pull request \r\n\r\n**Chat about your code** : Chat with the bot around your code. The more you chat, the smarter it gets.\r\n\r\n**Issue Validation**: Validates the PR against the linked issues and identifies other related issues \r\n\r\n\r\n\r\n",
|
||
"external_url": "https://coderabbit.ai?utm_source=cr_app&utm_medium=github",
|
||
"html_url": "https://github.com/apps/coderabbitai",
|
||
"created_at": "2023-06-14T15:47:27Z",
|
||
"updated_at": "2026-03-14T07:58:44Z",
|
||
"permissions": {
|
||
"actions": "read",
|
||
"checks": "write",
|
||
"contents": "write",
|
||
"discussions": "read",
|
||
"issues": "write",
|
||
"members": "read",
|
||
"metadata": "read",
|
||
"pull_requests": "write",
|
||
"statuses": "write"
|
||
},
|
||
"events": [
|
||
"issues",
|
||
"issue_comment",
|
||
"label",
|
||
"organization",
|
||
"pull_request",
|
||
"pull_request_review",
|
||
"pull_request_review_comment",
|
||
"pull_request_review_thread",
|
||
"release",
|
||
"repository"
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4148184598",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14933#issuecomment-4148184598",
|
||
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14933",
|
||
"id": 4148184598,
|
||
"node_id": "IC_kwDOBLftOs73QEYW",
|
||
"user": {
|
||
"login": "rattnak",
|
||
"id": 82812258,
|
||
"node_id": "MDQ6VXNlcjgyODEyMjU4",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/82812258?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/rattnak",
|
||
"html_url": "https://github.com/rattnak",
|
||
"followers_url": "https://api.github.com/users/rattnak/followers",
|
||
"following_url": "https://api.github.com/users/rattnak/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/rattnak/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/rattnak/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/rattnak/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/rattnak/orgs",
|
||
"repos_url": "https://api.github.com/users/rattnak/repos",
|
||
"events_url": "https://api.github.com/users/rattnak/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/rattnak/received_events",
|
||
"type": "User",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"created_at": "2026-03-28T14:37:47Z",
|
||
"updated_at": "2026-03-28T14:37:47Z",
|
||
"body": "I have read the CLA Document and I hereby sign the CLA",
|
||
"author_association": "NONE",
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4148184598/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"performed_via_github_app": null
|
||
},
|
||
{
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4149878802",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14933#issuecomment-4149878802",
|
||
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14933",
|
||
"id": 4149878802,
|
||
"node_id": "IC_kwDOBLftOs73WiAS",
|
||
"user": {
|
||
"login": "laurent22",
|
||
"id": 1285584,
|
||
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/laurent22",
|
||
"html_url": "https://github.com/laurent22",
|
||
"followers_url": "https://api.github.com/users/laurent22/followers",
|
||
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/laurent22/orgs",
|
||
"repos_url": "https://api.github.com/users/laurent22/repos",
|
||
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/laurent22/received_events",
|
||
"type": "User",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"created_at": "2026-03-29T10:37:10Z",
|
||
"updated_at": "2026-03-29T10:37:10Z",
|
||
"body": "Thanks for the contribution. We’re closing this PR because it does not follow the project’s contribution policy: it is not based on a triaged, accepted issue and does not address a concrete problem agreed upon by maintainers.\r\n\r\nWhile the change itself is not necessarily incorrect, reviewing and maintaining such PRs takes time away from higher-priority work.\r\n\r\nPlease see our [Contribution Scope Policy](https://joplinapp.org/help/dev/#contribution-scope) for details on what kinds of contributions we accept.\r\n\r\nIf you intend to participate in GSoC, please make sure you read our [GSoC guidelines](https://github.com/joplin/gsoc).\r\n\r\nAnd [please pay attention to our AI policy](https://github.com/joplin/gsoc/blob/master/ai_policy.md).\r\n",
|
||
"author_association": "OWNER",
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/4149878802/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"performed_via_github_app": null
|
||
}
|
||
]
|
||
} |