An open API service indexing awesome lists of open source software.

https://github.com/pyanchor/pyanchor

Agent-agnostic AI live-edit sidecar for Next.js. Anchor edits straight into your running app.
https://github.com/pyanchor/pyanchor

agent ai claude-code developer-tools express live-edit nextjs openclaw overlay self-hosted shadow-dom sidecar typescript

Last synced: about 2 months ago
JSON representation

Agent-agnostic AI live-edit sidecar for Next.js. Anchor edits straight into your running app.

Awesome Lists containing this project

README

          

# Pyanchor 🦞

**μ›Ή μ•±μš© agent-agnostic AI 라이브 νŽΈμ§‘ μ‚¬μ΄λ“œμΉ΄.**
*μ‹€ν–‰ 쀑인 앱에 직접 νŽΈμ§‘μ„ anchor β€” Next.js, Vite, λ˜λŠ” 직접 λ§Œλ“  μŠ€νƒ.*

[![npm version](https://img.shields.io/npm/v/pyanchor.svg?style=flat-square&color=cb3837)](https://www.npmjs.com/package/pyanchor)
[![npm downloads](https://img.shields.io/npm/dm/pyanchor.svg?style=flat-square)](https://www.npmjs.com/package/pyanchor)
[![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg?style=flat-square)](./LICENSE)

[**English**](./README.md) Β· [**λ¬Έμ„œ**](#-λ¬Έμ„œ) Β· [**λΉ λ₯Έ μ‹œμž‘**](#-λΉ λ₯Έ-μ‹œμž‘) Β· [**지원 agent**](#지원-agent) Β· [**λ³΄μ•ˆ**](#-λ³΄μ•ˆ)

---

> PyanchorλŠ” μ‹€ν–‰ 쀑인 μ›Ή μ•±(Next.js / Vite / Astro / λ˜λŠ” install + build
> λͺ…령이 μžˆλŠ” μ–΄λ–€ μŠ€νƒ)에 λΆ™μ΄λŠ” μž‘μ€ Express μ‚¬μ΄λ“œμΉ΄μž…λ‹ˆλ‹€.
> ν•œ μ€„μ§œλ¦¬ `` νƒœκ·Έκ°€ νŽ˜μ΄μ§€ μ•ˆμ— overlayλ₯Ό μ£Όμž…(Shadow DOM, μŠ€νƒ€μΌ
> 좩돌 μ—†μŒ)ν•˜κ³ , μ‚¬μš©μžλŠ” UI elementλ₯Ό 가리킨 λ’€ μžμ—°μ–΄λ‘œ 변경을 μ„€λͺ…ν•˜λ©΄,
> AI μ½”λ”© agentκ°€ νŽΈμ§‘ β†’ build β†’ ν”„λ‘ νŠΈμ—”λ“œ μž¬μ‹œμž‘ λ˜λŠ” PR μƒμ„±κΉŒμ§€ β€” λˆ„κ΅¬λ„
> λΈŒλΌμš°μ €λ₯Ό λ– λ‚˜μ§€ μ•Šκ³  λλ‚©λ‹ˆλ‹€.

**self-host + prod-attached** μ›Œν¬ν”Œλ‘œμš°μš©. SaaS도, IDE ν”ŒλŸ¬κ·ΈμΈλ„ μ•„λ‹˜.

## λˆ„κ΅¬λ₯Ό μœ„ν•œκ°€?

μ„Έ κ°€μ§€ κ²ΉμΉ˜λŠ” use case. pyanchorκ°€ μ…‹ λ‹€ λ‹€λ£¨λŠ” μ΄μœ λŠ” **νŽ˜μ΄μ§€ μžμ²΄κ°€
에디터가 λœλ‹€**λŠ” wedge λ•Œλ¬Έ β€” IDE ν•„μš” μ—†μŒ.

- **자기 deployλ₯Ό 직접 dogfoodν•˜λŠ” μ†”λ‘œ dev.** "보고 β†’ 클릭 β†’
ship" κ°€μž₯ λΉ λ₯Έ 루프. `apply` λͺ¨λ“œλŠ” 라이브 앱에 직접 rsync.
- **"이거 μ’€ λ°”κΏ”μ£Όμ„Έμš”" μ½œμ„Όν„°μ— μ§€μΉœ ν”„λ‘ νŠΈμ—”λ“œ dev.** μš”μ²­μžμ—κ²Œ
token ν•˜λ‚˜ μ₯μ–΄μ£Όκ³ , νŽ˜μ΄μ§€ κ°€λ¦¬ν‚€κ²Œ ν•˜κ³ , μ…€ν”„ μ„œλΉ„μŠ€μ‹œν‚€μ„Έμš”.
`PYANCHOR_OUTPUT_MODE=pr` μ„€μ •ν•˜λ©΄ λͺ¨λ“  νŽΈμ§‘μ΄ PR둜 β†’ ν‰μ†Œ cadence둜
review만 β†’ 깜짝 prod μ“°κΈ° μ—†μŒ.
- **λ””μžμ΄λ„ˆ, PM, λ°±μ—”λ“œ dev** β€” ν”„λ‘ νŠΈμ—”λ“œ νŒ€ μ•ˆ κ±΄λ“œλ¦¬κ³  μž‘μ€ UI
λ³€κ²½λ§Œ 직접 ν•˜κ³  싢은 μ‚¬λžŒλ“€. νŽ˜μ΄μ§€ μ—΄κ³ , floating λ²„νŠΌ 클릭,
"이 λ²„νŠΌ λ³΄λΌμƒ‰μœΌλ‘œ + λ‘œλ”© μŠ€ν”Όλ„ˆ μΆ”κ°€" μž…λ ₯ β†’ 1λΆ„ μ•ˆμ— PR.

λ§ˆμ§€λ§‰μ΄ μ§„μ§œ pyanchorλ₯Ό λ§Œλ“  이유. *"about νŽ˜μ΄μ§€ μΉ΄ν”Ό μ’€ λ°”κΏ”μ€˜"*
Slack ping에 μ§€μΉœ authorκ°€ λ§Œλ“€μ—ˆμŒ. 이제 μš”μ²­μžκ°€ 직접 ν•˜κ³ , ν”„λ‘ νŠΈμ—”λ“œλŠ”
PR review만.

## Cursor / v0 / Lovable λŒ€μ‹  μ™œ 이걸?

| | μ–΄λ””μ„œ λ™μž‘ | 무엇을 νŽΈμ§‘ | λˆ„κ°€ νŽΈμ§‘ν•  수 μžˆλ‚˜ |
| ------------ | --------------------- | --------------------- | -------------------------------------------- |
| Cursor | 에디터 | μ›Œν¬μŠ€νŽ˜μ΄μŠ€μ˜ 파일 | IDEλ₯Ό μΌ  dev |
| v0 / Lovable | 벀더 ν΄λΌμš°λ“œ | μƒˆλ‘œ λ§Œλ“œλŠ” μ•± | 벀더 계정 μ†Œμœ μž |
| **Pyanchor** | μ§€κΈˆ 보고 μžˆλŠ” νŽ˜μ΄μ§€ | 이미 shipν•œ μ•± | **token + (선택) PR reviewλ₯Ό κ°€μ§„ λˆ„κ΅¬λ‚˜** |

μŠ€ν…Œμ΄μ§•μ˜ 라이브 둜그인 νŽ˜μ΄μ§€λ₯Ό 가리킀며 *"닀크 λͺ¨λ“œλ‘œ λ°”κΏ”"*라고
ν•˜κ³  싢은데, μ½”λ“œλŠ” μ ˆλŒ€ 인프라 λ°–μœΌλ‘œ λ‚˜κ°€λ©΄ μ•ˆ 되고, Cursor seat κ°€μ§„
μ‚¬λžŒλ§Œ μ“Έ 수 μžˆλŠ” 게 μ•„λ‹ˆμ–΄μ•Ό ν•œλ‹€λ©΄ β€” 이게 λ§žμŠ΅λ‹ˆλ‹€.

## λ™μž‘ 원리

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ λ‹Ήμ‹ μ˜ μ›Ή μ•± β”‚ β”‚ Pyanchor μ‚¬μ΄λ“œμΉ΄ β”‚
β”‚ (Next.js / Vite / β”‚ β”‚ (port 3010, localhost) β”‚
β”‚ Astro / 직접 μŠ€νƒ) β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ Express μ„œλ²„ β”‚
β”‚ layout/index μ£Όμž…: β”‚ β”‚ /_pyanchor/bootstrap.jsβ”‚
β”‚ <script β”‚ ──> β”‚ /_pyanchor/overlay.js β”‚
β”‚ src="/_pyanchor/ β”‚ β”‚ /_pyanchor/api/edit β”‚
β”‚ bootstrap.js" β”‚ β”‚ /api/admin/* β”‚
β”‚ defer /> β”‚ β”‚ /healthz + /readyz β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ Shadow DOM overlay β”‚ β”‚ Workspace + Worker β”‚
β”‚ β†’ 클릭 β†’ ν”„λ‘¬ν”„νŠΈ β”‚ <── β”‚ AgentRunner adapter β”‚
β”‚ β”‚ β”‚ (codex/claude/...) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ build + apply / PR β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

## πŸš€ λΉ λ₯Έ μ‹œμž‘

```bash
# 1. μ„€μΉ˜ (dev dep β€” pyanchorλŠ” dev-time μ‚¬μ΄λ“œμΉ΄, prod λ²ˆλ“€ 미포함)
npm install --save-dev pyanchor

# 2. μΈν„°λž™ν‹°λΈŒ init β€” 7개 promptλ₯Ό enter둜 λ‹€λ‹₯
npx pyanchor init

# 3. 진단 β€” μžλ™μœΌλ‘œ cwd .env λ‘œλ“œ
npx pyanchor doctor

# 4. μ‚¬μ΄λ“œμΉ΄ μ‹œμž‘
npx pyanchor

# 5. init이 μ•Œλ €μ€€ bootstrap script νƒœκ·Έ + dev proxy 1쀄씩
# layout.tsx (Next.js) / index.html (Vite) / Base.astro (Astro) 등에 paste

# 6. 일반 dev λͺ…λ ΉμœΌλ‘œ μ•± λ„μš°κΈ° (npm run dev / pnpm dev)
# λΈŒλΌμš°μ €: μš°ν•˜λ‹¨ anchor μ•„μ΄μ½˜ β†’ 클릭 β†’ ν”„λ‘¬ν”„νŠΈ μž…λ ₯ β†’ 30초 μ•ˆμ— νŽΈμ§‘ 적용
```

5개 ν•„μˆ˜ env (`pyanchor init`이 μžλ™ μž‘μ„±):
- `PYANCHOR_TOKEN` β€” bearer auth secret
- `PYANCHOR_AGENT` β€” `codex` / `claude-code` / `openclaw` / `aider` / `gemini`
- `PYANCHOR_APP_DIR` β€” λ‹Ήμ‹  μ•±μ˜ root
- `PYANCHOR_WORKSPACE_DIR` β€” agentκ°€ νŽΈμ§‘ν•˜λŠ” scratch 디렉토리
- `PYANCHOR_RESTART_SCRIPT` β€” νŽΈμ§‘ ν›„ ν”„λ‘ νŠΈμ—”λ“œ reload 방법

λ‚˜λ¨Έμ§€ ~60개 envλŠ” λͺ¨λ‘ sensible default 있음. `.env.example` μ°Έκ³ .

## 지원 agent

5개 λ°±μ—”λ“œ. `PYANCHOR_AGENT=<name>` ν•œ μ€„λ‘œ swap.

| Agent | μ„€μΉ˜ | 인증 |
| ------------- | ---------------------------------------------------- | ----------------------------------- |
| `codex` | `npm i -g @openai/codex` | `codex login` (ChatGPT account λ˜λŠ” OpenAI API key) |
| `claude-code` | `npm i @anthropic-ai/claude-agent-sdk` | `ANTHROPIC_API_KEY` λ˜λŠ” Claude OAuth |
| `openclaw` | OpenClaw 자체 μ„€μΉ˜ (per-agent profiles) | OpenClaw OAuth |
| `aider` | `pip install aider-chat` | `OPENAI_API_KEY` λ“± |
| `gemini` | `npm i -g @google/gemini-cli` | `GEMINI_API_KEY` λ˜λŠ” `gemini auth login` |

## 지원 framework

5개 first-class profile + override path. `PYANCHOR_FRAMEWORK=<name>`.

| Framework | install | build | μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ œμ™Έ |
| ----------- | ---------------------------------- | ------------------ | ----------------- |
| `nextjs` | `corepack yarn install --frozen…` | `next build` | `.next` |
| `vite` | `npm install` | `npm run build` | `dist`, `.vite` |
| `astro` | `npm install` | `npx astro build` | `dist`, `.astro` |
| `sveltekit` | `npm install` | `npm run build` | `.svelte-kit`, `build`, `dist`, `.vite` |
| `remix` | `npm install` | `npm run build` | `build`, `.cache` |
| `nuxt` | `npm install` | `npx nuxt build` | `.nuxt`, `.output`, `dist` |

λ‹€λ₯Έ μŠ€νƒμ€ `PYANCHOR_INSTALL_COMMAND` + `PYANCHOR_BUILD_COMMAND` env둜
override.

## 좜λ ₯ λͺ¨λ“œ

| λͺ¨λ“œ | λ™μž‘ |
| -------- | ----------------------------------------------------------------- |
| `apply` | workspace β†’ app dir rsync + restart 슀크립트 μ‹€ν–‰ (κΈ°λ³Έ) |
| `pr` | git push + `gh pr create` (μžλ™ merge μ•ˆ 함; μ‚¬λžŒμ΄ review) |
| `dryrun` | build만; rsync도 PR도 μ•ˆ 함 (agent 흐름 κ²€μ¦μš©) |

`PYANCHOR_OUTPUT_MODE=<mode>` λ˜λŠ” init promptμ—μ„œ 선택.

## λ³΄μ•ˆ

- **token = privilege**: `PYANCHOR_TOKEN`이 μœ μΌν•œ 인증
- **9-layer μ ‘κ·Ό μ œμ–΄** (`docs/ACCESS-CONTROL.md`): token β†’ bind β†’
origin β†’ trusted hosts β†’ gate cookie β†’ bootstrap fail-safe β†’
reverse proxy β†’ systemd IPAddress β†’ HMAC actor signing
- **non-loopback bindλŠ” origin ν—ˆμš©λͺ©λ‘ ν•„μˆ˜** (v0.18.0+, fail-closed)
- **destructive path guard** (v0.33.0+): system dir (`/`, `/home`,
`/var`, ...) κ±°λΆ€ β†’ typo둜 `rm -rf`λ˜λŠ” 사고 λ°©μ§€
- **provenance attested**: λͺ¨λ“  npm tarball은 Sigstore + GitHub
Actions둜 signed (`npm view pyanchor@latest --json | jq
'.dist.attestations'`)

μžμ„Έν•œ μœ„ν˜‘ λͺ¨λΈ + μ±…μž„ μžˆλŠ” 곡개 β†’ [`.github/SECURITY.md`](./.github/SECURITY.md).

## πŸ“š λ¬Έμ„œ

- [`docs/TROUBLESHOOTING.md`](./docs/TROUBLESHOOTING.md) β€” 증상 β†’
진단 λΉ λ₯Έ λ§€ν•‘
- [`docs/PRODUCTION-DEPLOYMENT.md`](./docs/PRODUCTION-DEPLOYMENT.md)
β€” systemd / Docker / Coolify 배포 λ ˆμ‹œν”Ό
- [`docs/ACCESS-CONTROL.md`](./docs/ACCESS-CONTROL.md) β€” 9-layer
μ ‘κ·Ό μ œμ–΄ μžμ„Ένžˆ
- [`docs/codex-setup.md`](./docs/codex-setup.md) β€” codex λ°±μ—”λ“œ
- [`docs/claude-code-setup.md`](./docs/claude-code-setup.md) β€”
claude-code λ°±μ—”λ“œ
- [`docs/openclaw-setup.md`](./docs/openclaw-setup.md) β€” openclaw
- [`docs/aider-setup.md`](./docs/aider-setup.md) β€” aider
- [`docs/gemini-setup.md`](./docs/gemini-setup.md) β€” gemini
- [`docs/integrate-with-vite.md`](./docs/integrate-with-vite.md) β€”
Vite 톡합 μžμ„Ένžˆ

## 라이브 데λͺ¨

[`https://pyanchor.pyan.kr`](https://pyanchor.pyan.kr) β€” recipe 1
(systemd + nginx + magic-word gate cookie + 정적 React)둜 운영 쀑.
gate μΏ ν‚€ λ°œκΈ‰ ν›„ νŽ˜μ΄μ§€ element ν΄λ¦­ν•˜λ©΄ codex λ°±μ—”λ“œλ‘œ 라이브 νŽΈμ§‘
사이클 λ™μž‘.

## λΌμ΄μ„ μŠ€

MIT. Β© PYAN.

## 영문 λ¬Έμ„œ

전체 영문 READMEλŠ” [`README.md`](./README.md) β€” 이 ν•œκ΅­μ–΄ READMEλŠ”
핡심 μ„Ήμ…˜λ§Œ λ²ˆμ—­.