commit 1a9a5d6692538a7fb3d3719df1c93779967814f6 Author: jiayiyan <43424880@qq.com> Date: Mon May 18 15:44:14 2026 +0800 feat: add template roles — OfficeMeta + DifferMeta schemas diff --git a/templates/document-editor/__tests__/roles.test.ts b/templates/document-editor/__tests__/roles.test.ts new file mode 100644 index 0000000..95684da --- /dev/null +++ b/templates/document-editor/__tests__/roles.test.ts @@ -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(); + }); +}); diff --git a/templates/document-editor/package.json b/templates/document-editor/package.json new file mode 100644 index 0000000..877998c --- /dev/null +++ b/templates/document-editor/package.json @@ -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" + } +} diff --git a/templates/document-editor/src/roles.ts b/templates/document-editor/src/roles.ts new file mode 100644 index 0000000..e2c9f7e --- /dev/null +++ b/templates/document-editor/src/roles.ts @@ -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; + +export const officeRole: RoleDefinition = { + 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; + +export const differRole: RoleDefinition = { + 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, +};