Feature Rollout no terminal
Referência completa da CLI oficial: instalação, login, sintaxe, flags, arquivos de entrada e respostas para cada comando de gestão disponível.
Instalar e vincular
curl -fsSL https://feature-rollout.dev/cli/install.sh | bash
fr login
fr whoamiRequisitos e atualização
NODE.JSPLATAFORMAVERSÃOATUALIZARAjuda, versão e autenticação
O login usa um código temporário confirmado no navegador. A credencial fica em ~/.config/feature-rollout/credentials.json com permissão 0600, dura 90 dias e pode ser revogada pelo terminal.
fr --version
Imprime a versão instalada; use este valor ao diagnosticar compatibilidade ou atualizar o binário.
shellfr --versiontext0.6.0fr --help
Lista recursos, convenções de entrada, variáveis de ambiente e comandos de identidade.
shellfr --helptextFeature Rollout CLI 0.6.0
Uso:
fr login [--host URL] [--no-open]
fr <recurso> <ação> [opções]
fr help <recurso>fr help <recurso>
Mostra todas as ações, identificadores e formatos de entrada aceitos por um recurso.
shellfr help featuretextFeature Rollout CLI 0.6.0 · feature
fr feature list --portfolio
fr feature create --portfolio --data JSON | --input ARQUIVO
fr feature get --feature
fr feature update --feature --data JSON | --input ARQUIVO
fr feature delete --feature --confirm VALORfr login
Inicia o device flow, abre o navegador e salva o token pessoal somente após sua aprovação.
--no-open- Não abre o navegador automaticamente.
--host- Usa outra origem da plataforma.
shellfr logintextConfirme este código no navegador:
FR-W7KM-2Q9P
https://feature-rollout.dev/cli/auth?code=FR-W7KM-2Q9P
Navegador aberto. Aguardando autorização…
Autenticado com sucesso como leo@contafacil.com.fr whoami
Mostra a conta vinculada, a origem da plataforma e as empresas acessíveis. O alias fr status executa a mesma consulta.
--json- Imprime a identidade completa em JSON.
--host- Consulta outra origem da plataforma.
shellfr whoamitextLeonardo Caldas <leo@contafacil.com>
Plataforma: https://feature-rollout.dev
Workspaces:
conta-facil · Conta Fácil (owner)fr logout
Revoga a sessão pessoal no servidor e remove a credencial salva na máquina.
--host- Revoga a sessão salva para outra origem.
shellfr logouttextSessão removida de https://feature-rollout.dev.Como passar dados
Os exemplos usam arquivos JSON porque são mais fáceis de revisar e versionar. Para alterações pequenas, substitua --input arquivo.json por --data '{"campo":"valor"}'. Nunca use os dois na mesma chamada.
--input ARQUIVO--data JSON--confirm VALOR--host URLFEATURE_ROLLOUT_URLFEATURE_ROLLOUT_TOKENSaídas, erros e exit codes
Resultados são impressos como JSON formatado. Downloads imprimem o caminho salvo e exclusões bem-sucedidas retornam Operação concluída.. Qualquer falha escreve uma mensagem em stderr e encerra com status diferente de zero, adequado para scripts.
Erro: VALIDATION_FAILED: A entrada não atende ao contrato da operação. · requestId req_01J5…
$ echo $?
1Guarde o requestId exibido em erros; ele identifica a chamada nos logs da plataforma.
Empresas
Crie e administre empresas, consulte os projetos associados e remova uma empresa com confirmação explícita.
fr company5 ações documentadasfr company list
Lista empresas acessíveis no escopo informado.
shellfr company listjson{
"companies": [
{
"id": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "conta-facil",
"name": "Conta Fácil",
"kind": "Empresa",
"role": "owner",
"canManage": true,
"projectCount": 3
}
]
}fr company create
Cria um novo recurso a partir de um documento JSON.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr company create --input company-create.jsonjson{
"name": "Conta Fácil"
}json{
"company": {
"id": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "conta-facil",
"name": "Conta Fácil",
"kind": "Empresa",
"role": "owner",
"canManage": true,
"projectCount": 3
}
}fr company get
Obtém o recurso e seus relacionamentos visíveis.
--company- Slug ou UUID da empresa.
shellfr company get --companyjson{
"company": {
"id": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "conta-facil",
"name": "Conta Fácil",
"kind": "Empresa",
"role": "owner",
"canManage": true,
"projectCount": 3
}
}fr company update
Atualiza somente os campos enviados no documento JSON.
--company- Slug ou UUID da empresa.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr company update --company --input company-update.jsonjson{
"name": "Conta Fácil Brasil"
}json{
"company": {
"id": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "conta-facil",
"name": "Conta Fácil Brasil",
"kind": "Empresa",
"role": "owner",
"canManage": true,
"projectCount": 3
}
}fr company delete
Exclui o recurso após validar a confirmação explícita.
--company- Slug ou UUID da empresa.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr company delete --company --confirm "Conta Fácil"textOperação concluída.Projetos
Liste, crie, edite, transfira ou exclua projetos dentro das empresas autorizadas.
fr project6 ações documentadasfr project list
Lista projetos acessíveis no escopo informado.
--company- Slug ou UUID da empresa.
shellfr project list --companyjson{
"workspace": {
"id": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "conta-facil",
"name": "Conta Fácil",
"kind": "Empresa",
"role": "owner",
"canManage": true,
"projectCount": 3
},
"projects": [
{
"id": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"workspaceId": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "checkout",
"name": "Checkout",
"description": "Jornada de pagamento do e-commerce.",
"portfolioCount": 1
}
]
}fr project create
Cria um novo recurso a partir de um documento JSON.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr project create --input project-create.jsonjson{
"workspace": "conta-facil",
"name": "Checkout",
"description": "Jornada de pagamento do e-commerce."
}json{
"project": {
"id": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"workspaceId": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "checkout",
"name": "Checkout",
"description": "Jornada de pagamento do e-commerce.",
"portfolioCount": 1,
"workspace": "conta-facil"
}
}fr project get
Obtém o recurso e seus relacionamentos visíveis.
--project- UUID do projeto.
shellfr project get --projectjson{
"project": {
"id": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"workspaceId": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "checkout",
"name": "Checkout",
"description": "Jornada de pagamento do e-commerce.",
"portfolioCount": 1
}
}fr project update
Atualiza somente os campos enviados no documento JSON.
--project- UUID do projeto.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr project update --project --input project-update.jsonjson{
"name": "Checkout & Pagamentos",
"description": "Plataforma de pagamentos."
}json{
"project": {
"id": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"workspaceId": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "checkout",
"name": "Checkout & Pagamentos",
"description": "Plataforma de pagamentos.",
"portfolioCount": 1
}
}fr project delete
Exclui o recurso após validar a confirmação explícita.
--project- UUID do projeto.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr project delete --project --confirm "Checkout"textOperação concluída.fr project transfer
Move o projeto e seus descendentes para outra empresa autorizada.
--project- UUID do projeto.
--to- Slug ou UUID da empresa de destino.
--confirm- Nome atual do projeto.
shellfr project transfer --project --to plataforma-brasil --confirm "Checkout"json{
"transfer": {
"workspaceSlug": "plataforma-brasil",
"workspaceName": "Plataforma Brasil",
"featureId": "FEAT-142"
}
}Portfólios
Gerencie as aplicações ou produtos que organizam features, documentos, ambientes e repositórios.
fr portfolio5 ações documentadasfr portfolio list
Lista portfólios acessíveis no escopo informado.
--project- UUID do projeto.
shellfr portfolio list --projectjson{
"project": {
"id": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"workspaceId": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "checkout",
"name": "Checkout",
"description": "Jornada de pagamento do e-commerce.",
"portfolioCount": 1
},
"portfolios": [
{
"id": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"projectId": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"slug": "checkout-web",
"name": "Checkout Web",
"description": "Aplicação do checkout."
}
]
}fr portfolio create
Cria um novo recurso a partir de um documento JSON.
--project- UUID do projeto.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr portfolio create --project --input portfolio-create.jsonjson{
"name": "Checkout Web",
"description": "Aplicação do checkout.",
"repository": "conta-facil/checkout",
"defaultBranch": "main"
}json{
"portfolio": {
"id": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"projectId": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"slug": "checkout-web",
"name": "Checkout Web",
"description": "Aplicação do checkout.",
"repository": "conta-facil/checkout",
"defaultBranch": "main"
}
}fr portfolio get
Obtém o recurso e seus relacionamentos visíveis.
--portfolio- UUID do portfólio.
shellfr portfolio get --portfoliojson{
"portfolio": {
"id": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"projectId": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"slug": "checkout-web",
"name": "Checkout Web",
"description": "Aplicação do checkout."
}
}fr portfolio update
Atualiza somente os campos enviados no documento JSON.
--portfolio- UUID do portfólio.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr portfolio update --portfolio --input portfolio-update.jsonjson{
"name": "Checkout Omnichannel",
"description": "Checkout web e mobile."
}json{
"portfolio": {
"id": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"projectId": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"slug": "checkout-web",
"name": "Checkout Omnichannel",
"description": "Checkout web e mobile."
}
}fr portfolio delete
Exclui o recurso após validar a confirmação explícita.
--portfolio- UUID do portfólio.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr portfolio delete --portfolio --confirm "Checkout Web"textOperação concluída.Features
Gerencie unidades de entrega planejada e todo o contexto de prontidão associado.
fr feature5 ações documentadasfr feature list
Lista features acessíveis no escopo informado.
--portfolio- UUID do portfólio.
shellfr feature list --portfoliojson{
"portfolio": {
"id": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"projectId": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"slug": "checkout-web",
"name": "Checkout Web",
"description": "Aplicação do checkout."
},
"features": [
{
"id": "FEAT-142",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"kind": "feature",
"useCase": "Pagamento com Pix",
"name": "Pix no checkout",
"status": "Em progresso",
"score": 72,
"deployWindow": "2026-08-21 22:00 BRT"
}
]
}fr feature create
Cria um novo recurso a partir de um documento JSON.
--portfolio- UUID do portfólio.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr feature create --portfolio --input feature-create.jsonjson{
"id": "FEAT-142",
"useCase": "Pagamento com Pix",
"name": "Pix no checkout",
"description": "Permite concluir a compra por Pix.",
"kind": "feature",
"status": "Em progresso",
"score": 72,
"deployWindow": "2026-08-21 22:00 BRT"
}json{
"feature": {
"id": "FEAT-142",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"kind": "feature",
"useCase": "Pagamento com Pix",
"name": "Pix no checkout",
"status": "Em progresso",
"score": 72,
"deployWindow": "2026-08-21 22:00 BRT",
"description": "Permite concluir a compra por Pix."
}
}fr feature get
Obtém o recurso e seus relacionamentos visíveis.
--feature- ID de negócio da feature ou hotfix.
shellfr feature get --featurejson{
"feature": {
"id": "FEAT-142",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"kind": "feature",
"useCase": "Pagamento com Pix",
"name": "Pix no checkout",
"status": "Em progresso",
"score": 72,
"deployWindow": "2026-08-21 22:00 BRT"
}
}fr feature update
Atualiza somente os campos enviados no documento JSON.
--feature- ID de negócio da feature ou hotfix.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr feature update --feature --input feature-update.jsonjson{
"status": "Pronta para rollout",
"score": 94,
"deployWindow": "2026-08-21 22:00 BRT"
}json{
"feature": {
"id": "FEAT-142",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"kind": "feature",
"useCase": "Pagamento com Pix",
"name": "Pix no checkout",
"status": "Pronta para rollout",
"score": 94,
"deployWindow": "2026-08-21 22:00 BRT"
}
}fr feature delete
Exclui o recurso após validar a confirmação explícita.
--feature- ID de negócio da feature ou hotfix.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr feature delete --feature --confirm FEAT-142textOperação concluída.Hotfixes
Use os mesmos contratos de feature com o tipo hotfix aplicado e filtrado automaticamente pela CLI.
fr hotfix5 ações documentadasfr hotfix list
Lista hotfixes acessíveis no escopo informado.
--portfolio- UUID do portfólio.
shellfr hotfix list --portfoliojson{
"portfolio": {
"id": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"projectId": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"slug": "checkout-web",
"name": "Checkout Web",
"description": "Aplicação do checkout."
},
"features": [
{
"id": "FIX-031",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"kind": "hotfix",
"useCase": "Recuperar checkout",
"name": "Corrigir timeout do Pix",
"status": "Em validação",
"score": 88,
"deployWindow": "imediata"
}
]
}fr hotfix create
Cria um novo recurso a partir de um documento JSON.
--portfolio- UUID do portfólio.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr hotfix create --portfolio --input hotfix-create.jsonjson{
"id": "FIX-031",
"useCase": "Pagamento com Pix",
"name": "Corrigir timeout do Pix",
"description": "Permite concluir a compra por Pix.",
"kind": "hotfix",
"status": "Em progresso",
"score": 72,
"deployWindow": "2026-08-21 22:00 BRT"
}json{
"feature": {
"id": "FIX-031",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"kind": "hotfix",
"useCase": "Pagamento com Pix",
"name": "Corrigir timeout do Pix",
"status": "Em progresso",
"score": 72,
"deployWindow": "2026-08-21 22:00 BRT",
"description": "Permite concluir a compra por Pix."
}
}fr hotfix get
Obtém o recurso e seus relacionamentos visíveis.
--feature- ID de negócio da feature ou hotfix.
shellfr hotfix get --featurejson{
"feature": {
"id": "FIX-031",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"kind": "hotfix",
"useCase": "Recuperar checkout",
"name": "Corrigir timeout do Pix",
"status": "Em validação",
"score": 88,
"deployWindow": "imediata"
}
}fr hotfix update
Atualiza somente os campos enviados no documento JSON.
--feature- ID de negócio da feature ou hotfix.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr hotfix update --feature --input hotfix-update.jsonjson{
"status": "Pronta para rollout",
"score": 94,
"deployWindow": "2026-08-21 22:00 BRT",
"kind": "hotfix"
}json{
"feature": {
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"kind": "hotfix",
"useCase": "Recuperar checkout",
"status": "Pronta para rollout",
"score": 94,
"deployWindow": "2026-08-21 22:00 BRT"
}
}fr hotfix delete
Exclui o recurso após validar a confirmação explícita.
--feature- ID de negócio da feature ou hotfix.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr hotfix delete --feature --confirm FIX-031textOperação concluída.Ambientes
Leia ou substitua o catálogo de serviços e estados de local, homologação e produção.
fr environment2 ações documentadasfr environment get
Obtém o recurso e seus relacionamentos visíveis.
--portfolio- UUID do portfólio.
shellfr environment get --portfoliojson{
"categories": [
{
"key": "payments",
"label": "Pagamentos",
"groups": [
{
"title": "APIs",
"detailALabel": "Versão",
"detailBLabel": "Região",
"rows": [
{
"name": "checkout-api",
"description": "Orquestra pagamentos do checkout.",
"detailA": "v2.8.0",
"detailB": "sa-east-1",
"local": {
"value": "Disponível",
"tone": "good"
},
"homologation": {
"value": "Disponível",
"tone": "good"
},
"production": {
"value": "Mudança pendente",
"tone": "warn"
},
"service": "checkout-api"
}
]
}
]
}
]
}fr environment replace
Substitui integralmente o catálogo atual pelo JSON informado.
--portfolio- UUID do portfólio.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr environment replace --portfolio --input environment-replace.jsonjson{
"categories": [
{
"key": "payments",
"label": "Pagamentos",
"groups": [
{
"title": "APIs",
"detailALabel": "Versão",
"detailBLabel": "Região",
"rows": [
{
"name": "checkout-api",
"description": "Orquestra pagamentos do checkout.",
"detailA": "v2.8.0",
"detailB": "sa-east-1",
"local": {
"value": "Disponível",
"tone": "good"
},
"homologation": {
"value": "Disponível",
"tone": "good"
},
"production": {
"value": "Mudança pendente",
"tone": "warn"
},
"service": "checkout-api"
}
]
}
]
}
]
}json{
"categories": [
{
"key": "payments",
"label": "Pagamentos",
"groups": [
{
"title": "APIs",
"detailALabel": "Versão",
"detailBLabel": "Região",
"rows": [
{
"name": "checkout-api",
"description": "Orquestra pagamentos do checkout.",
"detailA": "v2.8.0",
"detailB": "sa-east-1",
"local": {
"value": "Disponível",
"tone": "good"
},
"homologation": {
"value": "Disponível",
"tone": "good"
},
"production": {
"value": "Mudança pendente",
"tone": "warn"
},
"service": "checkout-api"
}
]
}
]
}
]
}Loops de verificação
Defina sequências locais ou globais de prompts, checks e scripts para validação repetível.
fr loop5 ações documentadasfr loop list
Lista loops de verificação acessíveis no escopo informado.
--portfolio- UUID do portfólio.
shellfr loop list --portfoliojson{
"canManage": true,
"loops": [
{
"id": "cc65d1b5-6bee-4024-9d27-3623ba83491d",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"scope": "local",
"name": "Revisão antes do merge",
"description": "Valida implementação e testes.",
"steps": [
{
"title": "Executar testes",
"kind": "code",
"script": "npm test"
}
]
}
]
}fr loop create
Cria um novo recurso a partir de um documento JSON.
--portfolio- UUID do portfólio.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr loop create --portfolio --input loop-create.jsonjson{
"name": "Revisão antes do merge",
"description": "Valida implementação e testes.",
"scope": "local",
"steps": [
{
"title": "Executar testes",
"kind": "code",
"script": "npm test",
"prompt": "",
"question": "",
"expectedType": "boolean",
"expectedValue": "",
"repeatMode": "once",
"repeatCount": null
}
]
}json{
"loop": {
"id": "cc65d1b5-6bee-4024-9d27-3623ba83491d",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"scope": "local",
"name": "Revisão antes do merge",
"description": "Valida implementação e testes.",
"steps": [
{
"title": "Executar testes",
"kind": "code",
"script": "npm test",
"prompt": "",
"question": "",
"expectedType": "boolean",
"expectedValue": "",
"repeatMode": "once",
"repeatCount": null
}
]
}
}fr loop get
Obtém o recurso e seus relacionamentos visíveis.
--loop- UUID do loop de verificação.
shellfr loop get --loopjson{
"loop": {
"id": "cc65d1b5-6bee-4024-9d27-3623ba83491d",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"scope": "local",
"name": "Revisão antes do merge",
"description": "Valida implementação e testes.",
"steps": [
{
"title": "Executar testes",
"kind": "code",
"script": "npm test"
}
]
}
}fr loop update
Atualiza somente os campos enviados no documento JSON.
--loop- UUID do loop de verificação.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr loop update --loop --input loop-update.jsonjson{
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"name": "Revisão antes do rollout",
"description": "Valida o release completo.",
"scope": "local",
"steps": [
{
"title": "Score mínimo",
"kind": "check",
"prompt": "",
"script": "",
"question": "O score de prontidão é suficiente?",
"expectedType": "min_score",
"expectedValue": "90",
"repeatMode": "until_resolved",
"repeatCount": null
}
]
}json{
"loop": {
"id": "cc65d1b5-6bee-4024-9d27-3623ba83491d",
"applicationId": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"scope": "local",
"name": "Revisão antes do rollout",
"description": "Valida o release completo.",
"steps": [
{
"title": "Score mínimo",
"kind": "check",
"prompt": "",
"script": "",
"question": "O score de prontidão é suficiente?",
"expectedType": "min_score",
"expectedValue": "90",
"repeatMode": "until_resolved",
"repeatCount": null
}
]
}
}fr loop delete
Exclui o recurso após validar a confirmação explícita.
--loop- UUID do loop de verificação.
shellfr loop delete --looptextOperação concluída.Fases
Organize a implementação da feature em fases ordenadas e acompanhe suas tarefas.
fr phase5 ações documentadasfr phase list
Lista fases acessíveis no escopo informado.
--feature- ID de negócio da feature ou hotfix.
shellfr phase list --featurejson{
"phases": [
{
"id": "15f8c035-c4f6-4314-b61d-6471c7a0a499",
"featureId": "FEAT-142",
"key": "observability",
"title": "Observabilidade",
"status": "Em progresso",
"position": 3
}
]
}fr phase create
Cria um novo recurso a partir de um documento JSON.
--feature- ID de negócio da feature ou hotfix.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr phase create --feature --input phase-create.jsonjson{
"key": "observability",
"title": "Observabilidade",
"description": "Métricas, logs e alertas.",
"status": "Em progresso",
"position": 3
}json{
"phase": {
"id": "15f8c035-c4f6-4314-b61d-6471c7a0a499",
"featureId": "FEAT-142",
"key": "observability",
"title": "Observabilidade",
"status": "Em progresso",
"position": 3,
"description": "Métricas, logs e alertas."
}
}fr phase get
Obtém o recurso e seus relacionamentos visíveis.
--phase- UUID da fase.
shellfr phase get --phasejson{
"phase": {
"id": "15f8c035-c4f6-4314-b61d-6471c7a0a499",
"featureId": "FEAT-142",
"key": "observability",
"title": "Observabilidade",
"status": "Em progresso",
"position": 3
}
}fr phase update
Atualiza somente os campos enviados no documento JSON.
--phase- UUID da fase.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr phase update --phase --input phase-update.jsonjson{
"status": "Concluída",
"position": 3
}json{
"phase": {
"id": "15f8c035-c4f6-4314-b61d-6471c7a0a499",
"featureId": "FEAT-142",
"key": "observability",
"title": "Observabilidade",
"status": "Concluída",
"position": 3
}
}fr phase delete
Exclui o recurso após validar a confirmação explícita.
--phase- UUID da fase.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr phase delete --phase --confirm 15f8c035-c4f6-4314-b61d-6471c7a0a499textOperação concluída.Tarefas
Crie trabalho executável com detalhes, critérios de aceite, progresso e fase responsável.
fr task5 ações documentadasfr task list
Lista tarefas acessíveis no escopo informado.
--feature- ID de negócio da feature ou hotfix.
shellfr task list --featurejson{
"tasks": [
{
"id": "TASK-318",
"featureId": "FEAT-142",
"phaseId": "15f8c035-c4f6-4314-b61d-6471c7a0a499",
"title": "Adicionar alerta de erro Pix",
"area": "Observabilidade",
"status": "Concluída",
"progress": 100
}
]
}fr task create
Cria um novo recurso a partir de um documento JSON.
--feature- ID de negócio da feature ou hotfix.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr task create --feature --input task-create.jsonjson{
"id": "TASK-318",
"title": "Adicionar alerta de erro Pix",
"description": "Alertar falhas acima do baseline.",
"implementationDetails": "Criar alerta no serviço checkout-api.",
"acceptanceCriteria": [
"Alerta dispara acima de 2%",
"Runbook está vinculado"
],
"phaseId": "15f8c035-c4f6-4314-b61d-6471c7a0a499",
"status": "Não iniciada",
"progress": 0,
"remainingWork": "Implementar e validar em homologação."
}json{
"task": {
"id": "TASK-318",
"featureId": "FEAT-142",
"phaseId": "15f8c035-c4f6-4314-b61d-6471c7a0a499",
"title": "Adicionar alerta de erro Pix",
"area": "Observabilidade",
"status": "Não iniciada",
"progress": 0,
"description": "Alertar falhas acima do baseline.",
"implementationDetails": "Criar alerta no serviço checkout-api.",
"acceptanceCriteria": [
"Alerta dispara acima de 2%",
"Runbook está vinculado"
],
"remainingWork": "Implementar e validar em homologação."
}
}fr task get
Obtém o recurso e seus relacionamentos visíveis.
--task- ID de negócio da tarefa.
shellfr task get --taskjson{
"task": {
"id": "TASK-318",
"featureId": "FEAT-142",
"phaseId": "15f8c035-c4f6-4314-b61d-6471c7a0a499",
"title": "Adicionar alerta de erro Pix",
"area": "Observabilidade",
"status": "Concluída",
"progress": 100
}
}fr task update
Atualiza somente os campos enviados no documento JSON.
--task- ID de negócio da tarefa.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr task update --task --input task-update.jsonjson{
"status": "Concluída",
"progress": 100,
"remainingWork": ""
}json{
"task": {
"id": "TASK-318",
"featureId": "FEAT-142",
"phaseId": "15f8c035-c4f6-4314-b61d-6471c7a0a499",
"title": "Adicionar alerta de erro Pix",
"area": "Observabilidade",
"status": "Concluída",
"progress": 100,
"remainingWork": ""
}
}fr task delete
Exclui o recurso após validar a confirmação explícita.
--task- ID de negócio da tarefa.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr task delete --task --confirm TASK-318textOperação concluída.Cenários
Modele resultados verificáveis de uma feature e atualize o estado de execução.
fr scenario4 ações documentadasfr scenario list
Lista cenários acessíveis no escopo informado.
--feature- ID de negócio da feature ou hotfix.
shellfr scenario list --featurejson{
"scenarios": [
{
"id": "SCN-PIX-01",
"featureId": "FEAT-142",
"title": "Cliente paga com Pix aprovado",
"result": "PASS",
"meta": "Validado em homologação"
}
]
}fr scenario create
Cria um novo recurso a partir de um documento JSON.
--feature- ID de negócio da feature ou hotfix.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr scenario create --feature --input scenario-create.jsonjson{
"id": "SCN-PIX-01",
"title": "Cliente paga com Pix aprovado",
"result": "PEND",
"meta": "Aguardando execução em homologação"
}json{
"scenario": {
"id": "SCN-PIX-01",
"featureId": "FEAT-142",
"title": "Cliente paga com Pix aprovado",
"result": "PEND",
"meta": "Aguardando execução em homologação"
}
}fr scenario update
Atualiza somente os campos enviados no documento JSON.
--scenario- ID de negócio do cenário.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr scenario update --scenario --input scenario-update.jsonjson{
"result": "PASS",
"meta": "Validado em homologação"
}json{
"scenario": {
"id": "SCN-PIX-01",
"featureId": "FEAT-142",
"title": "Cliente paga com Pix aprovado",
"result": "PASS",
"meta": "Validado em homologação"
}
}fr scenario delete
Exclui o recurso após validar a confirmação explícita.
--scenario- ID de negócio do cenário.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr scenario delete --scenario --confirm SCN-PIX-01textOperação concluída.Testes
Vincule casos de teste a cenários e registre seu último estado de verificação.
fr test5 ações documentadasfr test list
Lista testes acessíveis no escopo informado.
--feature- ID de negócio da feature ou hotfix.
shellfr test list --featurejson{
"tests": [
{
"id": "2620c03f-a154-48fa-b271-99653815a974",
"featureId": "FEAT-142",
"scenarioId": "SCN-PIX-01",
"stableKey": "checkout.pix.success",
"name": "conclui pagamento Pix",
"testType": "e2e",
"verificationStatus": "passed"
}
]
}fr test create
Cria um novo recurso a partir de um documento JSON.
--feature- ID de negócio da feature ou hotfix.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr test create --feature --input test-create.jsonjson{
"scenarioId": "SCN-PIX-01",
"stableKey": "checkout.pix.success",
"name": "conclui pagamento Pix",
"suite": [
"checkout",
"pix"
],
"filePath": "tests/e2e/pix.spec.ts",
"testType": "e2e",
"tags": [
"critical"
],
"labels": {
"layer": "checkout"
},
"verificationStatus": "passed",
"verificationNote": "Executado no commit a73dab5."
}json{
"test": {
"id": "2620c03f-a154-48fa-b271-99653815a974",
"featureId": "FEAT-142",
"scenarioId": "SCN-PIX-01",
"stableKey": "checkout.pix.success",
"name": "conclui pagamento Pix",
"testType": "e2e",
"verificationStatus": "passed",
"suite": [
"checkout",
"pix"
],
"filePath": "tests/e2e/pix.spec.ts",
"tags": [
"critical"
],
"labels": {
"layer": "checkout"
},
"verificationNote": "Executado no commit a73dab5."
}
}fr test get
Obtém o recurso e seus relacionamentos visíveis.
--test- UUID do caso de teste.
shellfr test get --testjson{
"test": {
"id": "2620c03f-a154-48fa-b271-99653815a974",
"featureId": "FEAT-142",
"scenarioId": "SCN-PIX-01",
"stableKey": "checkout.pix.success",
"name": "conclui pagamento Pix",
"testType": "e2e",
"verificationStatus": "passed"
}
}fr test update
Atualiza somente os campos enviados no documento JSON.
--test- UUID do caso de teste.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr test update --test --input test-update.jsonjson{
"verificationStatus": "passed",
"verificationNote": "Revalidado em homologação."
}json{
"test": {
"id": "2620c03f-a154-48fa-b271-99653815a974",
"featureId": "FEAT-142",
"scenarioId": "SCN-PIX-01",
"stableKey": "checkout.pix.success",
"name": "conclui pagamento Pix",
"testType": "e2e",
"verificationStatus": "passed",
"verificationNote": "Revalidado em homologação."
}
}fr test delete
Exclui o recurso após validar a confirmação explícita.
--test- UUID do caso de teste.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr test delete --test --confirm 2620c03f-a154-48fa-b271-99653815a974textOperação concluída.Evidências e revisões
Registre provas, atualize metadados e grave revisões independentes aprovando ou rejeitando a evidência.
fr evidence6 ações documentadasfr evidence list
Lista evidências e revisões acessíveis no escopo informado.
--feature- ID de negócio da feature ou hotfix.
shellfr evidence list --featurejson{
"evidences": [
{
"id": 91,
"featureId": "FEAT-142",
"kind": "test-report",
"title": "Relatório E2E do Pix",
"doubleChecked": true,
"scenarioRef": "SCN-PIX-01"
}
]
}fr evidence create
Cria um novo recurso a partir de um documento JSON.
--feature- ID de negócio da feature ou hotfix.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr evidence create --feature --input evidence-create.jsonjson{
"kind": "test-report",
"title": "Relatório E2E do Pix",
"description": "Execução do fluxo aprovado.",
"doubleChecked": false,
"scenarioRef": "SCN-PIX-01",
"meta": "commit a73dab5",
"payloadType": "text",
"contentType": "text/plain",
"content": "12 testes passaram",
"encoding": "utf8",
"sourcePath": "artifacts/e2e.txt"
}json{
"evidence": {
"id": 91,
"featureId": "FEAT-142",
"kind": "test-report",
"title": "Relatório E2E do Pix",
"doubleChecked": false,
"scenarioRef": "SCN-PIX-01",
"description": "Execução do fluxo aprovado.",
"meta": "commit a73dab5",
"payloadType": "text",
"contentType": "text/plain",
"content": "12 testes passaram",
"encoding": "utf8",
"sourcePath": "artifacts/e2e.txt"
}
}fr evidence update
Atualiza somente os campos enviados no documento JSON.
--evidence- ID numérico da evidência.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr evidence update --evidence --input evidence-update.jsonjson{
"title": "Relatório E2E do Pix — homologação",
"doubleChecked": true,
"meta": "Revisado por QA"
}json{
"evidence": {
"id": 91,
"featureId": "FEAT-142",
"kind": "test-report",
"title": "Relatório E2E do Pix — homologação",
"doubleChecked": true,
"scenarioRef": "SCN-PIX-01",
"meta": "Revisado por QA"
}
}fr evidence delete
Exclui o recurso após validar a confirmação explícita.
--evidence- ID numérico da evidência.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr evidence delete --evidence --confirm 91textOperação concluída.fr evidence reviews
Lista as revisões independentes registradas para a evidência.
--evidence- ID numérico da evidência.
shellfr evidence reviews --evidencejson{
"reviews": [
{
"id": "8688b3da-7e45-46f5-9ed2-341c4751bb84",
"evidenceId": 91,
"reviewerProvider": "openai",
"decision": "approved",
"score": 96,
"rationale": "O artefato cobre o cenário."
}
]
}fr evidence review
Registra uma decisão auditável de aprovação ou rejeição.
--evidence- ID numérico da evidência.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr evidence review --evidence --input evidence-review.jsonjson{
"reviewerProvider": "openai",
"reviewerModel": "gpt-5.6",
"decision": "approved",
"score": 96,
"rationale": "O artefato cobre o cenário e corresponde ao commit informado.",
"criteria": [
{
"label": "Cenário coberto",
"passed": true,
"detail": "SCN-PIX-01 aparece no relatório."
}
],
"evidenceChecksum": "sha256:9d3c…"
}json{
"review": {
"id": "8688b3da-7e45-46f5-9ed2-341c4751bb84",
"evidenceId": 91,
"reviewerProvider": "openai",
"decision": "approved",
"score": 96,
"rationale": "O artefato cobre o cenário."
}
}Pull requests
Liste vínculos, sincronize o estado atual de um PR e remova vínculos obsoletos. A resposta inclui o campo stack, com a pilha de dependências derivada dos branches (stacked PRs).
fr pull-request3 ações documentadasfr pull-request list
Lista pull requests acessíveis no escopo informado.
--feature- ID de negócio da feature ou hotfix.
shellfr pull-request list --featurejson{
"pullRequests": [
{
"id": "9fd33a3c-2478-42b7-a668-a41e211768c4",
"number": 482,
"repository": "conta-facil/checkout",
"title": "feat: adiciona pagamento Pix",
"state": "open",
"headBranch": "feat/pix-checkout",
"baseBranch": "main",
"reviewDecision": "approved",
"ciStatus": "success",
"stack": {
"role": "independent",
"depth": 0,
"dependsOn": null
}
}
]
}fr pull-request sync
Cria ou atualiza o vínculo do pull request de forma idempotente.
--feature- ID de negócio da feature ou hotfix.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr pull-request sync --feature --input pull-request-sync.jsonjson{
"repository": "conta-facil/checkout",
"number": 482,
"title": "feat: adiciona pagamento Pix",
"url": "https://github.com/conta-facil/checkout/pull/482",
"state": "open",
"headBranch": "feat/pix-checkout",
"baseBranch": "main",
"headSha": "a73dab50996b",
"authorLogin": "leo",
"isDraft": false,
"reviewDecision": "approved",
"ciStatus": "success",
"approvalsCount": 2,
"approvalsRequired": 2,
"commentCount": 4,
"additions": 318,
"deletions": 42,
"changedFiles": 12
}json{
"pullRequest": {
"id": "9fd33a3c-2478-42b7-a668-a41e211768c4",
"number": 482,
"repository": "conta-facil/checkout",
"title": "feat: adiciona pagamento Pix",
"state": "open",
"headBranch": "feat/pix-checkout",
"baseBranch": "main",
"reviewDecision": "approved",
"ciStatus": "success",
"stack": {
"role": "independent",
"depth": 0,
"dependsOn": null
},
"url": "https://github.com/conta-facil/checkout/pull/482",
"headSha": "a73dab50996b",
"authorLogin": "leo",
"isDraft": false,
"approvalsCount": 2,
"approvalsRequired": 2,
"commentCount": 4,
"additions": 318,
"deletions": 42,
"changedFiles": 12
}
}fr pull-request unlink
Remove o vínculo do pull request sem excluir o PR no GitHub.
--feature- ID de negócio da feature ou hotfix.
--pull-request- UUID do vínculo do pull request.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr pull-request unlink --feature --pull-request --confirm 9fd33a3c-2478-42b7-a668-a41e211768c4textOperação concluída.Riscos
Registre severidade, mitigação e contexto dos riscos ligados à feature.
fr risk4 ações documentadasfr risk list
Lista riscos acessíveis no escopo informado.
--feature- ID de negócio da feature ou hotfix.
shellfr risk list --featurejson{
"risks": [
{
"id": 14,
"featureId": "FEAT-142",
"title": "Timeout do provedor Pix",
"severity": "ALTO",
"mitigation": "Circuit breaker e fallback com retentativa."
}
]
}fr risk create
Cria um novo recurso a partir de um documento JSON.
--feature- ID de negócio da feature ou hotfix.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr risk create --feature --input risk-create.jsonjson{
"title": "Timeout do provedor Pix",
"severity": "ALTO",
"mitigation": "Circuit breaker e fallback com retentativa.",
"meta": "Owner: Payments"
}json{
"risk": {
"id": 14,
"featureId": "FEAT-142",
"title": "Timeout do provedor Pix",
"severity": "ALTO",
"mitigation": "Circuit breaker e fallback com retentativa.",
"meta": "Owner: Payments"
}
}fr risk update
Atualiza somente os campos enviados no documento JSON.
--risk- ID numérico do risco.
--input- Arquivo JSON com o corpo da operação. Use --data para JSON inline.
shellfr risk update --risk --input risk-update.jsonjson{
"severity": "MÉDIO",
"mitigation": "Circuit breaker validado em teste de carga."
}json{
"risk": {
"id": 14,
"featureId": "FEAT-142",
"title": "Timeout do provedor Pix",
"severity": "MÉDIO",
"mitigation": "Circuit breaker validado em teste de carga."
}
}fr risk delete
Exclui o recurso após validar a confirmação explícita.
--risk- ID numérico do risco.
--confirm- Nome ou ID atual exigido antes da exclusão.
shellfr risk delete --risk --confirm 14textOperação concluída.Documentações
Liste o centro documental, faça upload, adicione versões imutáveis e baixe o conteúdo original.
fr document4 ações documentadasfr document list
Lista documentações acessíveis no escopo informado.
--portfolio- UUID do portfólio.
shellfr document list --portfoliojson{
"portfolio": {
"id": "8b82188a-111e-45f1-a44a-8edc7e7e2c18",
"name": "Checkout Web"
},
"canManage": true,
"documents": [
{
"id": "a80bf86a-29b2-44d3-b8bf-23f225968b35",
"title": "Arquitetura do checkout",
"currentVersion": 2,
"versions": [
{
"id": "c4ac0cee-1e9a-43ef-8b47-1de78804f8ab",
"version": 2,
"fileName": "arquitetura-v2.pdf",
"mimeType": "application/pdf",
"sizeBytes": 248192
}
]
}
],
"analyses": []
}fr document upload
Cria um documento e sua primeira versão a partir de um arquivo local.
--portfolio- UUID do portfólio.
--file- Caminho do arquivo local, limitado a 25 MB.
--title- Título opcional do documento.
--description- Descrição opcional do documento.
shellfr document upload --portfolio --file arquitetura.pdf --title "Arquitetura do checkout"json{
"document": {
"id": "a80bf86a-29b2-44d3-b8bf-23f225968b35",
"title": "Arquitetura do checkout",
"currentVersion": 2,
"versions": [
{
"id": "c4ac0cee-1e9a-43ef-8b47-1de78804f8ab",
"version": 2,
"fileName": "arquitetura-v2.pdf",
"mimeType": "application/pdf",
"sizeBytes": 248192
}
]
}
}fr document version
Adiciona uma versão imutável e calcula o diff documental.
--document- UUID do documento.
--file- Caminho do arquivo local, limitado a 25 MB.
--note- Nota opcional explicando a nova versão.
shellfr document version --document --file arquitetura-v2.pdf --note "Adiciona topologia de produção"json{
"version": {
"id": "c4ac0cee-1e9a-43ef-8b47-1de78804f8ab",
"version": 2,
"fileName": "arquitetura-v2.pdf",
"mimeType": "application/pdf",
"sizeBytes": 248192,
"versionNote": "Adiciona topologia de produção"
}
}fr document download
Baixa os bytes originais de uma versão para o caminho escolhido.
--version- UUID da versão do documento.
--output- Caminho onde o arquivo será salvo.
--force- Permite sobrescrever um arquivo existente.
shellfr document download --version --output arquitetura-v2.pdftext/workspace/arquitetura-v2.pdfStacked pull requests
Um PR é empilhado quando o base branch dele é o head branch de outro PR aberto do mesmo repositório. A pilha é derivada automaticamente desse grafo de branches — não existe vínculo manual entre PRs. A aba Pull requests do painel indenta a cadeia e rotula cada PR, e fr pull-request list devolve o campo stack com role (independent, base ou stacked), depth e dependsOn.
Para empilhar: crie a branch nova a partir da branch do PR base, abra o PR apontando o base para ela e sincronize informando o baseBranch correspondente. Quando o PR base faz merge, atualize o base do PR seguinte (ex.: gh pr edit --base main) e sincronize de novo — ele passa a independent ou vira a nova base da pilha.
INDEPENDENTEBASE DA PILHAAPÓS #N# 1. PR base da pilha (sai da main)
git checkout -b test/FT-1042-e2e-cancelamento main
gh pr create --base main --title "test(e2e): cobrir cancelamento pelo pagador"
# 2. PR empilhado: a branch nasce da branch do PR base…
git checkout -b fix/FT-1042-reagendamento test/FT-1042-e2e-cancelamento
# …e o PR aponta o base para ela
gh pr create --base test/FT-1042-e2e-cancelamento --title "fix(cobranca): reagendar em D+1"
# 3. Vínculo na plataforma: o baseBranch define a pilha, sem vínculo manual
fr pull-request sync --feature FT-1042 --data '{
"repository": "northbank/pix-recurrence-engine",
"number": 482,
"title": "fix(cobranca): reagendar em D+1",
"url": "https://github.com/northbank/pix-recurrence-engine/pull/482",
"state": "open",
"headBranch": "fix/FT-1042-reagendamento",
"baseBranch": "test/FT-1042-e2e-cancelamento"
}'Acesso HTTP de baixo nível
Use fr api somente quando precisar testar diretamente uma operação Management. Para automações estáveis, prefira os comandos nomeados acima: eles validam identificadores, arquivos e confirmações antes da chamada.
fr api
Escape hatch autenticado para chamar diretamente uma rota relativa da Management API.
METHOD- GET, POST, PATCH ou DELETE.
PATH- Caminho iniciado por /, relativo a /api/v2/management.
--data- Corpo JSON inline para operações de escrita.
shellfr api GET '/projects?workspace=conta-facil'json{
"workspace": {
"id": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "conta-facil",
"name": "Conta Fácil",
"kind": "Empresa",
"role": "owner",
"canManage": true,
"projectCount": 3
},
"projects": [
{
"id": "7c57a572-2d28-43f0-9ce1-103ab32b9047",
"workspaceId": "6ed807bd-7480-45d9-a95b-483649833a22",
"slug": "checkout",
"name": "Checkout",
"description": "Jornada de pagamento do e-commerce.",
"portfolioCount": 1
}
]
}Permissões e segurança
LEITURAESCRITAEXCLUIR EMPRESACREDENCIAL