Release Announcer
ivy.agent.release-announcer · v1.0.0
ivyx
Takes a GitHub release event, has a model summarize the notes for customers, posts the summary to Slack, mails it and adds it to your changelog through your API.
Steps
In the order the agent's file lists them, each with where its inputs come from and the values the file fixes. A branch or a loop is a step too.
- 01Model turnSummarize the notes
Summarize these release notes for customers in at most three sentences, plain words, naming what they can now do and what was fixed. Do not invent features.
- takes
contextfrom the agent's input,payload.body- returns
summary
- 02Ivy NodePost to Slackivy.node.http-request
Sends one HTTP request to a URL and returns the status, headers and body, parsed as JSON when the response is JSON.
- takes
json.textfrom step 1,output.summary- set
methodPOST- secret
urlthe stored secret slack-webhook-url- returns
slack_status
- 03Ivy NodeMail the listivy.node.email-send
Sends a plain-text or HTML email through an SMTP server in one step and returns the recipients it went to.
- takes
bodyfrom step 1,output.summarysubjectfrom the agent's input,payload.namefrom_addrfrom the agent's input,usernameusernamefrom the agent's inputtofrom the agent's inputsmtp_hostfrom the agent's inputsmtp_portfrom the agent's inputuse_tlsfrom the agent's input,smtp_tls- set
smtp_hostsmtp.gmail.comsmtp_port587use_tlstrue- secret
passwordthe stored secret mail-password- returns
sent
- 04Ivy NodeAdd the changelog entryivy.node.http-request
Sends one HTTP request to a URL and returns the status, headers and body, parsed as JSON when the response is JSON.
- takes
urlfrom the agent's input,changelog_urljson.versionfrom the agent's input,payload.tag_namejson.summaryfrom step 1,output.summaryjson.urlfrom the agent's input,payload.html_url- set
methodPOST- secret
tokenthe stored secret saas-api-key- returns
changelog_status
Nodes it brings
Adding this agent in IVYX Studio adds these nodes with it. A node your workspace already has is kept as it is, even at another version.
What it touches
Collected from what each of its nodes declares, plus the model call when a step is a model turn. A declaration is the author's statement, and it is what policy rules select on.
What it needs
- A stored secret named
mail-password. The agent's file carries the name, never the value. - A stored secret named
saas-api-key. The agent's file carries the name, never the value. - A stored secret named
slack-webhook-url. The agent's file carries the name, never the value.
Inputs
| Field | Type | Description |
|---|---|---|
| payloadrequired | object | The event your service posted: tag_name, name, body (the release notes) and html_url of the release. |
| changelog_urlrequired | string | Your API's changelog endpoint; a POST with version, summary and url adds an entry. The stand-in's address is used in the cases. |
| usernamerequired | string | The sending address, which is the login name; its password is the stored secret mail-password. |
| torequired | string | The announcement list's address. |
| smtp_host | string | The SMTP server; smtp.gmail.com when left out. |
| smtp_port | integer | The SMTP port; 587 when left out. |
| smtp_tls | boolean | Upgrade SMTP with STARTTLS; on when left out. |
Outputs
| Field | Type | Description |
|---|---|---|
| summary | string | The customer-facing summary. |
| slack_status | integer | Slack's HTTP status. |
| sent | boolean | True once the server accepted the mail. |
| changelog_status | integer | Your API's HTTP status for the entry. |
Tests
2 of 2 test cases passed on Oct 7, 2026, in the publisher's own environment, before this version was published. The registry keeps that record; it does not run the cases again.
Requires: python:3.9, a model core, a Slack incoming webhook URL stored as the secret slack-webhook-url, your own API's key stored as the secret saas-api-key, an SMTP server (Gmail unless smtp_host says otherwise) with the sending account's password stored as the secret mail-password, for the cases, GreenMail on 127.0.0.1:3025 (mkdata-mail.py), for the cases, the stand-in API on 127.0.0.1:18910 (api-standin.py), which the secrets crm-1, gh-1, saas-1 and the stand-in's /slack/hook address satisfy
- minor-release
Three bullet points become a short summary that reaches Slack, the list and the changelog.
- given
smtp_host127.0.0.1smtp_port3025smtp_tlsfalsepayload{"tag_name":"v2.4.0","name":"2.4.0","body":"- Export to CSV no longer crashes on files over 10 MB\n- New: filter dash...changelog_urlhttp://127.0.0.1:18910/changelogusernameagent@ivyx.testtoagent@ivyx.test- expects
summarymatches [Ee]xport|CSV|csv|[Ff]ilter|VAT|vat|[Ii]nvoiceslack_statusequals 200sentequals truechangelog_statusequals 201
- patch-release
A one-line fix is summarized without invented features.
- given
smtp_host127.0.0.1smtp_port3025smtp_tlsfalsepayload{"tag_name":"v2.4.1","name":"2.4.1","body":"- Fixed: the login page reloaded after a password reset","html_url":"http...changelog_urlhttp://127.0.0.1:18910/changelogusernameagent@ivyx.testtoagent@ivyx.test- expects
summarymatches [Ll]ogin|log in|[Pp]asswordslack_statusequals 200sentequals truechangelog_statusequals 201