interlinked-cli
가드를 위한 하네스. AI 코딩 에이전트를 위한 로컬 가드 레이어입니다. Claude Code와 Codex (지원됨)에 통합되며, 실험적인 Cursor, Copilot CLI, Gemini CLI, OpenCode, Pi 어댑터도 지원합니다. 전달된 도구 후크(tool hooks)를 결정론적 규칙과 비교 평가하고, 위험한 후크는 밀리초 단위로 차단하며, 검색할 수 있는 로컬 활동 로그를 유지합니다.
한 줄 설치
macOS, Linux 또는 WSL 환경의 Node.js 22+가 필요합니다. 다음 중 하나를 선택하세요:
npm install -g github:QuentinCody/interlinked-cli
...
그런 다음, 보호하려는 저장소 내부에서:
에이전트를 재시작하여 설치된 후크와 스킬을 로드하도록 합니다. 이 가드는 해당 클라이언트의 지원되는 후크 통합에서 전달되는 이벤트를 확인합니다. interlinked harness capabilities --json를 사용하여 설치 및 관찰된 커버리지를 검사하십시오. 이 지침은 이 저장소를 직접 설치하므로, 전체 세부 정보는 Install From Source에 있습니다.
미리 알려드리는 종료 방법: interlinked disable은 비파괴적으로 가드를 해제합니다. interlinked disable --uninstall은 enable/위자드 설치를 제거하며, 더 좁은 범위의 interlinked uninstall-hooks는 install-hooks를 통해 설치된 후크만 제거합니다. 둘 다 누군가 바이트를 변경했다면 관리되는 브리지를 보존합니다.
로컬 가드는 원격 서비스가 필요하지 않습니다. 런타임 상태는 .interlinked/ 아래에 존재하며, 설치 과정은 선택한 제공업체의 설정, 관리되는 브리지, 스킬 디렉터리를 작성합니다. 제거는 명시적입니다. 먼저 임시 저장소에서 사용해 보는 것을 권장합니다. 전체 설정은 interlinked (위자드)이며, 이에 상응하는 해체(teardown)는 interlinked disable --uninstall입니다.
이 것이 대규모 책임 있는 AI에 중요한 이유
AI 에이전트가 스스로 코드를 작성하고 셸 명령을 실행하며 종속성을 설치할 수 있게 되면, 모든 조직의 질문은 더 이상 "도움이 될 수 있는가?"에서 "설정된 러너(runner)가 노출한 모든 제어 가능한 액션이 실행되기 전에 정책에 의해 검사되었음을 어떻게 증명하고 — 그 후 러너가 전달한 이벤트를 재구성할 것인가?"로 바뀝니다.
Interlinked는 바로 그러한 것을 위한 제어 평면(control plane)입니다. 이는 에이전트와 시스템 사이의 경계에 위치합니다. 구성된 제공자(provider)의 훅(hook)이나 관리형 브릿지 표면을 통해 전달되는 모든 도구 호출(tool call)마다, Interlinked는 다음 작업을 수행합니다:
- 결정론적으로 정책을 강제 적용 — 모델이 결정 경로에 포함되지 않은 상태에서 밀리초 단위로 차단 또는 허용 결정을 내립니다. 따라서 모든 판결은 확률적 추측이 아닌 설명 가능하고 재현 가능한 것입니다.
- 사고를 유발하는 원인에 대해 폐쇄적으로 실패(Fails closed) — 제공자 사전 도구 게이트, 파괴적인 명령, 소스 코드에 기록되는 비밀 정보, 검증되지 않은 종속성은 디스크에 닿기 전에 중단됩니다. 데몬이 연결할 수 없는 경우에도 자체 포함된 결정론적 폴백(fallback)이 활성화 상태를 유지합니다. 전체 평가자(evaluator)가 필요한 검사는 깨끗하다고 보고하는 대신 사용 불가로 보고됩니다.
- 전달된 이벤트에 대한 감사 추적(audit trail)을 생성 — 실행되는 하네스(harness)에 도달하는 이벤트는 에이전트와 세션에 귀속되어 재생 가능한 로그로 기록됩니다. 통합을 한 번도 호출하지 않은 제공자나 하네스에 도달할 수 없는 누락된 런타임은 해당 로그로부터 재구성될 수 없습니다.
이것은 모든 책임 있는 AI 프로그램이 구축되는 삼위일체, 즉 **평가(evaluation), 관찰 가능성(observability), 그리고 강제 가능한 가드레일(enforceable guardrails)**입니다. 이는 전달된 에이전트의 의도(intent)가 실제 세계의 행동으로 변하는 제공업체 통합 계층에서 구현됩니다. 정책은 버전 관리 시스템을 통해 공유되며, <!-- gen:runner_count -->7<!-- /gen:runner_count -->개의 에이전트 러너와 병렬로 작동하는 에이전트 군단 전체에 걸쳐 정규화됩니다. Claude Code와 Codex가 지원되는 쌍이며, 다른 어댑터들은 실험적이고 각각 자체 네이티브 API가 노출하는 제어만 강제할 수 있습니다. 이 모든 과정은 클라우드 의존성이나 원격 텔레메트리를 요구하지 않습니다. 선택적인 인증 동기화(authenticated sync)는 명시적입니다.
이는 단순히 아키텍처 다이어그램이 아닙니다. 아래의 영수증들은 단일 개발자의 기기에서 <!-- gen:receipts_window_days -->109<!-- /gen:receipts_window_days -->일 동안 매일 사용하면서 포착된 <!-- gen:receipts_verified -->911<!-- /gen:receipts_verified -->개 이벤트별 감사 블록입니다. 그리고 이 패턴이 핵심입니다. 즉, 하나의 에이전트든 천 개의 에이전트든 동일하게 작동하는 결정론적이고 감사 우선의 강제 경계(deterministic, audit-first enforcement boundary)가 존재한다는 것입니다.
저자 기기에서 109일간의 자체 사용(dogfooding)을 통해 얻은 기록. 활동 로그는 총 3,834개의 고유한 guard_block 이벤트를 포착했습니다 (중복된 과등록 건 및 grep-accelerator 답변 제외). 이 중 911건은 Claude Code 세션 전사본(transcript)을 대상으로 한 이벤트별 감사(audit)를 거쳐 에이전트의 실제 tool_input을 확인한 후 살아남았습니다. 감사를 거친 상세 내역은 다음과 같습니다:
-
<!-- gen:row_tsc_diff_overlay -->580<!-- /gen:row_tsc_diff_overlay -->× 새로운 TypeScript 오류를 유발하고 쓰기(write)가 이루어지기 전에 차단된 역사적 수정 사항 (`tsc-diff-overlay`). 현재 일반적인 후크는 쓰기 이후에 외부 컴파일러 검사를 비동기적으로 실행하지만, 트랜잭션형 CLI 경로는 실패 시 폐쇄되는 제안 콘텐츠 오버레이를 유지합니다.
-
<!-- gen:row_tdd_new_file -->93<!-- /gen:row_tdd_new_file -->× 동반 테스트가 없는 새로운 소스 파일 (TDD 게이트)
-
<!-- gen:row_bash_redirect_bypass -->128<!-- /gen:row_bash_redirect_bypass -->× 셸 리디렉션 우회 시도 (`cat > file.ts`를 사용하여 콘텐츠 품질 게이트 회피)
-
<!-- gen:row_repo_confinement -->20<!-- /gen:row_repo_confinement -->× 저장소 루트 외부의 쓰기
-
<!-- gen:row_empty_catch -->23<!-- /gen:row_empty_catch -->× 빈 `catch {}` 블록
-
<!-- gen:row_process_kill -->24<!-- /gen:row_process_kill -->× 실행 중인 프로세스에 대한 `kill` / `pkill` / `killall` (하우징 또는 세션 자체를 겨냥한 경우)
-
<!-- gen:row_reservation_conflict -->26<!-- /gen:row_reservation_conflict -->× 다른 에이전트가 예약(reservation)을 보유하고 있는 파일에 대한 수정
-
<!-- gen:row_git_destructive -->10<!-- /gen:row_git_destructive -->× 파괴적인 git 명령어 (`reset --hard`, `branch -D`, `stash drop`)
-
<!-- gen:row_secrets_in_source -->2<!-- /gen:row_secrets_in_source -->× 제안된 쓰기 콘텐츠에서 탐지된 비밀 정보
– <!-- gen:row_supply_chain -->5<!-- /gen:row_supply_chain -->×
패키지가 팀 허용 목록에 없습니다 (실패 시 폐쇄 공급망 게이트)
자세한 내용은 랜딩 페이지 또는 아래의
What you get을 참조하세요.
설계 단계부터 로컬 우선(Local-first). 하네스, 활동 로그 및 검사는 사용자의 장치에서 실행되며, 서버 기반 협업 명령어는 선택 사항이며 Interlinked MCP Server URL이 필요합니다. 클라우드 또는 원격 텔레메트리가 필수로 요구되지 않으며, LLM이 핵심 경로에 포함되지 않습니다. 선택적 인증된 조정/동기화 기능은 명시적으로 이루어집니다.
소스에서 설치하기 (Install From Source)
현재 CLI는 공식 npm 패키지보다는 GitHub 저장소에서 실행하는 것을 목표로 합니다. Node.js 22+가 필요하며, macOS 및 Linux(Windows의 WSL 포함 — 네이티브 Windows는 지원하지 않음)에서 사용 가능합니다.
npm install -g github:QuentinCody/interlinked-cli
읽고 제자리에 업데이트할 수 있는 작업 체크아웃을 선호하십니까? 긴 형식은 동일합니다 (prepare가 npm ci 중에 자동으로 dist/를 빌드합니다):
git clone https://github.com/QuentinCody/interlinked-cli.git
cd interlinked-cli
npm ci
...
그 후, interlinked update를 실행하면 최신 저장소 변경 사항을 가져오고, 재빌드하며, 연결된 바이너리를 새로 고칩니다.
클론한 체크아웃에서 interlinked install-hooks를 사용하면 에이전트 설정에 dist/hook-entry.js의 절대 경로가 기록되므로, 클론을 그대로 유지하는 한 후크는 계속 작동합니다. 클론을 이동하거나 삭제하면 새 위치에서 interlinked install-hooks를 다시 실행하거나 (먼저 interlinked uninstall-hooks를 사용하세요). .github/workflows/ci.yml의 tarball 설치 스모크 테스트가 동일한 엔드투엔드 경로를 수행합니다.
어떤 온보딩 명령을 실행해야 하나요?
네 가지 명령으로 시작할 수 있으며, 이들은 서로 다른 양의 작업을 수행합니다. 새 저장소를 구성하는 사람에게는 간단히 interlinked만 사용하면 되며, 자동화 또는 명시적으로 선택된 구성을 사용하는 경우에는 enable을 사용하세요.
| 명령어 | 기능 | 사용 시점 |
|---|
interlinked (인수 없음) | 로컬 우선 하네스 마법사: 실행기 선택, 엄격/느슨/균형 자세, diff/전체 파일 범위, 캡 오버라이드, 브라운필드 기준선 채택 및 데드 코드 자세를 결정한 후 enable + 소유 구성 명령어들을 조합합니다. TTY 외부에서는 프롬프트 없이 환경 기반 로컬 기본값을 사용합니다. | 권장되는 최초 수동 실행. 적용할 강제 정책을 확인하고 싶거나 검증하고 싶은 새 리포지토리 |
| ... | | |
일반적인 첫 실행에는 interlinked를 직접 사용하세요. 실제로 로컬에서 어떤 강제 결정이 내려지는지 보여준 후 내부적으로 enable을 호출합니다. 스크립트화되었거나 이미 결정된 설치의 경우 enable을 직접 사용하세요. 예외는 init입니다: 이는 자체 경로에 훅(hook)을 설치하고 어떤 기술도 설치하지 않기 때문에, 에이전트는 읽는 방법에 대한 지침 없이 게이트만 받게 됩니다. 로그인 및 작업 공간 단계가 필요한 경우에만 setup 또는 init을 사용하세요. | | |
얻게 되는 것
- 가드 하네스(Guard harness). 로컬 Unix 소켓 서버가 전달된 각 훅 이벤트를 <!-- gen:builtin_rule_count -->124<!-- /gen:builtin_rule_count -->개의 결정론적 안전 규칙(파괴적인 명령어, 쓰기 시 비밀 정보 포함 여부, 민감 파일 읽기, 잠금 파일 드리프트 등)과 비교 평가하고, 저렴한 규칙의 경우 약 1~5ms 만에 블록/허용 또는 질문 결정을 반환합니다. 외부 프로젝트 검사는 컴파일러나 스캐너가 소요하는 시간만큼 시간이 걸리며 편집 후에 실행됩니다.
- 콘텐츠 품질 게이트(Content-quality gate). 일반 에이전트의
Edit/Write 호출은 쓰기 작업이 이루어지기 전에 제안된 콘텐츠에 대해 결정론적이고 도입된 경우에만 적용되는 pre_block 레지스트리를 실행합니다. 외부 TypeScript/Biome 검사는 PostToolUse 시점에 결과 파일에 비동기적으로 실행됩니다. 컴파일러 용량이 바쁘거나 도구가 사용 불가능한 경우, Interlinked는 NOT CHECKED를 출력하며, 이는 결정을 내리지 못한 상태일 뿐 깨끗한 결과가 아닙니다.
실패 시 닫힘(fail-closed) 방식으로 제안된 콘텐츠에 대해 TypeScript/Biome 검사를 수행하고 실제 쓰기 작업을 하려면 트랜잭션 방식의 interlinked write를 사용해야 합니다. 또한, 실제로 파일을 작성하지 않고 미리보기를 제공하는 verify-changeset도 있습니다. interlinked multi-edit은 동일한 콘텐츠 게이트를 공유합니다. 이 두 쓰기 명령어는 검사 전에 대상 상태를 캡처하고, 공유 커밋 잠금(shared commit lock) 하에 동시 변경을 거부하며, 기존 권한을 유지합니다. 사용 불가능한 Biome/TypeScript 검사는 트랜잭션 쓰기를 중단시키지만, 일반적인 편집은 비동기 피드백을 유지합니다.
- 자동 파일 예약. 이 시스템(harness)이 실행되는 동안, 전달되는 모든 쓰기 클래스 이벤트는 5분 TTL(Time To Live)과 30초의 유휴 자동 해제 기능을 가진 임대 기반 예약(lease-based reservation)을 취합니다. Interlinked MCP 서버가 구성된 경우, 이미 다른 개발자의 에이전트에 의해 예약된 파일을 대상으로 하는 쓰기는 MCP 메시지를 통해 좌표를 지정하는 포인터와 함께 차단됩니다. 그렇지 않으면 이 예약은 로컬 전용입니다.
- 편집 후 검사. <!-- gen:quality_check_count -->34<!-- /gen:quality_check_count -->개 이상의 언어(tsc, biome, cargo, mypy 등)에 걸친 품질 검사와 <!-- gen:structural_check_count -->26<!-- /gen:structural_check_count -->개의 구조적 검사(export surface, import resolution, cycles, blast radius)는 변경 이벤트가 발생한 후에 수행될 수 있습니다. 용량 제한이 있는 외부 작업은
NOT CHECKED를 사용하여 명시적으로 연기할 수 있습니다.
- 오프라인 활동 로그. 실행 중인 시스템(harness)에 의해 처리된 이벤트는
.interlinked/activity.jsonl에 추가됩니다. 이는 로컬 증거일 뿐, 사용 불가능한 통합이 이벤트를 관찰했다는 증거는 아닙니다. interlinked status, activity, explain, 그리고 doctor 명령어들은 이 로그에서 읽어옵니다.
- Trigram grep. 전달되는 Grep/Bash 검색 이벤트는 캐시된 trigram 인덱스를 통해 라우팅되어,
rg가 실행되기 전에 후보 파일을 좁힐 수 있습니다. 다른 검색은 정상적으로 통과합니다.
빠른 시작
interlinked
interlinked status
그런 다음 에이전트를 재시작하거나 리로드하여 새로운 스킬을 인식하게 합니다. 평소처럼 실행하면 도구 사용 이벤트가 하네스(harness)를 통해 흐르게 됩니다.