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
@@ -141,7 +141,7 @@ function OptionButton({ d, option }: { d: Decision; option: DecisionOption }) {
description={
<>
{option.description ? `${option.description}。` : ""}
{option.capabilityId ? `由能力 ${option.capabilityId} 执行,仍做授权校验。` : null}
{option.capabilityId ? `由能力 ${option.capabilityId} 执行,仍做授权校验。` : null}
</>
}
confirmLabel={option.label}
@@ -155,7 +155,7 @@ function OptionButton({ d, option }: { d: Decision; option: DecisionOption }) {
...(identity ? { identity } : {}),
})
.then(
() => toast.success(`已处理:${option.label}`),
() => toast.success(`已处理:${option.label}`),
(err) => {
toast.error(errorMessage(err, "处理失败"));
throw err;
@@ -176,7 +176,7 @@ function OptionButton({ d, option }: { d: Decision; option: DecisionOption }) {
</SelectContent>
</Select>
</FormField>
<FormField label="TMDB ID" htmlFor={`${uid}-tmdb`} required hint="纯数字,如 872585">
<FormField label="TMDB ID" htmlFor={`${uid}-tmdb`} required hint="纯数字,如 872585">
<Input
id={`${uid}-tmdb`}
inputMode="numeric"
@@ -191,7 +191,7 @@ function OptionButton({ d, option }: { d: Decision; option: DecisionOption }) {
<EntityPicker value={entity} onChange={setEntity} />
</FormField>
) : null}
<FormField label="备注" htmlFor={`${uid}-note`} hint="可选,记在处理结果里">
<FormField label="备注" htmlFor={`${uid}-note`} hint="可选,记在处理结果里">
<Textarea id={`${uid}-note`} value={note} onChange={(e) => setNote(e.target.value)} rows={2} />
</FormField>
</ConfirmDialog>
@@ -208,8 +208,8 @@ function DismissButton({ d }: { d: Decision }) {
忽略
</Button>
}
title="忽略这条事项?"
description="只关闭提醒,问题本身不变;同一根因出现新证据时会重新提出。"
title="忽略这条事项?"
description="只关闭提醒,问题本身不变;同一根因出现新证据时会重新提出。"
confirmLabel="忽略"
onConfirm={() =>
resolve.mutateAsync({ id: d.id, dismiss: true }).then(
@@ -343,7 +343,7 @@ export default function InboxPage() {
<>
<PageHeader
title="待处理"
description="Agent 调查和重试后仍未解决的事项,按作品和问题类型合并"
description="Agent 调查和重试后仍未解决的事项,按作品和问题类型合并"
actions={
<>
<span className="hidden items-center gap-1.5 text-meta text-muted-foreground sm:inline-flex">
@@ -379,7 +379,7 @@ export default function InboxPage() {
key={k}
label={DECISION_KIND[k]}
value={v.count}
hint={`最高级别:${SEVERITY[v.sev].label}`}
hint={`最高级别:${SEVERITY[v.sev].label}`}
tone={SEVERITY[v.sev].tone}
active={kind === k}
onClick={() => set("kind", kind === k ? "" : k)}