diff --git a/extensions/matrix/CHANGELOG.md b/extensions/matrix/CHANGELOG.md new file mode 100644 index 000000000..54734c841 --- /dev/null +++ b/extensions/matrix/CHANGELOG.md @@ -0,0 +1,18 @@ +# Changelog + +## 2026.1.14 + +### Changes +- Version alignment with core Clawdbot release numbers. + +## 0.1.0 + +### Features +- Matrix channel plugin with homeserver + user ID auth (access token or password login with device name). +- Direct messages with pairing/allowlist/open/disabled policies and allowFrom support. +- Group/room controls: allowlist policy, per-room config, mention gating, auto-reply, per-room skills/system prompts. +- Threads: replyToMode controls and thread replies (off/inbound/always). +- Messaging: text chunking, media uploads with size caps, reactions, polls, typing, and message edits/deletes. +- Actions: read messages, list/remove reactions, pin/unpin/list pins, member info, room info. +- Auto-join invites with allowlist support. +- Status + probe reporting for health checks. diff --git a/scripts/sync-plugin-versions.ts b/scripts/sync-plugin-versions.ts index ea61d038e..c877fa3e4 100644 --- a/scripts/sync-plugin-versions.ts +++ b/scripts/sync-plugin-versions.ts @@ -1,4 +1,4 @@ -import { readdirSync, readFileSync, writeFileSync } from "node:fs"; +import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs"; import { join, resolve } from "node:path"; type PackageJson = { @@ -19,8 +19,24 @@ const extensionsDir = resolve("extensions"); const dirs = readdirSync(extensionsDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()); const updated: string[] = []; +const changelogged: string[] = []; const skipped: string[] = []; +function ensureChangelogEntry(changelogPath: string, version: string): boolean { + if (!existsSync(changelogPath)) return false; + const content = readFileSync(changelogPath, "utf8"); + if (content.includes(`## ${version}`)) return false; + const entry = `## ${version}\n\n### Changes\n- Version alignment with core Clawdbot release numbers.\n\n`; + if (content.startsWith("# Changelog\n\n")) { + const next = content.replace("# Changelog\n\n", `# Changelog\n\n${entry}`); + writeFileSync(changelogPath, next); + return true; + } + const next = `# Changelog\n\n${entry}${content.trimStart()}`; + writeFileSync(changelogPath, `${next}\n`); + return true; +} + for (const dir of dirs) { const packagePath = join(extensionsDir, dir.name, "package.json"); let pkg: PackageJson; @@ -35,6 +51,11 @@ for (const dir of dirs) { continue; } + const changelogPath = join(extensionsDir, dir.name, "CHANGELOG.md"); + if (ensureChangelogEntry(changelogPath, targetVersion)) { + changelogged.push(pkg.name); + } + if (pkg.version === targetVersion) { skipped.push(pkg.name); continue; @@ -46,5 +67,5 @@ for (const dir of dirs) { } console.log( - `Synced plugin versions to ${targetVersion}. Updated: ${updated.length}. Skipped: ${skipped.length}.` + `Synced plugin versions to ${targetVersion}. Updated: ${updated.length}. Changelogged: ${changelogged.length}. Skipped: ${skipped.length}.` );