@gbdx/devis 1.0.0
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/LICENSE +661 -0
- package/README.md +201 -0
- package/dist/cli/index.js +2217 -0
- package/dist/ui/assets/index-B3EEPtRc.js +33294 -0
- package/dist/ui/assets/index-BDxL9RBN.css +8892 -0
- package/dist/ui/index.html +31 -0
- package/package.json +78 -0
- package/schema/devis.schema.json +49 -0
- package/scripts/install.mjs +137 -0
package/README.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# devis
|
|
2
|
+
|
|
3
|
+
pnpm 모노레포의 **로컬 개발 데스크톱 앱**. 시스템에 한 번 설치해 두고, 여러
|
|
4
|
+
모노레포의 워크스페이스를 한 창에서 등록·전환·관리한다. 사이드바에서 모노레포를
|
|
5
|
+
고르면 그 워크스페이스의 프로젝트·프로세스·로그를 보고, pm2/docker/pnpm 을 UI 에서
|
|
6
|
+
직접 조작한다.
|
|
7
|
+
|
|
8
|
+
## 기능
|
|
9
|
+
|
|
10
|
+
- **Workspaces 사이드바** — 등록된 모노레포 전환. 드래그로 순서 변경. 활성
|
|
11
|
+
모노레포의 컨텍스트만 표시·조작.
|
|
12
|
+
- **Workspace 탭** — 모노레포 전체 패키지를 카테고리(App/Module/Infra)별로
|
|
13
|
+
조회. pm2 프로세스의 상태·CPU·메모리·업타임 실시간 표시 (CPU/메모리는 프로세스
|
|
14
|
+
트리 전체 합산이라 실제 워크로드 값). 시작/재시작/정지/삭제 UI 에서 바로.
|
|
15
|
+
- **Docker 탭** — 로컬 컨테이너 목록·시작/중지/재시작/삭제·실시간 로그.
|
|
16
|
+
- **로그 뷰어** — 가상 스크롤 (라이브 ≤2000줄, history 무제한), ANSI 색상.
|
|
17
|
+
- **도구 버튼** — 프로젝트 위치에서 WebStorm·VS Code·터미널·Finder 한 번에 열기.
|
|
18
|
+
|
|
19
|
+
## 설치
|
|
20
|
+
|
|
21
|
+
### 글로벌 설치 (권장)
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
pnpm install -g @gbdx/devis
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
또는 임시 실행:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
pnpx @gbdx/devis
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
> 문서·예제는 **pnpm/pnpx** 표기만 사용한다 (devis 가 pnpm 모노레포 전용 도구
|
|
34
|
+
> 라 도구체인을 일관시킴). npm/npx 도 동일하게 동작은 한다.
|
|
35
|
+
|
|
36
|
+
설치 직후 자동 수행:
|
|
37
|
+
- `prepare` — CLI 번들 빌드 (`dist/cli/index.js`)
|
|
38
|
+
- `postinstall` — caddy 바이너리 다운로드 (`.bin/caddy`)
|
|
39
|
+
|
|
40
|
+
> pnpm 10+ 는 의존성의 `postinstall`/`prepare` 를 기본 차단한다. 첫 설치 시
|
|
41
|
+
> `pnpm approve-builds` 로 한 번 승인해야 한다.
|
|
42
|
+
|
|
43
|
+
> **Neutralino 런타임**: 첫 실행 시 OS·arch 에 맞는 프레임워크 바이너리(~2MB)를
|
|
44
|
+
> `~/.devis/neutralino/<version>/` 으로 lazy 다운로드 (이후 재사용).
|
|
45
|
+
|
|
46
|
+
### 요구사항
|
|
47
|
+
|
|
48
|
+
- **Node 24+** — devis CLI 런타임
|
|
49
|
+
- **pnpm** — 모노레포 도구. catalog 등의 기능을 가정
|
|
50
|
+
- **macOS / Linux / Windows** — 시스템 webview 사용
|
|
51
|
+
- macOS: WKWebView (기본 포함)
|
|
52
|
+
- Linux: `libwebkit2gtk-4.0-37` 또는 `4.1-0`
|
|
53
|
+
- Windows: WebView2 (Win11 기본 포함, Win10 은 별도 설치)
|
|
54
|
+
|
|
55
|
+
## 시작하기
|
|
56
|
+
|
|
57
|
+
모노레포로 이동해서 실행:
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
cd /path/to/your/monorepo
|
|
61
|
+
devis
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
처음 호출 흐름:
|
|
65
|
+
1. cwd 의 모노레포(`pnpm-workspace.yaml` 위치) 가 `~/.devis/workspaces/` 에 자동 등록
|
|
66
|
+
2. `devis.config.jsonc` 가 없으면 자동 생성, `node_modules/.cache/devis/schema.json` 도 동기화
|
|
67
|
+
3. 활성 워크스페이스로 설정
|
|
68
|
+
4. 데스크톱 앱이 글로벌 캐시에 없으면 조립
|
|
69
|
+
5. 앱 실행 (Dock/작업표시줄에 고정해 두면 클릭만으로 재실행 가능)
|
|
70
|
+
|
|
71
|
+
같은 명령을 다른 모노레포에서 실행하면 — 이미 떠 있는 인스턴스의 사이드바가
|
|
72
|
+
새 모노레포로 자동 전환 (file watcher 기반). 등록도 자동.
|
|
73
|
+
|
|
74
|
+
## CLI 명령
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
# 워크스페이스 관리
|
|
78
|
+
devis # UI 실행 (cwd 가 모노레포면 등록·활성화)
|
|
79
|
+
devis register [path] # 워크스페이스 수동 등록 (기본: cwd)
|
|
80
|
+
devis unregister <slug> # 등록 해제
|
|
81
|
+
devis workspaces # 등록 목록 (* = 활성)
|
|
82
|
+
|
|
83
|
+
# fleet 관리 — cwd 의 모노레포에 작용. 모노레포 밖이면 에러.
|
|
84
|
+
devis up [name|all] # 앱 실행 (포트·인증서·Caddy·pm2 자동)
|
|
85
|
+
devis down [name|all] # 정리
|
|
86
|
+
devis status (ps) # 프로세스 표
|
|
87
|
+
devis logs [name] # 실시간 로그
|
|
88
|
+
devis restart [name|all]
|
|
89
|
+
devis stop [name|all]
|
|
90
|
+
devis caddy # Caddy 만 단독 기동
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
UI 의 "시작" 버튼은 내부적으로 `devis up <name>` 을 활성 워크스페이스 cwd 로
|
|
94
|
+
호출 — 항상 정확한 모노레포에 적용.
|
|
95
|
+
|
|
96
|
+
## 설정
|
|
97
|
+
|
|
98
|
+
설정은 **모노레포별로** `devis.config.jsonc` 에 둔다. 활성 워크스페이스의 config
|
|
99
|
+
를 그때그때 읽는다. `.env` 등은 사용하지 않는다.
|
|
100
|
+
|
|
101
|
+
| 파일 | 용도 | 커밋 |
|
|
102
|
+
|------|------|------|
|
|
103
|
+
| `devis.config.jsonc` | 팀 공용 설정 | ✅ |
|
|
104
|
+
| `devis.config.local.jsonc` | 개인 로컬 오버라이드 | ❌ (gitignore) |
|
|
105
|
+
|
|
106
|
+
워크스페이스에서 devis 를 처음 실행하면 `devis.config.jsonc` 가 없을 때 자동
|
|
107
|
+
생성된다 — `workspaceSlug` 는 루트 `package.json` name 에서 도출. 두 파일 모두
|
|
108
|
+
없어도 기본값으로 동작한다.
|
|
109
|
+
|
|
110
|
+
자동완성·검증은 매 실행 시 `node_modules/.cache/devis/schema.json` 에 떨궈지는
|
|
111
|
+
JSON Schema 가 담당. 생성된 config 의 `$schema` 가 그 상대 경로를 가리킨다.
|
|
112
|
+
|
|
113
|
+
```jsonc
|
|
114
|
+
// devis.config.jsonc
|
|
115
|
+
{
|
|
116
|
+
"$schema": "./node_modules/.cache/devis/schema.json",
|
|
117
|
+
|
|
118
|
+
// pm2 namespace · Caddy 라우트 식별자. 기본: 루트 package.json name.
|
|
119
|
+
"workspaceSlug": "myapp",
|
|
120
|
+
|
|
121
|
+
// 로컬 HTTPS 도메인. 기본: `<workspaceSlug>.lvh.me`
|
|
122
|
+
// "internalDomain": "myapp.lvh.me",
|
|
123
|
+
|
|
124
|
+
// 외부 퍼블릭 도메인 (옵션). 설정 시 ACME 인증서 자동 발급.
|
|
125
|
+
// "publicDomain": "myapp.example.com"
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
| 필드 | 기본값 | 설명 |
|
|
130
|
+
|------|--------|------|
|
|
131
|
+
| `workspaceSlug` | 루트 `package.json` name (`@scope/foo` → `scope-foo`) | pm2 namespace / Caddy 라우트 식별 |
|
|
132
|
+
| `internalDomain` | `<workspaceSlug>.lvh.me` | 로컬 HTTPS 도메인 |
|
|
133
|
+
| `caddyAdmin` | `http://localhost:2019` | Caddy Admin API |
|
|
134
|
+
| `publicDomain` | — | 퍼블릭 도메인 (선택) |
|
|
135
|
+
| `tls` | — | 기존 인증서 직접 지정 (선택) |
|
|
136
|
+
|
|
137
|
+
## 글로벌 상태 위치
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
~/.devis/
|
|
141
|
+
├── workspaces/<slug>/workspace.json # 등록 워크스페이스 메타데이터
|
|
142
|
+
├── active # 활성 슬러그 (텍스트 한 줄)
|
|
143
|
+
├── preferences.json # 사용자 설정
|
|
144
|
+
├── neutralino/<ver>/ # 프레임워크 바이너리 캐시
|
|
145
|
+
├── app/<ver>/Devis.app # 조립된 데스크톱 앱 (macOS)
|
|
146
|
+
├── pm2/ # 전용 PM2_HOME
|
|
147
|
+
├── lock # 싱글톤 PID
|
|
148
|
+
└── logs/
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
- 특정 모노레포 빼기: `devis unregister <slug>` (또는 디렉터리 삭제)
|
|
152
|
+
- 전체 초기화: `rm -rf ~/.devis`
|
|
153
|
+
- 위치 override: 환경변수 `DEVIS_HOME`
|
|
154
|
+
|
|
155
|
+
## 아키텍처
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
┌──────────────────────────────────────────────────┐
|
|
159
|
+
│ devis CLI (Node.js, 글로벌 설치 또는 pnpx) │
|
|
160
|
+
│ - cwd 의 모노레포 감지·자동 등록 │
|
|
161
|
+
│ - 다른 인스턴스 있으면 active 만 갱신 후 종료 │
|
|
162
|
+
│ - 안 떠 있으면 글로벌 캐시에 앱 조립 + 실행 │
|
|
163
|
+
└────────────────────────┬─────────────────────────┘
|
|
164
|
+
▼
|
|
165
|
+
┌──────────────────────────────────────────────────┐
|
|
166
|
+
│ Devis 데스크톱 앱 (Neutralino webview) │
|
|
167
|
+
│ ┌──────────────┬──────────────────────────────┐ │
|
|
168
|
+
│ │ Workspaces │ React SPA │ │
|
|
169
|
+
│ │ 사이드바 │ └─► os.execCommand/spawn │ │
|
|
170
|
+
│ │ │ → pnpm/pm2/docker 직접 │ │
|
|
171
|
+
│ └──────────────┴──────────────────────────────┘ │
|
|
172
|
+
└──────────────────────────────────────────────────┘
|
|
173
|
+
│
|
|
174
|
+
▼
|
|
175
|
+
~/.devis/ (글로벌 홈)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
자세한 설계 결정은 [`docs/adr/`](./docs/adr/) 참고.
|
|
179
|
+
|
|
180
|
+
## 외부 의존성
|
|
181
|
+
|
|
182
|
+
| 의존성 | 역할 | 설치 방식 |
|
|
183
|
+
|--------|------|----------|
|
|
184
|
+
| **Neutralino** | 데스크톱 셸 (시스템 webview) | 첫 실행 시 자동 다운로드 |
|
|
185
|
+
| **pm2** | 워크스페이스 앱들의 백그라운드 관리 | npm (번들) |
|
|
186
|
+
| **caddy** | 워크스페이스 앱들의 HTTPS 리버스 프록시 | postinstall 자동 / 시스템 caddy 감지 |
|
|
187
|
+
| **devcert** | 로컬 CA + HTTPS 인증서 | npm |
|
|
188
|
+
| **@resvg/resvg-js** | 앱 아이콘 SVG → PNG 라스터 | npm (prebuilt) |
|
|
189
|
+
| **zod** | 글로벌 상태 파일 스키마 검증 | npm |
|
|
190
|
+
| **docker** | (선택) 컨테이너 조회·제어 | 시스템 |
|
|
191
|
+
|
|
192
|
+
docker 는 없어도 동작 — Docker 탭에 안내 메시지만.
|
|
193
|
+
|
|
194
|
+
## 기여
|
|
195
|
+
|
|
196
|
+
기여자·AI 에이전트를 위한 가이드는 [`AGENTS.md`](./AGENTS.md) 와 모듈별
|
|
197
|
+
`*/AGENTS.md` 참고. 설계 결정은 [`docs/adr/`](./docs/adr/).
|
|
198
|
+
|
|
199
|
+
## 라이선스
|
|
200
|
+
|
|
201
|
+
[AGPL-3.0-or-later](./LICENSE).
|