Sprag

팀 기능

Sprag 은 기본적으로 로컬에서만 동작합니다. 팀 기능은 켜야만 쓰이는 선택 기능입니다. 팀원마다 하루 지출과 절감액을 한 대시보드에서 보고, 오너나 어드민이 승인한 래칫 룰을 함께 쓸 수 있습니다. sprag team join 을 실행하거나 환경에…

Sprag 은 기본적으로 로컬에서만 동작합니다. 팀 기능은 켜야만 쓰이는 선택 기능입니다. 팀원마다 하루 지출과 절감액을 한 대시보드에서 보고, 오너나 어드민이 승인한 래칫 룰을 함께 쓸 수 있습니다. sprag team join <토큰> 을 실행하거나 환경에 SPRAG_TEAM_TOKEN 을 지정하기 전에는 아무것도 전송하지 않습니다. SPRAG_NO_TEAM_SYNC=1 을 지정하면 다른 설정과 상관없이 사용량 업로드가 모두 멈춥니다.

보내는 것과 보내지 않는 것

참여하면 Sprag 은 로컬 날짜 기준으로 하루에 한 행씩 올립니다.

항목내용
지출(USD)로컬 세션 로그로 계산한 금액
절감(USD)라우팅 원장과 doc2md 원장에서 가져온 금액
위임 실행 횟수그날 위임한 실행의 수
모델 계열 비중위임 실행 중 모델 계열별 비율
Sprag 버전설치된 버전
에이전트claude 또는 codex
표시 이름참여할 때 정한 이름이며, 기본값은 컴퓨터마다 한 번 만드는 member-3f9a2c71 같은 무작위 구성원 ID
기기 ID위와 같은 무작위 구성원 ID입니다. 표시 이름을 바꿔도 참여할 때 함께 보내며, 같은 컴퓨터가 다시 참여하면 조직 안에서 기존 좌석을 그대로 쓰게 하는 데 씁니다
운영체제OS 이름과 버전(예: macOS 26, Windows 11, Ubuntu 24.04)입니다. 참여한 직후 한 번 보내고, 바뀔 때만 다시 보냅니다. 호스트 이름, 사용자 이름, 경로처럼 컴퓨터를 이름으로 알아볼 수 있는 값은 보내지 않습니다

보내지 않는 것은 프롬프트, 대화 기록, 파일 경로, 프로젝트 이름, 룰 내용, API 키입니다. 프롬프트 수집을 켠 엔터프라이즈 팀의 옵트인 프롬프트 업로드만 예외이며 "프롬프트 사용량 (엔터프라이즈)" 절에 적었습니다. 룰은 직접 sprag team propose 를 실행할 때만 밖으로 나갑니다.

하루 단위 집계 업로드는 마지막 성공 이후 5분에 한 번 이하로 실행됩니다. SessionStart 훅(그리고 작은 로컬 파일만 읽는 프롬프트 훅)이 띄운 분리된 자식 프로세스가 보냅니다. 네트워크가 끊기는 등 동기화가 실패하면 5분 주기 대신 15분, 30분, 60분 뒤에 다시 시도합니다(최대 60분 간격). 마지막으로 올린 날짜를 기억해 두었다가 그 전날부터 최대 30일 치를 다시 보내므로, 며칠 꺼져 있던 컴퓨터도 처음 성공하는 동기화에서 빠진 날을 따라잡습니다. 하루 단위 행은 덮어쓰기라 다시 보내도 안전합니다. 프롬프트 수집을 켠 엔터프라이즈 팀의 프롬프트 업로드는 따로 30분 타이머로 움직입니다("프롬프트 사용량 (엔터프라이즈)" 절 참고). statusline 을 그리는 경로에서는 절대 실행되지 않습니다.

목적지는 https://hiycfjwswtkixyoqkznm.supabase.co/rest/v1/rpc/* 입니다(Supabase, ap-northeast-2 리전). 호출하는 RPC 는 team_join, ledger_upsert, team_rules_get, team_rule_propose, team_leave, prompt_chunk_put(엔터프라이즈 프롬프트 수집일 때만), member_set_sync(업로드 스위치 상태 호출, "업로드 스위치" 참고), member_set_info(OS 이름과 버전, arch 인자는 항상 빈 값) 입니다.

CLI에서 팀 만들기

웹 대시보드 없이도, 내가 오너나 어드민인 조직 안에 팀을 만들 수 있습니다. 조직 ID는 대시보드에 있고, 조직 개설은 Sprag가 합니다("조직과 좌석" 절 참고). 로그인은 메일로 받는 6자리 코드(15분간 유효)로 하며, Sprag 은 로그인 세션을 저장하지 않습니다.

터미널에서는 명령 하나를 실행하고 묻는 대로 답하면 됩니다 (이메일, 코드, 팀 이름).

sprag team create --org <조직 ID>

에이전트나 터미널이 없는 셸에서는 두 단계로 나눕니다.

sprag team create --org <조직 ID> --email you@example.com --name "Acme"
# 메일로 코드가 오면 이어서 실행합니다
sprag team create --org <조직 ID> --email you@example.com --name "Acme" --code 123456

첫 단계는 코드만 보냅니다. 두 번째 단계에서 코드를 확인하고 팀을 만든 뒤 초대 토큰, 멤버용 명령(npm i -g sprag-cli@latest && sprag team join <토큰>), 조직용 환경 변수(export SPRAG_TEAM_TOKEN=<토큰>), 대시보드 주소를 출력합니다. 같은 이메일로 https://sprag.io/team/ 에 로그인하면 팀을 관리할 수 있습니다.

기본적으로 이 PC가 첫 멤버로 참여하고 동기화를 한 번 실행합니다. 참여하지 않으려면 --no-join 을 붙입니다. 이미 팀에 참여한 PC에서는 먼저 sprag team leave 를 실행하거나 --no-join 을 붙여야 합니다.

개인으로 참여하기

오너나 어드민에게 초대 토큰을 받은 뒤 실행합니다.

sprag team join <토큰> --name "미나"

Sprag 이 올라갈 항목 목록을 보여 주고 확인을 묻습니다. --name 은 표시 이름이며 기본값은 member-3f9a2c71 같은 무작위 구성원 ID입니다. 이 ID는 컴퓨터마다 한 번 만들어 사용자 데이터 디렉터리에 보관하며, --name 으로 바꿀 수 있습니다. 이 변경 전에 참여한 구성원은 서버에 이미 저장된 이름을 그대로 씁니다. 터미널이 없는 셸에서는 --yes 를 붙여 확인을 대신합니다. 토큰을 생략하면 SPRAG_TEAM_TOKEN 을 읽습니다.

결과는 sprag team status 로 확인합니다.

조직 단위로 등록하기

구성원이 각자 명령을 실행하지 않아도 모든 컴퓨터를 등록하려면 환경에 SPRAG_TEAM_TOKEN=<토큰> 을 지정합니다. 흔한 위치는 두 곳입니다.

컴퓨터는 다음 세션이 시작될 때 참여합니다. 그다음 첫 세션에는 팀 이름과 두 명령을 알리는 한 줄 안내가 나옵니다. sprag team status --show-payload 는 보내는 내용을 보여 주고, sprag team leave 는 전송을 멈춥니다.

leave 는 환경 변수보다 우선합니다. 팀에서 나온 컴퓨터는 변수가 남아 있어도 저절로 다시 참여하지 않습니다. 오너나 어드민이 새 토큰을 발급하고 구성원이 sprag team join 을 다시 실행해야 다시 참여합니다.

팀 룰

룰은 두 단계로 나뉩니다. 조직 룰은 조직 안의 모든 팀에 적용되고, 오너와 어드민이 대시보드의 규칙 탭에서 직접 씁니다. 팀 룰은 한 팀에만 적용되고, 역시 오너와 어드민이 그 탭에서 승인합니다. 승인된 팀 룰은 "조직 전체에 적용" 버튼 한 번으로 조직 룰로 올릴 수 있습니다. 이때 팀 쪽 사본은 내려가므로 같은 룰이 한 PC에 두 번 들어가지 않습니다.

구성원도 팀 룰을 제안할 수 있습니다.

sprag team propose "커밋 전에 lint 실행" --scope ratchet

