원문 캡처 · github.com
원문 캡처 · github.com

Marrow는 Claude Code와 Cursor용 플러그인에 계정이나 키 없이 작동하는 로컬 보호 기능을 제공한다. 이 기능은 강제 푸시, 보호 브랜치 삭제, 프로덕션 배포 등 7가지 작업을 막지만, 플러그인이 아직 제공되지 않는 Cursor와 키 없는 보호 기능이 포함되지 않은 Codex에는 적용 조건이 다르다.

플러그인과 지원 호스트

Claude Code·Codex·Cursor용 Marrow 플러그인 저장소는 각 호스트에 Marrow의 승인 훅, MCP 서버, 간단한 스킬을 추가한다. Codex에는 훅이 없는 marrow-advisory도 있다. 한 호스트의 플러그인은 그 호스트만 제어한다. Claude Code 플러그인은 Cursor가 Claude Code 플러그인을 가져오는 경우에도 Cursor를 제어하지 않는다.

호스트플러그인 폴더마켓플레이스 파일
Claude Codeplugins/marrow.claude-plugin/marketplace.json
Cursorplugins/marrow-cursor.cursor-plugin/marketplace.json
Codexcodex/marrow(훅 포함), codex/marrow-advisory(훅 없음, 둘 중 하나만 설치).agents/plugins/marketplace.json

Claude Code와 Cursor 플러그인은 계정과 키 없이도 7가지 작업을 막는 키리스 보호 기능을 포함한 @getmarrow/mcp 3.9.103을 실행한다. 계정이 있으면 Marrow는 위험한 작업을 승인 대기 상태로 두고 감사 기록을 보관한다. Codex 플러그인은 @getmarrow/mcp 3.9.102를 고정해 사용하며 키리스 보호 기능은 아직 포함하지 않았다. 해당 기능은 다음 업데이트에 제공될 예정이다.

Windows에서는 Marrow 훅이 아직 기본 Windows 환경에서 작동하지 않아 모든 작업이 차단된다. WSL을 사용하거나 수정 버전을 기다려야 한다.

설치와 이용 조건

Claude Code

Claude Code에서 다음 명령을 실행한다.

/plugin marketplace add getmarrow/plugins /plugin install marrow@getmarrow

또는 Claude Code v2.1.292 이상에서 셸의 한 명령으로 설치할 수 있다.

claude plugin install marrow --marketplace getmarrow/plugins

설치에는 계정이나 키가 필요하지 않다. Claude Code는 확인 전에 플러그인이 추가하는 내용을 보여준다. 요청이 표시되면 /reload-plugins를 실행한다. 훅과 MCP 서버를 실행하려면 PATH에 Node.js 18 이상이 있어야 한다. Marrow의 npx 훅이 현재 이 조건을 요구한다.

claude plugin marketplace list에 getmarrow가 getmarrow/plugins에서 제공되는 것으로 표시되고, claude plugin list에 marrow@... 플러그인이 정확히 하나 표시되는지 확인한다.

Cursor

Cursor는 현재 마켓플레이스나 저장소에서 이 플러그인을 설치할 수 없다. 설치가 가능해지면 저장소의 해당 안내를 업데이트할 예정이다.

훅을 제외한 MCP 서버만은 원클릭 링크로 추가할 수 있다. 페이지에서는 링크나 ‘Add to Cursor’ 버튼으로 표시된다.

cursor://anysphere.cursor-deeplink/mcp/install?name=marrow&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIi0tcGFja2FnZT1AZ2V0bWFycm93L21jcEAzLjkuMTAzIiwibWFycm93LW1jcCJdfQ==

config 값은 다음 JSON을 Base64로 인코딩한 값이며, 버전이 고정되어 있고 키와 env는 포함하지 않는다.

{"command":"npx","args":["-y","--package=@getmarrow/mcp@3.9.103","marrow-mcp"]}

MCP 서버만 추가한 구성은 조언만 제공한다. 승인은 플러그인의 훅이 있을 때만 적용된다. 플러그인과 달리 이 링크는 npx로 서버를 실행하므로 프로젝트의 node_modules가 같은 버전의 @getmarrow/mcp를 제공한다고 주장하는 경우 그 복사본을 사용할 수 있다. 저장소는 플러그인 사용을 권한다.

