docs(flows): DoD obligatorio con user-facing surface + abrir issues 0100-0103 (taxonomia, frontmatter migration, dev_console, work dashboard)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-17 00:07:03 +02:00
parent 212875ed0d
commit 5d2a14e50a
77 changed files with 4062 additions and 311 deletions
+25 -4
View File
@@ -1,9 +1,28 @@
"""Invoca `claude -p` via subprocess y devuelve la respuesta como string."""
import os
import shutil
import subprocess
def _resolve_claude_bin() -> str | None:
"""Localiza claude CLI: PATH first, luego rutas convencionales."""
p = shutil.which("claude")
if p:
return p
# Fallback paths comunes (WSL subsession sin .profile cargado, etc).
home = os.path.expanduser("~")
candidates = [
f"{home}/.local/bin/claude",
"/usr/local/bin/claude",
"/opt/homebrew/bin/claude",
]
for c in candidates:
if os.path.isfile(c) and os.access(c, os.X_OK):
return c
return None
def claude_cli_prompt(
prompt: str,
timeout_s: int = 60,
@@ -24,16 +43,18 @@ def claude_cli_prompt(
Respuesta de Claude como texto (stdout), truncada a max_chars_response.
Raises:
FileNotFoundError: Si `claude` no esta en PATH.
FileNotFoundError: Si `claude` no esta en PATH ni rutas convencionales.
RuntimeError: Si exit code != 0 (incluye primeros 500 chars de stderr).
subprocess.TimeoutExpired: Si la llamada supera timeout_s segundos.
"""
if shutil.which("claude") is None:
claude_bin = _resolve_claude_bin()
if claude_bin is None:
raise FileNotFoundError(
"'claude' CLI no encontrado en PATH. Instala Claude Code."
"'claude' CLI no encontrado en PATH ni rutas convencionales "
"(~/.local/bin, /usr/local/bin, /opt/homebrew/bin). Instala Claude Code."
)
cmd = ["claude", "-p", prompt]
cmd = [claude_bin, "-p", prompt]
if model:
cmd.extend(["--model", model])
if extra_args: