lovarch-cli 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lovarch_cli/__init__.py +16 -0
- lovarch_cli/__main__.py +10 -0
- lovarch_cli/ai/__init__.py +21 -0
- lovarch_cli/ai/gateway.py +240 -0
- lovarch_cli/api.py +111 -0
- lovarch_cli/auth/__init__.py +32 -0
- lovarch_cli/auth/keyring_store.py +214 -0
- lovarch_cli/auth/local_server.py +165 -0
- lovarch_cli/auth/pkce.py +57 -0
- lovarch_cli/auth/session.py +189 -0
- lovarch_cli/cli.py +262 -0
- lovarch_cli/clients/__init__.py +33 -0
- lovarch_cli/clients/factory.py +54 -0
- lovarch_cli/clients/local_client.py +432 -0
- lovarch_cli/clients/lovarch_storage.py +174 -0
- lovarch_cli/clients/lovarch_supabase.py +295 -0
- lovarch_cli/clients/persistence.py +166 -0
- lovarch_cli/clients/storage.py +66 -0
- lovarch_cli/commands/__init__.py +10 -0
- lovarch_cli/commands/account.py +172 -0
- lovarch_cli/commands/audit.py +394 -0
- lovarch_cli/commands/config_cmd.py +80 -0
- lovarch_cli/commands/consolidate.py +217 -0
- lovarch_cli/commands/context_cmd.py +73 -0
- lovarch_cli/commands/dev.py +287 -0
- lovarch_cli/commands/do_cmd.py +120 -0
- lovarch_cli/commands/init.py +218 -0
- lovarch_cli/commands/jobs_cmd.py +95 -0
- lovarch_cli/commands/login.py +202 -0
- lovarch_cli/commands/mcp_cmd.py +26 -0
- lovarch_cli/commands/run.py +375 -0
- lovarch_cli/commands/signup.py +185 -0
- lovarch_cli/commands/status.py +243 -0
- lovarch_cli/commands/upgrade.py +108 -0
- lovarch_cli/commands/verifica_cmd.py +174 -0
- lovarch_cli/config.py +101 -0
- lovarch_cli/config_store.py +111 -0
- lovarch_cli/credits/__init__.py +35 -0
- lovarch_cli/credits/base.py +84 -0
- lovarch_cli/credits/factory.py +36 -0
- lovarch_cli/credits/local.py +34 -0
- lovarch_cli/credits/lovarch.py +56 -0
- lovarch_cli/i18n/__init__.py +27 -0
- lovarch_cli/i18n/loader.py +121 -0
- lovarch_cli/i18n/translations/en.json +168 -0
- lovarch_cli/i18n/translations/es.json +168 -0
- lovarch_cli/i18n/translations/it.json +168 -0
- lovarch_cli/i18n/translations/pt.json +168 -0
- lovarch_cli/mcp/__init__.py +9 -0
- lovarch_cli/mcp/server.py +199 -0
- lovarch_cli/mcp/tools.py +372 -0
- lovarch_cli/sample_downloader.py +255 -0
- lovarch_cli/squad/README.md +206 -0
- lovarch_cli/squad/agents/auditor-input.md +353 -0
- lovarch_cli/squad/agents/bim-engineer.md +404 -0
- lovarch_cli/squad/agents/briefing-architect.md +249 -0
- lovarch_cli/squad/agents/cad-engineer.md +278 -0
- lovarch_cli/squad/agents/capitolato-writer.md +256 -0
- lovarch_cli/squad/agents/computo-engineer.md +258 -0
- lovarch_cli/squad/agents/concept-designer.md +399 -0
- lovarch_cli/squad/agents/contratto-architect.md +243 -0
- lovarch_cli/squad/agents/deliverable-builder.md +253 -0
- lovarch_cli/squad/agents/energy-prelim.md +388 -0
- lovarch_cli/squad/agents/pratiche-it.md +251 -0
- lovarch_cli/squad/agents/progetto-chief.md +768 -0
- lovarch_cli/squad/agents/quality-dati.md +409 -0
- lovarch_cli/squad/agents/quality-misure.md +418 -0
- lovarch_cli/squad/agents/quality-normativa.md +417 -0
- lovarch_cli/squad/agents/quality-output.md +436 -0
- lovarch_cli/squad/agents/regolatorio-it.md +278 -0
- lovarch_cli/squad/checklists/handoff-quality-gate.md +232 -0
- lovarch_cli/squad/checklists/quality-dati-checklist.md +134 -0
- lovarch_cli/squad/checklists/quality-misure-checklist.md +139 -0
- lovarch_cli/squad/checklists/quality-normativa-checklist.md +121 -0
- lovarch_cli/squad/checklists/quality-output-checklist.md +116 -0
- lovarch_cli/squad/config.yaml +408 -0
- lovarch_cli/squad/data/CHANGELOG.md +272 -0
- lovarch_cli/squad/data/agents-prd.md +428 -0
- lovarch_cli/squad/data/architettura-progetto-rules.md +328 -0
- lovarch_cli/squad/data/handoff-card-template.md +231 -0
- lovarch_cli/squad/data/mocks/catasto-visura.json +72 -0
- lovarch_cli/squad/data/mocks/firma-envelope.json +43 -0
- lovarch_cli/squad/data/prezzario-lombardia-sample.json +312 -0
- lovarch_cli/squad/scripts/api_clients.py +206 -0
- lovarch_cli/squad/scripts/architect_profile.py +276 -0
- lovarch_cli/squad/scripts/deliverable_generators.py +844 -0
- lovarch_cli/squad/scripts/generate_attico_brera_dwg.py +369 -0
- lovarch_cli/squad/scripts/generate_chianti_dxf.py +368 -0
- lovarch_cli/squad/scripts/generate_chianti_images.py +223 -0
- lovarch_cli/squad/scripts/generate_real_sample_images.py +189 -0
- lovarch_cli/squad/scripts/generate_sample_assets.py +382 -0
- lovarch_cli/squad/scripts/lovarch_client.py +1046 -0
- lovarch_cli/squad/scripts/pipeline_runner.py +2095 -0
- lovarch_cli/squad/scripts/render_dxf_to_png.py +57 -0
- lovarch_cli/squad/scripts/run_palestra_demo.sh +277 -0
- lovarch_cli/squad/scripts/simulate_squad_execution.py +515 -0
- lovarch_cli/squad/scripts/validate-squad.py +383 -0
- lovarch_cli/squad/tasks/audit-input.md +146 -0
- lovarch_cli/squad/tasks/compute-metric.md +105 -0
- lovarch_cli/squad/tasks/consolidate-dossier.md +187 -0
- lovarch_cli/squad/tasks/generate-cad-plan.md +120 -0
- lovarch_cli/squad/tasks/generate-ifc-model.md +108 -0
- lovarch_cli/squad/tasks/write-capitolato.md +100 -0
- lovarch_cli/squad/templates/asseverazione-tecnica.md +126 -0
- lovarch_cli/squad/templates/capitolato-uni-11337.md +235 -0
- lovarch_cli/squad/templates/cila-comune-milano.md +177 -0
- lovarch_cli/squad/templates/contratto-cnappc.md +220 -0
- lovarch_cli/squad/workflows/dal-brief-al-cantiere.yaml +218 -0
- lovarch_cli/squad_loader.py +114 -0
- lovarch_cli/verify/__init__.py +15 -0
- lovarch_cli/verify/contratto.py +110 -0
- lovarch_cli/verify/dossier.py +97 -0
- lovarch_cli/verify/misure.py +83 -0
- lovarch_cli/verify/normativa.py +178 -0
- lovarch_cli/version.py +13 -0
- lovarch_cli/workflows/__init__.py +9 -0
- lovarch_cli/workflows/platform.py +212 -0
- lovarch_cli-0.2.1.dist-info/METADATA +232 -0
- lovarch_cli-0.2.1.dist-info/RECORD +122 -0
- lovarch_cli-0.2.1.dist-info/WHEEL +4 -0
- lovarch_cli-0.2.1.dist-info/entry_points.txt +3 -0
- lovarch_cli-0.2.1.dist-info/licenses/LICENSE +38 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
{
|
|
2
|
+
"signup": {
|
|
3
|
+
"welcome_title": "Bem-vindo ao lovarch-cli",
|
|
4
|
+
"welcome_body": "Modo FREE — cadastro obrigatório.\n\nVamos pedir nome, email, telefone e país. Usaremos essas informações apenas para:\n • Confirmar sua identidade\n • Enviar atualizações sobre lovarch-cli (opt-out a qualquer momento)\n • Permitir upgrade futuro para Premium com mesmo cadastro\n\nSeus dados são protegidos pelo GDPR/LGPD. Você pode deletar com [bold]lovarch account delete[/bold] a qualquer momento.",
|
|
5
|
+
"prompt_language": "Idioma preferido",
|
|
6
|
+
"prompt_full_name": "Nome completo",
|
|
7
|
+
"prompt_email": "Email",
|
|
8
|
+
"prompt_phone": "Telefone (formato internacional, ex. +55 11 98765-4321)",
|
|
9
|
+
"prompt_country": "Código país ISO 3166 (ex. BR, IT, US, ES)",
|
|
10
|
+
"prompt_consent": "Você aceita os Termos de Serviço e Política de Privacidade (GDPR/LGPD)?",
|
|
11
|
+
"tos_url_label": "TOS:",
|
|
12
|
+
"consent_required": "Consentimento GDPR é obrigatório. Cadastro cancelado.",
|
|
13
|
+
"name_too_short": "Mínimo 3 caracteres",
|
|
14
|
+
"invalid_email": "Email inválido.",
|
|
15
|
+
"invalid_phone": "Telefone deve estar em formato internacional (ex. +5511987654321).",
|
|
16
|
+
"invalid_country": "Código país deve ser 2 letras (ISO 3166 alpha-2).",
|
|
17
|
+
"submitting": "Enviando...",
|
|
18
|
+
"next_steps": "[bold green]✓ Cadastro concluído[/bold green]\n\nPróximos passos:\n 1. [cyan]lovarch init <projeto>[/cyan] — cria novo projeto\n 2. [cyan]lovarch audit <projeto>[/cyan] — verifica inputs\n 3. [cyan]lovarch run dal-brief-al-cantiere[/cyan] — executa workflow\n\nUpgrade pra Premium (créditos inclusos): [link]https://lovarch.com/cli-upgrade[/link]"
|
|
19
|
+
},
|
|
20
|
+
"account": {
|
|
21
|
+
"no_account": "Nenhuma conta configurada. Execute 'lovarch signup' ou 'lovarch login'.",
|
|
22
|
+
"delete_warning_title": "⚠️ EXCLUSÃO DE CONTA — IRREVERSÍVEL",
|
|
23
|
+
"delete_warning_body": "Você está prestes a excluir sua conta lovarch-cli (modo FREE).\n\nO que acontece:\n • Seus dados pessoais (nome, email, telefone) serão pseudonimizados (GDPR/LGPD Art. 17)\n • O token será revogado — você não poderá mais usar lovarch-cli com esta conta\n • A conta sombra na Lovarch será deletada\n • [bold]Opcionalmente[/bold] excluímos projetos locais em ~/.lovarch/projects/\n\n[red]Esta ação NÃO pode ser desfeita.[/red]",
|
|
24
|
+
"confirm_delete_remote": "Você confirma a exclusão da conta remota?",
|
|
25
|
+
"confirm_delete_local": "Deseja também excluir projetos locais em ~/.lovarch/projects/?",
|
|
26
|
+
"deletion_aborted": "Exclusão cancelada. Nenhum dado modificado.",
|
|
27
|
+
"deletion_success": "✓ Conta excluída. Obrigado por ter testado lovarch-cli.",
|
|
28
|
+
"info_title": "Conta atual",
|
|
29
|
+
"premium_delete_redirect": "A exclusão de conta Premium é feita no app web Lovarch:\n https://lovarch.com/settings/account/delete"
|
|
30
|
+
},
|
|
31
|
+
"login": {
|
|
32
|
+
"choose_mode_prompt": "Escolha modalidade",
|
|
33
|
+
"free_redirect": "Para o modo Free, execute [bold cyan]lovarch signup[/bold cyan].",
|
|
34
|
+
"opening_browser": "Abrindo o navegador para login Lovarch...",
|
|
35
|
+
"manual_url_hint": "Se o navegador não abrir, copie esta URL:",
|
|
36
|
+
"waiting_callback": "Aguardando autorização (timeout 5 min)...",
|
|
37
|
+
"callback_timeout": "Timeout: nenhuma resposta do navegador em 5 minutos.",
|
|
38
|
+
"state_mismatch": "Erro de segurança: state não corresponde (possível CSRF). Tente novamente.",
|
|
39
|
+
"auth_denied": "Autorização negada pelo usuário.",
|
|
40
|
+
"login_success": "✓ Login Premium concluído",
|
|
41
|
+
"modes_mutex": "As opções --free e --premium são mutuamente exclusivas."
|
|
42
|
+
},
|
|
43
|
+
"info": {
|
|
44
|
+
"title": "Status",
|
|
45
|
+
"mode_not_configured": "não configurado — execute 'lovarch login' para começar",
|
|
46
|
+
"powered_by": "🌐 Powered by Lovarch — https://lovarch.com",
|
|
47
|
+
"course_promo": "🎓 Curso IA Avançado para Arquitetos — https://lovarch.com/corso"
|
|
48
|
+
},
|
|
49
|
+
"errors": {
|
|
50
|
+
"network": "Erro de rede chamando {function_name}: {exc}",
|
|
51
|
+
"invalid_json": "JSON inválido de {function_name} (HTTP {status_code}): {snippet}",
|
|
52
|
+
"unknown_api_error": "Erro API: {error_code}",
|
|
53
|
+
"credits_insufficient": "Créditos insuficientes: você tem {remaining}, são necessários {required} (faltam {deficit}). Recarregue em https://lovarch.com/credits.",
|
|
54
|
+
"credits_check_failed": "Verificação de créditos falhou: {message}"
|
|
55
|
+
},
|
|
56
|
+
"upgrade": {
|
|
57
|
+
"title": "🚀 Upgrade para Premium",
|
|
58
|
+
"already_premium_title": "✓ Conta Premium ativa",
|
|
59
|
+
"body_free": "Faça upgrade para Premium e desbloqueie:\n • Créditos AI inclusos (a partir de 50.000 cr/mês)\n • Armazenamento cloud sincronizado entre dispositivos\n • Colaboração em equipe\n • Suporte prioritário",
|
|
60
|
+
"already_premium": "Você já é Premium ✨ Para gerenciar créditos, faturamento e equipe abra o dashboard:",
|
|
61
|
+
"no_account_hint": "Nenhuma conta configurada. Execute [bold cyan]lovarch signup[/bold cyan] ou [bold cyan]lovarch login --premium[/bold cyan] antes de [bold]lovarch upgrade[/bold]."
|
|
62
|
+
},
|
|
63
|
+
"run": {
|
|
64
|
+
"title": "Iniciando pipeline do squad",
|
|
65
|
+
"summary_title": "Resultado da execução",
|
|
66
|
+
"no_project": "Projeto '{name}' não encontrado. Execute [bold cyan]lovarch init {name}[/bold cyan] primeiro.",
|
|
67
|
+
"no_input": "Pasta input não encontrada: {path}",
|
|
68
|
+
"no_audit": "Execute [bold cyan]lovarch audit {name}[/bold cyan] antes do run, ou use [cyan]--skip-audit[/cyan] (arriscado).",
|
|
69
|
+
"audit_failed": "✗ Audit de '{name}' falhou. Corrija os críticos e rode novamente [bold cyan]lovarch audit {name}[/bold cyan].",
|
|
70
|
+
"no_runner": "pipeline_runner não encontrado em {path}. Reinstale com [cyan]pip install -e .[/cyan].",
|
|
71
|
+
"starting": "Executando workflow [bold]{workflow}[/bold] no projeto [bold]{project}[/bold].",
|
|
72
|
+
"mode_label": "Modo: [bold]{mode}[/bold]",
|
|
73
|
+
"mode_free": "Free (dry-run · simulação, sem chamadas API reais)",
|
|
74
|
+
"mode_premium": "Premium (run real · debita créditos Lovarch)",
|
|
75
|
+
"dry_run_note": "[dim]Runs reais disponíveis após [cyan]lovarch login --premium[/cyan].[/dim]",
|
|
76
|
+
"completed": "[green]✓[/green] Pipeline concluído para [bold]{project}[/bold].",
|
|
77
|
+
"failed": "[red]✗[/red] Pipeline falhou para [bold]{project}[/bold]. Veja log acima.",
|
|
78
|
+
"qa_rejected": "[yellow]⚠[/yellow] O controle de qualidade (Tier 2) reprovou o dossiê de [bold]{project}[/bold]. Os entregáveis foram gerados mas NÃO estão validados para uso profissional. Veja o relatório de QA e o log acima; verifique os arquivos de entrada do projeto e rode novamente. Suporte: info@lovarch.com",
|
|
79
|
+
"next_steps": "Próximos passos:\n 1. [cyan]lovarch status[/cyan] — inspeciona a execução\n 2. [cyan]lovarch consolidate {project}[/cyan] — gera DOSSIER.zip",
|
|
80
|
+
"subprocess_failed": "✗ Falha ao iniciar subprocess: {message}",
|
|
81
|
+
"interrupted": "Interrupção do usuário · pipeline cancelado."
|
|
82
|
+
},
|
|
83
|
+
"consolidate": {
|
|
84
|
+
"title": "DOSSIER pronto",
|
|
85
|
+
"no_project": "Projeto '{name}' não encontrado. Execute [bold cyan]lovarch init {name}[/bold cyan] primeiro.",
|
|
86
|
+
"no_output": "Pasta output não encontrada: {path}",
|
|
87
|
+
"empty_output": "Output de '{name}' está vazio. Execute [bold cyan]lovarch run {name}[/bold cyan] primeiro.",
|
|
88
|
+
"zipping": "Compactando {count} arquivos em DOSSIER.zip…",
|
|
89
|
+
"created": "[green]✓[/green] DOSSIER criado: [bold]{path}[/bold]\n [dim]{size_kb} KB · {count} arquivos[/dim]",
|
|
90
|
+
"next_steps": "Próximos passos:\n 1. Abra o arquivo e inspecione a estrutura\n 2. Compartilhe o DOSSIER com o cliente / empresa",
|
|
91
|
+
"write_failed": "✗ Erro ao escrever ZIP: {message}",
|
|
92
|
+
"zip_readme": "# DOSSIER {project} — {date}\n\nGerado por lovarch-cli — {count} arquivos incluídos.\n\nEstrutura:\n- 00-validation/ Audit e validação de input\n- 01-bootstrap/ Metadata do projeto\n- 02-concept/ Moodboard e renders\n- 03-tier1/ Saídas dos Tier 1 agents (CAD/IFC/PDF/XLSX)\n- 04-tier2/ Relatórios QA\n- 05-dossier/ Briefing arquiteto, regulatório, energia\n- 99-other/ Arquivos sem routing atribuído\n"
|
|
93
|
+
},
|
|
94
|
+
"status": {
|
|
95
|
+
"list_title": "Projetos lovarch",
|
|
96
|
+
"detail_title": "Status do projeto · {name}",
|
|
97
|
+
"no_projects": "Nenhum projeto. Execute [bold cyan]lovarch init <nome>[/bold cyan] para começar.",
|
|
98
|
+
"no_projects_hint": "Dica: [cyan]lovarch init villa-test --sample[/cyan] para começar com o sample villa-chianti.",
|
|
99
|
+
"project_not_found": "Projeto '{name}' não encontrado.",
|
|
100
|
+
"col_project": "Projeto",
|
|
101
|
+
"col_workflow": "Workflow",
|
|
102
|
+
"col_audit": "Audit",
|
|
103
|
+
"col_dossier": "Dossier",
|
|
104
|
+
"col_age": "Atualizado",
|
|
105
|
+
"label_workflow": "Workflow",
|
|
106
|
+
"label_created": "Criado",
|
|
107
|
+
"label_sample": "Sample",
|
|
108
|
+
"section_audit": "Audit",
|
|
109
|
+
"section_dossier": "Dossier",
|
|
110
|
+
"section_output": "Output",
|
|
111
|
+
"no_audit_yet": "não executado · use [cyan]lovarch audit {name}[/cyan]",
|
|
112
|
+
"no_dossier_yet": "não gerado · use [cyan]lovarch consolidate {name}[/cyan]"
|
|
113
|
+
},
|
|
114
|
+
"audit": {
|
|
115
|
+
"no_project": "Projeto '{name}' não encontrado. Execute [bold cyan]lovarch init {name}[/bold cyan] primeiro.",
|
|
116
|
+
"no_input": "Pasta input não encontrada: {path}",
|
|
117
|
+
"checklist_title": "Audit de inputs · 18 verificações",
|
|
118
|
+
"summary_title": "Resultado do audit",
|
|
119
|
+
"col_check": "Verificação",
|
|
120
|
+
"col_status": "Status",
|
|
121
|
+
"col_detail": "Detalhe",
|
|
122
|
+
"summary_pass": "Todas as 18 verificações passaram para '{name}'. Pronto para run.",
|
|
123
|
+
"summary_concerns": "Audit de '{name}' completou com avisos (os críticos estão OK).",
|
|
124
|
+
"summary_fail": "Audit de '{name}' FALHOU — corrija os críticos antes do run.",
|
|
125
|
+
"next_steps_pass": "Próximo: [cyan]lovarch run dal-brief-al-cantiere --project {name}[/cyan]",
|
|
126
|
+
"next_steps_fail": "Corrija os inputs faltantes e rode de novo: [cyan]lovarch audit {name}[/cyan]",
|
|
127
|
+
"checks": {
|
|
128
|
+
"briefing_present": "briefing-cliente.md presente",
|
|
129
|
+
"briefing_cliente": "Briefing menciona o cliente",
|
|
130
|
+
"briefing_programma": "Briefing define o programa",
|
|
131
|
+
"dxf_present": "stato-attuale.dxf válido (≥5KB)",
|
|
132
|
+
"preview_png": "stato-attuale.png presente",
|
|
133
|
+
"visura_present": "visura-catastale.pdf presente",
|
|
134
|
+
"architetto_json": "architetto-info.json (nome, ordem, CF)",
|
|
135
|
+
"foto_dir": "Fotos do estado atual (≥4)",
|
|
136
|
+
"pinterest_dir": "Referências Pinterest (≥4)",
|
|
137
|
+
"briefing_budget": "Briefing indica budget",
|
|
138
|
+
"briefing_tempi": "Briefing indica tempos",
|
|
139
|
+
"briefing_vincoli": "Briefing indica restrições",
|
|
140
|
+
"briefing_stile": "Briefing indica estilo",
|
|
141
|
+
"briefing_spazi": "Briefing descreve espaços",
|
|
142
|
+
"briefing_famiglia": "Briefing menciona família",
|
|
143
|
+
"briefing_abitudini": "Briefing cobre hábitos",
|
|
144
|
+
"briefing_materiali": "Briefing menciona materiais",
|
|
145
|
+
"briefing_sostenibilita": "Briefing trata sustentabilidade"
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
"init": {
|
|
149
|
+
"title": "Projeto '{name}' inicializado",
|
|
150
|
+
"invalid_name": "✗ Nome inválido: '{name}'. Use letras minúsculas, números e hífens (2-63 caracteres).",
|
|
151
|
+
"already_exists": "Projeto '{name}' já existe em [bold]{path}[/bold]. Use [bold cyan]--force[/bold cyan] para sobrescrever.",
|
|
152
|
+
"created": "[green]✓[/green] Pasta criada em [bold]{path}[/bold]",
|
|
153
|
+
"sample_copied": "[green]✓[/green] Sample villa-chianti copiado ([bold]{count}[/bold] arquivos de input)",
|
|
154
|
+
"no_sample": "Sample-input não encontrado em {path}",
|
|
155
|
+
"sample_hint": "Tente novamente com conexão à internet ou baixe manualmente [bold]sample-villa-chianti.zip[/bold] de [cyan]https://github.com/ArchPrime-official/lovarch-cli/releases/latest[/cyan] e descompacte na pasta de input do projeto.",
|
|
156
|
+
"sample_origin_cache": "↳ origem: cache local (~/.lovarch/cache/sample-villa-chianti/)",
|
|
157
|
+
"sample_origin_download": "↳ origem: baixado de GitHub Releases + armazenado em cache",
|
|
158
|
+
"downloading": "Baixando {asset}",
|
|
159
|
+
"fetching_sample": "Baixando sample de {url}",
|
|
160
|
+
"download_failed": "Falha no download de {url}: {error}",
|
|
161
|
+
"checksum_failed": "SHA256 não confere — esperado {expected}, recebido {actual}. Arquivo corrompido ou release adulterada.",
|
|
162
|
+
"extract_failed": "Falha ao extrair o pacote: {error}",
|
|
163
|
+
"unexpected_zip_layout": "Layout zip inesperado — pasta '{expected}/' não encontrada na raiz.",
|
|
164
|
+
"zip_unsafe": "Entrada zip insegura (path traversal): {entry}",
|
|
165
|
+
"no_sample_offline": "Sample-input indisponível offline e download desabilitado.",
|
|
166
|
+
"next_steps": "Próximos passos:\n 1. [cyan]lovarch audit {name}[/cyan] — verifica os 18 inputs\n 2. [cyan]lovarch run dal-brief-al-cantiere[/cyan] — executa o workflow"
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Lovarch MCP server package.
|
|
2
|
+
|
|
3
|
+
Exposes the CLI's capabilities (credits, image generation, project audit) as an
|
|
4
|
+
MCP server so Claude Code / Claude / IDEs can drive Lovarch while debiting the
|
|
5
|
+
user's credits identically to the CLI. Entry point: ``lovarch mcp serve``.
|
|
6
|
+
"""
|
|
7
|
+
from lovarch_cli.mcp.server import build_server, serve
|
|
8
|
+
|
|
9
|
+
__all__ = ["build_server", "serve"]
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"""Lovarch MCP server — exposes the CLI's capabilities as MCP tools.
|
|
2
|
+
|
|
3
|
+
Run with ``lovarch mcp serve`` (stdio transport). Register in Claude Code with:
|
|
4
|
+
|
|
5
|
+
claude mcp add lovarch -- lovarch mcp serve
|
|
6
|
+
|
|
7
|
+
The server reuses the exact same premium session (OS keyring), credit gateway,
|
|
8
|
+
and project logic as the CLI, so an MCP tool call debits the user's Lovarch
|
|
9
|
+
credits identically to ``lovarch run``. Nothing here calls a model provider
|
|
10
|
+
directly.
|
|
11
|
+
|
|
12
|
+
The ``mcp`` SDK is an optional dependency; install with ``pip install
|
|
13
|
+
'lovarch-cli[mcp]'`` (or it ships via the Homebrew formula).
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from lovarch_cli.ai import LovarchAiGateway
|
|
18
|
+
from lovarch_cli.auth.session import LovarchSession
|
|
19
|
+
from lovarch_cli.mcp import tools
|
|
20
|
+
from lovarch_cli.workflows import PlatformWorkflows
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def build_server():
|
|
24
|
+
"""Construct the FastMCP server with all Lovarch tools wired in.
|
|
25
|
+
|
|
26
|
+
Raises a clear error if the ``mcp`` SDK is not installed.
|
|
27
|
+
"""
|
|
28
|
+
try:
|
|
29
|
+
from mcp.server.fastmcp import FastMCP
|
|
30
|
+
except ImportError as exc: # pragma: no cover - exercised via install matrix
|
|
31
|
+
raise SystemExit(
|
|
32
|
+
"Il pacchetto 'mcp' non è installato. Esegui: pip install 'lovarch-cli[mcp]'"
|
|
33
|
+
) from exc
|
|
34
|
+
|
|
35
|
+
# Load the premium session once at startup (None if not logged in premium).
|
|
36
|
+
session = LovarchSession.load()
|
|
37
|
+
gateway = LovarchAiGateway(session) if session is not None else None
|
|
38
|
+
workflows = PlatformWorkflows(session) if session is not None else None
|
|
39
|
+
|
|
40
|
+
mcp = FastMCP("lovarch")
|
|
41
|
+
|
|
42
|
+
@mcp.tool()
|
|
43
|
+
async def lovarch_whoami() -> dict:
|
|
44
|
+
"""Mostra l'utente Lovarch autenticato e la modalità della CLI."""
|
|
45
|
+
return await tools.tool_whoami(session)
|
|
46
|
+
|
|
47
|
+
@mcp.tool()
|
|
48
|
+
async def lovarch_credits() -> dict:
|
|
49
|
+
"""Mostra il saldo crediti Lovarch dell'utente (non addebita)."""
|
|
50
|
+
return await tools.tool_credits(session)
|
|
51
|
+
|
|
52
|
+
@mcp.tool()
|
|
53
|
+
async def lovarch_generate_image(
|
|
54
|
+
prompt: str,
|
|
55
|
+
output_path: str,
|
|
56
|
+
quality: str = "medium",
|
|
57
|
+
aspect: str = "1:1",
|
|
58
|
+
mode: str = "generate",
|
|
59
|
+
image_urls: list[str] | None = None,
|
|
60
|
+
) -> dict:
|
|
61
|
+
"""Genera (o modifica) un'immagine via piattaforma Lovarch, addebitando
|
|
62
|
+
i crediti dell'utente (1000cr=$1), e la salva su disco. quality:
|
|
63
|
+
low|medium|high. mode: generate (testo→immagine) o edit (con image_urls)."""
|
|
64
|
+
return await tools.tool_generate_image(
|
|
65
|
+
gateway, prompt=prompt, output_path=output_path, quality=quality,
|
|
66
|
+
aspect=aspect, mode=mode, image_urls=image_urls,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
@mcp.tool()
|
|
70
|
+
def lovarch_audit_input(project_dir: str) -> dict:
|
|
71
|
+
"""Esegue l'audit dei 18 input su un progetto (gate di ingresso)."""
|
|
72
|
+
return tools.tool_audit_input(project_dir)
|
|
73
|
+
|
|
74
|
+
@mcp.tool()
|
|
75
|
+
def lovarch_list_projects() -> dict:
|
|
76
|
+
"""Elenca i progetti Lovarch locali con workflow e ultimo audit."""
|
|
77
|
+
return tools.tool_list_projects()
|
|
78
|
+
|
|
79
|
+
@mcp.tool()
|
|
80
|
+
async def lovarch_ai_text(
|
|
81
|
+
prompt: str,
|
|
82
|
+
role: str = "executor",
|
|
83
|
+
model: str | None = None,
|
|
84
|
+
system: str | None = None,
|
|
85
|
+
max_tokens: int | None = None,
|
|
86
|
+
language: str | None = None,
|
|
87
|
+
) -> dict:
|
|
88
|
+
"""Genera testo via piattaforma Lovarch addebitando i crediti dell'utente
|
|
89
|
+
per i token reali. role: executor (default) | verifier | chief — il
|
|
90
|
+
server sceglie il modello; oppure model esplicito dal catalogo della
|
|
91
|
+
piattaforma. language forza la lingua dell'output."""
|
|
92
|
+
return await tools.tool_ai_text(
|
|
93
|
+
gateway, prompt=prompt, role=role, model=model, system=system,
|
|
94
|
+
max_tokens=max_tokens, language=language,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
@mcp.tool()
|
|
98
|
+
async def lovarch_context(lead_id: str | None = None) -> dict:
|
|
99
|
+
"""Bundle di personalizzazione dell'utente Lovarch: brand, stile,
|
|
100
|
+
firma professionale, dati fiscali, lingua preferita e prompt_block
|
|
101
|
+
pronto. lead_id opzionale carica anche un cliente del CRM."""
|
|
102
|
+
return await tools.tool_user_context(gateway, lead_id=lead_id)
|
|
103
|
+
|
|
104
|
+
@mcp.tool()
|
|
105
|
+
async def lovarch_render(
|
|
106
|
+
description: str,
|
|
107
|
+
output_path: str,
|
|
108
|
+
mode: str | None = None,
|
|
109
|
+
render_style: str = "moderno",
|
|
110
|
+
aspect_ratio: str = "16:9",
|
|
111
|
+
reference_image_path: str | None = None,
|
|
112
|
+
language: str = "it",
|
|
113
|
+
) -> dict:
|
|
114
|
+
"""Render fotorealistico via Render Studio Lovarch (crediti addebitati
|
|
115
|
+
dalla piattaforma). mode: null=sketch/testo→render 2D ·
|
|
116
|
+
room_render/render_3d/plan_to_3d=3D (costo maggiore) ·
|
|
117
|
+
lighting_only/closeup_detail/closeup_angle. reference_image_path invia
|
|
118
|
+
uno sketch/foto/pianta come riferimento."""
|
|
119
|
+
return await tools.tool_render(
|
|
120
|
+
workflows, description=description, output_path=output_path,
|
|
121
|
+
mode=mode, render_style=render_style, aspect_ratio=aspect_ratio,
|
|
122
|
+
reference_image_path=reference_image_path, language=language,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
@mcp.tool()
|
|
126
|
+
async def lovarch_colors(
|
|
127
|
+
style: str = "modern",
|
|
128
|
+
base_colors: list[str] | None = None,
|
|
129
|
+
image_url: str | None = None,
|
|
130
|
+
language: str = "it",
|
|
131
|
+
) -> dict:
|
|
132
|
+
"""Palette colori brand via piattaforma Lovarch. Con image_url la
|
|
133
|
+
palette è estratta dall'immagine. style: modern|vintage|natural|bold|custom."""
|
|
134
|
+
return await tools.tool_colors(
|
|
135
|
+
workflows, style=style, base_colors=base_colors,
|
|
136
|
+
image_url=image_url, language=language,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
@mcp.tool()
|
|
140
|
+
async def lovarch_copy(
|
|
141
|
+
brief: str,
|
|
142
|
+
mode: str = "post",
|
|
143
|
+
slide_count: int = 5,
|
|
144
|
+
language: str = "it",
|
|
145
|
+
) -> dict:
|
|
146
|
+
"""Copy di marketing (caption + hashtags + headline) via piattaforma
|
|
147
|
+
Lovarch. mode: post|story|carousel."""
|
|
148
|
+
return await tools.tool_copy(
|
|
149
|
+
workflows, brief=brief, mode=mode, slide_count=slide_count, language=language,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
@mcp.tool()
|
|
153
|
+
def lovarch_verify_misure(dxf_path: str) -> dict:
|
|
154
|
+
"""Verifica deterministica di un DXF: layer ISO (UNI ISO 5457),
|
|
155
|
+
etichette ambienti, cartiglio CNAPPC. Gratuita (nessun credito)."""
|
|
156
|
+
return tools.tool_verify_misure(dxf_path)
|
|
157
|
+
|
|
158
|
+
@mcp.tool()
|
|
159
|
+
async def lovarch_verify_normativa(document_path: str, language: str = "it") -> dict:
|
|
160
|
+
"""Verifica ADVERSARIALE delle citazioni normative di un documento
|
|
161
|
+
(.pdf/.md/.txt): Sonnet 5 estrae le citazioni, Opus 4.8 prova a
|
|
162
|
+
confutarle (articoli fantasma, norme citate a sproposito). Addebita
|
|
163
|
+
crediti per i token reali. Verdetto PASS/CONCERNS/REJECT."""
|
|
164
|
+
return await tools.tool_verify_normativa(
|
|
165
|
+
gateway, document_path=document_path, language=language,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
@mcp.tool()
|
|
169
|
+
async def lovarch_verify_contratto(document_path: str, language: str = "it") -> dict:
|
|
170
|
+
"""Verifica ADVERSARIALE di un contratto CNAPPC (.pdf/.md/.txt):
|
|
171
|
+
completezza delle 12 sezioni + regola compenso (per cliente privato i
|
|
172
|
+
parametri DM 17/06/2016 sono orientativi → CONCERN, mai illecito).
|
|
173
|
+
Addebita crediti per i token reali."""
|
|
174
|
+
return await tools.tool_verify_contratto(
|
|
175
|
+
gateway, document_path=document_path, language=language,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
@mcp.tool()
|
|
179
|
+
async def lovarch_verify_dossier(directory: str, language: str = "it",
|
|
180
|
+
max_llm_files: int = 8) -> dict:
|
|
181
|
+
"""QA completo standalone su una cartella di deliverable: DXF (gratis) +
|
|
182
|
+
documenti normativi/contratti (adversarial, crediti). Verdetto
|
|
183
|
+
aggregato PASS/CONCERNS/REJECT per file e complessivo."""
|
|
184
|
+
return await tools.tool_verify_dossier(
|
|
185
|
+
gateway, directory=directory, language=language, max_llm_files=max_llm_files,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
@mcp.tool()
|
|
189
|
+
async def lovarch_job_status(job_id: str | None = None, limit: int = 10) -> dict:
|
|
190
|
+
"""Stato dei job asincroni della piattaforma (video, export Shotstack,
|
|
191
|
+
upscale). Senza job_id elenca i job recenti. Costi solo in crediti."""
|
|
192
|
+
return await tools.tool_job_status(workflows, job_id=job_id, limit=limit)
|
|
193
|
+
|
|
194
|
+
return mcp
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def serve() -> None:
|
|
198
|
+
"""Build the server and run it over stdio (blocking)."""
|
|
199
|
+
build_server().run()
|