melkin — ~/lab/decision-tree.mdx

~/lab/decision-tree

decision-tree

La pregunta final de Claude, como un panel de opciones que puedo probar antes

· claude-code · typescript · repo

claude plugin marketplace add melandres8/claude-mods
decision-tree/hooks/register.tsx
// No -f, -F, --follow or --retry: a fork that follows a file never ends. No
// operand starting with +: the traditional form `tail +5f` follows too.
tail: {
  short: 'qrv',
  shortValue: 'nc',
  count: true,
  long: ['--quiet', '--silent', '--verbose'],
  longValue: ['--lines', '--bytes'],
  operand: word => !word.startsWith('+'),
},

Qué hace

Cuando una respuesta de Claude termina con una pregunta, un modelo pequeño (haiku) la lee y propone de 2 a 4 opciones. Cuando Claude llama a AskUserQuestion, el panel toma las preguntas en lugar del diálogo nativo.

Cuando elijo una opción, Claude analiza lo que implica. El análisis cubre qué haría después, los pros, los contras o riesgos, y si el paso es reversible.

El botón ✓ Confirmar envía la respuesta como mi siguiente mensaje. El campo ✎ Otra respuesta agrega mi propia respuesta como una opción más.

Instálalo con el comando de arriba y después con claude plugin install decision-tree@claude-mods. El código está en melandres8/claude-mods, con licencia MIT.

Probar una respuesta en una rama

⑂ Probar en rama arranca una rama: una sesión bifurcada de verdad, que hereda la conversación y el modo de permisos. La rama investiga en modo de solo lectura. Al final deja un informe: qué haría, qué cambios propone, los riesgos y lo que todavía no sabe.

El informe aparece en el panel, y yo decido después de leerlo. Si llega una pregunta nueva, decision-tree detiene las ramas que siguen trabajando en la anterior.

Qué puede llamar una rama

decision-tree revisa cada llamada a herramienta de una rama y rechaza todo lo que no sea leer. El rechazo le pide a la rama que describa el cambio en su informe.

  • Permitidas: Read, Grep, Glob, LSP, ToolSearch y Bash con comandos de solo lectura.
  • Rechazadas: todas las demás herramientas, entre ellas Write, Edit, Agent y las herramientas MCP.
  • Sin herramientas de red: WebFetch y WebSearch también quedan rechazadas. Una rama puede leer un secreto, como un archivo .env, y una URL o una búsqueda lo sacaría.

El guardia lee cada comando de shell como lo leen bash o zsh, palabra por palabra. Cada binario tiene una lista cerrada de flags, como muestra el snippet para tail. El guardia también rechaza la expansión de variables, la sustitución de comandos, los globs y toda redirección que no sea de stderr.

Límites

  • El guardia cierra las herramientas de red, no todo canal. En macOS, leer una ruta bajo /net/<host> hace que el automontador resuelva ese nombre, y una consulta DNS puede sacar datos.
  • git diff, git log -p y git show pueden ejecutar programas que yo configuré en git, como diff.external o textconv. La rama hereda esa configuración.
  • git status puede reescribir la caché de .git/index. No cambia archivos ni historia.
  • Una pregunta final abre el panel por sí sola únicamente cuando el panel está acoplado junto a la conversación. En la pantalla principal, la línea de estado muestra un aviso.

hire.me

¿Construyes algo parecido? Lo hago para clientes. Respondo en menos de 48 h.