visual-remote 0.3.1 → 0.3.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.md +43 -8
- package/apps/cli/dist/direct-exec-mcp.js +108 -1
- package/apps/cli/dist/index.js +930 -352
- package/apps/cli/dist/next.js +661 -207
- package/apps/cli/dist/vite.js +651 -206
- package/package.json +9 -6
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
|
|
|
@@ -83,15 +84,15 @@ corepack pnpm build
|
|
|
83
84
|
node apps/cli/dist/index.js doctor
|
|
84
85
|
```
|
|
85
86
|
|
|
86
|
-
`doctor`에서 Git 작업 트리, 현재 프로젝트 설정과
|
|
87
|
+
`doctor`에서 Git 작업 트리, 현재 프로젝트 설정과 선택한 에이전트 실행 환경을 확인합니다.
|
|
87
88
|
|
|
88
|
-
|
|
89
|
+
에이전트 작업 중 `pwd`, 버전 확인, 파일 읽기·검색과 read-only Git 명령은 Bridge가
|
|
89
90
|
등록한 구조화 도구로 실행합니다. 이 경로는 명령을 `argv` 배열과 등록된 workspace
|
|
90
91
|
`cwd`로 전달하고 `shell: false`로 실행하며, 지원되는 명령은 RTK로 자동 압축합니다.
|
|
91
92
|
직접 실행기는 명령별 읽기 전용 문법만 허용하고 경로·symlink를 Git worktree 안으로
|
|
92
93
|
제한하며, 타임아웃 시 하위 프로세스까지 종료합니다. 명령 소요 시간, RTK 사용,
|
|
93
|
-
출력 축약 여부와
|
|
94
|
-
파일 수정, 테스트·빌드 또는 파이프처럼 셸 문법이 필요한 작업만
|
|
94
|
+
출력 축약 여부와 에이전트가 제공하는 토큰 사용량은 작업 로그에 함께 기록됩니다.
|
|
95
|
+
파일 수정, 테스트·빌드 또는 파이프처럼 셸 문법이 필요한 작업만 에이전트의 sandbox
|
|
95
96
|
명령 실행기로 보냅니다.
|
|
96
97
|
|
|
97
98
|
## 자동화 셸에서 Node.js 24 사용
|
|
@@ -142,7 +143,12 @@ upstream:
|
|
|
142
143
|
|
|
143
144
|
agent:
|
|
144
145
|
adapter: codex
|
|
146
|
+
# profile: proxy
|
|
147
|
+
# model: gpt-5.6-sol
|
|
148
|
+
# reasoningEffort: medium
|
|
149
|
+
# inheritEnv: [CUSTOM_PROVIDER_KEY]
|
|
145
150
|
maxRunMs: 900000
|
|
151
|
+
resumeMode: auto
|
|
146
152
|
|
|
147
153
|
verification:
|
|
148
154
|
hmrWaitMs: 12000
|
|
@@ -171,9 +177,38 @@ paths:
|
|
|
171
177
|
- dist/**
|
|
172
178
|
```
|
|
173
179
|
|
|
180
|
+
`agent.model`과 `agent.reasoningEffort`를 지정하면 새 작업과 재개 작업에 동일하게
|
|
181
|
+
적용됩니다. Codex effort는 `minimal`, `low`, `medium`, `high`, `xhigh`를, Claude
|
|
182
|
+
effort는 `low`, `medium`, `high`, `xhigh`, `max`를 지원합니다. 값을 생략하면 선택한
|
|
183
|
+
CLI의 현재 기본 설정을 사용합니다.
|
|
184
|
+
|
|
185
|
+
Claude를 사용하려면 `adapter: claude`로 변경합니다. Visual Remote는 Claude를
|
|
186
|
+
`acceptEdits` 권한으로 실행하고 사용자 MCP를 로드하지 않습니다. Linux에서 Bash
|
|
187
|
+
sandbox까지 사용하려면 `bwrap`과 `socat`이 모두 필요하며 `visual doctor`가 설치
|
|
188
|
+
상태를 표시합니다.
|
|
189
|
+
|
|
190
|
+
Codex의 OpenAI-compatible provider는 사용자 Codex profile에 정의하고
|
|
191
|
+
`agent.profile`로 선택합니다. provider는 Responses API streaming을 지원해야 합니다.
|
|
192
|
+
예를 들어 `$CODEX_HOME/proxy.config.toml`은 다음처럼 작성합니다.
|
|
193
|
+
|
|
194
|
+
```toml
|
|
195
|
+
model_provider = "proxy"
|
|
196
|
+
|
|
197
|
+
[model_providers.proxy]
|
|
198
|
+
name = "OpenAI-compatible proxy"
|
|
199
|
+
base_url = "https://proxy.example.com/v1"
|
|
200
|
+
wire_api = "responses"
|
|
201
|
+
env_key = "CUSTOM_PROVIDER_KEY"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
API key 값은 YAML에 기록하지 않습니다. `agent.inheritEnv`에는 부모 프로세스에서
|
|
205
|
+
Codex 또는 Claude로 전달할 환경변수 이름만 작성하며, 누락된 변수는 `visual doctor`가
|
|
206
|
+
실패로 보고합니다. 개인별 선택은 Git에서 제외되는
|
|
207
|
+
`.visualdev/config.local.yaml`에 둘 수 있습니다.
|
|
208
|
+
|
|
174
209
|
`project.workspace`, `paths.allowed`, `paths.denied`는 설정 파일이 가리키는 앱 workspace
|
|
175
210
|
기준입니다. 모노레포의 `apps/web`에서 `init`했다면 `src/**`는
|
|
176
|
-
`apps/web/src/**`로 안전하게 정규화되고
|
|
211
|
+
`apps/web/src/**`로 안전하게 정규화되고 에이전트의 기본 cwd도 `apps/web`이 됩니다.
|
|
177
212
|
|
|
178
213
|
Vite 플러그인 또는 Next.js 설정 래퍼가 개발 서버와 함께 내부 Bridge를 시작합니다.
|
|
179
214
|
`visual dev`가 Bridge를 먼저 소유한 경우 자식 Vite 플러그인은 runtime registry의
|
|
@@ -238,7 +273,7 @@ visual doctor
|
|
|
238
273
|
- `attach`: 기본 명령의 명시적 이름이며 기존 사용법과 호환됩니다.
|
|
239
274
|
- `dev`: `init` 설정을 사용해 앱과 브리지를 함께 실행하는 선택 명령입니다.
|
|
240
275
|
- `status`: 현재 Git 작업 트리의 브리지 실행 상태를 확인합니다.
|
|
241
|
-
- `doctor`: Git, 설정 파일, 개발 명령과
|
|
276
|
+
- `doctor`: Git, 설정 파일, 개발 명령과 선택한 에이전트 사용 가능 여부를 점검합니다.
|
|
242
277
|
|
|
243
278
|
## 개발 및 검증
|
|
244
279
|
|
|
@@ -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.2",
|
|
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
|
}
|