feat: add template roles — OfficeMeta + DifferMeta schemas

This commit is contained in:
jiayiyan
2026-05-18 15:44:14 +08:00
commit 1a9a5d6692
3 changed files with 105 additions and 0 deletions
@@ -0,0 +1,45 @@
import { describe, expect, test } from "bun:test";
import { differMetaSchema, officeMetaSchema } from "../src/roles.js";
describe("officeMetaSchema", () => {
test("parses generate mode", () => {
const result = officeMetaSchema.parse({
mode: "generate",
outputDocx: "/tmp/out.docx",
sourceDocx: null,
});
expect(result.mode).toBe("generate");
expect(result.outputDocx).toBe("/tmp/out.docx");
});
test("parses edit mode", () => {
const result = officeMetaSchema.parse({
mode: "edit",
outputDocx: "/tmp/modified.docx",
sourceDocx: "/tmp/original.docx",
});
expect(result.mode).toBe("edit");
expect(result.sourceDocx).toBe("/tmp/original.docx");
});
test("rejects unknown mode", () => {
expect(() => officeMetaSchema.parse({ mode: "unknown", outputDocx: "/tmp/x.docx" })).toThrow();
});
});
describe("differMetaSchema", () => {
test("parses valid differ meta", () => {
const result = differMetaSchema.parse({
outputDocx: "/tmp/modified.docx",
sourceDocx: "/tmp/original.docx",
diffReport: "/tmp/diff_report.html",
});
expect(result.diffReport).toBe("/tmp/diff_report.html");
});
test("rejects missing diffReport", () => {
expect(() =>
differMetaSchema.parse({ outputDocx: "/tmp/out.docx", sourceDocx: "/tmp/src.docx" }),
).toThrow();
});
});
+20
View File
@@ -0,0 +1,20 @@
{
"name": "@local/template-document-editor",
"version": "0.0.1",
"private": true,
"type": "module",
"exports": {
".": {
"bun": "./src/index.ts",
"import": "./src/index.ts"
}
},
"scripts": {
"test": "bun test"
},
"dependencies": {
"@uncaged/workflow-runtime": "workspace:^",
"@uncaged/workflow-register": "workspace:^",
"zod": "^4.0.0"
}
}
+40
View File
@@ -0,0 +1,40 @@
import type { RoleDefinition } from "@uncaged/workflow-runtime";
import * as z from "zod/v4";
export const officeMetaSchema = z.discriminatedUnion("mode", [
z.object({ mode: z.literal("generate"), outputDocx: z.string(), sourceDocx: z.null() }),
z.object({ mode: z.literal("edit"), outputDocx: z.string(), sourceDocx: z.string() }),
]);
export type OfficeMeta = z.infer<typeof officeMetaSchema>;
export const officeRole: RoleDefinition<OfficeMeta> = {
description: "Generates or edits a Word document via the office-agent CLI.",
systemPrompt: "",
schema: officeMetaSchema,
};
export const differMetaSchema = z.object({
outputDocx: z.string(),
sourceDocx: z.string(),
diffReport: z.string(),
});
export type DifferMeta = z.infer<typeof differMetaSchema>;
export const differRole: RoleDefinition<DifferMeta> = {
description: "Runs docx-diff on original and edited documents and produces an HTML diff report.",
systemPrompt: "",
schema: differMetaSchema,
};
export const DOCUMENT_EDITOR_DESCRIPTION =
"Generate or edit a Word document via office-agent; for edits, produce an HTML diff report with docx-diff.";
export type DocumentEditorMeta = {
office: OfficeMeta;
differ: DifferMeta;
};
export const documentEditorRoles = {
office: officeRole,
differ: differRole,
};