소스 정보
- 저장소
- cookjohn/wos-skills
- 최근 소스 활동
- 2026년 3월 9일 23:58
- 감지된 SKILL.md 언어
- 영어
- 스타
- 113
- 포크
- 17
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/cookjohn/wos-skills --skill wos-paper-detail명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | wos-paper-detail |
| description | Get detailed information for a paper by WoS ID (e.g., WOS:000779183600001). |
| argument-hint | [WoS ID or full-record URL] |
| user-invocable | true |
| disable-model-invocation | false |
Navigate to a WoS full record page and extract comprehensive paper metadata.
Accept either:
WOS:000779183600001https://www.webofscience.com/wos/woscc/full-record/WOS:000779183600001Extract the WoS ID if a full URL is provided.
navigate_page({
url: "{BASE_URL}/wos/woscc/full-record/{WOS_ID}",
initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
async () => {
// Wait for full record to load
for (let i = 0; i < 30; i++) {
if (document.querySelector('[data-ta="FullRTa-fullRecordtitle-0"]')) break;
await new Promise(r => setTimeout(r, 500));
}
await new Promise(r => setTimeout(r, 1500));
// Check access
if (document.body.innerText.includes('Sign in') && !document.querySelector('[data-ta="FullRTa-fullRecordtitle-0"]')) {
return { status: 'login_required' };
}
// Helper: get value for a labeled field (h3 label -> parent's non-h3 children)
const getField = (label) => {
const h3 = [...document.querySelectorAll('h3')].find(h => h.textContent.trim() === label);
if (!h3) return '';
const parent = h3.parentElement;
const valueEls = [...parent.children].filter(el => el.tagName !== 'H3');
return valueEls.map(s => s.textContent?.trim()).join(' ').substring(0, 300) || '';
};
// Title
const title = document.querySelector('[data-ta="FullRTa-fullRecordtitle-0"]')?.textContent?.trim() || '';
// Authors
const authors = [...document.querySelectorAll('[data-ta^="SumAuthTa-DisplayName-author-en"]')]
.map(a => a.textContent?.trim());
// Abstract
const abstract = document.querySelector('div.abstract--instance')?.textContent?.trim() || '';
// Source/Journal - extract only journal name from the JCR sidenav component
let source = '';
const sourceSpan = document.querySelector('h3[data-ta="FullRTa-sourceLabel"]')?.parentElement?.querySelector('span.section-label-data');
if (sourceSpan) {
// The span contains app-jcr-sidenav with journal name + popup. Get first text content before "arrow_back"
const fullText = sourceSpan.textContent?.trim() || '';
source = fullText.split('arrow_back')[0].trim();
}
if (!source) {
source = document.querySelector('.summary-source-title-link')?.firstChild?.textContent?.trim() || '';
}
// DOI - try link first, fall back to h3 label extraction
const doiEl = document.querySelector('a[href*="doi.org"]');
const doi = doiEl?.textContent?.trim() || doiEl?.href?.replace(/.*doi\.org\//, '') || getField('DOI');
// Metadata fields
const volume = getField('Volume');
const issue = getField('Issue');
const pages = getField('Page');
const published = getField('Published');
const earlyAccess = getField('Early Access');
const docType = getField('Document Type');
const language = getField('Language');
const accessionNumber = getField('Accession Number');
const issn = getField('ISSN');
const eissn = getField('eISSN');
// Keywords - use parentElement.querySelectorAll('a') to get ALL keyword links
const getKeywords = (label) => {
const h3 = [...document.querySelectorAll('h3')].find(h => h.textContent.trim() === label);
if (!h3) return [];
return [...h3.parentElement.querySelectorAll('a')].map(a => a.textContent?.trim()).filter(Boolean);
};
const authorKeywords = getKeywords('Author Keywords');
const keywordsPlus = getKeywords('Keywords Plus');
// Categories
const researchAreas = getField('Research Areas');
const wosCategories = getField('Web of Science Categories');
// Citations - full record page uses FullRRPTa selectors, NOT stat-number selectors
const citedLinks = [...document.querySelectorAll('a[data-ta*="times-cited-count-link"]')];
// WOSCC link text is "992 In Web of Science Core Collection" - extract leading number
const extractNum = (text) => (text?.match(/^[\d,]+/) || ['0'])[0];
const wosccCited = extractNum(citedLinks.find(a => a.getAttribute('data-ta')?.includes('-WOSCC'))?.textContent?.trim());
const alldbCited = extractNum(citedLinks.find(a => a.getAttribute('data-ta')?.includes('-ALLDB'))?.textContent?.trim());
const mainCited = extractNum(citedLinks.find(a => /^\d/.test(a.textContent?.trim()))?.textContent?.trim());
const citedCount = wosccCited || mainCited || '0';
// References
const refsCount = document.querySelector('a[data-ta*="refCountLink"]')?.textContent?.trim() || '0';
// JIF - extract from JCR popup/sidenav text content
let jif = '', jifYear = '', jifFiveYear = '', jcrQuartile = '';
const jcrPopup = document.querySelector('[class*="journal-content"], app-jcr-sidenav');
if (jcrPopup) {
const jcrText = jcrPopup.textContent || '';
// Pattern: "Journal Impact Factor ™20242.8Five Year3.4"
const jifMatch = jcrText.match(/Impact Factor\s*(?:™|TM)?\s*(\d{4})\s*([\d.]+)/);
if (jifMatch) { jifYear = jifMatch[1]; jif = jifMatch[2]; }
const fyMatch = jcrText.match(/Five Year\s*([\d.]+)/);
if (fyMatch) jifFiveYear = fyMatch[1];
// Quartile: "159/316 Q3" pattern in JCR summary
const qMatch = jcrText.match(/\d+\/\d+\s*(Q[1-4])/);
if (qMatch) jcrQuartile = qMatch[1];
}
// Full text links
const ftLinks = [...document.querySelectorAll('a[data-ta^="FRLinkTa"]')].map(a => ({
text: a.textContent?.trim()?.replace(/open_in_new/g, '').trim(),
href: a.href
})).filter(l => l.text);
return {
status: 'ok',
title, authors, abstract, source, doi,
volume, issue, pages, published, earlyAccess,
docType, language, accessionNumber, issn, eissn,
authorKeywords, keywordsPlus,
researchAreas, wosCategories,
citedCount, alldbCited, refsCount,
jif, jifYear, jifFiveYear, jcrQuartile,
ftLinks
};
}
Format the output as a structured summary:
## {Title}
**Authors**: {authors joined by "; "}
**Source**: {source}, Vol. {volume}, Iss. {issue}, pp. {pages}
**Published**: {published}
**DOI**: {doi}
**Document Type**: {docType}
**WoS ID**: {accessionNumber}
### Abstract
{abstract}
### Keywords
- **Author Keywords**: {authorKeywords}
- **Keywords Plus**: {keywordsPlus}
### Metrics
- **Times Cited (WOSCC)**: {citedCount}
- **Times Cited (All DB)**: {alldbCited}
- **References**: {refsCount}
- **JIF ({jifYear})**: {jif} (Five Year: {jifFiveYear})
- **JCR Quartile**: {jcrQuartile}
### Classification
- **Research Areas**: {researchAreas}
- **WoS Categories**: {wosCategories}
- **ISSN**: {issn} | **eISSN**: {eissn}
### Full Text Links
{list of ftLinks}
Offer next actions:
/wos-export {WoS ID} to export this paper"/wos-download {WoS ID} to download PDF"| Element | Selector | Notes |
|---|---|---|
| Title | [data-ta="FullRTa-fullRecordtitle-0"] | |
| Authors | [data-ta^="SumAuthTa-DisplayName-author-en"] | |
| Abstract | div.abstract--instance | |
| Source label | h3[data-ta="FullRTa-sourceLabel"] | Parent span has JCR popup; split on "arrow_back" |
| DOI | a[href*="doi.org"] | |
| Author Keywords | h3#FRkeywordsTa-authorKeywordsLabel → parent a tags | Use parentElement.querySelectorAll('a') |
| Keywords Plus | Same pattern with "Keywords Plus" label | |
| Citations (WOSCC) | a[data-ta*="times-cited-count-link-WOSCC"] | Full record page only |
| Citations (All DB) | a[data-ta*="times-cited-count-link-ALLDB"] | Full record page only |
| References | a[data-ta*="refCountLink"] | Full record page only |
| Metadata fields | h3 label → parentElement → non-h3 children | Volume, Issue, Page, Published, etc. |
| JIF | Inside app-jcr-sidenav text content | Regex: /Impact Factor\s*™?\s*(\d{4})\s*([\d.]+)/ |
| Full text links | a[data-ta^="FRLinkTa"] |
navigate_page + evaluate_scripta[data-ta="stat-number-citation-related-count"]a[data-ta*="times-cited-count-link-WOSCC"]parentElement.querySelectorAll('a'), NOT nextElementSibling