- 작업 중 사용한 원격 서버 관련 정보와 pem 파일을 깃에 커밋 하거나, 관련 접속 정보를 로그로 남기지 않는다.
- 필요할 경우 사용자에게 접속 정보를 묻는다.
- 개인 식별 표기와 실제 서비스 도메인을 문서 예시·앱 식별자·저작권 표기·커밋 작성자에 사용하지 않는다. 중립적인 프로젝트 명칭을 쓴다.
- 실제 배포 주소와 이미지 경로는 Git에서 제외한 서버 환경 설정으로 관리하고, 검사 결과에는 원문 값을 출력하지 않는다.
- 커밋 전
.githooks/pre-commit(scripts/secret-scan.mjs)이 공인 IP·개인키·토큰·pem 경로·비밀 파일·실제 서비스 식별자를 막는다. 막히면--no-verify로 우회하지 말고 값을 빼거나 비공개 설정으로 옮긴다. 훅은npm install때core.hooksPath로 켜지고, 금지어는 원문 대신node scripts/secret-scan.mjs --hash <낱말>의 해시를scripts/secret-scan.hashes.json에 더한다.
이 프로젝트의 Agent 세션은 Relay에 기록한다. relay가 없거나 기록이 실패하면 한 줄로 알리고 원래 작업을 계속한다. 기록 때문에 사용자의 작업을 멈추지 않는다.
-
세션 ID: 현재 Agent의 실제 세션 ID를 셸 변수로 그대로 전달한다. Claude Code는
$CLAUDE_CODE_SESSION_ID, Codex는$CODEX_THREAD_ID, Grok은$GROK_SESSION_ID이다. Cursor는 환경변수가 없으므로 시작 훅이 맥락에 넣어 준sessionId를 쓴다. 값을 임의로 만들지 않는다. -
압축 뒤: 컨텍스트가 압축된 뒤 시작 안내가 기록을 다시 읽으라고 하면
relay show <ID> --provider <회사 식별자> --history --json으로 자신의 기록을 확인하고, 빠진 맥락을update로 보완한다. -
첫 기록: 첫 작업 전에
relay show <ID> --provider <회사 식별자> --json으로 확인한다. 기록이 없을 때만 아래를 실행한다.relay record --provider <anthropic|openai|xai|cursor> --agent <claude-code|codex|grok|cursor-agent> --session-id <ID> --session-name <작업 주제> --summary <다음 대화에 필요한 첫 요약>이미 기록이 있으면
record를 다시 부르지 말고relay update --session-id <ID> --summary <현재까지의 맥락>으로 갱신한다. 훅이 먼저 기록해 둔 경우에도 같은 규칙을 따른다. -
맥락 갱신: 의미 있는 작업 단위가 끝날 때마다
relay update --session-id <ID> --summary <다음 대화에 필요한 진행 요약>. 훅 자동 기록만 남은 세션은 종료 시 삭제되므로 첫 작업 단위가 끝나면 반드시 갱신한다. 훅이 기록한 세션은 이름이 폴더명이므로 첫 갱신에--session-name <작업 주제>를 붙이고,--status working|blocked|handoff|done으로 마지막 작업 상태를 남긴다. 막히면blocked, 남은 일을 다음 세션에 넘기면handoff, 끝났으면done이다. 상태는 다음--status까지 유지된다. -
이어받기: 이전 기록을 확인하고 작업을 이어받으라는 요청이면 현재 세션을 별도로
record하지 말고relay continue <이전 Provider Session ID> --parent-provider <이전 회사 식별자> --provider <현재 회사 식별자> --agent <현재 도구 식별자> --session-id <현재 실제 Session ID> --summary <확인한 사실과 이어갈 작업>을 먼저 실행한다. 부모 기록의 종료 상태를 확인하거나 요구하지 않는다. 훅이 현재 세션을 이미 기록해 둔 경우에도 같은 명령을 그대로 쓴다. 부모가 없는 기존 기록이면 출처가 연결되고, 이미 다른 세션에 연결돼 있으면PARENT_CONFLICT이니 임의로 다시 연결하지 말고 사용자에게 알린다. Relay 요약은 줄여 쓴 참고용이므로, 요구사항은 원본 세션(실제 대화 기록)에 직접 들어가 원문대로 확인한 뒤 이어서 작업한다(relay-session스킬의 이어받기 절차). -
스킬 부재:
relay-session스킬이 목록에 없거나 링크 문제로 읽히지 않으면 이 지침의 절차를 그대로 따르고,relay install-skills로 다시 설치하라고 한 줄로 알린다. 스킬 폴더를 심볼릭 링크나 정션으로 만들지 않는다. -
요약은 다음 대화에서 바로 쓸 사실을 중심으로 짧게 쓴다. 목표·현재 상태·변경 파일·검증 결과·남은 위험이나 다음 작업을 담고, 전체 채팅·reasoning·키·로그인 정보·파일 전문은 넣지 않는다.
이전 세션을 이어받을 때는 relay-session 스킬을 사용한다.
이 저장소에서 작업 단위를 끝내면 사용자에게 따로 묻지 않고 검증 → 커밋 → 다시 설치 → 설치 파일 갱신 → 푸시까지 무조건 수행한다. 문서만 바꾼 작업도 같다. 재설치·설치 파일 갱신·푸시를 건너뛴 채 작업을 끝냈다고 보고하지 않는다.
- 검증:
npm run check(typecheck → test → build → test:web)가 통과해야 한다. 실패하면 고친 뒤 다시 돌린다. 끝내 고치지 못하면 커밋·설치·푸시하지 않고 실패 내용을 그대로 알린다. - 커밋:
main에 바로 커밋한다. 브랜치나 PR은 사용자가 요청할 때만 만든다. - 다시 설치: 현재 커밋으로
npm run build를 다시 돌린 뒤powershell -NoProfile -ExecutionPolicy Bypass -File scripts/install-cli.ps1 -Force로~/.local/bin/relay.exe와 훅·스킬을 바꾼다. 서버를 미리 닫지 않는다. 스크립트가 실행 중이라 잠긴 옛 파일을 옆으로 옮겨 교체하고, 옛 파일로 떠 있던relay web을 같은 포트·저장소로relay web --reload해 출력에Web server restarted를 남긴다. 그 줄이 없거나restart failed면relay web --reload [--port <포트>]를 직접 실행한다. 끝나면/api/v1/health가 200이고build가 새 값인지 확인한다(열린 화면은 그 값을 보고 스스로 새로 고친다). - 설치 파일 갱신: 3단계와 같은 빌드로
npm run dist -w @relay/desktop을 실행해installer/의Relay-Setup-<버전>.exe·relay.exe·install-cli.ps1·install.cmd를 새로 만든다. 이 명령은relay.exe를 다시 빌드하지 않고dist/relay.exe를 담으므로, 끝나면installer/relay.exe가 설치한~/.local/bin/relay.exe와 같은 내용(해시)인지 확인한다. 설치된 Windows 앱은 다시 설치하지 않는다. 앱은 동봉한relay.exe가 더 나중에 빌드됐을 때만 CLI를 바꾸므로 새 CLI를 되돌리지 않는다.installer/는 Git에서 제외한 배포물이라 커밋하지 않는다. - 푸시:
git push origin main. 원격이 앞서 있으면git pull --rebase뒤 다시 검증하고 푸시한다. 강제 푸시는 하지 않는다. - 보고: 커밋 해시, 설치와 서버 재시작 결과, 설치 파일 갱신 결과, 푸시 범위(
이전..이후)를 짧게 알린다.