Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions demos/output/task-cli-orquestrado-v2/RUN.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
{
"started_at": "2026-05-28T10:49:01",
"ended_at": "2026-05-28T11:13:06",
"total_duration_s": 1444.6,
"total_cost_usd": 1.0224989,
"total_retries": 2,
"stages": [
{
"id": "tests",
"agent": "test-writer",
"configured_model": "claude-sonnet-4-6",
"duration_s": 146.14,
"duration_api_s": 145.82,
"num_turns": 2,
"retries": 0,
"cost_usd": 0.3591625500000001,
"usage": {
"input_tokens": 4,
"cache_creation_input_tokens": 26576,
"cache_read_input_tokens": 24752,
"output_tokens": 1667,
"server_tool_use": {
"web_search_requests": 0,
"web_fetch_requests": 0
},
"service_tier": "standard",
"cache_creation": {
"ephemeral_1h_input_tokens": 0,
"ephemeral_5m_input_tokens": 0
},
"inference_geo": "",
"iterations": [],
"speed": "standard"
},
"model_usage": {
"claude-sonnet-4-6": {
"inputTokens": 13,
"outputTokens": 10968,
"cacheReadInputTokens": 90216,
"cacheCreationInputTokens": 44677,
"webSearchRequests": 0,
"costUSD": 0.3591625500000001,
"contextWindow": 200000,
"maxOutputTokens": 32000
}
}
},
{
"id": "structure",
"agent": "structure-writer",
"configured_model": "claude-sonnet-4-6",
"duration_s": 116.25,
"duration_api_s": 116.17,
"num_turns": 2,
"retries": 1,
"cost_usd": 0.33000975,
"usage": {
"input_tokens": 4,
"cache_creation_input_tokens": 14933,
"cache_read_input_tokens": 36152,
"output_tokens": 1352,
"server_tool_use": {
"web_search_requests": 0,
"web_fetch_requests": 0
},
"service_tier": "standard",
"cache_creation": {
"ephemeral_1h_input_tokens": 0,
"ephemeral_5m_input_tokens": 0
},
"inference_geo": "",
"iterations": [],
"speed": "standard"
},
"model_usage": {
"claude-sonnet-4-6": {
"inputTokens": 11,
"outputTokens": 6872,
"cacheReadInputTokens": 78785,
"cacheCreationInputTokens": 54203,
"webSearchRequests": 0,
"costUSD": 0.33000975,
"contextWindow": 200000,
"maxOutputTokens": 32000
}
}
},
{
"id": "code",
"agent": "coder",
"configured_model": "claude-haiku-4-5",
"duration_s": 195.18,
"duration_api_s": 139.58,
"num_turns": 2,
"retries": 1,
"cost_usd": 0.3333266,
"usage": {
"input_tokens": 11,
"cache_creation_input_tokens": 26441,
"cache_read_input_tokens": 24514,
"output_tokens": 1178,
"server_tool_use": {
"web_search_requests": 0,
"web_fetch_requests": 0
},
"service_tier": "standard",
"cache_creation": {
"ephemeral_1h_input_tokens": 0,
"ephemeral_5m_input_tokens": 0
},
"inference_geo": "",
"iterations": [],
"speed": "standard"
},
"model_usage": {
"claude-haiku-4-5": {
"inputTokens": 130,
"outputTokens": 10687,
"cacheReadInputTokens": 1094891,
"cacheCreationInputTokens": 136218,
"webSearchRequests": 0,
"costUSD": 0.3333266,
"contextWindow": 200000,
"maxOutputTokens": 32000
}
}
}
],
"pytest_final": {
"passed": 61,
"failed": 0,
"errors": 0,
"total": 61,
"summary": "61/61 passed",
"collection_error": null
}
}
4 changes: 4 additions & 0 deletions demos/output/task-cli-orquestrado-v2/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent / "src"))
17 changes: 17 additions & 0 deletions demos/output/task-cli-orquestrado-v2/src/task/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""Pacote task - CLI de gerenciamento de tarefas."""

from task.models import Task
from task.storage import TaskStorage
from task.handlers import Handlers
from task.cli import CLI
from task.validators import Validators
from task.main import main

__all__ = [
"Task",
"TaskStorage",
"Handlers",
"CLI",
"Validators",
"main",
]
8 changes: 8 additions & 0 deletions demos/output/task-cli-orquestrado-v2/src/task/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
"""Permite executar o pacote como `python -m task`."""

import sys

from task.main import main

if __name__ == "__main__":
sys.exit(main())
153 changes: 153 additions & 0 deletions demos/output/task-cli-orquestrado-v2/src/task/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
"""Interface de linha de comando."""

import argparse

from task.validators import Validators


class CLI:
"""Monta o ArgumentParser com todos os subcomandos."""

def __init__(self, handlers):
"""
Construtor.

