Skip to main content
ClaudeWave
Skill1.6k estrellas del repoactualizado 3d ago

screenshot-with-callout

Mandatory point-of-use sequence for capturing annotated screenshots that go into deliverables (ClickUp reviews, bug repros, internal evidence, end-user docs). Invoke this BEFORE every screenshot capture, not once per session, so the rules are fresh in context at the moment you actually shoot. Covers the annotate → verify-crop → shoot → read-back flow, the helper JS files (annotate.js, verify-crop.js), and the audience-specific annotation rules (label vs. no label). If you are about to type `agent-browser screenshot file.png` for any reason other than throwaway debugging, invoke this skill first.

Instalar en Claude Code
Copiar
git clone --depth 1 https://github.com/relaticle/relaticle /tmp/screenshot-with-callout && cp -r /tmp/screenshot-with-callout/.claude/skills/screenshot-with-callout ~/.claude/skills/screenshot-with-callout
Después abre una sesión nueva de Claude Code; el skill carga automáticamente.

SKILL.md

# Screenshot capture sequence (mandatory at point of use)

**Invoke this skill via the Skill tool every time you are about to take a screenshot for a deliverable.** Do not rely on having read it earlier in the session. By the time you need it, the previous read is far back in your context and you will be running on vague recall. That recall is exactly what produces full-page screenshots with no callout, evidence the reviewer can't find, and clipped frames. The fix is to re-load this skill at the moment of use so the rules are adjacent to the action.

**Hard rule, before anything else:** `agent-browser screenshot file.png` with no `--selector` and no prior annotation is **forbidden** for deliverables. Raw full-viewport shots are always wrong. The only acceptable use of `agent-browser screenshot` without these prerequisites is `/tmp/debug-*.png` files for live debugging that will never be uploaded or referenced anywhere a human will see them.

## Why screenshots fail (the three reliable failure modes)

1. **The important thing is tiny.** It's one region on a busy page, surrounded by sidebar, topbar, and unrelated widgets the reviewer already knows.
2. **The important thing is cut off**: partially below the fold, sticky header covering the heading, or a dropdown clipped at the viewport edge.
3. **There's no visual indication of what to look at.** The reviewer sees a screen full of form fields and has to guess which one you mean.

A screenshot that doesn't clearly show the thing it's meant to prove is **worse than no screenshot at all**. It forces the reviewer to either trust you blindly or re-run the flow themselves. The whole point of evidence is that it's self-describing.

## Two audiences, two annotation rules

The red outline box is always welcome. The text label is the difference:

| Audience | Red outline box | Text label on the box |
|---|---|---|
| **ClickUp business reviews, bug repros, internal evidence** | Yes | **Yes**, the reviewer needs the image to self-describe |
| **End-user documentation** (`docs/docs/en/**/*.md`) | Yes | **No**, the image must not contain prose annotations |

For docs, draw a clean red outline around the element the reader should notice (no label) and explain what they're looking at in the surrounding markdown, either a `>{info}` callout or a sentence immediately above the image. End users opening the docs don't want prose burned into the image; the UI should look like what they see when they open the app, with only the visual cue pointing at the element.

For business reviews, keep the label. The ClickUp reviewer isn't reading a whole paragraph around the attachment, and they need the image to self-describe.

When in doubt, pass a label argument of `null` to the annotation helper to skip the text tag and keep only the outline.

## The capture sequence, where every step is mandatory

### Step 1. Know what you're capturing

Write the one-sentence purpose first, before touching the browser: *"the Partner Housed Configuration section with the services-only banner visible"*. If you can't say it in one sentence, you don't yet understand what the case is supposed to prove and you're not ready to shoot.

For business reviews, this should match the `evidence:` field from your Phase 4 plan (see `business-review` skill). If it doesn't match, stop and update the plan first. Improvising at capture time is how shots go wrong.

### Step 2. Scroll the target into the middle of the viewport

Use `scrollIntoView({block: "center"})`, **not** `{block: "start"}`, because `start` pins the element under the sticky topbar where it gets covered. Then verify with `getBoundingClientRect`:

