visual-remote 0.3.1 → 0.3.3
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.md +55 -8
- package/apps/cli/dist/direct-exec-mcp.js +108 -1
- package/apps/cli/dist/index.js +948 -351
- package/apps/cli/dist/next.js +692 -218
- package/apps/cli/dist/vite.js +764 -250
- package/package.json +8 -5
- package/packages/overlay/dist/client.js +5 -5
- package/packages/overlay/dist/viewer.js +3 -3
package/README.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# Visual Remote Dev Bridge
|
|
2
2
|
|
|
3
3
|
실행 중인 개발 화면에서 요소나 영역을 선택하고 자연어 요청을 보내면, 해당 Git
|
|
4
|
-
작업 트리에서
|
|
4
|
+
작업 트리에서 선택한 코딩 에이전트가 소스를 수정하도록 연결하는 저장소 전용 개발
|
|
5
|
+
브리지입니다.
|
|
5
6
|
브라우저에서 진행 상태, 변경 파일, 차이, 검증 결과를 확인하고 변경을 유지하거나
|
|
6
7
|
되돌릴 수 있습니다.
|
|
7
8
|
|
|
@@ -9,7 +10,7 @@
|
|
|
9
10
|
|
|
10
11
|
- Node.js 24.18.0
|
|
11
12
|
- Git
|
|
12
|
-
- 인증을 마친 `codex` 명령줄 도구
|
|
13
|
+
- 인증을 마친 `codex` 또는 `claude` 명령줄 도구
|
|
13
14
|
- Corepack으로 실행하는 pnpm 10.34.5
|
|
14
15
|
- 외부 접속이 필요하면 Portr와 같은 HTTP/WebSocket 터널
|
|
15
16
|
|
|
@@ -54,6 +55,11 @@ http://localhost:9011/_visual/* → 내부 Visual Remote Bridge로만 전달
|
|
|
54
55
|
이미 실행 중이던 개발 서버가 있다면 `init` 후 한 번 재시작해야 변경된 설정이
|
|
55
56
|
적용됩니다. Portr를 사용할 때도 내부 Bridge 포트가 아니라 기존 앱 포트만 노출합니다.
|
|
56
57
|
|
|
58
|
+
Next.js 기본 로컬 통합은 같은 프로토콜·앱 포트의 `localhost`와 `127.0.0.1`을
|
|
59
|
+
모두 허용합니다. `gateway.publicUrl`이나 비어 있지 않은 `security.allowedOrigins`를
|
|
60
|
+
직접 설정하면 이 별칭 자동 허용은 적용하지 않습니다. LAN·터널 주소는 해당 설정에
|
|
61
|
+
명시해야 하며, 무관한 주소나 다른 포트는 자동으로 허용하지 않습니다.
|
|
62
|
+
|
|
57
63
|
자동 통합은 Vite와 Next.js 프로젝트를 지원합니다. 다른 프레임워크나 설정 파일을
|
|
58
64
|
자동으로 수정하고 싶지 않은 프로젝트에서는 아래의 `attach` 방식을 사용할 수 있습니다.
|
|
59
65
|
|
|
@@ -83,15 +89,15 @@ corepack pnpm build
|
|
|
83
89
|
node apps/cli/dist/index.js doctor
|
|
84
90
|
```
|
|
85
91
|
|
|
86
|
-
`doctor`에서 Git 작업 트리, 현재 프로젝트 설정과
|
|
92
|
+
`doctor`에서 Git 작업 트리, 현재 프로젝트 설정과 선택한 에이전트 실행 환경을 확인합니다.
|
|
87
93
|
|
|
88
|
-
|
|
94
|
+
에이전트 작업 중 `pwd`, 버전 확인, 파일 읽기·검색과 read-only Git 명령은 Bridge가
|
|
89
95
|
등록한 구조화 도구로 실행합니다. 이 경로는 명령을 `argv` 배열과 등록된 workspace
|
|
90
96
|
`cwd`로 전달하고 `shell: false`로 실행하며, 지원되는 명령은 RTK로 자동 압축합니다.
|
|
91
97
|
직접 실행기는 명령별 읽기 전용 문법만 허용하고 경로·symlink를 Git worktree 안으로
|
|
92
98
|
제한하며, 타임아웃 시 하위 프로세스까지 종료합니다. 명령 소요 시간, RTK 사용,
|
|
93
|
-
출력 축약 여부와
|
|
94
|
-
파일 수정, 테스트·빌드 또는 파이프처럼 셸 문법이 필요한 작업만
|
|
99
|
+
출력 축약 여부와 에이전트가 제공하는 토큰 사용량은 작업 로그에 함께 기록됩니다.
|
|
100
|
+
파일 수정, 테스트·빌드 또는 파이프처럼 셸 문법이 필요한 작업만 에이전트의 sandbox
|
|
95
101
|
명령 실행기로 보냅니다.
|
|
96
102
|
|
|
97
103
|
## 자동화 셸에서 Node.js 24 사용
|
|
@@ -142,7 +148,12 @@ upstream:
|
|
|
142
148
|
|
|
143
149
|
agent:
|
|
144
150
|
adapter: codex
|
|
151
|
+
# profile: proxy
|
|
152
|
+
# model: gpt-5.6-sol
|
|
153
|
+
# reasoningEffort: medium
|
|
154
|
+
# inheritEnv: [CUSTOM_PROVIDER_KEY]
|
|
145
155
|
maxRunMs: 900000
|
|
156
|
+
resumeMode: auto
|
|
146
157
|
|
|
147
158
|
verification:
|
|
148
159
|
hmrWaitMs: 12000
|
|
@@ -171,9 +182,38 @@ paths:
|
|
|
171
182
|
- dist/**
|
|
172
183
|
```
|
|
173
184
|
|
|
185
|
+
`agent.model`과 `agent.reasoningEffort`를 지정하면 새 작업과 재개 작업에 동일하게
|
|
186
|
+
적용됩니다. Codex effort는 `minimal`, `low`, `medium`, `high`, `xhigh`를, Claude
|
|
187
|
+
effort는 `low`, `medium`, `high`, `xhigh`, `max`를 지원합니다. 값을 생략하면 선택한
|
|
188
|
+
CLI의 현재 기본 설정을 사용합니다.
|
|
189
|
+
|
|
190
|
+
Claude를 사용하려면 `adapter: claude`로 변경합니다. Visual Remote는 Claude를
|
|
191
|
+
`acceptEdits` 권한으로 실행하고 사용자 MCP를 로드하지 않습니다. Linux에서 Bash
|
|
192
|
+
sandbox까지 사용하려면 `bwrap`과 `socat`이 모두 필요하며 `visual doctor`가 설치
|
|
193
|
+
상태를 표시합니다.
|
|
194
|
+
|
|
195
|
+
Codex의 OpenAI-compatible provider는 사용자 Codex profile에 정의하고
|
|
196
|
+
`agent.profile`로 선택합니다. provider는 Responses API streaming을 지원해야 합니다.
|
|
197
|
+
예를 들어 `$CODEX_HOME/proxy.config.toml`은 다음처럼 작성합니다.
|
|
198
|
+
|
|
199
|
+
```toml
|
|
200
|
+
model_provider = "proxy"
|
|
201
|
+
|
|
202
|
+
[model_providers.proxy]
|
|
203
|
+
name = "OpenAI-compatible proxy"
|
|
204
|
+
base_url = "https://proxy.example.com/v1"
|
|
205
|
+
wire_api = "responses"
|
|
206
|
+
env_key = "CUSTOM_PROVIDER_KEY"
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
API key 값은 YAML에 기록하지 않습니다. `agent.inheritEnv`에는 부모 프로세스에서
|
|
210
|
+
Codex 또는 Claude로 전달할 환경변수 이름만 작성하며, 누락된 변수는 `visual doctor`가
|
|
211
|
+
실패로 보고합니다. 개인별 선택은 Git에서 제외되는
|
|
212
|
+
`.visualdev/config.local.yaml`에 둘 수 있습니다.
|
|
213
|
+
|
|
174
214
|
`project.workspace`, `paths.allowed`, `paths.denied`는 설정 파일이 가리키는 앱 workspace
|
|
175
215
|
기준입니다. 모노레포의 `apps/web`에서 `init`했다면 `src/**`는
|
|
176
|
-
`apps/web/src/**`로 안전하게 정규화되고
|
|
216
|
+
`apps/web/src/**`로 안전하게 정규화되고 에이전트의 기본 cwd도 `apps/web`이 됩니다.
|
|
177
217
|
|
|
178
218
|
Vite 플러그인 또는 Next.js 설정 래퍼가 개발 서버와 함께 내부 Bridge를 시작합니다.
|
|
179
219
|
`visual dev`가 Bridge를 먼저 소유한 경우 자식 Vite 플러그인은 runtime registry의
|
|
@@ -221,6 +261,13 @@ Overlay에서 `작업 보드 ↗`를 다시 눌러 새 세션을 엽니다. 연
|
|
|
221
261
|
|
|
222
262
|
같은 Git 작업 트리에서는 쓰기 작업을 한 번에 하나만 실행합니다. HMR, 브라우저
|
|
223
263
|
오류와 설정된 검증 명령의 결과가 확정된 뒤 큐의 다음 요청을 처리합니다.
|
|
264
|
+
되돌리기 역시 같은 쓰기 잠금을 사용합니다. 되돌리기 중 들어온 새 요청은 큐에서
|
|
265
|
+
대기하고, Bridge 종료도 진행 중인 되돌리기가 끝날 때까지 기다립니다.
|
|
266
|
+
|
|
267
|
+
중단된 작업을 복구할 때 이미 저장된 작업 후 스냅샷은 덮어쓰지 않습니다.
|
|
268
|
+
그 스냅샷 이후 사용자가 수정한 작업 대상 파일은 되돌리기 시 충돌로 처리해 보존합니다.
|
|
269
|
+
저장된 스냅샷 참조가 유효하지 않으면 현재 파일로 대체하지 않고 안전하지 않은 작업으로
|
|
270
|
+
표시해 되돌리기를 차단합니다.
|
|
224
271
|
|
|
225
272
|
## 명령줄 명령
|
|
226
273
|
|
|
@@ -238,7 +285,7 @@ visual doctor
|
|
|
238
285
|
- `attach`: 기본 명령의 명시적 이름이며 기존 사용법과 호환됩니다.
|
|
239
286
|
- `dev`: `init` 설정을 사용해 앱과 브리지를 함께 실행하는 선택 명령입니다.
|
|
240
287
|
- `status`: 현재 Git 작업 트리의 브리지 실행 상태를 확인합니다.
|
|
241
|
-
- `doctor`: Git, 설정 파일, 개발 명령과
|
|
288
|
+
- `doctor`: Git, 설정 파일, 개발 명령과 선택한 에이전트 사용 가능 여부를 점검합니다.
|
|
242
289
|
|
|
243
290
|
## 개발 및 검증
|
|
244
291
|
|
|
@@ -623,6 +623,110 @@ async function executeReadOnlyBatch(request, options) {
|
|
|
623
623
|
return { results, stoppedEarly };
|
|
624
624
|
}
|
|
625
625
|
|
|
626
|
+
// ../../package.json
|
|
627
|
+
var package_default = {
|
|
628
|
+
name: "visual-remote",
|
|
629
|
+
version: "0.3.3",
|
|
630
|
+
description: "Visual bridge from a running web UI to a coding agent in its Git worktree",
|
|
631
|
+
type: "module",
|
|
632
|
+
packageManager: "pnpm@10.34.5",
|
|
633
|
+
repository: {
|
|
634
|
+
type: "git",
|
|
635
|
+
url: "git+https://github.com/elicie/visual-remote.git"
|
|
636
|
+
},
|
|
637
|
+
homepage: "https://github.com/elicie/visual-remote#readme",
|
|
638
|
+
bugs: {
|
|
639
|
+
url: "https://github.com/elicie/visual-remote/issues"
|
|
640
|
+
},
|
|
641
|
+
files: [
|
|
642
|
+
"apps/cli/dist/index.js",
|
|
643
|
+
"apps/cli/dist/direct-exec-mcp.js",
|
|
644
|
+
"apps/cli/dist/vite.js",
|
|
645
|
+
"apps/cli/dist/next.js",
|
|
646
|
+
"apps/cli/dist/next-client.js",
|
|
647
|
+
"apps/cli/vite.d.ts",
|
|
648
|
+
"apps/cli/next.d.ts",
|
|
649
|
+
"apps/cli/next-client.d.ts",
|
|
650
|
+
"packages/overlay/dist/client.js",
|
|
651
|
+
"packages/overlay/dist/viewer.js"
|
|
652
|
+
],
|
|
653
|
+
bin: {
|
|
654
|
+
visual: "./apps/cli/dist/index.js",
|
|
655
|
+
"visual-remote": "./apps/cli/dist/index.js"
|
|
656
|
+
},
|
|
657
|
+
exports: {
|
|
658
|
+
"./vite": {
|
|
659
|
+
types: "./apps/cli/vite.d.ts",
|
|
660
|
+
import: "./apps/cli/dist/vite.js"
|
|
661
|
+
},
|
|
662
|
+
"./next": {
|
|
663
|
+
types: "./apps/cli/next.d.ts",
|
|
664
|
+
import: "./apps/cli/dist/next.js",
|
|
665
|
+
default: "./apps/cli/dist/next.js"
|
|
666
|
+
},
|
|
667
|
+
"./next/client": {
|
|
668
|
+
types: "./apps/cli/next-client.d.ts",
|
|
669
|
+
import: "./apps/cli/dist/next-client.js",
|
|
670
|
+
default: "./apps/cli/dist/next-client.js"
|
|
671
|
+
}
|
|
672
|
+
},
|
|
673
|
+
publishConfig: {
|
|
674
|
+
access: "public",
|
|
675
|
+
registry: "https://registry.npmjs.org"
|
|
676
|
+
},
|
|
677
|
+
engines: {
|
|
678
|
+
node: ">=24"
|
|
679
|
+
},
|
|
680
|
+
scripts: {
|
|
681
|
+
build: "corepack pnpm run build:overlay && corepack pnpm run build:server",
|
|
682
|
+
"build:overlay": "corepack pnpm --filter @visual-remote/overlay build",
|
|
683
|
+
"build:server": "corepack pnpm --filter @visual-remote/cli build",
|
|
684
|
+
dev: "corepack pnpm run build:overlay && tsx apps/cli/src/index.ts",
|
|
685
|
+
test: "vitest run",
|
|
686
|
+
"test:e2e": "corepack pnpm build && corepack pnpm exec playwright test --config tests/e2e/playwright.config.ts",
|
|
687
|
+
"test:watch": "vitest",
|
|
688
|
+
typecheck: "corepack pnpm -r --if-present typecheck && tsc --noEmit -p tsconfig.tests.json",
|
|
689
|
+
prepack: "corepack pnpm build"
|
|
690
|
+
},
|
|
691
|
+
dependencies: {
|
|
692
|
+
commander: "^15.0.0",
|
|
693
|
+
"http-proxy": "^1.18.1",
|
|
694
|
+
ws: "^8.21.1",
|
|
695
|
+
yaml: "^2.9.0",
|
|
696
|
+
zod: "^4.4.3"
|
|
697
|
+
},
|
|
698
|
+
peerDependencies: {
|
|
699
|
+
vite: ">=5"
|
|
700
|
+
},
|
|
701
|
+
peerDependenciesMeta: {
|
|
702
|
+
vite: {
|
|
703
|
+
optional: true
|
|
704
|
+
}
|
|
705
|
+
},
|
|
706
|
+
devDependencies: {
|
|
707
|
+
"@playwright/test": "^1.62.1",
|
|
708
|
+
"@types/http-proxy": "^1.17.17",
|
|
709
|
+
"@types/node": "^26.1.2",
|
|
710
|
+
"@types/ws": "^8.18.1",
|
|
711
|
+
"@visual-remote/bridge-core": "workspace:*",
|
|
712
|
+
"@visual-remote/cli": "workspace:*",
|
|
713
|
+
"@visual-remote/gateway": "workspace:*",
|
|
714
|
+
"@visual-remote/overlay": "workspace:*",
|
|
715
|
+
"@visual-remote/protocol": "workspace:*",
|
|
716
|
+
esbuild: "^0.28.1",
|
|
717
|
+
next: "15.5.16",
|
|
718
|
+
react: "19.1.0",
|
|
719
|
+
"react-dom": "19.1.0",
|
|
720
|
+
tsx: "^4.23.1",
|
|
721
|
+
typescript: "^7.0.2",
|
|
722
|
+
vite: "^8.1.5",
|
|
723
|
+
vitest: "^4.1.10"
|
|
724
|
+
}
|
|
725
|
+
};
|
|
726
|
+
|
|
727
|
+
// src/version.ts
|
|
728
|
+
var VISUAL_REMOTE_VERSION = package_default.version;
|
|
729
|
+
|
|
626
730
|
// src/direct-exec-mcp.ts
|
|
627
731
|
var TOOL_NAME = "run_readonly";
|
|
628
732
|
function recordOf(value) {
|
|
@@ -739,7 +843,10 @@ async function handleRequest(request, options) {
|
|
|
739
843
|
result(request.id, {
|
|
740
844
|
protocolVersion: typeof params?.protocolVersion === "string" ? params.protocolVersion : "2024-11-05",
|
|
741
845
|
capabilities: { tools: { listChanged: false } },
|
|
742
|
-
serverInfo: {
|
|
846
|
+
serverInfo: {
|
|
847
|
+
name: "visual-remote-direct-exec",
|
|
848
|
+
version: VISUAL_REMOTE_VERSION
|
|
849
|
+
}
|
|
743
850
|
});
|
|
744
851
|
return;
|
|
745
852
|
}
|