Files
writing-agent/tests/worker-set-sanitize.test.ts
moranzhi 94f67fa744 引入上下文片段、固定槽与投影排序,并完善机遇裁定与游玩期 UI。
把创作产物收敛为可挂载片段与 play_slots/context_order,同步修订世界模拟器模块与运行时拼装。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-03 01:36:32 +08:00

123 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it } from "vitest";
import {
extractJsonObjectText,
isUsableWorkerSet,
looksLikeProseNotSpec,
parseWorkerSetYaml,
} from "../src/skills/worker-set-parse.js";
import {
parseWorkerResponseForTest,
sanitizeWorkerSetOutputs,
} from "../src/worker/executor.js";
describe("worker-set prose rejection", () => {
it("does not YAML-crash on Chinese prose; returns clear parseError", () => {
const prose =
"我们被要求输出 JSON。首先根据用户输入和 SKILL进行实例设计。用户需求是扮演一个坠机的幸存者…";
expect(looksLikeProseNotSpec(prose)).toBe(true);
const parsed = parseWorkerSetYaml(prose);
expect(parsed?.parseError).toMatch(/不是 JSON 规格|askUser/);
expect(parsed?.parseError).not.toMatch(/Implicit keys/);
});
it("extracts JSON object from surrounding prose", () => {
const raw = `说明如下:\n\`\`\`json\n{"version":1,"workers":[{"ref":"narrator","duty":"转述","acceptance":"review"}]}\n\`\`\``;
const extracted = extractJsonObjectText(raw);
expect(extracted?.startsWith("{")).toBe(true);
expect(isUsableWorkerSet(parseWorkerSetYaml(extracted!))).toBe(true);
});
});
describe("sanitizeWorkerSetOutputs", () => {
it("converts prose-in-draft to askUser and clears bad tag", () => {
const result = sanitizeWorkerSetOutputs({
outputs: {
"设计.worker集.草稿":
"坠机后伤势如何?\n请描述你的初始状态轻伤还是重伤\n也可以让我随机生成。",
},
summary: "提问",
preview: "…",
});
expect(result.outputs["设计.worker集.草稿"]).toBeUndefined();
expect(result.askUser?.length).toBeGreaterThan(0);
});
it("keeps valid JSON draft", () => {
const json = JSON.stringify({
version: 1,
workers: [{ ref: "world-simulator", duty: "世界", acceptance: "continue" }],
});
const result = sanitizeWorkerSetOutputs({
outputs: { "设计.worker集.草稿": json },
summary: "草案",
preview: json,
});
expect(result.outputs["设计.worker集.草稿"]).toContain("world-simulator");
expect(result.askUser).toBeUndefined();
});
it("parseWorkerResponse does not dump raw prose into worker-set tags", () => {
const raw =
"我们被要求输出 JSON。请描述你的初始状态伤势如何";
const result = parseWorkerResponseForTest(raw, [
"设计.worker集.草稿",
"设计.worker集",
"用户.需求",
]);
expect(result.outputs["设计.worker集.草稿"]).toBeUndefined();
expect(result.askUser?.length).toBeGreaterThan(0);
});
it("accepts nested object outputs for worker set", () => {
const result = parseWorkerResponseForTest(
JSON.stringify({
outputs: {
"设计.worker集.草稿": {
version: 1,
workers: [{ ref: "narrator", duty: "转述", acceptance: "review" }],
},
},
summary: "ok",
askUser: null,
}),
["设计.worker集.草稿"],
);
expect(result.outputs["设计.worker集.草稿"]).toContain("narrator");
expect(result.askUser).toBeUndefined();
});
it("lifts fragment 追问/自评 into askUser + askAssessment", () => {
const result = parseWorkerResponseForTest(
JSON.stringify({
outputs: {
"设计.美学纲领与交互范式": {
schema: "context-fragment.v1",
brief: "孤立免疫",
: { : { : "特权与惊惶" } },
: {
: [{ : "美学纲领", 分数: 60, : "边界未锁" }],
: "尺度",
},
: {
: "还需确认:",
: [
{
: "血腥如何用?",
: ["少而锋利", "常态压抑"],
: "锈迹即可",
},
],
},
},
},
summary: "美学纲领 · 孤立免疫",
}),
["设计.美学纲领与交互范式"],
);
expect(result.askUser?.length).toBe(1);
expect(result.askUser?.[0]?.options?.length).toBe(2);
expect(result.askAssessment).toContain("美学纲领 60%");
expect(result.askAssessment).toContain("还需确认");
});
});