워크플로우와 자동화 이해
이 장에서는 AI 하니스의 워크플로우 자동화에 대해 다룹니다. /sync 명령어, Git/GitHub PR, 훅(Hooks), CI/CD 기초, 그리고 dev-sync.ts의 작동 원리를 배워보겠습니다.
- 자동화가 왜 중요한지
/sync명령어의 작동 방식- Git과 GitHub PR 기초
- 훅(Hook) 개념
- CI/CD 기초
dev-sync.ts내부 구조- 실습: 전체 워크플로우 직접 체험
자동화란 무엇인가
모든 옷을 손빨래해야 한다고 상상해 보세요. 하나하나 문지르고, 헹구고, 짜야 합니다. 매주 몇 시간씩 걸릴 것입니다. 그런데 세탁기가 발명되었습니다. 옷을 넣고 버튼을 누르면 세탁기가 전체 과정을 알아서 처리합니다. 이것이 바로 자동화(Automation)입니다. 반복적인 수동 단계를 대신 실행해 주는 시스템을 두는 것입니다.
같은 원리가 소프트웨어 개발과 AI 에이전트 워크플로우에도 적용됩니다. 앞선 장에서 에이전트들이 협력해서 연구, 슬라이드 데크, 핸드북을 만드는 과정을 배웠습니다. 그런데 에이전트가 작업을 마친 이후에는 무슨 일이 일어날까요? 변경 사항은 어떻게 저장되고, 검증되고, 공유될까요? 바로 여기서 워크플로우 자동화가 필요합니다.
수동 vs 자동
자동화가 있을 때와 없을 때의 워크플로우를 비교해 보겠습니다.
자동화 없이 (수동)
- 직접 감사(audit) 검사 실행
- 버전 파일을 수동으로 업데이트
- git 명령어로 변경 사항 커밋
- GitHub에 수동으로 푸시
- 웹 UI에서 Pull Request 생성
- 공유 변경 사항을 모든 변형 프로젝트에 수동 복사
- 위험: 단계 누락, 오타, 버전 불일치
자동화 있음 (/sync)
- 감사가 자동으로 실행
- 버전 파일이 자동으로 업데이트
- 커밋 메시지가 자동 생성
- 푸시가 파이프라인의 일부로 처리
- 단일 명령어로 PR 생성
- L0 변경 사항이 모든 변형에 자동 전파
- 결과: 일관되고, 안정적이고, 반복 가능
세탁기 비유
/sync 명령어를 프로젝트의 세탁기라고 생각해 보세요. 작업 후 워크플로우의 각 단계(감사, 버전 업데이트, 커밋, 푸시, PR 생성)를 직접 실행하는 대신, 하나의 명령어만 실행하면 시스템이 전체 사이클을 처리합니다. "옷"(변경된 파일)을 넣고, 버튼(/sync)을 누르면 나머지는 시스템이 알아서 합니다.
이 비유는 더 확장할 수 있습니다. 세탁기에 여러 코스(섬세, 강력 세탁)가 있듯이, 자동화 파이프라인도 다양한 시나리오에 맞게 설정할 수 있습니다. 그리고 세탁기가 옷을 일관되게 세척해 주듯이, 자동화도 프로젝트를 일관되게 유지해 줍니다.
/sync 명령어 이해하기
/sync 명령어는 AI 하니스의 핵심 자동화 명령어입니다. 작업 후 워크플로우 전체를 단일 호출로 캡슐화합니다. 에이전트, 스킬, 스크립트 등 프로젝트 파일을 수정하는 작업을 마칠 때마다 /sync를 실행하여 작업을 올바르게 마무리합니다.
5단계 Sync 파이프라인
/sync를 실행하면 시스템이 5개 단계를 순차적으로 실행합니다. 각 단계는 이전 단계가 성공적으로 완료되어야 다음 단계로 넘어갑니다.
-
라이프사이클 업데이트 — 라이프사이클 추적 대상 아티팩트(에이전트, 스킬, 스크립트, 거버넌스 파일)에 변경이 있는지 확인합니다. 변경이 있으면 관련 라이프사이클 레코드와
CHANGELOG.md를 업데이트합니다. -
감사(Audit) —
scripts/audit.ts스크립트가 워크스페이스 전체를 종합적으로 검사합니다. 파일 구조, 명명 규칙, 프론트매터 완전성, 교차 참조, 계약 준수 여부를 검증합니다. 오류가 있으면 보고되며, 계속하려면 먼저 수정해야 합니다. - 게시(Publish, L0→L1) — L0 워크스페이스 루트 수준에서 변경된 내용이 있으면 L1 공통 템플릿으로 하향 게시됩니다. 이렇게 하면 모든 변형 프로젝트가 최신 표준을 상속받게 됩니다.
- 커밋(Commit) — 모든 변경 사항이 컨벤셔널 커밋 메시지와 함께 git에 커밋됩니다. 메시지에는 타입 접두어(feat, fix, docs 등), 범위(scope), 변경 내용 설명이 포함됩니다.
- 푸시 + PR — 커밋이 원격 저장소에 푸시되고, 리뷰를 위한 Pull Request가 자동으로 생성됩니다(또는 기존 PR이 업데이트됨).
/sync 명령어는 컨벤셔널 커밋 메시지를 인수로 받습니다. 예: /sync "feat(pm): add meeting facilitation skill". 시스템은 이 메시지를 git 커밋에 사용하므로, 명확하고 설명적인 메시지를 작성하는 것이 중요합니다. 형식은 type(scope): description 패턴을 따릅니다.
/sync 추가 안전 게이트(2026-09-09 기준) — 위의 5단계 외에도 파이프라인 안에서 아래 검사들이 자동으로 실행됩니다. 사용자는 보통 프롬프트가 표시되면 답하기만 하면 됩니다.
- 언어 게이트 — 커밋 메시지와 PR 제목이 영어 규칙에 맞는지 검사합니다. 2026-09부터는 마크다운뿐 아니라
.yaml/.yml파일도 검사 대상에 포함됩니다(validate-md-language.tsv1.9.0). - 스펙 레지스트리 검사 —
audit.ts --spec-check: 이번 작업이docs/specs/registry.json에 등록된 설계 문서(스펙)와 연결돼 있는지 확인하고, 없으면 동기화가 중단됩니다(FATAL). 오타 수정 같은 사소한 변경은 예외 코드 E1~E5(--spec-exempt또는SYNC_SPEC_EXEMPT)로 면제할 수 있습니다. - 거버넌스 반영 게이트(ADR-0059) — 변경 내용이 관련 ADR(설계 결정 기록)과 연결돼 있는지 검사합니다.
- 타입 검사 게이트 — dev-sync 3.95b 단계에서
scripts/typecheck.ts(scripts/대상tsc --noEmit)를 실행해scripts/helpers/typecheck-baseline.json의 무오류 기준선과 비교합니다. 새 타입 오류가 생기면 동기화가 중단됩니다(FATAL). - 스킬 그래프 게이트(ADR-0060) — 스킬 간 의존 관계 그래프를 만들고 검증해 순환 참조 같은 문제를 미리 잡아 냅니다. audit.ts v2.30.0(수정안 9)부터는 커밋된
docs/skill-graph.json을 원본과 다시 대조해 드리프트가 있으면 실패합니다 — 이때는bun scripts/generate-skill-graph.ts를 실행하고 재생성된 프로젝션을 커밋하면 됩니다. - 업그레이드 커버리지 게이트(ADR-0073) —
audit.ts가check-upgrade-coverage.ts --strict를 실행합니다. 템플릿 트리의 모든 파일이lib/upgrade-policy.ts에서 해석 가능한 업그레이드 분류를 유지하는지 검사해, 템플릿 변경이 프로젝트 업그레이드에서 조용히 빠지는 사례를 막습니다. - 디자인 린트 게이트 — 스키마가 허용한 곳(
docs/workspace-schema.json의designLint:블록)에서는 UI 소스 파일이 디자인 토큰 대신 색상 값을 하드코딩하면 실패합니다. 루트를 지정하지 않은 프로젝트는 그대로 건너뜁니다. - 세션 증거 스킬 리뷰(비차단) — 세션 로그
memory/YYYY-MM-DD.md의## Skills Used섹션을 읽어 관찰 기록을memory/skill-review/YYYY-MM-DD.md에 쌓습니다. 실제 세션 증거에서 스킬 문제가 드러나도록 하는 장치입니다. - VERSION_MANIFEST 재생성 —
docs/VERSION_MANIFEST.md버전 목록을 최신 상태로 다시 생성합니다.
언제 /sync를 실행해야 할까
프로젝트 파일을 수정한 모든 작업 세션의 끝에서 /sync를 실행해야 합니다. 구체적으로 다음과 같은 경우입니다.
- 에이전트를 추가, 수정, 또는 중단(deprecate)한 후
- 스킬을 생성, 업데이트, 또는 제거한 후
- 스크립트를 변경하거나
SCRIPTS.md의 상태를 업데이트한 후 - 거버넌스 파일(
AGENTS.md,CLAUDE.md,GEMINI.md,CODEX.md)을 수정한 후 common-contract.json이나 템플릿 파일을 변경한 후
/sync를 실행할 필요는 없습니다. 라이프사이클 추적 아티팩트에 영향을 주지 않는 문서 전용 변경(본문 텍스트 업데이트, 메모리 로그 항목 등)은 단순히 수동으로 커밋하고 푸시하면 됩니다. /sync 파이프라인은 프로젝트의 구조적 무결성에 영향을 미치는 변경을 위해 설계되었습니다.
Git & GitHub PR
자동화 파이프라인이 어떻게 작동하는지 이해하려면 Git과 GitHub Pull Request의 기본 개념을 알아야 합니다. 이 두 가지가 감사 이후 sync 파이프라인의 모든 단계를 뒷받침하는 도구입니다.
Git 기초
Git은 프로젝트의 파일에 대한 모든 변경 사항을 추적하는 버전 관리 시스템입니다. 프로젝트의 상세한 일기장이라고 생각하면 됩니다. 변경 사항을 저장할 때마다 Git은 누가, 언제, 무엇을 변경했는지 기록합니다.
AI 하니스 워크플로우에서 만나게 될 필수 Git 명령어입니다.
# 변경된 파일 확인
git status
# 변경된 파일의 실제 차이점 보기
git diff
# 변경 사항을 "스테이징 영역"에 추가 (커밋 준비)
git add <filename>
# 스테이징된 변경 사항을 메시지와 함께 기록
git commit -m "type(scope): description"
# 커밋을 원격 저장소(GitHub)로 전송
git push
# 원격 저장소의 최신 변경 사항 다운로드
git pull
# 새 브랜치 생성 (병렬 작업 라인)
git checkout -b feature/my-new-feature
# 커밋 히스토리 보기
git log --oneline
GitHub 기초
GitHub은 Git 저장소를 호스팅하는 웹 플랫폼입니다. Git 위에 협업 기능을 추가합니다: 팀 접근 관리, 코드 리뷰 도구, 이슈 추적, Pull Request. AI 워크스페이스는 GitHub에 있으며, sync 파이프라인이 GitHub와 상호작용하여 변경 사항을 푸시하고 PR을 생성합니다.
Pull Request (PR)
Pull Request (PR)는 한 브랜치의 변경 사항을 다른 브랜치로 병합하자는 제안입니다. 협업 프로젝트에서 코드 리뷰의 표준 메커니즘입니다. 작동 방식은 다음과 같습니다.
- 브랜치 생성 — 새 브랜치(코드의 병렬 사본)를 만들어 그 위에서 작업합니다. 이렇게 하면 작업하는 동안 메인 브랜치가 안정적으로 유지됩니다.
- 변경 및 커밋 — 파일을 수정하고, 새 에이전트나 스킬을 추가하며, 브랜치에 변경 사항을 커밋합니다.
- PR 열기 — "이 변경 사항을 검토하고 메인 브랜치에 병합해 주세요"라는 Pull Request를 생성합니다.
- 리뷰 — 팀원(또는 자동화된 검사)이 변경 사항을 검토하고, 의견을 남기며, 필요한 경우 수정을 요청합니다.
- 병합(Merge) — 승인되면 PR이 메인 브랜치에 병합되고, 변경 사항이 공식 프로젝트의 일부가 됩니다.
/sync를 실행하면 파이프라인이 스테이징, 커밋, 푸시, PR 생성을 모두 처리합니다. 모든 Git 명령어를 외울 필요는 없습니다. 하지만 커밋이 무엇인지, 브랜치가 무엇인지, PR이 무엇을 하는지 같은 개념을 이해하면 자동화가 배후에서 무엇을 하는지 파악하는 데 도움이 됩니다.
훅(Hooks)
훅(Hook)은 특정 이벤트가 발생할 때 자동으로 실행되는 스크립트입니다. "hook"이라는 단어는 낚시에서 유래했습니다. 물고기가 지나가면 낚시바늘이 물고기를 낚듯이, 코드 훅은 이벤트를 낚아서 그에 응답하는 스크립트를 실행합니다.
훅의 작동 방식
AI 하니스에서 훅은 핵심 순간에 규칙을 강제하고 검사를 자동화하는 데 사용됩니다. 개발자가 수동으로 검사를 실행하도록 의존하는 대신, 훅은 관련 이벤트가 발생할 때마다 검사가 자동으로 실행되도록 보장합니다.
가장 일반적인 유형의 훅은 Git 훅으로, 특정 Git 작업 전후에 Git이 자동으로 실행하는 스크립트입니다.
# pre-commit — 커밋이 완료되기 전에 실행
# 용도: 시크릿 검사, 린트(lint), 파일 포맷팅
# commit-msg — 커밋 메시지가 작성된 후에 실행
# 용도: 커밋 메시지 형식 검증
# pre-push — 원격 저장소에 푸시하기 전에 실행
# 용도: 테스트 실행, 빌드 통과 확인
# post-merge — 브랜치가 병합된 후에 실행
# 용도: 의존성 설치, 락 파일 업데이트
# post-checkout — 브랜치가 전환된 후에 실행
# 용도: 설정 파일 재로드, 환경 초기화
경보 시스템 비유
훅을 건물의 경보 시스템이라고 생각해 보세요. 매일 밤 모든 문과 창문을 잠그는 것을 기억할 필요가 없습니다. 경보 시스템이 자동으로 모니터링합니다. 권한 없이 문이 열리면 경보가 즉시 울립니다. 마찬가지로 훅도 워크플로우를 자동으로 모니터링합니다.
pre-commit 훅은 건물을 나가기 전에 가방을 검사하는 보안 요원과 같습니다. pre-push 훅은 제품을 고객에게 배송하기 전의 최종 검사와 같습니다. 이 검사들을 매번 직접 할 수도 있지만, 훅이 있으면 바쁘거나 잊었을 때도 절대 건너뛰지 않습니다.
AI 하니스에서는 도구 수준에서도 훅을 정의할 수 있습니다. 예를 들어 Claude Code 훅은 AI 에이전트가 파일을 수정하려고 할 때 스크립트를 트리거할 수 있어, Git 훅 이상의 추가 강제 레이어를 제공합니다.
쉽게 말해 도구 수준 훅은 AI 에이전트를 위한 자동 안전장치입니다. 에이전트가 파일을 고치려 하거나 다른 에이전트를 부르는 그 순간에 끼어들어, 문제가 커지기 전에 잡아 줍니다. 실제로 이 워크스페이스의 .claude/settings.json에는 아래와 같은 도구 훅이 등록되어 있습니다(2026-08-24 기준).
| 훅 스크립트 | 실행 시점 | 하는 일 |
|---|---|---|
gateguard-fact-force.ts |
PreToolUse · Edit/Write/MultiEdit | 사전 검증 게이트 — 파일을 수정하기 전에 이 파일을 참조하는 곳과 변경의 사실 관계를 먼저 확인합니다. |
agent-model-gate.ts |
PreToolUse · Agent | 모델 등급 강제 — 에이전트를 호출할 때 작업 난이도에 맞는 모델 등급(High/Medium/Low)을 쓰는지 검사합니다. |
post-write-lifecycle-check.ts |
PostToolUse · Write/Edit + TeammateIdle | 사후 라이프사이클 검사 — 파일이 수정된 후 버전 기록이나 CHANGELOG 갱신이 필요한지 확인합니다. |
audit.ts |
TaskCompleted | 작업 완료 QA 감사 — 에이전트의 작업이 끝날 때마다 워크스페이스 전체 감사를 자동으로 실행합니다. |
git config core.hooksPath .githooks |
SessionStart / WorktreeCreate | Git 훅 연결 — 세션 또는 작업트리(worktree) 시작 시 Git 훅 폴더(.githooks)를 연결해 pre-commit 같은 Git 훅이 항상 작동하게 만듭니다. |
CI/CD 기초
CI/CD는 Continuous Integration / Continuous Delivery(지속적 통합 / 지속적 배포)의 약자입니다. 코드 변경 사항을 테스트하고 배포하는 과정을 자동화하는 실천 방법입니다. CI/CD는 소프트웨어 엔지니어링의 넓은 주제지만, 기본 개념을 이해하면 AI 하니스가 품질을 어떻게 유지하는지 파악하는 데 도움이 됩니다.
지속적 통합 (CI)
지속적 통합(Continuous Integration)은 누군가 변경 사항을 푸시할 때마다 자동으로 코드를 빌드하고 테스트하는 것을 의미합니다. 지정된 "테스트의 날"을 기다리는 대신, 모든 변경이 즉시 테스트됩니다. 이렇게 하면 버그와 문제를 수정하기 가장 쉬운 초기 단계에서 잡을 수 있습니다.
AI 하니스의 맥락에서 CI는 Pull Request가 생성되거나 업데이트될 때마다 감사 스크립트, 검증 검사, 테스트를 자동으로 실행하는 것을 의미합니다.
지속적 배포 (CD)
지속적 배포(Continuous Delivery)은 코드 변경 사항을 릴리스 준비 상태로 자동화하는 것을 의미합니다. 테스트를 통과한 후 시스템은 최소한의 수동 개입으로 변경 사항을 프로덕션에 배포할 수 있습니다. 핵심 단어는 "배달(delivery)"입니다. 변경 사항이 출하 준비되지만, 최종 릴리스는 여전히 사람이 승인합니다.
AI 하니스에서 CD는 PR이 승인되고 병합되면 업데이트된 워크스페이스가 모든 팀원과 변형 프로젝트에 자동으로 제공되는 것을 의미합니다.
GitHub Actions 예시
GitHub과 함께 가장 많이 사용되는 CI/CD 도구는 GitHub Actions입니다. 간단한 CI 워크플로우가 개념적으로 어떻게 보이는지 살펴보겠습니다.
# PR이 생성될 때 자동으로 실행
on: pull_request
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: bun install
- run: bun scripts/audit.ts # 워크스페이스 검증
- run: bun scripts/validate-skills.ts # 스킬 확인
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: gitleaks detect # 시크릿 스캔
dev-sync.ts의 작동 원리
scripts/dev-sync.ts 스크립트는 sync 파이프라인을 구동하는 TypeScript 구현체입니다. /sync 명령어의 엔진입니다. 내부적으로 무엇을 하는지 알아보겠습니다.
목적
dev-sync.ts는 3단계 상속 계층 구조에서 변경 사항을 동기화합니다. L0 워크스페이스 루트나 L1 공통 템플릿에서 파일을 수정하면 dev-sync.ts가 변경 사항이 모든 다운스트림 변형 프로젝트(L2)에 올바르게 전파되도록 합니다. L2 변형은 기본 구조를 L0과 L1에서 상속받기 때문에 이 동기화가 없으면 상위의 변경이 이를 의존하는 변형에 절대 도달하지 않습니다.
4단계 프로세스
- 변경 감지 — 스크립트가 L0 및 L1 파일의 현재 상태를 마지막으로 알려진 상태와 비교합니다. 마지막 sync 이후 추가, 수정, 삭제된 파일을 식별합니다.
- 계약 검증 — 전파하기 전에 변경 사항이 공통 계약을 준수하는지 확인합니다. 변경이 계약을 위반하면(예: 다른 프로젝트가 의존하는 파일 이름 변경), 스크립트가 위반을 보고하고 중지합니다.
- 변경 게시 — 검증된 변경 사항이 L0에서 L1(또는 L1에서 L2 변형)로 복사됩니다. 스크립트는 공유 업데이트를 적용하면서 변형별 사용자 정의를 보존합니다.
- 무결성 검증 — 게시 후 스크립트가 최종 검증을 실행하여 모든 다운스트림 프로젝트가 유효한 상태인지 확인합니다. 상속된 모든 파일이 존재하고 충돌이 없는지 검사합니다.
dev-sync.ts)을 통해 업데이트가 모든 지사에 자동으로 전송됩니다. 각 지사는 업데이트를 받으면서 자체 로컬 사용자 정의를 그대로 유지합니다.
dev-sync.ts를 실행하기 전에 항상 작업을 커밋하세요. sync 스크립트는 저장소의 커밋된 상태에서 작동합니다. 커밋되지 않은 변경이 있으면 스크립트가 예상치 못한 결과를 내거나 올바른 diff를 감지하지 못할 수 있습니다. 먼저 git status를 실행하여 작업 디렉터리가 깨끗한지 확인하거나, sync를 시작하기 전에 모든 미해결 변경을 커밋하세요.
dev-sync.ts 수동 실행
/sync가 전체 파이프라인을 자동으로 실행하지만, 더 많은 제어가 필요할 때 dev-sync.ts를 직접 실행할 수도 있습니다.
# sync 스크립트 직접 실행
bun scripts/dev-sync.ts
# 스크립트가 수행하는 작업:
# 1. L0 및 L1의 변경 사항 감지
# 2. 공통 계약에 대한 검증
# 3. 다운스트림 변형에 변경 사항 게시
# 4. 모든 프로젝트의 무결성 검증
# 도움말 및 사용 가능한 옵션 확인
bun scripts/dev-sync.ts --help
dev-sync.ts 스크립트는 핵심 동기화 도구입니다. 모든 템플릿과 변형에서 표준화되고 동일하게 유지되어야 합니다. L3 프로젝트에서 이 핵심 스크립트를 직접 수정하는 것은 엄격히 금지됩니다. 변형에 사용자 정의 검사가 필요하면 대신 scripts/audit-variant.ts에 별도의 플러그인 훅 스크립트로 구현해야 합니다.
실습: 워크플로우 직접 체험하기
이제 처음부터 끝까지 현실적인 워크플로우를 직접 체험해 보면서 모든 것을 종합해 보겠습니다. 목표: 파일 변경을 하고, 커밋하고, /sync를 실행하여 전체 자동화 파이프라인을 완료하는 것입니다.
git branch로 현재 브랜치를 확인하세요. 변경하기 전에 feature 브랜치(메인 브랜치가 아닌)에 있는지 확인하세요. main에서 직접 작업하면 PR 리뷰 프로세스를 우회하게 되어 불안정성을 초래할 수 있습니다.
-
feature 브랜치를 생성합니다. 작업용 새 브랜치를 만들어 변경 사항을 메인 브랜치에서 격리하고, 병합 전 리뷰를 가능하게 합니다.
git checkout -b feature/update-agent-tier - 변경 사항을 적용합니다. 수정이 필요한 파일을 편집합니다. 예를 들어 에이전트의 티어를 마크다운 파일에서 업데이트하거나, 새 스킬을 추가하거나, 문서 오류를 수정할 수 있습니다. 편집 전에 Version Agent를 사용하여 파일 스냅샷을 만드세요.
-
변경 사항을 검토합니다. 커밋하기 전에 무엇을 변경했는지 검토하여 모든 것이 올바른지 확인합니다.
git status # 변경된 파일 확인 git diff # 실제 차이점 보기 -
변경 사항을 커밋합니다. 명확한 컨벤셔널 커밋 메시지로 스테이징하고 커밋합니다.
git add agents/my-agent.md git commit -m "feat(agent): update tier from low to medium" -
/sync를 실행합니다. 설명적인 메시지와 함께 sync 명령어를 실행합니다. 파이프라인이 감사를 실행하고, 라이프사이클 레코드를 업데이트하고, 커밋을 푸시하고, PR을 생성합니다./sync "feat(agent): update tier from low to medium" - PR을 검토하고 병합합니다. PR이 생성되면 GitHub에서 검토합니다. 자동화된 검사를 통과하고 변경 사항이 올바르게 보이면 PR을 메인 브랜치에 병합합니다.
배후에서 일어나는 일
이 워크플로우를 따를 때 시스템이 각 단계에서 무엇을 하는지 살펴보겠습니다.
docs/lifecycle/agents/의 에이전트 라이프사이클 레코드를 업데이트
audit.ts 실행 → 파일 구조, 프론트매터, 명명 규칙 검증 → 모든 검사 통과
/sync 명령어로 모든 것 완료