← All ivy-agents
IVYXSTUDIO · IVY AGENT
R

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.

  1. 01
    Summarize 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
    context from the agent's input, payload.body
    returns
    summary
    Model turn
  2. 02
    Post to Slack
    ivy.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.text from step 1, output.summary
    set
    method POST
    secret
    url the stored secret slack-webhook-url
    returns
    slack_status
    Ivy Node
  3. 03
    Mail the list
    ivy.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
    body from step 1, output.summary
    subject from the agent's input, payload.name
    from_addr from the agent's input, username
    username from the agent's input
    to from the agent's input
    smtp_host from the agent's input
    smtp_port from the agent's input
    use_tls from the agent's input, smtp_tls
    set
    smtp_host smtp.gmail.com
    smtp_port 587
    use_tls true
    secret
    password the stored secret mail-password
    returns
    sent
    Ivy Node
  4. 04
    Add the changelog entry
    ivy.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
    url from the agent's input, changelog_url
    json.version from the agent's input, payload.tag_name
    json.summary from step 1, output.summary
    json.url from the agent's input, payload.html_url
    set
    method POST
    secret
    token the stored secret saas-api-key
    returns
    changelog_status
    Ivy Node

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.

Calls a modelmessage-sendNetwork

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

FieldTypeDescription
payloadrequiredobjectThe event your service posted: tag_name, name, body (the release notes) and html_url of the release.
changelog_urlrequiredstringYour API's changelog endpoint; a POST with version, summary and url adds an entry. The stand-in's address is used in the cases.
usernamerequiredstringThe sending address, which is the login name; its password is the stored secret mail-password.
torequiredstringThe announcement list's address.
smtp_hoststringThe SMTP server; smtp.gmail.com when left out.
smtp_portintegerThe SMTP port; 587 when left out.
smtp_tlsbooleanUpgrade SMTP with STARTTLS; on when left out.

Outputs

FieldTypeDescription
summarystringThe customer-facing summary.
slack_statusintegerSlack's HTTP status.
sentbooleanTrue once the server accepted the mail.
changelog_statusintegerYour 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_host 127.0.0.1
    smtp_port 3025
    smtp_tls false
    payload {"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_url http://127.0.0.1:18910/changelog
    username agent@ivyx.test
    to agent@ivyx.test
    expects
    summary matches [Ee]xport|CSV|csv|[Ff]ilter|VAT|vat|[Ii]nvoice
    slack_status equals 200
    sent equals true
    changelog_status equals 201
  • patch-release

    A one-line fix is summarized without invented features.

    given
    smtp_host 127.0.0.1
    smtp_port 3025
    smtp_tls false
    payload {"tag_name":"v2.4.1","name":"2.4.1","body":"- Fixed: the login page reloaded after a password reset","html_url":"http...
    changelog_url http://127.0.0.1:18910/changelog
    username agent@ivyx.test
    to agent@ivyx.test
    expects
    summary matches [Ll]ogin|log in|[Pp]assword
    slack_status equals 200
    sent equals true
    changelog_status equals 201