Resolves the release range from repo tags, collects the pull requests merged in it, groups them into features, fixes, and chores, and links each Linear issue. Every call runs as the release manager who owns the release, never a shared CI bot.
This repo keys every connected account on per-connector GITHUB_USER, LINEAR_USER, CONFLUENCE_USER, and NOTION_USER identities, defaulting to one release manager's email. In production, pass each user's real ID as the identifier on every Scalekit call, and send them an authorization link whenever their connector status is not ACTIVE.
resp = self.actions.get_or_create_connected_account(
connection_name=self.connector_name, # github / linear / confluence / notion
identifier=self.identifier, # the release manager, not a CI bot
)
if resp.connected_account.status != "ACTIVE":
link = self.actions.get_authorization_link(
connection_name=self.connector_name,
identifier=self.identifier,
).link
logger.warning(f"Authorize here: {link}")Four things you'd otherwise build: GitHub token storage, Linear OAuth, Confluence and Notion tokens, refresh. Handled.
Clone github.com/scalekit-developers/workflow-agents-demos/tree/main/release-changelog-agent and adapt it for my release process.
I am building for: my engineering org (or: a developer-tools product) <- edit this line
Connectors my users need: GitHub, Linear, Confluence, Notion <- edit this line
Trigger: invoked per release tag from CI. Deliver: a grouped changelog published to a Confluence page and a Notion doc, every entry linked to its PR and its Linear issue.
Steps:
1. Create Scalekit AgentKit connections for github, linear, confluence (the plain REST connector, not AtlassianMCP), and notion -- copy the exact connection names into GITHUB_CONNECTOR / LINEAR_CONNECTOR / CONFLUENCE_CONNECTOR / NOTION_CONNECTOR.
2. Set GITHUB_USER / LINEAR_USER / CONFLUENCE_USER / NOTION_USER to the release manager each run acts for, so every write is attributed to a person instead of a shared CI bot.
3. Point GITHUB_OWNER / GITHUB_REPO at a repo with at least two tags; leave PREVIOUS_TAG and CURRENT_TAG empty to let provisioning.py resolve the range, or set them to pin it.
4. Set CONFLUENCE_SPACE_KEY and NOTION_PARENT_PAGE_ID, and turn off either target with PUBLISH_CONFLUENCE=false / PUBLISH_NOTION=false if I only publish to one.
5. Set LINEAR_TEAM_PREFIXES to my team keys so ABC-123 strings from other trackers are not mistaken for Linear issues, or ENABLE_LINEAR=false to skip enrichment.
6. Run python run_flow.py --dry-run to render the changelog without publishing, then describe how to wire it behind my tag-push CI job.
Each one runs on delegated identity, scoped per user.