Repository navigation
适配 2.1.26x: bytecode 构建改打常量池,槽位布局改为现场探测 - #1
Merged
Merged
Conversation
上游在版本之间会挪动字符在 logo 槽位间的边界(2.1.261 把 r1E 从 5 列 加到 6 列、r1R 从 1 列减到 0),整行列数不变。原来设计稿按槽位硬编码, 每次上游改动都要跟着改四个 design 文件。 改成设计稿按整行给、打包时按二进制现有的 token 切分重新分配,设计稿 就不必跟着版本走。版本位容量同理改成现场探测 —— 压缩后的变量名长度 决定显示位宽度(["v",ms] 比 ["v",c3e] 窄一格),固定上限 5 会漏判。 同时把上游已删除的显示位降级为提示,并拆掉 problems 的级联失败: 原先任何一个可忽略的缺失锚点都会连坐掉版本号和主题色的整批补丁。
2.1.26x 起 claude 用 bun build --bytecode 编译。二进制里那份 JS 源码文本 还在,但运行时读的是 bytecode 常量池 —— 原来的源码文本补丁能通过锚点计数、 sha1 和 --version 的全部校验,屏幕上却毫无变化,verify 因此是假阳性。 新增 bytecode.py 解析常量池条目(len|flag + hash + chars + 4 字节对齐补 0; 把对齐补位当成终止符会漏掉一半条目),discovery 检测到 @Bun @bytecode 就整体切到常量池通道,verify 跟着切;老版本仍走源码文本通道。 常量池按内容去重带来两个新约束: 设计稿要求同一条条目变成两种图案时直接 报错而不是静默取其一(octopus 的 arms-up r1E 因此对齐 default,与另外三个 设计稿的做法一致);启动画面的版本号与 --version 共用同一条常量,默认跳过, 要改得显式开 rewrite_real_version 并接受 --version 一起变。 顺带补上大 logo 第三行和 HTML 页 logo 两个一直没命中的显示位。
VERSION_MAX=5 是源码通道 ["v",X] 显示位的宽度限制;走 rewrite_real_version 时约束换成「与真实版本等长」(2.1.261 就是 7 字符),沿用旧上限会在校验阶段 就把合法配置拦掉。 同时修掉两处此模式下不成立的提示: 预览的"内部版本常量不动"和 verify 的 "证明内部版本未受影响" —— 开了改写恰恰是两者都会变。
README 原来说"Bun 把 JS 源码原样嵌进去,改那份文本即可" —— 这在 2.1.26x 上会把人引到空转的路上。图标设计指南里硬编码的槽位列数(r1E=5 等)也随 自动探测作废,改成只约束每行总列数,并补上去重导致的变体共用约束。
这些条目走 offset+sha1 模式,按仓库既定约定原文不入库、patch 时从用户 自己的二进制现读现验;desc 里带着旧字符串等于把约定绕过去了。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
在 claude 2.1.261 上,现有 ccskin 会报 7 个锚点问题;更糟的是,即使把问题绕过去让它跑完,
verified=true、sha1 全过、--version正常 —— 启动画面却纹丝不动。根因有两层:
r1E5→6 列、r1R1→0 列),整行列数没变。bun build --bytecode编译。二进制里那份 JS 源码文本还在,但运行时读的是 bytecode 常量池。ccskin 改的是源码文本,对 UI 没有任何影响,
而所有校验都基于源码文本 —— 所以 verify 是假阳性。
对照实验:同一个二进制,只改常量池里 5 个字符串再重签名,启动画面立刻变;走完整 ccskin 流程改
源码文本,计数和 sha1 全过,屏幕零变化。
改了什么
新增
patcher/bytecode.py—— 常量池条目解析与精确寻址。条目布局:discovery.build_patches检测到// @bun @bytecode就整体切到常量池通道,老版本仍走源码文本通道,自动判定无需配置。
verify也一并切到常量池 —— 否则它继续数源码文本,还是假阳性。槽位布局改为现场探测:设计稿按整行给,打包时按二进制当前的槽位边界重新切分。四个 design
文件因此不用再跟着版本改。版本位容量同理(压缩后的变量名长度决定显示位宽度,
["v",ms]比["v",c3e]窄一格,原来固定上限 5 会漏判)。顺带修好两个一直没命中的显示位:大 logo 第三行(和小 logo 用的是不同常量)、HTML 页 logo
(池里是一条 26 字符含换行的整串)。另外把上游已删除的显示位降级为提示,并拆掉
problems的级联失败 —— 原先任何一个可忽略的缺失锚点都会连坐掉版本号和主题色的整批补丁。
去重带来的两个新约束
常量池按内容去重,一条可能被多处共用:
default与arms-up共用r1E,设计稿给它们不同图案物理上做不到→ analyze 直接报错并指出是哪两个槽位,不静默取其一。
octopus.toml的 arms-up 因此对齐default(另外三个设计稿本来就是这么做的)。
--version共用同一条常量,没法只改显示 → 默认跳过。愿意接受连带的话配
rewrite_real_version = true(新版本号需与真实版本等长)。名字不受影响:
--version里的(Claude Code)和机器标识claude-code都是另外的条目。验证
TestBytecodePool/TestPoolChannel,合成 bytecode bundle覆盖两种槽位布局。做过变异验证:关掉常量池通道挂 9 个,退回逐槽位打包挂 4 个,
退回锚点分级挂 1 个。
主题色 SGR 命中 12 次、原橙色 0 次,
--version仍输出真实的2.1.261 (Claude Code)。patches/2.1.261.toml。定义文件现在可读多了(UTF-16 存成文本 +enc字段),且沿用 offset+sha1 模式,不写入原内容。
测试计划
python3 -m unittest discover -s tests(61 passed)analyze→patch --apply→sign→verify--version输出真实版本rewrite_real_version = true变体单独验证源码通道的既有测试全过,但没做真机复验