Skill BotCity Python Pro¶
A skill botcity-python-pro transforma o Claude num par de programação especializado em automações BotCity de nível produção. Aplica padrões modernos de Python 3.11+ adaptados à realidade de RPA: segurança de credenciais, tratamento de erro em camadas, separação UI/lógica e respeito ao formato de deploy do Runner BotCity. Funciona em português e inglês.
Pré-requisitos¶
- Claude Code instalado e configurado
- Python 3.11 ou superior
- Projeto BotCity existente ou intenção de criar um do zero
- Acesso ao BotCity Maestro (necessário para deploy em produção)
- Dependências de runtime pinadas no
requirements.txtdo projeto:
Instalar a skill¶
Copie o arquivo botcity-python-pro/skill.md para a pasta de skills do Claude Code:
Nota
A skill é ativada automaticamente quando o Claude detecta contexto BotCity — código com DesktopBot, WebBot, botcity-maestro-sdk, referências a DataPool ou Runner. Você não precisa invocá-la manualmente.
Escolher o modo de operação¶
A skill opera em quatro modos. Declare explicitamente qual você precisa no início da conversa:
| Modo | Quando usar | O que esperar |
|---|---|---|
| Scaffold | Projeto novo do zero | Estrutura src/ completa, requirements.txt pinado, esqueleto de testes |
| Refactor | Melhorar bot existente | Diagnóstico estruturado (Critical/Important/Nice-to-have) antes de alterar código |
| Fix | Bug pontual | Correção cirúrgica sem refatoração oportunista |
| Review | Feedback estruturado | Lista categorizada de findings sem aplicar mudanças |
Dica
Seja explícito: "bot novo do zero" e "só quero corrigir esse timeout" geram respostas muito diferentes.
Criar um bot do zero¶
Use um prompt descritivo com as responsabilidades do bot:
Cria um bot BotCity do zero que:
- Consome itens de um DataPool chamado "invoices_to_process"
- Faz login num portal web usando credenciais do Maestro
- Baixa o PDF de cada NF e sobe como artifact
- Lida com NF inválida marcando o item como erro sem abortar
A skill gera a seguinte estrutura de projeto:
my_bot/
├── bot.py
├── requirements.txt
├── pyproject.toml
├── README.md
├── .env.example
├── .gitignore
├── resources/
├── src/
│ ├── config.py
│ ├── pages/
│ ├── services/
│ ├── domain/
│ ├── utils/
│ └── exceptions.py
└── tests/
├── unit/
└── fixtures/
Atenção
O Runner BotCity lê requirements.txt, não pyproject.toml. Se você usar uv, execute uv export --no-dev --no-hashes --format requirements-txt > requirements.txt antes de empacotar o .zip para deploy.
Refatorar um bot existente¶
Cole o código diretamente na conversa e peça revisão:
Revisa esse bot pra mim. É um Selenium puro que migramos pra BotCity
mês passado e tá dando problema em produção. [cola código]
A skill executa o checklist de diagnóstico e retorna findings estruturados:
## Findings
### Critical (2)
1. Hardcoded API key em src/api_client.py:14 — mover para Maestro Credentials
2. CPF logado sem mascaramento em src/services/customer.py:47 — aplicar mask_cpf()
### Important (3)
...
### Suggested order
1. Corrigir Criticals (segurança)
2. Importants 1-3 (confiabilidade)
3. Niceties podem esperar
Qual você quer que eu trate primeiro?
Configurar credenciais e DataPool¶
A skill gera o padrão canônico de bootstrap com fallback para desenvolvimento local:
BotMaestroSDK.RAISE_NOT_CONNECTED = False
maestro = BotMaestroSDK.from_sys_args()
def get_secret(label: str, key: str) -> str:
try:
return maestro.get_credential(label=label, key=key)
except Exception:
load_dotenv()
value = os.getenv(f"{label.upper()}_{key.upper()}")
if not value:
raise CredentialError(f"Missing credential: {label}/{key}")
return value
Para consumo de DataPool com tratamento de erro em três níveis:
pool = maestro.get_datapool(label="invoices_to_process")
while pool.has_next():
entry = pool.next(task_id=maestro.task_id)
if entry is None:
break
try:
item = InvoiceItem.model_validate(entry.values)
service.process_invoice(item)
entry.report_done()
except BusinessError as e:
entry.report_error(message=str(e))
except FatalError:
entry.unhold()
raise
Atenção
Em caso de FatalError, chame entry.unhold() antes de re-lançar a exceção. Sem isso, o item fica retido no pool e é perdido.
Resultado esperado¶
Ao usar a skill botcity-python-pro, seu projeto terá:
requirements.txtcom todas as dependências de runtime pinadas com==, sem ferramentas de dev- Separação em três camadas:
pages/(UI/seletores),services/(lógica de negócio),domain/(modelos Pydantic) - Hierarquia de exceções customizadas:
RecoverableError,BusinessError,FatalError - Credenciais consumidas via Maestro SDK com fallback
.envpara execução local - Dados de entrada validados com Pydantic antes de qualquer processamento
- PII (CPF, e-mail, tokens) mascarados em logs e artifacts
- Type hints aplicados com rigor em
services/edomain/, tolerantes empages/ - Testes unitários cobrindo 60-70% de
services/,domain/eutils/