From 080cf7fd2b662865238ef904114c2b79f593621c Mon Sep 17 00:00:00 2001 From: Sergio Alexander Florez Galeano Date: Thu, 23 Jul 2026 18:38:27 -0500 Subject: [PATCH 1/3] feat(chat,workflow): document interactive buttons and workflow trigger Document chat approval/workflow button flags, full --buttons JSON contract, workflow trigger, and the matching error codes for agents. Co-authored-by: Cursor --- README.md | 20 ++- skills/dailybot/SKILL.md | 6 +- skills/dailybot/chat/SKILL.md | 168 +++++++++++++++++- .../dailybot/shared/list-query-and-errors.md | 15 ++ skills/dailybot/workflow/SKILL.md | 146 ++++++++++++--- 5 files changed, 317 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 781687f..1620087 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,11 @@ Give your AI coding agent the ability to report progress, check for messages, send emails, announce status, complete check-ins, give kudos, submit forms, -and **send chat messages on Slack / Teams / Discord / Google Chat** (with -report-style threads and in-place edits) — all through Dailybot. Your team -sees what the agent accomplished, sends instructions, and stays coordinated -across humans and agents. +**send chat messages on Slack / Teams / Discord / Google Chat** (with +report-style threads, interactive buttons, and in-place edits), and **trigger +workflows** — all through Dailybot. Your team sees what the agent +accomplished, sends instructions, and stays coordinated across humans and +agents. - **License:** [MIT](LICENSE) - **Security policy:** [SECURITY.md](SECURITY.md) @@ -26,7 +27,8 @@ across humans and agents. | **dailybot-checkin** | Full check-in lifecycle: list/status, complete, inspect questions & schedule, response history, edit/reset a response, and backfill or future-date — all headless with `--json`. Works with a login session **or** an API key (`dailybot-cli >= 1.15.0`). | | **dailybot-kudos** | Give kudos to a teammate to recognize their contributions. Team-visible recognition through Dailybot. | | **dailybot-forms** | List and submit form responses (feedback surveys, retros, pulse checks). Works with a login session **or** an API key (`dailybot-cli >= 1.15.0`). | -| **dailybot-chat** | Send and edit bot messages on the team's connected chat platform (Slack / Microsoft Teams / Discord / Google Chat). DMs, channels, or whole teams; report-style threads (headline + replies in one call); edit the parent or any thread reply afterward. Requires `dailybot-cli >= 1.13.0`. | +| **dailybot-chat** | Send and edit bot messages on the team's connected chat platform (Slack / Microsoft Teams / Discord / Google Chat). DMs, channels, or whole teams; report-style threads (headline + replies in one call); interactive buttons (approval flows, workflow triggers, modals, callbacks); edit the parent or any thread reply afterward. Requires `dailybot-cli >= 1.13.0`. | +| **dailybot-workflow** | List, inspect, and trigger Dailybot workflows. Fire API-triggerable workflows on demand with optional JSON payloads. Plan-gated feature. | | **dailybot-ask** | Ask the Dailybot AI a question headlessly — `dailybot ask "..."` prints the answer to stdout (or `--json`). The primary way an agent queries the Dailybot AI with only an API key. Requires `dailybot-cli >= 1.15.0`. | A root **dailybot** meta-skill acts as a router — it describes all @@ -109,7 +111,8 @@ right sub-skill: - "Complete my check-in" → **dailybot-checkin** - "Give kudos to Jane" / "kudos al equipo Engineering" → **dailybot-kudos** - "Fill out the feedback form" → **dailybot-forms** -- "Send a Slack message to #releases" / "DM Sergio in chat" / "post a deploy report with the changelog in a thread" → **dailybot-chat** +- "Send a Slack message to #releases" / "DM Sergio in chat" / "post a deploy report with the changelog in a thread" / "send an approval request with buttons" → **dailybot-chat** +- "Trigger the deploy workflow" / "list my workflows" → **dailybot-workflow** Or invoke directly: `/dailybot_report`. The messages, email, and health skills are agent-only — the agent uses them autonomously without a slash @@ -233,7 +236,9 @@ All outbound calls go to `api.dailybot.com` over HTTPS: | `POST /v1/kudos/` | `dailybot-kudos` skill | `X-API-KEY` or Bearer, `receivers` list, content | | `GET /v1/teams/` | `dailybot-teams` skill (team-name resolution; used by kudos + chat) | `X-API-KEY` **or** Bearer | | `POST /v1/cli/chat/completions/` | `dailybot-ask` skill | `X-API-KEY` **or** Bearer; `{message}` → AI answer; 30 req/min per key | -| `POST /v1/send-message/` | `dailybot-chat` skill | **Either** `X-API-KEY` (org-wide) **or** Bearer token (login, role-scoped). Targets users/channels/teams, optional `thread_responses[]` for replies, optional `bot_message_id` to edit a previous message (parent or reply) | +| `POST /v1/send-message/` | `dailybot-chat` skill | **Either** `X-API-KEY` (org-wide) **or** Bearer token (login, role-scoped). Targets users/channels/teams, optional `thread_responses[]` for replies, optional `bot_message_id` to edit a previous message (parent or reply), optional `buttons[]` for interactive buttons | +| `GET /v1/workflows/` | `dailybot-workflow` skill (list/get) | `X-API-KEY` **or** Bearer | +| `POST /v1/workflows//trigger/` | `dailybot-workflow` skill (trigger) | `X-API-KEY` **or** Bearer; optional `{payload}` JSON object (≤8 KiB) | | `https://cli.dailybot.com/install.sh{,.sha256}` | CLI install on first session, with consent | None (download only) | ### Per-repo opt-out @@ -319,6 +324,7 @@ agent-skill/ ├── kudos/SKILL.md — user + team recognition (user-scoped) ├── teams/SKILL.md — team listing + name resolver (shared with kudos + chat) ├── forms/SKILL.md — form submission (user-scoped) + ├── workflow/SKILL.md — workflow list, inspect, and trigger (plan-gated) └── chat/SKILL.md — Slack/Teams/Discord/Google Chat bot messages (CLI >= 1.13.0; latest on PyPI) ``` diff --git a/skills/dailybot/SKILL.md b/skills/dailybot/SKILL.md index 6b9fd72..8baf5a6 100644 --- a/skills/dailybot/SKILL.md +++ b/skills/dailybot/SKILL.md @@ -1,6 +1,6 @@ --- name: dailybot -description: Official Dailybot agent skill pack — report progress, check messages, send emails, announce agent status, complete check-ins, give kudos (to users or teams), resolve teams, run the full forms lifecycle (list, submit, update, transition between workflow states), **author check-ins and forms from scratch** (create/configure questions, workflow states, permissions, reminders, scheduling, AI settings, sharing), send/edit chat messages on the team's Slack/Teams/Discord/Google Chat (including report-style threads and sending as a user's identity), open (or reuse) a Slack group DM with the bot and post a report to it, ask the Dailybot AI a question headlessly, **and browse/read the workspace** — who am I / my org / a user's profile (`me` / `org` / `user get`), browse the kudos feed + the org-wide feed + wall of fame, and list/read workflows — all with shared pagination / search / date-range filters. Also **manages per-repo API keys** through the opt-in `.dailybot/env.json` file (dailybot env add/use/show/list/remove/off/on — CLI 3.7.0+) so a developer can be "logged into different orgs in different repos" simultaneously. Routes to the right sub-skill based on intent. Use when the developer mentions Dailybot or wants to interact with their team. +description: Official Dailybot agent skill pack — report progress, check messages, send emails, announce agent status, complete check-ins, give kudos (to users or teams), resolve teams, run the full forms lifecycle (list, submit, update, transition between workflow states), **author check-ins and forms from scratch** (create/configure questions, workflow states, permissions, reminders, scheduling, AI settings, sharing), send/edit chat messages on the team's Slack/Teams/Discord/Google Chat (including report-style threads, sending as a user's identity, and interactive buttons with approval flows, workflow triggers, modals, and callbacks), open (or reuse) a Slack group DM with the bot and post a report to it, ask the Dailybot AI a question headlessly, **and browse/read/trigger the workspace** — who am I / my org / a user's profile (`me` / `org` / `user get`), browse the kudos feed + the org-wide feed + wall of fame, list/read workflows, and trigger API-triggerable workflows with optional payloads — all with shared pagination / search / date-range filters. Also **manages per-repo API keys** through the opt-in `.dailybot/env.json` file (dailybot env add/use/show/list/remove/off/on — CLI 3.7.0+) so a developer can be "logged into different orgs in different repos" simultaneously. Routes to the right sub-skill based on intent. Use when the developer mentions Dailybot or wants to interact with their team. version: "3.10.4" documentation_url: https://www.dailybot.com/skill.md user-invocable: true @@ -66,7 +66,7 @@ Thirteen coordinated capabilities, with smart routing between them: | **Kudos** | `dailybot-kudos` | Recognize a teammate or a whole team — **plus browsing (read)**: `kudos list` the recognition feed (filter received/given), `kudos org` the whole org's feed (admin-only), and `kudos wall-of-fame` leaderboard | | **Teams** | `dailybot-teams` | List teams, inspect members, resolve a team name → UUID (used as a resolver by other skills) — **plus account context**: `dailybot me` (who am I / role), `dailybot org` (which org), and `dailybot user get` (one user's profile) | | **Forms** | `dailybot-forms` | List, submit, update, or transition forms — including workflow-state forms with audience permissions (`form list` is now **org-scoped** by default, with `--mine` to narrow to your own; list + responses support pagination / search / date filters) — **plus authoring**: create/configure a form (workflow states, permissions, anonymous/public/approval, ChatOps command) and manage its questions | -| **Workflows** | `dailybot-workflow` | Developer wants to **read** the org's workflows — `workflow list` (paginated/searchable) and `workflow get`. Read-only; writes are web-app only. Plan-gated | +| **Workflows** | `dailybot-workflow` | Developer wants to **read or trigger** the org's workflows — `workflow list` (paginated/searchable, with `--filter api_trigger`), `workflow get`, and `workflow trigger` (fire an API-triggerable workflow with an optional JSON payload). Creating/editing workflows is web-app only. Plan-gated | | **Report channels** | `dailybot-channels` | Discover report-channel UUIDs to attach to forms/check-ins with `--report-channel` | | **Per-repo API keys** | `dailybot-env` | Configure `.dailybot/env.json` — an **opt-in, gitignored** file that carries API keys + URLs for one or more environments (live, local, staging) so the developer can be "logged into different orgs in different repos". `dailybot env add / use / show / list / remove / off / on`. CLI >= 3.7.0 | @@ -241,8 +241,10 @@ the full step-by-step workflow. | "who am I?", "what's my role?", "which org am I in?", "show a user's profile" | **Teams** → read [`teams/SKILL.md`](teams/SKILL.md) § Step 4.5 (`me` / `org` / `user get`) | | "browse kudos", "kudos I received / gave", "org kudos stats", "who's on the wall of fame?" | **Kudos** → read [`kudos/SKILL.md`](kudos/SKILL.md) § Browsing kudos | | "list my workflows", "show workflows", "what's in workflow X?" | **Workflows** → read [`workflow/SKILL.md`](workflow/SKILL.md) | +| "trigger the deploy workflow", "fire automation X", "run workflow ``", "trigger workflow with payload" | **Workflows** → read [`workflow/SKILL.md`](workflow/SKILL.md) § Step 4 (Trigger) | | "which channels can Dailybot post to?", "list report channels", "I need a channel UUID for the form / check-in" | **Channels** → read [`channels/SKILL.md`](channels/SKILL.md) | | "send a Slack message", "DM someone in chat", "post the deploy report to a channel (with a thread)", "edit that chat message I just sent", "ping the Engineering team in chat" | **Chat** → read [`chat/SKILL.md`](chat/SKILL.md) | +| "send an approval request with buttons", "post a message with interactive buttons", "add a workflow button to a message", "send a message with approve/reject" | **Chat** → read [`chat/SKILL.md`](chat/SKILL.md) § Buttons | | "send this to a channel as me", "post as `` in Slack", "send the message with someone's identity" | **Chat** → read [`chat/SKILL.md`](chat/SKILL.md) § Send as a user's identity (`--send-as-user` / `--send-as-me`) | | "open a group DM with Jane and Bob", "start a Slack group with the release team and the bot", "open a group with `` and send them this report", "get me a channel with these people" | **Conversations** → read [`conversation/SKILL.md`](conversation/SKILL.md) | | "list my forms", "which forms does the org have?", "only my own forms" (`--mine`) | **Forms** → read [`forms/SKILL.md`](forms/SKILL.md) | diff --git a/skills/dailybot/chat/SKILL.md b/skills/dailybot/chat/SKILL.md index d20831e..a27cb3f 100644 --- a/skills/dailybot/chat/SKILL.md +++ b/skills/dailybot/chat/SKILL.md @@ -40,6 +40,11 @@ Trigger phrases the agent should recognize: - "post a deploy summary to #releases with the changelog as a thread" - "send a chat message to the QA team" +**Interactive buttons / approvals:** +- "send an approval request with approve/reject buttons" +- "post a message with a button that triggers the deploy workflow" +- "send a message with interactive buttons to #releases" + **Edit / update a previous message:** - "update the deploy message to say done" - "edit that Slack message I just sent" @@ -228,15 +233,115 @@ Ephemeral needs a `--user` target. A channel-only ephemeral send is skipped by t ### Buttons +The CLI supports multiple button styles — from simple link buttons to rich +interactive actions (approval flows, workflow triggers, modals). **Max 25 +buttons per message.** All button flags are repeatable. + +#### Link buttons (jump to a URL) + ```bash -# Link button (jumps to a URL) --link-button "View PR::https://github.com/org/repo/pull/123" +``` + +#### Interactive buttons (server-side action; value is what's sent on click) -# Interactive button (server-side action; value is what's sent on click) +```bash --button "Approve::approve-release-v2.4" ``` -Both flags are repeatable. +#### Approval flow buttons + +A shorthand for the common approve/reject pattern. Each button carries a +`callback_url` where the server POSTs the button value on click, plus an +optional Bearer token for the callback endpoint: + +```bash +dailybot chat send -c C0123 -m "Release v2.5 ready for approval" \ + --approve-button "Approve=approved" \ + --reject-button "Reject=rejected" \ + --callback-url "https://ci.example.com/hooks/release" \ + --callback-bearer "$CI_TOKEN" +``` + +`--approve-button` and `--reject-button` take `"Label=value"` (equals sign +separator). `--callback-url` sets the URL for both. `--callback-bearer` is +optional — when set, the callback POST includes `Authorization: Bearer `. + +#### Workflow trigger buttons + +Fire a Dailybot workflow when clicked — the button carries a +`callback_workflow` reference: + +```bash +dailybot chat send -c C0123 -m "Ready to deploy?" \ + --workflow-button "Deploy now=" +``` + +`--workflow-button` takes `"Label="`. Only workflows with the +`api_trigger` event type ("When triggered via API or button") can be fired this +way. See [`../workflow/SKILL.md`](../workflow/SKILL.md) for triggering +workflows directly. + +#### Full-control buttons via `--buttons` (JSON pass-through) + +For advanced callbacks (forms, commands, prompts, modals, auth overrides), pass +the full button contract as a JSON array: + +```bash +dailybot chat send -c C0123 -m "Pick an action" \ + --buttons '[ + {"label": "Open form", "callback_form": ""}, + {"label": "Run command", "callback_command": "/deploy staging"}, + {"label": "Ask AI", "callback_prompt": "Summarize the last deploy"}, + {"label": "Start workflow", "callback_workflow": ""}, + {"label": "Confirm", "callback_url": "https://ci.example.com/confirm", + "callback_auth": "Bearer "}, + {"label": "Details", "response": "Here are the deploy details…"}, + {"label": "Fill info", "callback_url": "https://example.com/hook", + "modal_body": [ + {"type": "input", "label": "Reason", "name": "reason"}, + {"type": "select", "label": "Priority", "name": "priority", + "options": [{"label": "High", "value": "high"}, {"label": "Low", "value": "low"}]} + ]} + ]' +``` + +**Button contract fields:** + +| Field | Description | +|-------|-------------| +| `label` | Button text (required) | +| `callback_url` | URL to POST on click | +| `callback_form` | Open a Dailybot form for the user to fill | +| `callback_command` | Execute a Dailybot ChatOps command | +| `callback_prompt` | Send a prompt to the Dailybot AI | +| `callback_workflow` | Trigger a Dailybot workflow by UUID | +| `modal_body` | JSON array of input fields shown in a modal before the callback fires | +| `response` | Static text response shown to the clicker (no server call) | +| `callback_auth` | Auth header value for the callback endpoint (e.g. `"Bearer "`) | + +**Constraints:** + +- At most **one** of the five callback types (`callback_url`, `callback_form`, + `callback_command`, `callback_prompt`, `callback_workflow`) per button. + Combining two is rejected with `button_callback_conflict`. +- A button cannot mix `callback_url`/`callback_*` with a link `url` — that's + `button_link_and_callback_conflict`. +- Unknown keys are forwarded to the API (forward-compatible). +- Max **25** buttons per message (`buttons_count_out_of_range`). + +#### Button behavior on `chat update` + +When editing a message, buttons are round-tripped — the existing buttons are +preserved unless you pass new button flags. Custom identity flags +(`--bot-name`/`--bot-icon-*`) and send-as-user flags are ignored on edits. +The 72-hour edit window applies. + +> **Requires a recent `dailybot-cli` with interactive-button support.** The +> `--buttons`, `--approve-button`, `--reject-button`, `--callback-url`, +> `--callback-bearer`, and `--workflow-button` flags land in the next CLI +> release after 3.7.4. `--link-button` and `--button` work on any +> `dailybot-cli >= 3.7.0`. ### Headless / agent use — capture the ids in JSON @@ -289,6 +394,12 @@ The chat platform keeps the message's original bot name/avatar on an edit, so id | `--image-url` | `-i` | Public image URL to attach | | `--link-button` | | `"Label::https://url"` (repeatable) | | `--button` | | `"Label::value"` interactive button (repeatable) | +| `--buttons` | | JSON array of button objects (full contract; see § Buttons) | +| `--approve-button` | | `"Label=value"` approval button (repeatable) | +| `--reject-button` | | `"Label=value"` rejection button (repeatable) | +| `--callback-url` | | Callback URL for approve/reject buttons | +| `--callback-bearer` | | Bearer token sent with the callback POST | +| `--workflow-button` | | `"Label="` trigger a workflow on click (repeatable) | | `--thread-message` | | Reply posted in the parent's thread (repeatable; max 10) | | `--thread` | | Reply into an existing platform thread id (channels) | | `--channel-type` | | `channel` / `private_channel` / `group_chat` / `direct_message` | @@ -402,6 +513,17 @@ The CLI translates these to friendly messages automatically. In `--json` mode (o | `400` | `send_as_user_conflict` | `--send-as-user`/`--send-as-me` combined with `--bot-name`/`--bot-icon-*` | Drop the custom-identity flags — the two are mutually exclusive. (Caught client-side.) | | `400` | `send_as_user_invalid_uuid` | `--send-as-user` isn't a valid UUID | Fix the UUID. (Caught client-side before the request.) | | `400` | `send_as_user_not_found` | The `--send-as-user` UUID doesn't resolve to a user | Confirm the user exists (`dailybot user list`). | +| `400` | `button_link_and_callback_conflict` | A button has both a link `url` and a `callback_*` field | Use one or the other — a button is either a link or an interactive callback. | +| `400` | `button_callback_conflict` | A button has more than one `callback_*` field | Only one of `callback_url`/`callback_form`/`callback_command`/`callback_prompt`/`callback_workflow` per button. | +| `400` | `button_callback_url_invalid` | `callback_url` is not a valid URL | Fix the URL. | +| `400` | `button_modal_body_invalid` | `modal_body` JSON is malformed or has invalid field types | Check the modal spec — array of `{type, label, name, …}` objects. | +| `400` | `button_callback_form_not_found` | `callback_form` UUID doesn't match a form | Verify the form UUID (`dailybot form list`). | +| `400` | `button_callback_command_invalid` | `callback_command` is not a recognized ChatOps command | Check the command string. | +| `400` | `button_callback_prompt_invalid` | `callback_prompt` is empty or too long | Fix the prompt text. | +| `400` | `button_callback_workflow_not_found` | `callback_workflow` UUID doesn't match a workflow, or the workflow isn't triggerable | Verify the UUID and that the workflow has the `api_trigger` event type. | +| `400` | `button_response_invalid` | `response` text is empty or too long | Fix the response text. | +| `400` | `button_callback_auth_invalid` | `callback_auth` value is malformed | Use the format `"Bearer "`. | +| `400` | `buttons_count_out_of_range` | More than 25 buttons on a single message | Reduce to ≤25 buttons. | | `400` | (other) | No/invalid targets, malformed UUID, empty channel id, invalid bot identity | Surface the `detail` verbatim and fix the input. | | `401` / `403` | | Unauthenticated / invalid auth | Suggest `dailybot login` (or, if the developer prefers, `dailybot config key=...`). | | `403` | `cli_send_message_target_not_allowed` | Login Bearer caller targeting outside their role scope (cross-org, channel they can't post to, team they don't belong to) | Tell the developer which target was rejected and suggest either picking an in-scope target or using an org API key for org-wide reach. | @@ -466,7 +588,45 @@ Agent: 4. Surface success. ``` -### Dialogue E — Team not visible to the caller (role scope) +### Dialogue E — Approval flow with callback + +``` +Developer: "send a release approval request to #releases with approve/reject buttons + that POST to our CI webhook" +Agent: + 1. Confirm: + "I'll post to C0123456789: + Message: 🚢 Release v2.5 ready for approval + Buttons: [Approve] → POST approved, [Reject] → POST rejected + Callback: https://ci.example.com/hooks/release + Send? (y/n)" + 2. dailybot chat send -c C0123456789 \ + -m "🚢 Release v2.5 ready for approval" \ + --approve-button "Approve=approved" \ + --reject-button "Reject=rejected" \ + --callback-url "https://ci.example.com/hooks/release" \ + --callback-bearer "$CI_TOKEN" --json + 3. Surface the bot_message_id. +``` + +### Dialogue F — Workflow trigger button + +``` +Developer: "post a message to #deploys with a button that fires the deploy workflow" +Agent: + 1. dailybot workflow list --json → find the deploy workflow UUID + 2. Confirm: + "I'll post to C0123456789: + Message: Deploy ready — click to start + Button: [Deploy now] → triggers workflow + Send? (y/n)" + 3. dailybot chat send -c C0123456789 \ + -m "Deploy ready — click to start" \ + --workflow-button "Deploy now=" --json + 4. Surface the bot_message_id. +``` + +### Dialogue G — Team not visible to the caller (role scope) ``` Developer: "post a heads-up to the Security team's channel" diff --git a/skills/dailybot/shared/list-query-and-errors.md b/skills/dailybot/shared/list-query-and-errors.md index c48cec8..99cc576 100644 --- a/skills/dailybot/shared/list-query-and-errors.md +++ b/skills/dailybot/shared/list-query-and-errors.md @@ -145,6 +145,8 @@ In `--json` mode the error surfaces as `{ error, status, code, detail }`. | `insufficient_role` | The caller's role is below what the action requires. Carries the required and current role. | Name the required role; suggest an admin/manager runs it. | | `member_in_scope_required` | The caller must be a member of the targeted scope (team/check-in/form). | Pick a scope the caller belongs to. | | `org_admin_required` | The endpoint is org-admin only (e.g. `kudos org`, `chat send --send-as-user`, webhook/team-member management). | Only an org admin can run it — a member must ask an admin or use an admin API key. Not a session problem. | +| `workflow_execute_not_allowed` | The caller doesn't have permission to execute (trigger) workflows. | An admin or a user with the execute permission must run it. | +| `workflow_frozen` | The workflow is disabled (frozen) and cannot be triggered. | Tell the developer; the workflow must be re-enabled in the Dailybot web app. | ### 400 — bad input @@ -160,6 +162,19 @@ In `--json` mode the error surfaces as `{ error, status, code, detail }`. | `send_as_user_not_found` | The `--send-as-user` UUID doesn't resolve to a user. | Confirm the user exists (`dailybot user list`). | | `invalid_kudos_filter` | `kudos list --filter` got an unrecognized value. | Use `received` or `given` (the CLI also accepts `KUDOS_RECEIVED` / `KUDOS_GIVEN`). | | `send_message_validation_error` | `chat send` payload is missing content or otherwise invalid. | Read the `detail` — it names the problem (e.g. no message/buttons/image). | +| `button_link_and_callback_conflict` | A button has both a link `url` and a `callback_*` field. | Use one or the other — a button is either a link or an interactive callback. | +| `button_callback_conflict` | A button has more than one `callback_*` field. | Only one of `callback_url`/`callback_form`/`callback_command`/`callback_prompt`/`callback_workflow` per button. | +| `button_callback_url_invalid` | `callback_url` is not a valid URL. | Fix the URL. | +| `button_modal_body_invalid` | `modal_body` JSON is malformed or has invalid field types. | Check the modal spec — array of `{type, label, name, …}` objects. | +| `button_callback_form_not_found` | `callback_form` UUID doesn't match a form. | Verify the form UUID (`dailybot form list`). | +| `button_callback_command_invalid` | `callback_command` is not a recognized ChatOps command. | Check the command string. | +| `button_callback_prompt_invalid` | `callback_prompt` is empty or too long. | Fix the prompt text. | +| `button_callback_workflow_not_found` | `callback_workflow` UUID doesn't match a workflow, or the workflow isn't API-triggerable. | Verify the UUID (`dailybot workflow list --filter api_trigger`). | +| `button_response_invalid` | `response` text is empty or too long. | Fix the response text. | +| `button_callback_auth_invalid` | `callback_auth` value is malformed. | Use the format `"Bearer "`. | +| `buttons_count_out_of_range` | More than 25 buttons on a single message. | Reduce to ≤25 buttons. | +| `workflow_not_triggerable` | `workflow trigger` targeted a workflow whose event type is not `api_trigger`. | Only `api_trigger` workflows can be triggered. Use `workflow list --filter api_trigger`. | +| `workflow_trigger_payload_invalid` | `workflow trigger --payload` is not a valid JSON object or exceeds 8 KiB. | Fix the payload — must be a JSON object ≤8 KiB. | | `invalid_owner_user_id` | `--owner` value isn't a valid UUID (after resolution). | Fix the UUID or name. | | `too_many_owner_user_ids` | More than 50 `--owner` values. | Narrow the filter — max 50 owners per request. | diff --git a/skills/dailybot/workflow/SKILL.md b/skills/dailybot/workflow/SKILL.md index f7b7d26..d46370e 100644 --- a/skills/dailybot/workflow/SKILL.md +++ b/skills/dailybot/workflow/SKILL.md @@ -1,6 +1,6 @@ --- name: dailybot-workflow -description: List and inspect Dailybot workflows (read-only) — enumerate the workflows configured for the organization and read one workflow's configuration. Use when the developer asks "list my workflows", "show workflows", or "what's in the release workflow?". Writes are done in the Dailybot web app; this skill only reads. Plan-gated feature. +description: List, inspect, and trigger Dailybot workflows — enumerate the workflows configured for the organization, read one workflow's configuration, and fire API-triggerable workflows on demand. Use when the developer asks "list my workflows", "show workflows", "what's in the release workflow?", "trigger the deploy workflow", or "fire automation X". Creating/editing workflows is done in the Dailybot web app. Plan-gated feature. version: "3.10.4" documentation_url: https://www.dailybot.com/skill.md user-invocable: true @@ -8,27 +8,31 @@ metadata: {"openclaw":{"emoji":"🔀","homepage":"https://dailybot.com","require allowed-tools: Bash, Read, Grep, Glob --- -# Dailybot Workflows (read-only) +# Dailybot Workflows -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The `dailybot workflow list` / -> `dailybot workflow get` command group is available. If -> `dailybot --version` reports below 3.7.0, ask the developer to run -> `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version) -> for install commands and version-check tooling. +> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The +> `dailybot workflow list` / `dailybot workflow get` command group is available +> at this floor. The `dailybot workflow trigger` command requires a recent +> `dailybot-cli` with workflow-trigger support (the next CLI release after +> 3.7.4). If `dailybot --version` reports below 3.7.0, ask the developer to +> run `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI +> version](../SKILL.md#required-dailybot-cli-version) for install commands and +> version-check tooling. -You help developers **read** the workflows configured for their organization. -Workflows are Dailybot's automation objects (multi-step sequences that connect -check-ins, forms, and chat actions). This skill is **read-only** — it lists -workflows and reads one workflow's configuration so an agent can reference or -explain them. +You help developers **read** and **trigger** the workflows configured for +their organization. Workflows are Dailybot's automation objects (multi-step +sequences that connect check-ins, forms, and chat actions). -> **Writes are web-app only.** Creating, editing, enabling, or deleting a -> workflow is done in the Dailybot web app — there is **no** CLI write path. -> Do not attempt to mutate a workflow from the CLI; if the developer wants to -> change one, point them at the Dailybot web app. +- **List / Get** — enumerate workflows and inspect their configuration. +- **Trigger** — fire an API-triggerable workflow on demand, optionally with a + JSON payload that the workflow can reference as `{{trigger.body.*}}`. + +> **Creating / editing workflows is web-app only.** There is no CLI path for +> creating, editing, enabling, or deleting a workflow. If the developer wants +> to change one, point them at the Dailybot web app. > **Plan-gated feature.** Workflows are available on higher-tier plans. On a -> plan without them (and on the FREE plan generally) these reads return +> plan without them (and on the FREE plan generally) these operations return > `403 plan_upgrade_required` with an `upgrade_url` — surface the upgrade path > and stop. See [`../shared/list-query-and-errors.md`](../shared/list-query-and-errors.md) § 6. @@ -36,7 +40,7 @@ explain them. ## Auth model — API key or login -Workflow reads accept **either** a Bearer login session (`dailybot login`) +Workflow commands accept **either** a Bearer login session (`dailybot login`) **or** an org API key (`DAILYBOT_API_KEY`). Results are scoped to the acting identity's permissions (the server resolves the API key's owner). See [`../shared/list-query-and-errors.md`](../shared/list-query-and-errors.md) § 6 @@ -46,10 +50,17 @@ for the full API-key ↔ Bearer parity and plan-gating rules. ## When to Use +**List / inspect:** - "list my workflows", "show the org's workflows", "what workflows do we have?" - "show me the release workflow", "what's configured in workflow X?" - Another skill needs a workflow's UUID or its configuration for context. +**Trigger:** +- "trigger the deploy workflow", "fire automation X", "run the onboarding workflow" +- "trigger workflow `` with this payload" +- A chat button with `callback_workflow` fires the same path — see + [`../chat/SKILL.md`](../chat/SKILL.md) § Workflow trigger buttons. + Do **not** use this skill to *create* or *change* a workflow — that's a web-app operation. And do not confuse it with **form workflow states** (the `draft → review → released` states inside a single form) — those are managed in @@ -100,8 +111,16 @@ dailybot workflow list --search release --page-size 20 --json # Fetch every page explicitly: dailybot workflow list --all --json + +# Filter to only API-triggerable workflows (client-side filter): +dailybot workflow list --filter api_trigger --json ``` +The `--filter api_trigger` flag is a client-side convenience — it returns only +workflows whose event type is `api_trigger` ("When triggered via API or +button"), i.e. the workflows you can fire from `workflow trigger` or from a +chat button's `callback_workflow`. + --- ## Step 3 — Inspect a Workflow @@ -116,14 +135,63 @@ developer rather than re-deriving them. --- -## Step 4 — Error Handling +## Step 4 — Trigger a Workflow + +> **Only `api_trigger` workflows can be triggered.** Workflows with other event +> types (schedule, form submission, etc.) are not triggerable from the CLI — +> the server returns `workflow_not_triggerable`. + +```bash +dailybot workflow trigger --json +``` + +### With a JSON payload + +The optional `--payload` flag passes a JSON object (≤8 KiB) that the workflow +can reference in its steps as `{{trigger.body.}}`: + +```bash +dailybot workflow trigger \ + --payload '{"version": "v2.5", "environment": "production"}' --json +``` + +### Trigger behavior + +- **Success** returns HTTP `202` — the workflow run is **queued**, not + synchronous. There is no run output in the response; the workflow executes + asynchronously on the server. +- The payload must be a valid JSON object (not an array or scalar). Payloads + over 8 KiB are rejected with `workflow_trigger_payload_invalid`. +- The caller must have permission to execute workflows. If not, + `workflow_execute_not_allowed` is returned. +- A frozen (disabled) workflow returns `workflow_frozen`. +- An unknown UUID returns `404`. + +### CLI flag cheat sheet + +| Flag | Description | +|------|-------------| +| `` | Workflow UUID (positional, required) | +| `--payload` | JSON object payload (≤8 KiB); available to the workflow as `{{trigger.body.*}}` | +| `--json` | Emit the raw API response as JSON to stdout | + +### Cross-reference: chat buttons + +Chat messages can include buttons that trigger workflows on click via the +`callback_workflow` field (or the `--workflow-button` shorthand). This uses the +same server-side trigger mechanism — see +[`../chat/SKILL.md`](../chat/SKILL.md) § Workflow trigger buttons. + +--- + +## Step 5 — Error Handling Match on the structured `code` field, never the prose `detail`. The full error-code table (including `plan_upgrade_required`, `insufficient_role`, and the 429 back-off behavior) is in [`../shared/list-query-and-errors.md`](../shared/list-query-and-errors.md) § 5. -Most likely codes for this skill: +### List / Get errors - `plan_upgrade_required` (403, carries `upgrade_url`) — workflows aren't on the org's plan. Surface the upgrade link and stop. @@ -131,9 +199,20 @@ Most likely codes for this skill: read workflows. Suggest an admin runs it. - Not authenticated (401) — guide through `dailybot login`. +### Trigger errors + +| Status | Code | Meaning | Agent behavior | +|--------|------|---------|----------------| +| `202` | | Queued — the workflow run is enqueued | Surface success; note the run is async (no output). | +| `400` | `workflow_not_triggerable` | The workflow's event type is not `api_trigger` | Only `api_trigger` workflows can be triggered. Use `workflow list --filter api_trigger` to find eligible ones. | +| `400` | `workflow_trigger_payload_invalid` | Payload is not a valid JSON object, or exceeds 8 KiB | Fix the payload — must be a JSON object ≤8 KiB. | +| `403` | `workflow_execute_not_allowed` | The caller doesn't have permission to execute workflows | An admin or a user with execute permission must run it. | +| `403` | `workflow_frozen` | The workflow is disabled (frozen) | Tell the developer; the workflow must be re-enabled in the web app. | +| `404` | | Workflow UUID not found | Verify the UUID (`dailybot workflow list`). | + --- -## Step 5 — HTTP Fallback (when CLI is unavailable) +## Step 6 — HTTP Fallback (when CLI is unavailable) See [`../shared/http-fallback.md`](../shared/http-fallback.md) for base patterns. Workflow endpoints accept **either** Bearer token or `X-API-KEY`. @@ -152,21 +231,37 @@ curl -s -H "Authorization: Bearer $DAILYBOT_BEARER_TOKEN" \ https://api.dailybot.com/v1/workflows// ``` +### Trigger a workflow + +```bash +curl -s -X POST \ + -H "Authorization: Bearer $DAILYBOT_BEARER_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"payload": {"version": "v2.5"}}' \ + https://api.dailybot.com/v1/workflows//trigger/ +``` + +The `payload` field is optional. On success, the response is `202` with a +confirmation body. The workflow run is asynchronous. + --- -## Step 6 — Confirm +## Step 7 — Confirm -- **Success** — surface the requested workflow(s) directly. If the count footer +- **List success** — surface the requested workflow(s) directly. If the count footer showed `X < N`, tell the developer the view is truncated and how to widen it. +- **Trigger success** — confirm the workflow was queued: + > *"Workflow `` triggered (queued). The run executes asynchronously — there is no output to wait for."* - **Failure** — warn briefly. For `plan_upgrade_required`, name the plan gap and - surface the `upgrade_url`. + surface the `upgrade_url`. For `workflow_not_triggerable`, explain that only + `api_trigger` workflows can be fired. - **Skipped** — say nothing. --- ## Non-Blocking Rule -Workflow reads must **never block your primary work**. If the CLI is missing, +Workflow operations must **never block your primary work**. If the CLI is missing, auth fails, the feature isn't on the plan, the network is down, or any command errors: @@ -182,5 +277,6 @@ errors: - [`../shared/list-query-and-errors.md`](../shared/list-query-and-errors.md) — list query flags, pagination envelope, error codes, plan gating - [`../shared/auth.md`](../shared/auth.md) — authentication setup - [`../shared/http-fallback.md`](../shared/http-fallback.md) — HTTP API fallback patterns +- [`../chat/SKILL.md`](../chat/SKILL.md) — chat buttons can trigger workflows via `callback_workflow` - **Live API spec:** `https://api.dailybot.com/api/swagger/` - **Full agent API skill:** `https://www.dailybot.com/skill.md` From b67a5186e2932bfcd9af8c67833631e86759b3ee Mon Sep 17 00:00:00 2001 From: Sergio Alexander Florez Galeano Date: Fri, 24 Jul 2026 02:23:47 +0000 Subject: [PATCH 2/3] docs(pack): align interactive buttons with CLI 3.8.0 + raise floor ## Summary CLI 3.8.0 is published on PyPI. Raise the skill-pack baseline to match and correct the button contract docs against the shipped CLI help/API. ## Change Log - Pack baseline: dailybot-cli >= 3.8.0 everywhere (was 3.7.0) - chat: document real modal_body shape ({title, blocks}), callback_auth object form, button_type/value, env-var preference for --callback-bearer - chat: remove "next release after 3.7.4" hedges; add modal dialogue - workflow: trigger/filter available at the new floor (no provisional note) - shared errors: fix modal/auth guidance; add workflow_execute_not_allowed and workflow_frozen - README: chat/workflow rows pin >= 3.8.0 Co-authored-by: Cursor --- README.md | 4 +- skills/dailybot/SKILL.md | 44 +++---- skills/dailybot/ask/SKILL.md | 4 +- skills/dailybot/channels/SKILL.md | 2 +- skills/dailybot/chat/SKILL.md | 117 ++++++++++++------ skills/dailybot/checkin/SKILL.md | 4 +- skills/dailybot/conversation/SKILL.md | 2 +- skills/dailybot/email/SKILL.md | 2 +- skills/dailybot/env/SKILL.md | 12 +- skills/dailybot/forms/SKILL.md | 6 +- skills/dailybot/health/SKILL.md | 2 +- skills/dailybot/kudos/SKILL.md | 4 +- skills/dailybot/messages/SKILL.md | 2 +- skills/dailybot/report/hooks.md | 4 +- skills/dailybot/shared/auth.md | 2 +- skills/dailybot/shared/dashboard-urls.md | 2 +- skills/dailybot/shared/env-json.md | 4 +- .../dailybot/shared/list-query-and-errors.md | 12 +- skills/dailybot/teams/SKILL.md | 4 +- skills/dailybot/workflow/SKILL.md | 11 +- 20 files changed, 148 insertions(+), 96 deletions(-) diff --git a/README.md b/README.md index 1620087..9237eca 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@ agents. | **dailybot-checkin** | Full check-in lifecycle: list/status, complete, inspect questions & schedule, response history, edit/reset a response, and backfill or future-date — all headless with `--json`. Works with a login session **or** an API key (`dailybot-cli >= 1.15.0`). | | **dailybot-kudos** | Give kudos to a teammate to recognize their contributions. Team-visible recognition through Dailybot. | | **dailybot-forms** | List and submit form responses (feedback surveys, retros, pulse checks). Works with a login session **or** an API key (`dailybot-cli >= 1.15.0`). | -| **dailybot-chat** | Send and edit bot messages on the team's connected chat platform (Slack / Microsoft Teams / Discord / Google Chat). DMs, channels, or whole teams; report-style threads (headline + replies in one call); interactive buttons (approval flows, workflow triggers, modals, callbacks); edit the parent or any thread reply afterward. Requires `dailybot-cli >= 1.13.0`. | -| **dailybot-workflow** | List, inspect, and trigger Dailybot workflows. Fire API-triggerable workflows on demand with optional JSON payloads. Plan-gated feature. | +| **dailybot-chat** | Send and edit bot messages on the team's connected chat platform (Slack / Microsoft Teams / Discord / Google Chat). DMs, channels, or whole teams; report-style threads (headline + replies in one call); interactive buttons (approval flows, workflow triggers, modals, callbacks); edit the parent or any thread reply afterward. Requires `dailybot-cli >= 3.8.0`. | +| **dailybot-workflow** | List, inspect, and trigger Dailybot workflows (`workflow list` / `get` / `trigger`, with `--filter api_trigger` and optional `--payload`). Plan-gated feature. Requires `dailybot-cli >= 3.8.0`. | | **dailybot-ask** | Ask the Dailybot AI a question headlessly — `dailybot ask "..."` prints the answer to stdout (or `--json`). The primary way an agent queries the Dailybot AI with only an API key. Requires `dailybot-cli >= 1.15.0`. | A root **dailybot** meta-skill acts as a router — it describes all diff --git a/skills/dailybot/SKILL.md b/skills/dailybot/SKILL.md index 8baf5a6..243043f 100644 --- a/skills/dailybot/SKILL.md +++ b/skills/dailybot/SKILL.md @@ -1,6 +1,6 @@ --- name: dailybot -description: Official Dailybot agent skill pack — report progress, check messages, send emails, announce agent status, complete check-ins, give kudos (to users or teams), resolve teams, run the full forms lifecycle (list, submit, update, transition between workflow states), **author check-ins and forms from scratch** (create/configure questions, workflow states, permissions, reminders, scheduling, AI settings, sharing), send/edit chat messages on the team's Slack/Teams/Discord/Google Chat (including report-style threads, sending as a user's identity, and interactive buttons with approval flows, workflow triggers, modals, and callbacks), open (or reuse) a Slack group DM with the bot and post a report to it, ask the Dailybot AI a question headlessly, **and browse/read/trigger the workspace** — who am I / my org / a user's profile (`me` / `org` / `user get`), browse the kudos feed + the org-wide feed + wall of fame, list/read workflows, and trigger API-triggerable workflows with optional payloads — all with shared pagination / search / date-range filters. Also **manages per-repo API keys** through the opt-in `.dailybot/env.json` file (dailybot env add/use/show/list/remove/off/on — CLI 3.7.0+) so a developer can be "logged into different orgs in different repos" simultaneously. Routes to the right sub-skill based on intent. Use when the developer mentions Dailybot or wants to interact with their team. +description: Official Dailybot agent skill pack — report progress, check messages, send emails, announce agent status, complete check-ins, give kudos (to users or teams), resolve teams, run the full forms lifecycle (list, submit, update, transition between workflow states), **author check-ins and forms from scratch** (create/configure questions, workflow states, permissions, reminders, scheduling, AI settings, sharing), send/edit chat messages on the team's Slack/Teams/Discord/Google Chat (including report-style threads, sending as a user's identity, and interactive buttons with approval flows, workflow triggers, modals, and callbacks), open (or reuse) a Slack group DM with the bot and post a report to it, ask the Dailybot AI a question headlessly, **and browse/read/trigger the workspace** — who am I / my org / a user's profile (`me` / `org` / `user get`), browse the kudos feed + the org-wide feed + wall of fame, list/read workflows, and trigger API-triggerable workflows with optional payloads — all with shared pagination / search / date-range filters. Also **manages per-repo API keys** through the opt-in `.dailybot/env.json` file (dailybot env add/use/show/list/remove/off/on — pack baseline `>= 3.8.0`) so a developer can be "logged into different orgs in different repos" simultaneously. Routes to the right sub-skill based on intent. Use when the developer mentions Dailybot or wants to interact with their team. version: "3.10.4" documentation_url: https://www.dailybot.com/skill.md user-invocable: true @@ -30,7 +30,7 @@ no network fetch is required** to know what to do. Run first-run setup in order: the `dailybot` CLI is the integration surface. If it is missing, follow [`shared/auth.md`](shared/auth.md) — it proposes the checksum-verified installer and installs **only after the developer confirms**. Confirm with - `dailybot --version` (minimum `>= 3.7.0` — the skill-pack baseline for + `dailybot --version` (minimum `>= 3.8.0` — the skill-pack baseline for every sub-skill). 2. **Authenticate.** `dailybot login` (email OTP) **or** set `DAILYBOT_API_KEY` — see [`shared/auth.md`](shared/auth.md). Credentials are stored owner-only @@ -68,7 +68,7 @@ Thirteen coordinated capabilities, with smart routing between them: | **Forms** | `dailybot-forms` | List, submit, update, or transition forms — including workflow-state forms with audience permissions (`form list` is now **org-scoped** by default, with `--mine` to narrow to your own; list + responses support pagination / search / date filters) — **plus authoring**: create/configure a form (workflow states, permissions, anonymous/public/approval, ChatOps command) and manage its questions | | **Workflows** | `dailybot-workflow` | Developer wants to **read or trigger** the org's workflows — `workflow list` (paginated/searchable, with `--filter api_trigger`), `workflow get`, and `workflow trigger` (fire an API-triggerable workflow with an optional JSON payload). Creating/editing workflows is web-app only. Plan-gated | | **Report channels** | `dailybot-channels` | Discover report-channel UUIDs to attach to forms/check-ins with `--report-channel` | -| **Per-repo API keys** | `dailybot-env` | Configure `.dailybot/env.json` — an **opt-in, gitignored** file that carries API keys + URLs for one or more environments (live, local, staging) so the developer can be "logged into different orgs in different repos". `dailybot env add / use / show / list / remove / off / on`. CLI >= 3.7.0 | +| **Per-repo API keys** | `dailybot-env` | Configure `.dailybot/env.json` — an **opt-in, gitignored** file that carries API keys + URLs for one or more environments (live, local, staging) so the developer can be "logged into different orgs in different repos". `dailybot env add / use / show / list / remove / off / on`. Pack baseline (`>= 3.8.0`) | ## Install @@ -86,7 +86,7 @@ reporting, ships **inside this skill** — follow **[Start here (first run)](#st ## Required Dailybot CLI version -> **Baseline: `dailybot-cli >= 3.7.0`** for **every** sub-skill in the pack — +> **Baseline: `dailybot-cli >= 3.8.0`** for **every** sub-skill in the pack — > one single floor, no per-sub-skill exceptions. Recommended install / upgrade > target: **latest release** — `dailybot upgrade` (or `pip install > --upgrade dailybot-cli`) always satisfies it. @@ -98,22 +98,24 @@ reporting, ships **inside this skill** — follow **[Start here (first run)](#st > upgrade`) installs today; run `dailybot version --check` to see the exact > number. Everything this pack documents — reporting, hooks, chat, the AI `ask` > command, check-in and form authoring, the browse/read surface (`me` / `org` / -> `user get`, kudos browsing, workflows), the shared list query flags, and the -> machine-readable error codes — is available at this floor. +> `user get`, kudos browsing, workflows), interactive chat buttons (approvals, +> workflow triggers, modals, callbacks), `workflow trigger`, the shared list +> query flags, and the machine-readable error codes — is available at this floor. ### Why this minimum -`3.7.0` is the release that completed the auth story this pack relies on: -the `env` sub-skill's `dailybot env` command group and `.dailybot/env.json` -per-repo credentials (with the wire-preference guarantee that a repo-local -key beats the global Bearer session), the hardened refuse-if-tracked guard, -and every earlier surface the pack documents (reporting, hooks, chat, forms -and check-in authoring, kudos, teams, workflows, `ask`, the shared list -query flags, and the machine-readable error codes). Pinning one single -floor keeps agent behavior predictable — no per-sub-skill version matrix. - -If `dailybot --version` reports below 3.7.0, ask the developer to run -`dailybot upgrade` (or `pip install --upgrade 'dailybot-cli>=3.7.0'`) +`3.8.0` is the release that shipped the interactive-button contract on +`dailybot chat send` / `update` (`--buttons`, approval / workflow-button +flags, modals, callbacks) and `dailybot workflow trigger` (plus +`workflow list --filter api_trigger`). It also includes everything earlier +floors already covered: `.dailybot/env.json` per-repo credentials (from +3.7.0), reporting, hooks, forms and check-in authoring, kudos, teams, +`ask`, the shared list query flags, and the machine-readable error codes. +Pinning one single floor keeps agent behavior predictable — no per-sub-skill +version matrix. + +If `dailybot --version` reports below 3.8.0, ask the developer to run +`dailybot upgrade` (or `pip install --upgrade 'dailybot-cli>=3.8.0'`) before using any sub-skill. ### Checking the installed version @@ -121,7 +123,7 @@ before using any sub-skill. ```bash # Single-line, scriptable dailybot --version -# → dailybot 3.7.0 (Python 3.12.4) +# → dailybot 3.8.0 (Python 3.12.4) # Multi-line panel: version, Python runtime, install path, release notes link dailybot version @@ -141,7 +143,7 @@ Homebrew / Linux binary / editable dev) and either runs the right command in a subprocess or prints the exact command for installs the CLI shouldn't drive. `dailybot upgrade --dry-run` previews without executing. -If the developer is below the pack baseline (`dailybot-cli >= 3.7.0`), +If the developer is below the pack baseline (`dailybot-cli >= 3.8.0`), ask them to run `dailybot upgrade` once, then resume. Do not retry CLI commands in a loop while the upgrade is pending. @@ -149,7 +151,7 @@ commands in a loop while the upgrade is pending. | Channel | Command | |---------|---------| -| pip | `pip install 'dailybot-cli>=3.7.0'` (the pack baseline) | +| pip | `pip install 'dailybot-cli>=3.8.0'` (the pack baseline) | | Homebrew | `brew install dailybothq/tap/dailybot` | | Universal installer (Linux / macOS / WSL2 / Git Bash) | `curl -fsSL https://cli.dailybot.com/install.sh \| bash` | | Windows PowerShell (when WSL2 / Git Bash unavailable) | `irm https://cli.dailybot.com/install.ps1 \| iex` | @@ -174,7 +176,7 @@ Full safety story (SHA-256 sidecar, cross-origin diff, optional cosign): see Every install method defaults to the latest release but can pin an exact version — useful when a developer needs to reproduce a known-good setup or -pin the `3.7.0` pack baseline (the installer scripts, `pip`, and Homebrew all +pin the `3.8.0` pack baseline (the installer scripts, `pip`, and Homebrew all accept a version pin): | Channel | Pin a version | diff --git a/skills/dailybot/ask/SKILL.md b/skills/dailybot/ask/SKILL.md index a7b4f24..70e368a 100644 --- a/skills/dailybot/ask/SKILL.md +++ b/skills/dailybot/ask/SKILL.md @@ -10,7 +10,7 @@ allowed-tools: Bash, Read, Grep, Glob # Dailybot Ask -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline) — the `dailybot ask` +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline) — the `dailybot ask` > command and full API-key parity on the AI chat. On much older CLIs the AI chat only > exists as the interactive TUI (`dailybot interactive`) and requires a login > session. If `dailybot ask --help` is not recognized, ask the developer to run @@ -59,7 +59,7 @@ Read and follow the authentication steps in [`../shared/auth.md`](../shared/auth The AI chat accepts **either** a login session **or** an org API key — an agent with only `DAILYBOT_API_KEY` set can use `dailybot ask` directly. -Confirm the command exists (`dailybot-cli >= 3.7.0`): +Confirm the command exists (`dailybot-cli >= 3.8.0`): ```bash dailybot ask --help 2>&1 | head -1 diff --git a/skills/dailybot/channels/SKILL.md b/skills/dailybot/channels/SKILL.md index 0abfb6c..2e52455 100644 --- a/skills/dailybot/channels/SKILL.md +++ b/skills/dailybot/channels/SKILL.md @@ -10,7 +10,7 @@ allowed-tools: Bash, Read, Grep, Glob # Dailybot Report Channels -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The `dailybot channels list` +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The `dailybot channels list` > command is available at this floor. If `dailybot --version` reports below > 3.7.0, ask the developer to run `dailybot upgrade`. See > [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). diff --git a/skills/dailybot/chat/SKILL.md b/skills/dailybot/chat/SKILL.md index a27cb3f..0da5739 100644 --- a/skills/dailybot/chat/SKILL.md +++ b/skills/dailybot/chat/SKILL.md @@ -1,6 +1,6 @@ --- name: dailybot-chat -description: Send and edit Dailybot bot messages on the team's connected chat platform (Slack, Microsoft Teams, Discord, Google Chat) — to user DMs, channels, or whole teams. Supports report-style threads (one headline + replies, in one call) and editing the parent or any reply afterward. Use when the developer says "send a message to my Slack channel", "ping the team in chat", "post the deploy report to #releases", or wants to update a previously sent bot message. Works headless for agents. +description: Send and edit Dailybot bot messages on the team's connected chat platform (Slack, Microsoft Teams, Discord, Google Chat) — to user DMs, channels, or whole teams. Supports report-style threads (one headline + replies, in one call), interactive buttons (approval flows, workflow triggers, modals, callbacks), and editing the parent or any reply afterward. Use when the developer says "send a message to my Slack channel", "ping the team in chat", "post the deploy report to #releases", "send an approval request with buttons", or wants to update a previously sent bot message. Works headless for agents. version: "3.10.4" documentation_url: https://www.dailybot.com/skill.md user-invocable: true @@ -10,7 +10,15 @@ allowed-tools: Bash, Read, Grep, Glob # Dailybot Chat -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The `dailybot chat send` / `chat update` command group, the `--thread-message` flag (≤10 replies per call, each independently editable), the login-Bearer auth path on `/v1/send-message/` (send without an org API key), and `--send-as-user` / `--send-as-me` (admin-only) are all available. If `dailybot --version` is below 3.7.0, ask the developer to run `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version) for install commands and version-check tooling. +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The +> `dailybot chat send` / `chat update` command group — including +> `--thread-message`, login-Bearer auth on `/v1/send-message/`, +> `--send-as-user` / `--send-as-me`, and the full interactive-button +> surface (`--buttons`, approval / workflow-button flags, modals, +> callbacks) — is available at this floor. If `dailybot --version` is +> below 3.8.0, ask the developer to run `dailybot upgrade`. See +> [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version) +> for install commands and version-check tooling. You send **Dailybot bot messages** on the developer's behalf to the organization's connected chat platform (Slack, Microsoft Teams, Discord, Google Chat) — to user DMs, channels, or whole teams (expanded to member DMs server-side). This skill is the right surface for: @@ -265,7 +273,10 @@ dailybot chat send -c C0123 -m "Release v2.5 ready for approval" \ `--approve-button` and `--reject-button` take `"Label=value"` (equals sign separator). `--callback-url` sets the URL for both. `--callback-bearer` is -optional — when set, the callback POST includes `Authorization: Bearer `. +optional — when set, each button gets +`callback_auth: {"type": "bearer", "token": ""}`. Prefer passing the +token via an env var (`--callback-bearer "$TOKEN"`) so it does not land in +shell history or process lists. #### Workflow trigger buttons @@ -279,30 +290,43 @@ dailybot chat send -c C0123 -m "Ready to deploy?" \ `--workflow-button` takes `"Label="`. Only workflows with the `api_trigger` event type ("When triggered via API or button") can be fired this -way. See [`../workflow/SKILL.md`](../workflow/SKILL.md) for triggering -workflows directly. +way. Resolve eligible UUIDs with `dailybot workflow list --filter api_trigger`. +See [`../workflow/SKILL.md`](../workflow/SKILL.md) for triggering workflows +directly (including `--payload`). #### Full-control buttons via `--buttons` (JSON pass-through) For advanced callbacks (forms, commands, prompts, modals, auth overrides), pass -the full button contract as a JSON array: +the full button contract as a JSON array. Keys are forwarded untouched (including +unknown future fields). Prefer including `button_type` / `value` for interactive +buttons (the ergonomic flags set these automatically): ```bash -dailybot chat send -c C0123 -m "Pick an action" \ +dailybot chat send -u -m "Pick an action" \ --buttons '[ - {"label": "Open form", "callback_form": ""}, - {"label": "Run command", "callback_command": "/deploy staging"}, - {"label": "Ask AI", "callback_prompt": "Summarize the last deploy"}, - {"label": "Start workflow", "callback_workflow": ""}, - {"label": "Confirm", "callback_url": "https://ci.example.com/confirm", - "callback_auth": "Bearer "}, - {"label": "Details", "response": "Here are the deploy details…"}, - {"label": "Fill info", "callback_url": "https://example.com/hook", - "modal_body": [ - {"type": "input", "label": "Reason", "name": "reason"}, - {"type": "select", "label": "Priority", "name": "priority", - "options": [{"label": "High", "value": "high"}, {"label": "Low", "value": "low"}]} - ]} + {"label": "Open form", "button_type": "interactive", "value": "open_form", + "callback_form": ""}, + {"label": "Run command", "button_type": "interactive", "value": "run_cmd", + "callback_command": "/deploy staging"}, + {"label": "Ask AI", "button_type": "interactive", "value": "ask", + "callback_prompt": "Summarize the last deploy"}, + {"label": "Start workflow", "button_type": "interactive", "value": "wf", + "callback_workflow": ""}, + {"label": "Confirm", "button_type": "interactive", "value": "confirm", + "callback_url": "https://ci.example.com/confirm", + "callback_auth": {"type": "bearer", "token": ""}}, + {"label": "Details", "button_type": "interactive", "value": "details", + "response": "Here are the deploy details…"}, + {"label": "Fill info", "button_type": "interactive", "value": "fill", + "callback_url": "https://hooks.example.com/x", + "modal_body": { + "title": "Request details", + "submit_label": "Submit", + "blocks": [ + {"type": "input", "name": "summary", "label": "Summary", "optional": false}, + {"type": "input", "name": "notes", "label": "Notes", "multiline": true, "optional": true} + ] + }} ]' ``` @@ -311,24 +335,28 @@ dailybot chat send -c C0123 -m "Pick an action" \ | Field | Description | |-------|-------------| | `label` | Button text (required) | -| `callback_url` | URL to POST on click | +| `button_type` | `"link"` (needs `url`) or `"interactive"` (needs `value` + a callback / `response`) | +| `url` | Destination for link buttons | +| `value` | Click payload for interactive buttons | +| `callback_url` | HTTPS URL the server POSTs to on click (may include modal answers) | | `callback_form` | Open a Dailybot form for the user to fill | | `callback_command` | Execute a Dailybot ChatOps command | | `callback_prompt` | Send a prompt to the Dailybot AI | -| `callback_workflow` | Trigger a Dailybot workflow by UUID | -| `modal_body` | JSON array of input fields shown in a modal before the callback fires | -| `response` | Static text response shown to the clicker (no server call) | -| `callback_auth` | Auth header value for the callback endpoint (e.g. `"Bearer "`) | +| `callback_workflow` | Trigger a Dailybot `api_trigger` workflow by UUID | +| `modal_body` | Modal composer: `{title, submit_label?, blocks: [{type, name, label, …}]}` — used with `callback_url` or `callback_workflow` when collecting inputs | +| `response` | Auto-reply text (may nest further buttons) | +| `callback_auth` | Auth for `callback_url` only: `{type: "bearer"\|"basic"\|"custom_header", …}` — never a bare `"Bearer …"` string | **Constraints:** - At most **one** of the five callback types (`callback_url`, `callback_form`, `callback_command`, `callback_prompt`, `callback_workflow`) per button. Combining two is rejected with `button_callback_conflict`. -- A button cannot mix `callback_url`/`callback_*` with a link `url` — that's +- A button cannot mix a link `url` with any `callback_*` — that's `button_link_and_callback_conflict`. - Unknown keys are forwarded to the API (forward-compatible). - Max **25** buttons per message (`buttons_count_out_of_range`). +- `callback_auth` is only valid with `callback_url`. #### Button behavior on `chat update` @@ -337,11 +365,10 @@ preserved unless you pass new button flags. Custom identity flags (`--bot-name`/`--bot-icon-*`) and send-as-user flags are ignored on edits. The 72-hour edit window applies. -> **Requires a recent `dailybot-cli` with interactive-button support.** The -> `--buttons`, `--approve-button`, `--reject-button`, `--callback-url`, -> `--callback-bearer`, and `--workflow-button` flags land in the next CLI -> release after 3.7.4. `--link-button` and `--button` work on any -> `dailybot-cli >= 3.7.0`. +> Interactive-button flags (`--buttons`, `--approve-button` / +> `--reject-button`, `--callback-url`, `--callback-bearer`, +> `--workflow-button`) require **`dailybot-cli >= 3.8.0`** (this pack's +> baseline). `--link-button` and `--button` are also available at that floor. ### Headless / agent use — capture the ids in JSON @@ -516,13 +543,13 @@ The CLI translates these to friendly messages automatically. In `--json` mode (o | `400` | `button_link_and_callback_conflict` | A button has both a link `url` and a `callback_*` field | Use one or the other — a button is either a link or an interactive callback. | | `400` | `button_callback_conflict` | A button has more than one `callback_*` field | Only one of `callback_url`/`callback_form`/`callback_command`/`callback_prompt`/`callback_workflow` per button. | | `400` | `button_callback_url_invalid` | `callback_url` is not a valid URL | Fix the URL. | -| `400` | `button_modal_body_invalid` | `modal_body` JSON is malformed or has invalid field types | Check the modal spec — array of `{type, label, name, …}` objects. | +| `400` | `button_modal_body_invalid` | `modal_body` JSON is malformed or has invalid field types | Use `{title, submit_label?, blocks: [{type, name, label, …}]}` — not a bare array of fields. | | `400` | `button_callback_form_not_found` | `callback_form` UUID doesn't match a form | Verify the form UUID (`dailybot form list`). | | `400` | `button_callback_command_invalid` | `callback_command` is not a recognized ChatOps command | Check the command string. | | `400` | `button_callback_prompt_invalid` | `callback_prompt` is empty or too long | Fix the prompt text. | -| `400` | `button_callback_workflow_not_found` | `callback_workflow` UUID doesn't match a workflow, or the workflow isn't triggerable | Verify the UUID and that the workflow has the `api_trigger` event type. | +| `400` | `button_callback_workflow_not_found` | `callback_workflow` UUID doesn't match a workflow, or the workflow isn't triggerable | Verify the UUID (`dailybot workflow list --filter api_trigger`). | | `400` | `button_response_invalid` | `response` text is empty or too long | Fix the response text. | -| `400` | `button_callback_auth_invalid` | `callback_auth` value is malformed | Use the format `"Bearer "`. | +| `400` | `button_callback_auth_invalid` | `callback_auth` value is malformed | Use `{type: "bearer"\|"basic"\|"custom_header", …}` — only with `callback_url`. | | `400` | `buttons_count_out_of_range` | More than 25 buttons on a single message | Reduce to ≤25 buttons. | | `400` | (other) | No/invalid targets, malformed UUID, empty channel id, invalid bot identity | Surface the `detail` verbatim and fix the input. | | `401` / `403` | | Unauthenticated / invalid auth | Suggest `dailybot login` (or, if the developer prefers, `dailybot config key=...`). | @@ -614,7 +641,7 @@ Agent: ``` Developer: "post a message to #deploys with a button that fires the deploy workflow" Agent: - 1. dailybot workflow list --json → find the deploy workflow UUID + 1. dailybot workflow list --filter api_trigger --json → find the deploy workflow UUID 2. Confirm: "I'll post to C0123456789: Message: Deploy ready — click to start @@ -626,7 +653,25 @@ Agent: 4. Surface the bot_message_id. ``` -### Dialogue G — Team not visible to the caller (role scope) +### Dialogue G — Modal with inputs + callback URL + +``` +Developer: "DM me a button that opens a form modal and POSTs the answers to our webhook" +Agent: + 1. Resolve the developer's user UUID (`dailybot me --json` or `user list`). + 2. Confirm the message + that the modal collects Summary + Notes, callback = the webhook URL. + 3. dailybot chat send -u -m "Please fill in the details" \ + --buttons '[{"label":"Open form","button_type":"interactive","value":"open", + "callback_url":"https://hooks.example.com/x", + "modal_body":{"title":"Request details","submit_label":"Submit", + "blocks":[ + {"type":"input","name":"summary","label":"Summary"}, + {"type":"input","name":"notes","label":"Notes","multiline":true}]}}]' --json + 4. Surface the bot_message_id; remind that answers land on the webhook after Submit. +``` + +### Dialogue H — Team not visible to the caller (role scope) + ``` Developer: "post a heads-up to the Security team's channel" diff --git a/skills/dailybot/checkin/SKILL.md b/skills/dailybot/checkin/SKILL.md index 00b55f8..7e7c2d3 100644 --- a/skills/dailybot/checkin/SKILL.md +++ b/skills/dailybot/checkin/SKILL.md @@ -285,11 +285,11 @@ prompts — handy for humans; agents should use the headless commands above. ## Step 3.7 — Authoring check-ins (create / configure / questions) -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The authoring surface — `checkin create`, +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The authoring surface — `checkin create`, > `checkin config`, `checkin archive`, the `checkin questions add|edit|delete|reorder` > group, resolving people by email, the smart/AI flags, and the **create requires > ≥ 1 question** rule (`questions_required`) — is all available. If -> `dailybot --version` is below 3.7.0, run `dailybot upgrade`. +> `dailybot --version` is below 3.8.0, run `dailybot upgrade`. Everything above **answers** a check-in. This section **builds** one. As of the authoring release, an agent can create a check-in from scratch, tune every diff --git a/skills/dailybot/conversation/SKILL.md b/skills/dailybot/conversation/SKILL.md index 16d0bfc..8417f80 100644 --- a/skills/dailybot/conversation/SKILL.md +++ b/skills/dailybot/conversation/SKILL.md @@ -10,7 +10,7 @@ allowed-tools: Bash, Read, Grep, Glob # Dailybot Conversations -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline; the +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline; the > `dailybot conversation open` command itself shipped in 3.2.0). If > `dailybot --version` reports lower, ask the developer to run > `dailybot upgrade` and continue with your primary task meanwhile. See diff --git a/skills/dailybot/email/SKILL.md b/skills/dailybot/email/SKILL.md index ab99b02..6b1842a 100644 --- a/skills/dailybot/email/SKILL.md +++ b/skills/dailybot/email/SKILL.md @@ -12,7 +12,7 @@ allowed-tools: Bash, Read, Grep, Glob You send emails on behalf of the developer's agent through Dailybot. Useful for notifications, summaries, follow-ups, weekly reports, or any communication that should be delivered as email. -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). --- diff --git a/skills/dailybot/env/SKILL.md b/skills/dailybot/env/SKILL.md index a113a03..b42d9fe 100644 --- a/skills/dailybot/env/SKILL.md +++ b/skills/dailybot/env/SKILL.md @@ -1,6 +1,6 @@ --- name: dailybot-env -description: Manage per-repo API key overrides in `.dailybot/env.json` — an opt-in, gitignored file that carries API keys + optional URLs for one or more environments (live, local, staging). One profile is active at a time; when set, it overrides `DAILYBOT_API_KEY`, `config.json`, and the login Bearer session for the enclosing repo. Use when the developer wants to be "logged into different orgs in different repos" simultaneously, needs a local dev key just for this project, or wants to toggle between staging and prod without touching global config or env vars. Requires CLI >= 3.7.0. +description: Manage per-repo API key overrides in `.dailybot/env.json` — an opt-in, gitignored file that carries API keys + optional URLs for one or more environments (live, local, staging). One profile is active at a time; when set, it overrides `DAILYBOT_API_KEY`, `config.json`, and the login Bearer session for the enclosing repo. Use when the developer wants to be "logged into different orgs in different repos" simultaneously, needs a local dev key just for this project, or wants to toggle between staging and prod without touching global config or env vars. Requires CLI >= 3.8.0 (pack baseline; `env` shipped in 3.7.0). version: "3.10.4" documentation_url: https://www.dailybot.com/skill.md user-invocable: true @@ -10,7 +10,11 @@ allowed-tools: Bash, Read, Grep, Glob # Dailybot per-repo API key override (`env.json`) -> **Requires `dailybot-cli >= 3.7.0`** — the `dailybot env` command group and the `.dailybot/env.json` loader are new in that release. If `dailybot --version` reports below 3.7.0, ask the developer to run `dailybot upgrade` before continuing. See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The +> `dailybot env` command group and `.dailybot/env.json` loader shipped in +> 3.7.0 and are included in this floor. If `dailybot --version` reports +> below 3.8.0, ask the developer to run `dailybot upgrade` before continuing. +> See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). This sub-skill lets an agent configure and manage `/.dailybot/env.json` — an **opt-in, gitignored** file that pins API keys + URL overrides per environment (live, local, staging) for the enclosing repo. When a profile is *active*, it overrides `DAILYBOT_API_KEY`, `config.json`, and the login Bearer session **only for that repo**. @@ -34,11 +38,11 @@ Route here when the developer says any of: ## Pre-flight — before writing anything -1. **Confirm the CLI supports `env`** (>= 3.7.0): +1. **Confirm the CLI meets the pack baseline** (>= 3.8.0): ```bash dailybot env --help >/dev/null 2>&1 || { - echo "This feature requires dailybot-cli >= 3.7.0. Run: dailybot upgrade" >&2 + echo "This feature requires dailybot-cli >= 3.8.0. Run: dailybot upgrade" >&2 exit 1 } ``` diff --git a/skills/dailybot/forms/SKILL.md b/skills/dailybot/forms/SKILL.md index cd53a4f..36bb0ec 100644 --- a/skills/dailybot/forms/SKILL.md +++ b/skills/dailybot/forms/SKILL.md @@ -10,7 +10,7 @@ allowed-tools: Bash, Read, Grep, Glob # Dailybot Forms -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The full forms lifecycle — `form list` / `submit` / `get` / `responses` / `response get` / `update` / `transition` / `delete` — plus the structured `--json` 4xx error shape are all available. If `dailybot --version` is below 3.7.0, ask the developer to run `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version) for install commands and version-check tooling. +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The full forms lifecycle — `form list` / `submit` / `get` / `responses` / `response get` / `update` / `transition` / `delete` — plus the structured `--json` 4xx error shape are all available. If `dailybot --version` is below 3.8.0, ask the developer to run `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version) for install commands and version-check tooling. You help developers work with the full Dailybot forms lifecycle: list, inspect, submit, update, transition between workflow states, and read prior responses. Forms are custom questionnaires created by team leads — feedback surveys, retrospectives, release checklists, approval flows, or any structured data collection. Some forms are simple "fill once and done"; others have **workflow states** (e.g. `draft → review → released`) with audience-scoped permissions on who can edit and who can transition. @@ -140,7 +140,7 @@ Returns all forms in the caller's organization. Every org member sees every org ### Pagination, search, and date filters -> **Note:** the shared list query flags below are part of the `dailybot-cli >= 3.7.0` baseline. Older CLIs +> **Note:** the shared list query flags below are part of the `dailybot-cli >= 3.8.0` baseline. Older CLIs > return the full list with no filtering. `form list` accepts the **full shared list query flag set** — pagination @@ -314,7 +314,7 @@ When the form has a workflow (`workflow.enabled: true`), the agent must understa ## Step 5.5 — Authoring forms (create / configure / questions) -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The full authoring surface — `form create`, `form config` (workflow states, the three permission audiences, anonymous/public/brand/require-identity with `public_url`, approval + approvers, the ChatOps command), `form archive`, the `form questions add|edit|delete|reorder` group, resolving people by email, `--no-approvers`, the 3 report-channel cap, and the **create requires ≥ 1 question** rule (`questions_required`) — is all available. If `dailybot --version` is below 3.7.0, ask the developer to run `dailybot upgrade`. +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The full authoring surface — `form create`, `form config` (workflow states, the three permission audiences, anonymous/public/brand/require-identity with `public_url`, approval + approvers, the ChatOps command), `form archive`, the `form questions add|edit|delete|reorder` group, resolving people by email, `--no-approvers`, the 3 report-channel cap, and the **create requires ≥ 1 question** rule (`questions_required`) — is all available. If `dailybot --version` is below 3.8.0, ask the developer to run `dailybot upgrade`. Everything above this point *reads* and *responds to* forms. This section *builds and reshapes* them. An agent with the right permissions can now create a form, wire up its workflow states, permission audiences, approval flow, and ChatOps command, and manage its questions — all end-to-end from the CLI, without opening the Dailybot webapp. diff --git a/skills/dailybot/health/SKILL.md b/skills/dailybot/health/SKILL.md index 49905b9..fd7c3dc 100644 --- a/skills/dailybot/health/SKILL.md +++ b/skills/dailybot/health/SKILL.md @@ -12,7 +12,7 @@ allowed-tools: Bash, Read, Grep, Glob You announce the agent's status (online, working, offline, degraded) to Dailybot so the team knows whether the agent is alive and what it's doing. Health check responses also deliver pending messages from the team. -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). --- diff --git a/skills/dailybot/kudos/SKILL.md b/skills/dailybot/kudos/SKILL.md index 79b065f..7bdf528 100644 --- a/skills/dailybot/kudos/SKILL.md +++ b/skills/dailybot/kudos/SKILL.md @@ -10,7 +10,7 @@ allowed-tools: Bash, Read, Grep, Glob # Dailybot Kudos -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). Giving kudos to a user (`--to`) or a team (`--team`), and browsing kudos (`list` / `org` / `wall-of-fame`), are all available. If `dailybot --version` is below 3.7.0, ask the developer to run `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version) for install commands and version-check tooling. +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). Giving kudos to a user (`--to`) or a team (`--team`), and browsing kudos (`list` / `org` / `wall-of-fame`), are all available. If `dailybot --version` is below 3.8.0, ask the developer to run `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version) for install commands and version-check tooling. You help developers recognize teammates by sending kudos through Dailybot. Kudos are team-visible appreciation messages — the whole team sees them in Dailybot's recognition feed and in connected chat platforms (Slack, Teams, Discord). @@ -32,7 +32,7 @@ If the developer has only an API key, kudos still work — the CLI falls back to ## Browsing kudos (read) > **Baseline:** the three read commands below (`kudos list`, `kudos org`, -> `kudos wall-of-fame`) are part of the `dailybot-cli >= 3.7.0` baseline. +> `kudos wall-of-fame`) are part of the `dailybot-cli >= 3.8.0` baseline. Beyond *giving* kudos, an agent can **browse** the recognition feed and read org-wide stats. All three return the standard pagination envelope where diff --git a/skills/dailybot/messages/SKILL.md b/skills/dailybot/messages/SKILL.md index e8174e2..539c1bb 100644 --- a/skills/dailybot/messages/SKILL.md +++ b/skills/dailybot/messages/SKILL.md @@ -14,7 +14,7 @@ You check for pending messages and instructions from the developer's team. Messa This is the "what should I work on next?" skill. -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). --- diff --git a/skills/dailybot/report/hooks.md b/skills/dailybot/report/hooks.md index 5c76e12..e51e5d5 100644 --- a/skills/dailybot/report/hooks.md +++ b/skills/dailybot/report/hooks.md @@ -12,7 +12,7 @@ in once, and from then on the harness re-arms the reminders in every future session, container, and repo. No human reminders, no reliance on the model's memory. -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The `dailybot hook` command group +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The `dailybot hook` command group > is available at this floor. > Check with `dailybot --version`; if older, ask the developer to run > `dailybot upgrade` once. Hooks installed against an older CLI fail @@ -163,7 +163,7 @@ the only remaining per-person step is `dailybot login`, and the | `soft_turn_threshold` | `8` (`5` in `continuous` mode when omitted) | Agent turns without a report before a soft nudge is eligible | Invalid `mode` values fall back to `"balanced"`; invalid `soft_turn_threshold` - values fall back to the mode default. (Part of the `dailybot-cli >= 3.7.0` + values fall back to the mode default. (Part of the `dailybot-cli >= 3.8.0` baseline; much older CLIs ignore `mode`/`soft_turn_threshold` and stay on the balanced defaults. diff --git a/skills/dailybot/shared/auth.md b/skills/dailybot/shared/auth.md index 0a43e62..ab7316a 100644 --- a/skills/dailybot/shared/auth.md +++ b/skills/dailybot/shared/auth.md @@ -45,7 +45,7 @@ treat that as session-wide consent. > [!NOTE] > **Installing a specific version.** Both installers default to the latest -> release but accept a version pin (the skill-pack baseline is **`dailybot-cli >= 3.7.0`**): +> release but accept a version pin (the skill-pack baseline is **`dailybot-cli >= 3.8.0`**): > - `install.sh` — set `DAILYBOT_VERSION=` in the environment, or > pass `bash -s -- --version `. Example (drop it into the verified > snippet below, right before `bash /tmp/install.sh`): diff --git a/skills/dailybot/shared/dashboard-urls.md b/skills/dailybot/shared/dashboard-urls.md index 7a9e4b4..55f752b 100644 --- a/skills/dailybot/shared/dashboard-urls.md +++ b/skills/dailybot/shared/dashboard-urls.md @@ -1,6 +1,6 @@ # Shared reference — Dailybot dashboard URLs -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The > `--app-url` flag and `DAILYBOT_APP_URL` env var for configuring the dashboard > base URL are available at this floor, as is the per-profile `app_url` in > [`env-json.md`](env-json.md). diff --git a/skills/dailybot/shared/env-json.md b/skills/dailybot/shared/env-json.md index c679e64..bdf2517 100644 --- a/skills/dailybot/shared/env-json.md +++ b/skills/dailybot/shared/env-json.md @@ -296,7 +296,7 @@ Developer: *"I need to test against my local Dailybot instance for this project ```bash # 1. Confirm CLI >= 3.7.0 (env command exists). dailybot env --help >/dev/null 2>&1 || { - echo "This feature requires dailybot-cli >= 3.7.0. Run: dailybot upgrade" >&2 + echo "This feature requires dailybot-cli >= 3.8.0. Run: dailybot upgrade" >&2 } # 2. Ensure the gitignore covers .dailybot/* (create if needed). @@ -438,7 +438,7 @@ That's what `~/.config/dailybot/agents.json` (global profiles) is for — see `d ## Version compatibility -- Requires **`dailybot-cli >= 3.7.0`**. Older CLIs never look at `.dailybot/env.json` and treat it as harmless clutter. +- Requires **`dailybot-cli >= 3.8.0`**. Older CLIs never look at `.dailybot/env.json` and treat it as harmless clutter. - The Dailybot agent skill pack targeting this doc requires the same floor. - If a developer is on an older CLI, offer to upgrade first: `dailybot upgrade` (auto-detects install method). diff --git a/skills/dailybot/shared/list-query-and-errors.md b/skills/dailybot/shared/list-query-and-errors.md index 99cc576..2c9c4d7 100644 --- a/skills/dailybot/shared/list-query-and-errors.md +++ b/skills/dailybot/shared/list-query-and-errors.md @@ -1,10 +1,10 @@ # Shared reference — list query flags, pagination, and machine-readable errors -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). Everything on this page — the shared +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). Everything on this page — the shared > list query flags, the `{count, next, previous, results}` pagination envelope, > the `Showing X of N` footer, the machine-readable error `code` dispatch, and > the API-key / Bearer parity + free-plan gating rules — is available at this -> floor. If `dailybot --version` is below 3.7.0, ask the developer to run +> floor. If `dailybot --version` is below 3.8.0, ask the developer to run > `dailybot upgrade`. This is the **single source of truth** for behavior shared across every @@ -165,16 +165,18 @@ In `--json` mode the error surfaces as `{ error, status, code, detail }`. | `button_link_and_callback_conflict` | A button has both a link `url` and a `callback_*` field. | Use one or the other — a button is either a link or an interactive callback. | | `button_callback_conflict` | A button has more than one `callback_*` field. | Only one of `callback_url`/`callback_form`/`callback_command`/`callback_prompt`/`callback_workflow` per button. | | `button_callback_url_invalid` | `callback_url` is not a valid URL. | Fix the URL. | -| `button_modal_body_invalid` | `modal_body` JSON is malformed or has invalid field types. | Check the modal spec — array of `{type, label, name, …}` objects. | +| `button_modal_body_invalid` | `modal_body` JSON is malformed or has invalid field types. | Use `{title, submit_label?, blocks: [{type, name, label, …}]}` — not a bare array of fields. | | `button_callback_form_not_found` | `callback_form` UUID doesn't match a form. | Verify the form UUID (`dailybot form list`). | | `button_callback_command_invalid` | `callback_command` is not a recognized ChatOps command. | Check the command string. | | `button_callback_prompt_invalid` | `callback_prompt` is empty or too long. | Fix the prompt text. | | `button_callback_workflow_not_found` | `callback_workflow` UUID doesn't match a workflow, or the workflow isn't API-triggerable. | Verify the UUID (`dailybot workflow list --filter api_trigger`). | | `button_response_invalid` | `response` text is empty or too long. | Fix the response text. | -| `button_callback_auth_invalid` | `callback_auth` value is malformed. | Use the format `"Bearer "`. | +| `button_callback_auth_invalid` | `callback_auth` value is malformed. | Use an object: `{type: "bearer"\|"basic"\|"custom_header", …}` — only with `callback_url`. | | `buttons_count_out_of_range` | More than 25 buttons on a single message. | Reduce to ≤25 buttons. | | `workflow_not_triggerable` | `workflow trigger` targeted a workflow whose event type is not `api_trigger`. | Only `api_trigger` workflows can be triggered. Use `workflow list --filter api_trigger`. | -| `workflow_trigger_payload_invalid` | `workflow trigger --payload` is not a valid JSON object or exceeds 8 KiB. | Fix the payload — must be a JSON object ≤8 KiB. | +| `workflow_trigger_payload_invalid` | `workflow trigger --payload` is not a valid JSON object or exceeds 8 KiB. | Fix the payload — must be a JSON object ≤8 KiB (measured as sent on the wire). | +| `workflow_execute_not_allowed` | Caller lacks permission to execute workflows. | An admin (or a user with execute permission) must run it. | +| `workflow_frozen` | The workflow is disabled (frozen). | Re-enable it in the Dailybot web app. | | `invalid_owner_user_id` | `--owner` value isn't a valid UUID (after resolution). | Fix the UUID or name. | | `too_many_owner_user_ids` | More than 50 `--owner` values. | Narrow the filter — max 50 owners per request. | diff --git a/skills/dailybot/teams/SKILL.md b/skills/dailybot/teams/SKILL.md index 50aeae4..4fea79a 100644 --- a/skills/dailybot/teams/SKILL.md +++ b/skills/dailybot/teams/SKILL.md @@ -10,7 +10,7 @@ allowed-tools: Bash, Read, Grep, Glob # Dailybot Teams -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). `dailybot team list`, `dailybot team get`, and the account-context commands `dailybot me` / `org` / `user get` are all available. If `dailybot --version` is below 3.7.0, ask the developer to run `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version) for install commands and version-check tooling. +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). `dailybot team list`, `dailybot team get`, and the account-context commands `dailybot me` / `org` / `user get` are all available. If `dailybot --version` is below 3.8.0, ask the developer to run `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version) for install commands and version-check tooling. You help agents resolve and read teams visible to the logged-in user. Teams are how Dailybot groups people inside an organization — they're the targets for team-scoped kudos, the routing context for some messages, and the source of truth for "who's in X?". @@ -170,7 +170,7 @@ Returns the team plus its membership when `--with-members` is set. Useful when t ## Step 4.5 — Read a single user, and your own account context -> **Baseline:** `user get`, `me`, and `org` are part of the `dailybot-cli >= 3.7.0` baseline. +> **Baseline:** `user get`, `me`, and `org` are part of the `dailybot-cli >= 3.8.0` baseline. The org directory has always been readable in bulk via `dailybot user list` (names + UUIDs; emails hidden as PII). You can also read diff --git a/skills/dailybot/workflow/SKILL.md b/skills/dailybot/workflow/SKILL.md index d46370e..9978c91 100644 --- a/skills/dailybot/workflow/SKILL.md +++ b/skills/dailybot/workflow/SKILL.md @@ -10,12 +10,11 @@ allowed-tools: Bash, Read, Grep, Glob # Dailybot Workflows -> **Requires `dailybot-cli >= 3.7.0`** (the skill-pack baseline). The -> `dailybot workflow list` / `dailybot workflow get` command group is available -> at this floor. The `dailybot workflow trigger` command requires a recent -> `dailybot-cli` with workflow-trigger support (the next CLI release after -> 3.7.4). If `dailybot --version` reports below 3.7.0, ask the developer to -> run `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI +> **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The +> `dailybot workflow list` / `get` / `trigger` command group — including +> `--filter api_trigger` and `--payload` — is available at this floor. If +> `dailybot --version` reports below 3.8.0, ask the developer to run +> `dailybot upgrade`. See [`../SKILL.md` § Required Dailybot CLI > version](../SKILL.md#required-dailybot-cli-version) for install commands and > version-check tooling. From 9e6f1bfc71049b1534c90cc439deba2bd899ef23 Mon Sep 17 00:00:00 2001 From: Sergio Alexander Florez Galeano Date: Fri, 24 Jul 2026 02:30:19 +0000 Subject: [PATCH 3/3] docs(pack): address AI review findings on CLI 3.8.0 floor docs ## Summary Fix the four live review comments on #43 plus the off-diff floor stragglers. ## Change Log - Drop duplicate workflow_execute_not_allowed / workflow_frozen rows from the 400 table (keep 403 only) - channels + env-json: align adjacent 3.7.0 strings with the 3.8.0 floor - workflow trigger: require confirm of target + payload before firing - report/README/AGENTS: finish the 3.8.0 floor sweep called out in the review Co-authored-by: Cursor --- AGENTS.md | 2 +- README.md | 2 +- skills/dailybot/channels/SKILL.md | 2 +- skills/dailybot/report/SKILL.md | 8 ++++---- skills/dailybot/shared/env-json.md | 2 +- skills/dailybot/shared/list-query-and-errors.md | 2 -- skills/dailybot/workflow/SKILL.md | 6 ++++++ 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index d4fe28b..d88d557 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -99,7 +99,7 @@ agent-skill/ ├── teams/SKILL.md ← team-name resolver (used by kudos + chat) ├── forms/SKILL.md ├── channels/SKILL.md ← report-channel discovery (UUIDs for --report-channel on forms/check-ins) - └── chat/SKILL.md ← Slack/Teams/Discord/Google Chat bot messages (CLI >= 1.13.0; latest on PyPI) + └── chat/SKILL.md ← Slack/Teams/Discord/Google Chat bot messages (CLI >= 3.8.0; latest on PyPI) ``` The hard rule: **anything you put outside `skills/dailybot/` is invisible diff --git a/README.md b/README.md index 9237eca..8592f13 100644 --- a/README.md +++ b/README.md @@ -325,7 +325,7 @@ agent-skill/ ├── teams/SKILL.md — team listing + name resolver (shared with kudos + chat) ├── forms/SKILL.md — form submission (user-scoped) ├── workflow/SKILL.md — workflow list, inspect, and trigger (plan-gated) - └── chat/SKILL.md — Slack/Teams/Discord/Google Chat bot messages (CLI >= 1.13.0; latest on PyPI) + └── chat/SKILL.md — Slack/Teams/Discord/Google Chat bot messages (CLI >= 3.8.0; latest on PyPI) ``` ## Execution Paths diff --git a/skills/dailybot/channels/SKILL.md b/skills/dailybot/channels/SKILL.md index 2e52455..f995ba8 100644 --- a/skills/dailybot/channels/SKILL.md +++ b/skills/dailybot/channels/SKILL.md @@ -12,7 +12,7 @@ allowed-tools: Bash, Read, Grep, Glob > **Requires `dailybot-cli >= 3.8.0`** (the skill-pack baseline). The `dailybot channels list` > command is available at this floor. If `dailybot --version` reports below -> 3.7.0, ask the developer to run `dailybot upgrade`. See +> 3.8.0, ask the developer to run `dailybot upgrade`. See > [`../SKILL.md` § Required Dailybot CLI version](../SKILL.md#required-dailybot-cli-version). Report channels are the Slack / Microsoft Teams / Discord / Google Chat diff --git a/skills/dailybot/report/SKILL.md b/skills/dailybot/report/SKILL.md index f19e70f..7bd6e6a 100644 --- a/skills/dailybot/report/SKILL.md +++ b/skills/dailybot/report/SKILL.md @@ -123,10 +123,10 @@ trigger in a previous session. #### Check whether hooks apply, and whether they are already installed -1. **CLI version.** Run `dailybot --version`. If it reports below `3.7.0` - (or the CLI is absent), the `dailybot hook` group does not exist — skip - Step 0b silently and continue to Step 1. The Step 0a trigger alone still - works. +1. **CLI version.** Run `dailybot --version`. If it reports below `3.8.0` + (or the CLI is absent), skip Step 0b silently and continue to Step 1 — + the pack baseline is `dailybot-cli >= 3.8.0`, and the Step 0a trigger + alone still works on older installs. 2. **Harness support.** If the current harness has no lifecycle-hook system (e.g. Cline today), skip Step 0b silently — Step 0a covers it. 3. **Already installed?** Check whether the hook config already references diff --git a/skills/dailybot/shared/env-json.md b/skills/dailybot/shared/env-json.md index bdf2517..17c7586 100644 --- a/skills/dailybot/shared/env-json.md +++ b/skills/dailybot/shared/env-json.md @@ -294,7 +294,7 @@ Rules: Developer: *"I need to test against my local Dailybot instance for this project without breaking my prod login."* ```bash -# 1. Confirm CLI >= 3.7.0 (env command exists). +# 1. Confirm CLI >= 3.8.0 (pack baseline; env command exists). dailybot env --help >/dev/null 2>&1 || { echo "This feature requires dailybot-cli >= 3.8.0. Run: dailybot upgrade" >&2 } diff --git a/skills/dailybot/shared/list-query-and-errors.md b/skills/dailybot/shared/list-query-and-errors.md index 2c9c4d7..b9a05e6 100644 --- a/skills/dailybot/shared/list-query-and-errors.md +++ b/skills/dailybot/shared/list-query-and-errors.md @@ -175,8 +175,6 @@ In `--json` mode the error surfaces as `{ error, status, code, detail }`. | `buttons_count_out_of_range` | More than 25 buttons on a single message. | Reduce to ≤25 buttons. | | `workflow_not_triggerable` | `workflow trigger` targeted a workflow whose event type is not `api_trigger`. | Only `api_trigger` workflows can be triggered. Use `workflow list --filter api_trigger`. | | `workflow_trigger_payload_invalid` | `workflow trigger --payload` is not a valid JSON object or exceeds 8 KiB. | Fix the payload — must be a JSON object ≤8 KiB (measured as sent on the wire). | -| `workflow_execute_not_allowed` | Caller lacks permission to execute workflows. | An admin (or a user with execute permission) must run it. | -| `workflow_frozen` | The workflow is disabled (frozen). | Re-enable it in the Dailybot web app. | | `invalid_owner_user_id` | `--owner` value isn't a valid UUID (after resolution). | Fix the UUID or name. | | `too_many_owner_user_ids` | More than 50 `--owner` values. | Narrow the filter — max 50 owners per request. | diff --git a/skills/dailybot/workflow/SKILL.md b/skills/dailybot/workflow/SKILL.md index 9978c91..289dd45 100644 --- a/skills/dailybot/workflow/SKILL.md +++ b/skills/dailybot/workflow/SKILL.md @@ -140,6 +140,12 @@ developer rather than re-deriving them. > types (schedule, form submission, etc.) are not triggerable from the CLI — > the server returns `workflow_not_triggerable`. +> **Confirm before triggering.** `workflow trigger` is side-effecting — it can +> start a deploy or other automation and enqueues a run. Restate the target +> workflow (name + UUID) and the payload (or "no payload") to the developer and +> wait for an explicit yes before running the command. Do not fire workflows +> unprompted. Same confirm-before-write posture as chat button sends. + ```bash dailybot workflow trigger --json ```