style(copy): punctuation rules and site-wide fix with a CI check (QA U11)

- glossary: 10 punctuation rules (full-width in Chinese, CJK/Latin spacing,
  full-width parens around Chinese, single ellipsis, 「」 quotes, period rules)
- scripts/check-copy-punctuation.mjs: checks string literals, templates and JSX
  text (not comments, types, keys, match/compare strings); --fix, --strict,
  --by-file; wired into deno task ci as check:copy in warn mode
- --fix applied to web, server and contracts; files other lanes were editing
  (subscriptions, sites, browser, agent, auth/account, inventory) left for them
- tests updated for the changed messages

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-28 20:09:29 +08:00
1 parent 9b017906cf
commit 52402864d6
143 files changed
+985 -606

No files matched your search

+8 -8
View File
@@ -101,7 +101,7 @@ function PathsPanel({ detail }: { detail: LibraryDetail }) {
plain
icon={FolderTree}
title="还没有入库文件"
description="版本目标满足后,文件位置显示在这里。"
description="版本目标满足后,文件位置显示在这里。"
className="py-8"
/>
) : (
@@ -173,7 +173,7 @@ function IdentityPanel({ detail }: { detail: LibraryDetail }) {
return (
<Panel
title="外部身份"
description="以本地 ID 为准,外部身份可修改"
description="以本地 ID 为准,外部身份可修改"
actions={
<Button variant="outline" size="sm" onClick={() => setOpen(true)}>
<PencilLine />
@@ -287,7 +287,7 @@ function MetadataPanel({ detail, entity }: { detail: LibraryDetail; entity: Medi
) : null}
{cands.length ? (
<p className="mt-0.5 text-meta break-words text-muted-foreground">
候选:
候选:
{cands.map((c) => `${METADATA_SOURCE[c.source] ?? c.source}「${String(c.value)}」`).join(" / ")}
</p>
) : null}
@@ -305,8 +305,8 @@ function MetadataPanel({ detail, entity }: { detail: LibraryDetail; entity: Medi
<LockOpen />
</Button>
}
title={`解锁「${ENTITY_FIELD_LABEL[field]}」?`}
description="取消人工修改,下次刷新按来源优先级取值。"
title={`解锁「${ENTITY_FIELD_LABEL[field]}」?`}
description="取消人工修改,下次刷新按来源优先级取值。"
confirmLabel="解锁"
onConfirm={() =>
unlock.mutateAsync(field).then(
@@ -335,7 +335,7 @@ function MetadataPanel({ detail, entity }: { detail: LibraryDetail; entity: Medi
</ul>
{entity?.aliases.length ? (
<div className="mt-3 border-t border-border/60 pt-3">
<p className="mb-1.5 text-meta text-muted-foreground">别名(用于模糊召回)</p>
<p className="mb-1.5 text-meta text-muted-foreground">别名(用于模糊召回)</p>
<ChipList
items={entity.aliases.map((a) => (
<span key={a.id}>
@@ -360,7 +360,7 @@ function SlotsPanel({ detail, units }: { detail: LibraryDetail; units: ContentUn
plain
icon={CalendarClock}
title="还没有版本目标"
description="新建订阅或版本目标后,按目标补齐和升级。"
description="新建订阅或版本目标后,按目标补齐和升级。"
action={
<Button asChild variant="outline" size="sm">
<Link to={consolePath("subscriptions")}>去订阅</Link>
@@ -456,7 +456,7 @@ function UnitsPanel({ entity, detail }: { entity: ReturnType<typeof useEntityDet
a.segment.localeCompare(b.segment),
);
return (
<Panel title="内容单元" description="临时单元按解析结果创建,确认或改编号后锁定" bodyClassName="p-0 sm:p-0">
<Panel title="内容单元" description="临时单元按解析结果创建,确认或改编号后锁定" bodyClassName="p-0 sm:p-0">
<DataTable
plain
columns={columns}