--scope 는 ratchet(기본값) 또는 model 입니다. 제안은 오너나 어드민이 승인할 때까지 대기 상태로 남습니다.

룰이 도착하는 시점. 승인된 룰은 각 PC에서 다음 세션을 시작할 때 반영됩니다. 약 5분마다 도는 사용량 동기화가 룰도 함께 받아 옵니다. 바로 적용하려면 sprag team sync --force 를 실행한 뒤 새 세션을 여십시오. 어느 쪽 동기화든 룰을 받는 즉시 룰 파일을 다시 쓰므로, 다음 세션은 추가 요청 없이 새 룰을 읽습니다. sprag team sync --rules-only 는 룰만 받고 아무것도 올리지 않습니다.

Sprag 은 룰을 ~/.claude/ratchet-team.md(Codex 는 <CODEX_HOME>/ratchet-team.md)에 씁니다. 조직 룰이 먼저, 팀 룰이 그다음이고, 모델 룰은 각각의 하위 절로 들어갑니다. 그 파일이 있는 동안 ~/.claude/CLAUDE.md 의 전역 harness 블록에서 import 합니다. Sprag 이 파일을 통째로 다시 쓰므로 직접 고치지 마십시오. sprag team rules 는 받아 둔 룰을 - [org · model] 내용, - [team · ratchet] 내용 형태로 보여 줍니다. sprag team leave 는 멤버 키, 캐시, import 를 지웁니다.

상태 확인, 전송 내용 확인, 나가기

명령설명
sprag team join [토큰] [--name <이름>] [--yes]팀에 참여
sprag team status [--show-payload]팀, 플랜, 프롬프트 수집 설정, 표시 이름, 마지막 동기화를 보여 줍니다. --show-payload 를 붙이면 보내는 기기 정보와 올라갈 하루 단위 행도 그대로 출력합니다
sprag team sync [--force] [--rules-only]지금 업로드하고 룰을 받습니다. --force 는 5분 간격을 무시하고, --rules-only 는 조직·팀 룰만 받고 아무것도 올리지 않습니다
sprag team rules받아 둔 조직·팀 룰 보기
sprag team propose "<내용>" [--scope ratchet\|model]팀에 룰 제안
sprag team leave팀에서 나가고 업로드 중단

조직과 좌석

모든 팀은 조직에 속하고, 좌석은 팀이 아니라 조직 단위로 구매합니다. 조직은 Sprag만 개설합니다. sales@sprag.io 로 문의하면 슈퍼유저가 sprag.io/ops/ 에서 조직을 열고 첫 오너를 이메일로 지정하며, 그다음부터 오너와 어드민이 그 안에 팀을 만듭니다. 오너 이메일은 필수이고 계정이 미리 없어도 됩니다. 한 번도 로그인한 적 없는 이메일이면 Sprag가 초대로 보관해 두었다가, 그 사람이 https://sprag.io/team/ 에 그 이메일로 처음 로그인하는 순간 오너가 됩니다.

컴퓨터 한 대는 조직마다 좌석 하나를 씁니다. sprag team leave 뒤에 다시 참여하거나, 재설치하거나, 같은 조직의 다른 팀 초대로 참여해도 서버가 기기 ID로 예전 행을 찾아 초대받은 팀으로 옮기고 멤버 키만 새로 발급합니다. 행도 좌석도 두 개가 되지 않습니다. 다른 조직에 참여하면 그 조직의 좌석을 따로 씁니다.

관리하는 조직 안에 팀을 만들려면 sprag team create --org <조직 ID> 를 씁니다. 조직은 Sprag만 개설하므로 --org 없이 실행하면 서버가 거절합니다. 명령은 조직 이름과 사용 중인 좌석 수를 함께 출력하고, sprag team status 는 조직 이름을 보여 줍니다.

업로드 스위치

SPRAG_NO_TEAM_SYNC=1(옛 이름 CTS_NO_TEAM_SYNC 도 계속 읽습니다)을 지정하면 모든 사용량 업로드가 멈춥니다. 참여한 컴퓨터는 스위치가 켜진 것을 처음 봤을 때와 다시 꺼졌을 때, 상태만 담은 호출 member_set_sync 를 한 번씩 보냅니다. 사용량 데이터는 들어 있지 않습니다. 다시 꺼진 뒤에는 바로 업로드합니다. 이 호출 덕분에 대시보드가 멈춘 컴퓨터와 연락이 끊긴 컴퓨터를 구분합니다. 멈춘 컴퓨터는 오너나 어드민이 내보내기 전까지 좌석을 유지합니다.