Args:
handlers: Instância de Handlers
"""
self.handlers = handlers
self.parser = self._build_parser()

def _build_parser(self):
"""Cria o ArgumentParser principal com todos os subparsers."""
parser = argparse.ArgumentParser(
prog="task",
description="CLI de gerenciamento de tarefas",
)
subparsers = parser.add_subparsers(dest="command", help="Comando a executar")

self._register_add(subparsers)
self._register_list(subparsers)
self._register_done(subparsers)
self._register_edit(subparsers)
self._register_delete(subparsers)
self._register_show(subparsers)

return parser

def _register_add(self, subparsers):
"""Registra o subparser do comando add."""
add_parser = subparsers.add_parser("add", help="Adicionar nova tarefa")
add_parser.add_argument("title", help="Título da tarefa")
add_parser.add_argument(
"-p",
"--priority",
type=Validators.priority_type,
default="low",
help="Prioridade (low/medium/high)",
)
add_parser.add_argument(
"-d",
"--due",
type=Validators.date_type,
default=None,
dest="due_date",
help="Data de vencimento (YYYY-MM-DD)",
)
add_parser.set_defaults(func=self.handlers.cmd_add)

def _register_list(self, subparsers):
"""Registra o subparser do comando list."""
list_parser = subparsers.add_parser("list", help="Listar tarefas")
list_parser.add_argument(
"-a",
"--all",
action="store_true",
help="Incluir tarefas concluídas",
)
list_parser.add_argument(
"--done",
action="store_true",
help="Mostrar apenas concluídas",
)
list_parser.add_argument(
"-p",
"--priority",
type=Validators.priority_type,
default=None,
help="Filtrar por prioridade",
)
list_parser.set_defaults(func=self.handlers.cmd_list)

def _register_done(self, subparsers):
"""Registra o subparser do comando done."""
done_parser = subparsers.add_parser("done", help="Marcar tarefa como concluída")
done_parser.add_argument("id", type=int, help="ID da tarefa")
done_parser.set_defaults(func=self.handlers.cmd_done)

def _register_edit(self, subparsers):
"""Registra o subparser do comando edit."""
edit_parser = subparsers.add_parser("edit", help="Editar tarefa")
edit_parser.add_argument("id", type=int, help="ID da tarefa")
edit_parser.add_argument(
"--title",
type=str,
default=None,
help="Novo título",
)
edit_parser.add_argument(
"-p",
"--priority",
type=Validators.priority_type,
default=None,
help="Nova prioridade",
)
edit_parser.add_argument(
"-d",
"--due",
type=Validators.date_type,
default=None,
dest="due_date",
help="Nova data de vencimento",
)
edit_parser.set_defaults(func=self.handlers.cmd_edit)

def _register_delete(self, subparsers):
"""Registra o subparser do comando delete."""
delete_parser = subparsers.add_parser("delete", help="Deletar tarefa")
delete_parser.add_argument("id", type=int, help="ID da tarefa")
delete_parser.add_argument(
"--force",
action="store_true",
help="Deletar sem pedir confirmação",
)
delete_parser.set_defaults(func=self.handlers.cmd_delete)

def _register_show(self, subparsers):
"""Registra o subparser do comando show."""
show_parser = subparsers.add_parser("show", help="Exibir detalhes da tarefa")
show_parser.add_argument("id", type=int, help="ID da tarefa")
show_parser.set_defaults(func=self.handlers.cmd_show)

def parse_and_run(self, argv=None):
"""
Faz parse de argv e invoca o handler associado.

Args:
argv: Lista de argumentos (se None, usa sys.argv[1:])

Returns:
int: Código de saída
"""
try:
args = self.parser.parse_args(argv)
except SystemExit as e:
return e.code if isinstance(e.code, int) else 1

# Se nenhum comando foi especificado, mostra ajuda
if not hasattr(args, "func"):
self.parser.print_help()
return 1

# Executa o handler
return args.func(args)
Loading