```bash
agent-browser eval 'var el = document.querySelector("SELECTOR"); var r = el.getBoundingClientRect(); JSON.stringify({top:r.top,bottom:r.bottom,left:r.left,right:r.right,vh:innerHeight,vw:innerWidth,fullyVisible: r.top>=0 && r.bottom<=innerHeight && r.left>=0 && r.right<=innerWidth})'
```

If `fullyVisible` is false, either scroll differently, expand the viewport (`set viewport 1920 1400`), or crop to the element via `--selector` in step 5. **Cut-off content is a failed shot, not a done shot.**

### Step 3. Annotate: write `/tmp/annotate.js` once per session, then call it

Save the annotation helper to `/tmp/annotate.js` once at the start of your session, then call it before every screenshot. The helper draws a red outline + optional label on a fixed-position overlay that doesn't disturb the page layout:

```bash
cat > /tmp/annotate.js <<'EOF'
(sel, label) => {
  const el = document.querySelector(sel);
  if (!el) return 'no element';
  const r = el.getBoundingClientRect();
  const box = document.createElement('div');
  box.setAttribute('data-ai-callout', '1');
  Object.assign(box.style, {
    position: 'fixed',
    top: (r.top - 6) + 'px',
    left: (r.left - 6) + 'px',
    width: (r.width + 12) + 'px',
    height: (r.height + 12) + 'px',
    border: '3px solid #ef4444',
    borderRadius: '8px',
    boxShadow: '0 0 0 4px rgba(239,68,68,0.25)',
    pointerEvents: 'none',
    zIndex: '2147483647',
  });
  if (label) {
    const tag = document.createElement('div');
    tag.textContent = label;
    Object.assign(tag.style, {
      position: 'absolute',
      top: '-28px',
      left: '-3px',
      background: '#ef4444',
      color: 'white',
      font: '600 12px/1.2 system-ui, sans-serif',
      padding: '4px 8px',
      borderRadius: '6px',
      whiteSpace: 'nowrap',
    });
    box.appendChild(tag);
  }
  document.body.appendChild(box);
  return 'annotated';
}
EOF
```

Then for each screenshot:

```bash
agent-browser eval "($(cat /tmp/annotate.js))('#partner-housed-section', 'Partner Housed Configuration')"
```

Pass `null` as the second argument to omit the label (for end-user docs).

For multiple highlights on one screenshot, call the function once per element with different labels. Keep callouts focused: **1-3 per image, never a rainbow of boxes**. A callout that highlights everything
agent-browser-relaticleSkill

Use whenever driving agent-browser against the local Relaticle app (relaticle.test and its panels) for testing, QA, business review, or UI automation. Covers Filament v5 + Livewire v4 quirks specific to this codebase: panel URL derivation (domain-routed vs path-routed, never assumed), login flows for the app and sysadmin panels, seeded credentials, Select/date-picker interaction, the $wire.mountAction gold pattern, tenant switching, Reverb/queue hazards, and session isolation. Every hard fact here is a DATED CACHED HINT. When one fails, re-derive from the running app and update this file (self-heal). Not for other sites or generic browser automation.

ai-sdk-developmentSkill

TRIGGER when working with ai-sdk which is Laravel official first-party AI SDK. Activate when building, editing AI agents, chatbots, text generation, image generation, audio/TTS, transcription/STT, embeddings, RAG, vector stores, reranking, structured output, streaming, conversation memory, tools, queueing, broadcasting, and provider failover across OpenAI, Anthropic, Gemini, Azure, Groq, xAI, DeepSeek, Mistral, Ollama, ElevenLabs, Cohere, Jina, and VoyageAI. Invoke when the user references ai-sdk, the `Laravel\Ai\` namespace, or this project's AI features — not for other AI packages used directly.

business-reviewSkill

Use when the user asks to business-review their work (local mode default, via 'business-review' or 'review my branch'), a Relaticle pull request ('--pr <N>' or a bare PR number), or a described change (--describe). v3 is a panel-of-QAs engine. It resolves the live environment first (URLs/creds/queue/Redis/Reverb are DISCOVERED from the running app, never assumed), runs a browser-capability preflight, auto-tiers by blast radius, synthesizes journeys from the diff plus Relaticle CRM priors, walks them happy AND sad through the real browser, sweeps the regression ledger, adversarially cold-reproduces every bug, and emits a substance-gated verdict (ai-approved / ai-rejected / ai-needs-human, or blocked on a degraded channel). Browser-truth only: never tinker or hit the DB to fix or fake a result. On request ('fix all issues', --fix) enters fix mode: fix → re-verify each finding against its original repro → re-gate. Publishing to the PR is opt-in and hard-disabled on a degraded run. Does NOT do code/security/scope review; for that use /code-review, /review, /deep-review.

cashier-stripe-developmentSkill

Handles Laravel Cashier Stripe integration including subscriptions, webhooks, Stripe Checkout, invoices, charges, refunds, trials, coupons, metered billing, and payment failure handling. Triggered when a user mentions Cashier, Billable, IncompletePayment, stripe_id, newSubscription, Stripe subscriptions, or billing. Also applies when setting up webhooks, handling SCA/3DS payment failures, testing with Stripe test cards, or troubleshooting incomplete subscriptions, CSRF webhook errors, or migration publish issues.

configuring-horizonSkill

Use this skill whenever the user mentions Horizon by name in a Laravel context. Covers the full Horizon lifecycle: installing Horizon (horizon:install, Sail setup), configuring config/horizon.php (supervisor blocks, queue assignments, balancing strategies, minProcesses/maxProcesses), fixing the dashboard (authorization via Gate::define viewHorizon, blank metrics, horizon:snapshot scheduling), and troubleshooting production issues (worker crashes, timeout chain ordering, LongWaitDetected notifications, waits config). Also covers job tagging and silencing. Do not use for generic Laravel queues without Horizon, SQS or database drivers, standalone Redis setup, Linux supervisord, Telescope, or job batching.

echo-developmentSkill

Develops real-time broadcasting with Laravel Echo. Activates when setting up broadcasting (Reverb, Pusher, Ably); creating ShouldBroadcast events; defining broadcast channels (public, private, presence, encrypted); authorizing channels; configuring Echo; listening for events; implementing client events (whisper); setting up model broadcasting; broadcasting notifications; or when the user mentions broadcasting, Echo, WebSockets, real-time events, Reverb, or presence channels.

fortify-developmentSkill

ACTIVATE when the user works on authentication in Laravel. This includes login, registration, password reset, email verification, two-factor authentication (2FA/TOTP/QR codes/recovery codes), passkeys, profile updates, password confirmation, or any auth-related routes and controllers. Activate when the user mentions Fortify, auth, authentication, login, register, signup, forgot password, verify email, 2FA, passkeys, WebAuthn, or references app/Actions/Fortify/, CreateNewUser, UpdateUserProfileInformation, FortifyServiceProvider, config/fortify.php, or auth guards. Fortify is the frontend-agnostic authentication backend for Laravel that registers all auth routes and controllers. Also activate when building SPA or headless authentication, customizing login redirects, overriding response contracts like LoginResponse, or configuring login throttling. Do NOT activate for Laravel Passport (OAuth2 API tokens), Socialite (OAuth social login), or non-auth Laravel features.

infer-conventionsSkill

Use this skill to analyze how a Laravel application is actually written and record its conventions as shared rules. Trigger when the user wants to detect, infer, document, or standardize project conventions or coding style, set up or grow `.ai/rules`, resolve mixed or conflicting patterns (e.g. \"are we using Form Requests or inline validation?\"), or onboard agents and teammates to \"how we do things here\". Covers: a systematic sweep of ~49 Laravel convention dimensions (validation, models, architecture, testing, frontend, database, console), open-ended house-pattern discovery, conflict reporting, and recording rules scoped to the right paths via the Boost `record-rule` MCP tool. Do not use for one-off code review, enforcing formatting a linter already handles, or editing `.ai/rules` files by hand.