Skip to content

uhihi09/harness-cli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

harness

어떤 프로젝트든 명령 하나로 AI 코딩 하네스를 스캐폴딩하고, plan → construct → test 워크플로와 검증 게이트를 강제하는 CLI.

모델은 무엇을 만들지 정한다. 하네스는 언제·어디서·어떻게를 제어한다. 하네스는 모델을 똑똑하게 만드는 게 아니라 출력을 안정적으로 만든다.

크로스플랫폼(Windows / macOS / Linux), 외부 의존성 없음(표준 라이브러리만). 현재 버전: v0.5.0.

단계별 상세 설정·사용법은 docs/GUIDE.md 참고.


3줄 요약

  1. pipx install https://github.com/uhihi09/harness-cli/releases/download/v0.5.0/harness_cli-0.5.0-py3-none-any.whl 치면 설치.
  2. harness init하면 프로젝트에 바로 적용 가능.
  3. AI가 Claude.md보고 코드 짜라 하면 알아서 harness 명령어 치면서 하네스 적용 끝

설치

1) 릴리스 휠로 설치 (권장)
pipx install https://github.com/uhihi09/harness-cli/releases/download/v0.5.0/harness_cli-0.5.0-py3-none-any.whl

2) 소스에서 설치 (개발)
git clone https://github.com/uhihi09/harness-cli && cd harness-cli
pip install -e ".[dev]"

설치 후 확인:

harness --version
harness --help

빠른 시작 (한 사이클)

cd my-project
harness init --hooks                   # 하네스 + Claude Code 자동 verify 훅까지
harness plan "STT 재시도 로직"         # plan: .harness/plans/0001-... 작성
harness add F02 "실패 시 3회 재시도" "pytest tests/test_retry.py -q"
harness start F02                     # active 로 (WIP=1 강제)
# ... Claude Code / Codex 로 F02 구현 (construct) ...
harness verify F02                    # test 게이트 통과 시 자동으로 passing
harness check                         # 세션 종료 클린 상태 점검
harness record "재시도 e2e 통과"       # 세션 기록

명령

명령 단계 하는 일
harness init [--force] [--hooks] [--local] [--orchestration] 하네스 파일 일체 생성, 스택 감지, .gitignore·기존 CLAUDE.md 처리. --hooks 면 Claude Code 훅까지, --local 이면 하네스 파일을 git에서 제외(개인용), --orchestration 이면 멀티에이전트 오케스트레이션 레이어 설치
harness hooks [--force] 기존 하네스 프로젝트에 Claude Code 훅 추가 (settings.json 안전 병합)
harness plan "<제목>" plan .harness/plans/000N-<slug>.md 계획 생성
harness add <id> "<동작>" "<검증명령>" 기능을 (동작·검증·상태) 삼중구조로 등록
harness start <id> 기능을 active 로 (WIP=1 초과 시 거부)
harness block <id> ["<사유>"] 기능을 blocked 로 (WIP 슬롯 반환, 사유는 증거로 기록)
harness unblock <id> blocked 기능을 not_started 로 되돌림
harness verify [<id>] test 검증 게이트 실행. <id> 지정 시 통과하면 passing 자동 갱신
harness status 진행 상황 / 기능 상태 / WIP 경고
harness check 세션 종료 클린 상태 5차원 점검 (빌드·테스트·디버그마커·tmp)
harness record "<메모>" .harness/records/<날짜>.md 에 타임스탬프 기록

init 이 만드는 것

AGENTS.md             에이전트 운영 매뉴얼(라우터) — 루트 고정 (도구 규약)
CLAUDE.md             Claude Code 진입점 (AGENTS.md 를 가리킴) — 루트 고정
.harness/
  config.json         감지된 스택 + 검증 명령 (단일 진실 원천)
  feature_list.json   범위: WIP=1, (동작·검증·상태) 삼중구조
  PROGRESS.md         진행 상황 (세션 연속성)
  DECISIONS.md        설계 결정 로그
  SESSION_CHECKLIST.md 클린 상태 5차원
  init.sh             세션 시작 루틴 (설치→검증→상태)
  verify.sh           검증 게이트 편의 스크립트 (정식 경로는 harness verify)
  plans/              버전+제목 계획 파일
  records/            세션/결정 기록
  tmp/                스크래치 (.gitignore 처리)

AGENTS.md·CLAUDE.md 만 루트에 둔다(도구가 루트에서 읽는 규약). 나머지 상태 파일·스크립트는 모두 .harness/ 안에 모아 루트를 깔끔하게 유지한다.

기존 CLAUDE.md 가 있으면?

