feat(forge): pluggable forge abstraction + GitLab and Gitea/Forgejo/Codeberg (#1913)
* refactor(forge): forge-neutral foundation (GitHub-only) Decouple git-hosting from GitHub behind a neutral abstraction (issue #1616), GitHub-only for now; existing GitHub behaviour is unchanged. - Forge manifest, neutral ForgeService contract, forge registry + resolver, and a client forge-module registry. - GitHub code renamed to the neutral shape; PR/Issue attachment wording preserved. - forge.search.response enums parse tolerantly (unknown kind/auth state degrade instead of breaking the client). - createPullRequest reports typed CLI/auth errors instead of a generic message. - forge-resolver host/remote caches are LRU-bounded. - Forge host trust is explicit: only a known cloud host or a CLI-authenticated host is ever talked to; an unauthenticated GitHub Enterprise host fails resolution instead of routing to github.com. - Docs: forge-providers guide, glossary and i18n forge-copy conventions, architecture and rpc-namespacing terminology. - Vitest React Native mocks (unistyles, svg, linking, lucide) consolidated into shared aliased test-stubs. * feat(forge): GitLab adapter, forge-aware UI, pipelines and approvals GitLab adapter over the glab CLI on the neutral contracts: MR status, forge-aware UI, pipeline tree, and N-of-M approvals. - threadIsResolved is part of the neutral timeline item. - Pipeline load failures show an error instead of an empty section. - Manual pipeline jobs render as pending. - Fork/detached MR head pipelines are fetched by MR iid (glab ci get --merge-request). * feat(forge): Gitea family adapter (Gitea, Forgejo, Codeberg) One adapter over the tea CLI serving Gitea, Forgejo, and Codeberg on the neutral contracts. - CI status aggregates commit statuses and Actions runs together. - Gitea's terminal "warning" state maps to failure on server and client. - Gitea Actions check details are reachable from the PR pane by workflowRunId. * refactor(forge): localize compatibility handling * test(forge): expect normalized GitLab facts --------- Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
This commit is contained in:
co-authored by
Mohamed Boudra
parent
04d1ebdce0
commit
a8ebd390fa
@@ -100,6 +100,7 @@ export const en = {
|
||||
addImage: "Add image",
|
||||
addFile: "Upload file",
|
||||
addIssueOrPr: "Add issue or PR",
|
||||
addIssueOrPr_mr: "Add issue or MR",
|
||||
dropImagesHere: "Drop images here",
|
||||
dropFilesHere: "Drop files here",
|
||||
editQueuedMessage: "Edit queued message",
|
||||
@@ -107,8 +108,8 @@ export const en = {
|
||||
openImage: "Open image attachment",
|
||||
removeImage: "Remove image attachment",
|
||||
removeFile: "Remove file attachment",
|
||||
openGithub: "Open {{kind}} #{{number}}",
|
||||
removeGithub: "Remove {{kind}} #{{number}}",
|
||||
openGithub: "Open {{kind}} {{number}}",
|
||||
removeGithub: "Remove {{kind}} {{number}}",
|
||||
element: "Element",
|
||||
openBrowserElement: "Open browser element attachment",
|
||||
removeBrowserElement: "Remove browser element attachment",
|
||||
@@ -132,7 +133,9 @@ export const en = {
|
||||
searching: "Searching...",
|
||||
noResults: "No results found.",
|
||||
searchPlaceholder: "Search issues and PRs...",
|
||||
searchPlaceholder_mr: "Search issues and MRs...",
|
||||
title: "Attach issue or PR",
|
||||
title_mr: "Attach issue or MR",
|
||||
},
|
||||
},
|
||||
agentControls: {
|
||||
@@ -612,10 +615,14 @@ export const en = {
|
||||
success: "Pulled and pushed",
|
||||
},
|
||||
viewPr: "View PR",
|
||||
viewPr_mr: "View MR",
|
||||
createPr: {
|
||||
label: "Create PR",
|
||||
pending: "Creating PR...",
|
||||
success: "PR Created",
|
||||
label_mr: "Create MR",
|
||||
pending_mr: "Creating MR...",
|
||||
success_mr: "MR Created",
|
||||
},
|
||||
mergeBranch: {
|
||||
label: "Merge locally",
|
||||
@@ -638,6 +645,11 @@ export const en = {
|
||||
rebase: "Merge PR (rebase)",
|
||||
pending: "Merging PR...",
|
||||
success: "PR merged",
|
||||
squash_mr: "Merge MR (squash)",
|
||||
merge_mr: "Merge MR (merge)",
|
||||
rebase_mr: "Merge MR (rebase)",
|
||||
pending_mr: "Merging MR...",
|
||||
success_mr: "MR merged",
|
||||
},
|
||||
autoMerge: {
|
||||
enableSquash: "Auto merge (squash)",
|
||||
@@ -649,7 +661,8 @@ export const en = {
|
||||
disabled: "Auto-merge disabled",
|
||||
},
|
||||
unavailable: {
|
||||
viewPrNoGithub: "View PR isn't available right now because GitHub isn't connected",
|
||||
viewPrNoForge:
|
||||
"View {{noun}} isn't available right now because {{brand}} isn't connected",
|
||||
pullNoRemote:
|
||||
"Pull isn't available here because this branch is not connected to a remote yet",
|
||||
pullDirty:
|
||||
@@ -663,8 +676,13 @@ export const en = {
|
||||
"Pull and push isn't available here because this branch is not connected to a remote yet",
|
||||
pullAndPushDirty:
|
||||
"Pull and push isn't available while you have local changes so commit or stash them first",
|
||||
pullAndPushNoIncoming:
|
||||
"Pull and push isn't available because there are no incoming changes to pull first",
|
||||
pullAndPushInSync: "Pull and push isn't available because this branch is already in sync",
|
||||
createPrNoGithub: "Create PR isn't available right now because GitHub isn't connected",
|
||||
pullAndPushNothingToPush:
|
||||
"Pull and push isn't available because there is nothing new to send after pulling",
|
||||
createPrNoForge:
|
||||
"Create {{noun}} isn't available right now because {{brand}} isn't connected",
|
||||
createPrNoCommits:
|
||||
"Create PR isn't available because this branch doesn't have any new commits yet",
|
||||
mergeNoBase: "Merge isn't available because we couldn't determine the base branch",
|
||||
@@ -678,6 +696,10 @@ export const en = {
|
||||
updateCurrent:
|
||||
"Update isn't available because this branch is already up to date with {{baseRef}}",
|
||||
mergePrNoGithub: "Merge PR isn't available right now because GitHub isn't connected",
|
||||
archiveNotWorktree:
|
||||
"Archive isn't available here because this workspace was not created as a Paseo worktree",
|
||||
mergePrNoForge:
|
||||
"Merge {{noun}} isn't available right now because {{brand}} isn't connected",
|
||||
mergePrMissing: "Merge PR isn't available because there isn't a pull request yet",
|
||||
mergePrDraft: "Merge PR isn't available because the pull request is still a draft",
|
||||
mergePrMerged: "Merge PR isn't available because the pull request is already merged",
|
||||
@@ -685,7 +707,7 @@ export const en = {
|
||||
mergePrConflicts: "Merge PR isn't available because the pull request has conflicts",
|
||||
mergePrQueue: "Merge PR isn't available here because this repository uses a merge queue",
|
||||
mergePrNotReady:
|
||||
"Merge PR isn't available until GitHub reports the pull request is ready to merge",
|
||||
"Merge {{noun}} isn't available until {{brand}} reports the {{noun}} is ready to merge",
|
||||
autoMergeCannotDisable: "Auto-merge is enabled, but this account can't disable it",
|
||||
},
|
||||
toasts: {
|
||||
@@ -735,7 +757,7 @@ export const en = {
|
||||
expandAllFolders: "Expand all folders",
|
||||
refreshing: "Refreshing",
|
||||
refresh: "Refresh",
|
||||
refreshState: "Refresh git and GitHub state",
|
||||
refreshState: "Refresh git and {{brand}} state",
|
||||
failedRefresh: "Failed to refresh git state.",
|
||||
emptyHiddenWhitespace: "No visible changes after hiding whitespace",
|
||||
emptyUncommitted: "No uncommitted changes",
|
||||
@@ -771,13 +793,23 @@ export const en = {
|
||||
pr: {
|
||||
actions: {
|
||||
viewPullRequest: "View",
|
||||
openOn: "Open on {{brand}}",
|
||||
},
|
||||
sections: {
|
||||
checks: "Checks",
|
||||
pipeline: "Pipeline",
|
||||
reviews: "Reviews",
|
||||
},
|
||||
empty: {
|
||||
noJobs: "No jobs",
|
||||
loadingPipeline: "Loading pipeline…",
|
||||
pipelineJobsLoadFailed: "Could not load pipeline jobs",
|
||||
allowedToFail: "allowed to fail",
|
||||
},
|
||||
approvals: "{{given}} of {{required}} approvals",
|
||||
accessibility: {
|
||||
pullRequest: "Pull request #{{number}}",
|
||||
pullRequest_mr: "Merge request !{{number}}",
|
||||
},
|
||||
states: {
|
||||
draft: "Draft",
|
||||
@@ -794,11 +826,19 @@ export const en = {
|
||||
time: {
|
||||
justNow: "just now",
|
||||
},
|
||||
thread: {
|
||||
discussion: "Discussion thread",
|
||||
},
|
||||
errors: {
|
||||
statusLoadFailed: "Unable to load pull request status",
|
||||
activityLoadFailed: "Unable to load pull request activity",
|
||||
},
|
||||
},
|
||||
forgeSetup: {
|
||||
installCli: "Install the {{cli}} CLI to use {{brand}} features.",
|
||||
signIn: "Run {{command}} to use {{brand}} features.",
|
||||
generic: "Set up {{brand}} on this host to use its features.",
|
||||
},
|
||||
},
|
||||
},
|
||||
sidebar: {
|
||||
@@ -930,9 +970,9 @@ export const en = {
|
||||
refPicker: {
|
||||
startingRef: "Starting ref",
|
||||
chooseStart: "Choose where to start from",
|
||||
checkoutHint: "Check out PR #{{number}}?",
|
||||
checkoutPr: "Check out PR #{{number}}",
|
||||
dismissCheckoutHint: "Dismiss PR #{{number}} checkout hint",
|
||||
checkoutHint: "Check out {{noun}} {{numberPrefix}}{{number}}?",
|
||||
checkoutPr: "Check out {{noun}} {{numberPrefix}}{{number}}",
|
||||
dismissCheckoutHint: "Dismiss {{noun}} {{numberPrefix}}{{number}} checkout hint",
|
||||
intoBase: "into {{baseRef}}",
|
||||
searching: "Searching...",
|
||||
noMatchingRefs: "No matching refs.",
|
||||
|
||||
Reference in New Issue
Block a user