$.secrets.slack
Published workflows
Loading workflows…
Published workflows
Loading workflows…
Public workflow
A reusable OutcomeCI workflow.
Version 1 · Published
You describe pull requests across one or more GitHub repositories in Slack, and this workflow turns that conversation into actual code changes. It plans the work in dependency order, discusses the plan with you until you agree, then opens pull requests with the implemented changes—all coordinated through a Slack thread.
You'll need to provide:
Slack workspace authentication (token and signing secret)
GitHub personal access token with write permissions
The implementation instructions file that guides how code changes are made
GitHub user identities for write access to up to four repositories
When triggered, you mention the workflow in Slack or send it a direct message naming repositories as owner/repo in backticks, along with the changes you want.
The workflow posts a multi-repository plan in your Slack thread, lets you refine it through conversation, then implements it. You receive pull request links and summaries in the thread, one line per repository in the order they build and merge. Repositories whose changes depend on others will note that dependency in their PR body. Any repository skipped due to conflicts or missing files gets a brief explanation instead of a PR.
apiVersion: outcomeci.workflow/v1
name: slack-github-pr
trigger:
webhook:
uses: slack
auth: secrets.slack_signing
events:
- mention
- dm
secrets:
slack: vault:publication/setup_value_1
slack_signing: vault:publication/setup_value_2
github: vault:publication/setup_value_3
apis:
slack:
uses: slack
auth: secrets.slack
github:
uses: github
auth: secrets.github
reasoning:
default:
runner: codex
model: gpt-5.5
fallback:
- runner: claude
model: claude-opus-5-5
steps:
- draft:
reason: 'Find every repository named in the request as `owner/repo` in backticks
and confirm each exists. Draft one plan with a section per repo, listed in the
order to build and merge them. When one repo''s change depends on another''s,
state the shared interface exactly in both sections: endpoint, field names,
types, and allowed values. Post the plan in the request''s thread.
'
from: trigger
can:
- github.read
- slack.post:
channel: trigger.channel
- slack.file:
channel: trigger.channel
returns:
plan:
summary: null
repos:
- repo:
owner: null
name: null
steps:
- string
- discuss:
with: draft.plan
converse: slack.thread(draft.calls.slack.post)
by: trigger.user
until: converged
max_turns: 12
returns:
- plan
- status
- implement:
when: discuss.status == "converged"
reason: implement-and-open-pr.md
using:
runner: claude
model: claude-opus-5-5
with: discuss.plan
can:
- github.write:
repo: discuss.plan.repos.0.repo
as: setup_value_5
- github.write:
repo: discuss.plan.repos.1.repo
as: setup_value_6
- github.write:
repo: discuss.plan.repos.2.repo
as: setup_value_7
- github.write:
repo: discuss.plan.repos.3.repo
as: setup_value_8
policy: 'Per repository in the plan: one new branch, one PR, only files that repo''s
steps name. No force-push.'
returns:
prs:
- repo: string
url: null
number: int
branch: null
skipped:
- repo: string
reason: string
- announce:
with:
- implement
- discuss.plan
reason: 'Post one line per repository in the plan''s thread, in the plan''s order:
its PR link from implement.prs with a one-line summary, or, for a repo in implement.skipped,
the reason.
'
can:
- slack.post:
channel: trigger.channel
thread_ts: trigger.ts
$.secrets.slack
$.secrets.slack_signing
$.secrets.github
$.files[".outcomeci/instructions/implement-and-open-pr.md"]
$.steps[2].implement.can[0]["github.write"].as
$.steps[2].implement.can[1]["github.write"].as
$.steps[2].implement.can[2]["github.write"].as
$.steps[2].implement.can[3]["github.write"].as