Communitygithub.com

plan-canvas

Abre planes y artefactos HTML en un lienzo local del navegador donde el humano anota elementos, chatea y aprueba o solicita cambios sin salir de la página. Úsalo al presentar un plan para revisión, o cuando se necesite retroalimentación.

¿Qué es plan-canvas?

Plan Canvas es una habilidad de agente de IA que implementa un bucle de revisión visual para planes y artefactos HTML locales. Permite al agente presentar un artefacto (como un plan Markdown o una página HTML) en el navegador del usuario, donde éste puede anotar elementos exactos, chatear y emitir un veredicto de 'Aprobar plan' o 'Solicitar cambios', todo sin salir de la página. El agente espera bloqueado en una única llamada CLI que devuelve la retroalimentación como JSON, eliminando la necesidad de que el usuario escriba comandos manualmente o abandone la herramienta. Funciona con cualquier agente o plataforma que pueda ejecutar comandos de shell (Claude Code, Cursor, Codex, Gemini, OpenCode, Copilot) y se activa típicamente con el comando `/plan-canvas`. Es útil para revisiones de diseños, comparaciones, informes o cualquier artefacto local `.md` o `.html`. No debe usarse para revisión de código (`/code-review`), aplicaciones web en ejecución o URLs remotas. El lienzo se sirve desde un servidor loopback local (`127.0.0.1:4517`) que se detiene tras 30 minutos de inactividad. El estado de las sesiones se guarda en `~/.claude/plan-canvas/`.

Compatible con✓Claude Code✓Codex CLI✓Cursor✓Gemini CLI✓OpenCode
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/plan-canvas

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Plan Canvas

Bucle de revisión para planes y artefactos visuales: tú escribes el artefacto, el humano lo revisa en el navegador — anotando el elemento exacto al que se refiere, chateando y emitiendo un veredicto de Aprobar plan / Solicitar cambios — mientras te bloqueas en una única llamada CLI que devuelve su retroalimentación como JSON.

Inspirado por lavish-axi; reconstruido nativo de ECC alrededor de la puerta de confirmación /plan, con cero dependencias.

