diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 22bb77969..4b764d219 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -13,6 +13,7 @@ jobs: runs-on: ubuntu-latest permissions: contents: write + pull-requests: write steps: - name: Extract version from branch name @@ -43,13 +44,25 @@ jobs: CLAUDE_KEY: ${{ secrets.ANTHROPIC_API_KEY }} run: yarn generate:announcements --version ${{ env.VERSION }} - - name: Commit and push announcements to master + - name: Commit and push announcements to branch run: | git config user.name "webiny-bot" git config user.email "webiny-bot@webiny.com" + git checkout -b release-announcements/${{ env.VERSION }} git add docs/release-notes/${{ env.VERSION }}/announcements/ git commit -m "chore: add announcements for ${{ env.VERSION }}" - git push origin master + git push origin release-announcements/${{ env.VERSION }} + + - name: Create PR + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_URL=$(gh pr create \ + --title "chore: add announcements for ${{ env.VERSION }}" \ + --body "Release announcements for ${{ env.VERSION }} — please review and merge to publish." \ + --base master \ + --head release-announcements/${{ env.VERSION }}) + echo "PR_URL=$PR_URL" >> $GITHUB_ENV - name: Send Slack announcement env: @@ -58,28 +71,33 @@ jobs: run: | VERSION="${{ env.VERSION }}" BASE="docs/release-notes/${VERSION}/announcements" - SLACK_URL="${REPO_URL}/blob/master/${BASE}/slack.md" - SOCIAL_URL="${REPO_URL}/blob/master/${BASE}/social.md" + ANNOUNCE_BRANCH="release-announcements/${VERSION}" + SLACK_URL="${REPO_URL}/blob/${ANNOUNCE_BRANCH}/${BASE}/slack.md" + SOCIAL_URL="${REPO_URL}/blob/${ANNOUNCE_BRANCH}/${BASE}/social.md" + TWEETS_URL="${REPO_URL}/blob/${ANNOUNCE_BRANCH}/${BASE}/tweets.md" + PR_URL="${{ env.PR_URL }}" jq -n \ --arg version "$VERSION" \ + --arg pr_url "$PR_URL" \ --arg slack_url "$SLACK_URL" \ --arg social_url "$SOCIAL_URL" \ + --arg tweets_url "$TWEETS_URL" \ '{ - "text": ("Release " + $version + " announcements ready"), + "text": ("Release " + $version + " announcements ready for review"), "blocks": [ { "type": "section", "text": { "type": "mrkdwn", - "text": ("*Release " + $version + " docs merged* — announcements ready :tada:") + "text": ("*Release " + $version + " announcements ready* — please review and merge :eyes:") } }, { "type": "section", "text": { "type": "mrkdwn", - "text": ("• *Slack* — <" + $slack_url + "|view / edit>\n• *X / LinkedIn* — <" + $social_url + "|view / edit>") + "text": ("• *PR* — <" + $pr_url + "|review / merge>\n• *Slack* — <" + $slack_url + "|view / edit>\n• *X / LinkedIn* — <" + $social_url + "|view / edit>\n• *Follow-up tweets* — <" + $tweets_url + "|view / edit>") } }, { diff --git a/docs/release-notes/6.3.0/announcements/slack.md b/docs/release-notes/6.3.0/announcements/slack.md index 0790a4a2f..a4fd3eb19 100644 --- a/docs/release-notes/6.3.0/announcements/slack.md +++ b/docs/release-notes/6.3.0/announcements/slack.md @@ -2,16 +2,18 @@ Hello @channel! :wave: Webiny 6.3.0 is out! :rocket: -This is a big one for AI capabilities! We've introduced AI PowerUps that let you generate page content directly in the Website Builder using OpenAI or Anthropic. Plus, images uploaded to File Manager now automatically get AI-generated tags and descriptions for better searchability — all happening in the background so it doesn't slow you down. +This is a big one! We're introducing AI PowerUps — you can now configure OpenAI or Anthropic in your Admin settings and use AI to generate page content directly in the Website Builder. Plus, images uploaded to the File Manager automatically get AI-generated tags and descriptions for better searchability. -On the developer side, there's a ton of goodies: a new declarative FormModel API for building admin forms, a Tasks SDK module for interacting with background tasks, a built-in encryption service, and mailer configuration now lives in your webiny.config.ts. We've also upgraded TypeScript to 6.0.3 and Storybook to v10. +On the developer experience side, there's a ton of improvements. The new FormModel API gives you a declarative way to build admin forms, the SDK now includes a tasks module for managing background tasks from external apps, and we've added a built-in encryption service for handling sensitive data. TypeScript has been upgraded to 6.0.3, and there's better input validation with more descriptive errors across the board. + +We've also reorganised the admin sidebar with a new Dev Tools section, rebuilt Page Settings using the FormModel architecture with proper extension points, and added mailer configuration directly in webiny.config.ts. Check out the changelog to learn more. -The Admin UI got some love too — the new Dev Tools sidebar section keeps GraphQL and SDK Playground handy, and Page Settings has been completely rebuilt with the new FormModel architecture, making it much easier to extend. Check out the changelog to learn more. — As usual, the release notes can be found on the following links:point_down::skin-tone-2:: Changelog: https://www.webiny.com/docs/release-notes/6.3.0/changelog How To Upgrade: https://www.webiny.com/docs/release-notes/6.3.0/upgrade-guide + — -Lots of AI magic in this one — now go build something smart! :zap: +Lots of exciting stuff packed into this release — can't wait to see what you build with it! :rocket: diff --git a/docs/release-notes/6.3.0/announcements/social.md b/docs/release-notes/6.3.0/announcements/social.md index 75619c47e..a23a4cb8e 100644 --- a/docs/release-notes/6.3.0/announcements/social.md +++ b/docs/release-notes/6.3.0/announcements/social.md @@ -1,14 +1,12 @@ -Webiny 6.3.0 is here, and it's one of our most feature-rich releases yet 🚀 +Webiny 6.3.0 is here! 🚀 -This release introduces AI PowerUps, bringing intelligent content generation directly into the Website Builder. Configure OpenAI or Anthropic in your Admin settings, then use natural language prompts to generate page sections and content. The File Manager also gets smarter — uploaded images are now automatically enriched with AI-generated tags and descriptions, making your media library instantly more searchable without manual effort. +This release introduces AI PowerUps — you can now connect OpenAI or Anthropic in Admin settings and generate page content directly in Website Builder using natural language prompts. Images uploaded to File Manager are automatically enriched with AI-generated tags and descriptions, making assets easier to find without manual metadata entry. -The admin interface sees several quality-of-life improvements. A new Dev Tools sidebar section consolidates the GraphQL Playground and SDK Playground links with proper permission controls. The new DatePicker component supports everything from simple date selection to date ranges and multiple selections. Page Settings has been completely rebuilt using our new FormModel architecture, making it far easier to extend with custom settings groups and fields. +For extension developers, there's a lot to dig into. The new FormModel API provides a declarative way to build admin forms with tabs, validation, computed fields, and dynamic zones. The SDK now includes a tasks module for triggering and managing background tasks from external apps, and all SDK methods validate inputs before hitting the network with descriptive error messages when something's off. -For developers, this release brings a powerful new FormModel API for building declarative admin forms with tabs, validation, computed fields, and conditional logic. The SDK now includes a tasks module for triggering and managing background tasks from external applications. Speaking of background tasks, they can now be configured to clean up after themselves automatically. We've also added a built-in encryption service using AES-256-GCM, and the mailer now supports configuration directly in webiny.config.ts. +Infrastructure and deployment also got attention — a built-in encryption service is available in the API layer, Pulumi extensions now have proper TypeScript typing, and old Pulumi plugin versions clean themselves up automatically. -On the infrastructure side, TypeScript has been upgraded to 6.0.3, Storybook to version 10, and numerous dependency updates improve security and compatibility. The upgrade command now includes a force flag and better default logging, while old Pulumi plugin versions are automatically cleaned up to save disk space. - -We're excited to see what you build with these new capabilities. Give 6.3.0 a try and let us know what you think. +Check the full changelog and let us know what you're building with these new capabilities. Changelog: https://www.webiny.com/docs/release-notes/6.3.0/changelog Upgrade guide: https://www.webiny.com/docs/release-notes/6.3.0/upgrade-guide diff --git a/docs/release-notes/6.3.0/announcements/tweets.md b/docs/release-notes/6.3.0/announcements/tweets.md new file mode 100644 index 000000000..cd15cba73 --- /dev/null +++ b/docs/release-notes/6.3.0/announcements/tweets.md @@ -0,0 +1,21 @@ +Fresh in Webiny 6.3.0 — AI PowerUps let you generate page content directly in the Website Builder using natural language prompts. Configure your OpenAI or Anthropic connection in Admin settings and let AI draft sections while you focus on the bigger picture. + +https://www.webiny.com/docs/release-notes/6.3.0/changelog + +--- + +Ever upload an image and immediately forget what it was? Webiny's File Manager now enriches uploads automatically — AI analyzes each image and assigns tags plus a description, all in the background. Search just got smarter. 🔍 + +https://www.webiny.com/docs/release-notes/6.3.0/changelog + +--- + +The new Tasks SDK module opens up background task orchestration to external applications. List definitions, trigger runs, fetch logs, abort jobs — all through the SDK with full TypeScript support. + +https://www.webiny.com/docs/release-notes/6.3.0/changelog + +--- + +Need to encrypt sensitive values in your API extensions? Webiny 6.3.0 ships with a built-in encryption service using AES-256-GCM. Inject `Encryption` into any feature and you're set — no external dependencies required. + +https://www.webiny.com/docs/release-notes/6.3.0/changelog diff --git a/scripts/generate-announcements.ts b/scripts/generate-announcements.ts index e4c519366..1b56a7b0f 100644 --- a/scripts/generate-announcements.ts +++ b/scripts/generate-announcements.ts @@ -91,6 +91,11 @@ Rules: - Do NOT add any extra sections, bullet lists, or formatting beyond what is described above. - "Webiny" is always capitalised. - Keep the whole message short — it should be readable in 30 seconds. +- Do NOT mention CLI flags, upgrade command options, logging settings, or other low-level tooling + details (e.g. --force flags, default logging changes). Focus on product and developer experience. +- Do NOT mention low-level infrastructure internals in the highlights — no Pulumi hooks, env hooks, + plugin cleanup, OpenSearch prefixing, or deployment plumbing. If infra improvements are worth + mentioning at all, describe them in terms of developer benefit, not implementation details. Here is a real example of the style to match: @@ -106,13 +111,12 @@ Use blank lines between paragraphs. Structure: -- Opening hook (1–2 sentences): grab attention, announce the release. Make it feel significant. +- Opening line: announce the release. 1 sentence. - Blank line -- 2–4 body paragraphs: each covers a theme from the changelog. Write in a professional but warm tone. - Be specific about what changed and why it matters to developers or teams using Webiny. - Each paragraph 2–4 sentences. +- 2–3 body paragraphs. Group changes into themes rather than listing every item. Each paragraph + 1–3 sentences. Be warm and specific but don't try to cover everything — pick the highlights. - Blank line -- Closing paragraph: forward-looking, invite engagement (e.g. "Give it a try and let us know what you think."). +- Closing line: forward-looking, invite engagement. 1 sentence. - Blank line - Links (plain text): "Changelog: https://www.webiny.com/docs/release-notes/VERSION/changelog" @@ -120,11 +124,45 @@ Structure: Rules: - Replace VERSION with the actual release version number in the URLs. -- Use real Unicode emoji very sparingly — at most 2 in the entire post, only in the opening or closing. +- Use real Unicode emoji very sparingly — at most 1 in the entire post, only in the opening or closing. - "Webiny" is always capitalised. - Tone: professional, developer-focused, enthusiastic but not hype-y. +- Keep the whole post short — roughly the same length as a Slack announcement. - Do NOT use hashtags. - Do NOT use bullet points or numbered lists anywhere. +- Do NOT mention CLI flags, upgrade command options, logging settings, or low-level infrastructure + details (e.g. Pulumi internals, env hooks, --force flags). Stick to product and developer experience highlights. +- Do NOT end with a catch-all paragraph listing minor fixes. If there's nothing left worth highlighting + at that point, stop — the closing line is enough. +`.trim(); + +const FOLLOWUP_TWEETS_PROMPT = ` +You write follow-up tweets for Webiny releases. Webiny is an open-source serverless CMS platform. +These tweets will be posted one per day in the days after the release to keep content flowing. + +Pick 3–4 of the most interesting features or improvements from the changelog. Write one standalone +tweet per feature. Each tweet must work completely on its own — no references to "yesterday's release" +or numbering like "1/4". + +Format: separate each tweet with a blank line and a "---" divider. + +Each tweet: +- 1–3 sentences. Focused on one specific thing. +- Concrete and specific — name the actual feature, explain what it does or why it matters. +- Vary the structure — don't make every tweet feel the same. Some can open with a question, + some can frame a problem the feature solves, some can just lead with the capability. +- End with the changelog link: https://www.webiny.com/docs/release-notes/VERSION/changelog +- At most 1 emoji per tweet, only where genuinely fitting. + +Rules: +- Replace VERSION with the actual release version number in the URL. +- "Webiny" is always capitalised. +- Tone: excited but technical. Speak to developers. +- Do NOT use hashtags. +- Do NOT start every tweet with "Webiny" — vary the openings. +- Do NOT use backticks or any code formatting — plain text only. +- Do NOT mention CLI flags, upgrade command options, logging settings, or low-level infrastructure + details. Focus on product and developer experience. `.trim(); // --------------------------------------------------------------------------- @@ -185,11 +223,12 @@ async function main(): Promise { } const client = new Anthropic({ apiKey }); - console.log(" Generating Slack and social posts in parallel..."); + console.log(" Generating Slack, social, and follow-up tweets in parallel..."); - const [slack, social] = await Promise.all([ + const [slack, social, tweets] = await Promise.all([ generate(client, SLACK_PROMPT, changelog, version, "Slack"), - generate(client, SOCIAL_PROMPT, changelog, version, "social") + generate(client, SOCIAL_PROMPT, changelog, version, "social"), + generate(client, FOLLOWUP_TWEETS_PROMPT, changelog, version, "follow-up tweets") ]); const outDir = join(process.cwd(), "docs", "release-notes", version, "announcements"); @@ -197,7 +236,8 @@ async function main(): Promise { const files: Array<[string, string]> = [ ["slack.md", slack], - ["social.md", social] + ["social.md", social], + ["tweets.md", tweets] ]; for (const [filename, content] of files) { @@ -207,6 +247,7 @@ async function main(): Promise { printSection("SLACK", slack); printSection("SOCIAL (X / LinkedIn)", social); + printSection("FOLLOW-UP TWEETS", tweets); console.log(); }