플러그인이 추가하는 구성

Claude Code 플러그인은 npx @getmarrow/install이 .claude/settings.json에 기록하는 이벤트와 같은 훅을 실행한다. UserPromptSubmit, PreToolUse, PostToolUse, PostToolUseFailure, Stop과 비동기 PermissionRequest, PostToolBatch 훅을 포함한다. 도구 매처는 설치 프로그램과 같은 모든 도구 호출을 Marrow에 보내며, 이 플러그인의 Marrow 도구 17개만 정확한 이름으로 제외한다. 경고만 제공하는 SessionStart 검사는 Marrow가 플러그인 외부에서도 설정됐거나 marrow라는 다른 플러그인이 활성화됐을 때 이를 알린다.

Cursor 플러그인은 npx @getmarrow/install 0.1.70이 .cursor/hooks.json에 기록하는 훅 10개를 설치 프로그램과 바이트 단위로 같은 매처와 함께 실행한다. preToolUse, beforeShellExecution, beforeMCPExecution(15초, failClosed), postToolUse, postToolUseFailure, afterShellExecution, afterMCPExecution, stop, sessionStart, beforeSubmitPrompt가 포함된다.

두 플러그인은 필요할 때 호출되는 도구를 제공하는 marrow MCP 서버를 설정한다. Claude Code에서는 .mcp.json, Cursor에서는 mcp.json에 등록한다. 두 호스트 모두 skills/marrow 스킬을 추가한다. 스킬에는 Marrow를 호출할 때, 작업 보류와 승인, 키 설정, 업데이트 명령이 담긴다. 플러그인은 고유한 정책을 추가하지 않으며, 같은 실행기를 통해 설치 프로그램이 기록하는 것과 같은 @getmarrow/mcp 3.9.103 진입점을 실행한다.

훅은 호스트가 보고하는 협력적 제어 방식이다. 플러그인이 활성화되어 있고 호스트가 훅을 실행할 때만 작동한다. 훅이 설정되어 있다는 사실만으로 적용 범위나 실제 차단을 입증할 수는 없다.

각 훅 명령은 플러그인 루트 변수를 지정하고 진입점을 한 줄에 적는다. 예를 들면 node "${CLAUDE_PLUGIN_ROOT}/scripts/marrow-launch.cjs" claude-pre-action-hook, node "${CURSOR_PLUGIN_ROOT}/scripts/marrow-launch.cjs" cursor-pre-action-hook, Codex의 ${PLUGIN_ROOT} 방식이다. 명령은 프로젝트를 기준으로 한 상대 경로를 쓰지 않으며, 플러그인을 가져오는 호스트가 버릴 수 있는 별도 args에도 의존하지 않는다. 실행기는 플러그인의 MCP 설정에서 명시적으로 mcp 인수를 받은 경우에만 MCP 서버를 시작한다. 인수 없이 실행하면 종료 코드 2로 거부하고 아무것도 시작하지 않는다. tools/check.cjs가 이 조건을 검사한다.

Cursor의 preToolUse는 MCP 도구를 서버 이름 없이 MCP:<tool>로 표시하므로 도구 이름만으로 출처 서버를 확인할 수 없다. 플러그인은 @getmarrow/install 0.1.70의 매처를 바이트 단위로 그대로 사용한다. 보류 대상인 모든 MCP: 표기는 훅으로 전달되며 MCP:marrow_<anything>도 포함된다. 이름을 이유로 제외하는 MCP 표기는 없다. 고정된 훅은 서버 이름이 정확히 marrow이고 등록된 도구 이름도 정확히 일치할 때만 Marrow 자체 도구를 허용한다. Marrow, MARROW, 공백이 붙거나 대소문자가 바뀐 이름은 일반 경로로 처리한다. beforeMCPExecution에는 서버 이름이 포함되고 매처는 없다. 플러그인은 Marrow 자체 도구를 포함한 모든 MCP 호출을 고정 훅에 보내며, 빠른 허용 검사를 두지 않아 설치 프로그램의 검사보다 더 많은 호출을 허용하지 않는다.

키리스 보호 기능

