cli-jaw 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +67 -63
- package/README.md +68 -64
- package/README.zh-CN.md +67 -63
- package/dist/bin/cli-jaw.js +9 -5
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/launchd.js +146 -0
- package/dist/bin/commands/launchd.js.map +1 -0
- package/package.json +1 -1
package/README.ko.md
CHANGED
|
@@ -30,13 +30,13 @@ CLI-JAW는 내 컴퓨터에 상주하며 이미 익숙한 인터페이스인 **
|
|
|
30
30
|
|
|
31
31
|
단일 모델만을 사용하는 기존 비서들과 달리, CLI-JAW는 5개의 AI 엔진(Claude, Codex, Gemini, OpenCode, Copilot)을 공식 CLI를 통해 오케스트레이션하여 모든 제공업체의 장점을 통합된 경험으로 제공합니다. 하나의 엔진 사용량이 초과되면 자동으로 다음 엔진으로 전환됩니다. 107개의 내장 스킬이 브라우저 자동화부터 문서 생성까지 모든 것을 처리합니다.
|
|
32
32
|
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
| 🛡️ **안전한 서비스 약관 준수**
|
|
36
|
-
| 🤖 **검증된 에이전트 도구**
|
|
37
|
-
| ⚡ **멀티 에이전트 자동 전환(Fallback)** | 엔진 하나가 멈춰도 걱정 없습니다. 다음 엔진이 즉시 이어받아 중단 없는 작업이 가능합니다.
|
|
38
|
-
| 🎭 **오케스트레이션 기반 성능 극대화**
|
|
39
|
-
| 📦 **107개의 내장 스킬**
|
|
33
|
+
| | 왜 CLI-JAW인가요? |
|
|
34
|
+
| --------------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
35
|
+
| 🛡️ **안전한 서비스 약관 준수** | 공식 CLI만 사용합니다 — API 키 스크래핑이나 리버스 엔지니어링이 없으므로 계정 정지 위험이 없습니다. |
|
|
36
|
+
| 🤖 **검증된 에이전트 도구** | 실전에서 검증된 5개의 코딩 에이전트(Claude, Codex, Gemini, OpenCode, Copilot)를 한 곳에서 사용하세요. |
|
|
37
|
+
| ⚡ **멀티 에이전트 자동 전환(Fallback)** | 엔진 하나가 멈춰도 걱정 없습니다. 다음 엔진이 즉시 이어받아 중단 없는 작업이 가능합니다. |
|
|
38
|
+
| 🎭 **오케스트레이션 기반 성능 극대화** | 복잡한 작업은 전문화된 서브 에이전트에게 분산시켜 처리량을 극대화합니다. |
|
|
39
|
+
| 📦 **107개의 내장 스킬** | 브라우저 자동화, 문서 생성, 텔레그램 연동, 영구 메모리 등 설치 즉시 사용 가능한 기능들을 제공합니다. |
|
|
40
40
|
|
|
41
41
|

