docs: cut to v0.9.0 with unified .de/.en naming

- Remove all prior release notes and version snapshots (v0.6.0-v0.8.6)
- Rename handbook to *.de.md; keep *.en.md
- New release notes v0.9.0.de.md/.en.md with v0.9.0 snapshot
- generate-docs.mjs: .de/.en convention incl. search index and en-fallback
- docs.tsx: release fallback now uses version.de.md
- Wording: neutral tagline, anonymous user, no gender forms
- Add docs/examples/import-tools.yaml and link from administration docs
This commit is contained in:
opencode
2026-08-05 00:13:41 +02:00
parent ca980fce09
commit 6eb3dfd8f9
117 changed files with 614 additions and 10859 deletions
+11 -11
View File
@@ -25,20 +25,20 @@ const handbookDir = resolve(root, "docs/handbook");
const releasesDir = resolve(root, "docs/releases");
const targetDir = resolve(root, "artifacts/toolrate/public/docs");
const isReleaseFile = (name) => /^v\d+\.\d+\.\d+\.md$/.test(name);
const isReleaseFile = (name) => /^v\d+\.\d+\.\d+\.de\.md$/.test(name);
const isEnReleaseFile = (name) => /^v\d+\.\d+\.\d+\.en\.md$/.test(name);
const isHandbookFile = (name) => /\.md$/.test(name) && !name.endsWith(".en.md");
const isHandbookFile = (name) => /\.de\.md$/.test(name);
const isEnHandbookFile = (name) => /\.en\.md$/.test(name);
const enName = (file) => (file.endsWith(".md") ? `${file.slice(0, -3)}.en.md` : null);
const deName = (file) => (file.endsWith(".en.md") ? `${file.slice(0, -6)}.md` : null);
const enName = (file) => (file.endsWith(".de.md") ? `${file.slice(0, -6)}.en.md` : null);
const deName = (file) => (file.endsWith(".en.md") ? `${file.slice(0, -6)}.de.md` : null);
// ---------------------------------------------------------------------------
// Version helpers
// ---------------------------------------------------------------------------
function parseVersion(name) {
return name.replace(/\.md$/, "");
return name.replace(/\.(de|en)\.md$/, "");
}
function cmp(a, b) {
@@ -198,7 +198,7 @@ function parseHandbook(content) {
}
function slugify(name) {
return name.replace(/\.md$/, "").toLowerCase().replace(/[^a-z0-9-]+/g, "-");
return name.replace(/\.(de|en)?\.md$/, "").toLowerCase().replace(/[^a-z0-9-]+/g, "-");
}
async function readFileOptional(path) {
@@ -328,7 +328,7 @@ async function buildSearchIndex(reference, handbookPages, releaseVersions) {
}
for (const version of releaseVersions) {
const file = join(releasesDir, `${version}.md`);
const file = join(releasesDir, `${version}.de.md`);
const content = await readFile(file, "utf8");
const base = {
title: version,
@@ -418,9 +418,9 @@ async function main() {
const version = parseVersion(name);
const content = await readFile(join(releasesDir, name), "utf8");
await copyFile(join(releasesDir, name), join(targetDir, "releases", name));
const enName = `${version}.en.md`;
const enContent = await readFileOptional(join(releasesDir, enName));
if (enContent) await copyFile(join(releasesDir, enName), join(targetDir, "releases", enName));
const releaseEnName = enName(name);
const enContent = await readFileOptional(join(releasesDir, releaseEnName));
if (enContent) await copyFile(join(releasesDir, releaseEnName), join(targetDir, "releases", releaseEnName));
const snapDir = join(releasesDir, version);
const hasReference = await stat(join(snapDir, "reference.json"))
.then(() => true)
@@ -459,7 +459,7 @@ async function main() {
versions.push({
version,
file: `releases/${name}`,
fileEn: enContent ? `releases/${enName}` : null,
fileEn: enContent ? `releases/${releaseEnName}` : null,
title: extractTitle(content) ?? version,
titleEn: enContent ? extractTitle(enContent) ?? version : null,
date: extractDate(content) ?? null,