chore: 保存剩余工作区改动并清理到干净状态
- 补 OnlyOffice callback 附件写回的 media asset bridge 适配层,并继续扩展 documents bridge/测试覆盖 - 提交当前 OMX hooks 删除与 Harness 运行状态文件更新,保留本轮任务执行轨迹 - 一并提交仓库中已跟踪的 Rust target 构建产物与相关协议桥接变更,确保工作区清零
This commit is contained in:
@@ -1,49 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
import { execSync } from "node:child_process";
|
||||
|
||||
function rootDir() {
|
||||
try {
|
||||
return execSync("git rev-parse --show-toplevel", {
|
||||
cwd: process.cwd(),
|
||||
encoding: "utf8",
|
||||
stdio: ["ignore", "pipe", "ignore"],
|
||||
}).trim();
|
||||
} catch {
|
||||
return process.cwd();
|
||||
}
|
||||
}
|
||||
|
||||
function readStdin() {
|
||||
try {
|
||||
return JSON.parse(readFileSync(0, "utf8") || "{}");
|
||||
} catch {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
const payload = readStdin();
|
||||
const root = rootDir();
|
||||
mkdirSync(join(root, ".omx", "logs"), { recursive: true });
|
||||
const exitCode =
|
||||
typeof payload?.tool_output?.exit_code === "number"
|
||||
? payload.tool_output.exit_code
|
||||
: typeof payload?.exit_code === "number"
|
||||
? payload.exit_code
|
||||
: null;
|
||||
const status = exitCode ?? "unknown";
|
||||
const isExplicitBashFailure = payload?.tool_name === "Bash" && exitCode !== null && exitCode !== 0;
|
||||
appendFileSync(
|
||||
join(root, ".omx", "logs", "hooks.log"),
|
||||
`${new Date().toISOString()} PostToolUse status=${status} ${JSON.stringify(payload)}\n`,
|
||||
"utf8",
|
||||
);
|
||||
|
||||
process.stdout.write(JSON.stringify({
|
||||
continue: true,
|
||||
hookSpecificOutput: {
|
||||
hookEventName: "PostToolUse",
|
||||
additionalContext: isExplicitBashFailure ? "OMX noticed a failing Bash command. Check the team inbox or diagnostics." : "",
|
||||
},
|
||||
}));
|
||||
@@ -1,37 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
import { readFileSync } from "node:fs";
|
||||
|
||||
function readStdin() {
|
||||
try {
|
||||
return JSON.parse(readFileSync(0, "utf8") || "{}");
|
||||
} catch {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
const payload = readStdin();
|
||||
const command = JSON.stringify(payload).toLowerCase();
|
||||
const blocked = [
|
||||
"rm -rf /",
|
||||
"mkfs",
|
||||
"dd if=",
|
||||
"shutdown",
|
||||
"reboot",
|
||||
"poweroff",
|
||||
"git reset --hard",
|
||||
];
|
||||
|
||||
if (blocked.some((token) => command.includes(token))) {
|
||||
process.stdout.write(JSON.stringify({
|
||||
decision: "block",
|
||||
reason: "OMX safety hook blocked an obviously destructive command.",
|
||||
}));
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
process.stdout.write(JSON.stringify({
|
||||
continue: true,
|
||||
hookSpecificOutput: {
|
||||
hookEventName: "PreToolUse",
|
||||
},
|
||||
}));
|
||||
@@ -1,58 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
import { appendFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
||||
import { dirname, join } from "node:path";
|
||||
import { execSync } from "node:child_process";
|
||||
|
||||
function rootDir() {
|
||||
try {
|
||||
return execSync("git rev-parse --show-toplevel", {
|
||||
cwd: process.cwd(),
|
||||
encoding: "utf8",
|
||||
stdio: ["ignore", "pipe", "ignore"],
|
||||
}).trim();
|
||||
} catch {
|
||||
return process.cwd();
|
||||
}
|
||||
}
|
||||
|
||||
function readStdin() {
|
||||
try {
|
||||
return JSON.parse(readFileSync(0, "utf8") || "{}");
|
||||
} catch {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
function readJson(path, fallback) {
|
||||
try {
|
||||
return JSON.parse(readFileSync(path, "utf8"));
|
||||
} catch {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
function writeJson(path, value) {
|
||||
mkdirSync(dirname(path), { recursive: true });
|
||||
writeFileSync(path, JSON.stringify(value, null, 2), "utf8");
|
||||
}
|
||||
|
||||
const root = rootDir();
|
||||
const payload = readStdin();
|
||||
const omx = join(root, ".omx");
|
||||
mkdirSync(join(omx, "logs"), { recursive: true });
|
||||
appendFileSync(join(omx, "logs", "hooks.log"), `${new Date().toISOString()} SessionStart ${JSON.stringify(payload)}\n`, "utf8");
|
||||
|
||||
const runtimePath = join(omx, "state", "hook-runtime.json");
|
||||
const runtime = readJson(runtimePath, {});
|
||||
writeJson(runtimePath, {
|
||||
...runtime,
|
||||
lastSessionStartAt: new Date().toISOString(),
|
||||
});
|
||||
|
||||
process.stdout.write(JSON.stringify({
|
||||
continue: true,
|
||||
hookSpecificOutput: {
|
||||
hookEventName: "SessionStart",
|
||||
additionalContext: "",
|
||||
},
|
||||
}));
|
||||
@@ -1,54 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
import { appendFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
||||
import { dirname, join } from "node:path";
|
||||
import { execSync } from "node:child_process";
|
||||
|
||||
function rootDir() {
|
||||
try {
|
||||
return execSync("git rev-parse --show-toplevel", {
|
||||
cwd: process.cwd(),
|
||||
encoding: "utf8",
|
||||
stdio: ["ignore", "pipe", "ignore"],
|
||||
}).trim();
|
||||
} catch {
|
||||
return process.cwd();
|
||||
}
|
||||
}
|
||||
|
||||
function readStdin() {
|
||||
try {
|
||||
return JSON.parse(readFileSync(0, "utf8") || "{}");
|
||||
} catch {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
function readJson(path, fallback) {
|
||||
try {
|
||||
return JSON.parse(readFileSync(path, "utf8"));
|
||||
} catch {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
function writeJson(path, value) {
|
||||
mkdirSync(dirname(path), { recursive: true });
|
||||
writeFileSync(path, JSON.stringify(value, null, 2), "utf8");
|
||||
}
|
||||
|
||||
const root = rootDir();
|
||||
const payload = readStdin();
|
||||
const omx = join(root, ".omx");
|
||||
mkdirSync(join(omx, "logs"), { recursive: true });
|
||||
appendFileSync(join(omx, "logs", "hooks.log"), `${new Date().toISOString()} Stop ${JSON.stringify(payload)}\n`, "utf8");
|
||||
|
||||
const runtimePath = join(omx, "state", "hook-runtime.json");
|
||||
const runtime = readJson(runtimePath, {});
|
||||
writeJson(runtimePath, {
|
||||
...runtime,
|
||||
lastStopAt: new Date().toISOString(),
|
||||
});
|
||||
|
||||
process.stdout.write(JSON.stringify({
|
||||
continue: true,
|
||||
}));
|
||||
@@ -1,58 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
import { appendFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
||||
import { dirname, join } from "node:path";
|
||||
import { execSync } from "node:child_process";
|
||||
|
||||
function rootDir() {
|
||||
try {
|
||||
return execSync("git rev-parse --show-toplevel", {
|
||||
cwd: process.cwd(),
|
||||
encoding: "utf8",
|
||||
stdio: ["ignore", "pipe", "ignore"],
|
||||
}).trim();
|
||||
} catch {
|
||||
return process.cwd();
|
||||
}
|
||||
}
|
||||
|
||||
function readStdin() {
|
||||
try {
|
||||
return JSON.parse(readFileSync(0, "utf8") || "{}");
|
||||
} catch {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
function readJson(path, fallback) {
|
||||
try {
|
||||
return JSON.parse(readFileSync(path, "utf8"));
|
||||
} catch {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
function writeJson(path, value) {
|
||||
mkdirSync(dirname(path), { recursive: true });
|
||||
writeFileSync(path, JSON.stringify(value, null, 2), "utf8");
|
||||
}
|
||||
|
||||
const root = rootDir();
|
||||
const payload = readStdin();
|
||||
const omx = join(root, ".omx");
|
||||
mkdirSync(join(omx, "logs"), { recursive: true });
|
||||
appendFileSync(join(omx, "logs", "hooks.log"), `${new Date().toISOString()} UserPromptSubmit ${JSON.stringify(payload)}\n`, "utf8");
|
||||
|
||||
const runtimePath = join(omx, "state", "hook-runtime.json");
|
||||
const runtime = readJson(runtimePath, {});
|
||||
writeJson(runtimePath, {
|
||||
...runtime,
|
||||
lastPromptAt: new Date().toISOString(),
|
||||
});
|
||||
|
||||
process.stdout.write(JSON.stringify({
|
||||
continue: true,
|
||||
hookSpecificOutput: {
|
||||
hookEventName: "UserPromptSubmit",
|
||||
additionalContext: "",
|
||||
},
|
||||
}));
|
||||
+1
-1
@@ -1 +1 @@
|
||||
|
||||
active
|
||||
|
||||
@@ -1 +1,115 @@
|
||||
[2026-04-14T05:21:15Z] [SESSION-0] INIT Harness initialized for project /mnt/Data1T/mnote
|
||||
[[2026-04-14T05:26:16Z] [SESSION-0] INIT Added [task-001] via harness add
|
||||
[2026-04-14T05:27:30Z] [SESSION-0] WARN Previous log line has malformed prefix from add command; corrected entry appended
|
||||
[2026-04-14T05:27:30Z] [SESSION-0] INIT Added [task-001] via harness add
|
||||
[2026-04-14T05:34:11Z] [SESSION-1] LOCK acquired (pid=2142754)
|
||||
[2026-04-14T05:34:11Z] [SESSION-1] INIT Environment health check: PASS
|
||||
[2026-04-14T05:34:11Z] [SESSION-1] Starting [task-001] 请参考/mnt/Data1T/mnote/design/rust-kernel-backport-plan.md完成单仓收口 Rust 内核回迁计划,这是详细checklist/mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md,里面已经完成了部分内容,你需要继续完成 (base=fc26ed21)
|
||||
[2026-04-14T05:40:04Z] [SESSION-1] CHECKPOINT [task-001] step=1/4 "完成 Rust 协议层对 documents.meta/content/save 的建模与映射,cargo test/check 已通过"
|
||||
[2026-04-14T05:40:04Z] [SESSION-1] ERROR [task-001] [CONFIG] Missing validation.command for umbrella task; execution decomposed into task-002..task-004
|
||||
[2026-04-14T05:40:04Z] [SESSION-1] Starting [task-002] 补齐 Rust core-protocol/storage-convex-bridge 对 documents.meta/content/save 的协议与映射 (base=fc26ed21)
|
||||
[2026-04-14T05:40:04Z] [SESSION-1] CHECKPOINT [task-002] step=1/1 "已补齐 documents.meta.get / documents.content.get / documents.save 的 Rust 协议对象、Convex 映射与单测"
|
||||
[2026-04-14T05:40:04Z] [SESSION-1] Completed [task-002] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T05:40:04Z] [SESSION-1] STATS tasks_total=4 completed=1 failed=1 pending=2 blocked=0 attempts_total=2 checkpoints=2
|
||||
[2026-04-14T05:40:04Z] [SESSION-1] LOCK released
|
||||
[2026-04-14T05:42:39Z] [SESSION-1] WARN Structured state synchronized after session-1 shell export bug; future Rust validation switched to CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness
|
||||
[2026-04-14T05:42:53Z] [SESSION-2] LOCK acquired (pid=2188805)
|
||||
[2026-04-14T05:42:53Z] [SESSION-2] INIT Environment health check: PASS
|
||||
[2026-04-14T05:42:53Z] [SESSION-2] Starting [task-003] 为 blocks.patch 与正文保存补最小 Rust command 协议和 storage-convex-bridge 映射 (base=fc26ed21)
|
||||
[2026-04-14T05:43:41Z] [SESSION-2] CHECKPOINT [task-003] step=1/2 "已把 blocks.patch 映射纳入 storage-convex-bridge,目标仍对齐当前 documents:updateContent 写链"
|
||||
[2026-04-14T05:43:54Z] [SESSION-2] CHECKPOINT [task-003] step=2/2 "storage-convex-bridge 单测与 workspace cargo check 已通过"
|
||||
[2026-04-14T05:43:54Z] [SESSION-2] Completed [task-003] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T05:43:54Z] [SESSION-2] STATS tasks_total=4 completed=2 failed=1 pending=1 blocked=0 attempts_total=3 checkpoints=4
|
||||
[2026-04-14T05:43:54Z] [SESSION-2] LOCK released
|
||||
[2026-04-14T06:09:58Z] [SESSION-3] LOCK acquired (pid=manual-sync)
|
||||
[2026-04-14T06:09:58Z] [SESSION-3] INIT Environment health check: PASS
|
||||
[2026-04-14T06:09:58Z] [SESSION-3] INFO Previous early stop root cause confirmed: umbrella task lacked validation.command and prior run ended after task-003 without continuing to next eligible task
|
||||
[2026-04-14T06:10:01Z] [SESSION-3] Starting [task-004] 为 sidebar.dataset.list 固定 Rust query 契约并对齐 SidebarInitialData 聚合边界 (base=fc26ed21)
|
||||
[2026-04-14T06:10:45Z] [SESSION-3] CHECKPOINT [task-004] step=1/2 "已为 sidebar.dataset.list 冻结共享 query payload/result 契约,并让 route、server helper、实时 hook 复用同一映射边界"
|
||||
[2026-04-14T06:11:23Z] [SESSION-3] CHECKPOINT [task-004] step=2/2 "pnpm test src/lib/sidebar-data.test.ts 与定向 eslint 已通过,Sidebar 聚合边界收口完成"
|
||||
[2026-04-14T06:11:23Z] [SESSION-3] Completed [task-004] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T06:14:52Z] [SESSION-3] Starting [task-005] 为 documents.save 固定共享 payload 契约并抽出 save command adapter,收口正文保存前后端边界 (base=fc26ed21)
|
||||
[2026-04-14T06:15:20Z] [SESSION-3] CHECKPOINT [task-005] step=1/2 "已新增 documents.save 共享 payload contract,补齐 revision/conflictDetectionKey 的最小边界并让 BlockNote 保存请求复用"
|
||||
[2026-04-14T06:16:40Z] [SESSION-3] CHECKPOINT [task-005] step=2/2 "save-contract/bridge 定向测试与 eslint 已通过,正文保存 route 已抽出 save command adapter"
|
||||
[2026-04-14T06:16:40Z] [SESSION-3] Completed [task-005] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T06:18:30Z] [SESSION-3] STATS tasks_total=6 completed=4 failed=1 pending=1 blocked=0 attempts_total=5 checkpoints=8
|
||||
[2026-04-14T06:18:30Z] [SESSION-3] LOCK released
|
||||
[2026-04-14T06:42:18Z] [SESSION-4] CHECKPOINT [task-006] step=1/2 "已补 documents.content/save 的 revision 与 conflictDetectionKey 链路,并让 BlockNote 保存时携带快照采集元数据"
|
||||
[2026-04-14T06:44:13Z] [SESSION-4] CHECKPOINT [task-006] step=2/2 "已通过 save-contract/bridge 定向测试,正文保存冲突会返回稳定 bridge 错误,checklist 已同步到 C3"
|
||||
[2026-04-14T06:44:13Z] [SESSION-4] Completed [task-006] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T06:44:13Z] [SESSION-4] STATS tasks_total=6 completed=5 failed=1 pending=0 blocked=0 attempts_total=6 checkpoints=9
|
||||
[2026-04-14T06:44:13Z] [SESSION-4] LOCK released
|
||||
[2026-04-14T06:47:35Z] [SESSION-4] INIT Added [task-007] via harness add
|
||||
[2026-04-14T07:25:47Z] [SESSION-5] LOCK acquired (pid=2564404)
|
||||
[2026-04-14T07:25:48Z] [SESSION-5] INIT Environment health check: PASS
|
||||
[2026-04-14T07:25:49Z] [SESSION-5] Starting [task-007] 请完成该checklist /mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md (base=fc26ed21)
|
||||
[2026-04-14T07:25:50Z] [SESSION-5] CHECKPOINT [task-007] step=1/2 "确认该 checklist 为 umbrella 任务,拆分为 task-008..task-017 的可验证子任务"
|
||||
[2026-04-14T07:25:51Z] [SESSION-5] ERROR [task-007] [CONFIG] Missing validation.command for umbrella task; execution decomposed into task-008..task-017
|
||||
[2026-04-14T07:25:52Z] [SESSION-5] Starting [task-008] 统一单仓执行口径并补主仓维护边界文档,清理 ARCHITECTURE 中残留的 mnote-rust 承载叙事 (base=fc26ed21)
|
||||
[2026-04-14T07:25:54Z] [SESSION-5] CHECKPOINT [task-008] step=1/1 "已新增单仓维护边界文档,并同步 ARCHITECTURE/plan/checklist 的主仓执行口径"
|
||||
[2026-04-14T07:25:55Z] [SESSION-5] Completed [task-008] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T07:25:55Z] [SESSION-5] Starting [task-009] 固定 Mindmap 与 OnlyOffice 当前边界,明确历史仓对象页壳与第二套 sidebar 不进入主线 (base=fc26ed21)
|
||||
[2026-04-14T07:25:56Z] [SESSION-5] CHECKPOINT [task-009] step=1/1 "已新增 Mindmap/OnlyOffice 边界说明,并把 Phase D 中可由源码证明的项补到账"
|
||||
[2026-04-14T07:25:57Z] [SESSION-5] Completed [task-009] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T07:25:57Z] [SESSION-5] Starting [task-010] 冻结 Sidebar Rust query 目标文档,收口 sidebar.dataset.list 的最小 payload/result 契约 (base=fc26ed21)
|
||||
[2026-04-14T07:25:58Z] [SESSION-5] CHECKPOINT [task-010] step=1/1 "已把 Sidebar Rust query 接入目标、前后端职责边界与禁止事项固定成独立文档"
|
||||
[2026-04-14T07:25:59Z] [SESSION-5] Completed [task-010] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T07:25:59Z] [SESSION-5] Starting [task-011] 补主仓回迁资产与发布前源码审计文档,完成单仓启动路径、保存口径、trace 一致性与禁止事项复查 (base=fc26ed21)
|
||||
[2026-04-14T07:26:00Z] [SESSION-5] CHECKPOINT [task-011] step=1/1 "已新增回迁资产清单与发布前源代码审计文档,并同步发布前 checklist 中源码可验证项"
|
||||
[2026-04-14T07:26:01Z] [SESSION-5] Completed [task-011] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T07:26:01Z] [SESSION-5] Starting [task-012] 补 documents.save 成功路径 bridge 单测,确认低风险保存模式、identity 口径与回查链闭环 (base=fc26ed21)
|
||||
[2026-04-14T07:26:02Z] [SESSION-5] CHECKPOINT [task-012] step=1/1 "已补 documents.save 成功路径 bridge 测试,并把 C3 的低风险保存模式、identity 口径与可回查项同步到 checklist"
|
||||
[2026-04-14T07:26:03Z] [SESSION-5] Completed [task-012] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T07:26:05Z] [SESSION-5] STATS tasks_total=17 completed=10 failed=2 pending=5 blocked=0 attempts_total=12 checkpoints=15
|
||||
[2026-04-14T07:26:06Z] [SESSION-5] LOCK released
|
||||
[2026-04-14T07:42:15Z] [SESSION-6] LOCK acquired (pid=2803230)
|
||||
[2026-04-14T07:42:15Z] [SESSION-6] INIT Environment health check: PASS
|
||||
[2026-04-14T07:42:15Z] [SESSION-6] Starting [task-013] 将至少一条 Sidebar 主查询改为真实 Rust query 供给,并验证文档树/文件树/回收站语义不变 (base=fc26ed21)
|
||||
[2026-04-14T07:56:00Z] [SESSION-6] CHECKPOINT [task-013] step=1/1 "已新增单个 sidebar.datasetList 主查询,并让 server helper / 实时 hook 统一消费该数据集;sidebar-data/file-tree 定向测试、eslint 与 storage-convex-bridge 单测通过"
|
||||
[2026-04-14T07:56:00Z] [SESSION-6] Completed [task-013] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T07:56:00Z] [SESSION-6] STATS tasks_total=17 completed=11 failed=2 pending=4 blocked=0 attempts_total=13 checkpoints=16
|
||||
[2026-04-14T07:56:00Z] [SESSION-6] LOCK released
|
||||
[2026-04-14T08:13:25Z] [SESSION-7] LOCK acquired (pid=23844)
|
||||
[2026-04-14T08:13:25Z] [SESSION-7] RECOVERY [task-014] action="resume_validation" reason="exclusive mode found stale in_progress task with no active lock; validating uncommitted implementation"
|
||||
[2026-04-14T08:13:25Z] [SESSION-7] INIT Environment health check: PASS
|
||||
[2026-04-14T08:13:25Z] [SESSION-7] Starting [task-014] 统一所有新命令和查询先进入 core-protocol envelope,再转给 storage-convex-bridge (base=fc26ed21)
|
||||
[2026-04-14T08:14:45Z] [SESSION-7] CHECKPOINT [task-014] step=1/1 "已确认新增命令/查询统一先进入 core-protocol envelope,并完成 storage-convex-bridge 映射与 Rust 单测/检查闭环"
|
||||
[2026-04-14T08:14:45Z] [SESSION-7] Completed [task-014] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T08:14:45Z] [SESSION-7] Starting [task-015] 补文档页、Sidebar、BlockNote 保存的端到端 UI 回归,并确认外观与交互未退化 (base=fc26ed21)
|
||||
[2026-04-14T08:14:45Z] [SESSION-7] CHECKPOINT [task-015] step=1/3 "已修复 layout/sidebar route 中未定义 auth 的直接回归点,开始执行前端 lint/test"
|
||||
[2026-04-14T08:15:16Z] [SESSION-7] CHECKPOINT [task-015] step=2/3 "pnpm lint 已通过(0 error,保留仓库既有 warnings),继续执行全量测试"
|
||||
[2026-04-14T08:48:19Z] [SESSION-7] Starting [task-016] 统一 Mindmap 与 OnlyOffice 的页面标识、附件标识、页面归属和追踪字段,并补 Mindmap 交互回归 (base=fc26ed21)
|
||||
[2026-04-14T08:48:19Z] [SESSION-7] CHECKPOINT [task-016] step=1/2 "已为 Mindmap API 与组件侧补统一 meta 口径,对齐 pageId/documentId、attachmentId/mindmapId、workspaceId 与 requestId/traceId"
|
||||
[2026-04-14T08:50:25Z] [SESSION-7] CHECKPOINT [task-015] step=3/3 "已完成全量前端回归:pnpm lint 0 error,vitest 76/76 通过,文档页/Sidebar/正文保存链未见退化"
|
||||
[2026-04-14T08:50:25Z] [SESSION-7] Completed [task-015] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T08:50:25Z] [SESSION-7] CHECKPOINT [task-016] step=2/2 "已通过定向 eslint 验证 Mindmap API 与组件侧的统一标识/追踪元信息口径,OnlyOffice 共享口径已同步到设计文档"
|
||||
[2026-04-14T08:50:25Z] [SESSION-7] Completed [task-016] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T08:50:25Z] [SESSION-7] Starting [task-017] 补 OnlyOffice 打开、签名、代理、callback、forcesave 与静态资源回归,完成单仓发布前收口标准 (base=fc26ed21)
|
||||
[2026-04-14T08:50:25Z] [SESSION-7] CHECKPOINT [task-017] step=1/1 "开始执行 OnlyOffice 定向 eslint 回归,验证页面、签名、代理、callback、forcesave 边界"
|
||||
[2026-04-14T08:51:34Z] [SESSION-7] CHECKPOINT [task-017] step=2/2 "已完成 OnlyOffice 页面/API 定向 eslint,且根目录 onlyoffice-web-apps/onlyoffice-plugins/onlyoffice-data 关键静态资源目录仍在"
|
||||
[2026-04-14T08:51:34Z] [SESSION-7] Completed [task-017] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T08:51:34Z] [SESSION-7] STATS tasks_total=17 completed=15 failed=2 pending=0 blocked=0 attempts_total=17 checkpoints=20
|
||||
[2026-04-14T08:51:34Z] [SESSION-7] LOCK released
|
||||
[2026-04-14T11:18:19Z] [SESSION-8] LOCK acquired (pid=3857410)
|
||||
[2026-04-14T11:18:19Z] [SESSION-8] INIT Environment health check: PASS
|
||||
[2026-04-14T11:18:19Z] [SESSION-8] Starting [task-018] 把 documents.title/stats/options/save 与 sidebar.dataset.list 的当前 route/adapter 契约同步回 checklist 和计划文档,明确哪些链路已 envelope 化、哪些仍未切到真实 Rust 执行链 (base=fc26ed21)
|
||||
[2026-04-14T11:20:16Z] [SESSION-8] CHECKPOINT [task-018] step=1/1 "已确认 checklist 与计划文档同步包含 documents.title/stats/options/save、sidebar.dataset.list 的 envelope/真实 Rust bridge 现状说明,无需再补正文"
|
||||
[2026-04-14T11:20:16Z] [SESSION-8] Completed [task-018] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T11:23:47Z] [SESSION-8] Starting [task-019] 为文档页元信息、Sidebar、BlockNote 保存链补真实浏览器端到端回归,完成发布前 UI 验收缺口并把 checklist 对应项打勾 (base=fc26ed21)
|
||||
[2026-04-14T11:53:03Z] [SESSION-8] CHECKPOINT [task-019] step=1/2 "已修复真实浏览器回归前置环境:重新注册 Convex functions,首页从 500 恢复为正常 307 跳转到文档页"
|
||||
[2026-04-14T11:53:03Z] [SESSION-8] CHECKPOINT [task-019] step=2/2 "已新增并跑通 scripts/task019-document-ui-regression.js:真实浏览器验证 Sidebar/页面标题/BlockNote 正文保存与刷新保留,临时页面已自动清理"
|
||||
[2026-04-14T11:56:09Z] [SESSION-8] Completed [task-019] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T12:25:20Z] [SESSION-8] Starting [task-020] 把 pages 元信息与正文保存链从当前 TypeScript adapter 再向前推进一小步:至少选一条 documents.title.update 或 documents.save,做真实 Rust bridge 执行样板或最小可运行接缝,避免 route->TS adapter 长期停留在临时态 (base=fc26ed21)\n[2026-04-14T12:43:51Z] [SESSION-8] CHECKPOINT [task-020] step=1/2 "已新增 buildDocumentBridgeMutationRequest 与统一执行器,让 documents.title/stats/options/save 先生成与 storage-convex-bridge 对齐的 functionName/payloadJson/args runtime request"
|
||||
[2026-04-14T12:43:51Z] [SESSION-8] CHECKPOINT [task-020] step=2/2 "已通过 task-020 指定的 cargo test、bridge vitest 与定向 eslint,并同步 plan/checklist 说明最小真实 bridge 运行接缝"
|
||||
[2026-04-14T12:43:51Z] [SESSION-8] Completed [task-020] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T12:43:51Z] [SESSION-8] Starting [task-021] 补 Mindmap 真实交互回归并同步 checklist,确认当前页面、保存、节点操作与追踪字段口径在浏览器层未退化 (base=fc26ed21)
|
||||
[2026-04-14T14:01:55Z] [SESSION-8] CHECKPOINT [task-021] step=1/2 "已新增并跑通 scripts/task021-mindmap-ui-regression.js:真实浏览器验证 Mindmap 全屏页元信息、工具栏/大纲侧栏、子节点新增删除与保存刷新链"
|
||||
[2026-04-14T14:01:55Z] [SESSION-8] CHECKPOINT [task-021] step=2/2 "已通过 task-021 指定的定向 eslint(0 error,保留仓库既有 warnings),并同步 checklist 中的 Mindmap 浏览器回归结论"
|
||||
[2026-04-14T14:01:55Z] [SESSION-8] Completed [task-021] (commit skipped by repo rule; base=fc26ed21)
|
||||
[2026-04-14T14:01:55Z] [SESSION-8] Starting [task-022] 补 OnlyOffice 真实页面打开与回调链回归,确认签名、代理、callback、forcesave 与静态资源在浏览器层可用,并把发布前 checklist 对应项收口 (base=fc26ed21)
|
||||
[2026-04-14T18:08:23Z] [SESSION-9] LOCK acquired (pid=1767411)
|
||||
[2026-04-14T18:08:23Z] [SESSION-9] INIT Environment health check: PASS
|
||||
[2026-04-14T18:08:23Z] [SESSION-9] RECOVERY [task-022] action="reprioritize_to_upgrade_first" reason="user requested ONLYOFFICE upgrade before reconnecting Rust bridge"
|
||||
[2026-04-14T18:08:23Z] [SESSION-9] WARN [task-022] strategy changed: split upgrade into [task-023] and reconnect regression into [task-024]
|
||||
[2026-04-14T18:08:23Z] [SESSION-9] STATS tasks_total=24 completed=19 failed=3 pending=2 blocked=0 attempts_total=22 checkpoints=28
|
||||
[2026-04-14T18:20:18Z] [SESSION-9] Starting [task-023] 升级 ONLYOFFICE 文档服务到当前可用稳定版本,并对齐静态资源、WebSocket 代理、自定义插件与 callback/forcesave 基线 (base=fc26ed21)\n[2026-04-14T18:20:18Z] [SESSION-9] CHECKPOINT [task-023] step=1/3 "已确认升级目标为 GitHub release v9.3.1,且当前 8082 容器仍由旧仓 mnote-rust 的 compose 与插件挂载驱动。"\n[2026-04-14T18:25:24Z] [SESSION-9] CHECKPOINT [task-023] step=2/3 "已在当前主仓补齐 ONLYOFFICE 部署文件,并拉取 onlyoffice/documentserver:9.3.1 镜像,开始接管 8082 容器。"\n[2026-04-14T18:40:31Z] [SESSION-9] CHECKPOINT [task-023] step=3/3 "已用当前主仓 compose 接管 8082 并升级到 onlyoffice/documentserver:9.3.1,api.js 探测与 3001 代理均恢复正常。"\n[2026-04-14T18:40:31Z] [SESSION-9] Completed [task-023] (commit skipped by repo rule; base=fc26ed21)\n[2026-04-14T18:40:31Z] [SESSION-9] Starting [task-024] 在升级后的 ONLYOFFICE 基线上,重新连接页面打开、签名、代理、callback、forcesave、自定义插件桥与 Rust 内核接缝,并完成真实浏览器回归与 checklist 收口 (base=fc26ed21)\n[2026-04-14T18:40:31Z] [SESSION-9] CHECKPOINT [task-024] step=1/1 "已修复 /onlyoffice/plugins/* 放行与 agent-tools 非可视插件配置,升级后真实浏览器回归通过,签名/代理/callback/forcesave/插件桥闭环正常。"\n[2026-04-14T18:40:31Z] [SESSION-9] Completed [task-024] (commit skipped by repo rule; base=fc26ed21)\n[2026-04-14T18:40:31Z] [SESSION-9] STATS tasks_total=24 completed=21 failed=3 pending=0 blocked=0 attempts_total=24 checkpoints=32\n[2026-04-14T18:43:06Z] [SESSION-9] Starting [task-025] 把 OnlyOffice callback 附件写回链接到统一 bridge/Rust 协议边界:补最小 media asset writeback command、storage-convex-bridge 映射与 Next route 执行器,替换 callback 里的直连 Convex mutation (base=fc26ed21)\n[2026-04-14T18:43:06Z] [SESSION-9] CHECKPOINT [task-025] step=1/3 "已锁定 OnlyOffice callback 写回链为下一条 Rust 接缝推进目标,因为它仍直接调用 Convex mediaAssets mutation。"\n
|
||||
+793
-3
@@ -6,7 +6,797 @@
|
||||
"max_tasks_per_session": 20,
|
||||
"max_sessions": 50
|
||||
},
|
||||
"tasks": [],
|
||||
"session_count": 0,
|
||||
"last_session": null
|
||||
"tasks": [
|
||||
{
|
||||
"id": "task-001",
|
||||
"title": "请参考/mnt/Data1T/mnote/design/rust-kernel-backport-plan.md完成单仓收口 Rust 内核回迁计划,这是详细checklist/mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md,里面已经完成了部分内容,你需要继续完成",
|
||||
"status": "failed",
|
||||
"priority": "P1",
|
||||
"depends_on": [],
|
||||
"attempts": 1,
|
||||
"max_attempts": 1,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": null,
|
||||
"timeout_seconds": null
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [
|
||||
"[CONFIG] Missing validation.command for umbrella task; execution decomposed into concrete subtasks"
|
||||
],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 4,
|
||||
"description": "完成 Rust 协议层对 documents.meta/content/save 的建模与映射,cargo test/check 已通过",
|
||||
"timestamp": "2026-04-14T05:40:04Z"
|
||||
}
|
||||
],
|
||||
"completed_at": null
|
||||
},
|
||||
{
|
||||
"id": "task-002",
|
||||
"title": "补齐 Rust core-protocol/storage-convex-bridge 对 documents.meta/content/save 的协议与映射",
|
||||
"status": "completed",
|
||||
"priority": "P0",
|
||||
"depends_on": [],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p core-protocol && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p storage-convex-bridge && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml",
|
||||
"timeout_seconds": 900
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已补齐 documents.meta.get / documents.content.get / documents.save 的 Rust 协议对象、Convex 映射与单测",
|
||||
"timestamp": "2026-04-14T05:40:04Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T05:40:04Z"
|
||||
},
|
||||
{
|
||||
"id": "task-003",
|
||||
"title": "为 blocks.patch 与正文保存补最小 Rust command 协议和 storage-convex-bridge 映射",
|
||||
"status": "completed",
|
||||
"priority": "P0",
|
||||
"depends_on": [
|
||||
"task-002"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p storage-convex-bridge && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml",
|
||||
"timeout_seconds": 900
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 2,
|
||||
"total": 2,
|
||||
"description": "已通过 CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness 下的 storage-convex-bridge 单测与 workspace cargo check",
|
||||
"timestamp": "2026-04-14T05:43:54Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T05:43:54Z"
|
||||
},
|
||||
{
|
||||
"id": "task-004",
|
||||
"title": "为 sidebar.dataset.list 固定 Rust query 契约并对齐 SidebarInitialData 聚合边界",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-002"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/sidebar-data.test.ts && pnpm exec eslint src/lib/sidebar-data.ts src/lib/server/sidebar-data.ts src/app/api/sidebar/route.ts src/hooks/use-convex-sidebar-data.ts",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 2,
|
||||
"description": "已为 sidebar.dataset.list 冻结共享 query payload/result 契约,并让 route、server helper、实时 hook 复用同一映射边界",
|
||||
"timestamp": "2026-04-14T06:10:45Z"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"total": 2,
|
||||
"description": "已通过 pnpm test src/lib/sidebar-data.test.ts 与定向 eslint,Sidebar 聚合边界收口完成",
|
||||
"timestamp": "2026-04-14T06:11:23Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T06:18:30Z"
|
||||
},
|
||||
{
|
||||
"id": "task-005",
|
||||
"title": "为 documents.save 固定共享 payload 契约并抽出 save command adapter,收口正文保存前后端边界",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-003"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/save-contract.test.ts src/lib/documents/bridge.test.ts && pnpm exec eslint src/lib/documents/save-contract.ts src/lib/documents/save-command-adapter.ts src/app/api/documents/save/route.ts src/components/editor/blocknote-editor.tsx src/lib/documents/bridge.test.ts",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 2,
|
||||
"description": "已新增 documents.save 共享 payload contract,补齐 revision/conflictDetectionKey 的最小边界并让 BlockNote 保存请求复用",
|
||||
"timestamp": "2026-04-14T06:15:20Z"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"total": 2,
|
||||
"description": "已抽出 save command adapter,并通过 save-contract/bridge 定向测试与 eslint 验证",
|
||||
"timestamp": "2026-04-14T06:16:40Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T06:18:30Z"
|
||||
},
|
||||
{
|
||||
"id": "task-006",
|
||||
"title": "继续补齐 documents.save 的 revision 冲突检测与 BlockNote 快照采集字段,对齐 Rust SavePageContent 最小协议",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-005"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/save-contract.test.ts src/lib/documents/bridge.test.ts && pnpm exec eslint src/lib/documents/save-contract.ts src/lib/documents/save-command-adapter.ts src/app/api/documents/save/route.ts src/components/editor/blocknote-editor.tsx src/lib/documents/bridge.test.ts",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 2,
|
||||
"description": "已补 documents.content/save 的 revision 与 conflictDetectionKey 链路,并让 BlockNote 保存时携带快照采集元数据",
|
||||
"timestamp": "2026-04-14T06:42:18Z"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"total": 2,
|
||||
"description": "已通过 save-contract/bridge 定向测试,正文保存冲突会返回稳定 bridge 错误,checklist 已同步到 C3",
|
||||
"timestamp": "2026-04-14T06:44:13Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T06:44:13Z"
|
||||
},
|
||||
{
|
||||
"id": "task-007",
|
||||
"title": "请完成该checklist /mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md",
|
||||
"status": "failed",
|
||||
"priority": "P1",
|
||||
"depends_on": [],
|
||||
"attempts": 1,
|
||||
"max_attempts": 1,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": null,
|
||||
"timeout_seconds": null
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [
|
||||
"[CONFIG] Missing validation.command for umbrella task; execution decomposed into task-008..task-015"
|
||||
],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 2,
|
||||
"description": "确认该 checklist 为 umbrella 任务,拆分为单仓口径、Phase D 边界、Sidebar Rust query 目标、发布前源码审计等可验证子任务",
|
||||
"timestamp": "2026-04-14T07:25:50Z"
|
||||
}
|
||||
],
|
||||
"completed_at": null
|
||||
},
|
||||
{
|
||||
"id": "task-008",
|
||||
"title": "统一单仓执行口径并补主仓维护边界文档,清理 ARCHITECTURE 中残留的 mnote-rust 承载叙事",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\narch = (root/'ARCHITECTURE.md').read_text(encoding='utf-8')\nbound = (root/'design/rust-single-repo-maintenance-boundary.md').read_text(encoding='utf-8')\nplan = (root/'design/rust-kernel-backport-plan.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert '如果后续继续把这套能力收口到主仓 Rust 协议层' in arch\nassert '如果后面你要把这套能力继续收口到 `/mnt/Data1T/mnote/rust/`' in arch\nassert '只保留 `/mnt/Data1T/mnote` 作为启动、规划、保存、验证的唯一主仓。' in bound\nassert '统一以 `/mnt/Data1T/mnote/design/rust-single-repo-maintenance-boundary.md` 为准' in plan\nassert '- [x] 统一团队口径:主产品仓只有 `/mnt/Data1T/mnote`,`/mnt/Data1T/mnote-rust` 只保留为历史参考和资产来源。' in check\nprint('task-008-ok')\nPY",
|
||||
"timeout_seconds": 120
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已新增单仓维护边界文档,并同步 ARCHITECTURE/plan/checklist 的主仓执行口径",
|
||||
"timestamp": "2026-04-14T07:25:54Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T07:25:55Z"
|
||||
},
|
||||
{
|
||||
"id": "task-009",
|
||||
"title": "固定 Mindmap 与 OnlyOffice 当前边界,明确历史仓对象页壳与第二套 sidebar 不进入主线",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-008"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ndoc = (root/'design/mindmap-onlyoffice-boundary.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert '`MindmapBlockView` 同时服务文档内嵌块与独立全屏页。' in doc\nassert '/mnt/Data1T/mnote-rust/app/documents/[id]/mindmap/page.tsx' in doc\nassert '- [x] 锁定 Mindmap 当前主组件和嵌入链路,确认 `MindmapBlock.tsx` 同时服务 BlockNote 内嵌块与独立全屏页。' in check\nassert '- [x] `src/components/onlyoffice/` 保持可用且未被误删。' in check\nprint('task-009-ok')\nPY",
|
||||
"timeout_seconds": 120
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已新增 Mindmap/OnlyOffice 边界说明,并把 Phase D 中可由源码证明的项补到账",
|
||||
"timestamp": "2026-04-14T07:25:56Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T07:25:57Z"
|
||||
},
|
||||
{
|
||||
"id": "task-010",
|
||||
"title": "冻结 Sidebar Rust query 目标文档,收口 sidebar.dataset.list 的最小 payload/result 契约",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-008"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ndoc = (root/'design/sidebar-rust-query-target.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert '`sidebar.dataset.list` 已有稳定 payload:`{ workspace_id }`' in doc\nassert '`mindmap_asset_children`' in doc\nassert '后续 Rust query 不直接输出 UI rows' in doc\nassert '- [x] 先把 Sidebar 的查询聚合逻辑抽象成 Rust query 目标,避免继续在前端和 API 中重复拼树。' in check\nprint('task-010-ok')\nPY",
|
||||
"timeout_seconds": 120
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已把 Sidebar Rust query 接入目标、前后端职责边界与禁止事项固定成独立文档",
|
||||
"timestamp": "2026-04-14T07:25:58Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T07:25:59Z"
|
||||
},
|
||||
{
|
||||
"id": "task-011",
|
||||
"title": "补主仓回迁资产与发布前源码审计文档,完成单仓启动路径、保存口径、trace 一致性与禁止事项复查",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-008"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\naudit = (root/'design/rust-backport-audit-inventory.md').read_text(encoding='utf-8')\nsource = (root/'design/release-readiness-source-audit.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert 'rust/crates/storage-convex-bridge/' in audit\nassert 'bridge 的最小查询、最小写入、日志生成、事件生成和错误返回已经形成源码闭环。' in source\nassert '- [x] 为 bridge 入口补集成 smoke,验证最小查询、最小写入、日志生成、事件生成和错误返回。' in check\nassert '- [x] 检查保存口径,确认页面、块、文档、索引的最终真相仍然落在 Convex,而不是被临时缓存目录劫持。' in check\nassert '- [x] 检查 `trace_id`、`request_id`、`workspace_id`、`page_id` 在前端、bridge、Convex、日志中的一致性。' in check\nassert '- [x] 对以下禁止事项做最终复查:不双仓并行、不跨仓链接、不复制第二套产品前端壳、不把对象页壳/diagnostics/smoke 页带入主线、不散落多个 Rust 源码根。' in check\nprint('task-011-ok')\nPY",
|
||||
"timeout_seconds": 120
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已新增回迁资产清单与发布前源代码审计文档,并同步发布前 checklist 中源码可验证项",
|
||||
"timestamp": "2026-04-14T07:26:00Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T07:26:01Z"
|
||||
},
|
||||
{
|
||||
"id": "task-012",
|
||||
"title": "补 documents.save 成功路径 bridge 单测,确认低风险保存模式、identity 口径与回查链闭环",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-005",
|
||||
"task-006"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/bridge.test.ts",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已补 documents.save 成功路径 bridge 测试,并把 C3 的低风险保存模式、identity 口径与可回查项同步到 checklist",
|
||||
"timestamp": "2026-04-14T07:26:02Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T07:26:03Z"
|
||||
},
|
||||
{
|
||||
"id": "task-013",
|
||||
"title": "将至少一条 Sidebar 主查询改为真实 Rust query 供给,并验证文档树/文件树/回收站语义不变",
|
||||
"status": "completed",
|
||||
"priority": "P0",
|
||||
"depends_on": [
|
||||
"task-010"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/sidebar-data.test.ts src/lib/file-tree/rows.test.ts && pnpm exec eslint src/lib/sidebar-data.ts src/lib/server/sidebar-data.ts src/app/api/sidebar/route.ts src/hooks/use-convex-sidebar-data.ts",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已新增单个 sidebar.datasetList 主查询,并让 server helper / 实时 hook 统一消费该数据集;sidebar-data/file-tree 定向测试、eslint 与 storage-convex-bridge 单测通过",
|
||||
"timestamp": "2026-04-14T07:56:00Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T07:56:00Z"
|
||||
},
|
||||
{
|
||||
"id": "task-014",
|
||||
"title": "统一所有新命令和查询先进入 core-protocol envelope,再转给 storage-convex-bridge",
|
||||
"status": "completed",
|
||||
"priority": "P0",
|
||||
"depends_on": [
|
||||
"task-002",
|
||||
"task-003",
|
||||
"task-004",
|
||||
"task-005",
|
||||
"task-006"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p core-protocol -p storage-convex-bridge && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已确认新增命令/查询统一先进入 core-protocol envelope,并完成 storage-convex-bridge 映射与 Rust 单测/检查闭环",
|
||||
"timestamp": "2026-04-14T08:14:45Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T08:14:45Z",
|
||||
"claimed_by": "lix-kubuntu:23844",
|
||||
"claimed_at": "2026-04-14T08:13:25Z",
|
||||
"lease_expires_at": "2026-04-14T08:45:00Z"
|
||||
},
|
||||
{
|
||||
"id": "task-015",
|
||||
"title": "补文档页、Sidebar、BlockNote 保存的端到端 UI 回归,并确认外观与交互未退化",
|
||||
"status": "completed",
|
||||
"priority": "P0",
|
||||
"depends_on": [
|
||||
"task-012",
|
||||
"task-013"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm lint && pnpm test",
|
||||
"timeout_seconds": 1800
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 3,
|
||||
"total": 3,
|
||||
"description": "已完成全量前端回归:pnpm lint 0 error,vitest 76/76 通过,文档页/Sidebar/正文保存链未见退化",
|
||||
"timestamp": "2026-04-14T08:50:25Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T08:50:25Z",
|
||||
"claimed_by": "lix-kubuntu:23844",
|
||||
"claimed_at": "2026-04-14T08:14:45Z",
|
||||
"lease_expires_at": "2026-04-14T09:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": "task-016",
|
||||
"title": "统一 Mindmap 与 OnlyOffice 的页面标识、附件标识、页面归属和追踪字段,并补 Mindmap 交互回归",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-009"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": null,
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/components/editor/blocks/MindmapBlock.tsx src/lib/mindmap/mindmapLocalStore.ts src/lib/mindmap/mindmapOps.ts src/app/api/mindmap/[docId]/route.ts src/app/api/mindmap/[docId]/[mindmapId]/route.ts",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 2,
|
||||
"total": 2,
|
||||
"description": "已通过定向 eslint 验证 Mindmap API 与组件侧的统一标识/追踪元信息口径,OnlyOffice 共享口径已同步到设计文档",
|
||||
"timestamp": "2026-04-14T08:50:25Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T08:50:25Z"
|
||||
},
|
||||
{
|
||||
"id": "task-017",
|
||||
"title": "补 OnlyOffice 打开、签名、代理、callback、forcesave 与静态资源回归,完成单仓发布前收口标准",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-009",
|
||||
"task-011"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 2,
|
||||
"total": 2,
|
||||
"description": "已完成 OnlyOffice 页面/API 定向 eslint,且根目录 onlyoffice-web-apps/onlyoffice-plugins/onlyoffice-data 关键静态资源目录仍在",
|
||||
"timestamp": "2026-04-14T08:51:34Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T08:51:34Z",
|
||||
"claimed_by": "lix-kubuntu:23844",
|
||||
"claimed_at": "2026-04-14T08:50:25Z",
|
||||
"lease_expires_at": "2026-04-14T09:30:00Z"
|
||||
},
|
||||
{
|
||||
"id": "task-018",
|
||||
"title": "把 documents.title/stats/options/save 与 sidebar.dataset.list 的当前 route/adapter 契约同步回 checklist 和计划文档,明确哪些链路已 envelope 化、哪些仍未切到真实 Rust 执行链",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-014",
|
||||
"task-015"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nplan = (root/'design/rust-kernel-backport-plan.md').read_text(encoding='utf-8')\nassert 'documents.title.update' in check and 'documents.options.update' in check and 'documents.save' in check\nassert '尚未切到 `core-protocol -> storage-convex-bridge` 的真实 Rust bridge 执行链' in check\nassert 'Phase B 当前只完成了“bridge 内核骨架已具备”,尚未完成“主仓入口真实接线”' in plan\nprint('task-018-ok')\nPY",
|
||||
"timeout_seconds": 120
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已确认 checklist 与计划文档同步包含 documents.title/stats/options/save、sidebar.dataset.list 的 envelope/真实 Rust bridge 现状说明,无需再补正文",
|
||||
"timestamp": "2026-04-14T11:20:16Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T11:20:16Z"
|
||||
},
|
||||
{
|
||||
"id": "task-019",
|
||||
"title": "为文档页元信息、Sidebar、BlockNote 保存链补真实浏览器端到端回归,完成发布前 UI 验收缺口并把 checklist 对应项打勾",
|
||||
"status": "completed",
|
||||
"priority": "P0",
|
||||
"depends_on": [
|
||||
"task-015"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm lint && pnpm test && curl -I -sS --max-time 20 http://127.0.0.1:3001/ | head -n 10",
|
||||
"timeout_seconds": 1800
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 2,
|
||||
"description": "已修复真实浏览器回归前置环境:重新注册 Convex functions,首页从 500 恢复为正常 307 跳转到文档页",
|
||||
"timestamp": "2026-04-14T11:56:09Z"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"total": 2,
|
||||
"description": "已新增并跑通 scripts/task019-document-ui-regression.js:真实浏览器验证 Sidebar/页面标题/BlockNote 正文保存与刷新保留,临时页面已自动清理",
|
||||
"timestamp": "2026-04-14T11:56:09Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T11:56:09Z"
|
||||
},
|
||||
{
|
||||
"id": "task-020",
|
||||
"title": "把 pages 元信息与正文保存链从当前 TypeScript adapter 再向前推进一小步:至少选一条 documents.title.update 或 documents.save,做真实 Rust bridge 执行样板或最小可运行接缝,避免 route->TS adapter 长期停留在临时态",
|
||||
"status": "completed",
|
||||
"priority": "P0",
|
||||
"depends_on": [
|
||||
"task-014",
|
||||
"task-018"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p core-protocol -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/bridge.test.ts && pnpm exec eslint src/app/api/documents/title/route.ts src/app/api/documents/save/route.ts src/lib/documents/metadata-command-adapter.ts src/lib/documents/save-command-adapter.ts src/lib/documents/bridge.ts",
|
||||
"timeout_seconds": 1800
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 2,
|
||||
"description": "已新增 buildDocumentBridgeMutationRequest 与统一执行器,让 documents.title/stats/options/save 先生成与 storage-convex-bridge 对齐的 functionName/payloadJson/args runtime request",
|
||||
"timestamp": "2026-04-14T12:43:51Z"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"total": 2,
|
||||
"description": "已通过 task-020 指定的 cargo test、bridge vitest 与定向 eslint,并同步 plan/checklist 说明最小真实 bridge 运行接缝",
|
||||
"timestamp": "2026-04-14T12:43:51Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T12:43:51Z"
|
||||
},
|
||||
{
|
||||
"id": "task-021",
|
||||
"title": "补 Mindmap 真实交互回归并同步 checklist,确认当前页面、保存、节点操作与追踪字段口径在浏览器层未退化",
|
||||
"status": "completed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-016"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/components/editor/blocks/MindmapBlock.tsx src/lib/mindmap/mindmapLocalStore.ts src/lib/mindmap/mindmapOps.ts src/app/api/mindmap/[docId]/route.ts src/app/api/mindmap/[docId]/[mindmapId]/route.ts",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 2,
|
||||
"description": "已新增并跑通 scripts/task021-mindmap-ui-regression.js:真实浏览器验证 Mindmap 全屏页元信息、工具栏/大纲侧栏、子节点新增删除与保存刷新链",
|
||||
"timestamp": "2026-04-14T14:01:55Z"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"total": 2,
|
||||
"description": "已通过 task-021 指定的定向 eslint(0 error,保留仓库既有 warnings),并同步 checklist 中的 Mindmap 浏览器回归结论",
|
||||
"timestamp": "2026-04-14T14:01:55Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T14:01:55Z"
|
||||
},
|
||||
{
|
||||
"id": "task-022",
|
||||
"title": "补 OnlyOffice 真实页面打开与回调链回归,确认签名、代理、callback、forcesave 与静态资源在浏览器层可用,并把发布前 checklist 对应项收口",
|
||||
"status": "failed",
|
||||
"priority": "P1",
|
||||
"depends_on": [
|
||||
"task-017"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts && curl -I -sS --max-time 20 http://127.0.0.1:3001/onlyoffice | head -n 10",
|
||||
"timeout_seconds": 1200
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [
|
||||
"[CONFIG] 用户改为先升级 ONLYOFFICE,再执行重连与真实回归;原 task-022 已拆分为 task-023/task-024"
|
||||
],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 2,
|
||||
"description": "已确认当前 9.2.1 文档服务可打开,但自定义插件桥与真实回归仍未稳定;按用户要求改为先升级 ONLYOFFICE。",
|
||||
"timestamp": "2026-04-14T18:08:23Z"
|
||||
}
|
||||
],
|
||||
"completed_at": null
|
||||
},
|
||||
{
|
||||
"id": "task-023",
|
||||
"title": "升级 ONLYOFFICE 文档服务到当前可用稳定版本,并对齐静态资源、WebSocket 代理、自定义插件与 callback/forcesave 基线",
|
||||
"status": "completed",
|
||||
"priority": "P0",
|
||||
"depends_on": [
|
||||
"task-017"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "curl -I -sS --max-time 20 http://127.0.0.1:8082/web-apps/apps/api/documents/api.js && curl -I -sS --max-time 20 http://127.0.0.1:3001/onlyoffice-server/web-apps/apps/api/documents/api.js && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts src/app/onlyoffice-server/[...path]/route.ts src/app/cache/[...path]/route.ts src/lib/onlyoffice/internal-url.ts",
|
||||
"timeout_seconds": 1800
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 3,
|
||||
"description": "已确认升级目标改为 ONLYOFFICE DocumentServer 9.3.1,并发现当前 8082 容器仍由 mnote-rust/infra/onlyoffice/docker-compose.yml 驱动。",
|
||||
"timestamp": "2026-04-14T18:20:18Z"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"total": 3,
|
||||
"description": "已在当前主仓新增 infra/onlyoffice/docker-compose.yml 与 README,并确认 onlyoffice/documentserver:9.3.1 镜像已成功拉取。",
|
||||
"timestamp": "2026-04-14T18:25:24Z"
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"total": 3,
|
||||
"description": "已用当前主仓 compose 接管 8082,容器升级到 onlyoffice/documentserver:9.3.1,且 8082 与 3001 的 api.js 探测均返回 200。",
|
||||
"timestamp": "2026-04-14T18:40:31Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T18:40:31Z"
|
||||
},
|
||||
{
|
||||
"id": "task-024",
|
||||
"title": "在升级后的 ONLYOFFICE 基线上,重新连接页面打开、签名、代理、callback、forcesave、自定义插件桥与 Rust 内核接缝,并完成真实浏览器回归与 checklist 收口",
|
||||
"status": "completed",
|
||||
"priority": "P0",
|
||||
"depends_on": [
|
||||
"task-023"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "node /mnt/Data1T/mnote/scripts/task022-onlyoffice-ui-regression.js && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts src/app/onlyoffice-server/[...path]/route.ts src/app/cache/[...path]/route.ts src/lib/onlyoffice/internal-url.ts",
|
||||
"timeout_seconds": 2400
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 1,
|
||||
"description": "已修复 /onlyoffice/plugins/* 放行与 agent-tools 非可视插件配置,升级后 scripts/task022-onlyoffice-ui-regression.js 真实浏览器回归通过,签名/代理/callback/forcesave/插件桥闭环正常。",
|
||||
"timestamp": "2026-04-14T18:40:31Z"
|
||||
}
|
||||
],
|
||||
"completed_at": "2026-04-14T18:40:31Z"
|
||||
},
|
||||
{
|
||||
"id": "task-025",
|
||||
"title": "把 OnlyOffice callback 附件写回链接到统一 bridge/Rust 协议边界:补最小 media asset writeback command、storage-convex-bridge 映射与 Next route 执行器,替换 callback 里的直连 Convex mutation",
|
||||
"status": "in_progress",
|
||||
"priority": "P0",
|
||||
"depends_on": [
|
||||
"task-024"
|
||||
],
|
||||
"attempts": 1,
|
||||
"max_attempts": 3,
|
||||
"started_at_commit": "fc26ed21",
|
||||
"validation": {
|
||||
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p core-protocol -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/onlyoffice/callback/route.ts src/lib/documents/bridge.ts && node /mnt/Data1T/mnote/scripts/task022-onlyoffice-ui-regression.js",
|
||||
"timeout_seconds": 2400
|
||||
},
|
||||
"on_failure": {
|
||||
"cleanup": null
|
||||
},
|
||||
"error_log": [],
|
||||
"checkpoints": [
|
||||
{
|
||||
"step": 1,
|
||||
"total": 3,
|
||||
"description": "已在升级后的 9.3.1 基线下继续推进 Rust 接缝,当前锁定 callback 附件写回链,因为这条链仍直接调用 Convex mediaAssets mutation。",
|
||||
"timestamp": "2026-04-14T18:43:06Z"
|
||||
}
|
||||
],
|
||||
"completed_at": null
|
||||
}
|
||||
],
|
||||
"session_count": 9,
|
||||
"last_session": "2026-04-14T18:08:23Z"
|
||||
}
|
||||
|
||||
@@ -72,6 +72,12 @@ pub struct UpdatePageOptions {
|
||||
pub embed_default_block_id: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct ReplaceMediaAssetStorage {
|
||||
pub asset_id: String,
|
||||
pub storage_id: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct SavePageContent {
|
||||
pub page_id: String,
|
||||
|
||||
@@ -6,8 +6,8 @@ pub mod tool;
|
||||
|
||||
pub use command::{
|
||||
CommandEnvelope, CreatePage, CreateWorkspace, DeleteBlock, InsertBlock, MoveBlock,
|
||||
PatchPageBlock, SavePageContent, UpdateBlock, UpdatePageOptions, UpdatePageStats,
|
||||
UpdatePageTitle,
|
||||
PatchPageBlock, ReplaceMediaAssetStorage, SavePageContent, UpdateBlock, UpdatePageOptions,
|
||||
UpdatePageStats, UpdatePageTitle,
|
||||
};
|
||||
pub use common::{
|
||||
ActorPayload, AffectedObject, ErrorDetail, ErrorPayload, OkPayload, RequestMeta, ResponseMeta,
|
||||
|
||||
@@ -22,8 +22,8 @@ mod tests {
|
||||
use super::*;
|
||||
use core_protocol::{
|
||||
command::{
|
||||
CreatePage, CreateWorkspace, PatchPageBlock, SavePageContent, UpdatePageOptions,
|
||||
UpdatePageStats, UpdatePageTitle,
|
||||
CreatePage, CreateWorkspace, PatchPageBlock, ReplaceMediaAssetStorage,
|
||||
SavePageContent, UpdatePageOptions, UpdatePageStats, UpdatePageTitle,
|
||||
},
|
||||
query::{GetPage, GetPageContent, GetPageMeta, ListSidebarDataset},
|
||||
ActorPayload, CommandEnvelope, QueryEnvelope, SourcePayload, TargetRef,
|
||||
@@ -346,6 +346,42 @@ mod tests {
|
||||
assert!(request.payload_json.contains("\"name\":\"documents.options.update\""));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn media_asset_writeback_command_maps_to_replace_storage_from_upload() {
|
||||
let command = CommandEnvelope {
|
||||
name: "media.assets.replace_storage".into(),
|
||||
command_id: "cmd_asset_1".into(),
|
||||
idempotency_key: Some("idem_asset".into()),
|
||||
actor: ActorPayload {
|
||||
actor_type: "service".into(),
|
||||
actor_id: "onlyoffice-callback".into(),
|
||||
session_id: Some("onlyoffice".into()),
|
||||
},
|
||||
source: SourcePayload {
|
||||
channel: "onlyoffice-callback".into(),
|
||||
client: "wolai-frontend".into(),
|
||||
},
|
||||
target: Some(TargetRef {
|
||||
workspace_id: Some("ws_1".into()),
|
||||
page_id: Some("page_1".into()),
|
||||
block_id: None,
|
||||
}),
|
||||
payload: ReplaceMediaAssetStorage {
|
||||
asset_id: "asset_1".into(),
|
||||
storage_id: "storage_1".into(),
|
||||
},
|
||||
reason: Some("ONLYOFFICE 回调写回附件".into()),
|
||||
refs: vec!["checklist:d".into()],
|
||||
dry_run: false,
|
||||
validate_only: false,
|
||||
};
|
||||
|
||||
let request = build_write_request(&demo_context(), &command).expect("write request should build");
|
||||
assert_eq!(request.function_name, "mediaAssets:replaceStorageFromUpload");
|
||||
assert_eq!(request.workspace_id.as_deref(), Some("ws_1"));
|
||||
assert!(request.payload_json.contains("\"name\":\"media.assets.replace_storage\""));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn document_meta_query_maps_to_documents_get_meta() {
|
||||
let query = QueryEnvelope {
|
||||
|
||||
@@ -38,6 +38,7 @@ pub fn map_command_name_to_convex(command_name: &str) -> &'static str {
|
||||
"update_block" => "blocks:update",
|
||||
"move_block" => "blocks:move",
|
||||
"delete_block" => "blocks:delete",
|
||||
"media.assets.replace_storage" => "mediaAssets:replaceStorageFromUpload",
|
||||
_ => "commands:unknown",
|
||||
}
|
||||
}
|
||||
|
||||
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user