Git commit history (#1534)

* feat(app): add fileView preference for changes panel

* feat(app): add buildDiffTree util for changed-files tree

* feat(app): add changed-files tree directory row

* feat(app): changed-files tree view mode in changes panel (#117)

* feat(protocol): add checkout.commits.list RPC + commitsList feature flag

* feat(server): list branch commits ahead of base with on-remote flags

* feat(server): handle checkout.commits.list RPC and advertise capability

* feat(client): checkout.commits.list method + useCommitsQuery hook

* feat(app): per-commit inline view with local-vs-remote markers (#117)

* feat(protocol,server): per-commit file diff RPC (checkout.commits.file_diff)

* feat(app): open per-commit file diff on click (#117)

* refactor: surface baseRef + commits loading/error, drop dead depth field

* fix(app): flip commit local/remote dot — local hollow, remote filled

* feat(app): list/tree view for expanded commit file list (#117)

* fix(app): syntax-highlight per-commit file diff to match Changes view

* feat(app): draggable resize between commits and diff sections

* refactor(app): dedupe wrap-text helpers into diff-highlighted-text

* fix(app): clean up commits resize drag on unmount + a11y label

* fix(app): collapse commits section by default

* fix(app): render per-commit file diff with the shared Changes line renderer

* perf(app): memoize shared diff line row; drop redundant DiffLineView wrapper

* refactor(app): extract shared DiffFileBody; render commit file diff through it

* fix(app): hide inline-comment affordance in per-commit diffs (no reviewActions)

* feat(app): move commits to a resizable bottom drawer in the Changes panel

* feat(review): commitSha scoping for per-commit review drafts + attachment

* feat(app): per-commit inline comments wired through to the composer (#117)

* refactor(app): own commit file-diff open state in CommitFileList (drop reset effect)

* refactor(app): colocate diff-render cluster under git/diff-file-body/

* feat(app): add diff tab target kind (working/commit diff tabs)

* feat(app): useDiffFiles hook unifying working + commit diff targets

* feat(app): diff tab panel rendering working/commit diffs

* feat(app): open a commit diff tab on commit click; drop per-commit drawer/file list

* feat(app): open/scroll working diff tab on changed-file click

* fix(app): keep commit diff tabs ephemeral; align working diff whitespace

* feat(app): collapsible file sections in the diff tab, collapsed by default

* feat(app): make the on-remote commit dot more subtle

Dims the filled green remote dot (row + legend) to ~0.55 opacity so the
local-only ring stays the state that draws the eye.

* Reshape commit diffs around the existing Changes view

* Fix diff tab migration complexity after rebase

* Address diff tab review findings

* Clean up diff tab review interfaces

* Collapse commit diffs into the existing view

* Load commits when expanded

---------

Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
This commit is contained in:
adradr
2026-07-16 17:36:41 +02:00
committed by GitHub
co-authored by Mohamed Boudra
parent 5da6548aff
commit 0d3b717cf3
44 changed files with 2843 additions and 439 deletions
+20
View File
@@ -742,6 +742,17 @@ export const ar: TranslationResources = {
base: "قاعدة",
newFile: "جديد",
deletedFile: "تم الحذف",
commits: {
title: "الإيداعات",
legendLocal: "محلي",
legendRemote: "على المستودع البعيد",
countLabel: "{{count}} إيداعات قبل الأساس",
fileDiffEmpty: "لا توجد تغييرات لعرضها",
fileDiffError: "تعذّر تحميل فروق الملف",
loading: "جارٍ تحميل الإيداعات…",
loadError: "تعذّر تحميل الإيداعات",
empty: "لا توجد إيداعات قبل الأساس",
},
},
openInEditor: {
open: "يفتح",
@@ -1396,6 +1407,15 @@ export const ar: TranslationResources = {
failedToLoad: "فشل تحميل الملف",
failedToLoadPreview: "فشل تحميل معاينة الملف",
},
diff: {
changesLabel: "التغييرات",
changesSubtitle: "فروقات شجرة العمل",
commitSubtitle: "فروقات الالتزام",
directoryMissing: "لم يتم العثور على دليل Workspace.",
empty: "لا توجد تغييرات",
loadError: "فشل تحميل الفروقات",
capabilityMissing: "حدّث المضيف لعرض فروقات الالتزامات.",
},
},
toolCallDetails: {
error: "خطأ",
+20
View File
@@ -748,6 +748,17 @@ export const en = {
base: "base",
newFile: "New",
deletedFile: "Deleted",
commits: {
title: "Commits",
legendLocal: "local",
legendRemote: "on remote",
countLabel: "{{count}} commits ahead of base",
fileDiffEmpty: "No changes to display",
fileDiffError: "Failed to load file diff",
loading: "Loading commits…",
loadError: "Failed to load commits",
empty: "No commits ahead of base",
},
},
openInEditor: {
open: "Open",
@@ -1403,6 +1414,15 @@ export const en = {
failedToLoad: "Failed to load file",
failedToLoadPreview: "Failed to load file preview",
},
diff: {
changesLabel: "Changes",
changesSubtitle: "Working tree diff",
commitSubtitle: "Commit diff",
directoryMissing: "Workspace directory not found.",
empty: "No changes",
loadError: "Failed to load diff",
capabilityMissing: "Update the host to view commit diffs.",
},
},
toolCallDetails: {
error: "Error",
+20
View File
@@ -769,6 +769,17 @@ export const es: TranslationResources = {
base: "base",
newFile: "Nuevo",
deletedFile: "Eliminado",
commits: {
title: "Commits",
legendLocal: "local",
legendRemote: "en remoto",
countLabel: "{{count}} commits por delante de la base",
fileDiffEmpty: "No hay cambios para mostrar",
fileDiffError: "Error al cargar el diff del archivo",
loading: "Cargando commits…",
loadError: "Error al cargar los commits",
empty: "No hay commits por delante de la base",
},
},
openInEditor: {
open: "Abierto",
@@ -1435,6 +1446,15 @@ export const es: TranslationResources = {
failedToLoad: "No se pudo cargar el archivo",
failedToLoadPreview: "No se pudo cargar la vista previa del archivo",
},
diff: {
changesLabel: "Cambios",
changesSubtitle: "Diferencias del árbol de trabajo",
commitSubtitle: "Diferencias del commit",
directoryMissing: "No se encontró el directorio de Workspace.",
empty: "Sin cambios",
loadError: "No se pudieron cargar las diferencias",
capabilityMissing: "Actualiza el host para ver las diferencias de los commits.",
},
},
toolCallDetails: {
error: "Error",
+20
View File
@@ -767,6 +767,17 @@ export const fr: TranslationResources = {
base: "base",
newFile: "Nouveau",
deletedFile: "Supprimé",
commits: {
title: "Commits",
legendLocal: "local",
legendRemote: "sur le distant",
countLabel: "{{count}} commits en avance sur la base",
fileDiffEmpty: "Aucune modification à afficher",
fileDiffError: "Échec du chargement du diff du fichier",
loading: "Chargement des commits…",
loadError: "Échec du chargement des commits",
empty: "Aucun commit en avance sur la base",
},
},
openInEditor: {
open: "Ouvrir",
@@ -1437,6 +1448,15 @@ export const fr: TranslationResources = {
failedToLoad: "Échec du chargement du fichier",
failedToLoadPreview: "Échec du chargement de l'aperçu du fichier",
},
diff: {
changesLabel: "Modifications",
changesSubtitle: "Différences de l'arbre de travail",
commitSubtitle: "Différences du commit",
directoryMissing: "Répertoire Workspace introuvable.",
empty: "Aucune modification",
loadError: "Échec du chargement des différences",
capabilityMissing: "Mettez à jour l'hôte pour voir les différences des commits.",
},
},
toolCallDetails: {
error: "Erreur",
+20
View File
@@ -754,6 +754,17 @@ export const ja: TranslationResources = {
base: "ベース",
newFile: "新規",
deletedFile: "削除済み",
commits: {
title: "コミット",
legendLocal: "ローカル",
legendRemote: "リモート",
countLabel: "ベースより先のコミット数: {{count}}",
fileDiffEmpty: "表示する変更はありません",
fileDiffError: "ファイル差分の読み込みに失敗しました",
loading: "コミットを読み込み中…",
loadError: "コミットの読み込みに失敗しました",
empty: "ベースより先のコミットはありません",
},
},
openInEditor: {
open: "開く",
@@ -1413,6 +1424,15 @@ export const ja: TranslationResources = {
failedToLoad: "ファイルの読み込みに失敗しました",
failedToLoadPreview: "ファイルプレビューの読み込みに失敗しました",
},
diff: {
changesLabel: "変更",
changesSubtitle: "作業ツリーの差分",
commitSubtitle: "コミット差分",
directoryMissing: "ワークスペースディレクトリが見つかりません。",
empty: "変更はありません",
loadError: "差分の読み込みに失敗しました",
capabilityMissing: "コミット差分を表示するにはホストを更新してください。",
},
},
toolCallDetails: {
error: "エラー",
+20
View File
@@ -760,6 +760,17 @@ export const ptBR: TranslationResources = {
base: "base",
newFile: "Novo",
deletedFile: "Excluído",
commits: {
title: "Commits",
legendLocal: "local",
legendRemote: "no remoto",
countLabel: "{{count}} commits à frente da base",
fileDiffEmpty: "Nenhuma alteração para exibir",
fileDiffError: "Falha ao carregar diff do arquivo",
loading: "Carregando commits…",
loadError: "Falha ao carregar commits",
empty: "Nenhum commit à frente da base",
},
},
openInEditor: {
open: "Abrir",
@@ -1421,6 +1432,15 @@ export const ptBR: TranslationResources = {
failedToLoad: "Falha ao carregar arquivo",
failedToLoadPreview: "Falha ao carregar prévia do arquivo",
},
diff: {
changesLabel: "Alterações",
changesSubtitle: "Diff da árvore de trabalho",
commitSubtitle: "Diff do commit",
directoryMissing: "Diretório do workspace não encontrado.",
empty: "Nenhuma alteração",
loadError: "Falha ao carregar diff",
capabilityMissing: "Atualize o host para ver diffs de commits.",
},
},
toolCallDetails: {
error: "Erro",
+20
View File
@@ -761,6 +761,17 @@ export const ru: TranslationResources = {
base: "база",
newFile: "Новый",
deletedFile: "Удалено",
commits: {
title: "Коммиты",
legendLocal: "локально",
legendRemote: "на удалённом",
countLabel: "{{count}} коммитов впереди базы",
fileDiffEmpty: "Нет изменений для отображения",
fileDiffError: "Не удалось загрузить различия файла",
loading: "Загрузка коммитов…",
loadError: "Не удалось загрузить коммиты",
empty: "Нет коммитов впереди базы",
},
},
openInEditor: {
open: "Открыть",
@@ -1427,6 +1438,15 @@ export const ru: TranslationResources = {
failedToLoad: "Не удалось загрузить файл",
failedToLoadPreview: "Не удалось загрузить предварительный просмотр файла.",
},
diff: {
changesLabel: "Изменения",
changesSubtitle: "Различия рабочего дерева",
commitSubtitle: "Различия коммита",
directoryMissing: "Каталог Workspace не найден.",
empty: "Нет изменений",
loadError: "Не удалось загрузить различия",
capabilityMissing: "Обновите хост, чтобы просматривать различия коммитов.",
},
},
toolCallDetails: {
error: "Ошибка",
+20
View File
@@ -737,6 +737,17 @@ export const zhCN: TranslationResources = {
base: "base",
newFile: "新增",
deletedFile: "已删除",
commits: {
title: "提交",
legendLocal: "本地",
legendRemote: "已推送",
countLabel: "领先基线 {{count}} 个提交",
fileDiffEmpty: "没有可显示的更改",
fileDiffError: "加载文件差异失败",
loading: "正在加载提交…",
loadError: "加载提交失败",
empty: "没有领先基线的提交",
},
},
openInEditor: {
open: "打开",
@@ -1380,6 +1391,15 @@ export const zhCN: TranslationResources = {
failedToLoad: "加载文件失败",
failedToLoadPreview: "加载文件预览失败",
},
diff: {
changesLabel: "更改",
changesSubtitle: "工作区差异",
commitSubtitle: "提交差异",
directoryMissing: "未找到 workspace 目录。",
empty: "没有更改",
loadError: "加载差异失败",
capabilityMissing: "请更新主机以查看提交差异。",
},
},
toolCallDetails: {
error: "错误",