{"id":"content-repurpose-matrix","title":"Repurpose Matrix","description":"Matrix typed. Content repurposing. Typed v1 agent with eval coverage.","category":"content","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["content","structured-output","v1"],"packages":["@agentskit/core","@agentskit/runtime","@agentskit/tools"],"files":["agent.ts","README.md","eval.ts"],"requires":{"zod":"^3","zod-to-json-schema":"^3"},"skill":{"name":"content-repurpose-matrix","description":"Matrix typed. Content repurposing. Typed v1 agent with eval coverage.","systemPrompt":"You are Repurpose Matrix. Content repurposing. Output: Matrix typed.\nDraft sections with citations from input. Gaps for missing facts.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_repurpose_matrix exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.content-repurpose-matrix","name":"Repurpose Matrix","description":"Matrix typed. Content repurposing. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"content-repurpose-matrix","description":"Matrix typed. Content repurposing. Typed v1 agent with eval coverage.","capabilities":{"streaming":true,"cancellation":true,"requiresApproval":false}}]},"sources":[{"path":"agent.ts","content":"import type { AdapterFactory, ChatMemory, Observer, ToolCall, ToolDefinition } from '@agentskit/core'\nimport { fenceUntrustedContent, UNTRUSTED_CONTENT_DIRECTIVE } from '@agentskit/core/security'\nimport { invokeStructured } from '@agentskit/runtime'\nimport { defineZodTool } from '@agentskit/tools'\nimport { z } from 'zod'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport type { JSONSchema7 } from 'json-schema'\n\n/** Repurpose Matrix — v1 validated. Pain: Content repurposing */\n\nexport interface Section { heading: string; body: string; citations: string[] }\nexport interface AgentOutput { title: string; sections: Section[]; gaps: string[]; openQuestions: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface ContentRepurposeMatrixConfig {\n  adapter: AdapterFactory\n  memory?: ChatMemory\n  observers?: Observer[]\n  onConfirm?: (toolCall: ToolCall) => boolean | Promise<boolean>\n  maxSteps?: number\n}\n\nconst Output = z.object({\n  title: z.string(),\n  sections: z.array(z.object({ heading: z.string(), body: z.string(), citations: z.array(z.string()).default([]) })).min(1),\n  gaps: z.array(z.string()).default([]),\n  openQuestions: z.array(z.string()).default([]),\n})\nconst toJson = (s: z.ZodTypeAny): JSONSchema7 => zodToJsonSchema(s) as JSONSchema7\n\nconst skill = {\n  name: 'content-repurpose-matrix',\n  description: \"Repurpose Matrix — typed output agent (draft spec).\",\n  systemPrompt: `You are Repurpose Matrix. Content repurposing. Output: Matrix typed.\nDraft sections with citations from input. Gaps for missing facts.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_repurpose_matrix exactly once. Stop.`,\n  tools: ['submit_repurpose_matrix'],\n}\n\nexport function createContentRepurposeMatrixAgent(config: ContentRepurposeMatrixConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_repurpose_matrix', description: 'Submit result. Once.', schema: Output, toJsonSchema: toJson, async execute() { return 'recorded' } }) as ToolDefinition\n\n  async function run(input: string): Promise<AgentResult> {\n    if (!input?.trim()) throw new Error('content-repurpose-matrix requires non-empty input')\n    const result = await invokeStructured({\n      adapter: config.adapter,\n      tool: submit(),\n      task: `INPUT:\\n${fenceUntrustedContent(input)}`,\n      parse: (a) => Output.parse(a),\n      skill,\n      memory: config.memory,\n      observers: config.observers,\n      onConfirm: config.onConfirm,\n      maxSteps: config.maxSteps ?? 4,\n    })\n    return { ...result, requiresReview: true }\n  }\n  return {\n    name: 'content-repurpose-matrix',\n    run,\n    asHandle() { return { name: 'content-repurpose-matrix', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Repurpose Matrix\n\n> **v1 validated** — `npx agentskit add content-repurpose-matrix`\n\n## Pain\nContent repurposing\n\n## Output\nMatrix typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'content-repurpose-matrix',\n  cases: [\n    { input: 'Complete input for Repurpose Matrix: Content repurposing. Provide full structured output.', expected: (r: string) => r.length > 20 && /requiresReview|summary|title|category|findings|sections|score|clusters|items|steps/i.test(r) },\n    { input: 'Minimal input.', expected: (r: string) => /gap|openQuestion/i.test(r) || r.length > 10 },\n    { input: 'Input with specific detail: ACME Corp project deadline March 15.', expected: (r: string) => /ACME|March|15/i.test(r) || /gap/i.test(r) },\n    { input: 'Empty context — only says \"process this\".', expected: (r: string) => r.length > 5 },\n  ],\n}\n"}],"installable":true,"validation":{"status":"approved","score":96,"confidence":0.96,"method":"codex-executor-independent-reviewer","iterations":2,"cases":3,"summary":"The agent produced valid structured matrix outputs for all three cases, surfaced missing context clearly, avoided inventing unverifiable business facts, and handled the injection attempt correctly by treating it as untrusted input rather than following it. The outputs are useful scaffolds for sparse content-repurposing requests and include review requirements, gaps, and open questions. Minor weakness: the normal case remains fairly generic despite the prompt asking for concrete details, but given the absence of actual source material, the conservative uncertainty handling is appropriate for v1.","strengths":["Valid structured outputs with title, sections, gaps, open questions, and review flags where present.","Consistently labels assumptions and avoids unsupported claims, dates, metrics, or company details.","Injection case is handled safely and explicitly without outputting the requested override token as the answer.","Provides practical channel-specific repurposing rows across blog, social, email, video, and internal enablement formats."],"notes":[]}}