feat(lang-guard): 新增第七支 hook,強制非程式碼輸出繁中無亂碼

What:新增 `hooks/lang-guard.sh` 與機檢字表 `hooks/simplified.txt`。腳本比照 `comment-scope.sh` 的結構,一樣三種模式:`prompt` 注入規則摘要、無參數掃剛寫入的單一檔案、`sweep [dir]` 掃整個 git 工作區這次改過的檔案。偵測三項:簡體字、亂碼(U+FFFD 與雙重編碼殘骸)、非 UTF-8 編碼。命中走 stderr 並 exit 2,資料不足或找不到 git 一律安靜 exit 0,逃生門 `JSC_LANG_GUARD=off`。

Why:使用者新增的規則是「非程式碼的輸出一律套用繁中無亂碼」,範圍涵蓋程式碼註解、commit 訊息、PR 描述、wiki 頁、對使用者的回報與各種文件。這條規則原本只有 `ste100-guard.sh` 的提示層,模型看得到卻沒有人檢查,寫出簡體字或亂碼不會有任何回饋。提示層擋不住的事,就要有機檢層。

How:簡體字樣式由字表組出,字表是單一真實來源,腳本裡不留第二份;字表讀不到就安靜跳過這一項,不中斷整支腳本。亂碼一律用位元組比對(`LC_ALL=C`),不靠語系的字元範圍,因為 `grep -E` 的字元範圍在不同語系下行為不一致。掃描深度沿用 `comment-scope.sh`:檔案已追蹤就只掃 `git diff HEAD` 的新增行,不翻舊帳。二進位檔只認 NUL 位元組判定,不拿「非可列印字元」當判準,那會把所有含中文的檔案誤判成二進位。字表刻意排除繁體也在用的字(后、台、干、只、里、面、制、志),並跳過 `simplified.txt`、`ste100-guard.sh`、`lang-guard.sh` 三份以簡體字與亂碼為討論對象的檔案,避免整支 hook 每次先抓到自己。

Who:`jsc-hooks` 的 hook 實作層,供 `hooks/hooks.json` 與 `tools/wire-cli.sh` 接線給五個 CLI 使用。
This commit is contained in:
2026-08-27 09:50:03 +08:00
parent 2f74d6473c
commit e3a9c67781
2 changed files with 285 additions and 0 deletions
+109
View File
@@ -0,0 +1,109 @@
# simplified.txt — 機檢用的簡體字表,一行一個字,UTF-8。
# 用途:hooks/lang-guard.sh 讀這份字表組出 grep 樣式,判定非程式碼輸出有沒有夾帶簡體字。
# 這是本存取庫的單一真實來源,jsc-meta 的 tools/ste100-lint.sh 也優先讀這份。
# 排除原則:只收簡化後才出現的字形,刻意排除繁體也在用的字(后、台、干、只、里、面、制、志)。
# 加進那些字會讓「太后」「電視台」「干涉」「只有」「公里」「面板」「制度」「志工」全部誤報。
# 增刪字元前先想清楚:這份字表寧可漏抓,也不可誤報。
# `#` 開頭的行與空行由讀取端忽略。
应
为
这
说
发
国
过
对
开
关
问
题
东
车
马
鸟
龙
飞
见
无
产
业
务
书
写
学
习
报
纸
认
识
证
际
网
络
计
划
实
现
给
条
约
级
组
织
变
换
电
脑
两
双
单
构
价
钱
众
议
论
传
统
么
儿
们
从
来
时
间
长
门
闻
声
员
图
团
转
输
达
运
进
远
连
边
还
经
该
营
规
则
范
围
参
数
类
结
态
设
备
辑
译
码
库
档