引入上下文片段、固定槽与投影排序,并完善机遇裁定与游玩期 UI。

把创作产物收敛为可挂载片段与 play_slots/context_order,同步修订世界模拟器模块与运行时拼装。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-03 01:36:32 +08:00
parent 00dfcb6615
commit 94f67fa744
69 changed files with 7786 additions and 1283 deletions

View File

@@ -47,7 +47,9 @@ describe("formatWorkerSetForUser", () => {
expect(view.headline).toContain("西幻");
expect(view.playModeLabel).toBe("行动–反应循环");
expect(view.workers).toHaveLength(2);
expect(view.workers[0].displayName).toBe("世界模拟");
expect(view.workers[0].displayName).toBe("世界");
expect(view.playSlots?.some((s) => s.id === "gm" && s.enabled)).toBe(true);
expect(view.contextOrder?.slots?.length).toBeGreaterThan(0);
expect(view.creationUnits?.map((u) => u.id)).toEqual(
expect.arrayContaining([
"fixed:aesthetics", // sample 含 narrator.presentation
@@ -121,9 +123,13 @@ workers:
expect(view.interactionParadigm).toContain("旁观");
expect(view.coreWorker).toBe("world-simulator");
expect(view.reasoning).toContain("信息隔绝");
expect(view.workers[0].roleLabel).toBe("核心");
expect(view.workers[0].rationale).toContain("裁决");
expect(view.workers[1].mergeConsidered).toContain("NPC");
// 推断 play_slots 后顺序为 perspective → gm角色用槽位中文名
const gm = view.workers.find((w) => w.id === "world-simulator");
const perspective = view.workers.find((w) => w.id === "role-decide");
expect(gm?.roleLabel).toBe("主世界层");
expect(gm?.rationale).toContain("裁决");
expect(perspective?.roleLabel).toBe("角色视角");
expect(perspective?.mergeConsidered).toContain("NPC");
});
it("merges default context when explicit context omitted", () => {
@@ -134,9 +140,14 @@ workers:
when: 世界机之后
`)!;
const view = formatWorkerSetForUser(parsed)!;
expect(view.workers[0].context.staticTags.some((t) => t.tag.includes("变量.目录"))).toBe(
true,
);
expect(
view.workers[0].context.staticTags.some(
(t) =>
t.tag.includes("变量.目录") ||
t.tag.includes("变量设计") ||
t.tag.includes("设计.变量"),
),
).toBe(true);
expect(view.workers[0].context.explicit).toBe(false);
expect(view.workers[0].writes).toContain("变量.当前");
});