Per-Repo Config#
타깃 레포에서 어떤 파일을 받을지 직접 제어하는 방법입니다.
기본 동작#
.harness/sync.yml이 없으면 기본 그룹(claude, codex, gemini)이 모두 동기화됩니다.
훅 관련 항목은 기본 그룹에 포함되지 않으며 overrides에 true로 명시해야 합니다.
프로젝트 지침은 각 저장소에서 관리#
AGENTS.md, .claude/rules/**, .gemini/styleguide.md, .github/copilot-instructions.md는 배포 항목이 아닙니다. 각 타깃 레포가 직접 관리하며, 하네스는 이를 생성·덮어쓰기·삭제하지 않습니다.
AGENTS.md가 없어도 동기화와 스킬·에이전트 사용을 계속할 수 있습니다. 규칙 문서의 적용 범위·충돌·부재 시 처리 기준은 전역 컨벤션을 참고하세요.
동기화 주기 및 실행 조건#
자동 동기화 워크플로우는 다음 시점에 실행됩니다:
- 메인 브랜치 푸시 시 (
push):- 하네스 레포의
main브랜치에 변경 사항이 푸시(push)될 때 즉시 각 타깃 레포에 동기화 PR이 생성됩니다.
- 하네스 레포의
- 매일 정기 실행 (
schedule):- 매일 00:00 UTC (한국 시간 기준 오전 09:00)에 자동으로 실행되어 전체 타깃 레포의 상태를 동기화합니다.
- 수동 실행 (
workflow_dispatch):- 대시보드의 지금 동기화 또는 하네스 레포의 GitHub Actions에서 특정 설치 레포를 동기화할 수 있습니다.
설정 파일 위치#
your-repo/
└── .harness/
└── sync.yml
.harness/sync.yml은 레포의 기본 브랜치에서 읽습니다.base_branch: develop을 사용하더라도 이 설정 파일은 기본 브랜치에 있어야 합니다.
설정 형식#
enabled: true # 이 레포의 동기화 사용 여부 (기본값: true)
groups:
- claude # Claude Code 스킬·에이전트
- codex # Codex/Agents CLI 스킬·설정
- gemini # Gemini CLI 설정
# false: 그룹 내 항목 제외 | true: opt-in 항목 추가 | "v1": 버전 고정
overrides:
claude/skills/kotest-guide: false # 이 스킬은 받지 않음
claude/hooks/dispatcher: true # Claude 훅 활성화 (opt-in)
claude/settings: true
claude/hooks/ktlint: true
codex/hooks/dispatcher: true # Codex 훅 활성화 (Claude와 별개 — 공유되지 않음)
codex/hooks-json: true
codex/hooks/ktlint: true
# PR 설정 (생략하면 기본값 적용)
branch_prefix: harness-sync/
base_branch: main # sync 브랜치를 분기하고 PR을 보낼 대상 브랜치
language: ko # sync PR 제목·본문 언어 (기본값: en)
pr_label: false # sync PR 라벨 부착 여부 (기본값: true)
사용 가능한 그룹#
| 그룹 | 동기화되는 경로 |
|---|---|
claude | .claude/skills/, .claude/agents/ |
codex | .agents/skills/, .codex/agents/, .codex/config.toml |
gemini | .gemini/settings.json |
항목 ID 목록#
각 항목의 설명은 스킬 레퍼런스, 에이전트 레퍼런스, 훅 레퍼런스를 참고하세요.
claude 그룹#
| ID | 배포 경로 |
|---|---|
claude/skills/api-design | .claude/skills/api-design/ |
claude/skills/database-schema | .claude/skills/database-schema/ |
claude/skills/docker | .claude/skills/docker/ |
claude/skills/git-commit | .claude/skills/git-commit/ |
claude/skills/humanizer | .claude/skills/humanizer/ |
claude/skills/ponytail | .claude/skills/ponytail/ |
claude/skills/ponytail-audit | .claude/skills/ponytail-audit/ |
claude/skills/kotest-guide | .claude/skills/kotest-guide/ |
claude/skills/kotlin-spring-arch | .claude/skills/kotlin-spring-arch/ |
claude/skills/migration-guide | .claude/skills/migration-guide/ |
claude/skills/planning | .claude/skills/planning/ |
claude/skills/resolve-reviews | .claude/skills/resolve-reviews/ |
claude/skills/security-checklist | .claude/skills/security-checklist/ |
claude/skills/systematic-debugging | .claude/skills/systematic-debugging/ |
claude/skills/test | .claude/skills/test/ |
claude/skills/write-pr | .claude/skills/write-pr/ |
claude/skills/the-sdk | .claude/skills/the-sdk/ |
claude/skills/java-spring-arch | .claude/skills/java-spring-arch/ |
claude/skills/nextjs-fsd-architecture | .claude/skills/nextjs-fsd-architecture/ |
claude/skills/nextjs-turborepo-fsd | .claude/skills/nextjs-turborepo-fsd/ |
claude/skills/nextjs-package-boundaries | .claude/skills/nextjs-package-boundaries/ |
claude/skills/tailwind-shadcn | .claude/skills/tailwind-shadcn/ |
claude/skills/tanstack-query-zod | .claude/skills/tanstack-query-zod/ |
claude/agents/contradiction-finder | .claude/agents/contradiction-finder.md |
claude/agents/kotlin-convention-validator | .claude/agents/kotlin-convention-validator.md |
claude/agents/frontend-convention-validator | .claude/agents/frontend-convention-validator.md |
claude/agents/doc-polisher | .claude/agents/doc-polisher.md |
claude/agents/prompt-polisher | .claude/agents/prompt-polisher.md |
claude/agents/kotlin-test-fixer | .claude/agents/kotlin-test-fixer.md |
claude/agents/web-researcher | .claude/agents/web-researcher.md |
claude 훅 (opt-in 전용)#
훅 사용 시 dispatcher와 settings는 반드시 함께 활성화해야 합니다.
각 모듈 설명 및 추천 조합은 훅 레퍼런스를 참고하세요.
claude/settings만 활성화하면 훅이 없는 기본 설정이 배포됩니다. 하나 이상의 Claude 훅을 함께 활성화하면 훅 등록이 포함된 설정이 배포됩니다.
| ID | 배포 경로 |
|---|---|
claude/hooks/dispatcher | .claude/hooks/ |
claude/settings | .claude/settings.json |
claude/hooks/logging | .claude/hooks/modules/logging/ |
claude/hooks/command-guard | .claude/hooks/modules/command-guard/ |
claude/hooks/secret-guard | .claude/hooks/modules/secret-guard/ |
claude/hooks/ktlint | .claude/hooks/modules/ktlint/ |
claude/hooks/gradle-test | .claude/hooks/modules/gradle-test/ |
claude/hooks/spotless | .claude/hooks/modules/spotless/ |
claude/hooks/biome | .claude/hooks/modules/biome/ |
claude/hooks/eslint | .claude/hooks/modules/eslint/ |
claude/hooks/prettier | .claude/hooks/modules/prettier/ |
claude/hooks/ts-check | .claude/hooks/modules/ts-check/ |
claude/hooks/jest | .claude/hooks/modules/jest/ |
claude/hooks/vitest | .claude/hooks/modules/vitest/ |
claude/hooks/ruff | .claude/hooks/modules/ruff/ |
claude/hooks/ponytail | .claude/hooks/modules/ponytail/ |
Next.js FSD 프로젝트 파일 (opt-in 전용)#
기존 프로젝트 루트 설정을 덮어쓸 수 있으므로 Next.js FSD 프로젝트에서만 활성화하세요. 자세한 구조와 설치 방법은 프론트엔드 아키텍처를 참고하세요.
| ID | 배포 경로 |
|---|---|
nextjs/fsd/steiger-config | steiger.config.mjs |
nextjs/fsd/dependency-check | scripts/check-fsd-dependencies.mjs |
codex 그룹#
| ID | 배포 경로 |
|---|---|
codex/skills/api-design | .agents/skills/api-design/ |
codex/skills/database-schema | .agents/skills/database-schema/ |
codex/skills/docker | .agents/skills/docker/ |
codex/skills/git-commit | .agents/skills/git-commit/ |
codex/skills/humanizer | .agents/skills/humanizer/ |
codex/skills/ponytail | .agents/skills/ponytail/ |
codex/skills/ponytail-audit | .agents/skills/ponytail-audit/ |
codex/skills/kotest-guide | .agents/skills/kotest-guide/ |
codex/skills/kotlin-spring-arch | .agents/skills/kotlin-spring-arch/ |
codex/skills/migration-guide | .agents/skills/migration-guide/ |
codex/skills/planning | .agents/skills/planning/ |
codex/skills/resolve-reviews | .agents/skills/resolve-reviews/ |
codex/skills/security-checklist | .agents/skills/security-checklist/ |
codex/skills/systematic-debugging | .agents/skills/systematic-debugging/ |
codex/skills/test | .agents/skills/test/ |
codex/skills/write-pr | .agents/skills/write-pr/ |
codex/skills/the-sdk | .agents/skills/the-sdk/ |
codex/skills/java-spring-arch | .agents/skills/java-spring-arch/ |
codex/skills/nextjs-fsd-architecture | .agents/skills/nextjs-fsd-architecture/ |
codex/skills/nextjs-turborepo-fsd | .agents/skills/nextjs-turborepo-fsd/ |
codex/skills/nextjs-package-boundaries | .agents/skills/nextjs-package-boundaries/ |
codex/skills/tailwind-shadcn | .agents/skills/tailwind-shadcn/ |
codex/skills/tanstack-query-zod | .agents/skills/tanstack-query-zod/ |
codex/agents/contradiction-finder | .codex/agents/contradiction-finder.toml |
codex/agents/kotlin-convention-validator | .codex/agents/kotlin-convention-validator.toml |
codex/agents/frontend-convention-validator | .codex/agents/frontend-convention-validator.toml |
codex/agents/doc-polisher | .codex/agents/doc-polisher.toml |
codex/agents/prompt-polisher | .codex/agents/prompt-polisher.toml |
codex/agents/kotlin-test-fixer | .codex/agents/kotlin-test-fixer.toml |
codex/agents/web-researcher | .codex/agents/web-researcher.toml |
codex/config | .codex/config.toml |
codex/hooks/dispatcher | .codex/hooks/ |
codex/hooks-json | .codex/hooks.json |
codex/hooks/logging | .codex/hooks/modules/logging/ |
codex/hooks/command-guard | .codex/hooks/modules/command-guard/ |
codex/hooks/secret-guard | .codex/hooks/modules/secret-guard/ |
codex/hooks/ktlint | .codex/hooks/modules/ktlint/ |
codex/hooks/gradle-test | .codex/hooks/modules/gradle-test/ |
codex/hooks/spotless | .codex/hooks/modules/spotless/ |
codex/hooks/biome | .codex/hooks/modules/biome/ |
codex/hooks/eslint | .codex/hooks/modules/eslint/ |
codex/hooks/prettier | .codex/hooks/modules/prettier/ |
codex/hooks/ts-check | .codex/hooks/modules/ts-check/ |
codex/hooks/jest | .codex/hooks/modules/jest/ |
codex/hooks/vitest | .codex/hooks/modules/vitest/ |
codex/hooks/ruff | .codex/hooks/modules/ruff/ |
codex/hooks/ponytail | .codex/hooks/modules/ponytail/ |
gemini 그룹#
| ID | 배포 경로 |
|---|---|
gemini/settings | .gemini/settings.json |
동기화 활성화 / 비활성화 (enabled)#
enabled 필드로 해당 레포의 동기화 자체를 켜고 끕니다. 기본값은 true입니다.
| 값 | 동작 |
|---|---|
true (기본) | 평소대로 동기화 |
false | 이 레포는 동기화 대상에서 제외 — sync PR도 cleanup PR도 만들어지지 않음 |
enabled: false
false로 두면 매트릭스 산출 단계에서 아예 제외되므로 파일 비교조차 하지 않습니다.
GitHub App을 제거하지 않고 일시적으로 동기화만 멈추고 싶을 때 사용하세요.
필드를 생략하거나 .harness/sync.yml 파일 자체가 없으면 기본값 true가 적용됩니다.
동기화 브랜치 접두사 (branch_prefix)#
branch_prefix는 동기화 PR 브랜치의 접두사입니다. 기본값은 harness-sync/이며, 실제 동기화 브랜치는 <branch_prefix><base_branch> 형식입니다.
예를 들어 branch_prefix: update/, base_branch: develop이면 update/develop 브랜치에서 PR을 만듭니다.
같은 동기화 브랜치의 PR이 이미 열려 있으면 새 동기화를 만들지 않고 건너뜁니다. 해당 PR을 머지하거나 닫은 뒤 다음 동기화 실행에서 다시 반영됩니다.
대상 브랜치 설정 (base_branch)#
base_branch는 sync 브랜치를 분기하는 기준이자 PR을 보낼 대상 브랜치입니다.
생략하면 레포의 GitHub 기본 브랜치(main 또는 master)가 쓰입니다.
⚠️ 개발 브랜치와 기본 브랜치가 다르면 반드시 지정하세요. 예를 들어 GitHub 기본 브랜치는
master인데 실제 개발은develop에서 하고,master가develop보다 뒤처져 있는 경우,base_branch를 생략하면 동기화가 뒤처진master기준으로 분기한 뒤 PR만develop으로 향하게 됩니다. 그러면develop에 이미 반영된 내용이 phantom diff로 PR에 계속 올라옵니다. 이때는base_branch: develop으로 명시하면 됩니다.
base_branch: develop
이렇게 하면 sync 브랜치가 develop에서 분기되므로, develop과 내용이 같으면
diff가 없어 PR이 아예 생성되지 않고, 실제로 다를 때만 정확한 PR이 열립니다.
PR 언어 설정#
language 필드로 sync PR의 제목과 본문 언어를 지정합니다. 기본값은 en(영어)입니다.
| 값 | PR 제목 | PR 본문 |
|---|---|---|
en (기본) | Sync files from themoment-ai-harness-sync | 영어 |
ko | [global] {가장 규모가 큰 커밋의 ': ' 이후 텍스트} | 한국어 |
ko 설정 시 제목은 해당 sync를 유발한 하네스 커밋 중 변경 파일 수가 가장 많은 커밋의 메시지에서 : 이후 부분을 추출합니다.
예시: 하네스에 update(claude): write-pr 스킬 개선 커밋이 push되면 → PR 제목 [global] write-pr 스킬 개선
language: ko
PR 라벨 설정#
pr_label 필드로 sync PR에 붙는 harness sync:하네스 동기화 라벨 부착 여부를 제어합니다. 기본값은 true(라벨 부착)입니다.
| 값 | 동작 |
|---|---|
true (기본) | sync PR과 cleanup PR에 harness sync:하네스 동기화 라벨을 붙임 |
false | 라벨을 붙이지 않음 |
타깃 레포에 해당 라벨이 없거나, 레포 자체 라벨 정책으로 관리하고 싶을 때 false로 끄면 됩니다. 이 설정은 일반 sync PR과 구 파일 정리(cleanup) PR 양쪽 모두에 적용됩니다.
pr_label: false
버전 고정#
overrides 값에 버전 문자열을 지정하면 아카이브된 버전으로 배포됩니다.
overrides:
claude/skills/git-commit: "v1" # v1 아카이브 고정
아카이브가 없는 항목에 문자열을 지정하면 sync 시 경고 후 건너뜁니다.
현재 아카이브된 버전은 없습니다.
예시 — 프론트엔드 (TypeScript)#
groups:
- claude
- codex
overrides:
claude/skills/kotest-guide: false
claude/skills/kotlin-spring-arch: false
claude/skills/migration-guide: false
claude/skills/database-schema: false
claude/skills/the-sdk: false
claude/skills/java-spring-arch: false
codex/skills/kotest-guide: false
codex/skills/kotlin-spring-arch: false
codex/skills/migration-guide: false
codex/skills/database-schema: false
codex/skills/the-sdk: false
codex/skills/java-spring-arch: false
claude/hooks/dispatcher: true
claude/settings: true
claude/hooks/secret-guard: true
claude/hooks/command-guard: true
claude/hooks/biome: true
claude/hooks/ts-check: true
codex/hooks/dispatcher: true
codex/hooks-json: true
codex/hooks/secret-guard: true
codex/hooks/command-guard: true
nextjs/fsd/steiger-config: true
nextjs/fsd/dependency-check: true
예시 — Kotlin / Spring Boot 백엔드#
groups:
- claude
- codex
- gemini
overrides:
claude/hooks/dispatcher: true
claude/settings: true
claude/hooks/secret-guard: true
claude/hooks/command-guard: true
claude/hooks/ktlint: true
claude/hooks/gradle-test: true
codex/hooks/dispatcher: true
codex/hooks-json: true
codex/hooks/secret-guard: true
codex/hooks/command-guard: true
codex/hooks/ktlint: true
codex/hooks/gradle-test: true
branch_prefix: update/
base_branch: develop