# ์„ค์น˜ / ํ†ตํ•ฉ > ๐Ÿ“ SSOT: ์„ค๊ณ„ [ARCHITECTURE.json](../ARCHITECTURE.json) ยท ์ด๋ ฅ [CHANGELOG.md](../CHANGELOG.md). ๋ณธ ๋ฌธ์„œ๋Š” ๋ณด์กฐ ์„ค์น˜ ๊ฐ€์ด๋“œ. ## ๊ณต์šฉ(์ „์—ญ) ์„ค์น˜ โ€” `sidecar install` ๋จธ์‹  ์ „์—ญ์— ์‚ฌ์ด๋“œ์นด๋ฅผ ๊น”์•„ **์–ด๋А repo ์—์„œ๋“ ** `sidecar` ๋ช…๋ น์„ ์“ฐ๊ณ , ๋ชจ๋“  Claude Code ์„ธ์…˜์— ๊ฐ€๋“œ/์ฃผ์ž… ํ›…์„ ๋ฐฐ์„ ํ•œ๋‹ค (per-repo ์Šค์บํด๋“œ์ธ `init` ๊ณผ ๋ณ„๊ฐœ โ€” ์ด์ชฝ์€ ๋จธ์‹  1๋ฒŒ ๊ณต์šฉ ์„ธํŒ…). ```bash # ์‚ฌ์ด๋“œ์นด๊ฐ€ ์•„์ง ์—†์„ ๋•Œ (curl ๋ถ€ํŠธ์ŠคํŠธ๋žฉ) curl -fsSL https://raw.githubusercontent.com/dancinlab/sidecar/main/scripts/install.sh | bash # ์ด๋ฏธ ์‚ฌ์ด๋“œ์นด๊ฐ€ ๊น”๋ ค ์žˆ์œผ๋ฉด ๋™์ผ ๋™์ž‘ sidecar install ``` | ๋‹จ๊ณ„ | ํ•œ ์ผ | ๊ธฐ๋ณธ ๊ฒฝ๋กœ | |------|-------|-----------| | clone | `dancinlab/sidecar` ํด๋ก (์žˆ์œผ๋ฉด ff ๊ฐฑ์‹ ) | `~/.sidecar/cli` (`--dir`/`SIDECAR_DIR`) | | link | `sidecar` ์‹คํ–‰ ๋ž˜ํผ ์ž‘์„ฑ (์‹ฌ๋ณผ๋ฆญ ์•„๋‹˜ โ€” ๋Ÿฐ์ฒ˜ dir ์˜ค์ธ ๋ฐฉ์ง€) | `~/.local/bin/sidecar` (`--bin`/`SIDECAR_BIN`) | | hooks | `sidecar install-hooks --global` (๋ชจ๋“  ์„ธ์…˜ ๊ฐ€๋“œ/์ฃผ์ž…) | `~/.claude/settings.json` | - ๋ฉฑ๋“ฑ โ€” ์žฌ์‹คํ–‰ํ•˜๋ฉด ํด๋ก ์„ ์ตœ์‹ ์œผ๋กœ fast-forward + ๋ž˜ํผ/ํ›… ์žฌํ™•์ธ. - ํ”Œ๋ž˜๊ทธ: `--no-hooks`(ํด๋ก ยท๋ž˜ํผ๋งŒ) ยท `--ref=`(๊ธฐ๋ณธ main) ยท `--dir=`/`--bin=` ยท `--dry-run`. - `~/.local/bin` ์ด PATH ์— ์—†์œผ๋ฉด ์•ˆ๋‚ด ์ค„์„ ์ถœ๋ ฅํ•œ๋‹ค (`export PATH="$HOME/.local/bin:$PATH"`). - ๊ฐฑ์‹ : `sidecar self-update` (๋˜๋Š” `sidecar install` ์žฌ์‹คํ–‰). SSOT ๋ถ€ํŠธ์ŠคํŠธ๋žฉ: [`scripts/install.sh`](../scripts/install.sh) โ€” `sidecar install` ์ด ์ด๋ฅผ ์œ„์ž„ ์‹คํ–‰. ## ๋ฐฐ์น˜ ์˜ต์…˜ (per-repo โ€” ์—”์ง„ ๋ฒค๋”๋ง) ์‚ฌ์ด๋“œ์นด ์—”์ง„์€ repo ์•ˆ ์–ด๋””์— ๋‘๋“  ๋™์ž‘ํ•œ๋‹ค(`lib/paths.ts` ๊ฐ€ repo ๋ฃจํŠธ๋ฅผ ์ƒํ–ฅ ํƒ์ƒ‰). ์„ธ ๊ฐ€์ง€ ๊ถŒ์žฅ ๋ฐฐ์น˜: ### A. git submodule (๊ถŒ์žฅ โ€” ๋ฒ„์ „ ๊ณ ์ • + ์—…๋ฐ์ดํŠธ ์ถ”์ ) ```bash cd your-repo git submodule add https://github.com/dancinlab/sidecar .harness-engine git commit -m "chore: add sidecar engine" # ์—…๋ฐ์ดํŠธ: cd .harness-engine && git pull && cd .. && git add .harness-engine ``` ### B. vendor (๋ณต์‚ฌ โ€” ์˜คํ”„๋ผ์ธ/๋‹จ์ˆœ) ```bash cd your-repo git clone --depth 1 https://github.com/dancinlab/sidecar .harness-engine rm -rf .harness-engine/.git ``` ### C. ์ค‘์•™ 1๋ฒŒ + ์‹ฌ๋ณผ๋ฆญ๋งํฌ (๋ฉ€ํ‹ฐ repo, ๋กœ์ปฌ) ```bash git clone https://github.com/dancinlab/sidecar ~/tools/sidecar ln -s ~/tools/sidecar your-repo/.harness-engine ``` ## ๋Ÿฐํƒ€์ž„ (tsx) `bin/sidecar` ๊ฐ€ `tsx` ๋ฅผ ์ž๋™ ํƒ์ƒ‰ํ•œ๋‹ค: ``` 1. $PWD ์—์„œ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉฐ node_modules/.bin/tsx 2. ์—”์ง„ ์ž์ฒด node_modules/.bin/tsx 3. npx tsx (์ž๋™ ๋‹ค์šด๋กœ๋“œ) ``` repo ์— ์ด๋ฏธ `tsx`(๋˜๋Š” Next/Vite ๋“ฑ tsx ์˜์กด)๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฑธ ์“ฐ๊ณ , ์—†์œผ๋ฉด ์—”์ง„์—์„œ `pnpm i` ํ•œ ๋ฒˆ ํ•ด๋‘๊ฑฐ๋‚˜ npx ์— ๋งก๊ธด๋‹ค. ```bash # ์—”์ง„ ์ž์ฒด์— ๋Ÿฐํƒ€์ž„ ์„ค์น˜ (์„ ํƒ) cd .harness-engine && pnpm install ``` ## ํŽธ์˜ ๋ž˜ํผ (์„ ํƒ) ๋งค๋ฒˆ `bash .harness-engine/bin/sidecar` ์น˜๊ธฐ ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฉด repo ์— ์–‡์€ ๋ž˜ํผ๋ฅผ ๋‘”๋‹ค: ```bash # scripts/sidecar #!/usr/bin/env bash exec bash "$(dirname "$0")/../.harness-engine/bin/sidecar" "$@" ``` ```bash chmod +x scripts/sidecar bash scripts/sidecar audit ``` ## ๋ฉ€ํ‹ฐ repo ์šด์˜ ๊ฐ repo ๋Š” **์ž๊ธฐ `harness.config.json` + ์ž๊ธฐ `.harness/logs/`** ๋ฅผ ๊ฐ–๋Š”๋‹ค(per-repo ๊ฒฉ๋ฆฌ, H5). ์—”์ง„๋งŒ ๊ณต์œ ํ•œ๋‹ค. ``` ~/work/edge/ harness.config.json ยท .harness/logs/ โ” ~/work/anima/ harness.config.json ยท .harness/logs/ โ”ผโ”€โ–ถ ๊ฐ™์€ ์—”์ง„(submodule/symlink) ~/work/foo/ harness.config.json ยท .harness/logs/ โ”˜ ``` repo ๊ฐ„ ๊ณต์œ  ํŒŒ์ผ(์˜ˆ: ๊ณตํ†ต ๊ทœ์น™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์„ ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด ๊ฐ repo ์˜ `sync.script` ์— ๊ทธ ์ ˆ์ฐจ๋ฅผ ์ ๊ณ  `sidecar sync run` ์œผ๋กœ ๋Œ๋ฆฐ๋‹ค โ€” ์—”์ง„์€ ๋™๊ธฐํ™” "๋ฐฉ๋ฒ•"์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ณ  ์‹คํ–‰๋งŒ ํ•œ๋‹ค. ## .gitignore repo ์˜ `.gitignore` ์— ๋กœ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค: ``` .harness/logs/ ``` ๊ทœ์น™ ํŒŒ์ผ(`.harness/enforcement.json` ๋“ฑ)๊ณผ `harness.config.json` ์€ **์ปค๋ฐ‹ํ•œ๋‹ค**(ํŒ€ ๊ณต์œ  SSOT). ## ์ œ๊ฑฐ (uninstall) ์‚ฌ์ด๋“œ์นด๊ฐ€ repo ์— **์ฃผ์ž…ํ•œ ๊ฒƒ๋งŒ** ๋˜๋Œ๋ฆฐ๋‹ค โ€” ์‚ฌ์šฉ์ž ์ฝ˜ํ…์ธ ๋Š” ๋ณด์กด. ```bash bash .harness-engine/bin/sidecar uninstall --dry-run # ๋ฌด์—‡์„ ์ง€์šธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ bash .harness-engine/bin/sidecar uninstall # ์‹ค์ œ ์ œ๊ฑฐ bash .harness-engine/bin/sidecar uninstall --keep-logs # ๋กœ๊ทธ๋งŒ ๋‚จ๊น€ ``` | ์ œ๊ฑฐ | ๋ณด์กด (์ ˆ๋Œ€ ์•ˆ ๊ฑด๋“œ๋ฆผ) | |------|----------------------| | `harness.config.json` ยท `.harness/`(๊ทœ์น™ยทprefsยทlogs) | `ARCHITECTURE.md` ยท `CHANGELOG.md` ยท `CLAUDE.md` | | `scripts/sidecar` ๋ž˜ํผ (์‹œ๊ทธ๋‹ˆ์ฒ˜ ํ™•์ธ๋œ ๊ฒƒ๋งŒ) | `scripts/scratch/` ยท ์†Œ์Šค ์ฝ”๋“œ | | `.git/hooks/pre-commit`ยท`pre-push` (sidecar ์„ค์น˜๋ถ„๋งŒ) | ์‚ฌ์šฉ์ž ์ปค์Šคํ…€ git hook | | `.gitignore` ์˜ sidecar ์ถ”๊ฐ€ 2์ค„ | | | `.claude/settings.json` (์ „๋ถ€ sidecar hook ์ผ ๋•Œ๋งŒ ์‚ญ์ œ, ์„ž์ด๋ฉด ๋ณด์กด+์•ˆ๋‚ด) | | ์—”์ง„ ์ž์ฒด(submodule/vendor ๋””๋ ‰ํ† ๋ฆฌ)๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค โ€” `git submodule deinit` ๋“ฑ์œผ๋กœ ๋ณ„๋„ ์ œ๊ฑฐ. ## ์ ๊ฒ€ ```bash bash .harness-engine/bin/sidecar # ๋„์›€๋ง bash .harness-engine/bin/sidecar audit # 6์ถ• ์Šค์ฝ”์–ด bash .harness-engine/bin/sidecar ci list bash .harness-engine/bin/sidecar lint ```