[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6QZPPDATJ7DAGNP0JCXFGRV":3,"skill-same:01M6QZPPDATJ7DAGNP0JCXFGRV":94},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6QZPPDATJ7DAGNP0JCXFGRV","project-rules",null,"현재 프로젝트의 스택(빌드 파일 버전, 마이그레이션 도구, ORM 유무, ES 사용, git 호스트)을 감지해 프로젝트 루트 AGENTS.md 의 마커 블록(스택 사실 + 항상 적용되는 스페셜리스트 핵심 ≤15줄 — Claude Code·Codex·Antigravity 공통)과 CLAUDE.md 의 `@AGENTS.md` 연결, Claude 전용 경로 한정 .claude\u002Frules\u002F\u003Cstack>-specialist.md(해당 버전에 실제로 맞는 상세 함정)를 diff 로 제안하고, 스택 플러그인을 런타임별로 프로젝트 범위에서 켜는 법을 안내한다. 이전 버전 출력(CLAUDE.md 블록·specialist-core.md)은 AGENTS.md 로 이전을 제안. --check 는 버전 불일치·사라진 ID·크기 한도·연결 누락을 점검.\nDetects the project's stack and proposes a cross-runtime AGENTS.md block (stack facts + always-on specialist core) linked from CLAUDE.md via @AGENTS.md, plus Claude-only path-scoped specialist rules; migrates the older CLAUDE.md-block layout; --check audits drift.\nUse when: \"이 프로젝트 세팅\", \"프로젝트 규칙 생성\", \"AGENTS.md\u002FCLAUDE.md 점검\", project setup, generate project rules, audit AGENTS.md or CLAUDE.md drift.","Dokkabei97\u002Fdokkabei-harness","Dokkabei97","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F69792585?v=4","01M6QYPVTYK6CGF609W541QNSD","JangMK","01M6QYPVYXBP1GRYHZ7ZABCZC6",1,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fproject-rules\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"project rules","Rules","project","es","when","scoped","path","-specialist","runtime","layout","drift","core","only","diff","orm","stack","audit","git","code","generate","2026-11-10 10:12:30",false,"---\nname: project-rules\ndescription: |\n  현재 프로젝트의 스택(빌드 파일 버전, 마이그레이션 도구, ORM 유무, ES 사용, git 호스트)을 감지해 프로젝트 루트 AGENTS.md 의 마커 블록(스택 사실 + 항상 적용되는 스페셜리스트 핵심 ≤15줄 — Claude Code·Codex·Antigravity 공통)과 CLAUDE.md 의 `@AGENTS.md` 연결, Claude 전용 경로 한정 .claude\u002Frules\u002F\u003Cstack>-specialist.md(해당 버전에 실제로 맞는 상세 함정)를 diff 로 제안하고, 스택 플러그인을 런타임별로 프로젝트 범위에서 켜는 법을 안내한다. 이전 버전 출력(CLAUDE.md 블록·specialist-core.md)은 AGENTS.md 로 이전을 제안. --check 는 버전 불일치·사라진 ID·크기 한도·연결 누락을 점검.\n  Detects the project's stack and proposes a cross-runtime AGENTS.md block (stack facts + always-on specialist core) linked from CLAUDE.md via @AGENTS.md, plus Claude-only path-scoped specialist rules; migrates the older CLAUDE.md-block layout; --check audits drift.\n  Use when: \"이 프로젝트 세팅\", \"프로젝트 규칙 생성\", \"AGENTS.md\u002FCLAUDE.md 점검\", project setup, generate project rules, audit AGENTS.md or CLAUDE.md drift.\nargument-hint: \"[--check] [subdir]\"\n---\n\n# Project Rules — 프로젝트별 스택 사실과 스페셜리스트 규칙\n\n스택 플러그인은 \"현직 시니어도 놓치는 함정\"을 ID 붙은 항목으로 담고 있다(`### \u003CPREFIX>-\u003CAREA>-\u003CNN> · 제목`\n+ `- 적용:` 조건). 이 스킬은 그중 **이 프로젝트의 버전·구성에 실제로 해당하는 것만** 골라 프로젝트에 심고,\n버전·도구 같은 사실은 프로젝트 지침 파일에 둔다. 범용 지식을 프로젝트에 복사하지 않는다.\n\n모든 쓰기는 **diff 제안 → 사용자 승인 → 적용** 순서다. 승인 전에는 읽기만 한다.\n\n## 로드 방식이 배치를 정한다\n\n세 런타임이 공통으로 항상 읽는 파일은 **AGENTS.md 하나**다. 그래서 항상 적용돼야 하는 것은 AGENTS.md 에 둔다.\n\n| 런타임 | 항상 로드 | 근거 |\n|--------|-----------|------|\n| Claude Code | `CLAUDE.md`(+`@import`). CLAUDE.md 가 **없을 때만** AGENTS.md 를 직접 읽는다(v2.1.277+). CLAUDE.md 가 있으면 `@AGENTS.md` import 가 있어야 AGENTS.md 가 들어온다. 블록 수준 HTML 주석은 제거된다 | code.claude.com\u002Fdocs\u002Fen\u002Fmemory §AGENTS.md, §Share one file with other coding tools |\n| Codex CLI | git 루트→cwd 의 `AGENTS.md`(디렉터리당 1개, `AGENTS.override.md` 우선)를 이어 붙임. CLAUDE.md·`@import` 는 읽지 않는다. 합계 `project_doc_max_bytes`=32 KiB 초과분은 잘린다. HTML 주석이 그대로 들어간다 | 런타임 실측(codex 0.165) |\n| Antigravity | cwd(파일을 열면 그 디렉터리)→레포 루트의 `AGENTS.md`\u002F`GEMINI.md`. CLAUDE.md 는 읽지 않는다. 파일당 24,000바이트에서 줄 단위로 잘림 | `agy-customizations\u002Fdocs\u002Frules.md:12-15,31-33`, `agy-customizations\u002FSKILL.md:49-51`, 실측(agy 1.4.7) |\n\nClaude Code 의 경로 한정 rules(`.claude\u002Frules\u002F*.md` + `paths`)는 Read\u002FWrite\u002FEdit(또는 단일 파일 `cat`·`head`·`sed -n` 같은\n읽기형 Bash)로 매칭 파일을 다룰 때만 로드되고 compaction 뒤엔 다시 매칭될 때까지 빠진다. Bash heredoc·`tee`·`sed -i` 로\n**쓰는** 것은 트리거가 아니다 — 새 파일을 만들 때 걸리는 함정은 항상 로드되는 쪽에 둬야 한다. 그래서:\n\n- **스택 사실 + 스페셜리스트 핵심 ≤15줄** → 프로젝트 루트 `AGENTS.md` 마커 블록 (세 런타임 공통, 항상)\n- **CLAUDE.md 연결** → `@AGENTS.md` 한 줄 (CLAUDE.md 가 있을 때. 없으면 만들지 않는 것이 기본 — Phase 4 (b))\n- **상세 항목** → `.claude\u002Frules\u002F\u003Cstack>-specialist.md`, `paths` 있음 — **Claude Code 전용 보너스**. Codex 에는 파일 경로로 켜지는\n  규칙이 확인되지 않았고(하위 AGENTS.md 는 cwd 경로 기준), Antigravity 는 선택 출력 (e) 로만 대응한다\n\n## 모드\n\n| 인자 | 동작 |\n|------|------|\n| (없음) | 감지 → 생성 제안(a)~(d), 선택 (e). 이전 버전 출력이 있으면 이전 제안(Phase 4 (f))을 함께 |\n| `--check` | 감지 → AGENTS.md 블록·CLAUDE.md 연결·rules 와 대조해 드리프트 보고(수정은 승인 후) |\n| `\u003Csubdir>` | 모노레포의 하위 프로젝트만 대상 — 블록은 `\u003Csubdir>\u002FAGENTS.md`, 규칙 `paths` 도 그 하위로 한정 |\n\n## Phase 1: 감지 (읽기 전용)\n\n[references\u002Fdetection.md](references\u002Fdetection.md) 의 표대로 파일을 읽어 아래 **스택 프로필**을 만든다.\n값을 확인하지 못하면 비워 두고 \"미확인\"으로 표시한다 — 추측해서 채우지 않는다. BOM·카탈로그가 관리하는\n버전(lock 없음)은 \"BOM 관리(미확인)\"이다. 대상 저장소에서 빌드 도구를 실행하지 않는다(캐시·빌드 디렉터리에 쓴다).\n\n```\nstack profile\n- jvm: JDK toolchain=21 \u002F Kotlin=2.1.0 \u002F Spring Boot=3.4.1 \u002F build=Gradle(kts, version catalog)\n- go: go=1.23 (toolchain go1.23.4) \u002F router=net\u002Fhttp \u002F db=pgx stdlib\n- python: requires-python>=3.12 \u002F FastAPI \u002F ORM=없음(psycopg 원시 SQL)\n- node: next=16.x \u002F react=19.x\n- elasticsearch: client=co.elastic.clients:elasticsearch-java 8.x \u002F mappings=src\u002Fmain\u002Fresources\u002Fes\u002F*.json\n- db: PostgreSQL(+PostGIS) \u002F migrations=dbmate(db\u002Fmigrations)\n- infra: Dockerfile, k8s manifests → 컨테이너 배포 (compose 로 의존 서비스만 띄우는 것은 앱 컨테이너 배포가 아니다)\n- vcs: gitlab.\u003Ccompany> → glab \u002F github.com → gh\n- verify: .\u002Fgradlew check, go test .\u002F..., pytest, pnpm test (빌드 파일·CI 설정·AGENTS.md·CLAUDE.md 에서 확인된 것만)\n- instructions: AGENTS.md 4.1KB(블록 없음) \u002F CLAUDE.md 133줄, `@AGENTS.md` 없음 \u002F AGENTS.override.md·CLAUDE.local.md 없음\n       \u002F legacy: CLAUDE.md 에 project-rules 블록, .claude\u002Frules\u002Fspecialist-core.md 있음 → 이전 대상\n- existing: AGENTS.md·CLAUDE.md 블록 밖에 이미 적힌 사실·함정(중복 제안 방지용)\n```\n\n## Phase 2: 스페셜리스트 항목 수집\n\n1. 프로필에 해당하는 플러그인만 색인한다(매핑은 [references\u002Fdetection.md](references\u002Fdetection.md) §2):\n   ```bash\n   bash \"\u003C스킬 디렉터리>\u002Fscripts\u002Fspecialist-index.sh\" auto kotlin-spring backend-shared search\n   ```\n   - `\u003C스킬 디렉터리>` = 이 SKILL.md 가 있는 디렉터리. Claude Code 는 `${CLAUDE_SKILL_DIR}` 로 쓴다. Codex·Antigravity 는\n     `${CLAUDE_SKILL_DIR}`·`${CLAUDE_PLUGIN_ROOT}` 를 스킬 본문에서 치환하지 않으므로 이 SKILL.md 를 읽은 절대 경로에서\n     잡는다(Codex 는 스킬 목록의 skill roots 표, Antigravity 는 `~\u002F.gemini\u002Fconfig\u002Fplugins\u002Fworkflow\u002Fskills\u002Fproject-rules`)\n   - `auto` 는 원천을 스크립트가 정한다: 지금 실행 중인 workflow 와 **같은 설치본의 형제 플러그인**(레포 `plugins\u002F`,\n     Claude·Codex 캐시 `\u003Cplugin>\u002F\u003Cversion>\u002F`, Antigravity 변환본 `\u003Cplugin>\u002F`)을 먼저 보고, 없는 플러그인만\n     `~\u002F.claude\u002Fplugins\u002Fcache\u002Fdokkabei-harness` → `${CODEX_HOME:-~\u002F.codex}\u002Fplugins\u002Fcache\u002Fdokkabei-harness` →\n     `.\u002F.agents\u002Fplugins` → `~\u002F.gemini\u002Fconfig\u002Fplugins` 순으로 찾는다. 원천을 직접 주려면 `auto` 대신 그 디렉터리\n2. stdout 은 `plugin  skill  id  title  applies  file`(절대 경로) TSV 한 줄씩 — 본문 전체를 읽지 않고 고른다.\n   stderr 의 `source  plugin  version  items  dir` 줄이 rules 메타(`source \u003Cplugin>@\u003Cversion>\u002F\u003Citems>`)의 값이다\n3. `items` 가 0 이거나 `dir` 이 `-` 인 플러그인은 설치본이 구버전이거나 없다 → 런타임별 갱신 명령(Claude\n   `\u002Fplugin update \u003Cname>@dokkabei-harness`, Codex `codex plugin add \u003Cname>@dokkabei-harness`, Antigravity\n   `agy plugin install \u003Cclone>\u002Fplugins\u002F\u003Cname>`) 후 재실행을 안내하고 해당 스택은 건너뛴다(빈 rules 를 만들지 않는다)\n\n## Phase 3: 선별 (스택당 ≤15, core 는 전체 ≤15)\n\n[references\u002Fselection.md](references\u002Fselection.md) 의 기준으로 거른다. 요약:\n\n1. **적용 조건 일치** — `applies` 의 버전·구성 조건이 프로필과 맞는 것만. 판단이 애매하면 제외.\n2. **신호 확인** — 후보의 `- 신호:` 줄만 읽는다. 코드 패턴이면 Grep 으로 저장소에서 찾고, 런타임 증상(지연·로그·메트릭)이면\n   그 증상을 만드는 **구성(construct)** 이 코드에 있는지 확인한다. 신호가 이미 대응돼 있으면 \"대응됨\"으로 표시한다.\n3. **중복 배제** — 같은 메커니즘은 하나만(플러그인을 가로질러도), 블록 밖 AGENTS.md·CLAUDE.md 에 이미 적힌 함정도 제외.\n4. **core 지정** — 선별된 것 중 ①새 파일을 만들 때 걸리는 함정(마이그레이션·라우트·액션·DTO) ②모델이 구버전 습관으로\n   틀리는 버전 함정 ③신호가 발견된 운영 장애급 — 이 순서로 전체 ≤15줄. Codex·Antigravity 에는 경로 rules 가 없으므로\n   core 가 그 런타임이 받는 스페셜리스트의 전부다 — 둘 중 하나를 고를 때는 core 쪽을 택한다.\n5. 15개를 채우려고 억지로 넣지 않는다. 5개여도 된다.\n\n## Phase 4: 생성 제안\n\n템플릿은 [references\u002Ftemplates.md](references\u002Ftemplates.md).\n\n**(a) 프로젝트 루트 `AGENTS.md` 마커 블록** — `\u003C!-- project-rules:start -->` … `\u003C!-- project-rules:end -->`\n- `## Stack facts`(≤30줄: 버전·빌드\u002F마이그레이션 도구·검증 명령·VCS\u002FCLI·rules 안내 1줄) + `## Specialist core`(항목 ≤15줄,\n  스택별 `###` 소제목. 각 줄은 \"무엇을 하면 안 되는지\u002F해야 하는지\"가 줄 자체로 서야 한다 — 깊이 참조를 열지 않아도 행동이 바뀌게)\n- 크기: 블록 ≤50줄·≤6,000바이트. 적용 후 AGENTS.md 전체 ≤24,000바이트(Antigravity 파일 한도 — 넘으면 줄 단위로 잘림),\n  git 루트→가장 깊은 작업 디렉터리의 AGENTS.md 합계 ≤32,768바이트(Codex `project_doc_max_bytes` 기본값 — 넘으면 잘리고\n  더 깊은 파일은 빠진다). 넘으면 블록 밖을 줄이라고 보고만 한다(블록 밖은 이 스킬 소관이 아니다)\n- 위치: 블록이 없으면 첫 `##` 섹션 앞(잘림은 파일 뒤부터라 블록이 살아남게). 있으면 **그 안만** 교체(멱등).\n  AGENTS.md 가 없으면 블록만 담은 새 파일을 제안한다\n- 블록 밖에 이미 같은 사실이 있으면 블록에 다시 쓰지 않는다(블록 밖 수정은 `workflow:sync-claude-md` 소관 — 불일치만 보고)\n- 블록 안 깊이 참조는 런타임 중립 표기 `(\u003Cplugin>:\u003Cskill>)` — 슬래시 명령 표기는 런타임마다 다르다\n\n**(b) `CLAUDE.md` 연결** — Claude Code 가 AGENTS.md 블록을 보게 한다\n\n| 상태 | 제안 |\n|------|------|\n| CLAUDE.md 없음 | 만들지 않는 것이 기본(Claude Code v2.1.277+ 는 CLAUDE.md 가 없으면 AGENTS.md 를 직접 읽는다). 승인 게이트에서 \"`@AGENTS.md` 한 줄짜리 CLAUDE.md 도 만들까요?\"를 묻는다 — 구버전·AGENTS.md 지원이 꺼진 세션, 나중에 `CLAUDE.local.md` 를 둘 계획이면 필요(`CLAUDE.local.md` 가 생기면 AGENTS.md 직접 읽기가 멈춘다) |\n| CLAUDE.md 있음, 코드 밖 `@AGENTS.md` 없음 | 맨 위에 `@AGENTS.md` 한 줄 추가(이 스킬이 블록 밖에서 하는 유일한 편집). 단 AGENTS.md 가 CLAUDE.md 의 사본에 가까우면 import 로 같은 내용이 두 번 들어간다 — (f)-3 판정을 먼저 한다 |\n| 이미 `@AGENTS.md` 있음 | 생략 |\n\n적용 후 CLAUDE.md(+`@import` 대상, 즉 AGENTS.md 포함)가 200줄을 넘으면 경고하고 일부를 path-scoped rules 로 옮기는 안을 제시한다.\n\n**(c) `.claude\u002Frules\u002F\u003Cstack>-specialist.md`** — **Claude Code 전용 보너스**. 스택(코드 위치)당 1파일, frontmatter 는 `paths` 만\n- 본문: 생성 메타 주석 1줄 + 항목당 1줄 `- **\u003CID>** \u003C함정 요약> — 깊이: \u002F\u003Cplugin>:\u003Cskill> 의 \u003CID>`\n- core 에 올린 ID 는 반복하지 않는다. 남는 항목이 없으면 파일을 만들지 않는다\n- 기존 파일이 있으면 diff 로 제안(사용자가 손으로 추가한 줄은 보존)\n\n**(d) 스택 플러그인 활성화 안내** — 이 프로젝트에서만 켜기. 런타임별 명령은 templates.md (d):\n- Claude Code: `claude plugin enable \u003Cname>@dokkabei-harness --scope local` (커밋되지 않는 `.claude\u002Fsettings.local.json`)\n- Codex: 프로젝트 `.codex\u002Fconfig.toml` 의 `[plugins.\"\u003Cname>@dokkabei-harness\"] enabled = true`(신뢰된 프로젝트에서만 읽힘;\n  설치는 `codex plugin add`, 전역에서 끄려면 `~\u002F.codex\u002Fconfig.toml` 에 `enabled = false`)\n- Antigravity: 프로젝트 범위 스위치가 없다 — 전역 `agy plugin install \u003Cclone>\u002Fplugins\u002F\u003Cname>`, 또는 변환본을\n  `\u003Crepo>\u002F.agents\u002Fplugins\u002F\u003Cname>\u002F` 에 둔다\n- Codex·Antigravity 는 `dependencies` 를 따라 설치하지 않는다 — kotlin-spring·go-mux·python-fastapi 는 backend-shared 를 함께\n- 이미 켜져 있으면 생략한다. 명령은 안내만 하고 실행은 사용자 요청 시에만 한다. 반영은 다음 세션부터\n\nVCS 안내: gitlab 호스트면 `\u002Fworkflow:review-mr`, `\u002Fworkflow:release-notes`(glab 필요)를, github 이면 `gh pr` 흐름을\n블록의 VCS 줄에 적는다.\n\n**(e) 선택 — Antigravity 경로 한정 rules** `.agents\u002Frules\u002F\u003Cstack>-specialist.md`: 사용자가 Antigravity 를 쓴다고 할 때만.\n(c) 와 같은 본문에 frontmatter 만 `trigger: glob` + `globs: \"\u003C쉼표 구분 문자열>\"`(YAML 리스트는 로더가 거부 — `agy plugin\nvalidate` 실측). Claude Code 는 `.agents\u002F` 아래를 읽지 않고 Codex 도 읽지 않으므로 중복 로드는 없다. 쉼표 구분자의 실제 매칭과\n런타임 발화는 미실측 — 제안할 때 그렇게 고지한다.\n\n**(f) 이전 버전 출력의 이전** — 블록이 CLAUDE.md 에 있거나 `.claude\u002Frules\u002Fspecialist-core.md`(메타 주석 `project-rules:`)가 있으면:\n1. AGENTS.md 에 (a) 블록을 새로 만든다. 스택 사실은 재감지 결과로, core 는 specialist-core.md 항목을 Phase 3 로 재판정해\n   `## Specialist core` 로 옮긴다(`\u003C!-- manual -->` 줄은 그대로 보존)\n2. CLAUDE.md 에서 옛 블록(마커 줄 포함)을 지우고 (b) 대로 `@AGENTS.md` 를 단다. specialist-core.md 는 삭제를 제안한다 —\n   남기면 Claude 에 같은 core 가 두 번 들어간다. path rules 의 \"핵심은 specialist-core.md\" 문구도 AGENTS.md 로 고친다\n3. AGENTS.md 가 이미 있고 CLAUDE.md 와 거의 같은 사본이면(블록 밖 비어 있지 않은 줄의 절반 이상이 같음 —\n   `grep -Fxf CLAUDE.md AGENTS.md | grep -c .` 대 `grep -c . AGENTS.md`) import 하면 내용이 두 번 들어간다. 둘 중 하나를 고르게 한다:\n   - **통합**: CLAUDE.md 를 `@AGENTS.md` + 두 파일의 차이 줄(Claude 전용분)만 남기는 diff — 블록 밖 편집이므로 diff 를 보여주고 별도 승인\n   - **미러**: import 없이 같은 블록을 AGENTS.md 와 CLAUDE.md 양쪽에 둔다. `--check` 가 두 사본이 같은지 본다\n4. 적용 순서는 AGENTS.md 쓰기 → CLAUDE.md 수정 → specialist-core.md 삭제. 중간에 멈춰도 내용이 사라지지 않게\n\n## Phase 5: 승인과 적용\n\n1. (a)~(f) 중 해당하는 것을 한 번에 보여준다: 파일별 diff + 선별 근거 표(ID · 적용 조건 · 신호 · core 여부) + 제외 요약\n   + 크기(블록·AGENTS.md 바이트, CLAUDE.md+import 줄 수)\n2. 사용자가 고른 것만 적용한다. 전체\u002F부분\u002F반려 모두 가능\n3. 적용 후 요약 1~3줄. git commit 은 하지 않는다\n\n## --check 모드\n\n[references\u002Fselection.md](references\u002Fselection.md) §5 의 점검표로 보고만 한다. 기준 파일은 AGENTS.md 블록이다.\n\n| 점검 | 방법 | 보고 예 |\n|------|------|---------|\n| 블록 위치 | AGENTS.md 에 마커 한 쌍, CLAUDE.md 에 블록 없음(미러 모드면 두 사본 동일) | `블록이 CLAUDE.md 에만 있음 — 이전 필요 (f)` |\n| Claude 연결 | CLAUDE.md 가 있으면 코드 밖 `@AGENTS.md`(또는 미러) | `CLAUDE.md 에 @AGENTS.md 없음 — Claude 는 블록을 못 본다` |\n| 버전 드리프트 | 블록\u002Frules 메타의 버전 ↔ 현재 빌드 파일 | `Spring Boot 3.3.5 → 3.4.1 (build.gradle.kts)` |\n| 없는 도구 참조 | 블록의 도구·명령 ↔ 실제 파일 | `Flyway 참조, 의존성 없음 — dbmate 사용 중` |\n| 사라진 ID | core·rules 의 ID ↔ 현재 색인 | `JVM-GC-07 플러그인에서 사라짐` |\n| 조건 이탈 | 항목의 `applies` ↔ 현재 프로필 | `JVM-CONC-01 은 가상 스레드(JDK 21+) 전제, 현재 17` |\n| core 형식 | `## Specialist core` 항목 ≤15줄, path rules 와 ID 중복 없음, 옛 specialist-core.md 없음 | `SPR-TX-02 가 core 와 kotlin-specialist.md 에 중복` |\n| 크기 | 블록 ≤50줄·6,000B, `wc -c AGENTS.md` ≤24,000, 루트→하위 AGENTS.md 합계 ≤32,768, CLAUDE.md+import ≤200줄 | `AGENTS.md 25,310B (>24,000, Antigravity 에서 잘림)` |\n| 가림 | `AGENTS.override.md`(Codex 가 대신 읽음), CLAUDE.md 없이 `CLAUDE.local.md`(Claude 가 AGENTS.md 를 안 읽음) | `AGENTS.override.md 있음 — Codex 는 블록을 못 본다` |\n\n드리프트가 있으면 \"재생성 제안을 볼까요?\" 로 끝낸다.\n\n## 경계\n\n- 쓰는 파일(승인 후에만): 프로젝트 `AGENTS.md` 의 마커 블록, `CLAUDE.md` 의 `@AGENTS.md` 한 줄(없을 때)과 옛 블록 제거·\n  통합\u002F미러((f)), `.claude\u002Frules\u002F*-specialist.md`, 선택 `.agents\u002Frules\u002F*-specialist.md`, 옛 `.claude\u002Frules\u002Fspecialist-core.md` 삭제\n- 쓰지 않는 것: `~\u002F.claude\u002F`·`~\u002F.codex\u002F`·`~\u002F.gemini\u002F` 전역 설정, settings.json·`.codex\u002Fconfig.toml`(플러그인 활성화는 명령 안내까지),\n  블록 밖 AGENTS.md·CLAUDE.md 내용(그건 `workflow:sync-claude-md` 소관 — (f)-3 통합만 예외로 별도 승인), 스택 플러그인 본문\n- 항목 원문을 블록·rules 에 복사하지 않는다 — ID + 한 줄 요약 + 깊이 참조만\n","# Project Rules — 프로젝트별 스택 사실과 스페셜리스트 규칙\n\n스택 플러그인은 \"현직 시니어도 놓치는 함정\"을 ID 붙은 항목으로 담고 있다(`### \u003CPREFIX>-\u003CAREA>-\u003CNN> · 제목`\n+ `- 적용:` 조건). 이 스킬은 그중 **이 프로젝트의 버전·구성에 실제로 해당하는 것만** 골라 프로젝트에 심고,\n버전·도구 같은 사실은 프로젝트 지침 파일에 둔다. 범용 지식을 프로젝트에 복사하지 않는다.\n\n모든 쓰기는 **diff 제안 → 사용자 승인 → 적용** 순서다. 승인 전에는 읽기만 한다.\n\n## 로드 방식이 배치를 정한다\n\n세 런타임이 공통으로 항상 읽는 파일은 **AGENTS.md 하나**다. 그래서 항상 적용돼야 하는 것은 AGENTS.md 에 둔다.\n\n| 런타임 | 항상 로드 | 근거 |\n|--------|-----------|------|\n| Claude Code | `CLAUDE.md`(+`@import`). CLAUDE.md 가 **없을 때만** AGENTS.md 를 직접 읽는다(v2.1.277+). CLAUDE.md 가 있으면 `@AGENTS.md` import 가 있어야 AGENTS.md 가 들어온다. 블록 수준 HTML 주석은 제거된다 | code.claude.com\u002Fdocs\u002Fen\u002Fmemory §AGENTS.md, §Share one file with other coding tools |\n| Codex CLI | git 루트→cwd 의 `AGENTS.md`(디렉터리당 1개, `AGENTS.override.md` 우선)를 이어 붙임. CLAUDE.md·`@import` 는 읽지 않는다. 합계 `project_doc_max_bytes`=32 KiB 초과분은 잘린다. HTML 주석이 그대로 들어간다 | 런타임 실측(codex 0.165) |\n| Antigravity | cwd(파일을 열면 그 디렉터리)→레포 루트의 `AGENTS.md`\u002F`GEMINI.md`. CLAUDE.md 는 읽지 않는다. 파일당 24,000바이트에서 줄 단위로 잘림 | `agy-customizations\u002Fdocs\u002Frules.md:12-15,31-33`, `agy-customizations\u002FSKILL.md:49-51`, 실측(agy 1.4.7) |\n\nClaude Code 의 경로 한정 rules(`.claude\u002Frules\u002F*.md` + `paths`)는 Read\u002FWrite\u002FEdit(또는 단일 파일 `cat`·`head`·`sed -n` 같은\n읽기형 Bash)로 매칭 파일을 다룰 때만 로드되고 compaction 뒤엔 다시 매칭될 때까지 빠진다. Bash heredoc·`tee`·`sed -i` 로\n**쓰는** 것은 트리거가 아니다 — 새 파일을 만들 때 걸리는 함정은 항상 로드되는 쪽에 둬야 한다. 그래서:\n\n- **스택 사실 + 스페셜리스트 핵심 ≤15줄** → 프로젝트 루트 `AGENTS.md` 마커 블록 (세 런타임 공통, 항상)\n- **CLAUDE.md 연결** → `@AGENTS.md` 한 줄 (CLAUDE.md 가 있을 때. 없으면 만들지 않는 것이 기본 — Phase 4 (b))\n- **상세 항목** → `.claude\u002Frules\u002F\u003Cstack>-specialist.md`, `paths` 있음 — **Claude Code 전용 보너스**. Codex 에는 파일 경로로 켜지는\n  규칙이 확인되지 않았고(하위 AGENTS.md 는 cwd 경로 기준), Antigravity 는 선택 출력 (e) 로만 대응한다\n\n## 모드\n\n| 인자 | 동작 |\n|------|------|\n| (없음) | 감지 → 생성 제안(a)~(d), 선택 (e). 이전 버전 출력이 있으면 이전 제안(Phase 4 (f))을 함께 |\n| `--check` | 감지 → AGENTS.md 블록·CLAUDE.md 연결·rules 와 대조해 드리프트 보고(수정은 승인 후) |\n| `\u003Csubdir>` | 모노레포의 하위 프로젝트만 대상 — 블록은 `\u003Csubdir>\u002FAGENTS.md`, 규칙 `paths` 도 그 하위로 한정 |\n\n## Phase 1: 감지 (읽기 전용)\n\n[references\u002Fdetection.md](references\u002Fdetection.md) 의 표대로 파일을 읽어 아래 **스택 프로필**을 만든다.\n값을 확인하지 못하면 비워 두고 \"미확인\"으로 표시한다 — 추측해서 채우지 않는다. BOM·카탈로그가 관리하는\n버전(lock 없음)은 \"BOM 관리(미확인)\"이다. 대상 저장소에서 빌드 도구를 실행하지 않는다(캐시·빌드 디렉터리에 쓴다).\n\n```\nstack profile\n- jvm: JDK toolchain=21 \u002F Kotlin=2.1.0 \u002F Spring Boot=3.4.1 \u002F build=Gradle(kts, version catalog)\n- go: go=1.23 (toolchain go1.23.4) \u002F router=net\u002Fhttp \u002F db=pgx stdlib\n- python: requires-python>=3.12 \u002F FastAPI \u002F ORM=없음(psycopg 원시 SQL)\n- node: next=16.x \u002F react=19.x\n- elasticsearch: client=co.elastic.clients:elasticsearch-java 8.x \u002F mappings=src\u002Fmain\u002Fresources\u002Fes\u002F*.json\n- db: PostgreSQL(+PostGIS) \u002F migrations=dbmate(db\u002Fmigrations)\n- infra: Dockerfile, k8s manifests → 컨테이너 배포 (compose 로 의존 서비스만 띄우는 것은 앱 컨테이너 배포가 아니다)\n- vcs: gitlab.\u003Ccompany> → glab \u002F github.com → gh\n- verify: .\u002Fgradlew check, go test .\u002F..., pytest, pnpm test (빌드 파일·CI 설정·AGENTS.md·CLAUDE.md 에서 확인된 것만)\n- instructions: AGENTS.md 4.1KB(블록 없음) \u002F CLAUDE.md 133줄, `@AGENTS.md` 없음 \u002F AGENTS.override.md·CLAUDE.local.md 없음\n       \u002F legacy: CLAUDE.md 에 project-rules 블록, .claude\u002Frules\u002Fspecialist-core.md 있음 → 이전 대상\n- existing: AGENTS.md·CLAUDE.md 블록 밖에 이미 적힌 사실·함정(중복 제안 방지용)\n```\n\n## Phase 2: 스페셜리스트 항목 수집\n\n1. 프로필에 해당하는 플러그인만 색인한다(매핑은 [references\u002Fdetection.md](references\u002Fdetection.md) §2):\n   ```bash\n   bash \"\u003C스킬 디렉터리>\u002Fscripts\u002Fspecialist-index.sh\" auto kotlin-spring backend-shared search\n   ```\n   - `\u003C스킬 디렉터리>` = 이 SKILL.md 가 있는 디렉터리. Claude Code 는 `${CLAUDE_SKILL_DIR}` 로 쓴다. Codex·Antigravity 는\n     `${CLAUDE_SKILL_DIR}`·`${CLAUDE_PLUGIN_ROOT}` 를 스킬 본문에서 치환하지 않으므로 이 SKILL.md 를 읽은 절대 경로에서\n     잡는다(Codex 는 스킬 목록의 skill roots 표, Antigravity 는 `~\u002F.gemini\u002Fconfig\u002Fplugins\u002Fworkflow\u002Fskills\u002Fproject-rules`)\n   - `auto` 는 원천을 스크립트가 정한다: 지금 실행 중인 workflow 와 **같은 설치본의 형제 플러그인**(레포 `plugins\u002F`,\n     Claude·Codex 캐시 `\u003Cplugin>\u002F\u003Cversion>\u002F`, Antigravity 변환본 `\u003Cplugin>\u002F`)을 먼저 보고, 없는 플러그인만\n     `~\u002F.claude\u002Fplugins\u002Fcache\u002Fdokkabei-harness` → `${CODEX_HOME:-~\u002F.codex}\u002Fplugins\u002Fcache\u002Fdokkabei-harness` →\n     `.\u002F.agents\u002Fplugins` → `~\u002F.gemini\u002Fconfig\u002Fplugins` 순으로 찾는다. 원천을 직접 주려면 `auto` 대신 그 디렉터리\n2. stdout 은 `plugin  skill  id  title  applies  file`(절대 경로) TSV 한 줄씩 — 본문 전체를 읽지 않고 고른다.\n   stderr 의 `source  plugin  version  items  dir` 줄이 rules 메타(`source \u003Cplugin>@\u003Cversion>\u002F\u003Citems>`)의 값이다\n3. `items` 가 0 이거나 `dir` 이 `-` 인 플러그인은 설치본이 구버전이거나 없다 → 런타임별 갱신 명령(Claude\n   `\u002Fplugin update \u003Cname>@dokkabei-harness`, Codex `codex plugin add \u003Cname>@dokkabei-harness`, Antigravity\n   `agy plugin install \u003Cclone>\u002Fplugins\u002F\u003Cname>`) 후 재실행을 안내하고 해당 스택은 건너뛴다(빈 rules 를 만들지 않는다)\n\n## Phase 3: 선별 (스택당 ≤15, core 는 전체 ≤15)\n\n[references\u002Fselection.md](references\u002Fselection.md) 의 기준으로 거른다. 요약:\n\n1. **적용 조건 일치** — `applies` 의 버전·구성 조건이 프로필과 맞는 것만. 판단이 애매하면 제외.\n2. **신호 확인** — 후보의 `- 신호:` 줄만 읽는다. 코드 패턴이면 Grep 으로 저장소에서 찾고, 런타임 증상(지연·로그·메트릭)이면\n   그 증상을 만드는 **구성(construct)** 이 코드에 있는지 확인한다. 신호가 이미 대응돼 있으면 \"대응됨\"으로 표시한다.\n3. **중복 배제** — 같은 메커니즘은 하나만(플러그인을 가로질러도), 블록 밖 AGENTS.md·CLAUDE.md 에 이미 적힌 함정도 제외.\n4. **core 지정** — 선별된 것 중 ①새 파일을 만들 때 걸리는 함정(마이그레이션·라우트·액션·DTO) ②모델이 구버전 습관으로\n   틀리는 버전 함정 ③신호가 발견된 운영 장애급 — 이 순서로 전체 ≤15줄. Codex·Antigravity 에는 경로 rules 가 없으므로\n   core 가 그 런타임이 받는 스페셜리스트의 전부다 — 둘 중 하나를 고를 때는 core 쪽을 택한다.\n5. 15개를 채우려고 억지로 넣지 않는다. 5개여도 된다.\n\n## Phase 4: 생성 제안\n\n템플릿은 [references\u002Ftemplates.md](references\u002Ftemplates.md).\n\n**(a) 프로젝트 루트 `AGENTS.md` 마커 블록** — `\u003C!-- project-rules:start -->` … `\u003C!-- project-rules:end -->`\n- `## Stack facts`(≤30줄: 버전·빌드\u002F마이그레이션 도구·검증 명령·VCS\u002FCLI·rules 안내 1줄) + `## Specialist core`(항목 ≤15줄,\n  스택별 `###` 소제목. 각 줄은 \"무엇을 하면 안 되는지\u002F해야 하는지\"가 줄 자체로 서야 한다 — 깊이 참조를 열지 않아도 행동이 바뀌게)\n- 크기: 블록 ≤50줄·≤6,000바이트. 적용 후 AGENTS.md 전체 ≤24,000바이트(Antigravity 파일 한도 — 넘으면 줄 단위로 잘림),\n  git 루트→가장 깊은 작업 디렉터리의 AGENTS.md 합계 ≤32,768바이트(Codex `project_doc_max_bytes` 기본값 — 넘으면 잘리고\n  더 깊은 파일은 빠진다). 넘으면 블록 밖을 줄이라고 보고만 한다(블록 밖은 이 스킬 소관이 아니다)\n- 위치: 블록이 없으면 첫 `##` 섹션 앞(잘림은 파일 뒤부터라 블록이 살아남게). 있으면 **그 안만** 교체(멱등).\n  AGENTS.md 가 없으면 블록만 담은 새 파일을 제안한다\n- 블록 밖에 이미 같은 사실이 있으면 블록에 다시 쓰지 않는다(블록 밖 수정은 `workflow:sync-claude-md` 소관 — 불일치만 보고)\n- 블록 안 깊이 참조는 런타임 중립 표기 `(\u003Cplugin>:\u003Cskill>)` — 슬래시 명령 표기는 런타임마다 다르다\n\n**(b) `CLAUDE.md` 연결** — Claude Code 가 AGENTS.md 블록을 보게 한다\n\n| 상태 | 제안 |\n|------|------|\n| CLAUDE.md 없음 | 만들지 않는 것이 기본(Claude Code v2.1.277+ 는 CLAUDE.md 가 없으면 AGENTS.md 를 직접 읽는다). 승인 게이트에서 \"`@AGENTS.md` 한 줄짜리 CLAUDE.md 도 만들까요?\"를 묻는다 — 구버전·AGENTS.md 지원이 꺼진 세션, 나중에 `CLAUDE.local.md` 를 둘 계획이면 필요(`CLAUDE.local.md` 가 생기면 AGENTS.md 직접 읽기가 멈춘다) |\n| CLAUDE.md 있음, 코드 밖 `@AGENTS.md` 없음 | 맨 위에 `@AGENTS.md` 한 줄 추가(이 스킬이 블록 밖에서 하는 유일한 편집). 단 AGENTS.md 가 CLAUDE.md 의 사본에 가까우면 import 로 같은 내용이 두 번 들어간다 — (f)-3 판정을 먼저 한다 |\n| 이미 `@AGENTS.md` 있음 | 생략 |\n\n적용 후 CLAUDE.md(+`@import` 대상, 즉 AGENTS.md 포함)가 200줄을 넘으면 경고하고 일부를 path-scoped rules 로 옮기는 안을 제시한다.\n\n**(c) `.claude\u002Frules\u002F\u003Cstack>-specialist.md`** — **Claude Code 전용 보너스**. 스택(코드 위치)당 1파일, frontmatter 는 `paths` 만\n- 본문: 생성 메타 주석 1줄 + 항목당 1줄 `- **\u003CID>** \u003C함정 요약> — 깊이: \u002F\u003Cplugin>:\u003Cskill> 의 \u003CID>`\n- core 에 올린 ID 는 반복하지 않는다. 남는 항목이 없으면 파일을 만들지 않는다\n- 기존 파일이 있으면 diff 로 제안(사용자가 손으로 추가한 줄은 보존)\n\n**(d) 스택 플러그인 활성화 안내** — 이 프로젝트에서만 켜기. 런타임별 명령은 templates.md (d):\n- Claude Code: `claude plugin enable \u003Cname>@dokkabei-harness --scope local` (커밋되지 않는 `.claude\u002Fsettings.local.json`)\n- Codex: 프로젝트 `.codex\u002Fconfig.toml` 의 `[plugins.\"\u003Cname>@dokkabei-harness\"] enabled = true`(신뢰된 프로젝트에서만 읽힘;\n  설치는 `codex plugin add`, 전역에서 끄려면 `~\u002F.codex\u002Fconfig.toml` 에 `enabled = false`)\n- Antigravity: 프로젝트 범위 스위치가 없다 — 전역 `agy plugin install \u003Cclone>\u002Fplugins\u002F\u003Cname>`, 또는 변환본을\n  `\u003Crepo>\u002F.agents\u002Fplugins\u002F\u003Cname>\u002F` 에 둔다\n- Codex·Antigravity 는 `dependencies` 를 따라 설치하지 않는다 — kotlin-spring·go-mux·python-fastapi 는 backend-shared 를 함께\n- 이미 켜져 있으면 생략한다. 명령은 안내만 하고 실행은 사용자 요청 시에만 한다. 반영은 다음 세션부터\n\nVCS 안내: gitlab 호스트면 `\u002Fworkflow:review-mr`, `\u002Fworkflow:release-notes`(glab 필요)를, github 이면 `gh pr` 흐름을\n블록의 VCS 줄에 적는다.\n\n**(e) 선택 — Antigravity 경로 한정 rules** `.agents\u002Frules\u002F\u003Cstack>-specialist.md`: 사용자가 Antigravity 를 쓴다고 할 때만.\n(c) 와 같은 본문에 frontmatter 만 `trigger: glob` + `globs: \"\u003C쉼표 구분 문자열>\"`(YAML 리스트는 로더가 거부 — `agy plugin\nvalidate` 실측). Claude Code 는 `.agents\u002F` 아래를 읽지 않고 Codex 도 읽지 않으므로 중복 로드는 없다. 쉼표 구분자의 실제 매칭과\n런타임 발화는 미실측 — 제안할 때 그렇게 고지한다.\n\n**(f) 이전 버전 출력의 이전** — 블록이 CLAUDE.md 에 있거나 `.claude\u002Frules\u002Fspecialist-core.md`(메타 주석 `project-rules:`)가 있으면:\n1. AGENTS.md 에 (a) 블록을 새로 만든다. 스택 사실은 재감지 결과로, core 는 specialist-core.md 항목을 Phase 3 로 재판정해\n   `## Specialist core` 로 옮긴다(`\u003C!-- manual -->` 줄은 그대로 보존)\n2. CLAUDE.md 에서 옛 블록(마커 줄 포함)을 지우고 (b) 대로 `@AGENTS.md` 를 단다. specialist-core.md 는 삭제를 제안한다 —\n   남기면 Claude 에 같은 core 가 두 번 들어간다. path rules 의 \"핵심은 specialist-core.md\" 문구도 AGENTS.md 로 고친다\n3. AGENTS.md 가 이미 있고 CLAUDE.md 와 거의 같은 사본이면(블록 밖 비어 있지 않은 줄의 절반 이상이 같음 —\n   `grep -Fxf CLAUDE.md AGENTS.md | grep -c .` 대 `grep -c . AGENTS.md`) import 하면 내용이 두 번 들어간다. 둘 중 하나를 고르게 한다:\n   - **통합**: CLAUDE.md 를 `@AGENTS.md` + 두 파일의 차이 줄(Claude 전용분)만 남기는 diff — 블록 밖 편집이므로 diff 를 보여주고 별도 승인\n   - **미러**: import 없이 같은 블록을 AGENTS.md 와 CLAUDE.md 양쪽에 둔다. `--check` 가 두 사본이 같은지 본다\n4. 적용 순서는 AGENTS.md 쓰기 → CLAUDE.md 수정 → specialist-core.md 삭제. 중간에 멈춰도 내용이 사라지지 않게\n\n## Phase 5: 승인과 적용\n\n1. (a)~(f) 중 해당하는 것을 한 번에 보여준다: 파일별 diff + 선별 근거 표(ID · 적용 조건 · 신호 · core 여부) + 제외 요약\n   + 크기(블록·AGENTS.md 바이트, CLAUDE.md+import 줄 수)\n2. 사용자가 고른 것만 적용한다. 전체\u002F부분\u002F반려 모두 가능\n3. 적용 후 요약 1~3줄. git commit 은 하지 않는다\n\n## --check 모드\n\n[references\u002Fselection.md](references\u002Fselection.md) §5 의 점검표로 보고만 한다. 기준 파일은 AGENTS.md 블록이다.\n\n| 점검 | 방법 | 보고 예 |\n|------|------|---------|\n| 블록 위치 | AGENTS.md 에 마커 한 쌍, CLAUDE.md 에 블록 없음(미러 모드면 두 사본 동일) | `블록이 CLAUDE.md 에만 있음 — 이전 필요 (f)` |\n| Claude 연결 | CLAUDE.md 가 있으면 코드 밖 `@AGENTS.md`(또는 미러) | `CLAUDE.md 에 @AGENTS.md 없음 — Claude 는 블록을 못 본다` |\n| 버전 드리프트 | 블록\u002Frules 메타의 버전 ↔ 현재 빌드 파일 | `Spring Boot 3.3.5 → 3.4.1 (build.gradle.kts)` |\n| 없는 도구 참조 | 블록의 도구·명령 ↔ 실제 파일 | `Flyway 참조, 의존성 없음 — dbmate 사용 중` |\n| 사라진 ID | core·rules 의 ID ↔ 현재 색인 | `JVM-GC-07 플러그인에서 사라짐` |\n| 조건 이탈 | 항목의 `applies` ↔ 현재 프로필 | `JVM-CONC-01 은 가상 스레드(JDK 21+) 전제, 현재 17` |\n| core 형식 | `## Specialist core` 항목 ≤15줄, path rules 와 ID 중복 없음, 옛 specialist-core.md 없음 | `SPR-TX-02 가 core 와 kotlin-specialist.md 에 중복` |\n| 크기 | 블록 ≤50줄·6,000B, `wc -c AGENTS.md` ≤24,000, 루트→하위 AGENTS.md 합계 ≤32,768, CLAUDE.md+import ≤200줄 | `AGENTS.md 25,310B (>24,000, Antigravity 에서 잘림)` |\n| 가림 | `AGENTS.override.md`(Codex 가 대신 읽음), CLAUDE.md 없이 `CLAUDE.local.md`(Claude 가 AGENTS.md 를 안 읽음) | `AGENTS.override.md 있음 — Codex 는 블록을 못 본다` |\n\n드리프트가 있으면 \"재생성 제안을 볼까요?\" 로 끝낸다.\n\n## 경계\n\n- 쓰는 파일(승인 후에만): 프로젝트 `AGENTS.md` 의 마커 블록, `CLAUDE.md` 의 `@AGENTS.md` 한 줄(없을 때)과 옛 블록 제거·\n  통합\u002F미러((f)), `.claude\u002Frules\u002F*-specialist.md`, 선택 `.agents\u002Frules\u002F*-specialist.md`, 옛 `.claude\u002Frules\u002Fspecialist-core.md` 삭제\n- 쓰지 않는 것: `~\u002F.claude\u002F`·`~\u002F.codex\u002F`·`~\u002F.gemini\u002F` 전역 설정, settings.json·`.codex\u002Fconfig.toml`(플러그인 활성화는 명령 안내까지),\n  블록 밖 AGENTS.md·CLAUDE.md 내용(그건 `workflow:sync-claude-md` 소관 — (f)-3 통합만 예외로 별도 승인), 스택 플러그인 본문\n- 항목 원문을 블록·rules 에 복사하지 않는다 — ID + 한 줄 요약 + 깊이 참조만\n",{"name":5,"description":49,"argument-hint":50},"현재 프로젝트의 스택(빌드 파일 버전, 마이그레이션 도구, ORM 유무, ES 사용, git 호스트)을 감지해 프로젝트 루트 AGENTS.md 의 마커 블록(스택 사실 + 항상 적용되는 스페셜리스트 핵심 ≤15줄 — Claude Code·Codex·Antigravity 공통)과 CLAUDE.md 의 `@AGENTS.md` 연결, Claude 전용 경로 한정 .claude\u002Frules\u002F\u003Cstack>-specialist.md(해당 버전에 실제로 맞는 상세 함정)를 diff 로 제안하고, 스택 플러그인을 런타임별로 프로젝트 범위에서 켜는 법을 안내한다. 이전 버전 출력(CLAUDE.md 블록·specialist-core.md)은 AGENTS.md 로 이전을 제안. --check 는 버전 불일치·사라진 ID·크기 한도·연결 누락을 점검.\nDetects the project's stack and proposes a cross-runtime AGENTS.md block (stack facts + always-on specialist core) linked from CLAUDE.md via @AGENTS.md, plus Claude-only path-scoped specialist rules; migrates the older CLAUDE.md-block layout; --check audits drift.\nUse when: \"이 프로젝트 세팅\", \"프로젝트 규칙 생성\", \"AGENTS.md\u002FCLAUDE.md 점검\", project setup, generate project rules, audit AGENTS.md or CLAUDE.md drift.\n","[--check] [subdir]","main","e9f37e996e3d2b1b6ac9c879e9dfba1223b597c3","plugins\u002Fworkflow\u002Fskills\u002Fproject-rules",0,"https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness","https:\u002F\u002Fdokkabei97.github.io\u002Fdokkabei-harness\u002F","https:\u002F\u002Fgithub.com\u002FDokkabei97","Contact: wkdrn970@gmail.com","2026-10-29 06:49:16",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add Dokkabei97\u002Fdokkabei-harness --skill project-rules",{"tool":66,"command":67},"bunx","bunx skills add Dokkabei97\u002Fdokkabei-harness --skill project-rules",{"tool":69,"command":70},"pnpm","pnpm dlx skills add Dokkabei97\u002Fdokkabei-harness --skill project-rules","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fproject-rules\u002FSKILL.md",true,[74,80,84,88],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Fdetection.md","REFERENCE","参考文档",9413,"https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fproject-rules\u002Freferences\u002Fdetection.md",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fselection.md",7857,"https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fproject-rules\u002Freferences\u002Fselection.md",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Ftemplates.md",10983,"https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fproject-rules\u002Freferences\u002Ftemplates.md",{"path":89,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":92,"sourceHtmlUrl":93},"scripts\u002Fspecialist-index.sh","SCRIPT","脚本",4635,"https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fproject-rules\u002Fscripts\u002Fspecialist-index.sh",[95,123,149,172,193,219],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":106,"publishedAt":44},"01M6QZQTNF815AWYMAMJ3B25GY","sync-claude-md","커밋·푸시·PR\u002FMR 직전에 이번 변경이 프로젝트 CLAUDE.md 를 낡게 만드는지 검토하고, 필요할 때만 갱신 diff 를 제안한다 — 아키텍처·디렉터리 구조, 새 통합\u002FMCP, 컨벤션, 빌드·CI·도구, 주요 의존성 변화가 대상. 해당 없으면 한 줄로 끝낸다.\nReviews whether pending changes make the project CLAUDE.md stale (architecture, integrations, conventions, build\u002FCI\u002Ftooling, major dependencies) and proposes a minimal update diff only when needed.\nUse when: \"CLAUDE.md 갱신 필요해?\", \"CLAUDE.md 동기화\", 커밋\u002F푸시\u002FMR 전에 구조·도구가 바뀐 변경을 정리할 때, sync CLAUDE.md, check CLAUDE.md before commit or PR.","https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fsync-claude-md\u002FSKILL.md",[101],{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[107,108,109,110,111,112,113,114,115,116,117,37,36,118,26,119,120,121,122,28],"sync","claude md","sync claude md","MCP","commit","architecture","pr","update","ci","integrations","use","minimal","make","reviews","pending","mr",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":131,"publishedAt":44},"01M6QZQEK94G00N955VQH9EFQN","spec-driven-dev","새 기능·프로젝트·큰 변경을 코드보다 스펙 먼저로 진행하는 게이트 워크플로(SPECIFY → PLAN → TASKS → IMPLEMENT) — 가정 명시, 측정 가능한 성공 기준, Always\u002FAsk\u002FNever 경계, 단계별 사람 검토로 범위 이탈과 재작업을 줄인다.\nSpec-before-code gated workflow for new features or significant changes: explicit assumptions, measurable success criteria, boundaries, and a human review between stages.\nUse when: \"스펙 먼저\", \"기능 명세\", \"요구사항 정리\", starting a new feature or project, a significant change with vague requirements. 단순 버그 수정·1~2줄 변경엔 불필요.","https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fspec-driven-dev\u002FSKILL.md",[129,130],{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[132,133,134,135,136,137,138,139,140,42,141,142,143,144,26,145,146,147,148,28],"spec","spec driven","dev","spec driven dev","driven","review","workflow","change","tasks","plan","ask","never","human","feature","for","vague","features",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":44},"01M6QZQA9F6QVGTVDMJ28YQGDV","shipping-guide","프로덕션 배포 전후 가이드 — 배포 전 체크리스트, 피처 플래그 수명주기, 단계적 롤아웃과 진행\u002F보류\u002F롤백 임계값, 롤백 계획 템플릿, 배포 후 모니터링.\nProduction shipping guide: pre-launch checklist, feature-flag lifecycle, staged rollout with go\u002Fhold\u002Frollback thresholds, rollback plan template, post-launch monitoring.\nUse when: \"배포 준비\", \"릴리즈 전 점검\", \"롤아웃 계획\", \"롤백 계획\", preparing a production deploy, staged rollout, feature flags.","https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fshipping-guide\u002FSKILL.md",[],[156,157,158,159,160,161,162,141,163,164,117,165,166,145,167,168,169,170,171,28],"shipping","guide","shipping guide","launch","monitoring","lifecycle","feature flags","template","rollback","rollout","flags","thresholds","post","with","pre-launch","rollback plan",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":44},"01M6QZQ3M962PCWYM6YH62D76Z","retro","세션 회고·교훈 컴파운딩 — 이번 세션의 교정·실수·발견을 추출해 품질 기준(재현·일반화·판정 가능성)으로 거르고, 컨벤션 변화는 sync-claude-md 위임, 반복 실수는 tasks\u002Flessons.md(#가드-훅-후보 태그), 스킬 지식 갱신은 수정 제안으로 나눈다. 모든 적용은 승인 후.\nSession retrospective that turns corrections, mistakes, and discoveries into vetted lessons routed to CLAUDE.md sync, tasks\u002Flessons.md, or skill-edit proposals, with user approval before any write.\nUse when: \"회고\", \"레트로\", \"교훈 정리\", \"같은 실수 반복\", \"재발 방지 규칙\", retrospective, lessons learned, wrapping up a task, review, or loop. 여러 실행에 걸친 하네스 개선은 harness:evolve.","https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fretro\u002FSKILL.md",[],[174,137,107,140,179,180,181,182,183,184,185,186,36,187,188,189,190,191,192,28],"run","harness","loop","evolve","write","edit","proposals","session","up","dry","learned","Session Retrospective","lessons","mistakes",{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":197,"categories":198,"keywords":203,"publishedAt":44},"01M6QZPF3S8YAM27F297F6GVD7","post-merge","MR 머지 완료 후 Plane 이슈 종료와 Outline 문서 업데이트를 자동으로 처리하는 오케스트레이터 스킬입니다.\nissue-tracker와 document-latest 스킬을 연계 실행하여 머지 후 후속 작업을 일괄 처리합니다.\nOrchestrates post-merge follow-up after an MR is merged: chains the issue-tracker and document-latest skills to close the Plane issue and update Outline wiki docs in a single batch. Use when: an MR was just merged, closing tickets and syncing documentation after a merge, post-merge cleanup.","https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fpost-merge\u002FSKILL.md",[199,202],{"categoryNo":200,"categoryName":201,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000002","文档处理",{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},[204,205,168,206,207,114,208,209,210,187,211,212,213,214,215,216,217,218,122,28],"merge","post merge","documentation","cleanup","batch","wiki","just","issue","tracker","close","closing","follow-up","true","plane","single",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":223,"categories":224,"keywords":225,"publishedAt":44},"01M6QZPA69ZMNE613JWW6QE6EY","planning-guide","모호한 아이디어를 원페이저 계획과 실행 가능한 태스크로 바꾸는 가이드 — 문제 재진술, 가정 명시, 의존성 순서, 수직 슬라이싱, 태스크 크기(XS~XL)와 분해 기준, 태스크 템플릿.\nTurns vague ideas into a one-page plan and implementable tasks: problem restatement, explicit assumptions, dependency order, vertical slicing, task sizing.\nUse when: \"계획 세워줘\", \"태스크로 쪼개줘\", \"작업 분해\", \"범위 정리\", breaking down a feature, planning a vague request.","https:\u002F\u002Fgithub.com\u002FDokkabei97\u002Fdokkabei-harness\u002Fblob\u002Fmain\u002Fplugins\u002Fworkflow\u002Fskills\u002Fplanning-guide\u002FSKILL.md",[],[226,157,227,140,141,228,117,229,230,231,145,232,233,147,234,235,28],"planning","planning guide","page","dependency","task","ideas","problem","one-page","down","request"]