1.9 KiB
1.9 KiB
Project Brief: CLI Daily Standup Bot
Status: Draft v1
Author: Quill (Draft lane)
Date: 2026-10-29
Problem
Team members send async standup updates across chat threads, email, and tickets. Context gets buried, and syncs waste time restating status.
Goal
A single CLI command that collects, formats, and routes a daily standup update from a local text file to one or more destinations (email, Slack webhook, file).
Non-Goals
- Real-time chat integration (MVP is async file-based).
- Natural-language parsing beyond simple markdown sections.
- Mobile UI.
Input Contract
A markdown file at ./standup.md with exactly three sections:
## Yesterday
- ...
## Today
- ...
## Blockers
- ...
Output Contract
- A formatted plaintext/markdown summary printed to stdout.
- An email sent via SMTP if
SMTP_HOST,SMTP_USER,SMTP_PASS, andSTANDUP_TOare set. - A file written to
./standup-output/YYYY-MM-DD.md.
Acceptance Criteria
| ID | Criterion | Verification |
|---|---|---|
| AC-1 | Reads ./standup.md and fails with exit code 2 if missing or malformed. |
rm standup.md && standup; echo $? → 2 |
| AC-2 | Produces valid markdown summary on stdout with date header. | `standup |
| AC-3 | Writes dated output file under ./standup-output/. |
ls ./standup-output/$(date +%F).md exists. |
| AC-4 | Skips email when SMTP env vars are absent. | env -u SMTP_HOST standup does not error. |
| AC-5 | CLI flag --to overrides STANDUP_TO for a single run. |
`STANDUP_TO=a@x.com standup --to b@x.com |
Dependencies
- Python 3.11+ (stdlib only; no pip packages for MVP).
- Optional:
msmtpor equivalent for SMTP relay if host SMTP is blocked.
Open Questions
- Should the tool merge multiple contributor files into one team digest? (defer to v2)
- Should it read from stdin when
./standup.mdis absent? (defer; keep AC-1 strict)