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:
1 parent
b839ed4056
commit
16ab2a6c84
97 files changed
+592
-648
No files matched your search
@@ -8,7 +8,7 @@ export type StatusView = { label: string; tone: StatusTone; hint?: string };
|
||||
|
||||
/** 行主状态 → 徽标(文字必带,不只靠颜色) */
|
||||
export function entryStatusView(e: Pick<FileEntry, "status" | "download" | "escape" | "type">): StatusView | null {
|
||||
if (e.escape) return { label: "链接逃逸", tone: "destructive", hint: "符号链接指向登记根之外,已禁用所有操作" };
|
||||
if (e.escape) return { label: "链接逃逸", tone: "destructive", hint: "符号链接指向登记目录之外,所有操作已禁用" };
|
||||
const s: FileStatus = e.status;
|
||||
switch (s) {
|
||||
case "temp":
|
||||
@@ -22,7 +22,7 @@ export function entryStatusView(e: Pick<FileEntry, "status" | "download" | "esca
|
||||
return { label: "已登记", tone: "success" };
|
||||
case "seeding":
|
||||
return e.download?.hnr === "unsatisfied"
|
||||
? { label: "做种中·H&R 未满足", tone: "warning", hint: "H&R 未满足前不能改名、删除或 Move" }
|
||||
? { label: "做种中·H&R 未满足", tone: "warning", hint: "H&R 满足前不能改名、删除或移动" }
|
||||
: { label: "做种中", tone: "neutral" };
|
||||
case "unidentified":
|
||||
return { label: "待识别", tone: "warning" };
|
||||
@@ -65,7 +65,7 @@ export type FileOp =
|
||||
|
||||
/** 返回 null = 可用;否则为禁用原因 */
|
||||
export function opDisabledReason(op: FileOp, e: FileEntry, root: Pick<FileRoot, "kind" | "writable">): string | null {
|
||||
if (e.escape && op !== "copyPath") return "链接指向登记根之外,已禁用";
|
||||
if (e.escape && op !== "copyPath") return "链接指向登记目录之外,已禁用";
|
||||
// 下载根不能作为写入目标,但其中的文件可改名/删除/移出(服务端仍按引用检查拒绝做种项)
|
||||
const rootWritable = root.writable || root.kind === "download";
|
||||
const seeding = e.status === "seeding" || e.status === "downloading";
|
||||
@@ -77,8 +77,8 @@ export function opDisabledReason(op: FileOp, e: FileEntry, root: Pick<FileRoot,
|
||||
if (e.status === "temp") return "临时文件不能改名";
|
||||
return null;
|
||||
case "move":
|
||||
if (!rootWritable) return "只读登记根,不能移出(可用“复制到…”)";
|
||||
if (hnrBlocked) return "做种中且 H&R 未满足,不能 Move";
|
||||
if (!rootWritable) return "只读根,不能移出。可用“复制到…”";
|
||||
if (hnrBlocked) return "做种中且 H&R 未满足,不能移动";
|
||||
return null;
|
||||
case "delete":
|
||||
if (!rootWritable) return "只读根,不能删除";
|
||||
@@ -90,7 +90,7 @@ export function opDisabledReason(op: FileOp, e: FileEntry, root: Pick<FileRoot,
|
||||
if (e.type === "file" && e.fileKind !== "video") return "只有视频或目录可识别/整理";
|
||||
return null;
|
||||
case "scrape":
|
||||
return e.asset ? null : "未登记,请先识别并整理入库";
|
||||
return e.asset ? null : "未登记,先识别并整理入库";
|
||||
case "probe":
|
||||
return e.type === "file" && e.fileKind === "video" ? null : "只能探测视频文件";
|
||||
case "openMedia":
|
||||
@@ -299,7 +299,7 @@ export function deleteBlockText(b: string | null): { text: string; soft: boolean
|
||||
case "needs_retire":
|
||||
return { text: "含已登记资产,需勾选“同时退役资产”", soft: true };
|
||||
case "needs_unbind":
|
||||
return { text: "是作品/季的绑定目录,需勾选“解除绑定”", soft: true };
|
||||
return { text: "是作品/季的绑定目录,需勾选“解除路径绑定”", soft: true };
|
||||
case "root_unavailable":
|
||||
return { text: "根离线,不能确认文件状态", soft: false };
|
||||
case "not_found":
|
||||
|
||||
Reference in new issue
Block a user