ArxivJS Viewerarxivjs 데이터 폴더에 정리된 논문을 VS Code에서 읽기 전용으로 열람하는 확장이다.
이 확장은 데이터 폴더의 파일을 절대 수정하지 않는다. 데이터 폴더(arxivjsdata)는 arxivjs 앱으로 만들고 편집한다. 논문 검색과 추가, 요약 문서 생성, 메타 정보 관리, 하이라이트가 모두 그 앱의 일이다. arxivjs 앱에서 바꾼 내용은 이 확장의 Reload 버튼을 눌러 반영한다.
목차사용자 가이드요구 사항
설치다음 세 가지 방법 중 하나를 쓴다. 방법 1. Marketplace에서 설치
명령줄에서는 방법 2.
|
| 버튼 위치 | 다시 읽는 범위 |
|---|---|
TOPICS 제목줄 ⟳ |
전체(주제 목록과 펼쳐진 주제의 논문) |
홈 ⟳ |
전체 |
주제 노드 옆 ⟳ |
그 주제의 논문 목록 |
Topic 패널 ⟳ |
그 주제의 논문 목록 |
Paper 패널 ⟳ |
그 논문의 메타 정보와 문서 |
설정 항목
| 설정 | 기본값 | 설명 |
|---|---|---|
arxivjs.dataFolder |
"" |
데이터 폴더의 절대 경로 |
arxivjs.paperSort |
citation |
논문 정렬 기준: citation(인용수), year(연도), title(제목) |
arxivjs.openInNewTab |
true |
true이면 논문마다 새 탭을 연다. false이면 논문 탭 하나를 재사용한다. |
arxivjs.paperPanelLocation |
sameGroup |
논문을 열 편집기 그룹. sameGroup은 논문 목록과 같은 그룹이라 화면을 나누지 않는다. beside는 목록 옆 그룹이다. |
arxivjs.openHomeOnStartup |
true |
ArxivJS 뷰를 처음 열 때 주제 목록(홈)을 함께 연다. |
명령 목록
Command Palette(Ctrl+Shift+P)에서 ArxivJS로 검색한다.
| 명령 | 설명 |
|---|---|
ArxivJS: 데이터 폴더 선택 |
데이터 폴더를 지정한다. |
ArxivJS: Reload |
모든 데이터를 다시 읽는다. |
ArxivJS: 설정 열기 |
이 확장의 설정 화면을 연다. |
ArxivJS: 주제 열기 |
주제를 검색해서 Topic 패널로 연다. |
ArxivJS: 논문 열기 |
주제를 고른 뒤 논문을 검색해서 연다. |
ArxivJS: 원문 URL 열기 |
선택한 논문의 URL을 브라우저로 연다. |
ArxivJS: 논문 정보 복사 |
제목, 저자, 연도, URL을 클립보드에 복사한다. |
데이터 폴더 형식
데이터 폴더는 arxivjs 앱이 만드는 형식을 따른다. 폴더 안의 파일을 추가하거나 고치려면 arxivjs 앱을 쓴다. 이 확장은 읽기만 한다. 예외는 로컬 문서 열기로 연 편집기에서 사용자가 직접 저장하는 경우뿐이다.
<데이터 폴더>/
├── Few-Shot_Learning/ # 주제 폴더
│ ├── a_closer_look_at_few_shot_classification.json # 메타 정보
│ ├── a_closer_look_at_few_shot_classification.md # 요약 문서
│ └── ...
└── ...
- 주제 폴더 이름은 영문자, 숫자, 언더스코어(
_), 하이픈(-)만 쓸 수 있다. 이 규칙에 맞지 않는 폴더(예:.git)는 목록에 나오지 않는다. - 논문마다 이름이 같은
.json과.md파일이 한 쌍을 이룬다. .txt,.hlt,.bak등 다른 파일은 무시한다.
.json 메타 정보의 예:
{
"title": "A Closer Look at Few-shot Classification",
"authors": "Wei-Yu Chen, Yen-Cheng Liu, Zsolt Kira, Yu-Chiang Frank Wang, Jia-Bin Huang",
"year": 2019,
"url": "http://arxiv.org/abs/1904.04232v2",
"abstract": "Few-shot classification aims to ...",
"citation": 2737,
"source": "arxiv"
}
| 필드 | 필수 | 설명 |
|---|---|---|
title |
✔ | 논문 제목 |
authors |
✔ | 저자. 쉼표로 구분한 문자열이다. |
year |
✔ | 출판 연도 |
url |
✔ | 원문 URL |
abstract |
초록 | |
citation |
인용수. 없으면 정렬할 때 맨 뒤로 간다. | |
source |
출처: arxiv, pdf, manual |
문제 해결
| 증상 | 해결 |
|---|---|
| TOPICS가 비어 있다 | arxivjs.dataFolder 경로가 맞는지 확인한다. 주제 폴더 이름이 규칙에 맞는지도 확인한다. |
| 새로 추가한 논문이 안 보인다 | Reload ⟳ 버튼을 누른다. 이 확장은 자동으로 감지하지 않는다. |
| 논문에 "문서 없음"이 표시된다 | 그 논문의 .md 파일이 아직 없다. 메타 정보와 초록만 보여준다. |
| 수식 일부가 원문 그대로 보인다 | KaTeX가 지원하지 않는 LaTeX 문법이다. 해당 수식만 원문으로 표시된다. |
| 그 밖의 오류 | View → Output에서 출력 채널 ArxivJS의 로그를 확인한다. |
개발자 가이드
개발 환경 준비
필요한 도구:
다음 명령으로 저장소를 받고 의존성을 설치한다.
git clone https://github.com/doosik71/arxivjs-extension.git
cd arxivjs-extension
npm install
주요 npm 스크립트:
| 스크립트 | 설명 |
|---|---|
npm run build |
esbuild로 dist/extension.js를 번들한다. |
npm run watch |
소스가 바뀌면 다시 번들한다. |
npm run typecheck |
TypeScript 타입 검사만 한다(출력 파일 없음). |
npm run lint |
ESLint를 실행한다. 쓰기 API 사용 금지 규칙도 여기서 검사한다. |
npm test |
단위 테스트(vitest)를 실행한다. |
npm run check |
typecheck → lint → test를 차례로 실행한다. |
npm run test:integration |
VS Code 통합 테스트를 읽기 전용 검증과 함께 실행한다. |
npm run bench |
성능을 측정하고 목표(DEV-PLAN §5.4)를 판정한다. |
npm run icon |
Marketplace 아이콘 media/icon.png를 다시 만든다. |
npm run package |
.vsix 파일을 만든다. |
로컬에서 실행과 디버깅
- VS Code에서 프로젝트 폴더를 연다.
F5를 누르거나 Run and Debug에서Run Extension을 선택한다. 그러면 확장이 로드된 Extension Development Host 창이 새로 열린다.- 새 창에서
ArxivJS: 데이터 폴더 선택으로 테스트 데이터 폴더를 지정한다. 기본은test/fixtures/sample-data다. - 코드를 고친 뒤 Extension Development Host 창에서
Ctrl+R(Developer: Reload Window)을 누르면 바뀐 내용이 반영된다.
Webview를 디버깅하려면 Extension Development Host 창에서 Developer: Open Webview Developer Tools를 실행한다.
테스트
npm run lint
npm test
npm run test:integration
테스트 데이터는
test/fixtures/sample-data/에 있다. 어떤 경계 사례가 들어 있는지는test/fixtures/README.md에 정리되어 있다.통합 테스트(
scripts/run-integration.mjs)는 다음 순서로 어떤 파일도 바뀌지 않았는지 검증한다.- fixture의 모든 파일 경로, 크기, mtime, SHA-256을 기록한다.
- fixture를 OS 수준 읽기 전용으로 바꾼다. 이때 기존 파일에 쓰면
EPERM으로 실패한다. - 테스트를 실행한다.
- 읽기 전용을 되돌린다.
- 기록과 비교해서 파일이 생기거나, 사라지거나, 바뀌었으면 실패로 처리한다.
통합 테스트는 기본으로 최신 안정판 VS Code에서 실행한다. 최소 지원 버전에서 확인하려면 다음처럼 실행한다.
VSCODE_TEST_VERSION=1.90.0 npm run test:integration
성능 측정
npm run bench # fixture
npm run bench -- D:\dev\javascript\arxivjsdata # 실데이터 (읽기만 한다)
다음 목표를 판정하고, 하나라도 넘으면 종료 코드 1로 끝난다.
| 항목 | 목표 |
|---|---|
| 주제 목록 | 100ms 이하 |
| 가장 큰 주제의 첫 로딩 | 500ms 이하 |
| 가장 큰 md 렌더링 | 200ms 이하 |
그 밖에 모든 md 문서를 한 번씩 렌더링해서 시간 분포(p50, p95, 최대)와 렌더링 예외 건수를 보여준다.
패키징 (.vsix 만들기)
npm run package
# 내부적으로: vsce package --no-dependencies
--no-dependencies: 확장은 esbuild로 번들하므로node_modules를 넣지 않는다.- README의 상대 링크는 vsce가
repository(GitHub) 주소 기준의 절대 링크로 바꾼다. 패키지에 들어가지 않는 파일(DEV-PLAN.md등)은 링크하지 않고 이름만 적는다.
이 명령을 실행하면 프로젝트 루트에 arxivjs-viewer-<버전>.vsix가 생긴다. 이 파일을 방법 2로 설치하면 Marketplace 없이도 팀 내부에 배포할 수 있다.
package.json의 게시 관련 항목:
| 항목 | 값 | 비고 |
|---|---|---|
name |
arxivjs-viewer |
소문자, 공백 없음 |
displayName |
ArxivJS Viewer |
Marketplace에 표시되는 이름 |
publisher |
doosik71 |
게시자 ID. 확장 ID는 doosik71.arxivjs-viewer |
version |
0.2.0 |
SemVer |
engines.vscode |
^1.90.0 |
|
icon |
media/icon.png |
128×128 PNG (npm run icon) |
repository |
https://github.com/doosik71/arxivjs-extension.git |
|
license |
MIT |
루트의 LICENSE 파일 |
배포 패키지에 들어갈 필요가 없는 파일(src/, test/, node_modules/ 등)은 .vscodeignore에 등록한다.
Marketplace에 확장 등록 (게시)
Visual Studio Marketplace에 처음 게시하는 절차다. 최초 1회만 1~3단계를 거치면 된다.
1단계. Azure DevOps 조직과 Personal Access Token(PAT) 만들기
- https://dev.azure.com에 Microsoft 계정으로 로그인한다. 조직이 없으면 새로 만든다.
- 오른쪽 위 User settings → Personal access tokens → New Token을 누른다.
- 다음과 같이 설정한다.
- Organization:
All accessible organizations - Scopes:
Custom defined→ Show all scopes → Marketplace → Manage 체크 - Expiration: 원하는 기간
- Organization:
- 만든 토큰을 안전한 곳에 복사해 둔다. 이 창을 닫으면 다시 볼 수 없다.
2단계. 게시자(Publisher) 확인
이 확장의 게시자는 doosik71이다. 이미 만들어져 있고, package.json의 publisher에 적혀 있다.
다른 게시자로 배포하려면 다음과 같이 한다.
- https://marketplace.visualstudio.com/manage에 같은 계정으로 로그인한다.
- Create publisher를 누르고 ID와 이름을 입력한다. ID는 나중에 바꿀 수 없다.
- 그 ID를
package.json의publisher에 적는다.
3단계. vsce 로그인
npx @vscode/vsce login doosik71
# 프롬프트에 1단계의 PAT를 붙여넣는다.
4단계. 게시
npx @vscode/vsce publish
- 이미 만든
.vsix가 있으면npx @vscode/vsce publish --packagePath arxivjs-viewer-0.2.0.vsix로 그 파일을 올릴 수 있다. - 웹에서 올릴 수도 있다. https://marketplace.visualstudio.com/manage에서 게시자를 고르고 New extension → Visual Studio Code로
.vsix를 업로드한다. - 게시 후 검증을 거쳐 몇 분 안에 Marketplace 검색에 나타난다. 확장 ID는
doosik71.arxivjs-viewer다.
Azure DevOps의 PAT 정책은 바뀔 수 있다. 위 방법이 막히면 공식 문서 Publishing Extensions를 확인한다. Microsoft Entra ID 인증을 쓰는
vsce publish --azure-credential방식도 그 문서에 안내되어 있다.
버전 업데이트와 재게시
npx @vscode/vsce publish patch # 0.2.0 → 0.2.1
npx @vscode/vsce publish minor # 0.2.0 → 0.3.0
npx @vscode/vsce publish 1.0.0 # 버전 직접 지정
publish patch|minor|major는 package.json의 버전을 올리고 git 태그를 만든 뒤 게시한다. 게시 전에 CHANGELOG.md를 갱신한다.
Marketplace에서 확장을 내리려면 npx @vscode/vsce unpublish doosik71.arxivjs-viewer를 실행한다. 이 작업은 되돌릴 수 없다.
Open VSX에 등록 (선택)
VSCodium, Cursor 같은 VS Code 호환 에디터 사용자에게도 배포하려면 Open VSX에 게시한다.
- https://open-vsx.org에 GitHub 계정으로 로그인하고, Eclipse Foundation Publisher Agreement에 동의한다.
- 사용자 설정에서 Access Token을 만든다.
- 다음 명령을 실행한다.
npx ovsx create-namespace doosik71 -p <token> # 최초 1회
npx ovsx publish arxivjs-viewer-0.2.0.vsix -p <token>
개발 시 주의 사항
- 실사용 데이터 폴더에 쓰지 않는다.
- 실제 데이터 폴더(예:
D:\dev\javascript\arxivjsdata)는 열람용으로만 지정한다. - 테스트, 스크립트,
markdownlint --fix같은 자동 수정 도구가 그 경로를 대상으로 삼으면 안 된다. - 테스트는 항상
test/fixtures/아래의 복사본으로 한다.
- 실제 데이터 폴더(예:
- 데이터 폴더 접근은
src/data/readonlyFs.ts를 거쳐서만 한다. 이 모듈은 읽기 API만 노출한다. ESLint가 다른 곳에서fs를 쓰거나 쓰기 API를 호출하면 오류를 낸다. - 캐시나 사용자 상태는
context.globalState나context.globalStorageUri에 저장한다. 데이터 폴더에는 아무 파일도 만들지 않는다. - 설계 상세는 저장소의
DEV-PLAN.md를 따른다.