계정과 키가 없는 경우

사전 작업 훅에서 사용할 수 있는 Marrow 키가 없고, 기기에 소유자 키 파일, 계정 연결 표식, Marrow의 로컬 승인 상태 같은 계정 흔적도 없으면 훅은 모든 보호 작업을 보류하는 대신 로컬 보호 기능을 실행한다. 이 기능은 Claude Code와 Cursor 플러그인이 사용하는 @getmarrow/mcp 3.9.103 이상에 포함된다. 계정과 키가 필요하지 않으며 네트워크를 호출하지 않는다.

다음 7가지 작업을 차단한다.

  • S0: Marrow의 훅·설정·플러그인 변경 또는 소유자 전용 Marrow 명령
  • S1: 보호 브랜치 강제 푸시 또는 삭제
  • S2: 프로덕션 배포
  • S3: 패키지 게시
  • S4: 자격 증명이나 비밀 정보 읽기. 템플릿이 아닌 프로젝트의 .env 파일 읽기도 포함한다.
  • S5: 작업 공간 밖에서 수행하는 재귀 삭제
  • S-x: 디코딩한 데이터를 셸이나 인터프리터로 실행

차단은 호스트 자체의 거부 기능으로 이뤄지며, 에이전트에 해당 작업을 기기 소유자에게 맡기라는 문구를 보여준다. 이 기능은 셸 명령, 각 호스트의 파일 도구, MCP 호출을 읽는다. 오류가 발생하거나 검사가 300ms를 넘기거나 호스트가 입력을 잘라 전달하면 작업을 차단하는 폐쇄형 실패(fail closed) 방식이다.

그 밖의 작업은 Marrow가 판단하지 않으며 호스트의 승인 절차가 결정한다. Claude Code에는 빈 응답을 돌려준다. Cursor는 키가 없는 훅이 보류하던 셸 명령(예: git commit, git push)을 자체 승인 창으로 확인한다. Cursor의 다른 도구는 MCP 호출을 포함해 키가 없는 훅이 이전에 보류하던 항목을 계속 보류한다. 보호 기능이 알아보지 못하는 도구나 읽을 수 없는 MCP 인수에는 통과를 허용하지 않는다. 이런 경우 키가 없는 훅이 이전에 내놓던 응답을 반환하며, 이전에 보류했던 작업은 계속 보류한다.

보호 기능은 각 판단을 이 기기의 ~/.marrow/seatbelt/receipts/에 로컬 기록으로 남긴다. 기록에는 코드와 키가 적용된 해시, 내장 도구 이름, 고정 목록에서 가져온 셸 프로그램 이름이 포함된다. MCP 도구는 mcp로만 기록한다. 명령 텍스트, 인수, 경로, URL은 기록하지 않는다. 기록은 최대 90일 또는 50MB까지 보관되며 업로드되지 않는다.

홈 폴더와 에이전트 설정 폴더(예: ~/.claude)를 사용자만 쓸 수 있는 경우에만 보호 기능이 작동한다. Linux에서는 사용자 자신이 속한 비공개 그룹도 쓸 수 있는 폴더를 허용한다. 이는 umask 002의 기본 설정을 포함한다. 그 밖의 폴더에서는 모든 작업을 계속 보류하며, 안내에 Marrow 키리스 모드가 해당 위치에서 꺼져 있다고 표시한다.

이 기능은 보안 금고가 아니라 보호 장치다. 사용자 권한으로 기기에서 실행되고 네트워크를 호출하지 않는다. 에이전트가 지금 작성해 나중에 실행하는 스크립트, 인터프리터, 훅이 없는 도구 경로 등을 이용하면 로컬 검사를 우회할 수 있다.

계정이 있어도 키가 작동하지 않으면 기존에 보류하던 작업을 계속 보류하고 키리스 보호 기능의 차단도 적용한다. 작동하는 키가 있으면 기존 응답과 승인 요청은 바뀌지 않는다. 보호 기능은 차단했을 작업을 로컬에서 감시하고 기록할 뿐이다.