덮어쓰지 않는다. 내용을 보존하고 맨 아래에 AGENTS.md 를 따르라는 포인터 한 줄만 (마커로 중복 방지) 추가한다. 이미 AGENTS.md 를 참조하고 있으면 건드리지 않는다.


스택 감지

감지 파일 stack test 기본값
pyproject.toml+uv.lock python-uv uv run pytest -q
pyproject.toml / requirements.txt python pytest -q
pom.xml java-maven mvn -q test
build.gradle java-gradle ./gradlew test
package.json node npm test
(그 외) generic TODO 자리표시자

검증 명령 중 # 로 시작하거나 빈 항목은 "미설정"으로 간주되어 게이트에서 건너뛴다. .harness/config.jsonverify 를 직접 편집해 프로젝트에 맞게 채우면 된다.


검증 게이트 (harness verify)

config.jsonverify 명령을 lint → typecheck → test → e2e 순서로 실행한다. 앞 단계가 실패하면 즉시 멈춘다. bash 에 의존하지 않고 각 명령을 직접 실행하므로 Windows 에서도 동일하게 동작한다. 전부 통과해야만(그리고 <id> 를 줬다면) 기능이 passing 으로 바뀐다 — "코드가 멀쩡해 보임"이 아니라 실행 가능한 증거가 완료의 기준.


Claude Code 연동 (--hooks)

harness init --hooks (또는 기존 프로젝트에 harness hooks)는 .claude/ 에 훅을 깐다:

  • Stop 훅 — Claude가 작업을 끝내려 할 때마다 harness verify 를 자동 실행. 실패하면 멈추지 못하게 막고(exit 2) 실패 로그를 Claude에게 피드백해 스스로 고치게 한다. 무한 루프는 stop_hook_active 확인 + 카운터 상한(3회)으로 2중 방어.
  • SessionStart 훅 — 세션 시작 시 plan→construct→test 워크플로와 harness status 를 컨텍스트로 주입.

기존 .claude/settings.json 이 있으면 hooks 키만 안전하게 병합하고 나머지 설정은 보존한다. 같은 command 가 이미 있으면 중복 추가하지 않는다.

설치 후: chmod +x .claude/hooks/*.sh → Claude Code 재시작 → /hooks 로 확인. 훅은 harness 가 PATH에 있어야 동작하며, Windows에서는 Git Bash를 사용한다.

이렇게 하면 사용자가 harness verify 를 직접 칠 필요 없이 Claude Code가 자동으로 게이트를 통과시킨다.


오케스트레이션 (--orchestration)

harness init --orchestration 은 멀티에이전트 코딩 워크플로를 깐다:

  • .harness/config.jsonorchestration 블록 — 역할→모델 매핑 (lead/coder/reviewer/fallback/max_parallel, 전부 교체 가능).
  • .claude/agents/ 에 에이전트 정의 3개 (lead·coder·reviewer).
  • .harness/ORCHESTRATION.md — 리드가 따르는 프로토콜.

리드(기본 Fable 5)가 기능을 파일 소유권이 겹치지 않는 레인으로 나눠 코더 여러 개를 병렬로 굴리고, 다른 모델(기본 Sonnet)이 각 레인 diff 를 독립 리뷰한다. 객관 게이트 (harness verify)가 먼저이고 리뷰는 그 위에 얹힌다 — "리뷰 OK"가 테스트 통과를 대체하지 않는다. harness 는 모델을 호출하지 않고 판만 깐다(구동은 Claude Code).


개인 프로젝트 모드 (--local)

기본적으로 하네스 파일(AGENTS.md, feature_list.json, PROGRESS.md 등)은 커밋되어야 한다 — 저장소가 단일 진실 원천이고, 그래야 다른 PC·세션·팀원이 컨텍스트를 이어받는다.

혼자 쓰는 토이 프로젝트라 git에 올리고 싶지 않다면:

harness init --local          # 하네스 파일을 .gitignore 에 추가 (이 PC에서만)

harness 가 이번 실행에서 새로 만든 파일만 무시 목록에 넣는다. 직접 작성해 두었던 AGENTS.md/CLAUDE.md 나 기존 .claude/ 설정은 건드리지 않는다(.claude/ 가 이미 있으면 harness 가 추가한 훅 스크립트만 무시). --local 로 깐 하네스는 그 PC·그 클론에만 존재하므로, 다른 환경에서는 다시 harness init 해야 한다.


개발

pip install -e ".[dev]"
pytest -q

라이선스

MIT

About

CLI 딸깍으로 구축하는 하네스

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages