Repository navigation
Releases
Releases · joe-broadhead/opencode-slack
v0.0.1
[0.0.1] - 2026-11-13
Added
- Status's
account(teamId,userId,enterpriseId), fromauth.test. Thanks to @domeevans (#18). - The tools RPC's
statusmethod (slack_status, allowed at everyaccess). Thanks to @domeevans (#18). slack_mark_read/mark_read(write): Slack'sconversations.mark. Needs a:writescope;SCOPE_MISSINGwithout it. Thanks to @domeevans (#18).oauth.auth_server_metadata_url, passed unchanged into theslackserver'soauthblock, so a host with anhttps:callback can keep Slack's client secret on its own sign-in service. OpenCode uses that document in place of Slack's for the whole sign-in;SECURITY.mdsays what its server controls. Without it the entry is unchanged.- The
jellyaccesssetting declares its choices (needs a jelly that includes app#1301). - The README and
docs/configuration.mdsay that Slack refreshes without a secret only for desktop redirects, and answers a refused refresh with HTTP 200bad_client_secret.
Changed
- The plugin now reads the Slack token, in
src/slack-api.tsonly, to callauth.testandconversations.mark, and never stores, logs or returns it.
Known limits
- Slack's server and Slack's tools. The plugin adds Slack's hosted MCP server and no wrapper tools; its only Web API calls,
auth.testandconversations.mark, are tested against a fake Slack, not a live one. Tool schemas, results (Markdown text, not JSON) and rate limits are Slack's. - The default
accessisall. Agents can then read private channels and files, and send or change things, without asking. Setaccessto"ask-changes"or"read-only"to restrict it; see Permissions. - Tool classes are set by hand. A tool Slack adds later runs under the namespace rule (allowed at
all, asks atask-changes, denied atread-only) and is not a script method until the plugin classifies it./slack-statusnames such tools. mark_readneedsim:write,channels:writeor the like, not in the default scopes.- Jelly.
accessneeds a Jelly with app#1301. - Private search needs scopes the default sign-in lacks. With the default scopes, Slack answers
missing_scopefor it. See the scope table. - Tested on OpenCode 2.2.3, 2.2.4, 2.2.5 and 2.2.6 only. Other releases in
>=2.2.3 <2.3.0run untested. - A script's calls are not recorded in the session. Slack's audit logs record them.
- Names keep the doubled prefix. A permission action is the tool's full name, such as
slack_slack_search_public. Renaming it would break saved rules. - Updates are not automatic for a Git install, and
opencode plugin updateandopencode plugin checkdo not work on one: to move to a newer release, remove the old entry and add the new tag.
v0.0.0
[0.0.0] - 2026-11-10
Added
opencode.iconsandopencode.vendor, withassets/icon.svg,icon-128.pngandicon-256.pngfrom the family icon kit, the threeexportsandfilesentries, and theiconsstage ofnpm run check.- An
actionlintstage, and anactionlintjob in CI. - One typed code table,
src/codes.ts, with a test that fails when a code insrcis missing from it, or when the README's or the scripting doc's table drifts from it. - A test that parses every example in
docs/scripting.mdand the README: the method, the location header, the strict envelope and the tool's own fields.
Changed
- The Slack skill's first line says how to sign in when the tools are absent:
/connect, or on Jellyjelly_connection_request. docs/scripting.mdsays a script's session needs the project as itslocation; without one, each call failsAgent not found.SKILLS_INVALIDsays to reinstall the plugin from its tag:opencode plugin removewith the installed spec, thenopencode plugin addwith it.opencode plugin updatedoes not take a Git install.slack_events_listruns without a prompt at everyaccessvalue, because it is a read and Memory's collector runs it unattended. Its six error codes are in the Troubleshooting table.- Every tool is allowed by default. The generated block allows every Slack tool and the
slack_*namespace, so a tool Slack adds later runs at once and a script can call everything. The Jelly declaration's tools are allallow. Restrict it withaccess, with an agent's own rules, or with a rule per tool; the README's Permissions section,docs/configuration.md,SECURITY.mdand theslack-searchskill say what an all-allow default means and how to restrict it. - The
accessoption,"all"(the default),"ask-changes"and"read-only"(there is no earlier option to map): it generates the default rules from the tool classes, so"ask-changes"lets the reads run and asks for the private-channel search, file reads, writes, sends and new tools, and"read-only"denies them. Status and the/slackdialog show what it allows. docs/scripting.mdcarries the family's envelope, location section, unload note, result wording and refusal table, word for word.- tools RPC v2: every known tool is scriptable under a prior explicit allow.
slack.workspace.toolsnow has one method per known tool, by exact name and with a class (read, send or write), not only the fourteen reads. The rule for each call is resolved before the tool runs, in OpenCode's own order; only anallowruns, and anaskis refused with no prompt and no tool call.describereports each method's class, and — given a session — that session's permission, plus any live tool this plugin does not classify. A saved "Always allow" approval no longer authorizes an ad-hoc script: a script's grant is a rule in the agent's or the session's config, or a Jobsjobs_run_scriptrun session.opencode apicallers must send-H "x-opencode-directory:$PWD", or the call reaches the service's default location and failsrpc.unavailable.
Known limits
- Slack's server and Slack's tools. The plugin adds Slack's hosted MCP server and nothing else: no Slack Web API client and no wrapper tools. Tool schemas, results (Markdown text, not JSON) and rate limits are Slack's.
- The default
accessisall. Agents can then read private channels and files, and send or change things, without asking. Setaccessto"ask-changes"or"read-only"to restrict it; see Permissions. - Tool classes are set by hand. A tool Slack adds later runs under the namespace rule (allowed at
all, asks atask-changes, denied atread-only) and is not a script method until the plugin classifies it./slack-statusnames such tools. - Private search needs scopes the default sign-in lacks. With the default scopes, Slack answers
missing_scopefor it. See the scope table. - Tested on OpenCode 2.2.3, 2.2.4, 2.2.5 and 2.2.6 only. Other releases in
>=2.2.3 <2.3.0run untested. - A script's calls are not recorded in the session. Slack's audit logs record them.
- Names keep the doubled prefix. A permission action is the tool's full name, such as
slack_slack_search_public. Renaming it would break saved rules. - Updates are not automatic for a Git install, and
opencode plugin updateandopencode plugin checkdo not work on one: to move to a newer release, remove the old entry and add the new tag.