Codex 플러그인은 @getmarrow/mcp 3.9.102를 고정해 사용하며 키리스 보호 기능이 없다. 키가 없으면 보호 대상 작업을 Marrow has no API key 메시지와 함께 보류한다. 키리스 보호 기능은 다음 업데이트에 제공될 예정이다. Marrow MCP 서버는 키가 필요하며 키 없이는 시작하지 않는다.

계정 연결

계정을 연결하려면 getmarrow.ai에서 에이전트 키를 만든 뒤 자신의 터미널에서 파일에 보관한다.

mkdir -p ~/.marrow && chmod 700 ~/.marrow

put MARROW_API_KEY=<your_key> in ~/.marrow/env

chmod 600 ~/.marrow/env

또는 호스트를 시작하는 환경에 MARROW_API_KEY를 설정한다. 그 뒤 Claude Code에서 /reload-plugins를 실행하거나 Cursor를 재시작한다. 키를 채팅에 붙여 넣지 않는다.

플러그인에 훅이 포함되어 있으므로 Claude Code나 Cursor에서 플러그인을 사용하는 프로젝트에서는 보류 메시지가 안내하는 ‘설치 프로그램의 activate 명령 실행’ 단계가 필요하지 않다. MARROW_API_KEY=<your_key> npx -y @getmarrow/install@latest activate 명령이나 설치 프로그램의 --repair는 해당 프로젝트에 훅을 한 벌 더 기록한다. 키와 연결을 확인하려면 읽기만 수행하는 npx -y @getmarrow/install@latest doctor를 실행한다.

설치 프로그램 0.1.71 이상은 Claude Code 플러그인의 훅을 계산한다. 0.1.70 이하는 훅이 플러그인에 있더라도 Claude Code 훅이 없다고 보고한다. Cursor 플러그인은 검사 대상에 포함되지 않으므로 플러그인이 훅을 실행 중이어도 doctor가 Cursor 훅이 없다고 보고할 수 있다.

버전 고정과 업데이트

plugins/marrow와 plugins/marrow-cursor의 package.json, package-lock.json은 @getmarrow/mcp 3.9.103과 @getmarrow/sdk 3.7.65를 SHA-512 무결성 정보와 함께 고정한다. 이는 @getmarrow/install 0.1.71의 src/pins.js와 일치한다. Codex 플러그인은 @getmarrow/mcp 3.9.102와 @getmarrow/sdk 3.7.65를 고정하며, 이는 설치 프로그램 0.1.70의 src/pins.js와 일치한다.

훅은 npx가 아니라 node로 패키지를 실행한다. 각 실행은 scripts/mcp-manifest.json과 대조해 모든 파일을 검사한다. Claude Code는 설치 스크립트를 끈 상태로 잠금 파일을 플러그인의 캐시 복사본에 설치한다. 복사본이 없거나 변경된 경우, 또는 플러그인 의존성을 설치하지 않는 Cursor의 경우 실행기가 프로젝트 바깥에서 npm ci --ignore-scripts를 한 번 실행해 같은 잠금 파일을 설치하고 검사한다.

Claude Code는 복사본을 ~/.claude/plugins/data/에 보관하며 플러그인 제거 시 이 폴더를 삭제한다. Cursor는 권한 모드 700인 ~/.marrow/cursor-plugin에, Codex는 ~/.codex/plugins/data/marrow-getmarrow/에 보관한다. 실행 시 버전 이름으로 패키지를 가져오지 않으며 프로젝트의 node_modules에서 실행하지 않는다.

검증된 복사본을 불러올 수 없으면(예: 처음 실행할 때 오프라인인 경우) 사전 작업 훅은 검증이 가능해질 때까지 Marrow plugin: 메시지와 함께 도구 호출을 보류한다. 다른 훅은 차단하지 않는 오류를 보고한다.

각 플러그인은 version을 설정하므로 새 버전을 게시하고 업데이트하기 전까지 호스트는 설치된 복사본을 계속 사용한다. 제3자 Claude Code 마켓플레이스는 자동 업데이트를 켜지 않으면 자동으로 업데이트되지 않는다.

Marrow가 클라이언트 업데이트를 알린 뒤 Claude Code 플러그인을 업데이트하려면 다음을 실행한다.

claude plugin marketplace update getmarrow

claude plugin update marrow@getmarrow

