用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/jleechanorg/claude-commands --skill read-grok-shared-link命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Token-efficient second opinion slash command /advice. Extracts decision point + artifact (≤150 lines), then fans out in parallel: (1) Opus subagent reviewer with fallback chain codex→agy→cursor, (2) /research on the decision topic, (3) /secondo multi-model opinion. Use instead of advisor() which ships the full conversation uncached.
Use this skill when working in repositories managed by Agent Orchestrator or when the user asks how to use `ao` properly. Covers the default AO workflow: bootstrap with `ao start`, dispatch work with `ao spawn`, inspect progress with `ao status` or `ao session ls`, steer sessions with `ao send`, and recover or clean up sessions safely. Includes strict parameter fidelity, pre-spawn cap cleanup, quota-wall fallback, and post-spawn verification.
Generate a full agento PR status report — draft readiness, canonical /green, zero-touch rate, inline display, and Slack summary.
基于 SOC 职业分类
正在显示 SKILL.md
| name | read-grok-shared-link |
| description | Read grok.com/share/* via Aside REPL openTab. |
| allowed-tools | ["Bash","Read"] |
| context | inline |
The Grok share page (https://grok.com/share/<shareLinkId>) is a Next.js / Turbopack
React app. The conversation is held in client-side React state, NOT in the initial
HTML. All "normal" extraction paths return an empty / nearly-empty document:
| Path | What you get | Why it fails |
|---|---|---|
terminal: curl <share-url> | HTML shell only (Next.js bundle, GTM, Sentry, no conversation body) | React app needs hydration |
web_extract(<share-url>) | Empty / error — DDGS is search-only in this runtime; Firecrawl not configured | Same root cause |
browser_navigate(<share-url>) | Returns (empty page) with element_count: 0 | The browser tool snapshots BEFORE the React app hydrates; first response is the empty shell |
aside repl openTab(<share-url>) + 8s wait + body.innerText | Full conversation text | Works — Aside waits for the page to settle, then the JS DOM has the messages |
Trigger this skill when all three of these hold:
grok.com/share/<shareLinkId> URL.terminal: curl <url> returns the Next.js shell (Next.js chunks, GTM, Sentry
baggage, React server-component scripts) without any conversation body.web_extract(<url>) and browser_navigate(<url>) both return empty / (empty page).If the user has already pasted the conversation text in the chat, skip this skill.
# 1. Confirm Aside is alive
aside --version # 1.26.709.1533+
aside account list # should show * u0 $USER@gmail.com signed in
# 2. Open the share page in Aside
cat > /tmp/grok_fetch.js <<'JS'
const p = await openTab('https://grok.com/share/<shareLinkId>');
// Wait 6-10 seconds for React to hydrate and the conversation DOM to populate
await new Promise(r => setTimeout(r, 8000));
const text = await page.evaluate(() =>
document.body ? document.body.innerText : 'NO BODY'
);
console.log('TEXT_LEN:', text.length);
console.log('---FULL TEXT---');
console.log(text);
JS
aside repl "$(cat /tmp/grok_fetch.js)"
Multi-line JS in aside repl MUST go through $(cat file) or a quoted heredoc — bash
tokenizes parens / template literals before Aside sees them. See
~/.hermes/skills/aside-browser-default/references/aside-repl-api-gotchas.md §
"Multi-line REPL scripts" for the full pattern.
If the conversation is longer than ~10K characters, the messages may be in a virtualized
list. The default body.innerText returns the rendered viewport only. To get the full
thread:
cat > /tmp/grok_fetch_long.js <<'JS'
const p = await openTab('https://grok.com/share/<shareLinkId>');
await new Promise(r => setTimeout(r, 6000));
// Scroll the message container to the bottom several times to force virtualized list to render
for (let i = 0; i < 6; i++) {
await page.evaluate(() => {
const sc = document.querySelector('main, [class*="scroll"], [class*="conversation"]')
|| document.scrollingElement;
sc.scrollTop = sc.scrollHeight;
});
await new Promise(r => setTimeout(r, 1500));
}
const text = await page.evaluate(() => document.body.innerText);
console.log('TEXT_LEN:', text.length);
console.log('---FULL TEXT---');
console.log(text);
JS
aside repl "$(cat /tmp/grok_fetch_long.js)"
For very long threads (>50K chars), the output may be truncated by terminal capture. In
that case, dump the text to a file via the page-side evaluate → return as a base64
string → decode locally:
cat > /tmp/grok_dump.js <<'JS'
const p = await openTab('https://grok.com/share/<shareLinkId>');
await new Promise(r => setTimeout(r, 8000));
for (let i = 0; i < 6; i++) {
await page.evaluate(() => {
const sc = document.querySelector('main, [class*="scroll"], [class*="conversation"]')
|| document.scrollingElement;
sc.scrollTop = sc.scrollHeight;
});
await new Promise(r => setTimeout(r, 1500));
}
const text = await page.evaluate(() => document.body.innerText);
console.log(Buffer.from(text).toString('base64'));
JS
aside repl "$(cat /tmp/grok_dump.js)" | tail -n +2 | base64 -d > /tmp/grok_thread.txt
wc -l /tmp/grok_thread.txt
body.innerText. Use
String.split('Toggle Sidebar')[1] to strip it, or filter the text you need.closeAllTabs() in the REPL (verified 2026-07-31). Don't try to call it —
wrap in try/catch if cleanup matters, or accept the tab stays open.aside repl call is a fresh process. Variables
declared in one invocation don't persist. This is fine for the read-only fetch
pattern, just be aware.aside --account u0 if needed. The user's Profile 0 = $USER@gmail.com is the default.browser_click / browser_type from aside repl — they don't exist
in the REPL. The REPL is read-only. For OAuth or interactive flows, drop to the
full mcp__aside-mcp__* tools if your runtime exposes them.chatgpt.com/share/<id> curl with a
normal user-agent; for Gemini try web_extract; for Claude there's no public share
mechanism.annotatedScreenshot() in the
Aside REPL after the page hydrates.aside --version # 1.26.x
aside account list | head -3 # signed-in profile
aside repl "console.log('ok')" # REPL works
If any fails, fall back to the next-most-likely path:
| Failure | Fallback |
|---|---|
| Aside not installed | curl -fsSL https://releases.aside.com/install.sh | bash |
| Aside signed out | aside account list to confirm; user signs in via Aside GUI |
| Page returns auth wall | Report to user, ask for plain-text paste |
body.innerText returns sidebar only | Conversation is virtualized — use the scrolling recipe above |
| Still empty after 8s | Wait longer (15s) or check if the shareLinkId is valid |
~/.hermes/skills/aside-browser-default/SKILL.md — full
Aside CLI / REPL / MCP surface, headless default, OAuth capture pattern.~/.hermes/skills/aside-browser-default/references/aside-repl-api-gotchas.md
— why multi-line JS needs $(cat file), why screenshot() doesn't exist, etc.~/.claude/skills/browser-headless-default/SKILL.md —
broader headless policy; this skill is the Grok-specific instance.~/.claude/CLAUDE.md section "Tavily is disabled" — DDGS is
search-only, can't extract Grok share pages.openTab + 8s wait +
body.innerText returned the full 60K-character thread in one shot.