# WriteUserTemplate Creates or overwrites a Markdown template in the caller's `templates/` folder. Templates written here are immediately usable by `ReadUserTemplate` (to inspect them) and `RenderUserTemplate` (to substitute `{{var}}` placeholders and apply defaults). ## Input ```ts { name: string, // slug — '.md' appended if absent content: string, // full file text (optional frontmatter + Markdown body) overwrite?: boolean // default: false — error if file exists } ``` ## File structure The content is plain Markdown with an optional YAML frontmatter block: ```markdown --- description: One-line description shown in ListUserAssets params: - name: date type: string - name: author type: string default: "Team" --- # Report — {{date}} Prepared by: {{author}} ## Highlights ... ``` Frontmatter is not required. Templates without `params:` render as-is (no substitution). ## Frontmatter params spec Each param entry in `params:` supports: | field | required | description | |-------|----------|-------------| | `name` | yes | placeholder name used as `{{name}}` in the body | | `type` | yes | `string` \| `number` \| `boolean` | | `default` | no | value applied when the param is omitted | Required params (no default) must be supplied by the caller of `RenderUserTemplate`. Missing required params produce an error at render time. ## Size limit 128 KB (UTF-8 encoded). Exceeding the limit returns `isError: true`. ## Overwrite semantics By default (`overwrite: false`) writing to an existing file is an error. Pass `overwrite: true` to replace the file atomically. ## When to use - You noticed a recurring structure (email skeleton, weekly report, issue template) — persist it for reuse. - The user asks you to create or update a template so they can render it later. - You want to encode a multi-step prompt skeleton with named slots. ## Examples ### Email template ```js WriteUserTemplate({ name: "api-error-email", content: `--- description: Customer-facing API error notification email params: - name: incident_id type: string - name: service type: string - name: eta type: string default: "unknown" --- Dear Customer, We have detected an issue with **{{service}}** (incident {{incident_id}}). Our team is actively working on a resolution. Estimated resolution time: **{{eta}}**. We apologize for the inconvenience. — The Platform Team ` }) ``` ### Report skeleton (no params) ```js WriteUserTemplate({ name: "weekly-retro", content: `# Weekly Retro ## What went well - ## What to improve - ## Action items - [ ] ` }) ``` ## Error cases | Situation | `isError` | message contains | |-----------|-----------|-----------------| | No authenticated user | true | "authenticated" | | `name` missing / empty | true | `"name"` | | `name` contains `/`, space, etc. | true | "alphanumeric" | | Content exceeds 128 KB | true | "bytes" | | File exists, `overwrite` not set | true | "overwrite" | ## Notes - `WriteUserTemplate` is a META_TOOL — available in every movement without listing it in `allowed_tools`. - After writing, use `ReadUserTemplate` to verify the content and `RenderUserTemplate` to test substitution. - Use `ListUserAssets` to see all templates currently in the folder.