Repository navigation
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 |
각 항목의 설명은 Skills-Reference, Agents-Reference, Hooks-Reference를 참고하세요.
| 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 |
훅 사용 시 dispatcher와 settings는 반드시 함께 활성화해야 합니다.
각 모듈 설명 및 추천 조합은 Hooks-Reference를 참고하세요.
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 프로젝트에서만 활성화하세요. 자세한 구조와 설치 방법은 Frontend-Architecture를 참고하세요.
| ID | 배포 경로 |
|---|---|
nextjs/fsd/steiger-config |
steiger.config.mjs |
nextjs/fsd/dependency-check |
scripts/check-fsd-dependencies.mjs |
| 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/ |
| ID | 배포 경로 |
|---|---|
gemini/settings |
.gemini/settings.json |
enabled 필드로 해당 레포의 동기화 자체를 켜고 끕니다. 기본값은 true입니다.
| 값 | 동작 |
|---|---|
true (기본) |
평소대로 동기화 |
false |
이 레포는 동기화 대상에서 제외 — sync PR도 cleanup PR도 만들어지지 않음 |
enabled: falsefalse로 두면 매트릭스 산출 단계에서 아예 제외되므로 파일 비교조차 하지 않습니다.
GitHub App을 제거하지 않고 일시적으로 동기화만 멈추고 싶을 때 사용하세요.
필드를 생략하거나 .harness/sync.yml 파일 자체가 없으면 기본값 true가 적용됩니다.
branch_prefix는 동기화 PR 브랜치의 접두사입니다. 기본값은 harness-sync/이며, 실제 동기화 브랜치는 <branch_prefix><base_branch> 형식입니다.
예를 들어 branch_prefix: update/, base_branch: develop이면 update/develop 브랜치에서 PR을 만듭니다.
같은 동기화 브랜치의 PR이 이미 열려 있으면 새 동기화를 만들지 않고 건너뜁니다. 해당 PR을 머지하거나 닫은 뒤 다음 동기화 실행에서 다시 반영됩니다.
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이 열립니다.
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: kopr_label 필드로 sync PR에 붙는 harness sync:하네스 동기화 라벨 부착 여부를 제어합니다. 기본값은 true(라벨 부착)입니다.
| 값 | 동작 |
|---|---|
true (기본) |
sync PR과 cleanup PR에 harness sync:하네스 동기화 라벨을 붙임 |
false |
라벨을 붙이지 않음 |
타깃 레포에 해당 라벨이 없거나, 레포 자체 라벨 정책으로 관리하고 싶을 때 false로 끄면 됩니다. 이 설정은 일반 sync PR과 구 파일 정리(cleanup) PR 양쪽 모두에 적용됩니다.
pr_label: falseoverrides 값에 버전 문자열을 지정하면 아카이브된 버전으로 배포됩니다.
overrides:
claude/skills/git-commit: "v1" # v1 아카이브 고정아카이브가 없는 항목에 문자열을 지정하면 sync 시 경고 후 건너뜁니다.
현재 아카이브된 버전은 없습니다.
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: truegroups:
- 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