Cursor는 아직 Marrow 플러그인을 설치할 수 없으므로 업데이트할 플러그인이 없다.

제거

Claude Code에서 플러그인과 마켓플레이스 등록을 제거하려면 다음을 실행한다.

claude plugin uninstall marrow@getmarrow

claude plugin marketplace remove getmarrow

Cursor는 아직 설치할 수 없다. 이전 시도에서 패키지 복사본이 생겼다면 rm -rf ~/.marrow/cursor-plugin으로 제거한다. Codex 제거 방법은 아래와 같다.

훅과 MCP 서버는 플러그인 안에 있으므로 플러그인과 함께 제거된다. Claude Code 설치는 ~/.claude/settings.json의 enabledPlugins와 마켓플레이스 추가 시 extraKnownMarketplaces를 기록하며, 다른 설정이나 훅 항목은 수정하지 않는다. 제거하면 enabledPlugins 항목과 플러그인의 데이터 폴더 ~/.claude/plugins/data/가 삭제된다. 캐시된 플러그인 복사본은 .orphaned_at 표시가 붙은 채 Claude Code 자체 정리 작업이 제거할 때까지 남는다. claude plugin marketplace remove getmarrow는 마켓플레이스 등록을 제거한다.

모든 호스트에서 ~/.marrow 아래의 Marrow 런타임 상태는 남는다. 예를 들면 session-loop-guard/state.json과 사용 중 쌓이는 캐시, 스풀, 상태 확인 파일, 호스트 승인 파일이 있다. 키 파일 ~/.marrow/env도 남는다. 필요하지 않은 파일은 직접 삭제해야 하며 자동으로 지우지 않는다.

Codex

저장소는 .agents/plugins/marketplace.json을 통해 Codex 마켓플레이스로도 제공되며 플러그인 두 개가 있다.

플러그인구성과 동작
marrowCodex 훅(SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, SessionEnd), Marrow MCP 서버, 스킬을 추가한다. 훅은 npx @getmarrow/install이 .codex/hooks.json에 기록하는 것과 같은 Codex 진입점인 고정 버전 @getmarrow/mcp 3.9.102를 실행한다. 도구 매처는 *로 모든 호출을 훅에 전달하며 이 플러그인의 Marrow 도구도 제외하지 않는다. 고정된 3.9.102 훅은 표기가 mcp__marrow__<name>과 정확히 일치하고 marrow 서버가 등록한 도구 이름 58개 중 하나일 때만 검사 없이 건너뛴다. 서버 출처는 확인하지 않고 표기만 읽는다.
marrow-advisory훅 없이 Marrow MCP 서버와 스킬만 제공하는 조언 전용 플러그인이다. 아무 작업도 보류하지 않으며 에이전트가 marrow_* 도구를 호출할 때만 Marrow가 작업을 확인한다.

두 플러그인은 MCP 서버 이름이 모두 marrow이므로 둘 다 설치하지 말고 하나만 설치한다. Codex는 경고 없이 둘 다 받아들이며 이 경우 marrow 서버 하나만 선택된다.

codex plugin marketplace add getmarrow/plugins

codex plugin add marrow@getmarrow

설치에는 계정이나 키가 필요하지 않다. 새 Codex 세션을 시작하고 /hooks를 열어 Marrow 훅을 검토한 뒤 신뢰하도록 설정한다. Codex는 훅을 신뢰하기 전에는 실행하지 않으며, 훅이 바뀔 때마다 다시 묻는다. 첫 세션 시작 때 플러그인은 설치 스크립트를 끈 상태로 package-lock.json에서 고정 복사본을 ~/.codex/plugins/data/marrow-getmarrow/에 설치하고 scripts/mcp-manifest.json과 대조한다. 검증된 복사본이 준비될 때까지 PreToolUse는 Marrow plugin: 메시지와 함께 도구 호출을 보류한다. PATH에 Node.js 18 이상이 있어야 한다.

키가 없으면 일반 도구 호출은 실행되지만 보호 작업은 Marrow has no API key 메시지와 함께 보류된다. Codex에는 아직 키리스 보호 기능이 없다. Codex는 플러그인의 MCP 서버에 환경 변수 이름 MARROW_API_KEY만 전달하며 키를 설정 파일에 저장하지 않는다. 가장 간단한 방법은 키 파일을 설정하는 것이다.

