fp-async
Faz seu agente usar padrões para lidar com operações assíncronas. Ajuda a escrever código mais limpo e organizado, evitando erros.
O que ela faz
Esta ferramenta ajuda a organizar e gerenciar operações assíncronas (que levam tempo para serem concluídas) em seu código, especialmente quando elas podem falhar. Ela usa um método chamado `TaskEither` para garantir que os erros sejam tratados de forma clara e organizada, evitando confusão.
Quando usar
- ✓Quando você precisa lidar com operações que demoram, como buscar dados de uma API ou salvar informações em um banco de dados.
- ✓Se você está tendo dificuldades em organizar o tratamento de erros em seu código assíncrono, com muitos blocos `try/catch` aninhados.
- ✓Para criar sequências de operações assíncronas que precisam ser executadas em ordem e ter seus erros gerenciados de forma consistente.
Exemplo do que pedir para a IA
“Como posso usar `TaskEither` para buscar dados de uma API e garantir que os erros de rede sejam tratados?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
A ferramenta usa `TaskEither`, que é como uma caixa que pode conter um resultado bem-sucedido ou um erro. Ela permite encadear operações assíncronas, garantindo que, se uma falhar, o erro seja capturado e tratado de forma limpa, sem interromper o fluxo do programa.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add sickn33/agentic-awesome-skills --skill fp-asyncOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/fp-async/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Padrões Assíncronos Práticos com fp-ts
Pare de escrever blocos try/catch aninhados. Pare de perder o contexto de erros. Comece a construir pipelines assíncronos limpos que tratam erros adequadamente.
TaskEither é simplesmente uma operação assíncrona que rastreia sucesso ou falha. É só isso. Não é necessária terminologia complicada.
Guia Detalhado
Leia o guia detalhado antes de executar esta habilidade. Ele retém o procedimento completo e o material de referência. Trate seus requisitos de segurança, pré-requisitos e validação como obrigatórios. Para um trabalho focado, carregue as seções relevantes; para um trabalho de ponta a ponta, leia o guia completamente.
Quando Usar
- Você precisa de tratamento de erros assíncronos em TypeScript com
TaskEither. - A tarefa envolve encapsular Promises, compor chamadas de API ou substituir fluxos
try/catchaninhados. - Você quer padrões assíncronos práticos de fp-ts em vez de explicações acadêmicas.
// TaskEither<Error, User> means:
// "An async operation that either fails with Error or succeeds with User"
5. Exemplos Reais de API
Wrapper Completo de Fetch
// types.ts
interface ApiError {
code: string
message: string
status: number
details?: unknown
}
// api.ts
const createApiError = (
code: string,
message: string,
status: number,
details?: unknown
): ApiError => ({ code, message, status, details })
const request = <T>(
url: string,
options: RequestInit = {}
): TE.TaskEither<ApiError, T> =>
TE.tryCatch(
async () => {
const response = await fetch(url, {
headers: {
'Content-Type': 'application/json',
...options.headers,
},
...options,
})
if (!response.ok) {
const body = await response.json().catch(() => ({}))
throw createApiError(
body.code || 'HTTP_ERROR',
body.message || response.statusText,
response.status,
body
)
}
// Handle 204 No Content
if (response.status === 204) {
return undefined as T
}
return response.json()
},
(error): ApiError => {
if (typeof error === 'object' && error !== null && 'code' in error) {
return error as ApiError
}
return createApiError(
'NETWORK_ERROR',
error instanceof Error ? error.message : 'Request failed',
0
)
}
)
// API client
const api = {
get: <T>(url: string) => request<T>(url),
post: <T>(url: string, body: unknown) =>
request<T>(url, {
method: 'POST',
body: JSON.stringify(body)
}),
put: <T>(url: string, body: unknown) =>
request<T>(url, {
method: 'PUT',
body: JSON.stringify(body)
}),
delete: (url: string) =>
request<void>(url, { method: 'DELETE' }),
}
// Usage
const getUser = (id: string) => api.get<User>(`/api/users/${id}`)
const createUser = (data: CreateUserDto) => api.post<User>('/api/users', data)
const updateUser = (id: string, data: UpdateUserDto) => api.put<User>(`/api/users/${id}`, data)
const deleteUser = (id: string) => api.delete(`/api/users/${id}`)
Operações de Banco de Dados (Exemplo Prisma)
import { PrismaClient, Prisma } from '@prisma/client'
type DbError =
| { _tag: 'NotFound'; entity: string; id: string }
| { _tag: 'UniqueViolation'; field: string }
| { _tag: 'ConnectionError'; cause: unknown }
const prisma = new PrismaClient()
const wrapPrisma = <T>(
operation: () => Promise<T>
): TE.TaskEither<DbError, T> =>
TE.tryCatch(
operation,
(error): DbError => {
if (error instanceof Prisma.PrismaClientKnownRequestError) {
if (error.code === 'P2002') {
const field = (error.meta?.target as string[])?.join(', ') || 'unknown'
return { _tag: 'UniqueViolation', field }
}
if (error.code === 'P2025') {
return { _tag: 'NotFound', entity: 'Record', id: 'unknown' }
}
}
return { _tag: 'ConnectionError', cause: error }
}
)
// Padrão de repositório
const userRepository = {
findById: (id: string): TE.TaskEither<DbError, User> =>
pipe(
wrapPrisma(() => prisma.user.findUnique({ where: { id } })),
TE.chain(user =>
user
? TE.right(user)
: TE.left({ _tag: 'NotFound', entity: 'User', id })
)
),
findByEmail: (email: string): TE.TaskEither<DbError, User | null> =>
wrapPrisma(() => prisma.user.findUnique({ where: { email } })),
create: (data: CreateUserInput): TE.TaskEither<DbError, User> =>
…
Perguntas frequentes
O que é `TaskEither`?
`TaskEither` é uma forma de representar uma operação assíncrona que pode ter sucesso ou falhar. Pense nele como um pacote que contém ou o resultado esperado ou uma descrição do erro que ocorreu.
Por que usar isso em vez de `try/catch`?
Usar `TaskEither` ajuda a evitar muitos blocos `try/catch` aninhados, que podem tornar o código confuso. Ele oferece uma maneira mais estruturada e clara de lidar com erros em operações assíncronas.
Preciso saber programação avançada para usar isso?
Não necessariamente. Embora use alguns conceitos de programação funcional, a ideia principal é simplificar o tratamento de erros em operações que levam tempo para serem concluídas, tornando o código mais legível.
Detalhes
Descrição original do autor
Practical async patterns using TaskEither - clean pipelines instead of try/catch hell, with real API examples
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #3024
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
api-connector-builder
Faz seu agente construir novas conexões com APIs seguindo o padrão já existente. Use quando precisar adicionar mais uma integração sem criar um novo jeito de fazer.
affaan-m/ECC
api-design
Ajuda seu agente a projetar APIs REST seguindo as melhores práticas. É útil para definir como as APIs se comunicam, como os erros são mostrados e como organizar os dados.
affaan-m/ECC
backend-patterns
Ajuda seu agente com padrões de arquitetura do lado do servidor e otimização de banco de dados. É útil para construir ou revisar o código que roda no servidor.
affaan-m/ECC