feat: add host-local custom project icons (#2335)

* feat(projects): add local icons and colors

* refactor(projects): simplify appearance handling

* fix(projects): serialize appearance saves

* test(app): update project appearance expectations

* test: fix project appearance CI expectations

* refactor(projects): organize appearance code

* fix(server): adopt main's reconcile model in project appearance updates

* fix(projects): preserve host-local appearance targets

* fix(desktop): restore Linux development startup

Ubuntu can block Electron's unprivileged user-namespace fallback while the npm-installed sandbox helper is not SUID. Disable the Chromium process sandbox only in the Linux development runner so packaged desktop policy remains unchanged.

* feat(projects): add custom project icons

Keep URL acquisition in the client so the host daemon only validates uploaded bytes. Project name and icon changes share one adaptive edit sheet.

* refactor(settings): scope projects by host

---------

Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
This commit is contained in:
nikuscs
2026-08-01 01:34:42 +08:00
committed by GitHub
co-authored by Mohamed Boudra
parent 706ae3d9bb
commit 800bd2bef1
67 changed files with 2158 additions and 912 deletions
+12 -13
View File
@@ -1637,6 +1637,7 @@ export const ja: TranslationResources = {
vimHint: "Web とデスクトップのソースファイルに適用されます。",
},
hostSections: {
projects: "プロジェクト",
connections: "接続",
agents: "エージェント",
workspaces: "ワークスペース",
@@ -2143,25 +2144,23 @@ export const ja: TranslationResources = {
},
},
project: {
noEditableTarget:
"接続されているホストのどれにもこのプロジェクトの編集可能なコピーがありません。",
noEditableTarget: "このホストではこのプロジェクトを編集できません。",
backToProjects: "プロジェクトに戻る",
switchHost: "ホストを切り替え",
rename: {
renamedToast: "プロジェクト名を変更しました",
errorFallback: "プロジェクト名を変更できませんでした",
renameLabel: "プロジェクトの名前を変更",
resetLabel: "プロジェクト名をデフォルトにリセット",
projectNameLabel: "プロジェクト名",
saveLabel: "プロジェクト名を保存",
cancelLabel: "名前変更をキャンセル",
reset: "リセット",
edit: {
title: "プロジェクトを編集",
name: "名前",
nameLabel: "プロジェクト名",
icon: "アイコン",
chooseImage: "画像を選択",
useAutomatic: "自動を使う",
imageUrl: "画像またはサイトのURL",
save: "変更を保存",
savedToast: "プロジェクトを更新しました",
},
readFailures: {
invalidTitle: "paseo.jsonを解析できませんでした",
invalidDescription: "ディスク上のファイルを修正してから再読み込みしてください。",
missingTitle: "このホストにはこのプロジェクトがありません",
missingWithHosts: "上で別のホストに切り替えるか、再読み込みしてください。",
missingSingleHost: "選択したホストにはこのプロジェクトの記録がありません。",
transportTitle: "paseo.jsonを読み込めませんでした",
transportFallback: "ホストが応答しませんでした。",