docs(plan): v0.2 adds Pi subagents and scheduled-jobs board

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
rootandClaude Fable 5.1 committed 2026-09-28 02:09:39 +08:00
1 parent b839ed4056
commit 16ab2a6c84
97 files changed
+592 -648

No files matched your search

+13 -15
View File
@@ -77,7 +77,7 @@ import { cn, formatBytes } from "~/lib/utils.ts";
const HEALTH_REASON: Record<string, string> = {
root_missing: "挂载点不存在",
sentinel_missing: "根目录里找不到哨兵文件,可能挂载未生效",
sentinel_missing: "根目录里没有哨兵文件,挂载可能未生效",
timeout: "探测超时",
permission_denied: "没有读取权限",
};
@@ -247,7 +247,7 @@ export default function FilesPage() {
setQInput("");
};
const open = (e: FileEntry) => {
if (e.escape) return toast.error("链接指向登记根之外,已禁用");
if (e.escape) return toast.error("链接指向登记目录之外,不能打开");
if (e.type === "dir") go({ root: rootId, path: e.path });
else patch({ sel: e.path });
};
@@ -267,9 +267,7 @@ export default function FilesPage() {
onSuccess: (r) => {
const ok = r.items.filter((i) => i.status === "ok").length;
toast.success(`探测完成:${ok}/${r.items.length} 个读到媒体信息`, {
description: r.items.some((i) => i.savedToAsset)
? "已登记资产已写回媒体信息"
: "未登记文件的结果缓存 24 小时",
description: r.items.some((i) => i.savedToAsset) ? "媒体信息已写入资产" : "未登记文件的结果缓存 24 小时",
});
},
onError: (err) => toast.error(filesErrorText(err, "探测失败")),
@@ -308,7 +306,7 @@ export default function FilesPage() {
if (multi)
items.push({
key: "wizard",
label: `整理向导(${list.length} 项)`,
label: `整理 ${list.length} 项…`,
icon: Wand2,
disabled: why("organize"),
onSelect: () => setDialog({ kind: "wizard", entries: list }),
@@ -334,7 +332,7 @@ export default function FilesPage() {
key: "copy",
label: "复制到…",
icon: Copy,
disabled: e.escape ? "链接指向登记根之外,已禁用" : null,
disabled: e.escape ? "链接指向登记目录之外" : null,
onSelect: () => setDialog({ kind: "transfer", items: refs(list), mode: "copy" }),
},
);
@@ -422,7 +420,7 @@ export default function FilesPage() {
if (items.every((i) => i.root === target.root && parentRel(i.path) === target.path)) return;
}
const tRoot = rootList.find((r) => r.id === target.root);
if (!tRoot?.writable) return toast.error("只能拖到可写的媒体库根");
if (!tRoot?.writable) return toast.error("只能拖到可写的库根");
setDialog({ kind: "transfer", items, mode: ev.altKey ? "copy" : "move", target });
};
@@ -443,8 +441,8 @@ export default function FilesPage() {
<EmptyState
plain
icon={FolderTree}
title="还没有可浏览的根"
description="在系统设置里登记媒体库根或下载器路径映射后出现在这里。"
title="还没有库根"
description="在系统设置里登记库根或下载器路径映射。"
className="px-2 py-8"
/>
) : null}
@@ -473,7 +471,7 @@ export default function FilesPage() {
<p className="text-lead font-medium text-foreground">{root.name} 离线</p>
<p className="mt-1.5 max-w-md text-caption text-muted-foreground">
{offline ? filesErrorText(list.error) : healthReasonText(root.healthReason)}
。不会把离线当成空目录,也不会改变任何资产状态。
。离线期间资产状态不变。
</p>
<p className="mt-1 text-meta text-muted-foreground">上次检查:{relTime(root.checkedAt)}</p>
<Button
@@ -506,7 +504,7 @@ export default function FilesPage() {
plain
icon={SearchX}
title="没有符合筛选的项"
description={q ? `搜索“${q}”没有结果;支持子串与 glob(如 *.mkv)。` : undefined}
description={q ? `没有匹配“${q}”的项。支持子串与 glob,如 *.mkv` : undefined}
action={
<Button variant="outline" size="sm" onClick={clearFilters}>
<X />
@@ -519,7 +517,7 @@ export default function FilesPage() {
plain
icon={FolderOpen}
title="空目录"
description={hidden ? undefined : "隐藏文件未显示,可在工具栏打开。"}
description={hidden ? undefined : "隐藏文件未显示。"}
action={
root.writable ? (
<Button variant="outline" size="sm" onClick={() => setDialog({ kind: "mkdir" })}>
@@ -617,7 +615,7 @@ export default function FilesPage() {
<>
<PageHeader
title="文件"
description="只浏览已登记的库根与下载目录;每行带业务状态,删除进回收站,改名同步资产与路径绑定。"
description="已登记的库根与下载目录。删除先进回收站,改名同步更新资产。"
actions={
<>
{filesMockEnabled() ? <StatusBadge tone="warning">演示数据</StatusBadge> : null}
@@ -790,7 +788,7 @@ export default function FilesPage() {
{first?.truncated ? (
<div role="status" className="border-b border-warning/30 bg-warning/10 px-3 py-1.5 text-meta text-warning">
目录过大,只读取了前 {first.total.toLocaleString("zh-CN")} 项。请用搜索或进入子目录缩小范围。
目录过大,只读取了前 {first.total.toLocaleString("zh-CN")} 项。用搜索或进入子目录缩小范围。
</div>
) : null}