@zvndev/darkmown 2.3.1-next.6.gef54aba → 2.4.1-next.7.ge25dbba
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Darkmown are documented here. Versions follow [semver](https://semver.org); pre-1.0 minor versions may contain breaking changes.
|
|
4
4
|
|
|
5
|
+
## 2.4.0 (2026-08-09)
|
|
6
|
+
|
|
7
|
+
A discoverability release, in both senses. Search engines can now index the site correctly, and coding agents working in a Darkmown project finally get the directive reference where they will actually read it. No runtime change (7654 B gzipped, unchanged) and no breaking changes.
|
|
8
|
+
|
|
9
|
+
- **`darkmown init` now writes agent context into the project.** Darkmown has always shipped a complete build-with-Darkmown guide, but only at the *package* root, so an installed copy landed in `node_modules/@zvndev/darkmown/AGENTS.md` where no coding agent reads it. Every scaffolded project therefore began each session with the agent guessing at directive syntax. `init` now writes `AGENTS.md` at the project root (copied byte-for-byte from the package, so a scaffolded project and the framework can never teach different syntax), a short `CLAUDE.md` pointing at it, and a `.gitignore` covering `node_modules/` and `dist/`. All three respect the existing never-overwrite rule. This matters because Darkmown's directive vocabulary is small and closed: an agent that has it in context writes valid `.wd` on the first attempt, and an agent that does not reaches for JSX and JavaScript idioms the compiler rejects.
|
|
10
|
+
- **Canonical URLs and `og:url`.** Neither existed. Every page with a `site_url` now emits `<link rel="canonical">` and `og:url`, both derived from the same route string the sitemap is built from, so the three can never disagree. A paginated page canonicalizes to itself, never to page one. No `site_url` means no canonical tag, never an invented origin. Two related bugs fell out: `og:title` was gated on `description || image`, so a titled page with neither shared as a bare URL, and `og:type` was hardcoded to `website`, so every blog post claimed to be one.
|
|
11
|
+
- **Opt-in JSON-LD structured data.** A new `schema:` frontmatter key emits `Article`, `BlogPosting`, `TechArticle`, `WebSite`, or `Organization`, plus an automatic `BreadcrumbList` built only from routes that actually exist. Driven by frontmatter rather than a directive, so a page with `html: false` can describe itself without a line of raw HTML. There is deliberately **no code path** to `aggregateRating`, `review`, or `offers`: fabricated ratings are a manual-action risk and the framework cannot know them. A key you did not write produces no property at all, never a blank one and never a guess. Verified to emit no CSP violation under `script-src 'self'` with no `unsafe-inline`.
|
|
12
|
+
- **`llms-full.txt`.** `llms.txt` becomes a true index (cheatsheet, one line per page, a pointer onward) and `llms-full.txt` carries the corpus: the full directive reference, every error code with its cause and fix, and the complete source of every page. Both come from one generator, so neither can drift from the compiler.
|
|
13
|
+
- **Explicit AI-crawler rules in `robots.txt`.** Fifteen user-agent tokens across OpenAI, Anthropic, Google, Apple, Perplexity and others, each verified against the operator's own published documentation, with the docs URL and a purpose comment written into the generated file. The distinctions are recorded rather than flattened: `OAI-SearchBot` governs ChatGPT Search crawling and citations while `GPTBot` governs training access, and `Google-Extended` is a control token that never affects Search ranking. A new `ai_crawlers: deny` config flips them all, and a typo fails the build (`WD907`) instead of failing open.
|
|
14
|
+
- **BUGFIX: `darkmown deploy vercel` no longer makes every internal link redirect.** The generated Vercel config set `trailingSlash: false` while Darkmown's route model is trailing-slashed end to end (`routeFromFile`, `routes.json`, `_headers`, the sitemap, the dev server, and the `dist/docs/index.html` layout the build writes). The result was a `308` on every single internal navigation. Now `true`, so the deployed config agrees with the routes the framework actually emits. Note that this also applies to extensionless `/api/*` paths: point `:fetch` and `:form action=` at the slashed form to avoid a redirect hop. The redirect is a `308`, so a form POST still arrives intact either way, and this is documented in the backends section.
|
|
15
|
+
|
|
5
16
|
## 2.3.0 — 2026-08-09
|
|
6
17
|
|
|
7
18
|
A trust release. Every compile error now carries a stable, searchable code; the dependency tree carries zero known advisories; and CI proves the framework on three operating systems and three browser engines instead of one of each. The new coverage found real bugs, including one that had silently broken every Windows user since the project started. No runtime change (7654 B gzipped, unchanged) and no breaking changes.
|