monorepo에서 에이전트 루트 고르기

monorepo 에이전트 작업에서 가장 흔한 실패는 모델이 아니라 루트(cwd)·워크스페이스 범위를 잘못 잡은 경우입니다. 에이전트는 “지금 어느 디렉터리가 작업 루트인가”를 기준으로 상대 경로·락파일·테스트·중첩 AGENTS.md를 읽습니다. 팁(레포 최상단)에서만 열면 형제 패키지를 건드리고, 패키지 안에서만 열면 워크스페이스 스크립트를 못 찾습니다.

인접 글과 축을 나눕니다. repo-map-inject는 지형 요약 파일을 무엇을·어떻게 주입할지이고, 이 글은 세션의 cwd / 에이전트 루트를 어디를 고를지입니다. 맵이 “어디를 읽을지”를 알려 줘도, 루트가 틀리면 명령·상대 경로가 깨집니다. 요금·플랜·제휴 링크는 없습니다. 근거는 pnpm Workspaces, npm workspaces, Cursor Rules / AGENTS.md입니다.

cwd는?

한 줄 답: 변경을 소유하는 패키지(또는 앱)를 기본 cwd로 두고, 크로스 패키지·루트 스크립트·워크스페이스 설치가 필요할 때만 레포 팁으로 올립니다. “항상 팁”도 “항상 패키지”도 아닙니다.

선택 표:

작업권장 cwd이유
단일 패키지 버그·UI·유닛 테스트apps/web 또는 packages/api상대 import·로컬 package.json 스크립트가 맞음
pnpm --filter / turbo run / Nx target보통 레포 팁워크스페이스 정의·파이프라인이 팁에 있음
락파일·루트 CI·공유 tsconfig레포 팁루트 파일만 손댐
firmware vs host처럼 완전 분리 트리해당 트리 루트호스트 lockfile로 firmware를 설치하지 않음
서브에이전트에 위임브리프에 명시 cwd부모가 팁이어도 자식은 패키지일 수 있음

에이전트에게 고정할 문장 예:

Default cwd for this task: <path-from-repo-tip>
Repo tip is only for workspace installs, turbo/nx, and root CI.
Do not cd to sibling packages unless the ticket lists them.
Before running a command, state: cwd=<abs-or-repo-relative> · command=…

에디터·CLI 팁:

  1. Cursor/VS Code에서 폴더를 패키지로 열기 vs 모노레포 팁으로 열기가 곧 에이전트 기본 루트입니다. 멀티루트 워크스페이스면 어느 폴더가 활성인지를 브리프에 적습니다.
  2. 셸 에이전트는 pwd를 세션 초반에 한 번 보고하게 합니다. 가정하지 않습니다.
  3. 중첩 AGENTS.md / Project Rules는 열린 루트 아래만 잘 보입니다. 팁에서 열면 패키지 로컬 규칙이 약해질 수 있고, 패키지만 열면 팁 규칙이 안 보입니다—필요 시 @로 경로를 명시합니다(prompt-layers·repo-map-inject와 맞물림).
Session start checklist (agent):
1. pwd / workspace folders
2. Nearest package.json / Cargo.toml / pyproject.toml
3. Is there a workspace root above? (pnpm-workspace.yaml, etc.)
4. Which AGENTS.md applies? (nested vs tip)
5. Confirm allowlist packages before edits

패키지 범위는?

한 줄 답: 만져도 되는 패키지 allowlist와 실행할 워크스페이스 명령(필터 포함) 을 브리프에 고정합니다. cwd와 범위는 다릅니다—팁에 있어도 packages/legacy는 금지일 수 있습니다.

범위 칸(복붙):

