소스 정보
- 저장소
- jleechanorg/claude-commands
- 최근 소스 활동
- 2026년 8월 2일 01:06
- 감지된 SKILL.md 언어
- 영어
- 스타
- 3
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/jleechanorg/claude-commands --skill read-grok-shared-link명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
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.