
Claude Desktop Debian 开发工程手册patch-zero 契约、asar 补丁编排与 Linux 启动器实战【免费下载链接】claude-desktop-debianClaude Desktop for Linux项目地址: https://gitcode.com/GitHub_Trending/cl/claude-desktop-debianCLAUDE.md 是本仓库面向人类与 AI 贡献者的开发笔记与项目考古入口它定义了项目最核心的工程契约——以 Anthropic 官方 Linux.deb为底座、以补丁必须自我辩护为默认判罚的patch-zero策略。本文以该文档为骨架结合仓库内 app-asar.sh、launcher-common.sh、official-deb.sh 等源码逐层印证读完你可以独立完成一次官方.deb的获取、解包、美化、补丁审查与构建排障。项目概览一份开发笔记解决什么问题本仓库把 Anthropic 官方 Linux.deb重新打包成 Anthropic 不提供的格式——RPMFedora/RHEL、AppImage发行版无关、Nix flakeNixOS与 AURArch并额外维护自己的.deb每一种格式外面都套了一层带 Linux 环境修复的启动器launcher和--doctor诊断工具。官方.deb覆盖一个打包目标剩下的发行版、桌面环境与会话类型长尾由本项目补齐。自 v3.0.0 起决策 D-002项目不再重打包 Windows 安装器而是整体切换到官方 Linux 树并立下patch-zero契约官方app.asar以字节一致byte-identical方式交付除非某个补丁能针对官方字节证明自己确实在补偿一个真实的 Linux 缺口。app-asar.sh 开头写明了这一点active_patches lists the asar patch functions that still justify themselves against the official bytes — the patch-zero contract: the default verdict for any patch is delete。当active_patches数组为空时不抽取、不重打包官方app.asar原样交付。CLAUDE.md 本身是最高杠杆规则 项目积累下来的考古知识的速查入口新政策写入风格指南或 CONTRIBUTING.md。文档层级为CONTRIBUTING.md — 接收什么、什么上送上游、子系统 owner、AI 署名政策bash_styleguide.md — Shell 脚本约定源自 YSAPdocs_styleguide.md —docs/树页面结构与反模式docs/index.md — 其余仓库文档入口SECURITY.md — 漏洞报告范围patch-zero 补丁编排app-asar.sh 的完整工作流scripts/patches/app-asar.sh 独占 asar 补丁阶段由build.shsource运行在$app_staging_dir/resources下。它的关键机制如下。active_patches唯一接线点active_patches数组是补丁唯一被接线的位置当前为五个存活补丁active_patches( patch_quick_window patch_org_plugins_path patch_virtiofsd_probe patch_cowork_bwrap patch_tray_icon_env_override )每个条目是一个从scripts/patches/*.shsource 进来的函数按序执行任何一个返回非零即终止构建。数组为空 ⇒ 不 extract、不 repack官方app.asar字节一致交付。两个派生的构建时守卫patch_app_asar在补丁前先做两类派生检查WM_CLASS 派生productName guard 之外Chromium 运行时窗口类是从 asar 的package.json的desktopName字段减去.desktop后缀得到的——不是 ELF 文件名、不是启动器--class参数、不是productName。上游已经改过一次名claude-desktop.desktop→com.anthropic.Claude.desktop所以任何硬编码都会在下一次改名时悄悄破坏窗口到启动器的分组。_derive_wm_class校验字段存在且带.desktop后缀派生的值被export WM_CLASS供打包脚本插值进.desktop文件和 launcher-common.sh 的WM_CLASS占位符。productName guardproductName不再喂给 WM_CLASS但 Electron 的 userData 路径~/.config/Claude以它为 key启动器、doctor 和文档都假设这个位置。app-asar.sh 中只要它不等于Claude就失败退出。上游 tripwiresAU-1 / MB-1v3.0.0 删除了一批补丁但每个被删补丁过去在锚点漂移时会 WARN补丁没了之后上游翻转会静默落地。于是构建阶段直接在未经修改的 asar 原始字节上 grepasar 内容未压缩grep -a 可读_check_upstream_tripwires断言两个行为标记仍存在AU-1managed_by_package_managerLinux 构建里常量折叠的更新器早退逻辑[updater] Linux: in-app updater off (updates via apt)。上游在 1.18286.2 → 1.19367.0 窗口把apt_channel_pending改名为managed_by_package_manager。若它消失说明上游重写了这道门、可能开启了自我更新会与包管理器打架——2.x 的 autoUpdater-noop 问题重新激活决策 D-001。MB-1menuBarEnabled:!0保持菜单栏开启的设置默认值。若消失说明上游翻转了被删 menuBar 补丁曾强制执行的默认值。模式容忍可选空白menuBarEnabled:[[:space:]]*!0这样美化过或重新压缩过的 bundle 也能匹配对应 CLAUDE.md Working with Minified JavaScript 章节的空白容忍原则。逐锚点文件解析_resolve_anchor_file补丁生态最大的结构性变化是主进程代码分割。历史轨迹app-asar.sh 注释记录3.x 之前整个主进程在.vite/build/index.js1.19367.0代码分割为 stub 内容哈希主 chunkindex.chunk-hash.js1.26832.0核心进一步溶解——index.js变成 190 KB 的文件require()83 个 chunk分属两个 chunk 家族index.chunk-*和index2.chunk-*托盘锚点留在了index.js自身。因此单一主 JS 文件概念已死_resolve_anchor_file改为对整个.vite/build树用grep -rlPz搜锚点的完整形状不是独特字符串断言恰好命中一个文件零个或多个都硬报错——零个可能是上游重构或删除多个是锚点不够紧有诱饵1.26832.0 上pop-up-menu字面量出现在两个 chunk只有一处带setAlwaysOnTop调用。-z把每个文件当一条记录使锚点里的\s*可以跨行避免美化文件的多行换行导致误报锚点缺失。Repack 不变量与 bwrap daemon 落位Repack 时patch_app_asar先从已交付的app.asar.unpacked树推导 unpack 文件集合asar pack只接受一个--unpack表达式所以所有路径折叠进单个花括号 globrepack 后再对比集合一旦与上游集合发散原生 helper 被内联或丢失即构建失败——这保证上游原生 helper 不会静默内联。patch_cowork_bwrap激活时Node daemon cowork-vm-service.js 被复制到resources/即process.resourcesPath刻意放在 asar之外child_process无法 exec asar 内的脚本且放外面使 repack 不变量钉死在上游集合上。该文件默认惰性只有用户以COWORK_VM_BACKENDbwrap启动才生效。五个存活补丁的实战语义对应 patching-minified-js.md 的survivor candidates列表逐个看它们补偿的真实 Linux 缺口补丁补偿的缺口状态patch_quick_windowElectron-on-KDE 陈旧焦点官方 bundle 隐藏后不调用blur()isFocused()返回陈旧true存活KDE 门控patch_org_plugins_path上游平台 switch 没有linux分支MDM 组织插件在 Linux 上不可用存活已上送上游patch_virtiofsd_probe上游只从两条路径加一个 Ubuntu-22 专用 bundled fallback 解析 virtiofsdArch/Debian/Pop 上完整 KVM 栈被误报requires QEMU#771/#772存活已上送上游patch_cowork_bwrap无 KVM/vhost-vsock 宿主ChromeOS Crostini的 opt-in bubblewrap Cowork 后端存活全部分支受COWORK_VM_BACKENDbwrap门控patch_tray_icon_env_overrideCinnamon 深色面板 GTK 仍报浅色shouldUseDarkColors启发式选错 PNG#604存活CLAUDE_TRAY_USE_DARK_ICON穿透以 quick-window.sh 为例看补丁的工程形态。第一部分解析setAlwaysOnTop(!0,pop-up-menu)的完整调用形状而不是只锚pop-up-menu动态提取压缩变量名quick_var然后在||VAR.hide()的短路语义里插入(DE_CHECK?(VAR.blur(),VAR.hide()):VAR.hide())——DE_CHECK是(process.env.XDG_CURRENT_DESKTOP||).toLowerCase().includes(kde)门控到 KDE因为 GNOME/Ubuntu 上blur()会回归 Quick Entry#393。第二部分在[QuickEntry] Creating new chat with submit_quick_entry日志字面量后 1500 字符窗口内匹配FOCUS_CHECK()||WIN.show()把可见性检查替换为 KDE 门控的isVisible()版本注意注释强调替换串用字符串拼接而非replace()——捕获的句柄可能含$会被 JS 替换 DSL 重新解释patching-minified-js.md 的$1/$陷阱。补丁脚本本身贯彻了幂等性grep -qF ${quick_var}.blur(),${quick_var}.hide()检查是否已打已打则静默跳过。启动器Linux 环境修复层逐项拆解scripts/launcher-common.sh 被所有 launcher source承担全部环境修复。核心设计原则是LAUNCHER POLICY — opt-in onlylauncher-common.shv3.0.0 之后包里的 app 就是 Anthropic 官方 Linux 构建因此启动器不得传任何会遮蔽官方代码路径的默认 flag——窗口框架、标题栏、密码存储、feature flags 全部交给官方。每个保留下来的默认 flag 都要对具体的 Linux 环境缺口自我辩护tools/chromium-switch-smoke.sh 在开关列表漂移时让 CI 失败。显示后端CLAUDE_USE_WAYLAND 三态detect_display_backend实现 Wayland/X11 选择默认Wayland 会话下走 X11/XWayland保证上游globalShortcutQuick Entry 的 CtrlAltSpace通过 X11 key grab 继续工作CLAUDE_USE_WAYLAND1强制原生 Wayland全局快捷键改走 XDG GlobalShortcutsPortal修复 GNOME ≤49GNOME 50 / xdg-desktop-portal ≥1.20 仍被上游阻塞——Electron/Chromium 从不调用宿主Registry.Registerapp-id 握手见 wayland-global-shortcuts-portal.mdCLAUDE_USE_WAYLAND0强制 XWayland跳过自动探测unset按合成器自动探测。唯一被自动强制到原生 Wayland 的是Niri它没有 XWaylandX11 后端根本无法启动#226Sway/Hyprland 的 wlroots portal 没有 GlobalShortcuts 后端保持 XWayland 默认。XDG_CURRENT_DESKTOP可能是冒号分隔如niri:GNOME所以用*niri*glob 子串匹配而非精确比较。GPU 崩溃粘性恢复_previous_launch_hit_gpu_fatal单遍、常量内存扫描 launcher 日志#747识别上一会话是否命中 Chromium 的两条崩溃签名GPU process launch failed/GPU process isnt usable. Goodbye.。恢复的关键是粘性一次--disable-gpu恢复启动本身不再产生 GPU 输出若仅凭崩溃签名判定会在 N2 次启动重新开启 GPU永久硬件损坏下反复崩溃/工作/崩溃。所以启动器自己的 disabling GPU 标记也算触发条件一旦触发保持恢复。CLAUDE_DISABLE_GPU0是重新测试硬件加速的逃生口。XRDP 自动关 GPUbuild_electron_args里通过XRDP_SESSION环境变量和loginctl show-session ... -p Type检测 xrdp 会话#319远程会话无 GPU 加速开启合成会渲染空白窗口。注意刻意不pgrep xrdp-sesman——该 daemon 在本地会话宿主上也常驻运行。单一 --enable-features 开关Chromium 只认命令行里最后一个--enable-features开关所以原生 Wayland 分支累积的UseOzonePlatform、WaylandWindowDecorations、GlobalShortcutsPortal全部并入一个逗号连接的开关launcher-common.sh并同时追加--ozone-platformwayland、--enable-wayland-ime、--wayland-text-input-version3且导出GDK_BACKENDwayland防止系统级GDK_BACKENDx11静默切断 GTK 与 Wayland 合成器的连接。密码存储与沙箱--password-store仅在用户设置CLAUDE_PASSWORD_STORE时传递否则官方os_crypt自动检测拥有决定权它会在某些会话故意拒绝弱持久化也不该被启动器默认值遮蔽#593。--no-sandboxAppImage 因 FUSE 约束总是需要deb/nix 在 Wayland 下需要rpm 和 nix 没有 #687 为 deb 安装的 AppArmor userns profile不能安全地默认去掉。CLAUDE_FORCE_SANDBOX1是对称的 opt-in 逃生口。AppImage 还始终带--class$WM_CLASSChromium 忽略--class决定窗口类那是desktopName的活但该 flag 是/proccmdline 的 UI 指纹_claude_desktop_ui_cmdline_matches依赖它区分真正的 Electron UI 进程与各种 helper#647/#652/#779。config-wipe 防护启动器侧的备份轮转backup_user_config是 #768 config-wipe 的patch-zero-clean 主修复。上游配置加载器冷启动读失败时静默回退{}并在下次设置写入时把整个缓存对象序列化覆盖文件——这就是claude_desktop_config.json被清空的机制Cowork storesspaces.json、remote-session-sessions.json、scheduled-tasks.json共享同样的从内存重写形状详见 config-wipe-guard.md。启动器无法修上游写入路径但每次 Electron 启动前把上一会话的好状态旋转备份keep5仅真实变化才轮转且永不阻塞启动。in-band asar guardconfig.sh在争议性审查后保持接线但停用parked因为启动器侧覆盖了 corrupt-JSON / ENOENT / 单坏条目 Zod 全部模式而config.sh的 CFG-1 锚点 miss 会返回非零。autostart 自愈heal_autostart_entryAUTO-1处理Run on startup官方 app 写入的 XDG autostart 条目Exec指向裸 Electron ELFAppImage 下是易腐的/tmp/.mount_claude*路径登录启动会绕过全部启动器策略。每次启动把Exec重写到 launcher 路径上游的 is-enabled 检查只读文件存在性和Hidden/X-GNOME-Autostart-enabled从不读 Exec 内容所以这个自愈对设置开关是安全的。退出清理链cleanup_after_electron_exit顺序执行清理孤儿 cowork daemon其 LevelDB 锁和 Unix socket 会让新启动静默退出或挂起→ 清理陈旧 desktop helpers → 清理陈旧 SingletonLock锁是hostname-PID符号链接PID 会被回收所以 cleanup_stale_lock 额外校验锁 PID 的 exe 路径确实含claude-desktop→ 清理陈旧 cowork socket。UI 进程识别用--classcmdline 指纹而非pgrep -f claude-desktop后者会匹配 launcher 自身 bash、僵尸进程和 cowork daemon。环境变量 allowlistload_launcher_config从${XDG_CONFIG_HOME:-~/.config}/claude-desktop-debian/environment读取KEYvalue行——.desktopExec 行无法携带每用户环境这个文件补上缺口。只有固定的 allowlistCLAUDE_USE_WAYLAND、CLAUDE_PASSWORD_STORE、CLAUDE_GTK_IM_MODULE、CLAUDE_DISABLE_GPU、CLAUDE_TRAY_USE_DARK_ICON、COWORK_VM_BACKEND、COWORK_NODE_PATH会被采纳文件本身永不作为 shell 执行已设置的环境变量优先。日志纪律log_message有一条硬规则LOG-1绝不持久化 OAuth 授权码。登录重定向重启会带claude://login/...?codesecret参数会同时出现在 Arguments: 和 Executing: 行log_message 写日志前把claude://logintoken 的查询串剥掉替换为redacted。log_session_env则会记录影响显示/输入决策的会话变量块XDG_SESSION_TYPE、WAYLAND_DISPLAY、GTK_IM_MODULE、CLAUDE_USE_WAYLAND等使 bug 报告无需来回 dump 环境即可推理#548。与压缩 JavaScript 打交道的工程纪律CLAUDE.md 的 Working with Minified JavaScript 章节浓缩自 patching-minified-js.md是维护长期补丁套件对抗积极重压缩上游的完整教训库。核心规则永远用正则修改 JS补丁位于scripts/patches/*.sh。变量/函数名每次发布都变锚点选字面量开发者字符串日志消息、IPC 通道名、属性名而不是压缩标识符。美化代码的空白 ≠ 压缩字节的空白。minified 是oe.nativeTheme.on(updated,(){beautified 是oe.nativeTheme.on(updated, () {。模式必须两者都扛得住。sed 用-E以支持分组/或。动态提取变量名而非硬编码。quick-window 的经典例子quick-window.shquick_var$(grep -oP [$\w](?\.setAlwaysOnTop\(\s*!0\s*,\s*pop-up-menu\)) $index_js)正则里处理可选空白坏例子假设无空格好例子用\s*。六类致命陷阱速查陷阱教训出处\w不匹配$用[$\w](\w)对$e会捕获不存在的e静默产出损坏 JSPR #253/#421/#555美化假阴性在 build-reference/ 上测通过 ≠ 对压缩字节通过必须闭环到 shipped bytesPR #555引号不稳定1.26832.0 换压缩器字符串字面量从双引号整体翻转为反引号模板锚点永远用引号类[]1.26832.0 全套件断锚替换串转义sed 的/\1、JS 的$1/$/$$各有替换 DSL注入片段含$时用字符串拼接而非replace()quick-window Part 2幂等性重跑必须字节一致守卫生效的关键是重打到 post-rename 名称、负向 lookbehind、显式code.includes(...)检查PR #436 双跑 diff代码分割index.js从整包变 stub → 变 190KB 的 83-chunk require 器按锚点解析文件断言恰好一个1.19367.0 / 1.26832.0验证配方patching-minified-js.md 给出了 SHA-256 钉死的假设验证流程从 official-deb.sh 抽取OFFICIAL_APT_BASE/OFFICIAL_DEB_POOL_AMD64/OFFICIAL_DEB_SHA256_AMD64下载、校验、artar解包、asar extract然后对压缩字节跑node -e正则。NO MATCH即正则错误验 SHA 防御过期 URL pin 或服务端换包。端到端验证四层build 日志grep -E Active asar patches|WARNING:健康构建无WARNING:→node --check语法有效性 → 静态 grep shipped asar 的标记_check_upstream_tripwires是这层的现存形态→ 启动 AppImage 验证运行时效果。搭建 build-reference官方 .deb 获取与美化CLAUDE.md 给出完整五步Windows 安装器配方已随 v3.0.0 rebase 死亡Prerequisitessudo apt install binutils wget xz-utils zstd nodejs npm npm install -g electron/asar prettierStep 1下载 pinned 官方 .deb。版本、pool 路径、SHA-256 全部 pin 在 scripts/setup/official-deb.sh 的OFFICIAL_DEB_*当前 pin 为 1.52386.6amd64/arm64 各一条带 SHA-256source ../scripts/setup/official-deb.sh 2/dev/null || true wget -O claude-desktop.deb \ https://downloads.claude.ai/claude-desktop/apt/stable/$OFFICIAL_DEB_POOL_AMD64 echo $OFFICIAL_DEB_SHA256_AMD64 claude-desktop.deb | sha256sum -c要看 pool 最新条目则解析 Packages 索引——resolve_official_deb干的就是这件事awk -v RS按段落解析Version/Filename/SHA256sort -V取最新仅用于 CI 的 check-claude-version 与 doctor 漂移检查构建本身永远用 pin。Step 2ar tar 解包不依赖 dpkgrpm 系与 Arch 宿主也能构建。注意 data 成员两种压缩都出现过ar t查看.tar.xz用-J、.tar.zst用--zstd_extract_deb_member处理 zst/xz/gz/plain 全部情况。Step 3/4asar extract prettier 美化。1.19367.0 起主进程代码分割美化 glob 覆盖所有 chunknpx prettier --write app-extracted/.vite/build/*.js main_chunk$(grep -oP require\(\./\Kindex\.chunk-[^]\.js(?\)) \ app-extracted/.vite/build/index.js) npx prettier --write app-extracted/.vite/build/$main_chunkFinal structurebuild-reference/app-extracted/下.vite/build/主进程 stub content-hashed chunk 各 preload、.vite/renderer/、node_modules/ant/claude-native/Linux 上真实存在的 Rust 原生绑定与package.json。注意对美化输出验证过的模式应用到 shipped 压缩字节时要用空白容忍形态。发布与分发版本管理与 tag 格式版本由两个 GitHub Actions 仓库变量管理非文件REPO_VERSION项目自身版本手动gh variable set REPO_VERSION --body X.Y.Z提升和CLAUDE_DESKTOP_VERSION上游 Claude Desktop 版本由check-claude-versionworkflow 检测到新上游发布时自动更新。tag 格式v{REPO_VERSION}claude{CLAUDE_DESKTOP_VERSION}推送 tag 触发 CI 发布构建。不要手工在分支上跑 check-claude-versionauto-tag 会用当前 staged 的REPO_VERSION直接切一个发布。构建工件单个跨架构build.yml从ubuntu-latest经--arch输入产出全部格式host-vs-target 陷阱见 cross-build-host-vs-target.mdclaude-desktop-unofficial_VERSION_{amd64,arm64}.deb我们的 deb改名后与官方包并排安装v3.0.0 起官方包是claude-desktopclaude-desktop_1.16000.0-1_all.debtransitional apt 包把旧claude-desktop安装迁移到claude-desktop-unofficial冲突元数据版本限定Conflicts:/Replaces: claude-desktop ( 1.16000)永不匹配官方 ≥1.17377.1claude-desktop-unofficial-VERSION-1.{x86_64,aarch64}.rpm含Obsoletesclaude-desktop-unofficial-VERSION-{amd64,arm64}.AppImage CI 的.zsyncresult/Nix 构建输出symlinkgitignored派生目前是 stubAPT/DNF 分发架构worker/src/worker.js 是 Cloudflare Workerpkg.claude-desktop-debian.dev元数据InRelease、Packages、KEY.gpg、repodata/*透传到gh-pages分支二进制请求/pool/.../*.deb、/rpm/*/*.rpm302 到对应 GitHub Release 资产——这样.deb/.rpm完全不进gh-pages绕开 GitHub 每文件 100 MB push 上限。配套 worker/wrangler.tomlroute、custom_domain true、deploy-worker.ymlworker/**变化即部署与每日心跳apt-repo-heartbeat.yml失败自动开跟踪 issue。完整重定向链、http-scheme-downgrade 坑、凭据归属、心跳 runbook 见 apt-worker-architecture.md。新增包格式的 CI 纪律CLAUDE.md 的 Adding New Package Formats 章节浓缩了血泪教训研究目标格式约束如 RPM Version 不能含连字符、搜索既有 CI 实现、GPG 在无 TTY 环境需要--batch/--yes、多 job 写同一分支要needs:或git pull --rebase重试、CI 成功后必须在干净系统上实测 README 安装命令。调试工作流与常见陷阱检查运行中 app 的代码AppImage 运行挂载在/tmp/.mount_claude*mount | grep claude可提取运行中的 asar 检查1.19367.0 后主进程代码分割grep要跨全部 chunkindex.js是 stub主进程锚点在index.chunk-hash.js。DBus/托盘状态用gdbus call查询org.kde.StatusNotifierWatcher的RegisteredStatusNotifierItems列出已注册托盘图标org.freedesktop.DBus.GetConnectionUnixProcessID反查连接属主进程。日志与数据位置路径用途~/.cache/claude-desktop-debian/launcher.log启动器日志旋转超 5 MiB 轮转保留 2 份rotate_log_file~/.config/Claude/App 数据userData~/.config/Claude/logs/App 日志~/.config/Claude/SingletonLock单实例锁hostname-PID符号链接~/.config/claude-desktop-debian/environment持久化 launcher 环境变量allowlist~/.cache/claude-desktop-debian/config-backups/backup_user_config的配置备份轮转Common Gotchas 速查.zsync文件仅用于增量更新可忽略杀 app 要杀全部 Electron 子进程pkill -9 -f mount_claude起不来先查陈旧锁~/.config/Claude/SingletonLock构建需要 Node.js脚本会按 HOST 架构自行下载跨构建陷阱见 learning版本 pin提交scripts/setup/official-deb.sh前确保分支带最新 pin——gh variable get CLAUDE_DESKTOP_VERSION是源真值grep -oP ^OFFICIAL_DEB_VERSION\K[^]查分支 pincurl Packages indexsort -V | tail -1查官方 pool 当前服务版本data.tar压缩格式在 zst/xz 间变化_extract_deb_member已处理绝不硬编码一种。Bash 代码风格与文档规范所有 Shell 脚本遵循 bash_styleguide.md源自 YSAP缩进用 Tab、行 ≤80 字符URL 和长正则例外、条件用[[ ]]、命令替换用$(...)、字面量单引号/展开双引号、变量小写UPPERCASE 仅常量/export、函数内用local。反模式清单每条都有历史事故背景不要set -e它与$(...)捕获和函数返回值交互恶劣项目历史上调试过足够多的静默退出显式cmd || handle_err。不要eval用数组组装 argvcmd ${args[]}eval击败所有解析器是 SC2046 永久磁铁。不要 POSIX[ ... ]POSIX[会误解析未加引号的展开。不要反引号不嵌套、贴进 PR 评论与 markdown 冲突。不要硬编码工作目录构建期脚本用$work_dir由build.sh设置硬编码路径会静默破坏 AppImage 构建其布局与 deb/rpm 不同。不要if cmd; then true; else false; fi脚手架直接cmd退出码已经在那里。不要向 baseline 文件追加来压掉 shellcheck修根因真误报用带注释的按行# shellcheck disableSCXXXX。Lint 纪律push 前shellcheckshell与actionlintGitHub Actions workflows必过/lint技能可手动检查。文档规范的核心每页顶部一句陈述句 代码块/列表无 In this guide we will explore… 前言docs/一律小写 kebab-case 文件名顺序归属 docs/index.mdwalkthrough 用真实领域名词patches、the launcher、the worker、app.asar、the doctor surface而非foo/bar子系统深潜进 docs/learnings/方向决策进 docs/decisions.mdADR 格式D-NNN 编号被推翻时标Superseded并回链troubleshooting 标题用字面症状## Black screen on Fedora KDE under Wayland而非散文式标题CHANGELOG 遵循 Keep a Changelog 1.1.0。GitHub 工作流约定所有交互走ghCLI分支fix/123-description/feature/123-descriptionissue 引用#123/Fixes #123。调查旧 issue 时先看 issue 创建时的代码状态gh issue view 123 --json createdAt→git log --oneline --until...→git show commit:path很可能已修复并可引用具体 commit。AI 署名政策PR 描述含完整 attribution 块Generated with [Claude Code]Co-Authored-By% AI / % Human Claude/Human 分工issue/comment 用简化版commit 加Co-Authored-By: Claudetrailer。外部贡献者按合并/修复日期记入 ACKNOWLEDGMENTS.md。结语从速查到源码一条可追溯的工程链CLAUDE.md 的价值在于它不只是规则列表而是把每一条规则都锚定到了具体事故与具体文件patch-zero 契约锚定 app-asar.sh 的active_patches与 AU-1/MB-1 tripwires启动器 opt-in 政策锚定 launcher-common.sh 的build_electron_argsminified-JS 纪律锚定 patching-minified-js.md 与 quick-window.sh版本 pin 锚定 official-deb.sh。任何一个新贡献者人或 AI从本文出发都能沿相对路径追到源码、测试与决策记录验证任何一条结论的真实性——这正是速查 考古设计要达到的效果。【免费下载链接】claude-desktop-debianClaude Desktop for Linux项目地址: https://gitcode.com/GitHub_Trending/cl/claude-desktop-debian创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考