# aarch64_skill **Repository Path**: windstarry/aarch64_skill ## Basic Information - **Project Name**: aarch64_skill - **Description**: 用于检测aarch64环境和编译的skill - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-10 - **Last Updated**: 2026-10-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # aarch64_skill 掌机移植 / 嵌入式 aarch64 相关可复用 Skill 集合,按分类存放。 > 注:本仓库也兼收**通用自动化类 Skill**(如金山文档 AirScript 签到框架),不限于 aarch64;统一按分类目录组织,目录名即 Skill 名。 ## 目录结构(分类) ``` aarch64_skill/ ├── README.md ├── build/ # 交叉编译 / 构建类 │ ├── aarch64-portmaster-build/ # 用 portmaster-builder:aarch64-latest 镜像做 aarch64 交叉编译 + PortMaster 打包衔接(含 MSYS 路径改写、镜像内无 qemu、产物溯源三条实测坑) │ │ ├── SKILL.md │ │ └── references/ │ │ └── portmaster-launch-script.md │ └── portmaster-new-port/ # PortMaster-New 新端口 PR 合规向导:目录骨架、port.json、启动脚本、gameinfo.xml、拒收自检与测试矩阵 │ ├── SKILL.md │ └── references/ │ ├── portmaster-conventions.md │ └── portmaster-rejection-checklist.md ├── runtime/ # 运行期 / 部署 / 启动 / 库策略 / 图形栈 │ ├── handheld-port-test/ # 掌机测试设备(ROCKNIX/EE4.7)连接、部署、日志分析一体化 │ │ ├── SKILL.md │ │ ├── references/ │ │ │ ├── client-ui-element-offset.md │ │ │ ├── deploy-launch-and-reseal.md │ │ │ ├── device-credentials.md │ │ │ ├── device-profiles.md │ │ │ └── fake-jni-text-rendering.md │ │ └── scripts/ │ │ ├── device_connect.py │ │ └── nx_reseal.py │ └── port-egl-surface-shim/ # 移植后 EGL/GL 画面栈排障:window-surface 垫片修复 + 32 位入口名软链农场 │ ├── SKILL.md │ ├── references/ │ │ ├── shim-skeleton.c │ │ ├── egl-surface-churn-case.md │ │ └── armv7-provider-name-farm-case.md │ └── scripts/ │ └── probe-egl-provider.c └── tools/ # 通用自动化 / 辅助工具 / 调试 / 校验脚本 ├── android-handheld-port-triage/ # Android 移植后按症状分流排障(登录中和 / 菜单关不掉 / 没声音 / 没手柄)+ pg_diag 诊断工具包 │ ├── SKILL.md │ ├── references/ │ │ ├── general-triage.md │ │ ├── menu-freeze-deadlock.md │ │ └── reverse-engineering-gotchas.md │ └── assets/pg_diag_toolkit/ │ ├── README.md │ ├── pg_diag.c │ └── pg_diag_stub.S ├── android-handheld-port-workflow/ # Android APK → 掌机跑通的端到端自主移植工作流(参数槽 + 阶段阶梯 + 案例库优先) │ ├── SKILL.md │ ├── references/ │ │ ├── case-library-map.md │ │ ├── engine-branches.md │ │ ├── porting-parameters.md │ │ └── setup-guide.md │ ├── scripts/check_environment.py │ └── skill-dependencies.json ├── install-local-skill-repo/ # 从本仓库这类分类目录仓库把 Skill 扁平装进用户 skills 目录并验证 │ └── SKILL.md ├── kdocs-airscript-signin-framework/ # 金山文档 AirScript 1.0 聚合签到框架(默库范式) │ ├── SKILL.md │ └── scripts/ │ ├── trae-checkin-airscript.js │ ├── workbuddy-checkin-airscript.js │ ├── ydyp-checkin-airscript.js │ ├── qorder-checkin-airscript.js │ ├── qorder-local-verify.js │ ├── qorder_probe_campaigns.py │ ├── extract_trae_cred.py │ └── extract_qoder_cred.py ├── nextos-commit-publication-gate/ # NextOS 两道发布门禁的调用姿势与三档判读(本机永远非 0,别把 exit 读成通过) │ └── SKILL.md ├── port-repo-precommit-audit/ # 端口仓库提交前审计:垃圾/ignore → 显式暂存 → 三门禁 → ANALYSIS.md → 提交信息 │ └── SKILL.md ├── port-runtime-lib-bundling/ # 运行期缺库诊断与捆绑(GLIBC / ffmpeg soname)+ 解释器直调手法 │ ├── SKILL.md │ └── references/ │ ├── lib-sources.md │ └── machismo-newpal-case.md └── portmaster-standard-sh/ # PortMaster 启动脚本标准骨架、环境变量纪律与 gptk 置空用法 ├── SKILL.md └── references/ ├── gptk.md └── skeleton-native-gamepad.sh ``` > 目录树中 `build/`、`runtime/` 为 aarch64 掌机移植专用;`tools/` 兼收与掌机无关的通用自动化 Skill。 ### 分类约定 | 分类目录 | 用途 | 已收录 | | --- | --- | --- | | `build/` | 交叉编译、构建流水线、镜像内编译、新端口 PR 合规 | aarch64-portmaster-build、portmaster-new-port | | `ports/` | 具体游戏 / 应用移植配方(预留) | — | | `runtime/` | 运行期、部署、启动脚本、库策略、图形运行期(EGL/GL) | handheld-port-test、port-egl-surface-shim | | `tools/` | 通用自动化 / 辅助工具 / 调试 / 校验脚本,缺库诊断与库捆绑、启动脚本标准写法、移植工作流与按症状排障、提交前门禁判读、Skill 安装 | android-handheld-port-triage、android-handheld-port-workflow、install-local-skill-repo、kdocs-airscript-signin-framework、nextos-commit-publication-gate、port-repo-precommit-audit、port-runtime-lib-bundling、portmaster-standard-sh | 新增 Skill 时,按用途放入对应分类目录,目录名即 Skill 名(kebab-case),其下放置 `SKILL.md` 及 `references/`(如有)。 ## 已收录 Skill 说明 ### build/aarch64-portmaster-build 在本地 Docker 镜像 `ghcr.io/monkeyx-net/portmaster-build-templates/portmaster-builder:aarch64-latest` 内对 C/C++ 源码做 aarch64(ARM64)交叉编译,并衔接 PortMaster 掌机打包。 覆盖 CMake / autotools / Makefile 三套配方、产物校验(file/readelf -d)、libs/ 打包与官方启动脚本规范、 ROCKNIX 不捆绑 Debian 运行库的实机坑。详见 `build/aarch64-portmaster-build/SKILL.md`。 **v1.1.0(2026-10-09 本机实测,两条原命令被证伪并替换)**: - **Git Bash 调 docker 必带 `MSYS_NO_PATHCONV=1 MSYS2_ARG_CONV_EXCL='*'`**。原步骤 3 的 `-w /src` 不带变量时, MSYS 把参数改写成宿主路径,docker 直接报 `the working directory 'D:/Programs/Git/src' is invalid`;带变量后容器内 `pwd` = `/src`。 - **镜像内没有 `qemu-aarch64`**(`command -v qemu-aarch64` 无输出,`/usr/bin`、`/usr/local/bin` 无任何 qemu 入口)。 原步骤 2/3 写的"`qemu-aarch64 ./bin` 冒烟"是失效命令,已替换为**在容器内直接执行产物**:容器本身是 arm64 平台 (`uname -m`=aarch64、`cc -dumpmachine`=aarch64-linux-gnu),amd64 宿主由 Docker binfmt 模拟,实测 `cc` 编出的 `ELF 64-bit ... ARM aarch64` 在容器里直接跑出 `smoke ok`。 - **新增步骤 5.1 产物溯源门禁**:`file`/`readelf` 只判架构不判新旧。后台或并行构建写同一个产物路径时, 先到的那次完成通知可能把后一次正在写的中间态传上去,实机表现为功能静默缺失、测试步骤无输出。 门禁用 `find src -newer "$BIN"` 断言 + `md5sum` 指纹,并要求并行构建各占独立输出目录、只认对应那一次构建的通知。 ### build/portmaster-new-port 按照 **PortMaster-New** 官方约定,从零搭出一个**不会被拒收**的新端口提交:目录骨架(`portname/` 下 `port.json`、`README.md`、`screenshot.jpg`、`gameinfo.xml`、`cover.jpg`、`Port Name.sh`,端口文件与许可证放同名内层 `portname/licenses/`)、`port.json` 字段、启动脚本铁律与 licenses 脚手架。 三条核心原则最容易踩:**用现有端口作模板**(选近期、人气高、同类型 native/Godot/Ren'Py/mono,不要从零发明布局);**极度克制**(脚本比同类现有端口明显更长就会被拒,删掉版本迁移、校验器和 PortMaster 已处理的防御性重实现,每行非标准代码都要能解释);**不定义多余环境变量**(默认行为能跑就别加)。规范以 `portmaster.games` 的 Contribute 文档为准,并强烈建议本地克隆 `PortsMaster/PortMaster-GUI` 对照 `runtimes/runtimes.json` 与 `$ESUDO`、`$controlfolder`、`get_controls`、`bind_directories`/`bind_files` 的来源;未克隆属于降级,**提交前必须**再对照仓库内同类端口核对一遍结构,缺这一步不得提交。 工作流七步:准备参考模板 → 目录布局 → 关键文件要点 → 启动脚本铁律 → 提交前合规自检 → 测试矩阵 → Git 工作流。拒收红线与写法对照拆在 `references/portmaster-conventions.md`、`references/portmaster-rejection-checklist.md`。v1.0.0,SKILL.md 99 行。 ### runtime/handheld-port-test 掌机测试设备(ROCKNIX / EmuELEC 4.7)的连接、部署与日志分析一体化辅助。连接时设备 IP 必须运行时传入(绝不写死), 按系统自动选凭据(rocknix→root/rocknix、ee47→root/emuelec);把游戏资源与 `.sh` 部署到 `roms/ports/`(支持全量 / 增量上传); 可从设备拉取 `log.txt` 回本地分析;提供 `ldd` 缺库门禁与无头启动探针做冒烟验收。统一走 paramiko SFTP,无需 sshpass。 已知设备底细(SoC/GPU、64 位与 32 位图形库实况、只读目录、板载工具、已证伪/已确认结论)查 `references/device-profiles.md`, 连设备前先按主机名核 IP(IP 是 DHCP 变的,档案里的数值只当索引)。 详见 `runtime/handheld-port-test/SKILL.md`,辅助脚本 `runtime/handheld-port-test/scripts/device_connect.py`(`nx_reseal.py` 处理 nxbootstrap 密封启动脚本的重封)。 **v1.3.0(2026-10-07 更正)**:推翻旧结论「ee47 固件 32 位 SDL2 是精简构建、32 位端口必须自带完整 SDL2」。 实机证据:胧村正(armv7 guest)**包内零自带 SDL2**,用固件 `/usr/lib32/libSDL2-2.0.so.0.2800.5`(2.28.5)+ `SDL_VIDEODRIVER=kmsdrm` 游戏内约 30 fps 出帧(`[PROFILE] guest=eboot.bin fps=26~34`,进程持有 `/dev/dri/card0` + `/dev/mali0`)。 当初误判来自 PortMaster 探针 `sdl_resolution.armhf`——它自身失败与驱动支持度无关,**不能当判据**。 32 位端口真正缺的是 EGL/GLES provider 的**顶层入口名**(`/usr/lib32/libEGL.so.1` 固件里不存在), 补法是启动脚本在 tmpfs 建软链农场并前置进客端库闭包(见档案 §2.3 / §2.6); 曾怀疑的「armv7 依赖闭包不完整、缺 X11/wayland-client/libdrm/libgbm」一并证伪。 **v1.4.0(结构)**:正文超长(578 行)已拆分。原第 11/12/13 节移出为三份深度手册 (`deploy-launch-and-reseal.md`、`fake-jni-text-rendering.md`、`client-ui-element-offset.md`), SKILL.md 第 11 节只留「症状 → 文件 → grep 锚点」对照表;原第 14 节顺位改为第 12 节。 拆完 SKILL.md 380 行(规范上限 500),逐行核对无内容丢失。 **v1.5.0(2026-10-07 归因订正)**:把 v1.3.0 那条模糊的"探针自身失败与驱动支持度无关"换成实测根因—— 固件 32 位 SDL2 编的是 `SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM="libmali.so"`,它要 `dlopen("libmali.so")` 拿 GBM 符号,而 `/usr/lib32` 顶层既无 `libmali.so` 也无 `libgbm.so.1`(blob 只在 `/usr/lib32/libmali/`), 于是 `KMSDRM_Available()` 返回假:`sdl_resolution` 的 `not available` 是**正确观测、错误推论**。 档案 §2.3 补齐胧村正的两条独立 fatal(`GXM_FATAL: eglQueryDevicesEXT is missing` = 缺名字、 `GXM_FATAL: provider-nominal-only` = 端口里放了固件库的**真文件拷贝**)与 tmpfs 软链农场的五个要点, 并把 `LD_PRELOAD` 隔离链写准:继承的 `BIN_PRELOAD`/`LD_PRELOAD`/`SDL_DYNAMIC_API` 在最早边界就被 `builtin unset`(清不掉即 readonly 才 fatal + `exit 125`),`port-env.sh` 里设的会被取消导出、 只在拉起客端时回注一次,且 SDL override 过滤器拒绝 SDL1/2 同名库。手法本身收录进 `port-egl-surface-shim`。 ### runtime/port-egl-surface-shim 移植版**进程能起、日志走到 runtime、但屏幕没画面**(或以 134/139 退出)时的 EGL/GL 画面栈排障与修复手法。四类硬伤各有判据:SDL2 KMSDRM 把全屏变更推迟到首次 `SDL_GL_SwapWindow`、其间销毁重建 window surface,使宿主缓存的句柄失效(`EGL_BAD_SURFACE 0x300d` → 134);`LD_PRELOAD` 垫片自身导出同名符号,`dlsym(provider, name)` 反向命中垫片 → 无限递归;provider 只经自己的 `eglGetProcAddress` 暴露 `*_EXT`/EGL 1.5 入口,查不到就伪造 `EGL_NO_DISPLAY`,把 SDL 推到 `eglGetDisplay(gbm_handle)` → libmali 的 **X11 分支** → 无 X 服务器 SIGSEGV(139);**32 位 armv7 guest 缺的是库名不是句柄**——固件 32 位 SDL2 按无版本号 `libmali.so` 去 dlopen(`GXM_FATAL: eglQueryDevicesEXT is missing`),而端口目录里的固件库**拷贝**过不了 nxgl 的 provider 身份门禁(`GXM_FATAL: provider-nominal-only`),此时 `LD_PRELOAD` 垫片既被框架隔离又必然踩门禁,正解是启动脚本在 tmpfs 建**指向固件 blob 的软链农场**并前置进客端库闭包。 核心流程是**取证先于动手**:设备上通常没有 `nm`/`readelf`,用 `scripts/probe-egl-provider.c`(动态链接的 dlopen/dlsym/getproc 双通道探针)实测每个入口点的可达方式;再写最小 pass-through 垫片(**只改句柄名、不改语义**,日志必须限流);用建模 provider 的单机断言 harness 在上机前证明 churn 扛得住(要点是 `*_EXT` 答案的 `dladdr` 落在真 provider 而非垫片自身);上机后按计数器(`EGL_BAD_SURFACE`/`Can't load EGL`/`NXU0003`=0、无 134/139)+ kmsgrab 连拍 10 帧逐帧哈希不同 验收;最后按 nxbootstrap 密封链重封上线——**generation 一旦 `active`、健康回执拿到,未重封的启动脚本改动会被无声还原**。 **v1.0.0(2026-10-07 实机验证)**:Bloodborne PSX(`bbpsx`,nxbootstrap 0.8.29 + UE4 客端)在 EmuELEC 4.7 / Mali-G52 / 1024x768 上从 134 一路修到标题画面正常,harness 23/23 PASS,日志体积 39MB → 18~31KB。完整证据链见 `runtime/port-egl-surface-shim/references/egl-surface-churn-case.md`;垫片实现模式(可独立编译,`-Wall -Wextra` 零告警)见 `references/shim-skeleton.c`。详见 `runtime/port-egl-surface-shim/SKILL.md`。 **v1.1.0(2026-10-07 收录胧村正)**:新增第四类(也是**唯一不该写垫片**的一类)。判据口诀 **缺名字用软链,缺句柄稳定性用垫片**;SKILL.md 加 §3.5 与两条症状表行,完整案例见 `references/armv7-provider-name-farm-case.md`(设备实测 `/usr/lib32` 顶层无 `libmali.so`/`libgbm.so.1`、 农场实现形状、`GRAPHICS SHIM` 与 fps=26~34 验收判据、为何 `LD_PRELOAD` 会踩 nominal-only)。 ### tools/android-handheld-port-triage Android 游戏(尤其 Clickteam Fusion / Chowdren 系)移植到 EmuELEC / ROCKNIX / PortMaster so-loader 后**行为异常**的排障手册,主体是一棵**症状分流决策树**:登录或 UI 中和、host SDL2 输入与音频桥接、退出和弦、OOM、分辨率各走各路,外加 Fusion 暂停菜单冻结/关不掉的 `schedule_wait` 死锁诊断与 grace+hold 修法。除决策树外还带三段常在走错路线才写得下的内容:**与现有技能的边界**(哪些症状该转 `port-egl-surface-shim`、`port-runtime-lib-bundling`,不重复造轮子)、**核心铁律**、以及 Chowdren 系通用的**调参环境变量速查**,末尾是交付前自测清单。深度手册三份:`references/general-triage.md`、`references/menu-freeze-deadlock.md`、`references/reverse-engineering-gotchas.md`;`assets/pg_diag_toolkit/`(`pg_diag.c` + `pg_diag_stub.S`)是可直接挂进端口的诊断工具包。v1.0.0,SKILL.md 78 行。 ### tools/android-handheld-port-workflow Android 游戏**从解包 APK 到掌机跑通**的端到端自主移植工作流,十二步顺序推进:填参数槽(设备 IP、架构、引擎、案例库路径)→ 环境就绪检查 → 阶段阶梯 → 优先分析哪些文件 → 引擎方向分支 → 案例库优先 → 图形环境 → Android/JNI 依赖检查 → 性能与内存 → 操作纪律 → 停止条件 → 第一轮任务与最终目标。两条纪律撑起整个自治性:**不跨阶段宣布成功**(native 加载、引擎初始化、窗口画面、输入、音频、存档各算一格),以及**只有列出的停止条件才停下来问人**,技术决策不外包给用户。 `skill-dependencies.json` 把 binutils / openssh-client / docker-builder / nextos-framework 四类依赖写成 `capability → checks → setup → verify → degradation` 结构,每条降级都带 `evidence_label`(远程实测拿不到就标「未验证」,不许冒充通过);`scripts/check_environment.py` 按参数槽复核环境。凭据纪律是硬的:设备地址只从参数槽取,密码与私钥不写进任何 Skill 文件或仓库。案例库默认路径是本地 NextOS 仓库副本,缺失时才 clone。v1.1.0,SKILL.md 185 行;只管 Android APK 路线,移植后异常用 `android-handheld-port-triage`。 ### tools/install-local-skill-repo 把**本仓库这类**「分类目录 + 叶子目录名即 Skill 名」的仓库安装/更新到用户级 skills 目录(Windows 为 `C:/Users//.qoder-cn/skills/`)。四步:`find -maxdepth 3 -name SKILL.md` 定位候选 → 校验 frontmatter(`name` 与目录名完全一致、`description` 单行非空且含冒号时要引号)→ 整目录**扁平**复制(带 `references/`、`scripts/`、`assets/`,绝不要留成 `skills/build/`,那样扫描不到)→ 源与目标文件数比对 + 确认可用 Skill 列表里出现新名字。 三条防呆:与内置/插件 Skill 同名时**停下报告不覆盖**;目标已存在且内容不一致时先 `diff -rq` 问方向,**绝不 `rm -rf`** 清目标;一次 Bash 调用只跑一条关键命令,免得前序失败把安装判成失败。86 行,无 version 字段。 ### tools/nextos-commit-publication-gate AGENTS.md 里那句「run `publication/verify.py` and review the diff」在本机是**有害的**:两道门禁永远不可能返回 0,而它的结果至少有四条路会被伪造——已发生过的事故是把 `... | tail` 的退出码 0 当成通过,让脏提交带着「已验证」标签推上远程。 调用姿势(四条均本机实测):用 `python` 不用 `python3`(Git Bash 里 `python3` 命中 Microsoft Store 桩,`$?`=49);**绝不接管道**(`$?` 会变成 `tail` 的 0);带 `PYTHONUTF8=1`(否则 `verify-docs.py` 在 cp936 上 `UnicodeDecodeError` 崩在半路);判读命令里**不要写反斜杠字面量**(送到 shell 会被吃掉一层,归一化脚本静默产出空文件 → 每个路径都显示 0 命中的假绿)。`RAW_EXIT` 只允许 0 或 1,其它值说明门禁根本没跑。 判读走双轴:**类别**决定这条失败在本机是否可能为真(档 A 结构性假报——NTFS 给 `0o666` 而清单声明 `100755`;`verify.py:188` 拿反斜杠路径去比正斜杠白名单,白名单形同不存在),**路径**决定是否本次责任(档 B:未跟踪的本地载荷算环境态,进了索引或在本次提交里就是硬红线),档 C 与平台无关永远为真(`hash:`、`unlisted file:`、`Tracked private/generated path:` 等,任一条即停止提交)。非 Windows 平台档 A 不成立,别照搬本节。125 行,无 version 字段。 ### tools/portmaster-standard-sh PortMaster 端口启动脚本(`Port Name.sh`)的**标准写法**与 gptokeyb/gptk 配置用法。骨架逐行来自官方收录端口(乐高赛车),纪律是「每一行非标准代码都要能解释」:环境变量先解包游戏包逐个核对引擎侧 `os.getenv` 默认值,只导出真正不同的项;分辨率在真机验证引擎自适应后连探测代码一起删(fb0/DRM/壁纸三路探测都是多余的);trap、双重 chmod、`${VAR:-默认}` 覆盖链、死代码一律不写,`pm_finish` 收尾;端口自带 squashfs 资源包时自挂自卸(唯一的合法 trap)。 gptokeyb 部分有三个源码级结论最容易写错:**Select+Start 退出热键靠位置参数开启**(参数即 `killall` 的进程名,删掉这行热键就失效——原生手柄游戏也必须挂);**gptk 配置按行合并到内建默认值上**(空文件什么都没禁用,必须逐键置空);**置空值是 `\"` 不是裸引号**(裸 `"` 在键码表里是撇号键)。完整键名表、kill 链路与最小 .gptk 模板见 `tools/portmaster-standard-sh/references/gptk.md`,可复制骨架见 `references/skeleton-native-gamepad.sh`。案例:月影传说(YYCS)脚本按此重构 321 行 → 72 行,实机四项(启动/手柄/退出热键/分辨率自适应)回归通过。 ### tools/port-repo-precommit-audit 端口移植仓库(`newports/*` 一类集合库)的**提交前审计流水线**,七步固定:定范围 → 垃圾分类与 ignore → 显式暂存 → 三项门禁 → 发布门禁判读 → 进展写进 `docs/ANALYSIS.md` → 提交信息。 三条最容易被写错的纪律:**门禁一律审暂存 blob,不审工作树副本**(`core.autocrlf=true` 时磁盘上的 `.sh` 永远是 CRLF,量它必然误报,正解是 `git cat-file -p :path | tr -cd '\r' | wc -c`);**绝不用 `git add -A`**,中文目录名和分析脚本误建的怪名空文件会让批量 add 半途 fatal 或静默把载荷/ELF/带设备地址的 SSH helper 一起带上;**`publication/verify.py` 在 Windows 检出必然非 0**(NTFS 给 `0o666` 而清单声明 `100755`),只能按路径切分判读,且退出码要用重定向 + `$?` 取,管道接 `tail` 会把失败读成通过。 三项门禁分别管:入库字节的行尾、设备地址与凭据(本次新增的不入库,已跟踪文件里的既有凭据代码只如实报告不隐瞒)、GBK→UTF-8 注释乱码的**归属**(用兄弟端口同文件逐字比对区分继承缺陷与本次引入,继承的不在功能提交里顺手重编码)。进展文档抄兄弟端口体例(按阶段分节 + `| 项 | 值 | 证据 |` 三列表),状态只用「已实测闭环 / 已实现未证 / 阻塞」三档措辞。详见 `tools/port-repo-precommit-audit/SKILL.md`。 ### tools/port-runtime-lib-bundling 游戏/应用移植到 aarch64 掌机后,因**运行期库不满足**而启动即退或跑半途崩的排障与修复。覆盖三类高频报错:`GLIBC_2.38 not found`(二进制要求的新版 glibc 比系统高)、`libavformat.so.60 cannot open shared object file`(媒体库 soname 版本对不上)、`libbz2.so.1 not found`(设备有 `libbz2.so.1.0` 但 SONAME 不同)。 核心手法是**把缺的库随端口带上,并只喂给游戏进程**:用捆绑的 `ld-linux-aarch64.so.1 --library-path ...` 解释器直调,而不是 `export LD_LIBRARY_PATH`。后者会让脚本里每一个外部命令(`date`/`grep`/`sleep`)都用上新 glibc,脚本当场失败、被看门狗 0.7 秒杀掉——这是本 Skill 最需要守住的一条纪律。 另含 EE47 上钉死 `SDL_VIDEODRIVER=kmsdrm` + `unset WAYLAND_DISPLAY` 的做法,以及 machismo / NewPAL 新仙剑在 EmuELEC 4.7 上的三层故障链完整案例。库来源(`references/lib-sources.md`)按优先级列出:同固件生态构建产物(wiliwili libs)→ 构建镜像 → 发行版 arm64 镜像直取 → 容器 apt 装完再拷,含 Windows 挂载点符号链接悬空陷阱的绕法。 详见 `tools/port-runtime-lib-bundling/SKILL.md`。 ### tools/kdocs-airscript-signin-framework 金山文档(kdocs / WPS 云文档)**AirScript 1.0** 聚合签到脚本框架,采用「默库」范式:CONFIG / PUSH / EMAIL 三张全局表 被约 30 个站点共用,每个站点一个工作表 + 一份 AirScript 脚本。覆盖单元格读写陷阱(`.Value2` 防长 token 截断、`@` 文本格式)、 ★**AirScript 1.0 与 2.0 的环境差异**(2.0 的 HTTP 代理有域名白名单,会静默拦截 pushplus 等推送 → 必须选 1.0), 以及「签到成功但收不到推送」这类静默失败的排查方法。六推送通道(bark / pushplus / ServerChan / email / dingtalk / discord)原样保留且各自 try/catch。 **v1.1.0 关键能力(2026-09-22 实跑验证)**: - 移动云盘(ydyp)站点:登录链路 `querySpecToken`→`tyrzLogin`(443 端口无关写法)→`jwtToken` 已在 1.0 实跑全通; 原以为 JWT 必须 `:7071` 端口,实测为 SSO 令牌单次消费假象,443 直连可用。 - **Authorization 自动续期 + 写回 A 列**:`maybeRefreshAuth(pos)` 解析 token 过期时间戳,剩 <5 天自动调 `authTokenRefresh.do` 换新、用纯 JS `base64Encode` 重建 `Basic base64(平台:手机号:新token)`(mobile/pc 前缀原样保留)、写回前用新 token 试 `querySpecToken` 做安全网; **已在 1.0 真·实跑确认新 token 写回 A2 并持久化**(从工作表读回解码时间戳已刷新)。 详见 `tools/kdocs-airscript-signin-framework/SKILL.md`。 **已收录脚本**(`tools/kdocs-airscript-signin-framework/scripts/`): - `trae-checkin-airscript.js` — Trae CN 签到(依赖本地 `extract_trae_cred.py` 抓 refreshToken / device_id) - `workbuddy-checkin-airscript.js` — WorkBuddy 签到 - `ydyp-checkin-airscript.js` — 移动云盘(ydyp)签到,含 Authorization 自动续期写回 - `extract_trae_cred.py` — 从本机 Trae CN 客户端登录态提取 refreshToken / accessToken / device_id(只读、不修改,明文落本地 `trae-cred.json`) > 注:上述 JS 脚本依赖金山文档工作簿与账号凭据,均运行时从工作表读取;工作簿链接、file_id、手机号等隐私信息**不硬编码在脚本内**。