v0.20.0
seite now works reliably for coding agents — Claude Code, Codex, OpenCode, and Cursor: no-TTY safe prompts, a real --json mode, a background-friendly dev server, and an MCP server every agent can load.
seite check: every problem in one pass
The new seite check command validates the whole site without touching dist/: seite.toml (including unknown keys, with "did you mean minify?" hints), frontmatter, shortcodes, data files, templates, rendering, internal links, and missing assets. Output is compiler-style — content/posts/a.md:3:7: error[frontmatter-parse]: … with a hint: line — and --json returns the same diagnostics with stable codes. --strict also fails on warnings. Coding agents get the same results from the new seite_check MCP tool.
Better build errors
seite buildnow reports every broken file at once instead of stopping at the first.- Broken links and missing images, scripts, and stylesheets point at the source
.md, template, or data file and line — not the generated HTML — with did-you-mean suggestions.--strictfails on both. - Hugo-style shortcodes (
{{< /callout >}},{{< youtube id="x" >}}) get the corrected seite syntax in the hint; template errors name the template file and line, and render errors name the page and template. - Links between content files written as relative
.mdpaths ([intro](../docs/intro.md)) are rewritten to page URLs; ones that don't resolve are reported. - A failed build no longer wipes
dist/: full builds write to a staging directory and swap it in only on success.
Works without a terminal
Every prompt now goes through one helper. Without a TTY, prompts use their default or fail with an error naming the flag to pass (for example missing --deploy-target) instead of IO error: not a terminal. The new global -y/--yes flag (or SEITE_YES=1) accepts confirmations. seite deploy refuses to continue past a failed pre-flight check — including a localhost base_url — without --yes, before committing, pushing, or uploading anything.
seite serve --no-repl runs the dev server without the interactive prompt, and the server now keeps running when stdin closes, so it can run in the background. An explicit --port that is already taken now fails clearly.
Real --json output
--json used to be accepted and ignored. Now every supported command prints exactly one JSON document on stdout — {"ok":true,"command":"build","data":{...},"warnings":[]} on success, {"ok":false,"error":{"message":...,"chain":[...]}} with a non-zero exit on failure — and all human output moves to stderr. build reports counts, broken links, and per-step timings; new reports the created path and URL. Commands that stream or take over the terminal (serve, agent, mcp, completions, self-update) reject --json.
MCP server fixes
- Loads in Claude Code.
seite initnow registers the server in.mcp.json(Claude Code ignoresmcpServersin.claude/settings.json) and pre-approves it.seite upgrademigrates existing sites without dropping other servers, andseite agentpasses the MCP config through. - Correct results.
seite_buildreports warnings (including template fallbacks) and broken links, and acceptsstrict. Content listings and search use the real output URLs and include each item's sourcepath. Config is re-read on every request, and load errors are shown verbatim. - Safer writes.
seite_create_contentrefuses to overwrite existing files and rejects empty slugs. Theme names are validated, and a customizedbase.htmlis backed up before a theme is applied. - Spec-compliant errors. Tool failures are returned as
isErrorresults with actionable messages.
Codex, OpenCode, and Cursor support
seite init --agents claude,codex,opencode,cursor (all by default) now sets a site up for each coding agent, not just Claude Code:
- Codex:
.codex/config.tomlregisters the MCP server with its tools pre-approved (Codex applies it once you trust the project), and skills go to.agents/skills/. - OpenCode:
opencode.jsonregisters the server and mirrors the Claude allowlist in itspermissionblock. - Cursor:
.cursor/mcp.json,.cursor/cli.jsonpermissions forcursor-agent, and.cursor/rules/*.mdcgenerated from the same rules as.claude/rules/. - AGENTS.md gets a per-agent setup table (config file and one-time approval step) and an index of the context rules, so agents without path-scoped rules can read them on demand.
seite upgrade adds the files for existing sites and merges into config files you already have without dropping your settings or reordering keys. Pass --agents to change the selection.
Agents check their own work
When a coding agent finishes its turn in a seite site, a stop hook runs seite check --hook <agent> and hands any errors back to the agent so it fixes them before stopping (warnings never block, and it continues at most once per turn). seite init and seite upgrade install it for each selected agent: Claude Code (.claude/settings.json), Codex (.codex/hooks.json — approve it once in /hooks), Cursor (.cursor/hooks.json), and OpenCode (.opencode/plugins/seite-check.js). Delete a hook to opt out; seite upgrade won't re-add it. Everyone working on the site needs seite 0.20 or newer on PATH.
/seite workflow skill
A new seite skill gives every agent one entry point for site work: /seite check, new, preview, build, deploy (dry run first, then asks), theme, and collection. It ships to .claude/skills/ and .agents/skills/, with a /seite command wrapper for OpenCode. Interactive seite init preselects the coding agents it finds installed.
MCP server upgrades
- Negotiates current MCP protocol versions (through 2026-07-28), sends server
instructions, and marks each tool with read-only/destructive annotations. Results includestructuredContentvalidated against each tool'soutputSchema. - New tools:
seite_check,seite_get_page(one page as the build sees it),seite_list_templates(overrides, blocks, context variables, shortcodes),seite_update_frontmatter(edits frontmatter, keeps the body byte-for-byte),seite_create_collection, andseite_content_stats. seite_buildalso returns missing assets and diagnostics.seite_update_frontmatterkeeps comments and formatting in frontmatter.
seite agent for any agent
seite agent --with codex|opencode|cursor (or SEITE_AGENT) runs the other agents as well as Claude Code. The agent prompt no longer repeats what's already in AGENTS.md, and Claude Code's shell access is limited to seite and read-only git commands.
Other fixes
--jsonoutput is only the JSON document; human status lines appear only with--verbose. Output from child processes (git, wrangler, …) is kept off stdout on every platform.- Dependencies updated (clap, console, open, toml, thiserror, ureq, sha2 0.11, getrandom 0.4, katex-rs 0.3, and quick-xml 0.41, which clears RUSTSEC-2026-0194/0195).
- Shortcode render errors now include the underlying template error instead of just "Failed to render".
- A data file next to a same-named data directory (
authors.yaml+authors/) is always reported as a conflict instead of silently depending on directory order. seite workspace addworks on a freshly initialized workspace.- Stale subdomain output is removed once no collection uses a subdomain.
seite checkworks in workspaces (every site, or--site), and workspace builds report unknown config keys and located link diagnostics under--strict.- The update check is skipped under
CI,DO_NOT_TRACK,SEITE_NO_UPDATE_CHECK, without a terminal, or with--json, and prints to stderr. seite buildshows per-step timings only with--verbose.--confignow works when it points at aseite.toml.seite newrefuses to overwrite an existing file.- Errors no longer end with an empty
Caused by:line. init --helplistsnetlifyas a deploy target.- Generated agent context and docs corrected: theme count, command list, MCP resources,
mermaid,[access], plus a new "Verify your change" section.