플러그인
claude-octopus는 같은 문제를 여러 AI에게 맡기고, 서로 다른 결과를 검토·통합하는 절차를 Claude Code에 붙이는 플러그인입니다. 조사, 요구사항 정의, 구현, 검증을 명령과 스킬로 제공하며 외부 CLI 또는 API로 모델을 호출합니다.
저장소 설명의 요지는 “같은 조사·설계·코딩 과제를 여러 모델에 맡기고, 출시 전에 의견 차이를 드러내자”입니다. 소스에서는 이 목표가 scripts/lib/workflows.sh의 단계별 함수, scripts/lib/run-contract.sh의 실행 기록, scripts/lib/council.sh의 심의 규칙으로 나뉩니다.
한 사람은 초안을 쓰고, 다른 사람은 빠진 조건을 찾고, 또 다른 사람은 위험을 검토합니다. 진행자는 누가 실제로 자료를 읽었는지, 누가 답변에 실패했는지, 어느 지적이 해결됐는지 기록합니다.
claude-octopus에서 AI 제공자는 전문가, 페르소나는 역할 지침, 오케스트레이터는 진행자입니다. 모델이 여러 개라는 사실만으로 회의가 좋아지지는 않습니다. 발언을 받아들일 조건과 결론을 내릴 절차가 필요합니다.
| 사용자 명령 | 내부 단계 | 소스에서 찾아볼 함수 | 남기는 결과 |
|---|---|---|---|
/octo:discover | 조사 · probe | probe_discover() | 관점별 조사와 종합 문서 |
/octo:define | 정의 · grasp | grasp_define() | 문제·요구사항 합의 문서 |
/octo:develop | 구현 · tangle | tangle_develop() | 격리된 변경과 검증 기록 |
/octo:deliver | 검증·전달 · ink | ink_deliver() | 리뷰와 전달용 결과 |
네 함수는 scripts/lib/workflows.sh에 있습니다. 전체 순서를 묶는 함수는 embrace_full_workflow()입니다. 문서가 부르는 Double Diamond는 문제를 넓게 탐색한 뒤 좁히고, 해결책도 넓게 검토한 뒤 좁히는 흐름을 뜻합니다.
README는 외부 제공자 없이 Claude만으로 시작할 수 있다고 설명합니다. 다만 다른 회사 모델의 독립적인 의견을 얻으려면 해당 제공자의 실행 도구와 인증이 필요합니다. 설치 가능한 연결 종류와 지금 사용할 수 있는 연결은 구분해야 합니다.
이 저장소에서 배울 핵심은 AI를 많이 호출하는 법보다, 호출 결과를 믿을 조건을 프로그램으로 표현하는 법입니다.
명령 하나를 자동화해 본 경험이 있다면, 이 코드에서 동시 실행·상태 관리·프로세스 종료·플러그인 배포가 서로 연결되는 모습을 볼 수 있습니다. LLM 학습이나 GPU 프로그래밍 지식은 출발 조건이 아닙니다.
2026-10-23 GitHub 기준 스타 4,289개, 포크 404개이며 GitHub Trending Shell Monthly 13위로 선정됐습니다. 2026-01-15에 만들어졌고 최신 릴리스는 2026-10-22의 v11.15.0입니다. 이 수치는 관심도를 보여 주지만 실제 정확도나 도입 효과를 측정한 실험은 아닙니다.
AI가 그럴듯한 설명을 생성해도 요구사항을 빠뜨리거나 없는 코드를 인용할 수 있습니다. 이 프로젝트는 독립적인 리뷰, 반론, 실행 결과 확인을 하나의 작업 흐름에 넣습니다. 특히 council_response_quote_verification_json()은 답변이 인용한 코드가 근거 파일이나 검토 대상 diff에 실제로 있는지 검사합니다.
이 함수는 scripts/lib/council.sh에 있으며 인용 주변의 코드와 파일 내용을 공백 정규화 후 비교합니다. 특정 길이·근접 범위의 인용을 검사하는 규칙 기반 장치이므로 답변 전체의 진실성을 증명하지는 않습니다. 그래도 “파일 경로가 존재한다”보다 강한 검증을 시도한다는 점이 학습할 만합니다.
이름이 다른 세 에이전트가 같은 모델을 사용하면 같은 실수를 반복할 수 있습니다. Council 집계 코드는 응답 수와 함께 승인한 모델 계열의 다양성을 봅니다. 표준·심화 설정에서 필요한 독립 승인 계열 수가 모자라면, 응답이 여러 개여도 정족수를 통과하지 못할 수 있습니다.
같은 참고서를 복사한 세 명의 답안보다 서로 다른 자료를 확인한 두 명의 답안이 유용할 수 있습니다. 페르소나를 바꾸는 일과 정보원의 독립성을 확보하는 일은 별개입니다.
Claude Code에서는 슬래시 명령과 스킬로, MCP 클라이언트에서는 도구 호출로 접근합니다. 두 경로가 같은 scripts/orchestrate.sh를 이용하므로 기존 CLI를 버리고 새 웹 서비스로 옮겨야 하는 구조는 아닙니다. 실제 사용 가능 범위는 호스트·인증·제공자별 기능에 달려 있습니다.
| 비교 대상 | 중심 작업 방식 | claude-octopus에서 추가로 얻는 것 | 대가 |
|---|---|---|---|
| Claude Code 기본 흐름 | 현재 호스트가 조사·구현·리뷰 | 외부 제공자 의견과 명시적인 심의 절차 | 추가 호출의 지연·인증·비용 관리 |
| Codex 같은 단일 코딩 CLI | 선택한 실행기의 도구로 작업 | 여러 실행기를 연결하고 결과를 통합하는 계층 | 기존 CLI의 오류와 버전 변화도 관리 |
| 여러 채팅 창 수동 비교 | 사람이 같은 질문을 복사하고 비교 | 역할·결과 파일·실패 상태·검증 조건의 일관성 | 절차 설정과 결과 해석을 배워야 함 |
| 직접 만든 병렬 호출 스크립트 | 여러 요청을 동시에 실행 | 상태 전이, 실행 계획, 격리, 근거 확인의 구현 사례 | 큰 코드베이스를 이해해야 함 |
위 표는 작업 방식의 차이를 비교한 것입니다. 특정 제품의 최신 전체 기능이나 성능 순위를 비교한 표는 아닙니다. README 역시 일상적인 요청에는 Claude 기본 기능을 쓰고, 독립 의견이나 더 엄격한 검토가 필요할 때 Octopus를 쓰도록 안내합니다.
이 프로젝트의 매력은 한 모델의 답을 다른 관점과 대조하고, 그 과정에서 생긴 실패와 이견을 기록한다는 데 있습니다.
| 문서 표현 | 커밋 286ef4d의 실제 확인 결과 | 독자가 배울 점 |
|---|---|---|
| README 기준 외부 통합 12종 | 레지스트리 식별자는 24개. 호스트·SDK·API·호환 어댑터도 포함 | 통합 제품 수, 어댑터 수, 독립 모델 수는 서로 다름 |
| README의 MCP SDK 1.31.0 갱신 소식 | mcp-server/package.json은 1.32.0 | 실제 선언 버전은 의존성 파일로 확인 |
| 75% 합의 게이트 | Tangle은 작업 성공률과 추가 조건을, Council은 별도의 심의 규칙을 사용 | 홍보 문구 하나를 모든 경로의 알고리즘으로 읽지 않기 |
| 31 페르소나·54 명령·63 스킬 | 페르소나 파일 수와 플러그인 선언 수가 이 수치에 맞음 | 등록된 개수와 실제 동작 검증은 구분 |
여러 모델의 교차 검토, 기존 CLI 재사용, 근거 검증은 관심을 설명할 수 있는 설계상의 강점입니다. 실제 유입 원인이나 단일 모델 대비 오류 감소율은 이 수치와 정적 코드 확인만으로 알 수 없습니다.
루트 package.json의 main은 scripts/orchestrate.sh입니다. 루트 패키지에 런타임 dependencies 항목이 없고 devDependencies도 빈 객체입니다. 그렇다고 의존성이 없는 것은 아닙니다. Bash·Git·jq·Python·Node와 선택한 외부 CLI가 실행 환경을 이룹니다.
| 기술 | 실제 파일·설정 | 담당하는 일 |
|---|---|---|
| Bash | scripts/orchestrate.sh, scripts/lib/*.sh | 명령 해석, 단계 실행, 제공자 선택, 재시도, 상태·결과 연결 |
| jq | scripts/lib/run-contract.sh, scripts/lib/dispatch-plan.sh | JSON 검증·생성·집계. 단순 문자열 결합 대신 구조를 다룸 |
| Python 3 | shared/process_supervisor.py | 시간·출력 제한과 프로세스 그룹 종료를 제공하는 공용 보조 계층 |
| Git | tangle_prepare_run_worktree() | 기준 커밋 고정, 별도 브랜치·worktree 생성, 변경 증거 확인 |
| JSON·JSONL | seats.jsonl, seats.json, run.json | 실행 이력과 현재 상태를 파일로 보관 |
| Markdown·YAML | commands/, skills/, config/workflows/ | 사용자 명령, 역할 지침, 작업 절차를 설명·선언 |
검사한 파일 목록에 Cargo.toml, go.mod, pyproject.toml, Dockerfile은 없습니다. 핵심 실행 경로를 Rust 서버·Go 서비스·컨테이너 앱으로 이해하면 코드 지도가 어긋납니다.
| 패키지·설정 | 선언 값 | 해석 |
|---|---|---|
| 루트 패키지 | 11.15.0 · Node >=18 | 프로젝트 배포 버전과 엔진 선언 |
| MCP 패키지 | 1.0.0 · type: module | 플러그인과 별도로 관리되는 어댑터 패키지 버전 |
@modelcontextprotocol/sdk | 1.32.0 | MCP 도구 등록과 표준 입출력 통신 |
zod | 3.25.67 | 도구 입력의 타입·범위·선택지 선언 |
typescript · tsx | ^5.7.0 · ^4.19.0 | 컴파일과 개발 실행을 위한 범위 선언 |
@types/node | ^22.0.0 | 개발 시 Node API 타입 정보. 실제 Node 버전과는 별개 |
| TypeScript 설정 | ES2022, Node16, strict: true | mcp-server/tsconfig.json의 대상·모듈·타입 검사 설정 |
버전은 mcp-server/package.json 기준입니다. ^가 붙은 값은 정확한 설치 버전이 아니라 허용 범위입니다. 저장소에 npm·pnpm·Yarn 잠금 파일은 없으므로 이 선언만으로 모든 전이 의존성의 실제 설치 버전을 고정할 수 없습니다.
핵심 제품에 React·Vue 기반 웹 프론트엔드는 없습니다. 사용자는 Claude Code의 대화·슬래시 명령, 외부 MCP 클라이언트, 터미널 출력으로 상호작용합니다. hooks/octopus-hud.mjs는 ANSI 색상으로 상태줄을 구성하고 작업 단계·비용·사용량 등을 표시하는 Node 코드입니다.
이 HUD의 설정에는 사용량 캐시 60_000ms, API 시간 제한 8000ms, 버전 확인 캐시 3_600_000ms가 있습니다. 주석에 적힌 응답 속도는 작성자의 설명이며 독립적인 성능 측정값으로 읽으면 안 됩니다.
별도 도구인 scripts/token-extraction/은 UI 디자인 토큰을 추출합니다. 이 패키지는 glob ^10.3.10, tinycolor2 ^1.6.0, 개발용 typescript ^5.3.3·vitest ^4.0.18을 선언합니다. Tailwind나 CSS 변수를 분석한다는 사실이 이 프로젝트 자체가 Tailwind 웹 앱이라는 뜻은 아닙니다.
Makefile의 sync는 README 동기화, 마켓플레이스 정보 생성, Factory용 스킬 생성 작업을 묶습니다. sync-check는 생성물이 최신인지 검사하고, ci-local은 여기에 스모크·전체 단위·통합 테스트를 연결합니다. 이름만 보고 명령을 실행하기보다 각 타깃이 무엇을 바꾸는지 먼저 읽어야 합니다.
.github/workflows/test.yml에는 Linux·macOS 스모크 테스트, 변경 범위에 따른 단위 테스트, 별도 Council 테스트, 심볼릭 링크 경로 검사, 패키지 무결성 검사가 있습니다. 이식성 검사에서는 Bash 4 전용 연관 배열과 nameref를 제한하고 GNU 전용 sed 사용도 찾습니다.
다른 워크플로인 .github/workflows/claude-octopus.yml의 수동 실행 작업은 Node 22, Claude Code 2.1.228을 지정합니다. 이는 그 CI 작업의 실행 버전이며 모든 사용자 환경의 최소 요구사항과 같은 수치는 아닙니다.
| 종류 | 파일 수 | 물리적 줄 수 | 읽을 때의 주의점 |
|---|---|---|---|
Shell · .sh | 704 | 206,963 | tests/만 115,295줄. 실행 코드만의 크기가 아님 |
| TypeScript | 42 | 11,227 | .ts·.mts·.tsx, 타입 선언 포함 |
| JavaScript | 6 | 2,135 | .js·.mjs·.cjs |
| Python | 52 | 17,333 | 보조 도구와 테스트 포함 |
| Markdown | 394 | 92,008 | 설명서뿐 아니라 실행 지침으로 쓰이는 스킬 포함 |
커밋 286ef4d의 Git 추적 파일 1,415개를 대상으로 확장자별 물리적 줄을 셌습니다. 빈 줄·주석·테스트·vendors/를 포함하고, dist/ 경로와 Git 내부 파일은 제외했습니다. 확장자가 없는 bin/ 실행 파일은 Shell 수치에 넣지 않았습니다. 따라서 순수 구현량이나 테스트 커버리지 수치가 아닙니다.
언어 비중보다 중요한 구분은, Bash가 실행을 맡고 TypeScript가 연결을 맡으며 파일 기반 기록이 둘 사이의 결과를 남긴다는 점입니다.
도식은 주요 책임의 연결을 단순화한 것입니다. 모든 명령이 네 단계를 전부 거치지는 않습니다. 예를 들어 Council은 별도 심의 흐름이며, 진단 명령 일부는 scripts/orchestrate.sh의 초반 분기에서 무거운 작업 라이브러리를 로드하기 전에 처리됩니다.
mcp-server/src/index.ts의 runOrchestrate()는 작업 로직을 새로 구현하지 않습니다. 명령·프롬프트·프로젝트 경로·플래그를 받아 셸 진입점에 전달합니다. MCP 도구 octopus_develop은 내부 명령 tangle로 연결됩니다.
// runOrchestrate()의 핵심 부분을 발췌·축약
const args = [...flags, command, ...postFlags, prompt];
const effectiveProjectRoot = await validateProjectRoot(projectRoot);
const { stdout, stderr } = await executor(ORCHESTRATE_SH, args, {
cwd: effectiveProjectRoot,
timeout: 300_000,
env: { /* 전달할 환경변수를 구성 */ },
});
핵심은 execFile에 실행 파일과 인자 배열을 따로 넘긴다는 점입니다. 프롬프트를 셸 명령문에 이어 붙이는 방식보다 셸 재해석 경계를 줄일 수 있습니다. 전역 플래그를 명령 앞에, 하위 명령 플래그를 뒤에 놓는 규칙도 이 함수가 책임집니다.
shared/adapter-runtime.mjs의 validateProjectRoot()는 절대 경로를 요구하고, 실제 경로를 해석하고, 디렉터리인지 검사하며 파일시스템 루트는 거부합니다. 다만 이 검사는 “허용된 프로젝트 목록”을 구현한 것은 아닙니다. 접근 가능한 다른 디렉터리까지 모두 격리하는 샌드박스로 오해하면 안 됩니다.
입력은 Zod 스키마로 설명하지만 내부 콜백의 ToolParams는 Record<string, any>입니다. strict: true 설정만으로 모든 내부 값의 타입 안전성이 자동 보장되는 것은 아니라는 점도 눈여겨볼 만합니다.
scripts/lib/provider-registry.sh는 제공자 ID·별칭·명령·조직·기능을 하나의 표로 관리합니다. octo_provider_canonical()은 정확한 ID를 우선하고, 별칭을 확인한 뒤 가장 긴 ID 접두어를 선택합니다. 덕분에 claude-sdk-*가 더 짧은 claude로 잘못 해석되는 일을 피합니다.
# octo_provider_registry_rows()의 행 형식
# ID | 별칭 | 실행 명령 | 조직 | 지원 기능
codex|openai,gpt*|codex|openai|model-config,council,health,detect,dispatch,env
claude-sdk|claude-agent*|claude-agent|anthropic|model-config,health,detect,dispatch,env
정체성 표와 별도로 octo_provider_runtime_rows()에는 인증 방식·상태 확인 함수·모델 환경변수·컨텍스트 예산·격리 분류 등이 있습니다. 두 표의 ID가 맞아야 하는 계약을 두어 연결 정보를 한쪽에만 추가하는 실수를 찾습니다.
scripts/lib/dispatch-plan.sh의 octo_dispatch_plan_create()는 선택 결과를 JSON으로 고정합니다. 요청 모델과 해석된 모델, 선택 출처, 프로젝트·플러그인 경로, 도구 정책, 인자 배열, 입력·출력 예산, 마감 시각을 함께 기록합니다.
// 실행 계획의 필드 구조를 설명하기 위한 축약 예시
{
"schema_version": 1,
"provider": "codex",
"selection_source": "resolved-policy",
"argv": ["codex", "..."],
"environment_names": ["OPENAI_API_KEY"],
"credential_names": ["OPENAI_API_KEY"],
"budgets": { "available_input_tokens": 12000 },
"deadline_epoch": 0
}
이 예시는 실제 실행 결과가 아니라 필드 구조의 요약입니다. 코드가 기록하는 것은 자격증명 이름이며 값은 아닙니다. 인자에 자격증명 대입이 섞인 경우도 거부합니다. 실제 환경변수 전달은 별도 계층에서 구성합니다.
scripts/lib/command-argv.sh의 octo_dispatch_command_to_argv()는 제한된 명령 문자열의 따옴표와 공백을 직접 해석해 배열로 돌려줍니다. 여기서는 eval이나 명령 치환을 수행하지 않습니다. “사용자 요청 → 문자열 → 다시 셸 실행”의 위험을 줄이려는 설계입니다.
레지스트리가 기사 명단이라면 실행 계획은 배차표입니다. 누가 어떤 차량으로 어디까지 갈지 정한 뒤 배차표를 공유하면, 동기 실행과 백그라운드 실행이 각각 다른 결정을 내려 버리는 일을 줄일 수 있습니다.
scripts/lib/run-contract.sh는 스키마 버전 10.0의 실행 계약을 정의합니다. 각 모델의 한 번의 참여를 seat로 추적하며 octo_run_transition_valid()가 허용된 상태 이동을 검사합니다.
run_contract_transition()은 output_received·validated로 전이할 때 출력 파일의 사용 가능 여부를 확인합니다. 공백뿐인 파일과 단순 가용성 응답은 거부하며, validated에는 contribution=eligible도 요구합니다. contributed로 가려면 이전 기록도 참여 자격을 갖고 있어야 합니다. 단순히 프로세스가 종료됐다는 이유로 성공적인 기여가 되지는 않습니다.
결과 사용 여부는 run_contract_contribution_eligible()로 따로 판단합니다. 정상 기여 외에 degraded이면서 eligible-with-warning인 경우도 허용할 수 있습니다. 따라서 “경고 있음”과 “사용 불가”도 같은 상태가 아닙니다.
| 파일 | 내용 | 배울 점 |
|---|---|---|
seats.jsonl | 상태 변경을 한 줄씩 남긴 원장 | 이전 판단을 보존하고 마지막 기록으로 상태를 계산 |
seats.json | 참여자별 최신 상태의 스냅샷 | 조회할 때 전체 이력을 매번 해석할 부담을 줄임 |
run.json | 실행 단위의 상태 문서 | 상태 화면과 설명 기능의 공통 자료 |
*.recovery | 중단된 갱신의 복구 표식 | 원장과 스냅샷이 섞인 세대를 그대로 믿지 않기 |
갱신에는 잠금을 사용하며, 원장과 스냅샷의 일치 여부를 확인하고 필요하면 되돌리거나 다시 만듭니다. 작은 파일 시스템 위에 트랜잭션과 비슷한 문제를 직접 해결한 사례입니다. 데이터베이스 수준의 모든 내구성 보장을 제공한다고 확대해서 읽을 필요는 없습니다.
프로세스가 끝났다는 사실, 출력이 있다는 사실, 결과를 종합에 쓸 수 있다는 판단을 각각 분리해야 자동화의 실패가 드러납니다.
scripts/lib/parallel.sh의 fan_out()은 같은 요청을 여러 제공자에게 분배합니다. aggregate_results()는 결과를 모으고 품질 신호로 정렬합니다. 결과가 둘 이상이고 종합 실행기를 사용할 수 있으며 모의 실행이 아닐 때 모델 종합을 시도하고, 조건이 맞지 않거나 모델 종합에 실패하면 단순 결합 결과를 남깁니다. 종합 요청에는 겹치는 내용을 합치되 짧은 소수 의견과 충돌도 보존하라는 지침이 들어 있습니다.
구현 단계는 동시에 파일을 고치는 문제가 추가됩니다. tangle_develop()은 기본적으로 tangle_prepare_run_worktree()에서 원본 HEAD 커밋을 기준으로 octopus/run/실행ID/integration 브랜치와 별도 worktree를 만듭니다. 원본 작업 경로의 미커밋 변경을 차단하는 검사는 OCTOPUS_TANGLE_REQUIRE_CLEAN_BASELINE=true로 켜는 선택 사항입니다. PROJECT_ROOT를 그 경로로 바꿔 실행한 뒤 원래 위치로 복원합니다.
# tangle_prepare_run_worktree()의 실제 생성 명령
git -C "$source_root" worktree add -b "$TANGLE_RUN_BRANCH" \
"$TANGLE_RUN_WORKTREE" "$source_commit"
완료하거나 실패한 뒤에도 이 실행용 브랜치와 worktree를 검토용으로 보존하는 코드가 있습니다. worktree는 충돌을 줄이는 작업 경로 분리이며 별도의 저장소 전체 복사나 운영체제 보안 샌드박스와 같은 개념은 아닙니다.
프로세스에도 경계가 필요합니다. shared/process_supervisor.py의 run_bounded_process()는 OpenAI 호환 에이전트 보조 도구와 라우팅 미리보기에서 사용됩니다. POSIX에서는 새 세션을 만들고, 시간 초과 시 그룹에 SIGTERM을 보낸 뒤 유예 시간이 지나면 SIGKILL을 보냅니다. 출력 제한과 자식이 파이프를 계속 잡는 상황도 다룹니다.
모든 호출이 이 Python 함수를 통과하는 것은 아닙니다. 셸 제공자 실행에는 별도의 시간 제한 경로가 있으며, scripts/lib/agent-sync.sh는 제한 시간을 강제할 수 없는 호스트 팀 실행 대신 감독 가능한 하위 프로세스를 고르는 조건도 둡니다.
scripts/lib/testing.sh의 validate_tangle_results()는 최신 결과 상태가 성공이고 차단 사유가 없는 하위 작업을 셉니다. 기본 성공률은 다음 정수 계산에서 시작합니다.
# validate_tangle_results()에서 발췌
local total=$((success_count + fail_count))
local success_rate=0
[[ $total -gt 0 ]] && success_rate=$((success_count * 100 / total))
4개 중 3개가 성공하면 75%입니다. 이것은 “답변이 맞을 확률 75%”가 아닙니다. 수정 결과가 적용된 뒤 유효 성공률을 다시 계산하는 경로가 있고, 명시한 파일의 누락이나 구현 요청인데 변경이 없는 경우 같은 별도 조건이 통과를 막을 수 있습니다.
scripts/lib/quality.sh의 기본 단계 임계치는 조사 50, 정의 75, 구현 75, 전달 80, 보안 100입니다. get_gate_threshold()는 보안 설정을 100 아래로 낮추려 하면 100으로 올립니다. 임계치 100 역시 무결점 보안의 증명이 아니라 해당 절차의 통과 기준입니다.
Council은 또 다릅니다. 응답·최종 판정·독립 승인 계열·근거 상태를 집계하고, council_scan_veto_artifacts()는 거부권을 가진 페르소나의 중대 위험 선언을 찾습니다. 정족수를 통과해도 의장 종합이 없으면 chair_synthesis_available로 별도 표시합니다. 하나의 퍼센트만으로 이 모든 판단을 설명할 수 없습니다.
위 트리는 핵심 경로를 고른 요약입니다. Markdown 파일이 많지만 모두 일반 설명서는 아닙니다. commands/embrace.md처럼 호스트가 따라야 할 절차와 실행 명령을 담은 문서도 있고, agents/personas/처럼 모델에 주입하는 역할 지침도 있습니다.
| 읽는 순서 | 예시 | 확인할 질문 |
|---|---|---|
| 명령의 약속 | commands/embrace.md | 사용자가 기대하는 단계와 승인 방식은 무엇인가? |
| 실제 분기 | scripts/orchestrate.sh | 어떤 내부 명령과 함수에 연결되는가? |
| 작업 구현 | scripts/lib/workflows.sh | 이전 단계의 어떤 파일을 읽고 어디서 중단하는가? |
| 실행과 판정 | scripts/lib/agent-sync.sh·scripts/lib/testing.sh | 시간 초과·실패·성공을 어떻게 구분하는가? |
| 회귀 방지 | tests/unit/test-tangle-run-worktree.sh | 어떤 실패 상황을 다시 만들도록 되어 있는가? |
처음부터 모든 파일을 정독할 필요는 없습니다. scripts/orchestrate.sh는 3,386줄이고 scripts/lib/workflows.sh는 6,941줄입니다. 이름 검색으로 진입 함수를 찾고 그 함수가 읽는 파일과 호출하는 함수를 따라가는 편이 이해하기 쉽습니다.
.claude-plugin/marketplace.json은 scripts/sync-marketplace.sh가 생성하고, scripts/sync-readme.py는 README들과 PRODUCT.md의 현재 정보 동기화를 담당합니다. 수정할 대상이 원본인지 생성물인지 구분하지 않으면 다음 동기화 때 변경이 사라집니다.
명령·스킬·페르소나는 여러 개여도 공통 제공자 선택, 실행 계획, 상태 기록 계층을 재사용합니다. 폴더 수보다 책임이 어디에서 공유되는지를 찾으면 구조가 간결하게 보입니다.
scripts/lib/command-argv.sh는 따옴표와 공백을 인자 배열로 바꾸고, scripts/lib/dispatch-plan.sh는 배열을 JSON으로 직렬화합니다. 셸의 문자열은 공백 분리·와일드카드 확장·명령 치환을 만날 수 있으므로 “잘 출력된다”만으로 안전한 전달이 검증되지는 않습니다.
# 인자 경계를 보존하는 기본 형태를 익히는 학습용 예시
args=("첫 번째 인자" "공백 있는 파일.md" "별표 * 를 포함한 문장")
printf '[%s]\n' "${args[@]}"
배울 것: "${args[@]}", 종료 코드, 파이프라인 실패, 표준 출력과 표준 오류 분리입니다. 작은 연습: 공백·따옴표·별표가 들어간 입력 다섯 개를 적고, 배열과 하나의 문자열로 전달할 때 인자 개수가 어떻게 달라질지 예상해 보세요.
scripts/lib/utils.sh의 json_extract_multi()는 Bash 4.3의 nameref 대신 printf -v를 씁니다. 최신 문법을 아는 것과 지원할 환경에서 동작하는 문법을 고르는 것은 다른 능력입니다.
runOrchestrate()는 마지막 인자로 실행 함수 executor를 받으며 기본값은 비동기 execFile입니다. 테스트에서는 이를 가짜 함수로 바꿔 실제 AI나 셸을 호출하지 않고도 명령 인자·현재 디렉터리·환경변수를 관찰할 수 있습니다.
tests/unit/test-mcp-server.sh에는 서로 다른 두 프로젝트 호출을 함께 만들고, 각 호출의 cwd와 OCTOPUS_PROJECT_DIR가 섞이지 않는지 확인하는 사례가 있습니다. 이는 함수 내부 코드 모양보다 “각 요청이 자기 프로젝트에 묶인다”는 동작 계약을 검사합니다.
작은 연습: 실행 함수가 받은 파일명·인자·작업 경로를 배열에 저장하게 설계하세요. 반환값을 성공·예외로 바꾸면서 호출자가 오류를 어떻게 표시해야 하는지 표로 정리하면 좋습니다.
어떤 CLI는 다시 셸이나 다른 실행기를 띄웁니다. 부모만 종료하면 자식이 남아 비용을 쓰거나 출력 파이프를 계속 잡을 수 있습니다. shared/process_supervisor.py는 start_new_session, os.killpg(), time.monotonic()을 사용해 시간과 프로세스 그룹을 함께 다룹니다.
배울 것: 벽시계와 단조 시계의 차이, 정상 종료 요청과 강제 종료의 차이, 출력 상한의 필요성입니다. 작은 연습: “부모 종료·자식 생존·파이프 열림” 상황을 종이에 그려 보고 누가 어떤 자원을 닫아야 하는지 표시하세요.
브랜치는 커밋을 가리키는 이름이고 worktree는 파일을 실제로 펼쳐 놓은 작업 경로입니다. tangle_prepare_run_worktree()는 두 가지를 함께 만듭니다. 기준 커밋을 고정해야 나중에 “이번 실행이 무엇을 바꿨는가?”를 비교할 수 있습니다.
작은 연습: 원본 경로·기준 SHA·실행 브랜치·실행 경로를 네 칸으로 나누고 같은 실행을 표현해 보세요. 실행 실패 후에도 브랜치를 남기는 이유를 복구와 검토 관점에서 설명하면 이해한 것입니다.
scripts/lib/run-contract.sh는 JSONL 기록을 참여자 ID별로 모아 최신 상태를 만듭니다. 현재 상태만 덮어쓰면 “왜 실패했는가?”의 순서가 사라집니다. 반대로 이력만 있으면 현재 상태를 찾는 비용이 커집니다. 원장과 스냅샷은 서로 다른 질문에 답합니다.
작은 연습: 한 참여자의 상태가 세 번 바뀌고 다른 참여자가 두 번 바뀐 다섯 줄짜리 기록을 만드세요. ID별 마지막 줄만 선택하는 로직을 직접 작성하고 입력 순서를 바꾸면 무엇이 달라지는지 살펴보세요.
shared/adapter-runtime.mjs의 providerEnvironment()는 허용된 제공자 환경변수 이름을 골라 전달합니다. MCP 쪽에서는 일부 Octopus 설정 접두어도 전달하되 샌드박스·자율성 등에 관한 네 변수는 별도 차단합니다. 제공자 자격증명 목록과 전체 환경을 그대로 복사하는 동작은 다릅니다.
scripts/lib/validation.sh의 wrap_untrusted_content()는 외부 문서를 신뢰할 수 없는 분석 대상으로 표시합니다. 이 표식은 모델에게 주는 지침이지, 운영체제 권한을 제한하는 기술은 아닙니다. 모델 지침, 파일 경로 검증, 실제 실행 권한은 각각 확인해야 합니다.
커밋 286ef4d는 세션 자동 메모리가 프로젝트 worktree에 들어가지 않도록 고칩니다. hooks/helpers/claude-project-memory.sh의 octo_claude_project_memory_dir()는 프로젝트 경로를 인코딩해 Claude 설정 영역의 해당 프로젝트 메모리 경로를 찾습니다.
# 공용 경로 함수의 핵심 부분 발췌
local project="${CLAUDE_PROJECT_DIR:-$PWD}"
local config_root="${CLAUDE_CONFIG_DIR:-${HOME}/.claude}"
encoded="${project//[^a-zA-Z0-9]/-}"
memory_dir="$config_root/projects/$encoded/memory"
함수는 이미 존재하며 읽고 탐색할 수 있는 디렉터리만 반환합니다. hooks/session-end.sh는 쓰기 가능 여부도 확인하고, hooks/session-start-memory.sh는 같은 함수를 써서 읽습니다. 읽기와 쓰기가 서로 다른 경로 규칙을 갖지 않도록 한 것입니다.
tests/unit/test-session-auto-memory-path.sh는 메모리 경로가 없을 때, 다른 프로젝트만 있을 때, 사용자 지정 설정 경로가 있을 때, 접근 권한이 부족할 때를 다룹니다. 작은 경로 버그도 개인정보와 저장소 오염 문제로 이어질 수 있다는 사례입니다.
commands/embrace.md와 스킬 파일은 실행 순서를 명령형 문장으로 강하게 지시합니다. 그러나 문서가 “반드시”라고 적었다고 셸 함수에 같은 방어 조건이 자동으로 생기지는 않습니다. 단계별 결과 파일의 존재를 검사하는 코드처럼 실제 경계에서 강제하는 장치도 함께 찾아야 합니다.
작은 연습: 지침에서 규칙 하나를 골라 “누가 읽는가, 어디서 강제되는가, 실패 기록은 어디에 남는가” 세 질문에 답하세요. 강제 지점을 찾지 못하면 문서상의 약속이라고 표시하면 됩니다.
기술을 배운다는 것은 문법을 외우는 데서 끝나지 않고, 경계가 어긋나는 실패 상황을 설명할 수 있게 되는 것입니다.
| 항목 | 조건·근거 | 초보자 해석 |
|---|---|---|
| 운영체제 | README: Linux·macOS, Windows는 WSL 또는 원격 SSH 경로 | 네이티브 Git Bash·MSYS2·Cygwin은 지원 대상으로 설명하지 않음 |
| Bash | docs/CONTRIBUTING.md: 3.2+ | macOS 기본 Bash 계열까지 고려한 호환 문법 사용 |
| jq·Git | JSON 처리·상태 기록·worktree 생성에 사용 | Node만 있어도 모든 경로가 동작하는 구조가 아님 |
| Node.js | 루트·MCP 패키지: >=18 | 선언상 하한. MCP와 HUD, 개발 도구에 필요 |
| Python | python3 명령을 여러 보조 경로가 사용 | 중앙에 통일된 최소 부버전 선언은 확인되지 않음 |
| Claude Code | README 배지: v2.1.14+, CI 수동 작업: 2.1.228 | 기능별 호환 조건까지 동일한 것은 아님 |
| 외부 제공자 | README: 시작에는 선택 사항 | 독립 모델 교차 검토에는 선택한 제공자의 도구와 인증 필요 |
| 저장 공간 | 기록·결과·worktree를 보관하는 쓰기 가능한 경로 | 실행 수와 대상 프로젝트 크기에 따라 사용량 증가 |
네이티브 Windows 환경에서는 세션 훅 초반에 MINGW*·MSYS*·CYGWIN*를 확인하고 종료하는 코드가 있습니다. 공용 Python 코드에 Windows용 분기가 있다는 사실만으로 플러그인 전체의 네이티브 Windows 지원을 추론할 수는 없습니다.
저장소에 CPU 코어 수, 최소 RAM, 디스크 용량의 통일된 공식 수치는 없습니다. 따라서 “최소 8GB면 모든 작업 가능” 같은 수치를 요구사항으로 제시할 근거는 없습니다. 소스 읽기와 가짜 응답으로 하는 실습에는 모델 가중치를 올릴 필요가 없습니다.
| 학습·사용 방식 | 주요 자원 부담 | 판단 기준 |
|---|---|---|
| 소스 정독·정적 실습 | 편집기·텍스트 검색·작은 JSON 처리 | 일반적인 개발용 PC에서 시작 가능. AI용 GPU는 필요하지 않음 |
| 외부 CLI·API 호출 | CLI 프로세스·컨텍스트·네트워크·대상 빌드 | 모델 추론 자체는 외부에서 수행. 동시 작업 수와 대상 프로젝트가 부담을 결정 |
| Ollama 로컬 모델 | 모델 가중치·컨텍스트·동시 추론 메모리 | 모델 크기·양자화·CPU/GPU 구성에 따라 별도 산정 |
| 병렬 구현 | 여러 작업 경로·빌드·테스트 프로세스 | 오케스트레이터보다 각 프로젝트의 빌드가 더 무거울 수 있음 |
scripts/lib/quality.sh의 기본 동시 실행 수는 MAX_PARALLEL=3입니다. 이 값은 하드웨어 요구사항이나 모든 워크플로의 실제 참여자 수를 뜻하지 않습니다. 다른 흐름은 별도의 구성과 실행 경로를 사용합니다.
| 위치 | 기본 설정 | 주의할 해석 |
|---|---|---|
| 셸 공통 설정 | TIMEOUT=600 | 단계·역할·플래그가 적용되기 전의 기본값 |
| MCP 호출 | timeout: 300_000 | 호출자 쪽 300초 제한. 내부 작업보다 먼저 끝날 수 있음 |
| Python 공용 감독 함수 | 호출자가 timeout·output_limit 전달 | 보조 도구별 예산에 따라 달라짐 |
긴 작업이 중간에 끊기면 모델 품질부터 의심하기보다 바깥 호출자, 단계, 개별 제공자 중 어느 시간 제한에 걸렸는지 구분해야 합니다. 숫자 하나를 늘려도 다른 계층이 먼저 중단할 수 있습니다.
프로젝트 코드의 라이선스가 MIT라는 사실은 외부 모델 호출까지 무료라는 뜻이 아닙니다. 구독·API 과금·로컬 추론 자원은 제공자와 계정별로 달라집니다. 다중 호출과 재시도는 비용·지연을 늘릴 수 있습니다.
필요한 장비를 판단할 때는 Octopus 자체보다, 동시에 실행할 제공자와 대상 프로젝트의 빌드·추론 부담을 먼저 보아야 합니다.
아래 다섯 과제는 저장소를 읽거나 별도의 작은 학습 예제를 만드는 방식입니다. 실제 제공자 호출, 인증키, 자동 구현은 필요하지 않습니다. 각 과제의 통과 기준은 결과물이 무엇을 설명해야 하는지에 맞췄습니다.
목표: octopus_develop이 어떤 셸 명령과 구현 함수로 연결되는지 추적합니다. 저장소 루트에서 다음 검색으로 출발점을 찾으세요.
rg -n 'octopus_develop|runOrchestrate' mcp-server/src/index.ts
rg -n 'tangle_develop|tangle\)' scripts/orchestrate.sh
rg -n '^tangle_develop\(\)|^tangle_prepare_run_worktree\(\)' scripts/lib/workflows.sh
project_root가 어디에서 검증되고 cwd로 쓰이는지 표시합니다.결과물·통과 기준: 파일 경로를 포함한 한 장짜리 호출 지도입니다. “MCP가 구현을 직접 수행한다”가 아니라 실제 셸 진입점까지 이어져야 합니다.
목표: 단순 성공률과 최종 통과 조건이 다른 이유를 설명합니다. scripts/lib/testing.sh의 validate_tangle_results()를 참고해 다음 표를 채우세요.
| 상황 | 기본 성공률 | 추가 확인 |
|---|---|---|
| 4개 중 3개 성공 | 75% | 임계치와 파일·변경 조건도 확인 |
| 성공 2개·실패 1개 | 66% | 정수 나눗셈이므로 반올림한 67%가 아님 |
| 성공으로 표시했지만 차단 보고 포함 | 그 결과는 성공 수에서 제외 | 최신 상태 문자열만으로 성공을 확정하지 않음 |
| 모두 성공, 구현 변경 없음 | 계산상 100% 가능 | 구현 변경이 필요한 요청이면 별도 조건이 실패 가능 |
결과물·통과 기준: “성공률이 높아도 통과하지 않는 예” 두 가지와 근거 함수입니다. 이를 모델의 정확도·보안 확률과 혼동하지 않고 설명해야 합니다.
목표: octo_run_transition_valid()에서 배운 원리를 최소 예제로 옮깁니다. 다음 코드는 실제 저장소 구현을 대체하는 것이 아니라 상태 전이 검사의 축소 모형입니다.
allowed = {
(None, "planned"),
("planned", "starting"),
("starting", "authenticated"),
("authenticated", "running"),
("running", "output_received"),
("output_received", "validated"),
("validated", "contributed"),
("running", "failed"),
}
def can_move(before, after):
return (before, after) in allowed
assert can_move("planned", "starting")
assert not can_move("planned", "contributed")
assert not can_move("contributed", "running")
결과물·통과 기준: 상태 전이 표와 작은 검사기입니다. 정상 경로 외에 건너뛰기·종결 상태 재진입·빈 결과를 구분해 설명해야 합니다.
목표: 실제 셸 호출 없이 두 요청의 인자와 프로젝트가 섞이지 않는지 관찰합니다. runOrchestrate()의 실행 함수 주입 방식을 참고하되, 학습용 함수는 기록 배열에 넣고 즉시 반환하도록 만드세요.
// 네트워크나 프로세스 실행 없이 관찰하는 학습용 예시
type Call = { file: string; args: string[]; cwd: string };
const calls: Call[] = [];
async function recordExecution(call: Call) {
calls.push({ ...call, args: [...call.args] });
return { stdout: call.cwd, stderr: "" };
}
await Promise.all([
recordExecution({ file: "가짜실행기", args: ["probe", "질문 A"], cwd: "/example/a" }),
recordExecution({ file: "가짜실행기", args: ["ink", "질문 B"], cwd: "/example/b" }),
]);
/example/a와 /example/b는 기록용 문자열이며 실제 디렉터리를 읽지 않습니다. 호출 순서에 기대지 말고 질문이나 요청 ID로 기록을 찾아 각 경로와 연결해 보세요.
결과물·통과 기준: 요청 ID별 인자·경로·환경변수 이름 표입니다. 공유 전역 경로를 바꾸는 설계와 호출별 옵션을 넘기는 설계의 차이를 설명해야 합니다.
목표: 가상의 제공자 응답 세 개를 입력으로 받아 “수집됨·사용 가능·제외·이견 있음”을 구분한 보고서를 만듭니다. 실제 모델 호출이나 저장소의 실행 스크립트는 사용하지 않습니다.
responses = [
{"id": "A", "family": "alpha", "status": "contributed", "verdict": "APPROVE"},
{"id": "B", "family": "alpha", "status": "contributed", "verdict": "REVISE"},
{"id": "C", "family": "beta", "status": "timeout", "verdict": None},
]
결과물·통과 기준: JSON 요약과 사람이 읽는 한 문단입니다. 두 개의 역할 이름이 같은 계열의 독립 승인 두 표로 부풀려지지 않아야 합니다. 실제 Council은 같은 계열 내 이견도 다루므로 원본 집계 조건과 차이를 기록하세요.
좋은 실습 결과는 정상 응답을 멋지게 합치는 것뿐 아니라, 빠진 응답과 충돌한 의견을 독자가 알아볼 수 있게 남기는 것입니다.
한꺼번에 전체 플러그인을 복제하려 하면 제공자 인증과 호스트별 차이부터 만나게 됩니다. 먼저 외부 호출 없는 작은 실행기를 만들고, 매주 실패 상황 하나를 추가하는 편이 설계를 이해하기 쉽습니다.
| 주차 | 배울 주제 | 읽을 소스 | 완성할 결과 |
|---|---|---|---|
| 1주차 | Bash 배열·따옴표·종료 코드·표준 입출력 | scripts/lib/command-argv.sh, scripts/lib/utils.sh | 입력 다섯 개의 인자 경계를 보존하는 작은 명령 도구 |
| 2주차 | JSON·JSONL·상태 머신·종결 상태 | scripts/lib/run-contract.sh, tests/unit/test-run-contract-v10.sh | 상태 이력과 최신 상태를 따로 출력하는 검사기 |
| 3주차 | 비동기 호출·의존성 주입·Zod·MCP | mcp-server/src/index.ts, shared/adapter-runtime.mjs | 프로젝트별 입력을 받는 가짜 도구 어댑터 |
| 4주차 | 프로세스 그룹·타임아웃·출력 제한 | shared/process_supervisor.py, scripts/lib/agent-sync.sh | 성공·실패·시간 초과를 구분하는 생명주기 설계도 |
| 5주차 | Git 기준 커밋·worktree·파일 변경 증거 | tangle_prepare_run_worktree(), scripts/lib/testing.sh | 요청 범위·변경 파일·기준 SHA를 연결한 검토 보고서 |
| 6주차 | 병렬 분배·독립성·정족수·근거 검증 | scripts/lib/parallel.sh, scripts/lib/council.sh | 실패와 이견을 보존하는 다중 응답 종합기 |
표의 경로는 저장소 루트 기준입니다. 셸 라이브러리는 scripts/lib/, 테스트는 tests/unit/, 공용 어댑터·프로세스 코드는 shared/에 있습니다. 소스의 정상 경로를 이해한 뒤 관련 테스트에서 실패 사례를 읽는 순서를 권합니다.
상태 원장의 잠금·복구, 재시도 예산, 시간 제한을 더 파고드세요. 여러 실행자가 같은 파일을 갱신할 때 생기는 문제는 작업 큐나 배치 처리 시스템에서도 반복됩니다. 실행 계획과 이력을 이용해 문제를 재현하는 연습이 도움이 됩니다.
MCP 스키마와 실제 콜백의 검증 범위, 페르소나의 도구 정책, 인용 근거 검사에 집중하세요. 모델 응답을 텍스트로 받는 순간부터 구조화된 결과로 사용할 때까지의 경계를 설계하는 능력을 키울 수 있습니다.
hooks/octopus-hud.mjs와 scripts/guide.py를 읽으며 상태·비용·실패를 어떻게 사용자에게 설명하는지 보세요. 내부 상태가 풍부해도 사용자가 현재 상황을 이해하지 못하면 복구하기 어렵습니다.
어느 제공자가 실패했는지, 쓸 수 있는 출력이 남았는지, 정족수에 어떤 영향을 주는지, 결과를 왜 보류했는지 설명할 수 있다면 핵심 구조를 이해한 것입니다. 다음 단계는 제공자 수를 늘리기보다 실패 상황을 명확히 표현하는 일입니다.
작은 실행기에 상태·격리·검증을 한 겹씩 더하면, 이 저장소의 큰 구조도 익숙한 문제들의 조합으로 읽히기 시작합니다.
| 용어 | 쉬운 설명 | 이 저장소에서 만나는 곳 |
|---|---|---|
| 오케스트레이터 | 여러 작업의 순서·도구·실패 처리를 조율하는 진행자 | scripts/orchestrate.sh |
| 제공자 | 모델에 연결하는 실행기·API·게이트웨이. 모델 자체와 같은 말은 아님 | scripts/lib/provider-registry.sh |
| 호스트 | 플러그인을 읽고 도구 실행을 시작하는 상위 프로그램 | Claude Code 등 |
| 페르소나 | 보안 검토자·설계자처럼 AI에게 부여하는 역할 지침 | agents/personas/ |
| 스킬 | 호스트가 읽고 수행할 수 있도록 정리한 재사용 작업 절차 | skills/*/SKILL.md |
| 프런트매터 | Markdown 맨 앞에 붙는 이름·설명·실행 조건 등의 메타데이터 | 명령·스킬 파일의 YAML 머리말 |
| MCP | AI 클라이언트와 외부 도구를 연결하는 표준화된 약속 | mcp-server/ |
| stdio | 프로세스의 표준 입력과 표준 출력으로 주고받는 통신 경로 | StdioServerTransport |
| argv | 프로그램에 전달하는 인자들을 경계가 보존된 배열로 표현한 것 | scripts/lib/command-argv.sh |
| 실행 계획 | 제공자·모델·인자·예산을 실행 전에 확정해 남긴 배차표 | scripts/lib/dispatch-plan.sh |
| seat | 작업에 참여한 실행 단위. 같은 제공자가 여러 역할로 참여할 수도 있음 | scripts/lib/run-contract.sh |
| 상태 머신 | 가능한 상태와 상태 사이의 이동 규칙을 정해 놓은 장치 | octo_run_transition_valid() |
| JSONL | 각 줄이 독립적인 JSON인 기록 형식. 이력을 줄 단위로 쌓기 좋음 | seats.jsonl |
| 스냅샷 | 이력을 바탕으로 특정 시점의 현재 상태를 정리한 복사본 | seats.json |
| 잠금 | 여러 작성자가 같은 상태를 동시에 바꾸지 못하게 조정하는 장치 | 실행 계약·JSON 갱신 |
| 실패 시 차단 | 판단 근거가 손상되거나 확인되지 않으면 통과시키지 않는 원칙 | 실행 계약의 복구·자격 판정 |
| fan-out / fan-in | 일을 여러 곳에 나눠 보내고 결과를 다시 모으는 구조 | fan_out()·종합 함수 |
| worktree | 같은 Git 저장소의 커밋을 별도 경로에서 작업할 수 있게 펼친 공간 | tangle_prepare_run_worktree() |
| 프로세스 그룹 | 관련 프로세스들을 묶어 신호를 보낼 수 있는 운영체제 단위 | shared/process_supervisor.py |
| 타임아웃 | 정해진 시간 안에 끝나지 않는 실행을 중단하거나 실패로 분류하는 조건 | 호출자·단계·제공자별 제한 |
| 컨텍스트 예산 | 요청·역할 지침·출력 여유분에 배분하는 입력 공간의 한도 | scripts/lib/dispatch.sh·실행 계획 |
| 품질 게이트 | 다음 단계로 넘어가도 되는지 검사하는 통과 조건 | scripts/lib/quality.sh·scripts/lib/testing.sh |
| 정족수 | 심의를 성립시키는 데 필요한 응답·독립 승인 조건 | Council 집계 |
| 거부권 | 중대한 위험이 있으면 다른 승인과 별개로 진행을 막는 규칙 | council_scan_veto_artifacts() |
| 근거 확인 | 답변의 파일·줄·인용 코드가 실제 자료와 맞는지 살피는 일 | Council 인용 검증 |
| 의존성 주입 | 실제 도구 대신 가짜 도구를 전달할 수 있도록 실행 경계를 열어 두는 설계 | runOrchestrate()의 executor |
| 회귀 테스트 | 한 번 고친 문제가 나중에 다시 생기지 않는지 확인하는 검사 | 세션 메모리 경로 테스트 등 |
| 벤더 자료 | 프로젝트에 포함해 배포하는 외부 출처의 코드·데이터 | vendors/·외부 저작물 고지 |
특히 제공자·모델·페르소나·seat를 구분하세요. 하나의 제공자가 여러 모델로 연결될 수 있고, 같은 모델이 여러 페르소나와 실행 단위로 참여할 수 있습니다. 그 개수들을 같은 의미로 세면 독립적인 검토가 얼마나 이루어졌는지 잘못 판단하게 됩니다.
외부 공식 문서는 시간이 지나며 바뀔 수 있습니다. 이 글의 버전·함수 동작 설명은 커밋 286ef4d에 맞추고, 새 기능의 호환성은 사용하는 버전의 문서와 함께 확인하세요.
| 항목 | 내용 | 기준 |
|---|---|---|
| 저장소 | nyldn/claude-octopus | 공식 GitHub 저장소 |
| 선정 위치 | GitHub Trending Shell Monthly #13 | 2026-10-23 분석일 |
| 스타 / 포크 | 4,289 / 404 | 2026-10-23 GitHub 기준 |
| 주 언어 | Shell | GitHub 분류 |
| 생성일 | 2026-01-15 | GitHub 저장소 정보 |
| 최신 릴리스 | v11.15.0 · 2026-10-22 | GitHub 릴리스 정보 |
| 최근 push | 2026-10-23 | GitHub 저장소 정보 |
| 최근 커밋 | 286ef4d · 2026-10-22세션 자동 메모리를 프로젝트 worktree 밖에 유지하는 수정 · #1225 | 본문의 소스 기준점. push 날짜와 구분 |
| 추적 파일 | 1,415개 | 커밋 286ef4d의 파일 목록 |
| 코드 규모 | Shell 206,963줄 · TypeScript 11,227줄 JavaScript 2,135줄 · Python 17,333줄 | 확장자별 물리 줄 수. 산정 범위는 3-5절 참고 |
| 명령 / 스킬 / 페르소나 | 54 / 63 / 31 | 플러그인 선언과 역할 파일 |
| MCP 의존성 | SDK 1.32.0 · Zod 3.25.67 | mcp-server/package.json |
| 라이선스 | MIT · 저작권자 nyldn, 2026 | LICENSE. 외부 자료는 별도 고지 확인 |
다중 응답은 정답 보증이 아닙니다. 같은 학습 자료나 잘못된 전제를 공유하면 여러 모델이 함께 틀릴 수 있습니다. 작업 성공률·정족수·인용 일치는 각각 좁은 조건을 검사하며 프로그램 전체의 정확성을 증명하지 않습니다.
정적 구조와 실제 사용 가능성은 다릅니다. 연결 코드가 존재해도 특정 계정의 인증·할당량·현재 모델 접근·호스트 호환성은 별도입니다. 문서에 적힌 제공자 수와 실제로 독립 검토에 참여한 모델 수를 구분해야 합니다.
격리는 계층별로 다릅니다. worktree는 파일 변경 경로를 나누고, 권한·자격증명·네트워크 제어는 별도로 다룹니다. 외부 제공자를 선택하면 전달하는 프롬프트와 코드의 범위, 해당 제공자의 데이터 처리 조건을 이해해야 합니다.
수치와 범위를 고정해서 읽으세요. GitHub 수치는 2026-10-23, 소스 설명은 286ef4d 기준입니다. 코드 줄 수에는 테스트·주석·빈 줄·외부 자료가 포함되며, 테스트 파일의 존재나 CI 설정만으로 해당 시점의 모든 검사가 통과했다고 말할 수는 없습니다.