칸예금지
Touchpackages/api/**, apps/web/src/api/**“관련 있어 보이는 곳 전부”
Do not touchpackages/legacy/**, firmware/**침묵
Commandspnpm --filter api test (cwd=팁)필터 없이 루트 test만
Install팁에서 pnpm install 한 번패키지 안에서 새 lockfile 생성
Shared typespackages/types가 allowlist에 있을 때만몰래 공유 패키지 API 변경

워크스페이스 명령과 cwd 조합:

# cwd = repo tip (typical)
pnpm --filter @acme/api test
pnpm --filter web build
npx turbo run test --filter=api

# cwd = packages/api (local scripts only)
pnpm test          # uses this package.json
# Avoid: npm install here if the repo is pnpm-workspace at tip

지시 문장 예:

Package scope for this task:
- Touch: packages/api/**
- Do not touch: apps/**, packages/legacy/**, firmware/**
- Run tests: from repo tip → pnpm --filter @acme/api test
- If you need another package, stop and ask (or open a follow-up)
- Never invent a package name that is not on disk / not in the workspace list

repo-map-inject와의 한 줄: 맵의 Layout·Boundaries는 지형 합의이고, 이 절의 allowlist는 이번 세션의 실행 범위입니다. 맵을 읽었다고 cwd·필터가 자동으로 맞지는 않습니다.

잘못된 루트 증상은?

한 줄 답: 증상이 보이면 모델을 바꾸기 전에 cwd·워크스페이스·필터를 먼저 검증합니다. 잘못된 루트는 “똑똑한 환각”처럼 보이지만 대부분 경로·락파일·스크립트 컨텍스트 문제입니다.

증상 → 원인 → 조치:

증상흔한 원인조치
command not found / 스크립트 없음패키지 cwd에서 팁 전용 스크립트 실행팁으로 cd 후 --filter
새 package-lock.json이 패키지 안에 생김npm을 패키지 cwd에서 실행삭제·gitignore 확인, 팁에서 pnpm/yarn 사용
테스트는 초록인데 버그 그대로다른 패키지 테스트만 실행allowlist 패키지 필터로 재실행
import/경로 환각팁 트리 전체를 한 앱으로 착각cwd를 소유 패키지로, 맵·트리 재확인
잘못된 AGENTS.md 규칙연 루트와 중첩 문서 불일치적용 규칙 경로를 브리프에 명시
형제 패키지 대규모 diff범위 미고정 + 팁 cwdDo not touch + path allowlist
CI만 실패로컬 cwd ≠ CI working-directoryCI와 동일한 cwd/필터를 Test plan에 기입

복구 루프(에이전트·사람 공통):

1. Print pwd and workspace root candidates
2. Show nearest package manifest vs workspace definition at tip
3. Re-state Touch / Do not touch
4. Re-run the one command CI uses (same cwd + filter)
5. If still wrong: stop editing; fix root before more patches

운영 팁:

  1. PR Test plan에 cwd + 명령을 같이 적습니다(agent-pr-body와 맞물림).
  2. 서브에이전트 브리프에 루트를 안 쓰면 부모가 팁이어도 자식이 임의로 cd합니다(subagent-brief).
  3. “레포 맵은 맞는데 빌드만 실패”면 맵이 아니라 루트/필터를 의심합니다—그게 이 글의 축입니다.

한 줄 정리: 소유 패키지를 기본 cwd로, 워크스페이스 명령은 팁+필터, allowlist로 범위 고정, 이상 증상이면 모델보다 루트부터 고칩니다. repo-map-inject는 맵 주입 축입니다.

FAQ

항상 모노레포 팁에서 에이전트를 열면 안 되나요?

됩니다—팀이 팁 전용 규칙·필터 습관이 강하면요. 다만 단일 패키지 작업이 많으면 팁 cwd는 형제 패키지 탐색·잘못된 스크립트 호출 비용을 키웁니다. 기본은 소유 패키지, 예외가 팁입니다.

repo-map-inject 글과 무엇이 다른가요?

그 글은 REPO_MAP 같은 지형 파일의 내용·주입·갱신입니다. 이 글은 세션 cwd·워크스페이스 루트·패키지 allowlist·잘못된 루트 증상입니다. 맵을 주입해도 cwd가 틀리면 명령이 깨집니다.

pnpm·turbo·Nx 중 무엇을 기준으로 하나요?

도구 이름은 팀 표준을 따릅니다. 공통 규칙은 같습니다: 워크스페이스 정의가 있는 곳(대개 팁)에서 필터 실행, 패키지 로컬 스크립트는 그 패키지 cwd, 락파일 도구를 섞지 않기.

멀티루트 워크스페이스면?

브리프에 workspace folders: …와 이번 태스크의 primary folder를 적습니다. 에이전트에게 “첫 번째 폴더가 루트”라고 가정시키지 않습니다.

출처 (Sources)

  • pnpm Workspaces — 워크스페이스·filter·팁 설치
  • npm workspaces — workspaces 정의·실행 위치
  • Cursor Docs — Rules / AGENTS.md — 중첩 프로젝트 지침
  • 인접: repo-map-inject(지형 맵 주입), prompt-layers(규칙 계층), subagent-brief(위임 시 cwd 명시), agent-pr-body(Test plan에 cwd·명령)