@vectorize-io/self-driving-agents v0.0.26 · 페르소나 179개 · GitHub ⭐ 약 1.7k)
"미리 잘 써둔 179명의 전문가 프롬프트를, 세션이 끝나도 기억을 잃지 않는 '진짜 직원'으로 만들어 원하는 AI 툴에 꽂아주는 설치기"다.
당신이 "SEO 담당자 한 명 보내줘"라고 파견 회사(=이 CLI)에 전화한다. 회사는 이미 훈련된 SEO 전문가(=페르소나 마크다운)를 당신 사무실(=하네스)로 보낸다.
보통의 파견 직원은 계약이 끝나면 배운 걸 다 잊는다. 그런데 이 직원은 매번 퇴근하며 "오늘 배운 것"을 회사 서버(=Hindsight)의 자기 노트에 적어두고, 다음 출근 때 그 노트를 먼저 읽고 시작한다. 노트는 시간이 지나며 자동으로 다시 정리·요약된다.
self-driving-agents가 하는 일이 정확히 이것이다. "직원을 보내는" 부분(CLI)과 "기억을 저장하는" 부분(Hindsight 서버)이 분리돼 있다는 게 핵심이다.
구체적으로 CLI가 하는 일은 세 가지다. ① 179개 페르소나 중 원하는 것을 골라(부서/직무 경로로 지정), ② 지정한 하네스에 맞는 형식(스킬 zip · 플러그인 · MCP · Python 툴)으로 변환·설치하고, ③ 그 에이전트를 Hindsight 메모리 뱅크에 연결한다. CLI 자체는 LLM을 호출하지 않는다 — 어디까지나 준비·배선(wiring) 작업만 한다.
# 마케팅 부서의 SEO 에이전트를 Claude(Chat/Cowork) 하네스에 설치
npx @vectorize-io/self-driving-agents install marketing/seo --harness claude
# 내가 만든 로컬 에이전트를 Claude Code에, 기억 뱅크는 비운 채로 설치
npx @vectorize-io/self-driving-agents install ./my-agent --harness claude-code --empty
GitHub에는 "복사해서 쓰는 프롬프트 100선" 류 저장소가 넘친다. 이들의 치명적 한계는 기억이 없다는 것이다. 어제 이 에이전트에게 "우리 코드베이스는 pnpm을 쓴다"고 알려줘도, 오늘 새 세션에서는 다시 npm을 제안한다. 매번 처음부터 설명해야 한다.
이 저장소의 차별점은 모든 에이전트를 Hindsight 기억 서버에 자동 연결한다는 점이다. 대화 내용에서 "안정적인 사실"만 걸러 저장하고, 그것을 바탕으로 지식 페이지를 스스로 갱신한다. 여기에 더해 한 번의 install 명령이 성격이 전혀 다른 5개 실행 환경을 모두 지원한다.
보통 프롬프트 저장소 = 요리 레시피 카드 묶음. 매번 처음부터 읽어야 하고, 내 주방 사정은 카드가 모른다.
self-driving-agents = 레시피 카드 + 내 냉장고 사정과 지난번 실패를 적어두는 요리 일지. 다음에 만들 땐 일지를 먼저 펴본다.
| 항목 | 보통 프롬프트 저장소 | self-driving-agents |
|---|---|---|
| 세션 간 기억 | 없음 (매번 초기화) | Hindsight 뱅크에 축적·자가 갱신 |
| 설치 방식 | 수동 복붙 | npx install 한 줄 |
| 지원 환경 | 보통 1개(대개 그냥 붙여넣기) | 5개 하네스 자동 분기 |
| 규모 | 수십 개 | 13개 부서 · 179 페르소나 |
| 핵심 의존 | 없음 | Hindsight 서버(별도 제품) |
Hindsight 엔드포인트가 없으면 이 179개 에이전트는 그냥 정적 프롬프트 파일 더미에 불과하다. 즉 이 프로젝트의 진짜 엔진은 같은 회사(vectorize-io)의 별도 제품 Hindsight이고, self-driving-agents는 그것을 손쉽게 붙여주는 프런트다. 자율주행이라는 이름값은 Hindsight에 달려 있다.
핵심을 먼저 짚으면, 이 저장소는 "작은 TypeScript CLI + 수백 개의 마크다운/JSON 데이터 파일 + 별도 문서 사이트" 구조다. 무거운 로직은 거의 없고, 대부분이 사람이 읽는 프롬프트와 설정이다.
| 구성 | 내용 |
|---|---|
| 언어/타깃 | TypeScript (ES2022, strict), tsc로 빌드 → dist/cli.js |
| 진입점 | src/cli.ts — 약 1,428줄. 설치 로직 전부가 여기 있다 |
| 대화형 프롬프트 | @clack/prompts (터미널 질문 UI), picocolors (색상) |
| 기억 클라이언트 | @vectorize-io/hindsight-client ^0.5.6 |
| 테스트 | vitest — src/tests/cli.test.ts, lint.test.ts |
| 배포 | npm 패키지 @vectorize-io/self-driving-agents, 버전 0.0.26 |
CLI가 연결하는 대상. github.com/vectorize-io/hindsight에 있는 별도 서버 제품이며, 두 가지 데이터 원소를 다룬다 — Memories(추가만 되는 원자적 사실)와 Knowledge pages(배경에서 다시 쓰여지는 마크다운 문서). 클라우드(api.hindsight.vectorize.io) 또는 셀프호스팅으로 띄운다.
hermes-plugin/__init__.py + plugin.yaml. Python으로 agent_knowledge_* 툴을 등록(httpx로 Hindsight REST 호출).vectorize-io/hindsight 마켓플레이스의 hindsight-memory 플러그인을 설치·배선.src/skill/SKILL.md를 zip으로 묶어 스킬로 제공.website/ — Next.js(App Router) + Tailwind. Mermaid로 아키텍처 다이어그램을 그린다. GitHub Pages로 배포(public/CNAME).src/scripts/lint-bank-templates.mjs — 저장소 안 모든 bank-template.json을 검사. 폐기된 reflect_mission 필드 금지, observations_mission 필수 등 규칙을 강제. npm run lint로 실행.
각 지식 페이지에는 source_query가 붙어 있다. 이건 "이 페이지가 답해야 하는 질문"이다. 새 기억이 쌓여 통합 사이클이 돌면, 시스템은 그 질문을 다시 답해서 페이지를 새로 써 내려간다. 즉 페이지는 "손으로 고치는 문서"가 아니라 "질문의 최신 답변"으로 취급된다. src/skill/SKILL.md의 설명을 그대로 보면:
---
name: agent-knowledge
description: Your long-term knowledge pages. Read them at session start...
---
**How it works:** Your conversations are automatically retained into a
Hindsight memory bank. The system extracts observations and uses them to
keep your pages current. Each page has a "source query" — a question the
system re-answers after every consolidation cycle to rebuild the page.
좋은 기억 시스템의 절반은 버릴 것을 정하는 규칙이다. engineering/bank-template.json은 "안정적 사실만 남기고 일회성 디버깅은 무시하라"고 못박는다:
"observations_mission": "Observations are stable facts about the codebase,
stack, conventions, ownership, deployment topology, performance baselines,
and recurring failure modes. Ignore one-off debugging sessions and
ephemeral build issues."
src/cli.ts는 하네스마다 완전히 다른 방식으로 기억을 붙인다. 이게 이 저장소에서 가장 배울 만한 엔지니어링이다.
| 하네스 | 기억 붙이는 방식 | 뱅크 범위(granularity) |
|---|---|---|
| Claude Chat/Cowork | SKILL.md(zip) 안에 raw curl로 Hindsight REST 직접 호출. 자동 훅 없음 → LLM이 스스로 "self-retain" | agent |
| Claude Code | hindsight-memory 플러그인 + SessionStart/UserPromptSubmit/Stop/SessionEnd 훅으로 턴 전 회상·턴 후 저장 자동화 | agent::project (cwd 기반) |
| OpenClaw / NemoClaw | hindsight-openclaw 플러그인 설치·설정 | ["agent"] |
| Hermes | 활성 프로필의 hindsight/config.json 공유 읽기 + Python 툴 플러그인 | agent |
Claude Chat/Cowork처럼 세션 수명주기 훅이 없는 하네스에서는, 스킬 문서가 LLM에게 직접 "중요한 대화 뒤에는 retain API를 호출하라"고 지시한다. 시스템이 못 하면 모델에게 시키는 실용적 우회 — 훅 없는 환경에 기능을 이식할 때 참고할 만한 패턴이다.
에이전트 소스는 세 가지다 — ① 내장 뱅크(저장소 자체), ② 로컬 디렉터리, ③ org/repo/path 형식의 GitHub 경로. GitHub의 경우 git clone이 아니라 archive/refs/heads/main.tar.gz를 curl | tar xz로 받아 푼다(설치 시점에 git 불필요).
포인트는 "코드는 src/에만 조금 있고, 저장소 대부분은 부서 폴더 안의 마크다운·JSON 데이터"라는 것이다. 즉 이건 소프트웨어라기보다 잘 구조화된 프롬프트 데이터셋 + 얇은 설치 도구에 가깝다.
| 파일 | 역할 |
|---|---|
| README.md | 179 로스터 표 · 설치 원라이너 · 하네스 매트릭스 |
| src/cli.ts | 설치기 전부 — 에이전트 해석, 하네스별 설정, 뱅크/플러그인 배선 |
| src/skill/SKILL.md | 모든 Claude Code 설치에 심기는 범용 "agent-knowledge" 스킬 |
| hermes-plugin/__init__.py | Python 툴 등록(list_pages/get_page/create_page/recall/ingest_files) |
| */bank-template.json | 부서별 기억 스키마(retain/observations/mental_models) |
| specialized/exec-ops/agents-orchestrator.md | 하위 에이전트를 QA 게이트로 굴리는 "메타 에이전트" |
| engineering/workflow/code-reviewer.md | 대표적인 단일 페르소나 파일(프런트매터 + 미션 + 체크리스트) |
| website/src/lib/harnesses.ts | 하네스별 정확한 기술 명세(훅 이름·설정 경로) |
에이전트 하나는 프런트매터(이모지·색·성격) + 미션 + 체크리스트로 된 마크다운이다. 예를 들어 code-reviewer.md의 리뷰 원칙 부분:
1. **Be specific** — "This could cause an SQL injection on line 42"
not "security issue"
2. **Explain why** — Don't just say what to change, explain the reasoning
3. **Suggest, don't demand** — "Consider using X because Y" not "Change this to X"
4. **Prioritize** — Mark issues as 🔴 blocker, 🟡 suggestion, 💭 nit
그리고 specialized/exec-ops/agents-orchestrator.md는 여러 하위 에이전트를 하나의 개발 파이프라인으로 지휘하는 "메타 에이전트"인데, 품질 게이트를 통과해야만 다음 단계로 넘어가는 루프를 명시한다:
### Implement Continuous Quality Loops
- **Task-by-task validation**: Each task must pass QA before proceeding
- **Automatic retry logic**: Failed tasks loop back to dev with feedback
- **Quality gates**: No phase advancement without meeting standards
- **Failure handling**: Maximum retry limits with escalation procedures
추가만 되는 원자적 사실(Memories)과, 주기적으로 통째 재생성되는 긴 문서(Knowledge pages)를 나눈 것 — 그리고 각 문서를 다시 답할 수 있는 질문(source_query)으로 정의한 것. 이건 이 저장소를 넘어 RAG 시스템, 개인 지식 베이스, 노트 앱 설계에 그대로 재사용할 수 있는 발상이다.
observations_mission이 "일회성 디버깅·임시 빌드 문제는 무시하라"고 못박듯, 무엇을 저장할지만큼 무엇을 버릴지를 선언적으로 정한다. 기억이 쓰레기로 오염되는 걸 막는 가장 값싼 장치.
에이전트를 "프롬프트 파일(자유 형식) + 기억이 무엇을 뽑을지 알려주는 작은 JSON"으로 나눴다. 게다가 그 JSON은 부서→직무로 겹쳐지는(nesting) 구조라, 공통 설정은 위에서 한 번만 쓴다. 설정을 계층으로 상속시키는 깔끔한 예.
한 CLI가 5개 하네스를 지원하려고 각기 다른 방식(플러그인 vs MCP vs 스킬 vs Python 툴)으로 분기한다. 특히 기존 JSON 설정을 덮어쓰지 않고 읽어서 병합하는 멱등(idempotent) 패턴은 로컬 설정을 건드리는 모든 CLI가 배워야 할 습관이다.
lint-bank-templates.mjs가 40여 개 설정 파일의 스키마·폐기 필드를 CI처럼 강제한다. 데이터가 코드보다 많은 저장소에서 데이터의 일관성을 기계로 지키는 좋은 예.
| 항목 | 요구 |
|---|---|
| 기본 | Node.js (npx 실행 가능) |
| 기억(필수) | 도달 가능한 Hindsight 인스턴스 — 클라우드(api.hindsight.vectorize.io) 또는 셀프호스팅. 공개 URL 필요(문서 왈 "Claude는 localhost에 접근 못 함") |
| Claude Code 하네스 | Claude Code CLI(npm i -g @anthropic-ai/claude-code) |
| 기타 하네스 | 각각 OpenClaw / NemoClaw / Hermes 설치본 |
① Claude Chat/Cowork 경로는 자동 기억 캡처가 없다 — 모델이 스스로 저장하기를 "기억"해야 한다. ② Claude Code의 기억 뱅크는 cwd(현재 폴더)에 묶인다 — 폴더를 옮기면 조용히 다른 뱅크가 생긴다(CLI가 경고는 해준다). ③ shallow clone에는 LICENSE 파일이 없다 — README 배지와 package.json은 MIT라고 표기.
engineering/workflow/code-reviewer.md를 열어 프런트매터·미션·체크리스트가 어떻게 나뉘는지 표로 정리한다. 그리고 "이 파일에서 LLM에게 실제로 지시하는 문장"과 "메타데이터"를 색으로 구분해 본다.
engineering/bank-template.json의 retain_mission·observations_mission·mental_models를 그대로 베껴, "나의 사이드 프로젝트 코드베이스"용 기억 스키마를 하나 만든다. 무엇을 저장하고 무엇을 무시할지 3줄로 정의해 본다.
빈 폴더에 my-agent.md(간단한 페르소나) + bank-template.json을 만들고 npx @vectorize-io/self-driving-agents install ./my-agent --harness claude-code --empty로 설치. CLI가 ~/.hindsight/에 무엇을 써넣는지 관찰한다.
지식 페이지 하나를 골라, 그 source_query가 무엇이면 좋을지 직접 써본다. "이 문서는 어떤 질문의 최신 답변인가?"를 5개 페이지에 대해 채우면, 기억이 문서로 응결되는 감각이 잡힌다.
src/cli.ts에서 하네스별 분기(claude / claude-code / openclaw / hermes)를 찾아, 각 경우가 어떤 파일을 어디에 쓰는지 흐름도로 그린다. 특히 기존 JSON 설정을 병합하는 부분을 찾아 "덮어쓰기가 아니라 병합"인 이유를 설명해 본다.
| 주차 | 주제 | 할 것 |
|---|---|---|
| 1주차 | 에이전트 스킬의 기본 | Claude Code / Cowork의 "스킬(SKILL.md)" 구조를 익히고, 이 저장소의 src/skill/SKILL.md를 그 렌즈로 읽기 |
| 2주차 | 에이전트 메모리 개념 | 단기(컨텍스트) vs 장기(외부 저장) 기억의 차이, "회상(recall)→행동→저장(retain)" 루프. Hindsight의 Memories/Pages 모델을 정리 |
| 3주차 | RAG와 지식 재생성 | 임베딩·검색 기반 RAG와 이 저장소의 "source_query로 페이지 재생성" 방식 비교. 언제 무엇이 유리한가 |
| 4주차 | MCP / 플러그인 훅 | Claude Code의 SessionStart·Stop 등 수명주기 훅과 MCP 툴 등록(Hermes의 Python 플러그인)을 직접 만들어 보기 |
| 5주차 | CLI 설계 · 멱등 설정 | @clack/prompts로 대화형 CLI 만들기 + 로컬 JSON 설정을 안전하게 병합(멱등)하는 패턴 구현 |
| 6주차 | 멀티 에이전트 오케스트레이션 | agents-orchestrator.md의 "QA 게이트 + 재시도 루프"를 실제 하위 에이전트 호출로 구현해 보기 |