mkdir -p ~/.marrow && chmod 700 ~/.marrow # put MARROW_API_KEY=<your_key> in ~/.marrow/env chmod 600 ~/.marrow/env

업데이트와 제거 명령은 다음과 같다.

codex plugin marketplace upgrade getmarrow

codex plugin remove marrow@getmarrow # or marrow-advisory@getmarrow

rm -rf ~/.codex/plugins/data/marrow-getmarrow

codex plugin remove는 약 3MB인 패키지 복사본을 ~/.codex/plugins/data/marrow-getmarrow에 남긴다. rm 명령이 이를 삭제한다. 위에서 설명한 대로 ~/.marrow의 런타임 상태와 키 파일은 그대로 남는다.

npx @getmarrow/install도 Codex 훅을 기록하며 동작은 설치 프로그램 버전에 따라 다르다.

  • 0.1.70 이하: 도구 훅 매처가 Codex가 거부하는 전방 탐색을 사용한다(invalid matcher). 따라서 PreToolUse와 PostToolUse 훅이 로드되지 않아 Codex의 도구 호출을 검사하지 않는다. 컨텍스트 및 세션 훅만 실행된다. Codex에서 보호를 사용하려면 이 플러그인을 이용한다.
  • 0.1.71 이상: 설치 프로그램은 * 매처를 기록하므로 Marrow 자체 도구도 포함해 모든 도구 호출을 검사에 보낸다. 검사 자체는 @getmarrow/mcp가 수행한다. 3.9.103부터는 호스트 설정으로 marrow 서버가 공식 Marrow MCP 서버임을 입증할 수 있는 경우에만 자체 도구를 건너뛴다. 입증 가능한 설정에는 프로젝트나 환경의 npm 설정이 npx가 가져오는 위치를 바꿀 수 없는 npx -y @getmarrow/mcp 항목, 설치된 marrow-mcp, 설치 프로그램의 검증된 런타임, 또는 다른 서버가 같은 표기를 만들 수 없는 상태에서 파일 단위로 검증되고 단독 설치된 이 플러그인이 포함된다. 유사 서버나 플러그인, Marrow가 확인할 수 없는 서버는 다른 도구처럼 검사한다. 설치 프로그램 0.1.71은 3.9.103을 고정한다.
  • 이 플러그인의 훅은 고정 버전 @getmarrow/mcp 3.9.102를 실행한다. * 매처로 모든 호출을 받고, 위 표와 같이 표기만으로 자체 도구를 건너뛴다. 키리스 보호 기능은 아직 없으며 다음 업데이트에 제공될 예정이다. 플러그인 릴리스는 자신의 고정 버전을 담고 있는 MCP보다 먼저 배포될 수 없으므로 Codex 플러그인은 자신을 고정하는 MCP보다 이전 버전을 고정한다. 자세한 내용은 docs/PLUGIN-RELEASE.md를 참조한다.

Codex에서는 플러그인과 설치 프로그램 중 하나만 사용한다. 설치 프로그램의 .codex/hooks.json도 있으면 컨텍스트 및 세션 훅이 플러그인과 함께 두 번 실행된다. 설치 프로그램 0.1.71 이상에서는 도구 훅도 함께 실행되어 모든 도구 호출을 서로 다른 훅 두 개가 검사한다. 한 쪽의 훅만 남겨야 한다. 훅은 호스트가 보고하는 협력적 제어 방식이다.

두 패키지에 포함된 스킬(skills/marrow/SKILL.md, references/hosts.md)은 getmarrow/skills 저장소의 복사본과 바이트 단위로 같다. 해당 저장소가 바뀌면 그곳에서 복사한다. --skills <checkout> 검사는 두 패키지가 다르면 실패한다.

유지 관리자는 다음 명령으로 두 패키지와 매처의 도구 이름 목록을 검사할 수 있다.

node tools/codex-check.cjs <marrow-install>/src/pins.js <marrow-mcp>/src/cli.ts <marrow-install>/src/installer.js --skills <getmarrow/skills checkout> --rust <wasm>

