Go Version
License
Build Status
실행 전에 AI 코딩 에이전트가 생성한 잠재적으로 파괴적인 명령을 검토하기 위한 크로스 플랫폼 CLI입니다.
에이전트가 위험한 작업을 수행하려 할 때 (예: rm -rf, git push --force, kubectl delete, DROP TABLE), slb는 실행 전에 동료 검토(peer review)와 명시적인 승인을 요구합니다.
보장 수준을 명시적으로 선택하세요: 기본 independent 승인 정책은 독립적으로 인증된 검토자를 요구하는 로컬 승인 및 실행을 거부합니다. 외부 ID 제공자(external identity provider)는 아직 구현되지 않았습니다. 단일 호스트의 협력 에이전트는 same_host 동료 검토를 선택할 수 있는데, 이는 보안 경계가 아닌 실수 방지 워크플로우입니다. 이 모드는 에이전트 또는 모델 ID를 인증하지 않으며 동일한 OS 사용자를 공유하는 악성 프로세스를 포함할 수 없습니다. 요청, 검토, 실행 기록 및 히스토리는 정책 레이블을 유지하며, 로컬 검토는 절대 독립적인 승인이 될 수 없습니다. ID 경계 및 배포 요구 사항을 참조하세요.
존재 이유
코딩 에이전트는 터널 시야에 빠지거나(tunnel vision), 환각을 일으키거나(hallucinate), 컨텍스트를 오해할 수 있습니다. 두 번째 검토자(이상적으로는 다른 모델/도구링을 가진)가 실수가 되돌릴 수 없게 되기 전에 잡아냅니다.
slb는 여러 에이전트 터미널이 병렬로 실행되고 단 하나의 잘못된 명령으로 작업, 데이터 또는 인프라를 파괴할 수 있는 다중 에이전트 워크플로우를 위해 구축되었습니다.
주요 기능
- 위험 기반 분류(Risk-Based Classification): 명령은 위험 수준에 따라 자동으로 분류됩니다.
- 클라이언트 측 실행(Client-Side Execution): 명령이 사용자의 셸 환경에서 실행됩니다 (AWS 자격 증명, kubeconfig, 가상 환경 등 상속).
- 명령어 해시 바인딩(Command Hash Binding): 승인은 SHA-256 해시를 통해 정확한 명령에 바인딩됩니다.
- SQLite 진실 공급원(Source of Truth): 프로젝트 상태는
.slb/state.db에 저장됩니다.
- 에이전트 메일 통합(Agent Mail Integration): MCP Agent Mail을 통해 검토자에게 알림을 보내고 감사 추적(audit trails)을 기록합니다.
- TUI 대시보드(TUI Dashboard): 인간 검토자를 위한 인터랙티브 터미널 사용자 인터페이스 (UI).
위험 등급(Risk Tiers)
| 등급 | 승인 수 | 자동 승인 | 예시 |
|---|
| CRITICAL | 2+ | 절대 안됨 | rm -rf /, DROP DATABASE, terraform destroy, git push --force |
| ... | | | |
이 카운트는 검토 요구 사항입니다. 기본값인 independent 정책을 사용하면 로컬 세션은 독립적인 승인 요건을 충족할 수 없습니다. same_host를 사용하면 위 제한 사항 하에서 협력하는 로컬 검토자들을 계산합니다.
빠른 시작(Quick Start)
설치(Installation)
권장 방식: Homebrew (macOS/Linux)
brew install dicklesworthstone/tap/slb
이 방식은 다음을 제공합니다:
brew upgrade를 통한 자동 업데이트
- 종속성 관리(Dependency management)
brew uninstall을 통한 쉬운 제거
Windows: Scoop
scoop bucket add dicklesworthstone https://github.com/Dicklesworthstone/scoop-bucket
scoop install dicklesworthstone/slb
대안 방식: 직접 다운로드(Direct Download)
최신 릴리스(latest release)에서 일치하는 아카이브를 선택하세요:
- Linux x86_64:
slb_<version>_linux_amd64.tar.gz
- Linux ARM64:
slb_<version>_linux_arm64.tar.gz
- macOS Intel:
slb_<version>_darwin_amd64.tar.gz
- macOS ARM64:
slb_<version>_darwin_arm64.tar.gz
- Windows x86_64:
slb_<version>_windows_amd64.zip
동일한 릴리스에서 checksums.txt를 다운로드하여 아카이브를 추출하기 전에 SHA-256으로 검증하십시오. 이 아카이브에는 Linux/macOS용 slb 또는 Windows용 slb.exe가 포함되어 있습니다. 현재는 Windows ARM64 아카이브는 게시되지 않습니다.
대안: 설치 스크립트 (Alternative: Install Script)
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/slb/main/scripts/install.sh?$(date +%s)" | bash
이 설치 프로그램은 선택된 릴리스의 checksums.txt와 아카이브를 검증하고 보존된 다운로드 작업 공간을 보고합니다. 목적지를 지정하려면 INSTALL_DIR을 설정하십시오. 알려진 임시(scratch) 위치에 대한 자격 증명을 위해, SLB_RETAIN_WORK_ROOT는 아직 존재하지 않지만 부모 디렉터리가 이미 존재하는 절대 경로를 지정할 수 있습니다. 이 경로는 성공 또는 실패 여부와 관계없이 비공개적으로 생성되어 보존됩니다.
소스에서 빌드 (Build from Source)
git clone https://github.com/Dicklesworthstone/slb.git
cd slb && make build
Go 설치 (Go Install)
go install github.com/Dicklesworthstone/slb/cmd/slb@latest
프로젝트 초기화 (Initialize a Project)
cd /path/to/your/project
slb init
이 명령어는 다음을 포함하는 .slb/ 디렉터리를 생성합니다:
state.db - 요청(requests), 리뷰(reviews), 세션에 대한 SQLite 데이터베이스
config.toml - 프로젝트별 설정 파일
pending/ - 보류 중인 요청에 대한 JSON 파일 (모니터링/상호 운용성 목적)
하위 디렉터리에서 작업하기 (Working from Subdirectories)
일반적인 명령어는 -C / --project, 그다음 SLB_PROJECT, 그리고 현재 디렉터리 순서로 가장 가까운 초기화된 프로젝트를 감지합니다. 예를 들어, 리포지토리 루트에서 시작된 세션은 src/에서 요청을 제출하고 루트 프로젝트의 데이터베이스, 설정 및 사용자 정의 패턴을 사용할 수 있습니다. 루트에 있는 리뷰어는 동일한 요청을 볼 수 있습니다.
프로젝트 검색(Project discovery)은 명령어의 작업 디렉토리(working directory)를 변경하지 않습니다. -C는 검색 전에 명시적으로 선택된 디렉토리로 이동합니다. SLB_PROJECT는 cwd를 변경하지 않고 프로젝트를 선택합니다. 요청(Requests)은 정확한 명령어 디렉토리에 바인딩되며, 승인된 실행은 다른 곳에서 호출될 때도 기록된 이 디렉토리를 사용합니다. 기본 포그라운드, 백그라운드 및 비상 로그는 소유 프로젝트의 .slb/logs/에 속합니다. 명시적인 --log-dir은 호출하는 디렉토리에 상대적입니다.
slb init은 의도적으로 선택된 디렉토리 자체를 초기화하여 별도의 중첩 프로젝트가 가능하게 합니다. 기존의 중첩된 .slb는 프로젝트 경계를 표시하며, 잘못되거나 접근할 수 없는 마커 및 누락된 정책 데이터베이스는 다른 데이터베이스를 조용히 생성하거나 홈 히스토리 스토어를 사용하는 대신 오류를 발생시킵니다. 명시적인 --db는 여전히 요청된 데이터베이스를 선택합니다. 예외는 slb 자체 사용자 디렉토리인 ~/.slb (사용자 config.toml, daemon.log, 훅 및 감사 기록)입니다. 이 디렉토리는 state.db를 가지고 있을 때만 프로젝트로 표시하므로, 그전까지 홈 아래의 디렉토리는 마치 존재하지 않는 것처럼 검색됩니다.
검색은 정책을 선택하기 전에 파일 시스템 별칭(filesystem aliases)을 따릅니다. 기존의 리터럴 프로젝트 별칭은 동일한 물리적 루트를 식별할 때 유지됩니다. 다른 프로젝트의 후손으로 연결되는 별칭은 대상 프로젝트의 정책을 사용합니다. 저장된 세션, 요청 및 검토 바인딩은 검색에 의해 절대 재작성되지 않습니다. 선택된 루트 별칭이 자체 기록된 요청 ID를 가지고 있을 경우, slb watch는 정확한 범위를 유지하기 위해 로컬 폴링(local polling)을 사용합니다.
동일 호스트 동료 검토 워크플로우 (Same-Host Peer-Review Workflow)
에이전트들이 협력하고 실수에 대해 두 번째 세션으로 확인하기를 원할 때만 이 기능을 활성화하십시오. 초기화된 프로젝트에서 요청을 생성하기 전에 옵트인(opt in) 하십시오:
slb config set general.approval_policy same_host
.slb/config.toml 파일의 [general] 섹션에 approval_policy = "same_host"를 작성합니다. 기본값은 "independent"입니다. 각 요청은 생성될 때 적용된 정책을 유지하며, 설정을 변경해도 기존 요청이나 검토 내용은 변환되지 않습니다. 요청 승인과 실행 모두 현재 정책이 일치해야 합니다. 이 값을 independent로 다시 설정하면 미처리된 동일 호스트(same-host) 요청에 대한 로컬 승인 및 실행 기능이 비활성화됩니다.
slb session start --agent "Requester" --program "claude-code" --model "opus"
slb session start --agent "Reviewer" --program "codex-cli" --model "codex"
...
출력 결과는 이를 독립적으로 인증된 권한 부여가 아닌 동일 호스트 검토로 식별합니다. 쿼럼(Quorum), 설정된 경우 다른 모델 체크, 서명, 만료일, 명령어 바인딩은 여전히 적용됩니다. 요청자는 같은 에이전트 이름을 가진 세션 재시작이나 trusted_self_approve 설정을 통해서도 자신의 요청을 검토할 수 없습니다. 이름과 모델 레이블은 자체 보고된(self-reported) 상태로 유지됩니다. slb run은 검토를 기다리면서 자동으로 실행하는 동일한 워크플로우를 제공합니다.
다른 적격 검토자는 SLB가 실행 또는 권한 부여 클레임을 커밋할 때까지 쿼럼에 도달한 후에도 이의 제기를 기록할 수 있습니다. 현재 충돌 정책은 해당 이의 제기가 요청을 거부하는지, 에스컬레이션(escalates)하는지, 아니면 승인 상태를 유지하는지를 결정합니다. 부정적인 투표는 결코 새로운 승인을 부여하거나 기존 마감일을 갱신하지 않습니다.
명령어 참조 (Commands Reference)
세션 관리 (Session Management)
slb session start --agent <name> --program <prog> --model <model>
slb session end --session-id <id>
slb session resume --agent <name> --session-id <id> --session-key <key>
...
요청 및 실행 (Request & Run)
slb run "<command>" --reason "..." [--session-id <id>]
...
검토 및 승인 (Review & Approve)
slb review <요청-ID> # 전체 상세 정보 표시
slb approve <요청-ID> --세션-ID <ID> --세션-키 <KEY> # 요청의 정책에 따라 검토
slb reject <요청-ID> --세션-ID <ID> --세션-키 <KEY> --reason "..."
실행 (Execution)
slb execute <요청-ID>
slb emergency-execute "<명령어>" --reason "..."
slb rollback <요청-ID>
패턴 관리 (Pattern Management)
slb patterns list [--tier critical|dangerous|caution|safe]
slb patterns test "<명령어>"
slb patterns add --tier dangerous "<패턴>"
데몬 및 TUI (Daemon & TUI)
slb daemon start [--foreground]
slb daemon stop
slb daemon status
...
설정 (Configuration)
설정은 계층적이며(낮은 우선순위부터 높은 우선순위 순):
- 내장 기본값 (Built-in defaults)
- 사용자 설정 (
~/.slb/config.toml)
- 프로젝트 설정 (
.slb/config.toml)
- 환경 변수 (
SLB_*)
- 명령줄 플래그
예시 설정 (Example Configuration)
[general]
approval_policy = "independent"
min_approvals = 2
...
기본 패턴 (Default Patterns)
치명적 (CRITICAL) (2개 이상의 승인 필요)
| 패턴 | 설명 |
|---|
rm -rf /... | /, 시스템 경로 또는 홈 루트(` |
/home, /home/user, /Users/user, /root, ~`)의 재귀적 삭제 | |
| ... | |
위험 (DANGEROUS) (1개 승인 필요)
| Pattern | Description |
|---|
rm -rf | 재귀적 강제 삭제 |
| ... | |
삭제를 위해 -r, -R, 및 --recursive는 재귀적 의도를 표현하며, -f만 단독으로 사용되는 것은 주의(CAUTION) 사항입니다. /home/user/project/build와 같은 프로젝트 하위 디렉터리는 위험(DANGEROUS)하지만, 홈 루트와 시스템 디렉터리는 여전히 중요(CRITICAL)합니다. build와 ./build는 동일한 작업 디렉터리를 기준으로 해석되며, 보호된 피연산자(operand)를 사용하면 재귀적 삭제가 중요(CRITICAL)해집니다. | |
주의 사항 (30초 후 자동 승인)
| Pattern | Description |
|---|
rm <file> | 단일 파일 삭제 |
| ... | |
안전 (검토 건너뛰기)
| Pattern | Description |
|---|
rm *.log, rm *.tmp, rm *.bak | 임시 파일 정리 |
| ... | |
IDE 통합
Claude 코드 훅(Code Hooks)
AGENTS.md에 추가하세요:
## SLB 통합
파괴적인 명령을 실행하기 전에 slb를 사용하세요:
...
선택된 프로젝트에 대해 Claude 코드 훅을 설치하세요:
slb init
slb hook install
slb hook status
...
slb integrations claude-hooks --install 진입점은 동일한 설치 프로그램을 사용합니다. 파일을 변경하지 않고 현재의 PreToolUse 설정 조각을 인쇄하려면 slb integrations claude-hooks --preview를 사용하세요. 훅 설치 및 범위를 참조하세요.
Cursor 규칙(Rules)
Cursor 규칙 생성:
slb integrations cursor-rules > .cursorrules
셸 자동 완성(Shell Completions)
eval "$(slb completion zsh)"
...
아키텍처
.slb/
├── state.db # SQLite 데이터베이스 (진실의 근원지)
├── config.toml # 프로젝트 설정
...