diff --git a/.clinerules b/.clinerules index 211af25..55b20d1 100644 --- a/.clinerules +++ b/.clinerules @@ -15,6 +15,8 @@ - `agent-spec/archive/**`는 일반 작업에서 읽지 않는다. 과거 스펙 확인, 복원, 비교, 특정 archive 경로 확인이 필요한 경우에만 `agent-ops/rules/common/rules-agent-spec.md`의 archive 접근 규칙을 따른다. - agent-ops 구조, 규칙, 스킬, 로드맵, 런타임 책임 경계를 설계하거나 수정할 때만 `agent-ops/rules/common/philosophy.md`를 읽는다. - tracked `docs/`는 사람용 최신 가이드와 공개 설명만 둔다. +- project skill 경로 `agent-ops/skills/project//SKILL.md`를 선택했을 때 같은 이름의 `agent-ops/skills/private//SKILL.md`가 있으면 private skill을 우선한다. 없으면 project skill을 사용한다. +- project skill과 짝이 없는 private skill은 `agent-ops/rules/private/rules.md`에 명시적으로 라우팅한다. private skill 디렉터리 전체를 탐색하지 않는다. - API, wire protocol, 런타임 호출, event/config schema, 프로젝트 간 또는 내부 프로세스/컴포넌트 간 요청/응답 계약을 확인해야 하는 작업은 `agent-contract/index.md` 파일이 있을 때만 세션 1회 읽고, 매칭되는 계약 문서만 읽는다. **세션 최초 1회 아래 파일을 순서대로 반드시 읽는다.** 파일이나 디렉터리가 없는 항목은 건너뛴다. 그외에 스킵은 금지한다. diff --git a/.cursorrules b/.cursorrules index 211af25..55b20d1 100644 --- a/.cursorrules +++ b/.cursorrules @@ -15,6 +15,8 @@ - `agent-spec/archive/**`는 일반 작업에서 읽지 않는다. 과거 스펙 확인, 복원, 비교, 특정 archive 경로 확인이 필요한 경우에만 `agent-ops/rules/common/rules-agent-spec.md`의 archive 접근 규칙을 따른다. - agent-ops 구조, 규칙, 스킬, 로드맵, 런타임 책임 경계를 설계하거나 수정할 때만 `agent-ops/rules/common/philosophy.md`를 읽는다. - tracked `docs/`는 사람용 최신 가이드와 공개 설명만 둔다. +- project skill 경로 `agent-ops/skills/project//SKILL.md`를 선택했을 때 같은 이름의 `agent-ops/skills/private//SKILL.md`가 있으면 private skill을 우선한다. 없으면 project skill을 사용한다. +- project skill과 짝이 없는 private skill은 `agent-ops/rules/private/rules.md`에 명시적으로 라우팅한다. private skill 디렉터리 전체를 탐색하지 않는다. - API, wire protocol, 런타임 호출, event/config schema, 프로젝트 간 또는 내부 프로세스/컴포넌트 간 요청/응답 계약을 확인해야 하는 작업은 `agent-contract/index.md` 파일이 있을 때만 세션 1회 읽고, 매칭되는 계약 문서만 읽는다. **세션 최초 1회 아래 파일을 순서대로 반드시 읽는다.** 파일이나 디렉터리가 없는 항목은 건너뛴다. 그외에 스킵은 금지한다. diff --git a/.gitignore b/.gitignore index b4c2416..d14203f 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,9 @@ agent-roadmap/current.md agent-ops/.DS_Store agent-test/local/ agent-test/runs/ + +# Agent-Ops Private Rules +agent-ops/rules/private/ + +# Agent-Ops Private Skills +agent-ops/skills/private/ diff --git a/AGENTS.md b/AGENTS.md index 211af25..55b20d1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,8 @@ - `agent-spec/archive/**`는 일반 작업에서 읽지 않는다. 과거 스펙 확인, 복원, 비교, 특정 archive 경로 확인이 필요한 경우에만 `agent-ops/rules/common/rules-agent-spec.md`의 archive 접근 규칙을 따른다. - agent-ops 구조, 규칙, 스킬, 로드맵, 런타임 책임 경계를 설계하거나 수정할 때만 `agent-ops/rules/common/philosophy.md`를 읽는다. - tracked `docs/`는 사람용 최신 가이드와 공개 설명만 둔다. +- project skill 경로 `agent-ops/skills/project//SKILL.md`를 선택했을 때 같은 이름의 `agent-ops/skills/private//SKILL.md`가 있으면 private skill을 우선한다. 없으면 project skill을 사용한다. +- project skill과 짝이 없는 private skill은 `agent-ops/rules/private/rules.md`에 명시적으로 라우팅한다. private skill 디렉터리 전체를 탐색하지 않는다. - API, wire protocol, 런타임 호출, event/config schema, 프로젝트 간 또는 내부 프로세스/컴포넌트 간 요청/응답 계약을 확인해야 하는 작업은 `agent-contract/index.md` 파일이 있을 때만 세션 1회 읽고, 매칭되는 계약 문서만 읽는다. **세션 최초 1회 아래 파일을 순서대로 반드시 읽는다.** 파일이나 디렉터리가 없는 항목은 건너뛴다. 그외에 스킵은 금지한다. diff --git a/CLAUDE.md b/CLAUDE.md index 211af25..55b20d1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,6 +15,8 @@ - `agent-spec/archive/**`는 일반 작업에서 읽지 않는다. 과거 스펙 확인, 복원, 비교, 특정 archive 경로 확인이 필요한 경우에만 `agent-ops/rules/common/rules-agent-spec.md`의 archive 접근 규칙을 따른다. - agent-ops 구조, 규칙, 스킬, 로드맵, 런타임 책임 경계를 설계하거나 수정할 때만 `agent-ops/rules/common/philosophy.md`를 읽는다. - tracked `docs/`는 사람용 최신 가이드와 공개 설명만 둔다. +- project skill 경로 `agent-ops/skills/project//SKILL.md`를 선택했을 때 같은 이름의 `agent-ops/skills/private//SKILL.md`가 있으면 private skill을 우선한다. 없으면 project skill을 사용한다. +- project skill과 짝이 없는 private skill은 `agent-ops/rules/private/rules.md`에 명시적으로 라우팅한다. private skill 디렉터리 전체를 탐색하지 않는다. - API, wire protocol, 런타임 호출, event/config schema, 프로젝트 간 또는 내부 프로세스/컴포넌트 간 요청/응답 계약을 확인해야 하는 작업은 `agent-contract/index.md` 파일이 있을 때만 세션 1회 읽고, 매칭되는 계약 문서만 읽는다. **세션 최초 1회 아래 파일을 순서대로 반드시 읽는다.** 파일이나 디렉터리가 없는 항목은 건너뛴다. 그외에 스킵은 금지한다. diff --git a/GEMINI.md b/GEMINI.md index 211af25..55b20d1 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -15,6 +15,8 @@ - `agent-spec/archive/**`는 일반 작업에서 읽지 않는다. 과거 스펙 확인, 복원, 비교, 특정 archive 경로 확인이 필요한 경우에만 `agent-ops/rules/common/rules-agent-spec.md`의 archive 접근 규칙을 따른다. - agent-ops 구조, 규칙, 스킬, 로드맵, 런타임 책임 경계를 설계하거나 수정할 때만 `agent-ops/rules/common/philosophy.md`를 읽는다. - tracked `docs/`는 사람용 최신 가이드와 공개 설명만 둔다. +- project skill 경로 `agent-ops/skills/project//SKILL.md`를 선택했을 때 같은 이름의 `agent-ops/skills/private//SKILL.md`가 있으면 private skill을 우선한다. 없으면 project skill을 사용한다. +- project skill과 짝이 없는 private skill은 `agent-ops/rules/private/rules.md`에 명시적으로 라우팅한다. private skill 디렉터리 전체를 탐색하지 않는다. - API, wire protocol, 런타임 호출, event/config schema, 프로젝트 간 또는 내부 프로세스/컴포넌트 간 요청/응답 계약을 확인해야 하는 작업은 `agent-contract/index.md` 파일이 있을 때만 세션 1회 읽고, 매칭되는 계약 문서만 읽는다. **세션 최초 1회 아래 파일을 순서대로 반드시 읽는다.** 파일이나 디렉터리가 없는 항목은 건너뛴다. 그외에 스킵은 금지한다. diff --git a/agent-ops/.version b/agent-ops/.version index 7465871..fef593f 100644 --- a/agent-ops/.version +++ b/agent-ops/.version @@ -1 +1 @@ -1.1.177 +1.1.178 diff --git a/agent-ops/bin/ai-ignore.sh b/agent-ops/bin/ai-ignore.sh index 514dccb..9c49dc4 100755 --- a/agent-ops/bin/ai-ignore.sh +++ b/agent-ops/bin/ai-ignore.sh @@ -56,6 +56,26 @@ agent_ops_ensure_gitignore_task_artifact_block() { fi } +agent_ops_ensure_private_overrides_gitignore() { + local file="$1" + + touch "$file" + if ! grep -qxF "agent-ops/rules/private/" "$file"; then + if [[ -s "$file" ]]; then + printf "\n" >> "$file" + fi + printf "%s\n" "# Agent-Ops Private Rules" >> "$file" + printf "%s\n" "agent-ops/rules/private/" >> "$file" + fi + if ! grep -qxF "agent-ops/skills/private/" "$file"; then + if [[ -s "$file" ]]; then + printf "\n" >> "$file" + fi + printf "%s\n" "# Agent-Ops Private Skills" >> "$file" + printf "%s\n" "agent-ops/skills/private/" >> "$file" + fi +} + agent_ops_ensure_ai_ignore_block() { local file="$1" local tmp @@ -215,6 +235,7 @@ ensure_agent_ops_ai_ignore_config() { local target_dir="$1" local ignore_file + agent_ops_ensure_private_overrides_gitignore "$target_dir/.gitignore" if [[ -f "$target_dir/.agent-ops-source" ]]; then echo " AI ignore 보강 건너뜀: .agent-ops-source repo" return diff --git a/agent-ops/bin/init-agent-ops.sh b/agent-ops/bin/init-agent-ops.sh index 765683a..64f57f4 100755 --- a/agent-ops/bin/init-agent-ops.sh +++ b/agent-ops/bin/init-agent-ops.sh @@ -23,6 +23,7 @@ create_project_agent_ops_dirs() { mkdir -p "$agent_ops_dir/rules/project/domain" mkdir -p "$agent_ops_dir/rules/private" mkdir -p "$agent_ops_dir/skills/project" + mkdir -p "$agent_ops_dir/skills/private" } copy_common_agent_ops() { @@ -323,11 +324,6 @@ ensure_agent_ops_ai_ignore_config "$TARGET_DIR" TOUCH_GITIGNORE="$TARGET_DIR/.gitignore" touch "$TOUCH_GITIGNORE" agent_ops_ensure_gitignore_task_artifact_block "$TOUCH_GITIGNORE" -if ! grep -q "agent-ops/rules/private/" "$TOUCH_GITIGNORE"; then - echo "" >> "$TOUCH_GITIGNORE" - echo "# Agent-Ops Private Rules" >> "$TOUCH_GITIGNORE" - echo "agent-ops/rules/private/" >> "$TOUCH_GITIGNORE" -fi if ! grep -qxF "# Agent-Test Local Environment" "$TOUCH_GITIGNORE"; then echo "" >> "$TOUCH_GITIGNORE" echo "# Agent-Test Local Environment" >> "$TOUCH_GITIGNORE" @@ -340,4 +336,5 @@ ensure_agent_test_local "$TARGET_DIR" echo "Successfully initialized agent-ops in $TARGET_DIR" echo "Note: agent-ops/rules/project and agent-ops/skills/project are initialized as empty." +echo "Note: agent-ops/rules/private and agent-ops/skills/private are initialized and ignored by git." echo "Note: agent-test/local rules and baseline test profiles are initialized and ignored by git." diff --git a/agent-ops/bin/sync.sh b/agent-ops/bin/sync.sh index de30767..b0df6f4 100755 --- a/agent-ops/bin/sync.sh +++ b/agent-ops/bin/sync.sh @@ -73,6 +73,8 @@ sync_common() { sync_folder "$src/rules/common" "$dst/rules/common" sync_folder "$src/skills/common" "$dst/skills/common" sync_folder "$src/bin" "$dst/bin" + create_project_agent_ops_dirs "$dst" + agent_ops_ensure_private_overrides_gitignore "$(dirname "$dst")/.gitignore" } common_differs() { @@ -110,6 +112,7 @@ create_project_agent_ops_dirs() { mkdir -p "$agent_ops_dir/rules/project/domain" mkdir -p "$agent_ops_dir/rules/private" mkdir -p "$agent_ops_dir/skills/project" + mkdir -p "$agent_ops_dir/skills/private" } copy_common_scaffold() { @@ -160,6 +163,33 @@ agent_ops_git_paths() { done } +stage_private_gitignore_only() { + local file=".gitignore" + local index_file private_file patch_file + + if ! git ls-files --error-unmatch "$file" >/dev/null 2>&1; then + echo -e "${RED}Error: $file 이 추적 중이 아니어서 private ignore만 분리 stage할 수 없습니다.${RESET}" + return 1 + fi + if ! git diff --cached --quiet -- "$file"; then + echo -e "${RED}Error: $file 에 기존 staged 변경이 있어 private ignore만 분리 stage할 수 없습니다.${RESET}" + return 1 + fi + + index_file="$(mktemp)" + private_file="$(mktemp)" + patch_file="$(mktemp)" + git show ":$file" > "$index_file" + cp "$index_file" "$private_file" + agent_ops_ensure_private_overrides_gitignore "$private_file" + + if ! cmp -s "$index_file" "$private_file"; then + diff -u --label "a/$file" --label "b/$file" "$index_file" "$private_file" > "$patch_file" || true + git apply --cached "$patch_file" + fi + rm -f "$index_file" "$private_file" "$patch_file" +} + commit_and_push_agent_ops_scope() { local repo="$1" message="$2" local include_ai_config="${3:-1}" @@ -172,6 +202,10 @@ commit_and_push_agent_ops_scope() { ( cd "$repo" mapfile -t paths < <(agent_ops_git_paths "$include_ai_config") + if [[ "$include_ai_config" == "private-gitignore" ]]; then + stage_private_gitignore_only + paths+=(".gitignore") + fi git add -- "${paths[@]}" if git ls-files --error-unmatch "$AGENT_ROADMAP_CURRENT_LOCAL_PATTERN" >/dev/null 2>&1 \ && grep -qxF "$AGENT_ROADMAP_CURRENT_LOCAL_PATTERN" ".gitignore" 2>/dev/null; then @@ -372,7 +406,7 @@ echo "$NEW_VER" > "$DST_AO/.version" apply_agent_ops_entry_files "$SRC_AO/rules/common/rules.md" "$PROJECT_ROOT" apply_agent_ops_entry_files "$DST_AO/rules/common/rules.md" "$TARGET" -commit_and_push_agent_ops_scope "$TARGET" "sync: from $(basename "$PROJECT_ROOT") v$NEW_VER" "0" -commit_and_push_agent_ops_scope "$PROJECT_ROOT" "sync: to agentic-framework v$NEW_VER" "0" +commit_and_push_agent_ops_scope "$TARGET" "sync: from $(basename "$PROJECT_ROOT") v$NEW_VER" "private-gitignore" +commit_and_push_agent_ops_scope "$PROJECT_ROOT" "sync: to agentic-framework v$NEW_VER" "private-gitignore" echo -e "${GREEN}✓ 완료 (v$SRC_VER → v$NEW_VER)${RESET}" diff --git a/agent-ops/rules/common/rules.md b/agent-ops/rules/common/rules.md index 211af25..55b20d1 100644 --- a/agent-ops/rules/common/rules.md +++ b/agent-ops/rules/common/rules.md @@ -15,6 +15,8 @@ - `agent-spec/archive/**`는 일반 작업에서 읽지 않는다. 과거 스펙 확인, 복원, 비교, 특정 archive 경로 확인이 필요한 경우에만 `agent-ops/rules/common/rules-agent-spec.md`의 archive 접근 규칙을 따른다. - agent-ops 구조, 규칙, 스킬, 로드맵, 런타임 책임 경계를 설계하거나 수정할 때만 `agent-ops/rules/common/philosophy.md`를 읽는다. - tracked `docs/`는 사람용 최신 가이드와 공개 설명만 둔다. +- project skill 경로 `agent-ops/skills/project//SKILL.md`를 선택했을 때 같은 이름의 `agent-ops/skills/private//SKILL.md`가 있으면 private skill을 우선한다. 없으면 project skill을 사용한다. +- project skill과 짝이 없는 private skill은 `agent-ops/rules/private/rules.md`에 명시적으로 라우팅한다. private skill 디렉터리 전체를 탐색하지 않는다. - API, wire protocol, 런타임 호출, event/config schema, 프로젝트 간 또는 내부 프로세스/컴포넌트 간 요청/응답 계약을 확인해야 하는 작업은 `agent-contract/index.md` 파일이 있을 때만 세션 1회 읽고, 매칭되는 계약 문서만 읽는다. **세션 최초 1회 아래 파일을 순서대로 반드시 읽는다.** 파일이나 디렉터리가 없는 항목은 건너뛴다. 그외에 스킵은 금지한다. diff --git a/agent-ops/skills/common/create-skill/SKILL.md b/agent-ops/skills/common/create-skill/SKILL.md index ec895cb..89ce0c0 100644 --- a/agent-ops/skills/common/create-skill/SKILL.md +++ b/agent-ops/skills/common/create-skill/SKILL.md @@ -1,6 +1,6 @@ --- name: create-skill -version: 1.0.0 +version: 1.0.1 description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬 --- @@ -17,7 +17,8 @@ description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬 ### 생성 위치 결정 - `.agent-ops-source` 파일이 **있으면** (공통 관리 레포): `agent-ops/skills/common//SKILL.md` -- `.agent-ops-source` 파일이 **없으면** (타겟 프로젝트): `agent-ops/skills/project//SKILL.md` +- `.agent-ops-source` 파일이 **없고** 사용자가 private 또는 operator-local을 명시하면 (타겟 프로젝트): `agent-ops/skills/private//SKILL.md` +- `.agent-ops-source` 파일이 **없고** private 요청이 없으면 (타겟 프로젝트): `agent-ops/skills/project//SKILL.md` ## 언제 호출할지 @@ -29,19 +30,22 @@ description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬 - `skill-name`: 생성할 skill 이름, kebab-case (필수) - `purpose`: 이 skill이 해결하는 문제 한 줄 요약 (필수) +- `visibility`: `common`, `project`, `private` 중 하나. 사용자가 private 또는 operator-local을 명시했을 때만 `private`을 선택한다. (선택) - `trigger-cases`: 이 skill을 호출해야 하는 상황 목록 (선택) ## 먼저 확인할 것 -- [ ] `agent-ops/skills/common/` 및 `agent-ops/skills/project/` 하위에 동일 이름의 디렉터리가 이미 존재하는지 확인 +- [ ] `agent-ops/skills/common/`, `agent-ops/skills/project/`, `agent-ops/skills/private/` 하위에 동일 이름의 디렉터리가 이미 존재하는지 확인 - [ ] `agent-ops/skills/common/router.md` 및 `agent-ops/rules/project/rules.md` 에 이미 유사한 라우팅 항목이 있는지 확인 - [ ] `agent-ops/skills/common/_templates/skill-template.md` 를 읽어 최신 템플릿 형식 파악 ## 실행 절차 1. **중복 확인** - - `agent-ops/skills/common//` 및 `agent-ops/skills/project//` 폴더 존재 여부 확인 - - 기능이 겹치는 기존 skill이 있으면 사용자에게 알리고 중단한다 + - 같은 visibility 경로에 이미 있는 skill은 덮어쓰지 않고 중단한다. + - private 요청에서 같은 이름의 project skill은 의도된 override 후보이므로 중복으로 중단하지 않는다. common skill과의 같은 이름 또는 다른 기능의 중복은 사용자에게 알리고 중단한다. + - private override가 아닌 기능 중복은 사용자에게 알리고 중단한다. + - project skill과 같은 이름의 private override는 해당 project skill의 책임을 완전히 대체하는지 확인한다. 2. **목적 분석** - `purpose` 와 `trigger-cases` 를 바탕으로 아래 항목을 도출한다 @@ -53,7 +57,7 @@ description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬 - 금지 사항 3. **SKILL.md 생성** - - 경로: 생성 위치 결정 규칙에 따라 `common/` 또는 `project/` 하위에 생성 + - 경로: 생성 위치 결정 규칙에 따라 `common/`, `project/`, 또는 `private/` 하위에 생성 - `skill-template.md` 형식을 따른다 - agent-ops 내부 스킬은 기존 로컬 관례에 맞춰 `version`을 둘 수 있다. Codex 설치형 스킬로 배포할 목적이면 `version`이나 `depends` 같은 비표준 frontmatter를 넣지 않는다. - 프로젝트 특화 내용보다 범용 절차를 우선한다 @@ -61,7 +65,10 @@ description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬 4. **라우팅 업데이트** - `.agent-ops-source` 마커가 **있으면** (공통 관리 레포): `agent-ops/skills/common/router.md`에 라우팅 항목 추가 - - `.agent-ops-source` 마커가 **없으면** (타겟 프로젝트): `agent-ops/rules/project/rules.md`의 프로젝트 스킬 라우터 섹션에 라우팅 항목 추가 + - private skill이 같은 이름의 project skill을 override하면 별도 라우팅 항목을 추가하지 않는다. 공통 규칙의 private 우선순위를 사용한다. + - project skill과 짝이 없는 private skill은 `agent-ops/rules/private/rules.md`에만 라우팅 항목을 추가한다. 파일이 없으면 private route만 담은 ignored local rule을 생성한다. + - private rule의 trigger는 project router와 중복 등록하지 않는다. + - `.agent-ops-source` 마커가 **없고** private skill이 아니면 (타겟 프로젝트): `agent-ops/rules/project/rules.md`의 프로젝트 스킬 라우터 섹션에 라우팅 항목 추가 - 기존 공통 스킬을 수정해 trigger가 달라졌다면 새 skill을 만들지 말고 `agent-ops/skills/common/router.md`의 기존 행을 갱신한다 - 이 skill이 속할 라우팅 축(구조 분석/코드 변경/흐름 추적 등)을 판단한다 - 기존 라우팅 구조를 깨지 않는다 @@ -76,7 +83,7 @@ description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬 ``` ## 생성 완료 -- SKILL 경로: agent-ops/skills/{common|project}//SKILL.md +- SKILL 경로: agent-ops/skills/{common|project|private}//SKILL.md - 라우팅 추가: <대상 파일> → <라우팅 축> → ## 주의사항 (해당 시) @@ -85,15 +92,16 @@ description: 새로운 SKILL.md 파일을 생성하기 위한 범용 스킬 ## 실행 결과 검증 -- [ ] `agent-ops/skills/{common|project}//SKILL.md` 파일이 생성되었는가 +- [ ] `agent-ops/skills/{common|project|private}//SKILL.md` 파일이 생성되었는가 - [ ] 생성된 파일이 `skill-template.md`의 필수 섹션(목적, 언제 호출할지, 실행 절차, 실행 결과 검증, 출력 형식, 금지 사항)을 포함하는가 - [ ] frontmatter에 name, description이 올바르게 기재되었는가 - [ ] agent-ops 내부 스킬이면 version 등 로컬 관례를 따르고, Codex 설치형 스킬이면 시스템 `skill-creator` frontmatter 규칙을 따르는가 -- [ ] 라우팅 대상 파일에 해당 스킬의 라우팅 항목이 추가되었는가 +- [ ] private override는 동일 이름의 project skill보다 우선되고, 짝이 없는 private skill만 private rule에 라우팅되었는가 - 검증 실패 시: 누락된 섹션 또는 라우팅 항목을 사용자에게 알리고 해당 부분만 보완한다 ## 금지 사항 +- private skill 또는 private rule의 내용을 tracked common·project 경로에 복사하지 않는다 - 이미 존재하는 skill 을 덮어쓰지 않는다 - 프로젝트 특화 경로(예: `app/screens/`)를 skill 본문에 하드코딩하지 않는다 - skill 생성과 무관한 코드 파일을 수정하지 않는다 diff --git a/agent-ops/skills/common/init-agent-ops/SKILL.md b/agent-ops/skills/common/init-agent-ops/SKILL.md index 264a2a4..9070136 100644 --- a/agent-ops/skills/common/init-agent-ops/SKILL.md +++ b/agent-ops/skills/common/init-agent-ops/SKILL.md @@ -72,7 +72,8 @@ description: 프로젝트 상태를 판별하고 agent-ops 기본 스캐폴드 | `agent-ops/rules/project/rules.md` | 프로젝트 분석 후 생성 | | `agent-ops/rules/project/domain//rules.md` | 도메인 분석 후 생성 | | `agent-ops/rules/private/` | 폴더만 생성 (내용은 개인이 작성) | -| `.gitignore`에 `agent-ops/rules/private/` 추가 | git 추적 제외 | +| `agent-ops/skills/private/` | 폴더만 생성 (내용은 개인이 작성) | +| `.gitignore`에 `agent-ops/rules/private/`, `agent-ops/skills/private/` 추가 | git 추적 제외 | | `.gitignore`의 Agent-Ops 관리 block | `*.log` 같은 전역 ignore가 있어도 `agent-task/**/*.md`, `agent-task/**/*.log` task 산출물이 추적되도록 unignore하고 `agent-roadmap/current.md`는 로컬 포인터로 ignore | | `agent-test/local/rules.md` | `init-agent-ops.sh`가 최소 내용으로 생성 | | `agent-test/local/project-smoke.md` | 도메인이 아직 없으면 `init-agent-ops.sh`가 fallback baseline으로 생성 | @@ -254,7 +255,7 @@ common/rules.md와 내용이 중복되지 않도록 한다. - [ ] `agent-ops/rules/project/rules.md`가 생성되었고, 필수 항목(응답 언어, 프로젝트 개요, 기술 스택)이 포함되어 있는가 - [ ] 생성된 domain rules.md가 `domain-rule-template.md` 형식을 따르는가 - [ ] `rules/project/rules.md`의 도메인 매핑 테이블에 생성된 도메인이 모두 등록되어 있는가 -- [ ] `.gitignore`에 `agent-ops/rules/private/` 항목이 추가되어 있는가 +- [ ] `agent-ops/rules/private/`, `agent-ops/skills/private/`가 생성되고 `.gitignore`에 각각의 항목이 추가되어 있는가 - [ ] `.gitignore`에 Agent-Ops 관리 block이 있고 `!agent-task/`, `!agent-task/**/`, `!agent-task/**/*.md`, `!agent-task/**/*.log`, `agent-roadmap/current.md`가 포함되어 있는가 - [ ] `agent-test/local/rules.md`가 생성되었는가 - [ ] 생성되었거나 기존에 있던 모든 domain rule에 대응하는 `agent-test/local/-smoke.md`가 있는가 diff --git a/agent-ops/skills/common/router.md b/agent-ops/skills/common/router.md index a6a88a0..eae86db 100644 --- a/agent-ops/skills/common/router.md +++ b/agent-ops/skills/common/router.md @@ -2,6 +2,8 @@ 라우팅 우선순위: +- project skill 경로를 선택한 뒤 같은 이름의 `agent-ops/skills/private//SKILL.md`가 있으면 private skill을 우선한다. 없으면 선택한 project skill을 사용한다. +- project skill과 짝이 없는 private skill은 `agent-ops/rules/private/rules.md`에 명시적으로 라우팅한다. private skill 전체를 탐색하지 않는다. - SDD/spec gate 자체의 작성, 갱신, gate 확인, 사용자 리뷰, 잠금 해제는 `roadmap-sdd`로 보낸다. - 로드맵/마일스톤 생성 또는 갱신 요청 안에 SDD 필요 여부와 gate 연결이 포함되면 `create-roadmap` 또는 `update-roadmap`을 진입점으로 삼고, 해당 흐름에서 `roadmap-sdd` create/check를 처리한다. - agent-spec은 구현 후 현재 상태를 설명하는 living spec이다. SDD/spec gate와 구분하며, 현재 구현 스펙 생성은 `create-spec`, 갱신은 `update-spec`으로 보낸다. diff --git a/agent-ops/skills/common/sync-push/SKILL.md b/agent-ops/skills/common/sync-push/SKILL.md index 166306f..5b14714 100644 --- a/agent-ops/skills/common/sync-push/SKILL.md +++ b/agent-ops/skills/common/sync-push/SKILL.md @@ -36,7 +36,7 @@ description: 현재 프로젝트의 agent-ops를 공통 원본 repo로 올리거 5. 공통 관리 파일 변경이 없어도 현재 프로젝트 또는 공통 원본 repo의 진입 파일이 `agent-ops/rules/common/rules.md`와 다르면 진입 파일만 재적용하고 commit/push 한다 6. 공통 관리 파일 변경이 있으면 `sync.sh`가 버전을 한 단계 올리고 현재 프로젝트와 공통 원본 repo에 같은 버전을 반영한다 7. 이때 현재 프로젝트와 공통 원본 repo의 진입 파일은 각각 자기 `agent-ops/rules/common/rules.md` 내용으로 재적용한다 -8. 일반 프로젝트에서 공통 원본 repo로 올릴 때는 AI ignore / permission 파일을 보강하거나 stage하지 않는다 +8. 일반 프로젝트에서 공통 원본 repo로 올릴 때는 AI ignore / permission 파일을 보강하거나 stage하지 않는다. 단, `agent-ops/rules/private/`와 `agent-ops/skills/private/` ignore 항목만 보장하기 위해 `.gitignore`은 함께 stage한다. ### 현 프로젝트가 공통 원본 repo인 경우 (`.agent-ops-source` 있음) @@ -66,7 +66,15 @@ description: 현재 프로젝트의 agent-ops를 공통 원본 repo로 올리거 ## Gitignore / AI Ignore / Permission 재적용 - 이 절차는 `.agent-ops-source`가 있는 공통 원본 repo에서 대상 프로젝트로 push할 때와 `--pull`로 공통 원본 repo에서 현재 프로젝트로 내려받을 때만 적용한다. -- 일반 프로젝트에서 공통 원본 repo로 올리는 push에서는 `.gitignore`와 AI ignore / permission 파일을 수정하거나 stage하지 않는다. +- 일반 프로젝트에서 공통 원본 repo로 올리는 push에서는 AI ignore / permission 파일을 수정하거나 stage하지 않는다. 단, private 규칙·스킬의 로컬 전용 경로를 보장하는 아래 두 `.gitignore` 항목은 추가·stage할 수 있다. + +```text +# Agent-Ops Private Rules +agent-ops/rules/private/ + +# Agent-Ops Private Skills +agent-ops/skills/private/ +``` - `.gitignore`는 사용자 영역을 수정하지 않고 아래 관리 block만 추가하거나 교체한다. 이 예외는 `*.log` 같은 전역 ignore가 있어도 plan/review/archive task 산출물이 git에 잡히도록 하고, `agent-roadmap/current.md`는 브랜치별 로컬 포인터로 남긴다. ```text @@ -98,7 +106,7 @@ agent-roadmap/archive/** agent-ops/bin/sync.sh [target] ``` -푸시 대상 path는 항상 `agent-ops/.version`, `agent-ops/bin`, `agent-ops/rules/common`, `agent-ops/skills/common`, `AGENT_OPS_ENTRY_FILES`의 진입 파일로 제한한다. 예외적으로 `agent-roadmap/current.md`가 이미 추적 중이고 `.gitignore`에 로컬 current ignore가 있으면 파일을 보존한 채 git 추적에서 제거하는 삭제만 함께 commit할 수 있다. `.gitignore`와 AI ignore / permission 파일은 `.agent-ops-source`가 있는 공통 원본 repo에서 일반 프로젝트로 내려보내는 경우에만 대상 repo에서 추가 stage한다. +푸시 대상 path는 항상 `agent-ops/.version`, `agent-ops/bin`, `agent-ops/rules/common`, `agent-ops/skills/common`, `AGENT_OPS_ENTRY_FILES`의 진입 파일로 제한한다. 예외적으로 `agent-roadmap/current.md`가 이미 추적 중이고 `.gitignore`에 로컬 current ignore가 있으면 파일을 보존한 채 git 추적에서 제거하는 삭제만 함께 commit할 수 있다. `.gitignore`와 AI ignore / permission 파일은 `.agent-ops-source`가 있는 공통 원본 repo에서 일반 프로젝트로 내려보내는 경우에만 대상 repo에서 추가 stage한다. 일반 프로젝트에서 공통 원본 repo로 올릴 때에는 private 규칙·스킬 ignore 두 항목을 반영하는 `.gitignore`만 추가 stage할 수 있다. ## 실행 결과 검증 @@ -112,7 +120,7 @@ agent-ops/bin/sync.sh [target] - [ ] 공통 원본 repo에서 대상 프로젝트로 push한 경우, `.geminiignore`, `.aiexclude`, `.cursorignore`, `.clineignore`에 Agent-Ops 관리 block이 있고 그 안에 `agent-task/archive/**`와 `agent-roadmap/archive/**`가 포함되어 있는가 - [ ] 공통 원본 repo에서 대상 프로젝트로 push한 경우, `.claude/settings.json`과 `opencode.json`에 `agent-task/archive/**` 또는 `agent-roadmap/archive/**` hard read/glob deny가 남아 있지 않은가 - [ ] 대상 프로젝트에 기존 archive hard deny가 있으면 init-agent-ops 표준에 맞게 제거했는가 -- [ ] 일반 프로젝트에서 공통 원본 repo로 push한 경우, `.gitignore`와 AI ignore / permission 파일이 공통 원본 repo에 유입되지 않았는가 +- [ ] 일반 프로젝트에서 공통 원본 repo로 push한 경우, private 규칙·스킬 ignore 두 항목 외의 `.gitignore` 변경과 AI ignore / permission 파일이 공통 원본 repo에 유입되지 않았는가 - [ ] 대상 repo에 commit/push 된 path가 방향별 허용 범위로 제한되었는가 ## 금지 사항