feat(groups): optional forge source label in message footers

- Group.forgeLabel (default off, editable per group in the console) shows the
  source forge on every message the group's routes dispatch
- Discord embed footer: forge name next to the repo + the site's favicon as
  icon_url (Gitea instance's own favicon from its origin)
- Telegram footer: hyperlinked site name (GitHub or Gitea hostname); custom
  webhooks render a plain 'Custom' label
- forgeInfo() derives branding from event.provider + repository.html_url;
  dispatch attaches it to the NeutralMessage like mentionRoleIds
- validateGroups accepts forgeLabel booleans; GroupEditor gains the toggle
- tests: forgeInfo unit, discord/telegram footer render, dispatch on/off
- docs: groups.md + message-format.md (en/zh), config.example.yaml, AGENTS.md
- fix: wrangler.jsonc compatibility_date was an incomplete '2026-'
This commit is contained in:
RhenCloud 2026-08-14 08:10:04 +08:00
parent a5324fb0ea
commit 3dce114cec
No known key found for this signature in database
GPG key ID: A574A617378C4E0B
19 changed files with 273 additions and 16 deletions

View file

@ -31,6 +31,23 @@ describe("telegram renderNeutralMessage", () => {
expect(out).toContain("<i>acme/widget</i>");
});
it("renders the forge source as a linked name in the footer", () => {
const out = renderNeutralMessage({
title: "acme/widget: Add feature",
footer: "acme/widget",
forge: { name: "GitHub", url: "https://github.com", iconUrl: "https://github.com/favicon.ico" },
});
expect(out).toContain(
'<i><a href="https://github.com">GitHub</a> · acme/widget</i>',
);
const gitea = renderNeutralMessage({
title: "org/repo: Add feature",
forge: { name: "git.example.com", url: "https://git.example.com" },
});
expect(gitea).toContain('<i><a href="https://git.example.com">git.example.com</a></i>');
});
it("escapes HTML special characters", () => {
const out = renderNeutralMessage({
title: 'a <b> & "c"',