geekbot-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +517 -0
- package/package.json +50 -0
- package/scripts/postinstall.mjs +27 -0
- package/skills/geekbot/SKILL.md +281 -0
- package/skills/geekbot/check-cli.sh +36 -0
- package/skills/geekbot/cli-commands.md +382 -0
- package/skills/geekbot/error-recovery.md +95 -0
- package/skills/geekbot/manager-workflows.md +408 -0
- package/skills/geekbot/reporter-workflows.md +275 -0
- package/skills/geekbot/standup-templates.json +244 -0
- package/src/auth/keychain.ts +38 -0
- package/src/auth/resolver.ts +44 -0
- package/src/cli/commands/auth.ts +56 -0
- package/src/cli/commands/me.ts +34 -0
- package/src/cli/commands/poll.ts +91 -0
- package/src/cli/commands/report.ts +66 -0
- package/src/cli/commands/standup.ts +234 -0
- package/src/cli/commands/team.ts +40 -0
- package/src/cli/globals.ts +31 -0
- package/src/cli/index.ts +94 -0
- package/src/errors/cli-error.ts +16 -0
- package/src/errors/error-handler.ts +63 -0
- package/src/errors/exit-codes.ts +14 -0
- package/src/errors/not-found-helper.ts +86 -0
- package/src/handlers/auth-handlers.ts +152 -0
- package/src/handlers/me-handlers.ts +27 -0
- package/src/handlers/poll-handlers.ts +187 -0
- package/src/handlers/report-handlers.ts +87 -0
- package/src/handlers/standup-handlers.ts +534 -0
- package/src/handlers/team-handlers.ts +38 -0
- package/src/http/authenticated-client.ts +17 -0
- package/src/http/client.ts +138 -0
- package/src/http/errors.ts +134 -0
- package/src/output/envelope.ts +50 -0
- package/src/output/formatter.ts +12 -0
- package/src/schemas/common.ts +13 -0
- package/src/schemas/poll.ts +89 -0
- package/src/schemas/report.ts +124 -0
- package/src/schemas/standup.ts +64 -0
- package/src/schemas/team.ts +11 -0
- package/src/schemas/user.ts +70 -0
- package/src/types.ts +30 -0
- package/src/utils/constants.ts +24 -0
- package/src/utils/input-parsers.ts +234 -0
- package/src/utils/receipt.ts +94 -0
- package/src/utils/validation.ts +128 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: geekbot
|
|
3
|
+
description: >
|
|
4
|
+
Use when the user mentions Geekbot, standups, daily check-ins, async
|
|
5
|
+
reports, polls, team engagement, response rates, or participation
|
|
6
|
+
tracking. Triggers on: "standup", "check-in", "report", "poll",
|
|
7
|
+
"Geekbot", "who hasn't posted", "draft my standup", "team analytics".
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Geekbot — AI-Powered Standup & Poll Management
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
This skill wraps the `geekbot` CLI to let users manage async team rituals
|
|
15
|
+
conversationally. It handles two broad workflows:
|
|
16
|
+
|
|
17
|
+
- **Manager workflows** — create standups/polls from templates, edit configs,
|
|
18
|
+
manage members and schedules, analyse team engagement from report data
|
|
19
|
+
- **Reporter workflows** — draft standup reports with AI assistance, carry
|
|
20
|
+
over unresolved blockers, calibrate tone from history, post reports
|
|
21
|
+
|
|
22
|
+
The CLI produces structured JSON output with machine-readable error codes,
|
|
23
|
+
making it reliable for agent-driven automation.
|
|
24
|
+
|
|
25
|
+
## Prerequisites
|
|
26
|
+
|
|
27
|
+
Before any operation, verify the CLI is available and authenticated.
|
|
28
|
+
|
|
29
|
+
Run `check-cli.sh` on first invocation. If it fails:
|
|
30
|
+
|
|
31
|
+
- **CLI not found**: Install via `npm install -g geekbot-cli` (requires
|
|
32
|
+
Bun >= 1.3.5 runtime). Note: `npx geekbot-cli` also requires Bun on
|
|
33
|
+
PATH — it is not a Node.js fallback.
|
|
34
|
+
- **Auth not configured**: Guide the user to run `geekbot auth setup`
|
|
35
|
+
which stores the API key in the OS keychain. Alternatively they can
|
|
36
|
+
set `GEEKBOT_API_KEY` as an environment variable.
|
|
37
|
+
|
|
38
|
+
Do not attempt any Geekbot operation until both checks pass.
|
|
39
|
+
|
|
40
|
+
## How the CLI Works
|
|
41
|
+
|
|
42
|
+
The CLI follows a noun-verb pattern: `geekbot <resource> <action> [options]`.
|
|
43
|
+
|
|
44
|
+
Every command returns a JSON envelope on stdout:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Success: { "ok": true, "data": <T>, "error": null, "metadata": {...} }
|
|
48
|
+
Error: { "ok": false, "data": null, "error": { "code", "message", "retryable", "suggestion" }, "metadata": {...} }
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Always check the `ok` field first. On errors, the `error.suggestion` field
|
|
52
|
+
often contains the exact fix — including listing valid IDs when a resource
|
|
53
|
+
isn't found. Use this to self-correct without bothering the user.
|
|
54
|
+
|
|
55
|
+
For the full command reference with flags, defaults, and examples, read
|
|
56
|
+
`cli-commands.md`.
|
|
57
|
+
|
|
58
|
+
## Quick Reference
|
|
59
|
+
|
|
60
|
+
Most common operations at a glance:
|
|
61
|
+
|
|
62
|
+
| Task | Command |
|
|
63
|
+
|------|---------|
|
|
64
|
+
| List my standups | `geekbot standup list` (add `--brief` for compact output, `--name`/`--channel` to filter, `--mine` for member-only, `--member <id>` for a specific user, `--limit <n>` to cap results) |
|
|
65
|
+
| Get standup details + question IDs | `geekbot standup get <id>` |
|
|
66
|
+
| Create a standup | `geekbot standup create --name "..." --channel "..." --questions '[...]'` |
|
|
67
|
+
| Update a standup (PATCH) | `geekbot standup update <id> --time "09:30"` |
|
|
68
|
+
| Delete a standup | `geekbot standup delete <id> --yes` |
|
|
69
|
+
| List reports | `geekbot report list --standup-id <id> --limit 10` |
|
|
70
|
+
| Submit a report | `geekbot report create --standup-id <id> --answers '{"<qid>":"..."}'` |
|
|
71
|
+
| My profile + user ID | `geekbot me show` |
|
|
72
|
+
| Create a poll (Slack only) | `geekbot poll create --name "..." --channel "..." --question "..." --choices '[...]'` |
|
|
73
|
+
| Search team members | `geekbot team search <query>` (matches username, realname, email) |
|
|
74
|
+
| Check auth | `geekbot auth status` |
|
|
75
|
+
|
|
76
|
+
For full flag details, see `cli-commands.md`.
|
|
77
|
+
|
|
78
|
+
## External Context Enrichment
|
|
79
|
+
|
|
80
|
+
The skill becomes dramatically more useful when it can pull data from where
|
|
81
|
+
work actually happens. This is **opportunistic** — check what MCP servers
|
|
82
|
+
are connected in the current session and use whatever is available. Never
|
|
83
|
+
fail or complain if nothing is connected; just fall back to asking the user.
|
|
84
|
+
|
|
85
|
+
**For report drafting:** Pull the user's recent activity from connected MCP
|
|
86
|
+
servers (GitHub, Jira, Calendar, Slack) and use it to pre-populate a draft.
|
|
87
|
+
The user reviews and approves instead of writing from scratch.
|
|
88
|
+
|
|
89
|
+
**For analytics:** Cross-reference standup report data with delivery data
|
|
90
|
+
to give richer insights — not just "who posted" but "what was actually shipped."
|
|
91
|
+
|
|
92
|
+
For entity mapping tables and deduplication strategy, see `reporter-workflows.md`.
|
|
93
|
+
|
|
94
|
+
**Important boundaries:**
|
|
95
|
+
- Always show the user what data you pulled and from where
|
|
96
|
+
- Never post a report containing enrichment data without user review
|
|
97
|
+
- If an MCP server query fails, skip it silently and move on
|
|
98
|
+
- Enrichment provides specifics (PR numbers, ticket IDs); the user's
|
|
99
|
+
voice still drives the narrative
|
|
100
|
+
|
|
101
|
+
## Intent Routing
|
|
102
|
+
|
|
103
|
+
Pattern-match on the user's request to pick the right workflow. Don't ask
|
|
104
|
+
"are you a manager or a reporter?" — the request itself makes intent clear.
|
|
105
|
+
The same person can manage standups and submit reports in one conversation.
|
|
106
|
+
|
|
107
|
+
**Route to Manager Workflows (§ below) when you see:**
|
|
108
|
+
- Creation/config language: "create", "set up", "configure", "schedule",
|
|
109
|
+
"add members", "change the questions", "duplicate", "delete"
|
|
110
|
+
- Analytics language: "how is my team doing", "engagement", "response rate",
|
|
111
|
+
"who hasn't posted", "participation", "trends"
|
|
112
|
+
- Member summary language: "what has X been up to", "X's reports",
|
|
113
|
+
"1-1 prep for X", "summarize X's work", "what did X report",
|
|
114
|
+
"catch me up on X", "X's recent standups"
|
|
115
|
+
- Poll language: "create a poll", "voting results", "survey"
|
|
116
|
+
|
|
117
|
+
**Route to Reporter Workflows (§ below) when you see:**
|
|
118
|
+
- Drafting language: "help me write", "draft my report", "what should I say",
|
|
119
|
+
"fill in my standup"
|
|
120
|
+
- Posting language: "post my answers", "submit my report"
|
|
121
|
+
- Context language: "what did I say last time", "carry over blockers",
|
|
122
|
+
"my recent reports"
|
|
123
|
+
- Identity queries: "what standups am I in", "show my profile"
|
|
124
|
+
|
|
125
|
+
**When ambiguous**, ask one clarifying question — never more than one.
|
|
126
|
+
|
|
127
|
+
## Manager Workflows
|
|
128
|
+
|
|
129
|
+
For detailed multi-step guides, read `manager-workflows.md`.
|
|
130
|
+
|
|
131
|
+
### Creating a Standup
|
|
132
|
+
|
|
133
|
+
This is the most common and most complex manager operation.
|
|
134
|
+
|
|
135
|
+
**If the request is vague** ("set up a standup for my team"), offer templates.
|
|
136
|
+
Load `standup-templates.json` and present the 3–4 most relevant options
|
|
137
|
+
based on context. Templates provide pre-built questions and sensible schedule
|
|
138
|
+
defaults — the user just needs to supply a name and Slack/Teams channel.
|
|
139
|
+
|
|
140
|
+
**Gathering required fields:**
|
|
141
|
+
- `--name` — the standup name (required)
|
|
142
|
+
- `--channel` — Slack/Teams channel to post in (required)
|
|
143
|
+
- `--questions` — JSON array of question objects (required; from template or custom)
|
|
144
|
+
- `--time` — defaults to 10:00 if not specified
|
|
145
|
+
- `--timezone` — infer from `geekbot me show` → `data.timezone` if not given
|
|
146
|
+
- `--days` — defaults to Mon–Fri
|
|
147
|
+
- `--users` — comma-separated user IDs (can add later via `update`)
|
|
148
|
+
|
|
149
|
+
**Always confirm the full configuration with the user before executing.**
|
|
150
|
+
Show: name, channel, questions, schedule, timezone.
|
|
151
|
+
|
|
152
|
+
**Note:** The CLI sets which days of the week to run but cannot set frequency
|
|
153
|
+
(bi-weekly, monthly). For non-weekly schedules, create the standup via CLI
|
|
154
|
+
and tell the user to adjust the frequency in the Geekbot web dashboard.
|
|
155
|
+
|
|
156
|
+
### Editing / Deleting / Other Operations
|
|
157
|
+
|
|
158
|
+
- **Edit**: Fetch current state with `standup get`, show the user, confirm
|
|
159
|
+
changes, use `standup update` (PATCH). Use `standup replace` only for
|
|
160
|
+
full config replacement.
|
|
161
|
+
- **Delete**: Always fetch and show what will be deleted first. Get explicit
|
|
162
|
+
confirmation. Execute with `--yes`.
|
|
163
|
+
- **Duplicate**: `geekbot standup duplicate <id> --name "New Name"`
|
|
164
|
+
- **Trigger now**: `geekbot standup start <id>` — confirm before executing.
|
|
165
|
+
- **Polls** (Slack only): See `cli-commands.md` for poll commands.
|
|
166
|
+
|
|
167
|
+
### Analytics
|
|
168
|
+
|
|
169
|
+
Analytics come from report data fetched via the CLI. The skill computes
|
|
170
|
+
metrics; the CLI provides raw data. For the full analytics playbook with
|
|
171
|
+
6 named analysis patterns (response rate, participation gaps, blocker
|
|
172
|
+
frequency, trends, answer quality, cross-referencing), read
|
|
173
|
+
`manager-workflows.md`.
|
|
174
|
+
|
|
175
|
+
**Quick start:** Identify the standup with `standup list`, get member count
|
|
176
|
+
with `standup get <id>`, fetch reports with
|
|
177
|
+
`report list --standup-id <id> --after <date> --limit 100`, then compute.
|
|
178
|
+
|
|
179
|
+
### Team Member Summary
|
|
180
|
+
|
|
181
|
+
Summarize what a specific person has been working on — ideal for 1-1 prep.
|
|
182
|
+
For the full step-by-step workflow, read `manager-workflows.md` §Team Member
|
|
183
|
+
Summary.
|
|
184
|
+
|
|
185
|
+
**Quick start:** `geekbot team search <name>` → get user ID →
|
|
186
|
+
`geekbot standup list --member <id> --brief` to find their standups →
|
|
187
|
+
`geekbot report list --standup-id <sid> --user-id <id> --after <3 weeks ago> --limit 20` →
|
|
188
|
+
synthesize by work stream, not chronologically.
|
|
189
|
+
|
|
190
|
+
## Reporter Workflows
|
|
191
|
+
|
|
192
|
+
For the full drafting pipeline, tone calibration, blocker carry-over logic,
|
|
193
|
+
and edge cases, read `reporter-workflows.md`.
|
|
194
|
+
|
|
195
|
+
### Report Drafting Pipeline (Summary)
|
|
196
|
+
|
|
197
|
+
1. **Identify the standup** — `standup list`, auto-select if only one
|
|
198
|
+
2. **Fetch questions** — `standup get <id>` → extract question IDs and text
|
|
199
|
+
3. **Gather context** — from MCP servers (if connected), previous reports
|
|
200
|
+
(for style calibration), and the user's direct input
|
|
201
|
+
4. **Draft answers** — match their historical tone/length, weave in specifics
|
|
202
|
+
from MCP data, run blocker carry-over check on last 3–5 reports
|
|
203
|
+
5. **Review and post** — present draft, get explicit approval, then
|
|
204
|
+
`report create --standup-id <id> --answers '{...}'`
|
|
205
|
+
|
|
206
|
+
**Never post a report without explicit user approval.**
|
|
207
|
+
|
|
208
|
+
### Quick Actions
|
|
209
|
+
|
|
210
|
+
One-shot commands that don't need the full pipeline:
|
|
211
|
+
|
|
212
|
+
- **"What standups am I in?"** → `geekbot standup list`
|
|
213
|
+
- **"Show my recent reports"** → `geekbot report list --user-id <uid> --limit 5`
|
|
214
|
+
- **"Show my profile"** → `geekbot me show`
|
|
215
|
+
- **"What teams am I in?"** → `geekbot me teams`
|
|
216
|
+
- **"Trigger my standup now"** → confirm first, then `geekbot standup start <id>`
|
|
217
|
+
|
|
218
|
+
## Confirmation Policy
|
|
219
|
+
|
|
220
|
+
| Operation | Confirmation required? | What to show |
|
|
221
|
+
|-----------|----------------------|--------------|
|
|
222
|
+
| CREATE standup/poll | Yes | Full config: name, channel, questions, schedule |
|
|
223
|
+
| UPDATE standup | Yes | Current vs proposed (diff) |
|
|
224
|
+
| DELETE standup | Yes, always | What will be deleted (name, channel, members) |
|
|
225
|
+
| POST report | Yes, always | Complete draft with all answers |
|
|
226
|
+
| TRIGGER standup | Yes | Which standup, who it targets |
|
|
227
|
+
| List / Get / Analytics | No | Just execute and present results |
|
|
228
|
+
| Error recovery retries | No | Transparent to user |
|
|
229
|
+
|
|
230
|
+
## Error Handling
|
|
231
|
+
|
|
232
|
+
For the complete recovery guide, read `error-recovery.md`.
|
|
233
|
+
|
|
234
|
+
**Core pattern**: always parse the JSON envelope, check `ok`, branch on
|
|
235
|
+
exit code.
|
|
236
|
+
|
|
237
|
+
| Exit code | Meaning | Agent action |
|
|
238
|
+
|-----------|---------|--------------|
|
|
239
|
+
| 0 | Success | Proceed normally |
|
|
240
|
+
| 3 | Not found | Parse `error.suggestion` — it lists valid IDs. Offer them to the user. |
|
|
241
|
+
| 4 | Auth failed | Guide user through `geekbot auth setup`. Do not retry. |
|
|
242
|
+
| 5 | Forbidden | Explain permission issue. The user may need admin access. |
|
|
243
|
+
| 6 | Validation | Show `error.message`, help the user fix the input. |
|
|
244
|
+
| 7 | Network | If `error.retryable` is true, retry once after 2s silently. If it fails again, report. |
|
|
245
|
+
| 8 | Conflict | Explain the conflict (e.g., duplicate name). Suggest resolution. |
|
|
246
|
+
| 9 | Schema validation (`schema_validation_error`) | API response didn't match expected format. Don't ask user to fix input — suggest updating CLI or reporting a bug. |
|
|
247
|
+
| 1, 2, 9 | General / usage / API | Report `error.message` to the user clearly. |
|
|
248
|
+
|
|
249
|
+
**Never retry** errors where `retryable` is false.
|
|
250
|
+
|
|
251
|
+
## Common Mistakes
|
|
252
|
+
|
|
253
|
+
- **Inventing report answers** — if the user didn't provide enough context
|
|
254
|
+
for a question, ask. Never guess or fabricate.
|
|
255
|
+
- **Retrying auth errors** — exit code 4 is never transient. Guide the user
|
|
256
|
+
to `geekbot auth setup` instead.
|
|
257
|
+
- **Skipping confirmation for deletes** — always show what will be deleted
|
|
258
|
+
and get explicit approval, even if it feels obvious.
|
|
259
|
+
- **Dumping raw JSON** — format output as tables, summaries, or narratives.
|
|
260
|
+
The user should never see a raw JSON envelope.
|
|
261
|
+
- **Ignoring `error.suggestion`** — when a resource isn't found (exit 3),
|
|
262
|
+
the CLI already lists valid alternatives. Use them.
|
|
263
|
+
- **Asking "are you a manager or reporter?"** — the request itself reveals
|
|
264
|
+
intent. Pattern-match, don't interrogate.
|
|
265
|
+
|
|
266
|
+
## Output Patterns
|
|
267
|
+
|
|
268
|
+
**CRUD confirmations** — brief, factual, include key identifiers:
|
|
269
|
+
> Created "Sprint Retro" standup (ID 789) in #engineering — Fridays at
|
|
270
|
+
> 15:00 Chicago time with 3 questions.
|
|
271
|
+
|
|
272
|
+
**Lists** — concise table: ID, name, channel, schedule. Don't dump raw JSON.
|
|
273
|
+
|
|
274
|
+
**Analytics** — narrative summary first, data table for details. Use
|
|
275
|
+
visualisation (chart/graph) when showing trends over time.
|
|
276
|
+
|
|
277
|
+
**Report drafts** — one question per block, clearly labelled with question
|
|
278
|
+
text and proposed answer. Easy to scan and approve.
|
|
279
|
+
|
|
280
|
+
**Errors** — plain language: what happened, why, what to do next. Always
|
|
281
|
+
use `error.suggestion` when available.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Verify geekbot CLI is installed and authenticated.
|
|
3
|
+
# Run at the start of any skill invocation.
|
|
4
|
+
# Exit 0 = ready, Exit 1 = not installed, Exit 2 = not authed
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
# Check CLI exists on PATH
|
|
9
|
+
if ! command -v geekbot &>/dev/null; then
|
|
10
|
+
cat <<'EOF'
|
|
11
|
+
{"ok":false,"error":"cli_not_found","message":"geekbot CLI not found on PATH.","suggestion":"Install: npm install -g geekbot-cli (requires Bun >= 1.3.5). Then run: npx skills add geekbot-com/geekbot-cli to register the skill with your AI agents."}
|
|
12
|
+
EOF
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
# Check version (confirms the binary actually runs)
|
|
17
|
+
VERSION_OUTPUT=$(geekbot --version 2>&1 || true)
|
|
18
|
+
if [ -z "$VERSION_OUTPUT" ]; then
|
|
19
|
+
cat <<'EOF'
|
|
20
|
+
{"ok":false,"error":"cli_broken","message":"geekbot CLI found but failed to run.","suggestion":"Try: bun install in the geekbot-cli directory, then bun link again"}
|
|
21
|
+
EOF
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# Check auth — use exit code instead of jq to avoid extra dependency
|
|
26
|
+
if ! geekbot auth status &>/dev/null; then
|
|
27
|
+
cat <<'EOF'
|
|
28
|
+
{"ok":false,"error":"auth_not_configured","message":"geekbot CLI is not authenticated.","suggestion":"Run: geekbot auth setup"}
|
|
29
|
+
EOF
|
|
30
|
+
exit 2
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# All good — sanitize version to alphanumeric + dots before embedding in JSON
|
|
34
|
+
SAFE_VERSION=$(echo "$VERSION_OUTPUT" | tr -cd '[:alnum:].')
|
|
35
|
+
echo "{\"ok\":true,\"version\":\"${SAFE_VERSION}\",\"message\":\"geekbot CLI is installed and authenticated\"}"
|
|
36
|
+
exit 0
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
# Geekbot CLI — Command Reference
|
|
2
|
+
|
|
3
|
+
Agent-optimised reference for the `geekbot` CLI. Every command returns a
|
|
4
|
+
JSON envelope: `{ ok, data, error, metadata }`. Always check `ok` first.
|
|
5
|
+
|
|
6
|
+
## Table of Contents
|
|
7
|
+
|
|
8
|
+
1. [Standup commands](#standup)
|
|
9
|
+
2. [Report commands](#report)
|
|
10
|
+
3. [Poll commands](#poll)
|
|
11
|
+
4. [Identity commands](#identity)
|
|
12
|
+
5. [Auth commands](#auth)
|
|
13
|
+
6. [Global options](#global-options)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Standup
|
|
18
|
+
|
|
19
|
+
### standup list
|
|
20
|
+
|
|
21
|
+
List standups the authenticated user participates in, with optional
|
|
22
|
+
client-side filtering and a brief output mode.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
geekbot standup list # all your standups
|
|
26
|
+
geekbot standup list --admin # all team standups (admin only)
|
|
27
|
+
geekbot standup list --brief # compact: id, name, channel only
|
|
28
|
+
geekbot standup list --brief --limit 10 # first 10, compact
|
|
29
|
+
geekbot standup list --name "daily" # filter by name (case-insensitive substring)
|
|
30
|
+
geekbot standup list --channel "#status" # filter by channel (case-insensitive substring)
|
|
31
|
+
geekbot standup list --mine # only standups you are a member of
|
|
32
|
+
geekbot standup list --member "UHNM44125" # only standups a specific user is in
|
|
33
|
+
geekbot standup list --mine --brief # combine filters
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
| Flag | Default | Notes |
|
|
37
|
+
|------|---------|-------|
|
|
38
|
+
| `--admin` | `false` | Include all team standups (admin only) |
|
|
39
|
+
| `--brief` | `false` | Return only `id`, `name`, `channel` |
|
|
40
|
+
| `--limit <n>` | — | Cap results to first N standups (applied after filters) |
|
|
41
|
+
| `--name <name>` | — | Case-insensitive substring filter on standup name |
|
|
42
|
+
| `--channel <channel>` | — | Case-insensitive substring filter on channel name |
|
|
43
|
+
| `--mine` | `false` | Filter to standups where you appear in the members list |
|
|
44
|
+
| `--member <id>` | — | Filter to standups where the given user ID is a member |
|
|
45
|
+
|
|
46
|
+
**Note:** `--name`, `--channel`, `--mine`, `--member`, and `--limit` are
|
|
47
|
+
client-side filters applied after fetching. `--mine` makes one extra API call
|
|
48
|
+
(`GET /v1/me`) to resolve your user ID.
|
|
49
|
+
|
|
50
|
+
Returns: `data` is an array of standup objects. With `--brief`, each object
|
|
51
|
+
contains only `id`, `name`, `channel`. Without `--brief`, full standup
|
|
52
|
+
objects with `questions`, `users`, and all fields.
|
|
53
|
+
|
|
54
|
+
### standup get
|
|
55
|
+
|
|
56
|
+
Get full details of a standup including questions with their IDs.
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
geekbot standup get 123
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Returns: `data` includes `id`, `name`, `channel`, `time`, `timezone`, `days`,
|
|
63
|
+
`questions` (array of `{ id, text }`), member info.
|
|
64
|
+
|
|
65
|
+
This is the primary way to discover question IDs for report submission.
|
|
66
|
+
|
|
67
|
+
### standup create
|
|
68
|
+
|
|
69
|
+
Create a new standup. Name and channel are required.
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
geekbot standup create \
|
|
73
|
+
--name "Sprint Retro" \
|
|
74
|
+
--channel "#engineering" \
|
|
75
|
+
--time "15:00" \
|
|
76
|
+
--timezone "America/Chicago" \
|
|
77
|
+
--days "Fri" \
|
|
78
|
+
--questions '[{"text": "What went well?"}, {"text": "What could improve?"}]' \
|
|
79
|
+
--users "U123,U456" \
|
|
80
|
+
--wait-time 0
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
| Flag | Required | Default | Notes |
|
|
84
|
+
|------|----------|---------|-------|
|
|
85
|
+
| `--name <name>` | Yes | — | Standup name |
|
|
86
|
+
| `--channel <channel>` | Yes | — | Slack/Teams channel name |
|
|
87
|
+
| `--time <HH:MM>` | No | `10:00` | 24-hour format |
|
|
88
|
+
| `--timezone <tz>` | No | `UTC` | IANA timezone (e.g. `Europe/Athens`) |
|
|
89
|
+
| `--days <days>` | No | `Mon,Tue,Wed,Thu,Fri` | Comma-separated |
|
|
90
|
+
| `--questions <json>` | Yes | — | JSON array: `[{"text": "..."},...]` |
|
|
91
|
+
| `--users <ids>` | No | — | Comma-separated user IDs |
|
|
92
|
+
| `--wait-time <min>` | No | `0` | Minutes between users |
|
|
93
|
+
|
|
94
|
+
Returns: `data` is the created standup object. `metadata` includes an
|
|
95
|
+
`undo` field with the delete command.
|
|
96
|
+
|
|
97
|
+
**Tip**: If you know the user's timezone from `geekbot me show`, use it
|
|
98
|
+
as the default instead of UTC.
|
|
99
|
+
|
|
100
|
+
**Limitation**: The `--days` flag controls which days of the week the standup
|
|
101
|
+
runs, but there is no flag for frequency (bi-weekly, monthly, etc.). For
|
|
102
|
+
non-weekly schedules, create the standup via CLI and direct the user to
|
|
103
|
+
adjust the frequency in the Geekbot web dashboard.
|
|
104
|
+
|
|
105
|
+
### standup update (PATCH)
|
|
106
|
+
|
|
107
|
+
Partially update a standup. Only pass the flags you want to change.
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
geekbot standup update 123 --time "09:30" --days "Mon,Wed,Fri"
|
|
111
|
+
geekbot standup update 123 --users "U123,U456,U789"
|
|
112
|
+
geekbot standup update 123 --questions '["What did you do?","Any blockers?"]'
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
| Flag | Notes |
|
|
116
|
+
|------|-------|
|
|
117
|
+
| `--name <name>` | New standup name |
|
|
118
|
+
| `--channel <channel>` | New channel |
|
|
119
|
+
| `--time <HH:MM>` | New time |
|
|
120
|
+
| `--timezone <tz>` | New timezone |
|
|
121
|
+
| `--days <days>` | New days (replaces all) |
|
|
122
|
+
| `--questions <json>` | New questions (replaces all) |
|
|
123
|
+
| `--wait-time <min>` | New wait time |
|
|
124
|
+
| `--users <ids>` | New member list (replaces all) |
|
|
125
|
+
|
|
126
|
+
**Important**: `--users` replaces the entire member list. To add a member,
|
|
127
|
+
fetch the current list first, append the new ID, and send the full list.
|
|
128
|
+
|
|
129
|
+
### standup replace (PUT)
|
|
130
|
+
|
|
131
|
+
Full replacement of a standup. Name and channel are required; everything
|
|
132
|
+
else uses create defaults if omitted.
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
geekbot standup replace 123 \
|
|
136
|
+
--name "New Name" \
|
|
137
|
+
--channel "#new-channel" \
|
|
138
|
+
--time "11:00" \
|
|
139
|
+
--timezone "UTC"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Use `replace` only when you want to reset the entire config. Prefer
|
|
143
|
+
`update` for partial changes.
|
|
144
|
+
|
|
145
|
+
### standup delete
|
|
146
|
+
|
|
147
|
+
Delete a standup permanently. Always pass `--yes` in agent context.
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
geekbot standup delete 123 --yes
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
The skill should confirm with the user conversationally before executing.
|
|
154
|
+
|
|
155
|
+
### standup duplicate
|
|
156
|
+
|
|
157
|
+
Clone an existing standup with a new name.
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
geekbot standup duplicate 123 --name "Backend Daily v2"
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Returns: the new standup object with a new ID.
|
|
164
|
+
|
|
165
|
+
### standup start
|
|
166
|
+
|
|
167
|
+
Trigger a standup immediately (outside its normal schedule).
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
geekbot standup start 123
|
|
171
|
+
geekbot standup start 123 --users "U123,U456" # target specific users
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Report
|
|
177
|
+
|
|
178
|
+
### report list
|
|
179
|
+
|
|
180
|
+
List reports with optional filters. All filters are optional.
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
# Recent reports for a standup
|
|
184
|
+
geekbot report list --standup-id 123 --limit 10
|
|
185
|
+
|
|
186
|
+
# A specific user's reports
|
|
187
|
+
geekbot report list --standup-id 123 --user-id U08LXSA31BJ --limit 5
|
|
188
|
+
|
|
189
|
+
# Date range
|
|
190
|
+
geekbot report list --standup-id 123 --after "2026-03-01" --before "2026-03-15"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
| Flag | Notes |
|
|
194
|
+
|------|-------|
|
|
195
|
+
| `--standup-id <id>` | Filter by standup |
|
|
196
|
+
| `--user-id <id>` | Filter by user (Slack-style ID like `U08LXSA31BJ`) |
|
|
197
|
+
| `--before <date>` | ISO 8601 date or unix timestamp |
|
|
198
|
+
| `--after <date>` | ISO 8601 date or unix timestamp |
|
|
199
|
+
| `--limit <n>` | Max reports to return |
|
|
200
|
+
|
|
201
|
+
Returns: `data` is an array of report objects, each containing `id`,
|
|
202
|
+
`standup_id`, `questions` (array of `{ id, text, answer }`).
|
|
203
|
+
|
|
204
|
+
### report create
|
|
205
|
+
|
|
206
|
+
Submit a report. Answers are keyed by question ID.
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
geekbot report create \
|
|
210
|
+
--standup-id 123 \
|
|
211
|
+
--answers '{"101": "Finished auth module", "102": "Starting API tests", "103": "None right now"}'
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
| Flag | Required | Notes |
|
|
215
|
+
|------|----------|-------|
|
|
216
|
+
| `--standup-id <id>` | Yes | Which standup to report on |
|
|
217
|
+
| `--answers <json>` | Yes | JSON object: `{"<question_id>": "<answer>", ...}` |
|
|
218
|
+
|
|
219
|
+
Get question IDs from `geekbot standup get <standup_id>`.
|
|
220
|
+
|
|
221
|
+
**Critical**: Never submit a report without explicit user approval.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Poll
|
|
226
|
+
|
|
227
|
+
Polls are Slack-only. Non-Slack teams will get a platform error.
|
|
228
|
+
|
|
229
|
+
### poll list
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
geekbot poll list
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Returns: array of poll objects.
|
|
236
|
+
|
|
237
|
+
### poll get
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
geekbot poll get 456
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Returns: poll details including question and choices.
|
|
244
|
+
|
|
245
|
+
### poll create
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
geekbot poll create \
|
|
249
|
+
--name "Team Lunch" \
|
|
250
|
+
--channel "#general" \
|
|
251
|
+
--question "Where should we eat?" \
|
|
252
|
+
--choices '["Pizza", "Sushi", "Tacos"]'
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
| Flag | Required |
|
|
256
|
+
|------|----------|
|
|
257
|
+
| `--name <name>` | Yes |
|
|
258
|
+
| `--channel <channel>` | Yes |
|
|
259
|
+
| `--question <text>` | Yes |
|
|
260
|
+
| `--choices <json>` | Yes — JSON array of strings |
|
|
261
|
+
|
|
262
|
+
### poll votes
|
|
263
|
+
|
|
264
|
+
View voting results for a poll.
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
geekbot poll votes 456
|
|
268
|
+
geekbot poll votes 456 --after "2026-03-01" --before "2026-03-15"
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Identity
|
|
274
|
+
|
|
275
|
+
### me show
|
|
276
|
+
|
|
277
|
+
Get the authenticated user's profile. Use this to discover the user's ID,
|
|
278
|
+
timezone, and admin status.
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
geekbot me show
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
Returns:
|
|
285
|
+
```json
|
|
286
|
+
{
|
|
287
|
+
"id": "U08LXSA31BJ",
|
|
288
|
+
"username": "mitch",
|
|
289
|
+
"realname": "mitch",
|
|
290
|
+
"email": "mitch@geekbot.com",
|
|
291
|
+
"timezone": "Europe/Athens",
|
|
292
|
+
"is_admin": true,
|
|
293
|
+
"role": "admin"
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
The `id` field is a Slack-style user ID — use it for `--user-id` filters
|
|
298
|
+
and `--users` member lists.
|
|
299
|
+
|
|
300
|
+
The `timezone` field is an IANA timezone — use it as a default for standup
|
|
301
|
+
creation when the user doesn't specify one.
|
|
302
|
+
|
|
303
|
+
### me teams
|
|
304
|
+
|
|
305
|
+
List teams the user belongs to.
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
geekbot me teams
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### team list
|
|
312
|
+
|
|
313
|
+
List all teams with their members.
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
geekbot team list
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### team search
|
|
320
|
+
|
|
321
|
+
Search team members by name, username, or email. Case-insensitive
|
|
322
|
+
substring match across all three fields.
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
geekbot team search jenny # match by username or realname
|
|
326
|
+
geekbot team search "Smith" # match by realname
|
|
327
|
+
geekbot team search @example.com # match by email domain
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
Returns: `data` is an array of matching user objects with `id`, `role`,
|
|
331
|
+
`email`, `username`, `realname`, `profile_img`. Use the `id` field as
|
|
332
|
+
the `--user-id` value for `report list`.
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Auth
|
|
337
|
+
|
|
338
|
+
### auth setup
|
|
339
|
+
|
|
340
|
+
Configure and store the API key. Validates against the Geekbot API.
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
geekbot auth setup # interactive prompt
|
|
344
|
+
geekbot --api-key YOUR_KEY auth setup # non-interactive
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### auth status
|
|
348
|
+
|
|
349
|
+
Verify stored credentials work.
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
geekbot auth status
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Returns `ok: true` if auth is valid.
|
|
356
|
+
|
|
357
|
+
### auth remove
|
|
358
|
+
|
|
359
|
+
Remove stored API key from OS keychain.
|
|
360
|
+
|
|
361
|
+
```bash
|
|
362
|
+
geekbot auth remove
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## Global Options
|
|
368
|
+
|
|
369
|
+
Apply to all commands:
|
|
370
|
+
|
|
371
|
+
| Flag | Default | Notes |
|
|
372
|
+
|------|---------|-------|
|
|
373
|
+
| `--api-key <key>` | — | Override env var and keychain |
|
|
374
|
+
| `--output <format>` | `json` | Only `json` currently supported |
|
|
375
|
+
| `--debug` | `false` | Debug output on stderr |
|
|
376
|
+
| `-v, --version` | — | Print version |
|
|
377
|
+
| `--help` | — | Show help text |
|
|
378
|
+
|
|
379
|
+
## Exit Codes
|
|
380
|
+
|
|
381
|
+
See the error handling table in `SKILL.md` for exit codes and agent actions.
|
|
382
|
+
For detailed recovery flows, see `error-recovery.md`.
|