Cuándo Usarlo

  • Acabas de escribir un artefacto de plan (.claude/plans/*.plan.md de /plan) y necesitas la decisión CONFIRMAR/aprobar — el veredicto del lienzo reemplaza un "sí/proceder" escrito.
  • El usuario debe señalar qué cambiar: revisando diseños, comparaciones, informes o cualquier artefacto local .md / .html.
  • El usuario solicita /plan-canvas, una revisión visual, o "ábrelo en el navegador".

NO usar para: revisión de código de diffs (/code-review), aplicaciones web en ejecución o URLs remotas. El lienzo solo sirve archivos de artefactos locales.

Cómo Funciona

Invoca el CLI como ecc-plan-canvas — el binario distribuido por el paquete ecc-universal (en el PATH después de una instalación global/plugin; node "$CLAUDE_PLUGIN_ROOT/scripts/plan-canvas.js" también funciona para instalaciones plugin). Ejecútalo desde el proyecto que estás revisando; funciona desde cualquier directorio de trabajo. Gestiona un servidor loopback separado (127.0.0.1:4517) compartido por todas las sesiones, indexado por la ruta del artefacto — sin IDs de sesión que rastrear.

El flujo de trabajo es un bucle simple de CLI más JSON, por lo que es independiente del modelo y del entorno: cualquier agente que pueda ejecutar un comando de shell y leer la salida estándar lo maneja de la misma manera (Claude Code, Codex, Cursor, Gemini, OpenCode, Copilot). Actívalo como tu entorno exponga las habilidades — p. ej. /plan-canvas en Claude Code, $plan-canvas en Codex — o simplemente ejecuta los comandos ecc-plan-canvas directamente.

# 1. Abre el artefacto en el navegador del usuario (regresa inmediatamente)
ecc-plan-canvas open .claude/plans/feature.plan.md

# 2. Bloquéate hasta que el humano responda. Déjalo ejecutándose; vuelve a ejecutar si se interrumpe:
#    la retroalimentación en cola nunca se pierde.
ecc-plan-canvas await .claude/plans/feature.plan.md

Mantente a la escucha, o el humano habla con una silla vacía

La retroalimentación solo te llega mientras un await está realmente estacionado en la sesión. Si tu turno termina sin que nada esté escuchando, el mensaje se queda en la cola y, desde el lado del humano del cristal, enviar parece no hacer nada.

Por lo tanto, ejecuta await como una tarea en segundo plano cuando tu entorno lo admita (en Claude Code, una llamada Bash con run_in_background: true). Sale en el momento en que llega la retroalimentación y el entorno te entrega el JSON, lo que mantiene el bucle vivo a través de los turnos en lugar de morir con la llamada en primer plano. Un await en primer plano también funciona, pero solo hasta que el entorno lo limite por tiempo.

Existen dos salvaguardas, y ninguna es una excusa para omitir lo anterior:

  • ecc-plan-canvas pending lista la retroalimentación en cola sin oyente. Verifícalo cada vez que no estés seguro de si te perdiste algo.
  • El hook stop:plan-canvas-pending bloquea que tu turno termine mientras la retroalimentación del lienzo no se haya entregado, y te entrega los mensajes. Si estás leyendo la retroalimentación de ese hook, dejaste de escuchar demasiado pronto.

await imprime JSON cuando el humano actúa:

{
  "status": "feedback",
  "items": [
    { "kind": "annotation", "text": "Divide esto en dos fases",
      "anchor": { "selector": "h2:nth-of-type(3)", "tag": "h2", "snippet": "Fase 2: Migración" } },
    { "kind": "verdict", "verdict": "request-changes" }
  ]
}
  • kind: "chat" — mensaje de forma libre; responde en el lienzo, no en la terminal.
  • kind: "annotation" — retroalimentación anclada a un elemento (anchor.selector, anchor.snippet muestran a qué señalaron; anchor.textRange.text cuando resaltaron un pasaje).
  • kind: "verdict" — approve significa que el plan está CONFIRMADO: deja de sondear, finaliza la sesión y comienza la implementación. request-changes significa revisar el artefacto (el lienzo lo recarga en vivo) y continuar el bucle.

3. Responde siempre en el lienzo, luego sigue escuchando. Un comando hace ambas cosas:

ecc-plan-canvas await <archivo> --reply "Divido la Fase 2 como se solicitó. Échale un vistazo."

Cada mensaje humano recibe una respuesta en el lienzo, incluso una línea como "En ello, reescribiendo la tabla de riesgos ahora." El silencio en el panel de chat es indistinguible de un lienzo roto, que es exactamente el fallo que este bucle existe para prevenir. Responde allí, no solo en la terminal.

Mientras trabajas, mantén el chat honesto con el indicador de actividad:

# burbuja animada "el agente está pensando..."; refréscala durante trabajo largo
ecc-plan-canvas typing <archivo> --state thinking
# cambia a "el agente está escribiendo..." justo antes de que llegue una respuesta
ecc-plan-canvas typing <archivo> --state typing

await establece thinking por ti en el momento en que te entrega un lote, y --reply lo limpia. Ambos estados se autodestruyen, por lo que un agente bloqueado se degrada a un "en cola" honesto en lugar de dejar al humano viendo puntos para siempre. Refresca thinking si una revisión toma más de un minuto.

4. Termina cuando la revisión concluya: ecc-plan-canvas end <archivo>.

Diagramas (Mermaid)

Cuando parte del plan sea un flujo, arquitectura, secuencia, máquina de estados, modelo ER o gráfico de dependencias, escríbelo como un bloque delimitado ```mermaid en lugar de arte ASCII o un muro de prosa — el lienzo lo renderiza como un diagrama temático que el humano puede señalar. Recurre a ello cuando una imagen se lea más rápido que un párrafo; omítelo para listas o tablas simples.

```mermaid
flowchart LR
  A[Mercado resuelve] --> B{¿Observadores?}
  B -->|sí| C[Encolar trabajos] --> D[Trabajador fan-out]
```

Los diagramas se renderizan en el tema oscuro de ECC con la paleta de acentos. Mermaid se carga en el navegador desde un CDN fijo; si no está disponible (sin conexión), el bloque se degrada mostrando su fuente, por lo que la revisión nunca se bloquea. Apunta un mirror local a ECC_PLAN_CANVAS_MERMAID_URL para entornos desconectados.

Reglas

  • Los artefactos Markdown se renderizan en la plantilla de plan de ECC (incluyendo bloques Mermaid); los artefactos .html se renderizan tal cual con la capa de anotación inyectada. Para orientación sobre autoría HTML, usa las habilidades frontend-design-direction y artifact-design.
  • Edita el archivo del artefacto para revisar — el lienzo se recarga en vivo al guardar. Nunca vuelvas a ejecutar open para refrescar.
  • {"status": "ended", "endedBy": "user"} (o sessionEnded: true en un lote de retroalimentación) significa que el usuario cerró la revisión: deja de sondear, entrega las actualizaciones restantes en el chat y no reabras. Un open simple en esa sesión es rechazado; pasa --reopen solo cuando el usuario solicite reanudar.
  • Los activos hermanos (imágenes, CSS) deben estar junto al artefacto y ser referenciados por ruta relativa.
  • El servidor es solo loopback y sale después de 30 minutos de inactividad (ECC_PLAN_CANVAS_IDLE_MS); stop lo apaga explícitamente. El estado reside en ~/.claude/plan-canvas/ (ECC_PLAN_CANVAS_STATE_DIR).

Ejemplos

Flujo de aprobación de plan — /plan escribe .claude/plans/notifications.plan.md y debe ESPERAR confirmación:

ecc-plan-canvas open .claude/plans/notifications.plan.md
ecc-plan-canvas await .claude/plans/notifications.plan.md
# → {"status":"feedback","items":[{"kind":"verdict","verdict":"approve"}]}
ecc-plan-canvas end .claude/plans/notifications.plan.md
# el plan está confirmado — comienza la implementación

Bucle de revisión — llega retroalimentación, editas el archivo, respondes, sigues escuchando:

# await devolvió anotaciones → edita el .plan.md (el lienzo se recarga en vivo)
ecc-plan-canvas await <archivo> --reply "Rehice la tabla de riesgos."
# → se bloquea de nuevo hasta la siguiente respuesta

Antipatrones

  • Sondear con --timeout-ms en un bucle. Existe para pruebas. Deja el await simple ejecutándose en su lugar.
  • Terminar tu turno sin que ningún await esté escuchando mientras la revisión sigue abierta. Ese es el único fallo que el humano experimenta como "Envié un mensaje y no pasó nada".
  • Leer la retroalimentación pero responder solo en la terminal. El humano está mirando el lienzo.
  • Reabrir después de un fin iniciado por el usuario "solo para mostrar" algo.
  • Pegar todo el plan en el chat y abrir un lienzo — elige el lienzo y mantén el resumen de terminal en una línea.
  • Analizar el chat del lienzo desde los archivos de estado — todo lo que necesitas llega a través de await.

Notas de diseño y origen: docs/design/plan-canvas.md.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills relacionados