웹을 한 번에 하나의 작업면씩, 깊게, 눈앞에서 사용하는 로컬 CLI.
터미널의 CLI 에이전트가 Obsidian Web Viewer를 조작해 웹 서비스를 직접 사용하도록 만든 공개 연구 프로토타입이다. 여러 탭을 넓게 훑는 병렬 스웜보다 한 작업면을 끝까지 다루고, 백그라운드보다 사용자가 지켜보고 개입할 수 있는 화면 위 실행을 우선한다.
Important
현재 공개본은 v0.1.0 연구 프로토타입이다. macOS, Obsidian Web Viewer, Obsidian CLI에 의존하는 CLI 방식이며, 범용 프로덕션 자동화 도구가 아니다. 플러그인 기반 host와 제한된 공개 인터페이스는 연구 중이며 이 release에 포함되지 않는다.
single은 한 사이트만 영구 지원하거나 한 번 쓰고 버린다는 뜻이 아니다. 한 시점에 하나의 active web surface를 깊게 다룬다는 운용 원칙이다.
- 좁고 깊게. 사이트별 사용법을 사용자의 로컬 노트와 어댑터에 축적한다.
- 보이게. 조작 탭을 화면 앞으로 가져오되 키보드 포커스는 빼앗지 않는다.
- 개인적으로 누적. 이 저장소는 코어와 합성 예제만 제공한다. 실제 사이트 지식, 업무 절차, 선호와 계정 조건은 각 사용자가 로컬에서 제로부터 만든다.
이 저장소가 제공하는 것:
webctlCLI와 사이트 무관 webview 조작 코어- 사이트 어댑터를 만드는
adapters/example.sh - 사이트 지식 노트 템플릿
profiles/_template.md - 실행 구조와 배포 경계 문서
이 저장소가 제공하지 않는 것:
- 실제 서비스용 어댑터와 프로파일
- 계정 정보, 인증정보, 쿠키 또는 API key
- 사용자별 Site/Work/Preference Pack
- 개인 업무 기록, 선호, selector 관찰과 산출물
Perplexity를 첫 연구 대상으로 코어의 풀사이클을 검증했지만, 해당 실제 어댑터와 프로파일은 이 공개 저장소에 포함하지 않는다. 공개본 사용자는 예제와 템플릿에서 자기 사이트 자산을 만들어야 한다.
- macOS
- 실행 중인 Obsidian 앱과 활성화된 Web Viewer 코어 플러그인
- 활성화된 Obsidian CLI (
obsidian명령이PATH에 있어야 함) - python3
- 사용할 Obsidian vault
git clone https://github.com/CocaPls/single-web-use.git
cd single-web-use
# 선택: PATH에 노출
ln -s "$PWD/bin/webctl" /usr/local/bin/webctl
# 사용할 vault 지정
export OBS_VAULT="내볼트이름"
# 또는
mkdir -p ~/.config/webctl && echo "내볼트이름" > ~/.config/webctl/vault
webctl doctordoctor는 Obsidian CLI, 앱 응답, vault, python3를 점검한다. 하나라도 실패하면 해당 줄에 해결 힌트를 표시한다.
webctl doctor # 환경 진단
webctl adapters # 설치된 어댑터 목록
webctl <사이트> ask "질문" # 어댑터가 구현한 풀사이클 실행
webctl runs # 살아 있는 run 목록
webctl closeall # webctl이 연 탭 정리사이트 어댑터의 ask 구현은 다음 흐름을 조립한다.
flowchart LR
A["1. 탭 열기"] --> B["2. 완료 감지 장착"] --> C["3. 입력"] --> D["4. 제출"] --> E["5. 완료 대기"] --> F["6. 본문과 출처 회수"]
새 사이트 자산은 예제에서 시작한다.
cp adapters/example.sh adapters/<사이트>.sh
cp profiles/_template.md profiles/<사이트>.md
webctl <사이트> <명령>실제 adapter와 profile에는 계정 조건, selector, 업무 절차 같은 사용자 자산이 들어갈 수 있다. 공개 저장소에 commit하지 말고 각자 로컬에서 관리해야 한다.
- 실행 단계 조립: 열기, 완료 감지, 입력, 제출, 대기, 회수 primitives
- streaming response 회수 메커니즘: 페이지 수준에서 보이지 않는 응답을 세션 CDP로 관찰
- runId 격리: 여러 실행 상태가 서로 섞이지 않도록 분리
- Obsidian CLI 직렬화: 동시 호출 시 응답 혼입을 막는 프로세스 lock
- 화면 따라오기: 조작 탭을 보이게 하되 조회 명령은 화면을 건드리지 않음
- 제한된 capture:
/tmp아래 PNG 경로로 webview 화면 저장
조작 메커니즘과 사이트 지식을 분리한다.
flowchart TB
AGENT["CLI agent"] --> BIN["webctl"]
BIN --> CORE["lib/core.sh\n사이트 무관 메커니즘"]
BIN --> ADAPTER["adapters/*.sh\n사이트별 정책"]
ADAPTER --> CORE
PROFILE["profiles/*.md\n사용자 로컬 지식"] -.-> AGENT
CORE --> VIEWER["Obsidian Web Viewer"]
VIEWER --> SITE["Web service"]
bin/webctl: 단일 진입점, 환경 진단, 어댑터 발견과 명령 위임lib/core.sh: 열기, 감지, eval, capture, 정리, 실행 격리adapters/*.sh: 사이트별 selector, 완료 조건과 오케스트레이션profiles/*.md: 코드가 자동으로 읽지 않는 사용자 지식 노트
배포 경계와 archive 생성법은 DISTRIBUTION.md를 참고한다.
v0.1.0은 신뢰할 수 있는 단일 사용자의 로컬 실험 환경을 전제로 한다.
- Obsidian CLI의 app-context eval과 Electron webContents/debugger를 사용한다.
- 로그인된 webview 세션에서 page JavaScript, network observation과 screenshot capture를 수행할 수 있다.
- 신뢰하는 adapter만 실행하고, source를 검토하지 않은 script를 추가하지 않는다.
- 주 vault에서 시험하기 전에 별도 test vault 또는 확인된 backup을 사용한다.
- remote service, multi-user host 또는 외부에 노출된 automation endpoint로 사용하지 않는다.
- 결제, 삭제, 송신, 게시, 계정 변경 같은 민감 작업에 사용하지 않는다.
- credential, cookie, token과 개인정보를 adapter, profile, log 또는 공개 issue에 기록하지 않는다.
doctor --json출력에는 설정한 vault 이름이 포함되므로 공개 log에 올리지 않는다.
이 공개본은 production threat model을 통과한 범용 브라우저 자동화 제품이 아니다. 문제를 발견하면 공개 issue에 비밀정보를 넣지 말고 재현 가능한 최소 예제로 보고한다.
- 실제 사이트 검증 범위는 첫 연구 대상 하나이며, 그 adapter는 공개되지 않는다.
- macOS, Obsidian 앱, Obsidian CLI와 python3에 강하게 의존한다.
- CLI 명령과 내부 구조는 SemVer
0.x동안 변경될 수 있다. - 플러그인 기반 host, 제한된 public capability API와 개인 자산의 정식 Pack 구조는 후속 연구 대상이다.
현재 공개된 v0.1 코드는 MIT License로 배포한다.
single-web-use는 everything-in-obsidian의 웹 자동화 연구 중 독립 실행 가능한 공개 프로토타입이다. 허브는 이 프로젝트가 더 큰 Obsidian 기반 도구 생태계에서 어디에 놓이는지 설명하는 선택적 맥락이다.