tools/codex-rust-matcher에서 cargo build --release --target wasm32-wasip1을 한 번 실행해 Rust 검사기를 빌드한다. Codex가 사용하는 엔진인 regex 크레이트로 매처를 컴파일한다. 핀을 변경할 때는 node tools/codex-pin-manifest.cjs <dir>를 실행한다. 앞서 설명한 단계를 codex/marrow에 적용하고 package.json과 잠금 파일을 codex/marrow-advisory에 복사한다. tools/codex-matcher.cjs의 OWN_TOOLS는 기본 도구 집합과 일치해야 한다. 도구 매처는 와일드카드 *이므로 매처를 생성하지 않으며 hooks/hooks.json에 도구 이름을 넣지 않는다. tools/codex-check.cjs가 이를 검사한다.

다른 에이전트에서 사용

Gemini CLI, Windsurf 및 다른 호스트에서는 소유자가 터미널에서 설치 프로그램을 실행해 Marrow를 설정한다.

MARROW_API_KEY=<your_key> npx -y @getmarrow/install@latest activate

그 뒤 다음 명령으로 확인한다.

npx -y @getmarrow/install@latest doctor

해당 에이전트용 스킬은 getmarrow/skills에 있다.

유지 관리: 핀 변경

Codex 플러그인의 버전은 @getmarrow/mcp에도 고정되어 있다. 고정 파일 6개를 바꾸거나 버전을 올리기 전에는 릴리스 순서 안내를 확인한다. CI의 .github/workflows/codex-plugin-pins.yml은 대응하는 핀이 없는 고정 파일이 있으면 실패한다.

  • 새 정확한 버전을 plugins/marrow/package.json에 설정한 뒤 해당 폴더에서 npm install --package-lock-only --ignore-scripts를 실행한다.
  • 빈 디렉터리에 package.json과 package-lock.json을 복사하고 npm ci --ignore-scripts를 실행한다.
  • node tools/pin-manifest.cjs <that directory>를 실행한다.
  • package.json, package-lock.json, scripts/marrow-launch.cjs, scripts/mcp-manifest.json을 plugins/marrow-cursor에 복사한다. tools/check.cjs는 파일이 바이트 단위로 같은지 검사한다.
  • plugins/marrow/.claude-plugin/plugin.json과 plugins/marrow-cursor/.cursor-plugin/plugin.json의 version을 올린다. 버전이 같으면 호스트가 캐시된 복사본을 계속 사용하므로 버전 변경 없이 핀만 바꾸면 새 내용이 사용자에게 전달되지 않는다.
  • 새 MCP 릴리스가 기본 도구 집합을 바꾸면 tools/check.cjs의 OWN_TOOLS와 plugins/marrow/hooks/hooks.json의 매처를 업데이트한다. 설치 프로그램이 Cursor 훅을 바꾸면 plugins/marrow-cursor/hooks/hooks.json과 CURSOR_EXPECTED를 업데이트한다.
  • 다음 검사 명령을 실행한다.

node tools/check.cjs <marrow-install>/src/pins.js <marrow-mcp>/src/cli.ts <marrow-mcp>/dist/hook-contract.js [<candidate marrow-mcp>/dist/hook-contract.js ...] [--installer-cursor-hooks <hooks.json the installer writes for Cursor>]

3.9.102 이상에서는 src/cli.ts 대신 src/tool-catalog.ts를 사용한다.

node tools/codex-check.cjs <marrow-install>/src/pins.js <marrow-mcp>/src/cli.ts <marrow-install>/src/installer.js --skills <getmarrow/skills checkout>

node tools/test-launcher.cjs claude

node tools/test-launcher.cjs cursor

claude plugin validate plugins/marrow --strict

마지막으로 릴리스에 태그 v<version>을 붙인다.

Claude Code와 Cursor의 핀은 @getmarrow/install 릴리스의 src/pins.js를 따른다. MCP 버전, SDK 버전, 무결성 값이 동일하다. Codex 핀은 각 Codex 플러그인 버전이 포함하는 @getmarrow/mcp의 핀을 따른다. 자세한 내용은 docs/PLUGIN-RELEASE.md에 있다.