`ClaudeTranslator` implementa el trait `IntentTranslator` igual que el `MockTranslator`, así que el `Orchestrator` no cambia: se traduce una intención NL a un `.swm` válido vía `/v1/messages`. Diseño: - Síncrono (ureq + rustls), consistente con `AgentClient`. Tokio entraría sólo si el resto del crate lo pidiera. - Trait `HttpClient` inyectable ⇒ tests sin red contra una fake que captura el request y devuelve un body pre-armado. - Modelo por defecto: `claude-opus-4-8` (Opus 4.8, el más capaz al día de hoy). Adaptive thinking + `effort=high` por defecto. Override por env (`HAMMER_LLM_MODEL`, `HAMMER_LLM_EFFORT`, `HAMMER_LLM_BASE_URL`). - System prompt documenta el shape exacto del `.swm` (4 variantes de mutación) y obliga JSON puro. Parseamos con `serde_json::from_str:: <Swm>` + `verify_schema()` como gate adicional. Manejamos `refusal`, error envelopes de la API y code-fence markdown. Activación: - Sin feature: el módulo declara los tipos pero `ClaudeTranslator::new` está bajo cfg. El binario compila sin red. - Con `--features llm-claude`: trae `ureq` con rustls, y la CLI activa `hammer ai --llm`. CLI: - `hammer ai` gana `--llm` (mutuamente excluyente con `--catalog`). Refactor de `run_ai` en helpers `run_with_mock_translator` / `run_with_llm_translator` para mantener legible el dispatch. - Sin la feature, `--llm` falla con un mensaje claro pidiendo recompilar. Tests (7 unit): happy path con verificación de URL/headers/body, unwrap de markdown, `refusal`, error envelope, SWM mal formado, verify_schema, helpers de strip_code_fence.
36 lines
918 B
TOML
36 lines
918 B
TOML
[package]
|
|
name = "hammer-cli"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
authors.workspace = true
|
|
repository.workspace = true
|
|
description = "El binario `hammer`: orquesta build, hydrate, try/commit, apply/export y ctl."
|
|
|
|
[[bin]]
|
|
name = "hammer"
|
|
path = "src/main.rs"
|
|
|
|
[features]
|
|
default = []
|
|
# Activa el traductor LLM real (Claude API) detrás del flag `hammer ai --llm`.
|
|
# Sin esta feature, `--llm` falla con un mensaje claro pidiendo recompilar.
|
|
llm-claude = ["hammer-agent/llm-claude"]
|
|
|
|
[dependencies]
|
|
hammer-core.workspace = true
|
|
hammer-build.workspace = true
|
|
hammer-overlay.workspace = true
|
|
hammer-journal.workspace = true
|
|
hammer-agent.workspace = true
|
|
serde_json.workspace = true
|
|
base64.workspace = true
|
|
anyhow.workspace = true
|
|
clap.workspace = true
|
|
tracing.workspace = true
|
|
tracing-subscriber.workspace = true
|
|
|
|
[dev-dependencies]
|
|
tempfile.workspace = true
|
|
base64.workspace = true
|