Files
james.maesandClaude Opus 5.5 36def54b8b feat(help): ship the qbit-slack help bundle through QQQ help bundles, with coverage gate
Host-neutral help (deployment-specific facts removed), registered with
HelpBundles, gated by HelpBundleAssertions. QQQ 4.1.0-RC.7.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:37:13 -05:00

80 lines
3.2 KiB
Markdown

# QBit Slack
Slack for a QQQ system. Users connect their own Slack accounts, and organization admins install the
app for their own workspace. The qbit registers a core messaging provider (`slack`) and a delivery
destination, so any process, scheduled job, report or export can send to a Slack DM or channel through
core alone. Every message is authorized as its owning user at send time, so the qbit is safe for
deployments with many tenants. Delivery uses a durable outbox with Slack rate-limit handling, and
classified PHI and PII never reach Slack.
Design: [docs/DESIGN.md](docs/DESIGN.md).
## Requirements
- Java 21
- QQQ 4.1 (currently built against 4.1.0-RC.7)
- A Slack app created from [docs/slack-app-manifest.yaml](docs/slack-app-manifest.yaml)
## Install
```java
new SlackQBitProducer()
.withQBitConfig(new SlackQBitConfig()
.withBackendName("rdbms")
.withSchedulerName("scheduler"))
.produce(qInstance);
```
## Tables, permissions and configuration
See [docs/DESIGN.md](docs/DESIGN.md), sections 3 to 14. The tables are prefixed `slack_` and the
permissions `slack.`. Secrets are environment-variable names only: `SLACK_CLIENT_ID`,
`SLACK_CLIENT_SECRET`, `SLACK_SIGNING_SECRET` and `SLACK_TOKEN_KEY`.
## Setup and starter data
No Liquibase changelog or host include is needed: the qbit seeds its own data at startup. The three
built-in templates (`notification`, `digest`, `delivery`) are inserted by `SlackTemplates.seed()`
when the host starts and on each readiness run. It is insert-only by name, so edits survive.
Everything else is host or runtime data, and every table explains itself when empty (help bundle
`help/qbit-slack.yaml`):
1. An administrator runs "Install for my organization" (Connections). This creates the workspace.
2. Each user runs "Connect Slack" so messages go out as them.
3. Register the channels and user groups processes post to (Registered Channels, User Groups), then
run "Check channels". It records the Slack name, private, bot is member, archived, purpose and
checked time. Readiness refreshes them on a schedule.
4. Review the built-in Templates.
Messages, Attempts and Interactions are logs and start empty.
## Adopting in another app
Send with core `SendMessageAction` and the provider name `slack`, or deliver output to the `slack`
destination. Don't import this qbit's internal packages; `com.kingsrook.qbits.slack.api` is the only
public surface.
## In-app help
The producer registers [help/qbit-slack.yaml](src/main/resources/help/qbit-slack.yaml)
with QQQ's help bundle registry. Hosts with help content enabled sync it at startup;
registration is harmless without a `helpContent` table. Live references use the host's current labels.
To override text, register a separate bundle with `layer: HOST` and the same entry keys
(and roles) using `HelpBundles.register(qInstance, "help/your-host.yaml")`.
HOST entries take precedence over QBIT entries; user edits are preserved by core sync.
`SlackTablesGuardrailTest.everyTableHasEmptyStateHelp` runs `HelpBundleAssertions` over
Slack's produced metadata to check coverage, keys, summaries and live references during `verify`.
## Build
```bash
./mvnw verify
```
## License
Apache License 2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE).