con un clic
web
Browse or inspect live web pages.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Browse or inspect live web pages.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
Use when a user wants to report, troubleshoot, or collect context for a WispTerm issue, including crashes, rendering/DPI glitches, high CPU, keyboard/input bugs, selection/copy/scrolling, SSH/SCP failures, SSH image preview failures, HTML preview/browser panel failures, SSH disconnects such as ssh_packet_write_poll/eother, file explorer behavior, updater failures, or remote console behavior.
Use when the user wants to install, repair, or re-apply WispTerm notification reminders (Claude Code Stop + Notification, and Codex turn-complete) in a local WSL/macOS/Linux/PowerShell shell or a saved WispTerm SSH profile, so finishes and confirmation prompts surface inside WispTerm.
Use when the user asks about TBtools, TBtools-II, TBtools RPC API, TBtools CLI, or bioinformatics operations available through TBtools such as sequence manipulation, BLAST, GFF/GTF/GXF processing, expression tables, heatmaps, trees, MCScanX, DIAMOND, HMMER, MUSCLE, and IQ-TREE.
Use when the user asks to inspect, summarize, audit, compare, or troubleshoot this computer's hardware, operating system, CPU, memory, GPU, disk, or local runtime configuration.
Work with PDF files.
| name | web |
| description | Browse or inspect live web pages. |
Use this skill when the user asks to inspect, navigate, extract from, or act on live web pages. Prefer read-only inspection unless the user explicitly asks to interact with the page or submit data.
This default workflow is adapted for WispTerm from GenericAgent's browser-agent pattern: keep the browser state real, keep observations compact, use precise page execution when available, and verify every page-changing action.
Use these snippets with the available browser JavaScript execution tool when that tool exists. They are intentionally compact: paste the helper into the same execution as the action that needs it, then return JSON-shaped data.
function wisptermCompactSnapshot(limit = 120) {
const text = (node) => (node?.innerText || node?.textContent || "")
.replace(/\s+/g, " ")
.trim();
const isVisible = (el) => {
const rect = el.getBoundingClientRect();
const style = getComputedStyle(el);
return rect.width > 1 &&
rect.height > 1 &&
style.display !== "none" &&
style.visibility !== "hidden" &&
Number(style.opacity || 1) > 0;
};
const short = (value, max = 180) => {
value = String(value || "").replace(/\s+/g, " ").trim();
return value.length > max ? value.slice(0, max) + " ..." : value;
};
const describe = (el) => {
const rect = el.getBoundingClientRect();
return {
tag: el.tagName.toLowerCase(),
id: el.id || undefined,
name: el.getAttribute("name") || undefined,
type: el.getAttribute("type") || undefined,
role: el.getAttribute("role") || undefined,
aria: el.getAttribute("aria-label") || undefined,
placeholder: el.getAttribute("placeholder") || undefined,
value: /^(input|textarea|select)$/i.test(el.tagName) ? short(el.value, 80) : undefined,
href: el.href ? short(el.href, 160) : undefined,
label: short(el.getAttribute("aria-label") || el.getAttribute("title") || text(el), 140),
rect: {
x: Math.round(rect.x),
y: Math.round(rect.y),
w: Math.round(rect.width),
h: Math.round(rect.height)
}
};
};
const controlSelector = [
"dialog",
"[role='dialog']",
"[aria-modal='true']",
"button",
"a[href]",
"input:not([type='hidden'])",
"textarea",
"select",
"[role='button']",
"[role='menuitem']",
"[contenteditable='true']"
].join(",");
const controls = Array.from(document.querySelectorAll(controlSelector))
.filter(isVisible)
.slice(0, limit)
.map(describe);
const headings = Array.from(document.querySelectorAll("h1,h2,h3,[role='heading']"))
.filter(isVisible)
.slice(0, 40)
.map((el) => short(text(el), 140))
.filter(Boolean);
return {
url: location.href,
title: document.title,
active: document.activeElement ? describe(document.activeElement) : null,
headings,
controls,
bodyText: short(text(document.body), 4000)
};
}
return wisptermCompactSnapshot();
Paste wisptermCompactSnapshot before this helper. Replace the target-finding
logic with the page-specific action.
async function wisptermWithDelta(action, waitMs = 800) {
const before = wisptermCompactSnapshot(80);
const result = await action();
await new Promise((resolve) => setTimeout(resolve, waitMs));
const after = wisptermCompactSnapshot(80);
return {
result,
urlChanged: before.url !== after.url,
titleChanged: before.title !== after.title,
textChanged: before.bodyText !== after.bodyText,
beforeUrl: before.url,
after
};
}
return await wisptermWithDelta(async () => {
const targetText = "Continue";
const target = Array.from(document.querySelectorAll("button,a,[role='button']"))
.find((el) => (el.innerText || el.textContent || "").trim().includes(targetText));
if (!target) throw new Error("Target not found: " + targetText);
target.click();
return { clicked: targetText };
});
Use this for simple forms. Always inspect the result afterward because some sites reject synthetic events or require trusted input paths.
function wisptermSetValue(selector, value) {
const el = document.querySelector(selector);
if (!el) throw new Error("Element not found: " + selector);
const proto = el.tagName === "TEXTAREA"
? HTMLTextAreaElement.prototype
: HTMLInputElement.prototype;
const descriptor = Object.getOwnPropertyDescriptor(proto, "value");
if (descriptor && descriptor.set) descriptor.set.call(el, value);
else el.value = value;
el.dispatchEvent(new Event("input", { bubbles: true }));
el.dispatchEvent(new Event("change", { bubbles: true }));
return { selector, value: el.value };
}
return wisptermSetValue("input[name='q']", "search terms");