update agent-ops skills and sync scripts

This commit is contained in:
toki 2026-05-21 17:52:04 +09:00
parent b3b3c07ddb
commit 0b1ecf0554
8 changed files with 143 additions and 73 deletions

View file

@ -5,6 +5,7 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
AGENT_OPS_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
PROJECT_ROOT="$(cd "$AGENT_OPS_DIR/.." && pwd)"
SOURCE_REPO_DEFAULT="${AGENT_OPS_SOURCE_REPO:-agentic-framework}"
# ── 색상 ─────────────────────────────────────────────────────────────────────
RED='\033[0;31m'; YELLOW='\033[1;33m'; GREEN='\033[0;32m'; RESET='\033[0m'
@ -29,6 +30,39 @@ resolve_target() {
[[ -d "$sibling" ]] && echo "$sibling" || echo ""
}
find_default_source_repo() {
local explicit="${AGENT_OPS_SOURCE_REPO:-}"
local target=""
if [[ -n "$explicit" ]]; then
resolve_target "$explicit"
return
fi
target="$(resolve_target "$SOURCE_REPO_DEFAULT")"
if [[ -n "$target" && -f "$target/.agent-ops-source" ]]; then
echo "$target"
return
fi
local parent
local -a source_repos
parent="$(dirname "$PROJECT_ROOT")"
mapfile -t source_repos < <(
find "$parent" -mindepth 1 -maxdepth 1 -type d | sort | while IFS= read -r candidate; do
local resolved
resolved="$(cd "$candidate" && pwd)"
[[ "$resolved" == "$PROJECT_ROOT" ]] && continue
[[ -f "$resolved/.agent-ops-source" ]] || continue
echo "$resolved"
done
)
if [[ "${#source_repos[@]}" -eq 1 ]]; then
echo "${source_repos[0]}"
fi
}
# ── 버전 비교: v1 > v2 이면 0 반환 ───────────────────────────────────────────
version_gt() {
local v1="$1" v2="$2"
@ -97,6 +131,7 @@ discover_agent_ops_targets() {
local resolved
resolved="$(cd "$candidate" && pwd)"
[[ "$resolved" == "$PROJECT_ROOT" ]] && continue
[[ ! -f "$resolved/.agent-ops-source" ]] || continue
[[ -d "$resolved/agent-ops" ]] || continue
echo "$resolved"
done
@ -139,7 +174,7 @@ commit_and_push_agent_ops_scope() {
)
}
sync_framework_to_target() {
sync_source_to_target() {
local target="$1"
local dst_ao="$target/agent-ops"
local src_ver
@ -173,10 +208,11 @@ usage() {
echo "사용법: $0 [--pull] [target]"
echo ""
echo " (기본) push 동기화"
echo " --pull target(agentic-framework) → 현재 프로젝트 로 pull"
echo " --pull target(source repo) → 현재 프로젝트 로 pull"
echo ""
echo " target: 폴더명 (동일 레벨 탐색) | 상대경로 | 절대경로"
echo " agentic-framework에서 target 생략 시 상위 폴더의 agent-ops 적용 프로젝트 전체 동기화"
echo " source repo에서 target 생략 시 상위 폴더의 agent-ops 적용 프로젝트 전체 동기화"
echo " 일반 프로젝트에서 target 생략 시 AGENT_OPS_SOURCE_REPO 또는 sibling source repo(.agent-ops-source)를 사용"
}
# ─────────────────────────────────────────────────────────────────────────────
@ -189,53 +225,55 @@ fi
TARGET_INPUT="${1:-}"
SRC_AO="$AGENT_OPS_DIR"
IS_FRAMEWORK="$([[ -f "$PROJECT_ROOT/.agent-ops-source" ]] && echo "1" || echo "0")"
IS_SOURCE_REPO="$([[ -f "$PROJECT_ROOT/.agent-ops-source" ]] && echo "1" || echo "0")"
# ── pull 모드: agentic-framework → 현재 프로젝트 ─────────────────────────────
# ── pull 모드: source repo → 현재 프로젝트 ─────────────────────────────────
if [[ "$PULL_MODE" == "1" ]]; then
if [[ -z "$TARGET_INPUT" ]]; then
usage; exit 1
if [[ "$IS_SOURCE_REPO" == "1" ]]; then
echo -e "${RED}Error: source repo에서는 --pull을 사용할 수 없습니다.${RESET}"
exit 1
fi
if [[ -z "$TARGET_INPUT" ]]; then
TARGET="$(find_default_source_repo)"
else
TARGET="$(resolve_target "$TARGET_INPUT")"
fi
TARGET="$(resolve_target "$TARGET_INPUT")"
if [[ -z "$TARGET" ]]; then
echo -e "${RED}Error: 대상을 찾을 수 없습니다: $TARGET_INPUT${RESET}"
echo -e "${RED}Error: source repo를 찾을 수 없습니다: ${TARGET_INPUT:-$SOURCE_REPO_DEFAULT}${RESET}"
exit 1
fi
DST_AO="$TARGET/agent-ops"
if [[ "$IS_FRAMEWORK" == "1" ]]; then
echo -e "${RED}Error: agentic-framework에서는 --pull을 사용할 수 없습니다.${RESET}"
exit 1
fi
if [[ ! -f "$TARGET/.agent-ops-source" ]]; then
echo -e "${RED}Error: target이 agentic-framework가 아닙니다 (.agent-ops-source 없음)${RESET}"
echo -e "${RED}Error: target이 source repo가 아닙니다 (.agent-ops-source 없음)${RESET}"
exit 1
fi
SRC_VER="$(cat "$SRC_AO/.version" 2>/dev/null || echo "0.0.0")"
DST_VER="$(cat "$DST_AO/.version" 2>/dev/null || echo "0.0.0")"
echo "$(basename "$TARGET")$(basename "$PROJECT_ROOT") (pull)"
echo " 현재 버전: $SRC_VER | framework 버전: $DST_VER"
echo " 현재 버전: $SRC_VER | source 버전: $DST_VER"
sync_common "$DST_AO" "$SRC_AO"
cp "$DST_AO/.version" "$SRC_AO/.version"
apply_agent_ops_entry_files "$DST_AO/rules/common/rules.md" "$PROJECT_ROOT"
cd "$PROJECT_ROOT"
git add agent-ops/rules/common agent-ops/skills/common agent-ops/bin agent-ops/.version \
"${AGENT_OPS_ENTRY_FILES[@]}"
git commit -m "sync: pull from agentic-framework v$DST_VER"
git commit -m "sync: pull from $(basename "$TARGET") v$DST_VER"
git push
echo -e "${GREEN}✓ 완료 (pull v$DST_VER)${RESET}"
exit 0
fi
# ── agentic-framework에서 다른 프로젝트로 ────────────────────────────────────
if [[ "$IS_FRAMEWORK" == "1" ]]; then
# ── source repo에서 다른 프로젝트로 ─────────────────────────────────────────
if [[ "$IS_SOURCE_REPO" == "1" ]]; then
if [[ -n "$TARGET_INPUT" ]]; then
TARGET="$(resolve_target "$TARGET_INPUT")"
if [[ -z "$TARGET" ]]; then
echo -e "${RED}Error: 대상을 찾을 수 없습니다: $TARGET_INPUT${RESET}"
exit 1
fi
sync_framework_to_target "$TARGET"
sync_source_to_target "$TARGET"
else
mapfile -t TARGETS < <(discover_agent_ops_targets)
if [[ "${#TARGETS[@]}" -eq 0 ]]; then
@ -245,7 +283,7 @@ if [[ "$IS_FRAMEWORK" == "1" ]]; then
STATUS=0
for TARGET in "${TARGETS[@]}"; do
if ! sync_framework_to_target "$TARGET"; then
if ! sync_source_to_target "$TARGET"; then
STATUS=1
fi
done
@ -254,14 +292,15 @@ if [[ "$IS_FRAMEWORK" == "1" ]]; then
exit 0
fi
# ── 일반 프로젝트에서 agentic-framework로 (push) ─────────────────────────────
# ── 일반 프로젝트에서 source repo로 (push) ──────────────────────────────────
if [[ -z "$TARGET_INPUT" ]]; then
TARGET_INPUT="agentic-framework"
TARGET="$(find_default_source_repo)"
else
TARGET="$(resolve_target "$TARGET_INPUT")"
fi
TARGET="$(resolve_target "$TARGET_INPUT")"
if [[ -z "$TARGET" ]]; then
echo -e "${RED}Error: 대상을 찾을 수 없습니다: $TARGET_INPUT${RESET}"
echo -e "${RED}Error: source repo를 찾을 수 없습니다: ${TARGET_INPUT:-$SOURCE_REPO_DEFAULT}${RESET}"
exit 1
fi
DST_AO="$TARGET/agent-ops"
@ -269,16 +308,16 @@ DST_AO="$TARGET/agent-ops"
echo "$(basename "$PROJECT_ROOT")$(basename "$TARGET")"
if [[ ! -f "$TARGET/.agent-ops-source" ]]; then
echo -e "${RED}Error: target이 agentic-framework가 아닙니다 (.agent-ops-source 없음)${RESET}"
echo -e "${RED}Error: target이 source repo가 아닙니다 (.agent-ops-source 없음)${RESET}"
exit 1
fi
SRC_VER="$(cat "$SRC_AO/.version" 2>/dev/null || echo "0.0.0")"
DST_VER="$(cat "$DST_AO/.version" 2>/dev/null || echo "0.0.0")"
echo " 현재 버전: $SRC_VER | framework 버전: $DST_VER"
echo " 현재 버전: $SRC_VER | source 버전: $DST_VER"
if version_gt "$DST_VER" "$SRC_VER"; then
echo -e "${RED}⚠ 버전 충돌: framework($DST_VER) > current($SRC_VER)${RESET}"
echo -e "${RED}⚠ 버전 충돌: source($DST_VER) > current($SRC_VER)${RESET}"
echo -e "${YELLOW} 먼저 sync-pull로 내려받은 뒤 재시도하세요.${RESET}"
exit 1
fi
@ -289,6 +328,6 @@ echo "$NEW_VER" > "$SRC_AO/.version"
echo "$NEW_VER" > "$DST_AO/.version"
commit_and_push_agent_ops_scope "$TARGET" "sync: from $(basename "$PROJECT_ROOT") v$NEW_VER"
commit_and_push_agent_ops_scope "$PROJECT_ROOT" "sync: to agentic-framework v$NEW_VER"
commit_and_push_agent_ops_scope "$PROJECT_ROOT" "sync: to $(basename "$TARGET") v$NEW_VER"
echo -e "${GREEN}✓ 완료 (v$SRC_VER → v$NEW_VER)${RESET}"

View file

@ -15,6 +15,8 @@ plan skill -> implementation -> code-review skill
+----- issues found: new routed plan/review files
```
If this skill is invoked, the review finalization contract is mandatory. Do not leave an ad hoc review comment only; every selected active review must end in exactly one recorded next state.
## Core Loop Rules
- Trigger: Korean or English active-task review requests, including `리뷰 진행해` and `리뷰해줘`, must use this skill when `agent-task/*/CODE_REVIEW-*-G??.md` exists.

View file

@ -31,7 +31,8 @@ description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬
## 먼저 확인할 것
- [ ] `agent-ops/skills/common/``agent-ops/skills/project/` 하위에 동일 이름의 디렉터리가 이미 존재하는지 확인
- [ ] `agent-ops/rules/common/rules.md``agent-ops/rules/project/rules.md` 에 이미 유사한 라우팅 항목이 있는지 확인
- [ ] `agent-ops/skills/common/router.md``agent-ops/rules/project/rules.md` 에 이미 유사한 라우팅 항목이 있는지 확인
- [ ] 공통 스킬을 생성하는 경우, 새 요청 범주가 `agent-ops/rules/common/rules.md`의 router 로딩 목록에 이미 포함되는지 확인
- [ ] `agent-ops/skills/common/_templates/skill-template.md` 를 읽어 최신 템플릿 형식 파악
## 실행 절차
@ -56,7 +57,8 @@ description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬
- 절차는 구체적이되 지나치게 세부 구현을 기술하지 않는다
4. **라우팅 업데이트**
- `.agent-ops-source` 마커가 **있으면** (공통 관리 레포): `agent-ops/rules/common/rules.md`에 라우팅 항목 추가
- `.agent-ops-source` 마커가 **있으면** (공통 관리 레포): `agent-ops/skills/common/router.md`에 라우팅 항목 추가
- 공통 스킬의 요청 범주가 `agent-ops/rules/common/rules.md`의 router 로딩 목록에 없을 때만 해당 범주를 추가한다
- `.agent-ops-source` 마커가 **없으면** (타겟 프로젝트): `agent-ops/rules/project/rules.md`의 프로젝트 스킬 라우터 섹션에 라우팅 항목 추가
- 이 skill이 속할 라우팅 축(구조 분석/코드 변경/흐름 추적 등)을 판단한다
- 기존 라우팅 구조를 깨지 않는다
@ -83,7 +85,7 @@ description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬
- [ ] `agent-ops/skills/{common|project}/<skill-name>/SKILL.md` 파일이 생성되었는가
- [ ] 생성된 파일이 `skill-template.md`의 필수 섹션(목적, 언제 호출할지, 실행 절차, 실행 결과 검증, 출력 형식, 금지 사항)을 포함하는가
- [ ] frontmatter에 name, version, description이 올바르게 기재되었는가
- [ ] 라우팅 대상 파일에 해당 스킬의 라우팅 항목이 추가되었는가
- [ ] 공통 스킬이면 `agent-ops/skills/common/router.md`, 프로젝트 스킬이면 `agent-ops/rules/project/rules.md` 라우팅 항목이 추가되었는가
- 검증 실패 시: 누락된 섹션 또는 라우팅 항목을 사용자에게 알리고 해당 부분만 보완한다
## 금지 사항

View file

@ -8,8 +8,12 @@ description: 프로젝트 상태를 판별하고 agent-ops 기본 스캐폴드
## 목적
프로젝트에 Agent-Ops 구조가 없거나 불완전할 때,
현재 프로젝트 상태를 분석하여 다음을 세팅한다.
프로젝트에 Agent-Ops 구조가 없거나 불완전할 때, 공통 scaffold를 배치한 뒤 현재 프로젝트 상태를 분석하여 프로젝트 전용 규칙 초안을 세팅한다.
`agent-ops/bin/init-agent-ops.sh`는 공통 scaffold와 빈 프로젝트 전용 디렉터리를 만드는 bootstrap 도구다.
이 스킬을 읽은 에이전트는 스크립트 실행 후 프로젝트를 분석하여 `rules/project/rules.md`와 필요한 domain rule 초안을 이어서 작성한다.
최종적으로 다음 상태를 만든다.
1. 에이전트 진입 파일
2. AI ignore / permission 기본 설정
@ -41,11 +45,29 @@ description: 프로젝트 상태를 판별하고 agent-ops 기본 스캐폴드
- 기존 구조를 우선한다.
- 새 파일 생성은 꼭 필요한 최소 범위로 제한한다.
- 스크립트가 만드는 공통 scaffold와 에이전트가 분석해 작성하는 프로젝트 전용 파일을 구분한다.
- 도메인은 발명하지 말고 현재 구조에서 발견한다.
- 처음에는 핵심 도메인만 생성한다.
- 반복되는 작업만 초기 skill로 만든다.
- 불확실한 내용은 후보로 제시한다.
## 실행 책임 구분
### init-agent-ops.sh가 수행하는 일
- 에이전트 진입 파일 생성
- AI ignore / permission 기본 설정
- `agent-ops/bin`, `agent-ops/rules/common`, `agent-ops/skills/common` 복사
- `agent-ops/rules/project/domain`, `agent-ops/rules/private`, `agent-ops/skills/project` 디렉터리 생성
- `.gitignore``agent-ops/rules/private/` 추가
### 에이전트가 이어서 수행하는 일
- 프로젝트 구조를 분석해 `agent-ops/rules/project/rules.md` 생성
- 필요한 최소 domain rule 초안 생성
- 반복 작업이 보이는 경우 프로젝트 skill 후보 제안
- 불확실한 항목은 확정하지 않고 TODO 또는 후보로 남김
## 상태 판별
### 신규 프로젝트
@ -67,8 +89,8 @@ description: 프로젝트 상태를 판별하고 agent-ops 기본 스캐폴드
| `agent-ops/bin/` | 공통 스크립트 전체 복사 (진입 파일 목록의 단일 기준인 `entry-files.sh` 포함) |
| `agent-ops/rules/common/` | 공통 폴더 전체 복사 (수정 금지) |
| `agent-ops/skills/common/` | 공통 폴더 전체 복사 (수정 금지) |
| `agent-ops/rules/project/rules.md` | 프로젝트 분석 후 생성 |
| `agent-ops/rules/project/domain/<domain>/rules.md` | 도메인 분석 후 생성 |
| `agent-ops/rules/project/rules.md` | 스크립트 실행 후 에이전트가 프로젝트 분석으로 생성 |
| `agent-ops/rules/project/domain/<domain>/rules.md` | 스크립트 실행 후 에이전트가 필요한 최소 도메인만 분석해 생성 |
| `agent-ops/rules/private/` | 폴더만 생성 (내용은 개인이 작성) |
| `.gitignore``agent-ops/rules/private/` 추가 | git 추적 제외 |
| `.geminiignore`, `.aiexclude`, `.cursorignore`, `.clineignore` | `agent-task/archive/**` 한 줄 추가 |
@ -158,7 +180,9 @@ common/rules.md와 내용이 중복되지 않도록 한다.
## 실행 (Execution)
지정한 대상 디렉토리에 agent-ops 스캐폴드를 생성한다.
지정한 대상 디렉토리에 agent-ops 공통 스캐폴드를 생성한다.
이 명령은 프로젝트 전용 `rules/project/rules.md`나 domain rule 본문을 채우지 않는다.
명령 실행 후 아래 실행 절차의 프로젝트 분석 단계를 반드시 이어서 수행한다.
```bash
./agent-ops/bin/init-agent-ops.sh <target_directory>
@ -169,31 +193,29 @@ common/rules.md와 내용이 중복되지 않도록 한다.
1. **상태 판별**
- 프로젝트 구조, 모듈 경계, agent-ops 파일 유무를 분석하여 신규/운영중을 판별한다
2. **에이전트 진입 파일 생성**
- `rules/common/rules.md``agent-ops/bin/entry-files.sh`의 파일 목록으로 프로젝트 루트에 복사한다
2. **공통 scaffold 생성**
- `./agent-ops/bin/init-agent-ops.sh <target_directory>`를 실행한다
- 스크립트 결과로 진입 파일, 공통 rules/skills/bin, 빈 project/private 디렉터리가 생성됐는지 확인한다
3. **AI ignore / permission 기본 설정**
- `.geminiignore`, `.aiexclude`, `.cursorignore`, `.clineignore``agent-task/archive/**`를 추가한다
- `.claude/settings.json`, `opencode.json`이 없으면 archive 읽기/검색 제외 설정을 생성한다
3. **스크립트 결과 확인**
- `rules/common/rules.md`가 진입 파일로 복사됐는지 확인한다
- `.geminiignore`, `.aiexclude`, `.cursorignore`, `.clineignore``agent-task/archive/**`가 추가됐는지 확인한다
- `.claude/settings.json`, `opencode.json`은 없으면 생성되고, 있으면 수동 병합 안내가 출력됐는지 확인한다
- `agent-task/archive/**` 제외는 `.gitignore`에 추가하지 않는다
4. **agent-ops 폴더 구조 복사**
- 공통 관리 레포의 `agent-ops/` 공통 폴더(bin, rules/common, skills/common)를 복사한다
- `agent-ops/.version` 파일을 복사한다
5. **rules/project/rules.md 생성**
4. **rules/project/rules.md 생성**
- 프로젝트를 분석하여 응답 언어, 프로젝트 개요, 기술 스택 등을 채운다
- common/rules.md와 내용이 중복되지 않도록 한다
6. **도메인 분석 및 domain rule 생성**
5. **도메인 분석 및 domain rule 생성**
- 신규 프로젝트: 핵심 domain placeholder 2~4개만 제안한다. domain rules를 과도하게 채우지 않는다
- 운영중 프로젝트: Core/Supporting/Generic 도메인을 식별하고 실제 경로를 반영한 초안을 생성한다
7. **초기 skill 제안**
6. **초기 skill 제안**
- 신규 프로젝트: 최소 2개만 제안한다
- 운영중 프로젝트: 반복 작업 기반으로 필요한 skill을 제안한다
8. **결과 보고**
7. **결과 보고**
- 상태 판별 결과, 생성된 파일 목록, 도메인 제안, skill 제안, 주의사항을 출력한다
## 출력 형식
@ -204,8 +226,8 @@ common/rules.md와 내용이 중복되지 않도록 한다.
- 근거: 짧게 요약
### 스캐폴드 계획
- 생성할 파일
- 바로 채울 파일
- 스크립트로 생성된 공통 파일
- 에이전트가 분석해 생성한 프로젝트 전용 파일
- placeholder로 둘 파일
### 도메인 제안

View file

@ -15,6 +15,8 @@ implementation -> code changes + filled CODE_REVIEW-{review_lane}-GNN.md
code-review skill -> verdict + archive, complete.log, and PASS task-directory archive move or new follow-up plan/review files
```
If this skill is invoked, the plan-code-review workflow is mandatory. Do not downgrade the request into an informal plan, and do not stop before writing both the active PLAN file and its paired CODE_REVIEW stub.
## Workflow Contract
This skill intentionally uses routed active files under `agent-task/{task_name}/` as the state protocol. Do not change this filename contract unless the paired code-review skill is updated together.

View file

@ -12,6 +12,6 @@
| 계획 세워줘, 구현 계획, PLAN.md, plan | `agent-ops/skills/common/plan/SKILL.md` |
| 코드 리뷰해줘, 리뷰 진행해, 리뷰해줘, code review, CODE_REVIEW.md, 리뷰 루프 | `agent-ops/skills/common/code-review/SKILL.md` |
| 커밋해줘, 푸시해줘, commit, push, 반영해줘 | `agent-ops/skills/common/commit-push/SKILL.md` |
| agent-ops 싱크해, agent-ops 동기화해, agentic-framework에 올려줘, agent-ops를 [프로젝트]로 싱크해 | `agent-ops/skills/common/sync-push/SKILL.md` |
| agent-ops pull해, agent-ops 가져와, agentic-framework에서 가져와, agent-ops 내려받아 | `agent-ops/skills/common/sync-pull/SKILL.md` |
| agent-ops 싱크해, agent-ops 동기화해, source repo에 올려줘, agentic-framework에 올려줘, agent-ops를 [프로젝트]로 싱크해 | `agent-ops/skills/common/sync-push/SKILL.md` |
| agent-ops pull해, agent-ops 가져와, source repo에서 가져와, agentic-framework에서 가져와, agent-ops 내려받아 | `agent-ops/skills/common/sync-pull/SKILL.md` |
| 도메인 업데이트, domain rule 갱신, 도메인 검토, domain 스캔 | `agent-ops/skills/common/update-domain-rule/SKILL.md` |

View file

@ -1,25 +1,26 @@
---
name: sync-pull
description: agentic-framework에서 현재 프로젝트로 agent-ops를 내려받는다. "agent-ops pull해", "agentic-framework에서 가져와" 요청 시 사용한다.
description: source repo에서 현재 프로젝트로 agent-ops를 내려받는다. "agent-ops pull해", "source repo에서 가져와", "agentic-framework에서 가져와" 요청 시 사용한다.
---
# sync-pull
## 목적
`agent-ops/bin/sync.sh --pull`을 호출해 agentic-framework → 현재 프로젝트 방향으로 agent-ops를 내려받는다.
`agent-ops/bin/sync.sh --pull`을 호출해 `.agent-ops-source`가 있는 source repo → 현재 프로젝트 방향으로 agent-ops를 내려받는다.
## 언제 호출할지
- "agent-ops pull해", "agent-ops 가져와" 요청 시
- "agentic-framework에서 가져와" 요청 시
- "source repo에서 가져와", "agentic-framework에서 가져와" 요청 시
- "agent-ops 내려받아" 요청 시
## 실행 절차
1. 현재 프로젝트의 **상위 폴더(`../`)**`agentic-framework` 폴더가 있는지 확인한다 (현재 폴더 내부가 아님)
2. **있으면**: `agent-ops/bin/sync.sh --pull agentic-framework` 실행
3. **없으면**: 사용자에게 agentic-framework 경로 입력을 안내하고, 입력받은 경로로 실행
1. 현재 프로젝트의 **상위 폴더(`../`)**`.agent-ops-source`가 있는 source repo가 있는지 확인한다
2. 기본 이름은 `agentic-framework`이고, 다른 이름을 쓰면 `AGENT_OPS_SOURCE_REPO=<name-or-path>` 또는 명시 target을 사용한다
3. **있으면**: `agent-ops/bin/sync.sh --pull` 또는 `agent-ops/bin/sync.sh --pull <source-repo>` 실행
4. **없으면**: 사용자에게 source repo 경로 입력을 안내하고, 입력받은 경로로 실행
```bash
agent-ops/bin/sync.sh --pull <target>
@ -28,8 +29,8 @@ agent-ops/bin/sync.sh --pull <target>
## 실행 결과 검증
- [ ] sync.sh 가 오류 없이 완료됐는가
- [ ] 현재 프로젝트 버전이 framework 버전과 일치하는가
- [ ] `agent-ops/bin/entry-files.sh`의 모든 진입 파일이 갱신됐고, 내용이 framework`agent-ops/rules/common/rules.md`와 일치하는가
- [ ] 현재 프로젝트 버전이 source repo 버전과 일치하는가
- [ ] `agent-ops/bin/entry-files.sh`의 모든 진입 파일이 갱신됐고, 내용이 source repo`agent-ops/rules/common/rules.md`와 일치하는가
## 금지 사항

View file

@ -1,6 +1,6 @@
---
name: sync-push
description: 현재 프로젝트의 agent-ops를 agentic-framework로 올리거나, agentic-framework의 공통 agent-ops를 대상 프로젝트 또는 상위 폴더의 agent-ops 적용 프로젝트 전체로 push하고 푸시한다. "agent-ops 싱크해", "agent-ops 동기화해", "agentic-framework에 올려줘" 요청 시 사용한다.
description: 현재 프로젝트의 agent-ops를 source repo로 올리거나, source repo의 공통 agent-ops를 대상 프로젝트 또는 상위 폴더의 agent-ops 적용 프로젝트 전체로 push하고 푸시한다. "agent-ops 싱크해", "agent-ops 동기화해", "source repo에 올려줘" 요청 시 사용한다.
---
# sync-push
@ -9,31 +9,33 @@ description: 현재 프로젝트의 agent-ops를 agentic-framework로 올리거
`agent-ops/bin/sync.sh`를 호출해 agent-ops 공통 파일을 push 방향으로 동기화한다.
- 일반 프로젝트에서는 현재 프로젝트 → agentic-framework 방향으로 올린다.
- agentic-framework 원본 프로젝트에서는 agentic-framework → 대상 프로젝트 방향으로 보내고, 대상 repo를 commit/push 한다.
- agentic-framework 원본 프로젝트에서 대상이 명시되지 않으면 현재 프로젝트의 상위 폴더에 있는 agent-ops 적용 프로젝트 전체로 보낸다.
- 일반 프로젝트에서는 현재 프로젝트 → `.agent-ops-source`가 있는 source repo 방향으로 올린다.
- source repo에서는 source repo → 대상 프로젝트 방향으로 보내고, 대상 repo를 commit/push 한다.
- source repo에서 대상이 명시되지 않으면 현재 프로젝트의 상위 폴더에 있는 agent-ops 적용 프로젝트 전체로 보낸다.
- 기본 source repo 이름은 `agentic-framework`이며, 필요하면 `AGENT_OPS_SOURCE_REPO` 환경 변수로 바꿀 수 있다.
## 언제 호출할지
- "agent-ops 싱크해", "agent-ops 동기화해" 요청 시
- "agentic-framework에 올려줘" 요청 시
- "source repo에 올려줘", "agentic-framework에 올려줘" 요청 시
- "agent-ops를 [프로젝트]로 싱크해" 요청 시
## 실행 절차
### 현 프로젝트가 일반 프로젝트인 경우 (`.agent-ops-source` 없음)
1. 현재 프로젝트의 **상위 폴더(`../`)**`agentic-framework` 폴더가 있는지 확인한다 (현재 폴더 내부가 아님)
2. **있으면**: `agent-ops/bin/sync.sh` 실행 또는 `agent-ops/bin/sync.sh agentic-framework` 실행
3. **없으면**: 사용자에게 agentic-framework 경로 입력을 안내하고, 입력받은 경로로 실행
1. 현재 프로젝트의 **상위 폴더(`../`)**`.agent-ops-source`가 있는 source repo가 있는지 확인한다
2. 기본 이름은 `agentic-framework`이고, 다른 이름을 쓰면 `AGENT_OPS_SOURCE_REPO=<name-or-path>` 또는 명시 target을 사용한다
3. **있으면**: `agent-ops/bin/sync.sh` 실행 또는 `agent-ops/bin/sync.sh <source-repo>` 실행
4. **없으면**: 사용자에게 source repo 경로 입력을 안내하고, 입력받은 경로로 실행
### 현 프로젝트가 agentic-framework인 경우 (`.agent-ops-source` 있음)
### 현 프로젝트가 source repo인 경우 (`.agent-ops-source` 있음)
1. 사용자 요청에서 target 프로젝트명 또는 경로를 추출한다
2. **명시된 경우**: `agent-ops/bin/sync.sh <target>` 실행
3. **명시되지 않은 경우**: `agent-ops/bin/sync.sh` 실행
4. target이 없으면 `sync.sh`가 현재 프로젝트 기준 상위 폴더(`../`)의 하위 디렉터리 중 `agent-ops/` 폴더가 있는 프로젝트를 모두 대상으로 삼는다
5. `sync.sh`는 현재 agentic-framework`agent-ops/rules/common/rules.md` 내용을 대상 프로젝트 루트의 진입 파일에 덮어쓴다
5. `sync.sh`는 현재 source repo`agent-ops/rules/common/rules.md` 내용을 대상 프로젝트 루트의 진입 파일에 덮어쓴다
6. 적용 후 각 대상 repo에서 agent-ops 공통 관리 경로(`rules/common/rules.md` 포함)와 진입 파일만 stage 하여 commit/push 한다
덮어쓰기 대상은 `init-agent-ops` 초기 세팅과 동일하며, 실제 목록은 `agent-ops/bin/entry-files.sh``AGENT_OPS_ENTRY_FILES`를 단일 기준으로 사용한다.
@ -58,8 +60,8 @@ agent-ops/bin/sync.sh [target]
- [ ] sync.sh 가 오류 없이 완료됐는가
- [ ] 버전 충돌 경고가 없었는가 — 있었다면 사용자에게 수동 머지 필요함을 알린다
- [ ] 대상 repo의 `agent-ops/rules/common/rules.md`가 현재 agentic-framework`agent-ops/rules/common/rules.md`와 일치하는가
- [ ] agentic-framework에서 대상 프로젝트로 push한 경우, `agent-ops/bin/entry-files.sh`의 모든 진입 파일 내용이 현재 agentic-framework`agent-ops/rules/common/rules.md`와 일치하는가
- [ ] 대상 repo의 `agent-ops/rules/common/rules.md`가 현재 source repo`agent-ops/rules/common/rules.md`와 일치하는가
- [ ] source repo에서 대상 프로젝트로 push한 경우, `agent-ops/bin/entry-files.sh`의 모든 진입 파일 내용이 현재 source repo`agent-ops/rules/common/rules.md`와 일치하는가
- [ ] 대상 repo에 commit/push 된 path가 agent-ops 공통 관리 경로와 진입 파일로 제한되었는가
## 금지 사항