|
|
42
42
|
|
|
@@ -76,10 +76,10 @@ graph LR
|
|
|
76
76
|
|
|
77
77
|
### 사전 요구사항
|
|
78
78
|
|
|
79
|
-
| 필수 항목
|
|
80
|
-
|
|
81
|
-
| **Node.js ≥ 22**
|
|
82
|
-
| **AI CLI 최소 1개** | 비서를 움직이는 두뇌
|
|
79
|
+
| 필수 항목 | 용도 |
|
|
80
|
+
| ------------------- | -------------------------------------- |
|
|
81
|
+
| **Node.js ≥ 22** | 런타임. [다운로드](https://nodejs.org) |
|
|
82
|
+
| **AI CLI 최소 1개** | 비서를 움직이는 두뇌 |
|
|
83
83
|
|
|
84
84
|
> 🆓 **무료 옵션:** [Copilot CLI](https://docs.github.com/en/copilot)는 GitHub 무료 플랜에서도, [OpenCode](https://opencode.ai)는 무료 모델이 있어요 — 카드 등록 없이 바로 시작 가능.
|
|
85
85
|
|
|
@@ -90,14 +90,14 @@ graph LR
|
|
|
90
90
|
npm install -g cli-jaw
|
|
91
91
|
|
|
92
92
|
# 2. 초기 설정 (설정 파일 생성, 스킬 설치)
|
|
93
|
-
|
|
93
|
+
jaw init
|
|
94
94
|
|
|
95
95
|
# 3. 상태 확인 — 뭐가 준비됐는지 점검
|
|
96
|
-
|
|
96
|
+
jaw doctor
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
<details>
|
|
100
|
-
<summary>📋 <code>
|
|
100
|
+
<summary>📋 <code>jaw doctor</code> 출력 예시</summary>
|
|
101
101
|
|
|
102
102
|
```
|
|
103
103
|
🦈 CLI-JAW Doctor — 12 checks
|
|
@@ -132,9 +132,10 @@ gemini # Google (첫 실행 시 자동 인증)
|
|
|
132
132
|
### 실행
|
|
133
133
|
|
|
134
134
|
```bash
|
|
135
|
-
|
|
135
|
+
jaw serve # Web UI → http://localhost:3457
|
|
136
|
+
jaw launchd # 부팅 시 자동 실행 (macOS)
|
|
136
137
|
# — 또는 —
|
|
137
|
-
|
|
138
|
+
jaw chat # 터미널 TUI (브라우저 필요 없음)
|
|
138
139
|
```
|
|
139
140
|
|
|
140
141
|
> 💡 **5개 다 깔 필요 없어요.** 하나만 있으면 됩니다. 어떤 엔진이 설치돼 있는지 자동 감지하고, 없으면 다음 엔진으로 자연스럽게 넘어갑니다.
|
|
@@ -148,33 +149,33 @@ cli-jaw chat # 터미널 TUI (브라우저 필요 없음)
|
|
|
148
149
|
<details>
|
|
149
150
|
<summary>전체 스킬 목록 보기</summary>
|
|
150
151
|
|
|
151
|
-
| 티어
|
|
152
|
-
|
|
153
|
-
| **Active 스킬**
|
|
154
|
-
| **Reference 스킬** |
|
|
152
|
+
| 티어 | 수량 | 작동 방식 |
|
|
153
|
+
| ------------------ | :---: | ------------------------------------------------ |
|
|
154
|
+
| **Active 스킬** | 17 | 매번 AI한테 자동으로 주입돼요. 항상 켜져 있어요. |
|
|
155
|
+
| **Reference 스킬** | 88+ | 관련 작업을 시키면 그때 AI가 읽어서 써요. |
|
|
155
156
|
|
|
156
157
|
#### Active 스킬 (항상 켜짐)
|
|
157
158
|
|
|
158
|
-
| 스킬
|
|
159
|
-
|
|
160
|
-
| `browser`
|
|
161
|
-
| `github`
|
|
162
|
-
| `notion`
|
|
163
|
-
| `memory`
|
|
164
|
-
| `telegram-send`
|
|
165
|
-
| `vision-click`
|
|
166
|
-
| `imagegen`
|
|
167
|
-
| `pdf` / `docx` / `xlsx`
|
|
168
|
-
| `screen-capture`
|
|
169
|
-
| `openai-docs`
|
|
170
|
-
| `dev` / `dev-frontend` / `dev-backend` / `dev-data` / `dev-testing` | 서브에이전트용 개발 가이드
|
|
159
|
+
| 스킬 | 기능 |
|
|
160
|
+
| ------------------------------------------------------------------- | -------------------------------------------------- |
|
|
161
|
+
| `browser` | Chrome 자동화 — 스냅샷, 클릭, 네비게이트, 스크린샷 |
|
|
162
|
+
| `github` | 이슈, PR, CI, 코드 리뷰 (`gh` CLI 사용) |
|
|
163
|
+
| `notion` | Notion 페이지 및 데이터베이스 관리 |
|
|
164
|
+
| `memory` | 세션 간 영속 장기 메모리 |
|
|
165
|
+
| `telegram-send` | Telegram으로 사진, 문서, 음성 메시지 전송 |
|
|
166
|
+
| `vision-click` | 스크린샷 → AI가 좌표 찾기 → 클릭 (원커맨드) |
|
|
167
|
+
| `imagegen` | OpenAI Image API로 이미지 생성/편집 |
|
|
168
|
+
| `pdf` / `docx` / `xlsx` | 오피스 문서 읽기, 생성, 편집 |
|
|
169
|
+
| `screen-capture` | macOS 스크린샷 및 카메라 캡처 |
|
|
170
|
+
| `openai-docs` | 최신 OpenAI API 문서 |
|
|
171
|
+
| `dev` / `dev-frontend` / `dev-backend` / `dev-data` / `dev-testing` | 서브에이전트용 개발 가이드 |
|
|
171
172
|
|
|
172
173
|
#### Reference 스킬 (필요할 때만)
|
|
173
174
|
|
|
174
175
|
88개+ 스킬이 더 있어요 — spotify, 날씨, 딥리서치, TTS, 비디오 다운로드, Apple 미리알림, 1Password, Terraform, PostgreSQL, Jupyter 등.
|
|
175
176
|
|
|
176
177
|
```bash
|
|
177
|
-
|
|
178
|
+
jaw skill install <name> # reference → active로 영구 활성화
|
|
178
179
|
```
|
|
179
180
|
|
|
180
181
|
</details>
|
|
@@ -193,7 +194,7 @@ cli-jaw skill install <name> # reference → active로 영구 활성화
|
|
|
193
194
|
<summary>📋 텔레그램 설정 (3단계)</summary>
|
|
194
195
|
|
|
195
196
|
1. **봇 만들기** — [@BotFather](https://t.me/BotFather)에게 `/newbot` → 토큰 복사
|
|
196
|
-
2. **설정** — `
|
|
197
|
+
2. **설정** — `jaw init --telegram-token 토큰` 실행하거나 Web UI 설정에서 입력
|
|
197
198
|
3. **채팅 시작** — 봇에게 아무 메시지나 보내세요. 첫 메시지에서 채팅 ID가 자동 저장됩니다.
|
|
198
199
|
|
|
199
200
|
</details>
|
|
@@ -254,7 +255,7 @@ graph TD
|
|
|
254
255
|
## 🔌 MCP — 단일 설정, 5개의 AI 엔진
|
|
255
256
|
|
|
256
257
|
```bash
|
|
257
|
-
|
|
258
|
+
jaw mcp install @anthropic/context7 # 한 번만 설치
|
|
258
259
|
# → Claude, Codex, Gemini, OpenCode, Copilot 전부 자동 동기화
|
|
259
260
|
```
|
|
260
261
|
|
|
@@ -276,15 +277,18 @@ graph LR
|
|
|
276
277
|
## ⌨️ CLI 명령어
|
|
277
278
|
|
|
278
279
|
```bash
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
280
|
+
jaw serve # 서버 시작
|
|
281
|
+
jaw launchd # 부팅 시 자동 실행 (macOS)
|
|
282
|
+
jaw launchd status # 데몬 상태 확인
|
|
283
|
+
jaw launchd unset # 자동 실행 해제
|
|
284
|
+
jaw chat # 터미널 TUI
|
|
285
|
+
jaw doctor # 진단 (12개 체크)
|
|
286
|
+
jaw skill install <name> # 스킬 설치
|
|
287
|
+
jaw mcp install <package> # MCP 설치 → 5개 CLI 전부 동기화
|
|
288
|
+
jaw memory search <query> # 메모리 검색
|
|
289
|
+
jaw browser start # Chrome 시작 (CDP)
|
|
290
|
+
jaw browser vision-click "로그인" # AI가 알아서 클릭
|
|
291
|
+
jaw reset # 전체 초기화
|
|
288
292
|
```
|
|
289
293
|
|
|
290
294
|
---
|
|
@@ -296,13 +300,13 @@ cli-jaw reset # 전체 초기화
|
|
|
296
300
|
<details>
|
|
297
301
|
<summary>전체 프리셋 보기</summary>
|
|
298
302
|
|
|
299
|
-
| CLI
|
|
300
|
-
|
|
301
|
-
| **Claude**
|
|
302
|
-
| **Codex**
|
|
303
|
-
| **Gemini**
|
|
303
|
+
| CLI | 기본값 | 주요 모델 |
|
|
304
|
+
| ------------ | -------------------------- | ---------------------------------------------- |
|
|
305
|
+
| **Claude** | `claude-sonnet-4-6` | opus-4-6, haiku-4-5, 확장 사고 변형 |
|
|
306
|
+
| **Codex** | `gpt-5.3-codex` | spark, 5.2, 5.1-max, 5.1-mini |
|
|
307
|
+
| **Gemini** | `gemini-2.5-pro` | 3.0-pro-preview, 3-flash-preview, 2.5-flash |
|
|
304
308
|
| **OpenCode** | `claude-opus-4-6-thinking` | 🆓 big-pickle, GLM-5, MiniMax, Kimi, GPT-5-Nano |
|
|
305
|
-
| **Copilot**
|
|
309
|
+
| **Copilot** | `gpt-4.1` 🆓 | 🆓 gpt-5-mini, claude-sonnet-4.6, opus-4.6 |
|
|
306
310
|
|
|
307
311
|
</details>
|
|
308
312
|
|
|
@@ -367,24 +371,24 @@ npm test
|
|
|
367
371
|
|
|
368
372
|
## 📖 문서
|
|
369
373
|
|
|
370
|
-
| 문서
|
|
371
|
-
|
|
374
|
+
| 문서 | 내용 |
|
|
375
|
+
| --------------------------------------- | --------------------------------------------------- |
|
|
372
376
|
| [ARCHITECTURE.md](docs/ARCHITECTURE.md) | 시스템 설계, 모듈 그래프, REST API (40+ 엔드포인트) |
|
|
373
|
-
| [TESTS.md](TESTS.md)
|
|
377
|
+
| [TESTS.md](TESTS.md) | 테스트 커버리지, 테스트 계획 |
|
|
374
378
|
|
|
375
379
|
---
|
|
376
380
|
|
|
377
381
|
## 🔧 문제 해결
|
|
378
382
|
|
|
379
|
-
| 증상
|
|
380
|
-
|
|
381
|
-
| `command not found: cli-jaw` | npm 전역 bin이 PATH에 없음
|
|
382
|
-
| `doctor`에서 CLI 누락 표시
|
|
383
|
-
| 포트 3457 사용 중
|
|
384
|
-
| 텔레그램 봇 무반응
|
|
385
|
-
| `npm install -g` 권한 오류
|
|
386
|
-
| 빌드 실패 (`tsc` 에러)
|
|
387
|
-
| 메모리가 세션 간 유지 안 됨
|
|
383
|
+
| 증상 | 원인 | 해결 방법 |
|
|
384
|
+
| ---------------------------- | ---------------------------------- | --------------------------------------------------------------------------- |
|
|
385
|
+
| `command not found: cli-jaw` | npm 전역 bin이 PATH에 없음 | `npm config get prefix` 확인 후 `bin/`을 PATH에 추가 |
|
|
386
|
+
| `doctor`에서 CLI 누락 표시 | 해당 CLI 미설치 | `npm i -g @anthropic-ai/claude-code` 등 설치 |
|
|
387
|
+
| 포트 3457 사용 중 | 다른 프로세스가 점유 | `PORT=4000 jaw serve` 또는 기존 프로세스 종료 |
|
|
388
|
+
| 텔레그램 봇 무반응 | 토큰 미설정 또는 Chat ID 누락 | `jaw init --telegram-token ...` 재실행 |
|
|
389
|
+
| `npm install -g` 권한 오류 | 글로벌 디렉토리 권한 문제 | `sudo npm i -g cli-jaw` 또는 [nvm](https://github.com/nvm-sh/nvm) 사용 권장 |
|
|
390
|
+
| 빌드 실패 (`tsc` 에러) | Node 22 미만 버전 | `node -v` 확인 → 22 이상으로 업그레이드 |
|
|
391
|
+
| 메모리가 세션 간 유지 안 됨 | `~/.cli-jaw/memory/` 디렉토리 없음 | `jaw init` 재실행하면 자동 생성 |
|
|
388
392
|
|
|
389
393
|
---
|
|
390
394
|
|
package/README.md
CHANGED
|
@@ -30,13 +30,13 @@ CLI-JAW is a **personal AI assistant** that lives on your machine and works from
|
|
|
30
30
|
|
|
31
31
|
Unlike single-model assistants, CLI-JAW orchestrates **5 AI engines** (Claude, Codex, Gemini, OpenCode, Copilot) through their official CLIs — giving you the best of every provider in one unified experience. If one engine is busy, it automatically falls back to the next. 107 built-in skills handle everything from browser automation to document generation.
|
|
32
32
|
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
| 🛡️ **TOS-Safe**
|
|
36
|
-
| 🤖 **Verified Agent Tools**
|
|
37
|
-
| ⚡ **Multi-Agent Fallback**
|
|
38
|
-
| 🎭 **Orchestrated Performance** | Complex tasks split across specialized sub-agents for maximum throughput.
|
|
39
|
-
| 📦 **107 Built-in Skills**
|
|
33
|
+
| | Why CLI-JAW? |
|
|
34
|
+
| ------------------------------ | ---------------------------------------------------------------------------------------- |
|
|
35
|
+
| 🛡️ **TOS-Safe** | Uses official CLIs only — no API key scraping, no reverse engineering, no ban risk. |
|
|
36
|
+
| 🤖 **Verified Agent Tools** | 5 battle-tested coding agents (Claude, Codex, Gemini, OpenCode, Copilot) under one roof. |
|
|
37
|
+
| ⚡ **Multi-Agent Fallback** | One engine down? The next picks up automatically. Zero downtime. |
|
|
38
|
+
| 🎭 **Orchestrated Performance** | Complex tasks split across specialized sub-agents for maximum throughput. |
|
|
39
|
+
| 📦 **107 Built-in Skills** | Browser automation, document generation, Telegram, memory — ready out of the box. |
|
|
40
40
|
|
|
41
41
|

|
|
42
42
|
|
|
@@ -76,10 +76,10 @@ graph LR
|
|
|
76
76
|
|
|
77
77
|
### Prerequisites
|
|
78
78
|
|
|
79
|
-
| Requirement
|
|
80
|
-
|
|
81
|
-
| **Node.js ≥ 22**
|
|
82
|
-
| **At least 1 AI CLI** | The engine that powers your assistant
|
|
79
|
+
| Requirement | Why |
|
|
80
|
+
| --------------------- | --------------------------------------- |
|
|
81
|
+
| **Node.js ≥ 22** | Runtime. [Download](https://nodejs.org) |
|
|
82
|
+
| **At least 1 AI CLI** | The engine that powers your assistant |
|
|
83
83
|
|
|
84
84
|
> 🆓 **Free options:** [Copilot CLI](https://docs.github.com/en/copilot) (GitHub free tier) and [OpenCode](https://opencode.ai) have free models — no credit card needed.
|
|
85
85
|
|
|
@@ -90,14 +90,14 @@ graph LR
|
|
|
90
90
|
npm install -g cli-jaw
|
|
91
91
|
|
|
92
92
|
# 2. Run setup wizard (creates config, installs skills)
|
|
93
|
-
|
|
93
|
+
jaw init
|
|
94
94
|
|
|
95
95
|
# 3. Health check — see what's ready
|
|
96
|
-
|
|
96
|
+
jaw doctor
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
<details>
|
|
100
|
-
<summary>📋 Example <code>
|
|
100
|
+
<summary>📋 Example <code>jaw doctor</code> output</summary>
|
|
101
101
|
|
|
102
102
|
```
|
|
103
103
|
🦈 CLI-JAW Doctor — 12 checks
|
|
@@ -132,9 +132,10 @@ gemini # Google (first run triggers auth)
|
|
|
132
132
|
### Launch
|
|
133
133
|
|
|
134
134
|
```bash
|
|
135
|
-
|
|
135
|
+
jaw serve # Web UI → http://localhost:3457
|
|
136
|
+
jaw launchd # Auto-start on boot (macOS)
|
|
136
137
|
# — or —
|
|
137
|
-
|
|
138
|
+
jaw chat # Terminal TUI (no browser needed)
|
|
138
139
|
```
|
|
139
140
|
|
|
140
141
|
> 💡 **You don't need all 5.** Even one CLI is enough to start. Your assistant auto-detects which engines are available and falls back gracefully.
|
|
@@ -148,33 +149,33 @@ cli-jaw chat # Terminal TUI (no browser needed)
|
|
|
148
149
|
<details>
|
|
149
150
|
<summary>View all skills</summary>
|
|
150
151
|
|
|
151
|
-
| Tier
|
|
152
|
-
|
|
153
|
-
| **Active Skills**
|
|
154
|
-
| **Reference Skills** |
|
|
152
|
+
| Tier | Count | How it works |
|
|
153
|
+
| -------------------- | :---: | --------------------------------------------------------- |
|
|
154
|
+
| **Active Skills** | 17 | Auto-injected into every AI prompt. Always available. |
|
|
155
|
+
| **Reference Skills** | 90 | AI reads them on-demand when you ask for a relevant task. |
|
|
155
156
|
|
|
156
157
|
#### Active Skills (always on)
|
|
157
158
|
|
|
158
|
-
| Skill
|
|
159
|
-
|
|
160
|
-
| `browser`
|
|
161
|
-
| `github`
|
|
162
|
-
| `notion`
|
|
163
|
-
| `memory`
|
|
164
|
-
| `telegram-send`
|
|
165
|
-
| `vision-click`
|
|
166
|
-
| `imagegen`
|
|
167
|
-
| `pdf` / `docx` / `xlsx`
|
|
168
|
-
| `screen-capture`
|
|
169
|
-
| `openai-docs`
|
|
170
|
-
| `dev` / `dev-frontend` / `dev-backend` / `dev-data` / `dev-testing` | Development guidelines for sub-agents
|
|
159
|
+
| Skill | What it does |
|
|
160
|
+
| ------------------------------------------------------------------- | --------------------------------------------------------- |
|
|
161
|
+
| `browser` | Chrome automation — snapshot, click, navigate, screenshot |
|
|
162
|
+
| `github` | Issues, PRs, CI, code review via `gh` CLI |
|
|
163
|
+
| `notion` | Create/manage Notion pages and databases |
|
|
164
|
+
| `memory` | Persistent long-term memory across sessions |
|
|
165
|
+
| `telegram-send` | Send photos, documents, voice messages to Telegram |
|
|
166
|
+
| `vision-click` | Screenshot → AI finds coordinates → clicks (one command) |
|
|
167
|
+
| `imagegen` | Generate/edit images via OpenAI Image API |
|
|
168
|
+
| `pdf` / `docx` / `xlsx` | Read, create, edit office documents |
|
|
169
|
+
| `screen-capture` | macOS screenshot and camera capture |
|
|
170
|
+
| `openai-docs` | Up-to-date OpenAI API documentation |
|
|
171
|
+
| `dev` / `dev-frontend` / `dev-backend` / `dev-data` / `dev-testing` | Development guidelines for sub-agents |
|
|
171
172
|
|
|
172
173
|
#### Reference Skills (on-demand)
|
|
173
174
|
|
|
174
175
|
88+ more skills ready to use — spotify, weather, deep-research, tts, video-downloader, apple-reminders, 1password, terraform, postgres, jupyter-notebook, sentry, and more.
|
|
175
176
|
|
|
176
177
|
```bash
|
|
177
|
-
|
|
178
|
+
jaw skill install <name> # Activate a reference skill permanently
|
|
178
179
|
```
|
|
179
180
|
|
|
180
181
|
</details>
|
|
@@ -193,7 +194,7 @@ Your assistant isn't tied to your desk. Chat from anywhere via Telegram:
|
|
|
193
194
|
<summary>📋 Telegram setup (3 steps)</summary>
|
|
194
195
|
|
|
195
196
|
1. **Create a bot** — Message [@BotFather](https://t.me/BotFather) → `/newbot` → copy the token
|
|
196
|
-
2. **Configure** — Run `
|
|
197
|
+
2. **Configure** — Run `jaw init --telegram-token YOUR_TOKEN` or edit settings in the Web UI
|
|
197
198
|
3. **Start chatting** — Send any message to your bot. Your chat ID is auto-saved on first message.
|
|
198
199
|
|
|
199
200
|
</details>
|
|
@@ -254,7 +255,7 @@ Your assistant **decides by itself** whether a task needs orchestration or a dir
|
|
|
254
255
|
## 🔌 MCP — One Config, Five AI Engines
|
|
255
256
|
|
|
256
257
|
```bash
|
|
257
|
-
|
|
258
|
+
jaw mcp install @anthropic/context7 # Install once
|
|
258
259
|
# → Automatically syncs to Claude, Codex, Gemini, OpenCode, Copilot
|
|
259
260
|
```
|
|
260
261
|
|
|
@@ -276,15 +277,18 @@ No more editing 5 different config files. Install once → all AI engines get it
|
|
|
276
277
|
## ⌨️ CLI Commands
|
|
277
278
|
|
|
278
279
|
```bash
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
280
|
+
jaw serve # Start server
|
|
281
|
+
jaw chat # Terminal TUI
|
|
282
|
+
jaw doctor # Diagnostics (12 checks)
|
|
283
|
+
jaw skill install <name> # Install a skill
|
|
284
|
+
jaw mcp install <package> # Install MCP → syncs to all 5 CLIs
|
|
285
|
+
jaw memory search <query> # Search memory
|
|
286
|
+
jaw browser start # Launch Chrome (CDP)
|
|
287
|
+
jaw browser vision-click "Login" # AI-powered click
|
|
288
|
+
jaw launchd # Auto-start on boot (macOS)
|
|
289
|
+
jaw launchd status # Check daemon status
|
|
290
|
+
jaw launchd unset # Remove auto-start
|
|
291
|
+
jaw reset # Full reset
|
|
288
292
|
```
|
|
289
293
|
|
|
290
294
|
---
|
|
@@ -296,13 +300,13 @@ Each CLI comes with preconfigured presets, but you can type **any model ID** dir
|
|
|
296
300
|
<details>
|
|
297
301
|
<summary>View all presets</summary>
|
|
298
302
|
|
|
299
|
-
| CLI
|
|
300
|
-
|
|
301
|
-
| **Claude**
|
|
302
|
-
| **Codex**
|
|
303
|
-
| **Gemini**
|
|
304
|
-
| **OpenCode** | `claude-opus-4-6-thinking` | 🆓 big-pickle, GLM-5, MiniMax, Kimi, GPT-5-Nano
|
|
305
|
-
| **Copilot**
|
|
303
|
+
| CLI | Default | Notable Models |
|
|
304
|
+
| ------------ | -------------------------- | ----------------------------------------------- |
|
|
305
|
+
| **Claude** | `claude-sonnet-4-6` | opus-4-6, haiku-4-5, extended thinking variants |
|
|
306
|
+
| **Codex** | `gpt-5.3-codex` | spark, 5.2, 5.1-max, 5.1-mini |
|
|
307
|
+
| **Gemini** | `gemini-2.5-pro` | 3.0-pro-preview, 3-flash-preview, 2.5-flash |
|
|
308
|
+
| **OpenCode** | `claude-opus-4-6-thinking` | 🆓 big-pickle, GLM-5, MiniMax, Kimi, GPT-5-Nano |
|
|
309
|
+
| **Copilot** | `gpt-4.1` 🆓 | 🆓 gpt-5-mini, claude-sonnet-4.6, opus-4.6 |
|
|
306
310
|
|
|
307
311
|
</details>
|
|
308
312
|
|
|
@@ -367,10 +371,10 @@ All tests run via `tsx --test` (native Node.js test runner + TypeScript).
|
|
|
367
371
|
|
|
368
372
|
## 📖 Documentation
|
|
369
373
|
|
|
370
|
-
| Document
|
|
371
|
-
|
|
374
|
+
| Document | What's inside |
|
|
375
|
+
| --------------------------------------- | ----------------------------------------------------- |
|
|
372
376
|
| [ARCHITECTURE.md](docs/ARCHITECTURE.md) | System design, module graph, REST API (40+ endpoints) |
|
|
373
|
-
| [TESTS.md](TESTS.md)
|
|
377
|
+
| [TESTS.md](TESTS.md) | Test coverage and test plan |
|
|
374
378
|
|
|
375
379
|
---
|
|
376
380
|
|
|
@@ -379,15 +383,15 @@ All tests run via `tsx --test` (native Node.js test runner + TypeScript).
|
|
|
379
383
|
<details>
|
|
380
384
|
<summary>Common issues</summary>
|
|
381
385
|
|
|
382
|
-
| Problem
|
|
383
|
-
|
|
384
|
-
| `cli-jaw: command not found` | Run `npm install -g cli-jaw` again. Check `npm bin -g` is in your `$PATH`.
|
|
385
|
-
| `Error: node version`
|
|
386
|
-
| Agent timeout / no response
|
|
387
|
-
| `EADDRINUSE: port 3457`
|
|
388
|
-
| Telegram bot not responding
|
|
389
|
-
| Skills not loading
|
|
390
|
-
| Browser commands fail
|
|
386
|
+
| Problem | Solution |
|
|
387
|
+
| ---------------------------- | ------------------------------------------------------------------------------------------- |
|
|
388
|
+
| `cli-jaw: command not found` | Run `npm install -g cli-jaw` again. Check `npm bin -g` is in your `$PATH`. |
|
|
389
|
+
| `Error: node version` | Upgrade to Node.js ≥ 22: `nvm install 22` or download from [nodejs.org](https://nodejs.org) |
|
|
390
|
+
| Agent timeout / no response | Run `jaw doctor` to check CLI auth. Re-authenticate with `claude auth` / `codex login`. |
|
|
391
|
+
| `EADDRINUSE: port 3457` | Another instance is running. Stop it or use `jaw serve --port 3458`. |
|
|
392
|
+
| Telegram bot not responding | Check token with `jaw doctor`. Ensure `jaw serve` is running. |
|
|
393
|
+
| Skills not loading | Run `jaw skill reset` then `jaw mcp sync`. |
|
|
394
|
+
| Browser commands fail | Install Chrome/Chromium. Run `jaw browser start` first. |
|
|
391
395
|
|
|
392
396
|
</details>
|
|
393
397
|
|
package/README.zh-CN.md
CHANGED
|
@@ -30,13 +30,13 @@ CLI-JAW 是驻留在您本地机器上的**专属 AI 助手**,并在您熟悉
|
|
|
30
30
|
|
|
31
31
|
与单一模型的助手不同,CLI-JAW 通过官方 CLI 命令行工具对 **5 大 AI 引擎**(Claude、Codex、Gemini、OpenCode、Copilot)进行编排 — 为您提供各大供应商最优势的能力及统一的体验。当一个引擎处于繁忙状态时,它会自动无缝切换至下一个。107 个内置技能可处理从浏览器自动化到文档生成的所有事务。
|
|
32
32
|
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
| 🛡️ **安全合规 (TOS-Safe)**
|
|
36
|
-
| 🤖 **经过验证的智能体工具**
|
|
37
|
-
| ⚡ **多模型自动回退 (Fallback)** | 单一引擎发生故障?下一个立即接管。确保零停机。
|
|
38
|
-
| 🎭 **基于编排的性能优化**
|
|
39
|
-
| 📦 **107 个内置技能**
|
|
33
|
+
| | 为什么选择 CLI-JAW? |
|
|
34
|
+
| ------------------------------- | -------------------------------------------------------------------------- |
|
|
35
|
+
| 🛡️ **安全合规 (TOS-Safe)** | 仅使用官方 CLI — 无 API 密钥抓取、无逆向工程、无封号风险。 |
|
|
36
|
+
| 🤖 **经过验证的智能体工具** | 5 大实战级编码智能体(Claude、Codex、Gemini、OpenCode、Copilot)集于一身。 |
|
|
37
|
+
| ⚡ **多模型自动回退 (Fallback)** | 单一引擎发生故障?下一个立即接管。确保零停机。 |
|
|
38
|
+
| 🎭 **基于编排的性能优化** | 复杂的任务会被拆分给专业的子智能体,以实现效率最大化。 |
|
|
39
|
+
| 📦 **107 个内置技能** | 浏览器自动化、文档生成、Telegram 通知、持久化记忆 — 开箱即用。 |
|
|
40
40
|
|
|
41
41
|

|
|
42
42
|
|
|
@@ -76,10 +76,10 @@ graph LR
|
|
|
76
76
|
|
|
77
77
|
### 前置要求
|
|
78
78
|
|
|
79
|
-
| 必备条件
|
|
80
|
-
|
|
81
|
-
| **Node.js ≥ 22**
|
|
82
|
-
| **至少 1 个 AI CLI** | 驱动助手的 AI 引擎
|
|
79
|
+
| 必备条件 | 说明 |
|
|
80
|
+
| -------------------- | -------------------------------------- |
|
|
81
|
+
| **Node.js ≥ 22** | 运行时环境。[下载](https://nodejs.org) |
|
|
82
|
+
| **至少 1 个 AI CLI** | 驱动助手的 AI 引擎 |
|
|
83
83
|
|
|
84
84
|
> 🆓 **免费方案:** [Copilot CLI](https://docs.github.com/en/copilot)(GitHub 免费套餐可用)和 [OpenCode](https://opencode.ai) 均提供免费模型 — 无需绑卡,即装即用。
|
|
85
85
|
|
|
@@ -90,14 +90,14 @@ graph LR
|
|
|
90
90
|
npm install -g cli-jaw
|
|
91
91
|
|
|
92
92
|
# 2. 运行初始化向导(创建配置、安装技能)
|
|
93
|
-
|
|
93
|
+
jaw init
|
|
94
94
|
|
|
95
95
|
# 3. 健康检查 — 看看哪些已就绪
|
|
96
|
-
|
|
96
|
+
jaw doctor
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
<details>
|
|
100
|
-
<summary>📋 <code>
|
|
100
|
+
<summary>📋 <code>jaw doctor</code> 输出示例</summary>
|
|
101
101
|
|
|
102
102
|
```
|
|
103
103
|
🦈 CLI-JAW Doctor — 12 checks
|
|
@@ -132,9 +132,10 @@ gemini # Google (首次运行触发认证)
|
|
|
132
132
|
### 启动
|
|
133
133
|
|
|
134
134
|
```bash
|
|
135
|
-
|
|
135
|
+
jaw serve # Web UI → http://localhost:3457
|
|
136
|
+
jaw launchd # 开机自动启动 (macOS)
|
|
136
137
|
# — 或者 —
|
|
137
|
-
|
|
138
|
+
jaw chat # 终端 TUI(无需浏览器)
|
|
138
139
|
```
|
|
139
140
|
|
|
140
141
|
> 💡 **不必全装 5 个。** 有一个就能跑。助手会自动检测可用引擎,缺了就无缝切换到下一个。
|
|
@@ -148,33 +149,33 @@ cli-jaw chat # 终端 TUI(无需浏览器)
|
|
|
148
149
|
<details>
|
|
149
150
|
<summary>查看全部技能</summary>
|
|
150
151
|
|
|
151
|
-
| 层级
|
|
152
|
-
|
|
153
|
-
| **活跃技能** |
|
|
154
|
-
| **参考技能** |
|
|
152
|
+
| 层级 | 数量 | 工作方式 |
|
|
153
|
+
| ------------ | :---: | ---------------------------------- |
|
|
154
|
+
| **活跃技能** | 17 | 每次对话自动加载,随时可用。 |
|
|
155
|
+
| **参考技能** | 88+ | 用到的时候 AI 自己去读,按需调用。 |
|
|
155
156
|
|
|
156
157
|
#### 活跃技能(常驻)
|
|
157
158
|
|
|
158
|
-
| 技能
|
|
159
|
-
|
|
160
|
-
| `browser`
|
|
161
|
-
| `github`
|
|
162
|
-
| `notion`
|
|
163
|
-
| `memory`
|
|
164
|
-
| `telegram-send`
|
|
165
|
-
| `vision-click`
|
|
166
|
-
| `imagegen`
|
|
167
|
-
| `pdf` / `docx` / `xlsx`
|
|
168
|
-
| `screen-capture`
|
|
169
|
-
| `openai-docs`
|
|
170
|
-
| `dev` / `dev-frontend` / `dev-backend` / `dev-data` / `dev-testing` | 子 Agent 开发指南
|
|
159
|
+
| 技能 | 功能 |
|
|
160
|
+
| ------------------------------------------------------------------- | --------------------------------------- |
|
|
161
|
+
| `browser` | Chrome 自动化 — 快照、点击、导航、截图 |
|
|
162
|
+
| `github` | 问题、PR、CI、代码审查(使用 `gh` CLI) |
|
|
163
|
+
| `notion` | 创建/管理 Notion 页面和数据库 |
|
|
164
|
+
| `memory` | 跨会话持久长期记忆 |
|
|
165
|
+
| `telegram-send` | 向 Telegram 发送照片、文档、语音消息 |
|
|
166
|
+
| `vision-click` | 截图 → AI 找坐标 → 点击(一条命令) |
|
|
167
|
+
| `imagegen` | 通过 OpenAI Image API 生成/编辑图像 |
|
|
168
|
+
| `pdf` / `docx` / `xlsx` | 读取、创建、编辑办公文档 |
|
|
169
|
+
| `screen-capture` | macOS 截图和摄像头捕获 |
|
|
170
|
+
| `openai-docs` | 最新 OpenAI API 文档 |
|
|
171
|
+
| `dev` / `dev-frontend` / `dev-backend` / `dev-data` / `dev-testing` | 子 Agent 开发指南 |
|
|
171
172
|
|
|
172
173
|
#### 参考技能(按需调用)
|
|
173
174
|
|
|
174
175
|
88 个技能随时待命 — Spotify、天气、深度研究、TTS、视频下载、Apple 提醒事项、1Password、Terraform、PostgreSQL、Jupyter 等。
|
|
175
176
|
|
|
176
177
|
```bash
|
|
177
|
-
|
|
178
|
+
jaw skill install <name> # 参考 → 活跃,永久激活
|
|
178
179
|
```
|
|
179
180
|
|
|
180
181
|
</details>
|
|
@@ -193,7 +194,7 @@ cli-jaw skill install <name> # 参考 → 活跃,永久激活
|
|
|
193
194
|
<summary>📋 Telegram 配置(3 步搞定)</summary>
|
|
194
195
|
|
|
195
196
|
1. **创建机器人** — 给 [@BotFather](https://t.me/BotFather) 发 `/newbot` → 复制 Token
|
|
196
|
-
2. **配置** — 运行 `
|
|
197
|
+
2. **配置** — 运行 `jaw init --telegram-token 你的TOKEN`,或在 Web UI 设置中填入
|
|
197
198
|
3. **开聊** — 给你的机器人发任意消息。首次发送时 Chat ID 会自动保存。
|
|
198
199
|
|
|
199
200
|
</details>
|
|
@@ -254,7 +255,7 @@ graph TD
|
|
|
254
255
|
## 🔌 MCP — 单次配置,驱动 5 大 AI 引擎
|
|
255
256
|
|
|
256
257
|
```bash
|
|
257
|
-
|
|
258
|
+
jaw mcp install @anthropic/context7 # 安装一次
|
|
258
259
|
# → 自动同步到 Claude、Codex、Gemini、OpenCode、Copilot
|
|
259
260
|
```
|
|
260
261
|
|
|
@@ -276,15 +277,18 @@ graph LR
|
|
|
276
277
|
## ⌨️ CLI 命令
|
|
277
278
|
|
|
278
279
|
```bash
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
280
|
+
jaw serve # 启动服务器
|
|
281
|
+
jaw launchd # 开机自动启动 (macOS)
|
|
282
|
+
jaw launchd status # 查看守护进程状态
|
|
283
|
+
jaw launchd unset # 取消自动启动
|
|
284
|
+
jaw chat # 终端 TUI
|
|
285
|
+
jaw doctor # 诊断(12 项检查)
|
|
286
|
+
jaw skill install <name> # 安装技能
|
|
287
|
+
jaw mcp install <package> # 安装 MCP → 同步全部 5 CLI
|
|
288
|
+
jaw memory search <query> # 搜索记忆
|
|
289
|
+
jaw browser start # 启动 Chrome(CDP)
|
|
290
|
+
jaw browser vision-click "登录" # AI 智能点击
|
|
291
|
+
jaw reset # 全面重置
|
|
288
292
|
```
|
|
289
293
|
|
|
290
294
|
---
|
|
@@ -296,13 +300,13 @@ cli-jaw reset # 全面重置
|
|
|
296
300
|
<details>
|
|
297
301
|
<summary>查看全部预设</summary>
|
|
298
302
|
|
|
299
|
-
| CLI
|
|
300
|
-
|
|
301
|
-
| **Claude**
|
|
302
|
-
| **Codex**
|
|
303
|
-
| **Gemini**
|
|
303
|
+
| CLI | 默认值 | 主要模型 |
|
|
304
|
+
| ------------ | -------------------------- | ---------------------------------------------- |
|
|
305
|
+
| **Claude** | `claude-sonnet-4-6` | opus-4-6、haiku-4-5、扩展思考变体 |
|
|
306
|
+
| **Codex** | `gpt-5.3-codex` | spark、5.2、5.1-max、5.1-mini |
|
|
307
|
+
| **Gemini** | `gemini-2.5-pro` | 3.0-pro-preview、3-flash-preview、2.5-flash |
|
|
304
308
|
| **OpenCode** | `claude-opus-4-6-thinking` | 🆓 big-pickle、GLM-5、MiniMax、Kimi、GPT-5-Nano |
|
|
305
|
-
| **Copilot**
|
|
309
|
+
| **Copilot** | `gpt-4.1` 🆓 | 🆓 gpt-5-mini、claude-sonnet-4.6、opus-4.6 |
|
|
306
310
|
|
|
307
311
|
</details>
|
|
308
312
|
|
|
@@ -367,24 +371,24 @@ npm test
|
|
|
367
371
|
|
|
368
372
|
## 📖 文档
|
|
369
373
|
|
|
370
|
-
| 文档
|
|
371
|
-
|
|
374
|
+
| 文档 | 内容 |
|
|
375
|
+
| --------------------------------------- | -------------------------------------- |
|
|
372
376
|
| [ARCHITECTURE.md](docs/ARCHITECTURE.md) | 系统设计、模块图、REST API(40+ 端点) |
|
|
373
|
-
| [TESTS.md](TESTS.md)
|
|
377
|
+
| [TESTS.md](TESTS.md) | 测试覆盖率、测试计划 |
|
|
374
378
|
|
|
375
379
|
---
|
|
376
380
|
|
|
377
381
|
## 🔧 故障排查
|
|
378
382
|
|
|
379
|
-
| 症状
|
|
380
|
-
|
|
381
|
-
| `command not found: cli-jaw` | npm 全局 bin 不在 PATH 中
|
|
382
|
-
| `doctor` 显示 CLI 缺失
|
|
383
|
-
| 端口 3457 被占用
|
|
384
|
-
| Telegram 机器人无响应
|
|
385
|
-
| `npm install -g` 权限错误
|
|
386
|
-
| 构建失败(`tsc` 报错)
|
|
387
|
-
| 会话间记忆未保留
|
|
383
|
+
| 症状 | 原因 | 解决方法 |
|
|
384
|
+
| ---------------------------- | ----------------------------- | ------------------------------------------------------------------------ |
|
|
385
|
+
| `command not found: cli-jaw` | npm 全局 bin 不在 PATH 中 | 运行 `npm config get prefix`,将 `bin/` 加入 PATH |
|
|
386
|
+
| `doctor` 显示 CLI 缺失 | 对应 CLI 未安装 | 按提示安装,如 `npm i -g @anthropic-ai/claude-code` |
|
|
387
|
+
| 端口 3457 被占用 | 其他进程占用了端口 | 改用 `PORT=4000 jaw serve` 或终止占用进程 |
|
|
388
|
+
| Telegram 机器人无响应 | Token 未配置或缺少 Chat ID | 重新运行 `jaw init --telegram-token ...` |
|
|
389
|
+
| `npm install -g` 权限错误 | 全局目录权限不足 | 使用 `sudo npm i -g cli-jaw` 或推荐 [nvm](https://github.com/nvm-sh/nvm) |
|
|
390
|
+
| 构建失败(`tsc` 报错) | Node 版本低于 22 | `node -v` 检查 → 升级至 22+ |
|
|
391
|
+
| 会话间记忆未保留 | `~/.cli-jaw/memory/` 目录缺失 | 重新运行 `jaw init` 自动创建 |
|
|
388
392
|
|
|
389
393
|
---
|
|
390
394
|
|
package/dist/bin/cli-jaw.js
CHANGED
|
@@ -30,7 +30,7 @@ ${c.cyan} _____ _ _____ _
|
|
|
30
30
|
${c.dim} ─────────────────────────────────────${c.reset}
|
|
31
31
|
${c.bold} 🦈 v${pkg.version}${c.reset} ${c.dim}AI Agent Orchestration Platform${c.reset}
|
|
32
32
|
|
|
33
|
-
${c.bold}Usage:${c.reset}
|
|
33
|
+
${c.bold}Usage:${c.reset} jaw <command> [options]
|
|
34
34
|
|
|
35
35
|
${c.bold}Commands:${c.reset}
|
|
36
36
|
serve 서버 시작 (포그라운드)
|
|
@@ -44,16 +44,17 @@ ${c.bold} 🦈 v${pkg.version}${c.reset} ${c.dim}AI Agent Orchestration Platf
|
|
|
44
44
|
status 서버 상태 확인
|
|
45
45
|
browser 브라우저 제어
|
|
46
46
|
memory 영구 메모리 관리
|
|
47
|
+
launchd macOS 자동 실행 관리 (install/uninstall/status)
|
|
47
48
|
|
|
48
49
|
${c.bold}Options:${c.reset}
|
|
49
50
|
--help 도움말 표시
|
|
50
51
|
--version 버전 표시
|
|
51
52
|
|
|
52
53
|
${c.bold}Examples:${c.reset}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
jaw serve --port 3457
|
|
55
|
+
jaw init
|
|
56
|
+
jaw doctor --json
|
|
57
|
+
jaw chat --raw
|
|
57
58
|
`);
|
|
58
59
|
}
|
|
59
60
|
switch (command) {
|
|
@@ -90,6 +91,9 @@ switch (command) {
|
|
|
90
91
|
case 'memory':
|
|
91
92
|
await import('./commands/memory.js');
|
|
92
93
|
break;
|
|
94
|
+
case 'launchd':
|
|
95
|
+
await import('./commands/launchd.js');
|
|
96
|
+
break;
|
|
93
97
|
case '--version':
|
|
94
98
|
case '-v':
|
|
95
99
|
console.log(`cli-jaw v${pkg.version}`);
|
package/dist/bin/cli-jaw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-jaw.js","sourceRoot":"","sources":["../../bin/cli-jaw.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,IAAI,GAAQ,CAAC;AACb,IAAI,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACtD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC;AAAC,MAAM,CAAC;IACL,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAC5D,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,SAAS,SAAS;IACd,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC;EACd,CAAC,CAAC,IAAI;;;;;uDAK+C,CAAC,CAAC,KAAK;EAC5D,CAAC,CAAC,GAAG,2CAA2C,CAAC,CAAC,KAAK;EACvD,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,kCAAkC,CAAC,CAAC,KAAK;;IAEtF,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK;;IAEtB,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,KAAK
|
|
1
|
+
{"version":3,"file":"cli-jaw.js","sourceRoot":"","sources":["../../bin/cli-jaw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli-jaw launchd — macOS LaunchAgent 관리
|
|
3
|
+
* Usage:
|
|
4
|
+
* jaw launchd — plist 확인 → 없으면 생성 → 시작 (원스텝)
|
|
5
|
+
* jaw launchd unset — plist 제거 + 해제
|
|
6
|
+
* jaw launchd status — 현재 상태 확인
|
|
7
|
+
*/
|
|
8
|
+
import { execSync } from 'node:child_process';
|
|
9
|
+
import { existsSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
const LABEL = 'com.cli-jaw.serve';
|
|
13
|
+
const PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${LABEL}.plist`);
|
|
14
|
+
const LOG_DIR = join(homedir(), '.cli-jaw', 'logs');
|
|
15
|
+
function getNodePath() {
|
|
16
|
+
try {
|
|
17
|
+
return execSync('which node', { encoding: 'utf8' }).trim();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return '/usr/local/bin/node';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function getJawPath() {
|
|
24
|
+
try {
|
|
25
|
+
return execSync('which jaw', { encoding: 'utf8' }).trim();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return execSync('which cli-jaw', { encoding: 'utf8' }).trim();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function generatePlist() {
|
|
32
|
+
const nodePath = getNodePath();
|
|
33
|
+
const jawPath = getJawPath();
|
|
34
|
+
execSync(`mkdir -p ${LOG_DIR}`);
|
|
35
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
36
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
37
|
+
<plist version="1.0">
|
|
38
|
+
<dict>
|
|
39
|
+
<key>Label</key>
|
|
40
|
+
<string>${LABEL}</string>
|
|
41
|
+
<key>ProgramArguments</key>
|
|
42
|
+
<array>
|
|
43
|
+
<string>${nodePath}</string>
|
|
44
|
+
<string>${jawPath}</string>
|
|
45
|
+
<string>serve</string>
|
|
46
|
+
</array>
|
|
47
|
+
<key>RunAtLoad</key>
|
|
48
|
+
<true/>
|
|
49
|
+
<key>KeepAlive</key>
|
|
50
|
+
<true/>
|
|
51
|
+
<key>WorkingDirectory</key>
|
|
52
|
+
<string>${homedir()}</string>
|
|
53
|
+
<key>StandardOutPath</key>
|
|
54
|
+
<string>${LOG_DIR}/jaw-serve.log</string>
|
|
55
|
+
<key>StandardErrorPath</key>
|
|
56
|
+
<string>${LOG_DIR}/jaw-serve.err</string>
|
|
57
|
+
<key>EnvironmentVariables</key>
|
|
58
|
+
<dict>
|
|
59
|
+
<key>PATH</key>
|
|
60
|
+
<string>${process.env.PATH}</string>
|
|
61
|
+
</dict>
|
|
62
|
+
</dict>
|
|
63
|
+
</plist>`;
|
|
64
|
+
}
|
|
65
|
+
function isLoaded() {
|
|
66
|
+
try {
|
|
67
|
+
const out = execSync(`launchctl list | grep ${LABEL}`, { encoding: 'utf8' }).trim();
|
|
68
|
+
return !!out;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const sub = process.argv[3];
|
|
75
|
+
switch (sub) {
|
|
76
|
+
case 'unset': {
|
|
77
|
+
if (!existsSync(PLIST_PATH)) {
|
|
78
|
+
console.log('⚠️ launchd에 등록되어 있지 않습니다');
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
execSync(`launchctl unload ${PLIST_PATH}`, { stdio: 'pipe' });
|
|
83
|
+
}
|
|
84
|
+
catch { /* ok */ }
|
|
85
|
+
unlinkSync(PLIST_PATH);
|
|
86
|
+
console.log('✅ jaw serve 자동 실행 해제 완료');
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case 'status': {
|
|
90
|
+
if (!existsSync(PLIST_PATH)) {
|
|
91
|
+
console.log('⚠️ jaw serve가 launchd에 등록되어 있지 않습니다');
|
|
92
|
+
console.log(' 등록: jaw launchd');
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const out = execSync(`launchctl list | grep ${LABEL}`, { encoding: 'utf8' }).trim();
|
|
97
|
+
const parts = out.split('\t');
|
|
98
|
+
const pid = parts[0] === '-' ? 'stopped' : `running (PID ${parts[0]})`;
|
|
99
|
+
console.log(`🦈 jaw serve — ${pid}`);
|
|
100
|
+
console.log(` plist: ${PLIST_PATH}`);
|
|
101
|
+
console.log(` log: ${LOG_DIR}/jaw-serve.log`);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
console.log('🦈 jaw serve — not loaded');
|
|
105
|
+
console.log(` plist: ${PLIST_PATH} (exists but not loaded)`);
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
default: {
|
|
110
|
+
// 원스텝: 확인 → 생성 → 시작
|
|
111
|
+
console.log('🦈 jaw launchd setup\n');
|
|
112
|
+
// 1. plist 확인
|
|
113
|
+
if (existsSync(PLIST_PATH)) {
|
|
114
|
+
console.log('📄 plist 발견 — 재생성합니다');
|
|
115
|
+
try {
|
|
116
|
+
execSync(`launchctl unload ${PLIST_PATH}`, { stdio: 'pipe' });
|
|
117
|
+
}
|
|
118
|
+
catch { /* ok */ }
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log('📄 plist 없음 — 새로 생성합니다');
|
|
122
|
+
}
|
|
123
|
+
// 2. plist 생성
|
|
124
|
+
const plist = generatePlist();
|
|
125
|
+
writeFileSync(PLIST_PATH, plist);
|
|
126
|
+
console.log(`✅ plist 저장: ${PLIST_PATH}`);
|
|
127
|
+
// 3. launchd 등록 + 시작
|
|
128
|
+
execSync(`launchctl load -w ${PLIST_PATH}`);
|
|
129
|
+
console.log('✅ launchd 등록 + 시작 완료\n');
|
|
130
|
+
// 4. 상태 확인
|
|
131
|
+
setTimeout(() => {
|
|
132
|
+
if (isLoaded()) {
|
|
133
|
+
console.log('🦈 jaw serve가 백그라운드에서 실행 중입니다');
|
|
134
|
+
console.log(' http://localhost:3457');
|
|
135
|
+
console.log(` 로그: ${LOG_DIR}/jaw-serve.log`);
|
|
136
|
+
console.log('\n 해제: jaw launchd unset');
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log('⚠️ 시작되지 않았습니다. 로그를 확인하세요:');
|
|
140
|
+
console.log(` cat ${LOG_DIR}/jaw-serve.err`);
|
|
141
|
+
}
|
|
142
|
+
}, 1000);
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=launchd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../../bin/commands/launchd.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cli-jaw",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Personal AI assistant powered by 5 engines (Claude, Codex, Gemini, OpenCode, Copilot) — Web, Terminal, and Telegram interfaces with 107 built-in skills",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|