대시보드

https://sprag.io/team/ 에서 등록된 오너나 어드민이 이메일 코드로 로그인하고, 팀을 만들고, 초대 토큰을 받습니다. 가입 절차는 없습니다. 오너, 어드민, 초대 대기 중 어느 쪽에도 없는 이메일은 코드를 보내기 전에 거절하며, 조직 오너에게 추가를 요청하라고 안내합니다. 초대받은 사람은 처음 로그인할 때 자동으로 오너나 어드민이 됩니다. 여기서 구성원별 지출과 절감액을 보고, 규칙 탭에서 조직 룰과 팀 룰을 관리하고, 구성원을 내보낼 수 있습니다. 조직 패널에는 요금제, 한도 대비 사용 좌석, 어드민, 전체 팀이 보입니다. 슈퍼유저는 sprag.io/ops/ 에서 모든 조직을 봅니다.

대시보드 맨 위의 기간 선택(7일, 30일, 90일, 이번 달, 지난 달, 직접 선택)이 멤버 표, 사용량 차트, 프롬프트 사용량 탭의 기간을 정합니다. 기본값은 최근 30일이고, 내 컴퓨터의 달력 날짜를 쓰며 종료일도 포함합니다. 최대 365일까지 고를 수 있습니다. 고른 기간은 주소(?from=2026-10-01&to=2026-10-18)에 남으므로 새로고침하거나 링크를 공유해도 같은 기간이 보입니다. sprag.io/ops/ 슈퍼유저 콘솔에도 같은 선택이 있어 조직 표, 조직 머리말, 조직의 프롬프트 사용량에 적용됩니다.

좌석 현황

오너와 어드민에게는 /team 에 좌석 현황이 보입니다. 행 하나가 컴퓨터 한 대이고, 다음을 보여 줍니다.

행에서 할 수 있는 작업은 다음과 같습니다.

현황 아래의 활동 기록에는 참여, 멈춤, 재개, 탈퇴, 제거, 복구, 삭제가 누가 했는지(구성원, 오너, 어드민, 슈퍼유저)와 함께 남습니다.

플랜

Free, 프로(좌석당 월 $5), 엔터프라이즈(좌석당 월 $10, 프롬프트 수집과 사용자별 프롬프트 사용량 포함)가 있습니다. 대량 구매나 연간 청구는 맞춤 계약이며 sales@sprag.io 로 문의합니다. 자세한 내용은 https://sprag.io/pricing/ 에 있습니다.

프롬프트 사용량 (엔터프라이즈)

엔터프라이즈 조직의 오너와 어드민은 sprag.io/team 에서 프롬프트 탭을 씁니다. 사용자별 프롬프트 수, 글자 수, 평균 길이, 활동 일수, 마지막 프롬프트를 표로 보고, 사용자마다 프롬프트를 검색해 볼 수 있습니다. 프롬프트는 프롬프트 수집을 켠 엔터프라이즈 팀만 저장합니다. 프로 조직에는 잠금 화면이 나옵니다.

무엇을 수집하나. 직접 입력한 프롬프트만 올라갑니다. 메인 Claude Code 세션(~/.claude/projects/**/*.jsonl)과 Codex 세션(<CODEX_HOME 또는 ~/.codex>/sessions/**/*.jsonl)이 대상입니다. 프롬프트마다 시각, 프로젝트 폴더 이름(경로의 마지막 부분이며 전체 경로는 아닙니다), 본문(최대 20,000자)이 올라갑니다. Claude 가 답하는 도중에 미리 입력해 둔 프롬프트도 대상이고, 프롬프트에 붙여 넣은 텍스트는 그 프롬프트와 함께 보냅니다. 어시스턴트 답변, 도구 출력, 파일 내용, 서브에이전트 기록, 슬래시 명령 래퍼, ! 셸 명령과 그 출력, 백그라운드 작업 알림, 다른 에이전트가 보낸 메시지, 시스템 리마인더, 파일 경로는 수집하지 않습니다.

