Sync and update the community FAQ from Discord conversations, WhatsApp groups, and GitHub issues. Identifies recurring questions, adds new entries, and keeps the FAQ as a living knowledge base. Use when user says 'update faq', 'sync faq', 'community faq', 'frequently asked questions', or when running community routines that detect unanswered/recurring questions.
Routine that keeps the community FAQ always updated, fed by questions from Discord, WhatsApp, and GitHub issues.
Always respond in English.
workspace/community/[C] FAQ.md
This is the single source of truth file. All agents and support bots should consult this file.
The file follows this format:
# FAQ — Community
> Automatically updated. Last sync: {YYYY-MM-DD HH:MM}
> Sources: Discord (#help, #feedback) + GitHub Issues
> Total: {N} questions
---
## Installation & Setup
<!-- tag: installation, setup, docker, deploy -->
### How to install the main API via Docker?
**Answer:** [clear and direct answer]
**Source:** Discord #help (recurring) | [Official doc link if available]
**Added:** YYYY-MM-DD
### How to configure SSL/HTTPS?
**Answer:** [...]
**Source:** GitHub YOUR_ORG/main-api#123
**Added:** YYYY-MM-DD
---
## Configuration
<!-- tag: config, env, variables, webhook -->
### How to configure webhooks?
...
---
## Integrations
<!-- tag: whatsapp, telegram, typebot, n8n, chatwoot -->
...
## Evo CRM
<!-- tag: crm, agents, pipeline, leads -->
...
## Evo Go
<!-- tag: evogo, go, manager -->
...
## Billing & Licenses
<!-- tag: license, plan, price, payment -->
...
## Common Errors
<!-- tag: error, bug, 503, 401, timeout -->
...
Read workspace/community/[C] FAQ.md. If it does not exist, create it with the base structure.
Count how many entries exist and which categories.
From Discord (last 24h):
Use /discord-get-messages on channels:
🆘・help (ID do canal de help)🆘・feedback💬・chat-ptIdentify messages that are questions (end in ?, ask for help, report errors).
From GitHub (last 24h):
# Issues abertas recentemente nos 5 repos
gh issue list --repo YOUR_ORG/main-api --state open --json title,body,labels,createdAt --limit 10
gh issue list --repo YOUR_ORG/crm-product --state open --json title,body,labels,createdAt --limit 10
gh issue list --repo YOUR_ORG/go-service --state open --json title,body,labels,createdAt --limit 10
gh issue list --repo YOUR_ORG/crm-community --state open --json title,body,labels,createdAt --limit 10
gh issue list --repo YOUR_ORG/methodology --state open --json title,body,labels,createdAt --limit 5
Filter issues that are questions or recurring bugs.
From WhatsApp (last 24h):
Use /int-whatsapp to fetch messages from groups:
python3 {project-root}/.claude/skills/int-whatsapp/scripts/whatsapp_client.py messages_24h
Filter messages that are questions (end in ?, ask for help, report errors, ask for configuration guidance). Mark source as "WhatsApp {group name}".
From Linear — "Evolution Suporte" Project: Use Linear MCP to fetch recently resolved issues from the paid support project:
list_issues(project="Evolution Suporte", state="Done", updatedAt="-P1D")
Resolved issues from paid support are a gold mine for the FAQ — these are real client problems with validated solutions. For each resolved issue:
For each question found:
closed with label solved/resolved. Issues with no replies or only community speculation → SKIP.state=Done AND a resolution comment from the assignee. Cite the issue ID + resolution comment.For each new question that passed the Step 3 gate:
[pending: {specific missing detail}] inline and flag for follow-up — do not fill the gap with generic knowledge.For existing questions:
For existing questions:
Update the FAQ header with:
Present a short summary:
## FAQ Sync — {date}
Questions in FAQ: {total}
New added: {N}
Updated: {N}
Skipped (no verified answer): {N}
Sources: Discord ({N}) + GitHub ({N}) + WhatsApp ({N}) + Linear ({N})
New:
- {question 1} → {category}
- {question 2} → {category}
Skipped (pending documentation):
- {question} — reason: no reply in source / reply from non-team / etc.
The "Skipped" block is mandatory — it gives visibility on questions the community is asking but no one has answered, which is itself a signal worth tracking.
Upon completion, send a short summary via Telegram to the user:
reply(chat_id="YOUR_CHAT_ID", text="...")