v0.7.0
Install: npx -y automad-mcp-server (published as automad-mcp-server on npm — the earlier scoped name @automadcms/mcp-server was never published).
Added
- Theme dev server —
automad_themegainsdev/dev_stop/dev_status
actions.devrunsnpm run devas a detached background process, writes
<theme>/.automad-mcp/{dev.json,dev.log}, and returns the local URL (port
discovered in this order: explicitportarg →package.jsonscripts.dev
(--port=N/PORT=N) → the firsthttp://localhost:<port>marker in the
log, up to 20 s).dev_stopsends SIGTERM, escalates to SIGKILL after 5 s,
and removes the record.dev_statusreports the running state without
blocking. A seconddevcall for the same theme returnsCONFLICTuntil
dev_stopis called. Live-verified end-to-end against
automad/automad:v2: the dev server's PHP+esbuild pipeline starts and
curl http://localhost:8000returns the expected content. - Two new theme analyzer findings —
LANG_WITHOUT_I18N(locale masks
declared intheme.jsonbut noi18n/<locale>.jsonfile on disk) and
MAIN_SNIPPET_UNDEFINED(a page mask of the form+snippetNamewhose
snippet doesn't exist). Both are severityinfo, ordered alongside the
existingdefine/usechecks. - KB pages split —
docs/kb.ts(the bundled knowledge base) is now a
thin re-exporter over 13 per-page modules indocs/kb/pages/. The split is
invisible at runtime but makes adding / auditing individual KB pages
tractable. A drift test pinsKB_PAGESorder and shape. - GitHub Pages landing page —
docs/index.htmlis now a self-contained
single-file landing page (no script, no remote stylesheet, no remote
image; pinned bydocs-drift.test.ts). The tool table is generated from
the capability registry vianpm run docs:sync, so it cannot drift from
the code. Counts (tool count, read/destructive, test count) are
fenced markers that regenerate alongside the README. scripts/verify.ts— single-command pre-PR gate: runs
build→lint→vitest run→vitest run --coverage(with the
vitest.config.tsthresholds enforcing 80% stmt / 70% branch) →
docs:sync --check. Fails fast on the first broken step.scripts/smoke.ts— end-to-end driver that spawns the built server
over stdio, runstheme.scaffold→theme.dev(polls until running) →
curl(HTTP 2xx/3xx) →theme.dev_stop. Lives innpm run smoke; no
live Automad instance required (AUTOMAD_MODE=docs+ a starter kit path
is enough).scripts/commit.ts— Conventional-Commits validator.npm run commit:checkvalidates HEAD (for CI / pre-push);node scripts/commit.ts '<msg>'validates + commits. Type- and scope-allow-lists are a single
source of truth.scripts/docs-sync-all.ts— one-shot: runsdocs:sync(static
markers) anddocs:sync:tests(TESTCOUNT via vitest) back-to-back.
Available asnpm run docs:sync:all.scripts/release.ts--push/--releaseflags — after tagging,
--pushrunsgit push --follow-tags;--releaseadditionally runs
gh release create vX.Y.Zwith the matching CHANGELOG section as the
release body (extracted via a newextractChangelogSectionexport).
Convenience scriptsnpm run release:full:{patch,minor,major}wrap
all three steps.
Changed
pages.createnow accepts atemplatefield as"{theme}/{template}"
(no.php) — v2 splits on/and appends.php, so
my-theme/pageresolves topackages/my-theme/page.php. Lets a page
bind to a theme that isn't the site default (the site default itself
is not exposed via the API; it is set in the dashboard). Documented
inschemas.tsJSDoc and in the README.theme.scaffoldnow verifies the starter-kit layout before copying
(canonical layout:theme.json,components/,blocks/,
client/index.ts,esbuild.js). A stale or wrong starter-kit
directory now returnsVALIDATIONwith a concrete missing-list
instead of silently producing a broken theme.- Knowledge-base size unchanged at runtime — splitting the KB into
per-page modules does not affect the embedded content; the public
surface (automad://docs,automad://docs/{slug}) is identical. - ThemeFs abstraction —
ThemeFsinterface gained
appendLog(path, content)andreadLogTail(path, maxBytes)with a
1 MiB cap and 256 KiB tail retention in theLocalThemeFs
implementation. The dev server uses these exclusively; no direct
node:fscalls in new code. - Documented the
templatefield's"{theme}/{template}"convention
inschemas.tsJSDoc and the README. A new README section ("Bind a
page to a specific theme/template") walks through it with a worked
example. - README + GitHub Pages homepage — both now describe the theme dev
server, theverify/smoke/commit-checkscripts, the
release:full:*flow, and the page-template convention. The
homepage's "Theme tooling" card mentions the dev server; the tools
table showsdev/dev_stop/dev_statusforautomad_theme.
Fixed
- Two analyzer findings double-fired on generated output — both
LANG_WITHOUT_I18NandMAIN_SNIPPET_UNDEFINEDpreviously reported
against<stubs>/<output>directories that ship with the starter
kit. The scan is now scoped tosnippets/andcomponents/for the
relevant lookups and skips generated paths, so live reports contain
only findings the user can act on. MAIN_SNIPPET_UNDEFINEDhad a brittle fixture — the test
referenced amainSnippetfield on the analyzer's output that the
code didn't actually return. Added the missing field to the
ThemeAnalysisfixture literal so the test exercises the production
code path.page-format.tswas dead code — the file existed for an old
page-format reader, but nothing in the live HTTP path uses it. The
tests that referenced it still passed because they imported the
module directly. Removed the file; tests now use the real
v2/_api/page/dataresponse path. No live consumer was affected.docs/kbheadless.tswas renamed toheadless-api.tsto
match the spec/plan wording and to avoid colliding with any future
"headless" UI module. Pure rename; no behavior change.release.tsextraction off-by-one —extractChangelogSection
originally searched the slice for the next## [header before
stripping the current one, soendwas always 0 and the function
returned a single newline. The function now strips the current
header first; returns the full section block up to the next## [
(or end of file).