비밀값 가림. 올리기 전에 눈에 띄는 비밀값은 [redacted] 로 바꿉니다. API 키와 토큰(sk-..., sk-ant-..., ghp_..., gho_..., github_pat_..., AKIA..., xox[abpr]-...), Bearer 토큰, 개인 키 블록, KEY=, TOKEN=, PASSWORD=, SECRET= 형태의 대입이 대상입니다. 흔한 형태만 잡을 뿐 모든 비밀값을 찾지는 못하므로, 수집이 켜진 컴퓨터에서는 프롬프트에 비밀값을 붙여 넣지 마십시오.

과거분은 올리지 않습니다. 컴퓨터가 프롬프트 수집이 켜진 것을 처음 보면 기존 기록의 끝에 표시를 하고 그 뒤에 입력한 것만 올립니다. 정책이 이 컴퓨터에 닿기 전에 쓴 내용은 전혀 나가지 않고, 수집이 꺼진 동안 입력한 내용도 나중에 올라가지 않습니다. 그 뒤에 새로 생긴 기록 파일은 처음부터 읽습니다. 정책이 꺼지면 컴퓨터가 읽던 위치(prompts-offsets.json)를 지우므로, 다시 켜면 모든 파일의 끝에서 새로 시작합니다.

주기. 프롬프트는 Claude Code 나 Codex 를 쓰는 동안 약 30분마다 올라가고, 하루 단위 집계는 5분마다 올라갑니다. 프롬프트를 제출할 때 작은 로컬 타이머를 확인하고, 30분이 지났으면 분리된 백그라운드 프로세스가 업로드를 시작합니다(훅 안에서는 네트워크 호출도 기록 파싱도 하지 않습니다). 세션을 시작할 때와 sprag team sync --force 를 실행할 때도 올라갑니다. 한 번에 최대 2,000건 또는 8MB까지 올리고 나머지는 다음 동기화로 넘어갑니다. 파일 경로는 보내지 않습니다. 파일은 경로 해시의 앞 16자로만 구분하고, 같은 조각을 다시 보내도 서버가 무시합니다.

확인하기. sprag team status 는 "프롬프트 수집: 켜짐"과 마지막 프롬프트 업로드의 시각과 건수를 보여 줍니다. sprag team status --show-payload 는 올라갈 차례를 기다리는 프롬프트 수와 예시 하나(시각, 프로젝트, 앞 80자)를 더 보여 주며, 대기 중인 프롬프트의 전체 본문은 출력하지 않습니다.

멈추는 방법. 오너나 어드민에게 팀의 프롬프트 수집을 꺼 달라고 요청하면 다음 동기화부터 업로드가 멈추고 위치 파일이 지워집니다. 바로 모든 업로드를 멈추려면 SPRAG_NO_TEAM_SYNC=1 을 설정하거나 sprag team leave 를 실행합니다.

개인정보 관련 참고

파일과 환경 변수

이름용도
<사용자 데이터 디렉터리>/team.json참여 상태와 멤버 키(권한 0600)
<사용자 데이터 디렉터리>/team-rules.json마지막 동기화 때 받은 조직·팀 룰
<사용자 데이터 디렉터리>/prompts-offsets.json프롬프트 업로더가 기록 파일마다 어디까지 읽었는지 적은 파일이며, 프롬프트 수집이 켜진 동안만 있습니다
~/.claude/ratchet-team.mdClaude Code 용 승인된 조직·팀 룰이며 ~/.claude/CLAUDE.md 에서 import 합니다
<CODEX_HOME>/ratchet-team.mdCodex 용 같은 룰
SPRAG_TEAM_TOKEN초대 토큰이며, 다음 세션 시작 때 컴퓨터를 등록합니다
SPRAG_NO_TEAM_SYNC=1사용량 업로드를 모두 멈춥니다. 참여한 컴퓨터는 스위치가 처음 켜졌을 때와 다시 꺼졌을 때 상태만 담은 호출을 한 번씩 보냅니다(옛 이름 CTS_NO_TEAM_SYNC 도 읽습니다)

다른 문서