oh-my-customcode 0.137.0 → 0.139.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  **[한국어 문서 (Korean)](./README_ko.md)**
15
15
 
16
- 49 agents. 117 skills. 22 rules. One command.
16
+ 49 agents. 118 skills. 23 rules. One command.
17
17
 
18
18
  ```bash
19
19
  npm install -g oh-my-customcode && cd your-project && omcustom init
@@ -132,7 +132,7 @@ Each agent declares its tools, model, memory scope, and limitations in YAML fron
132
132
 
133
133
  ---
134
134
 
135
- ### Skills (117)
135
+ ### Skills (118)
136
136
 
137
137
  | Category | Count | Includes |
138
138
  |----------|-------|----------|
@@ -210,7 +210,7 @@ All commands are invoked inside the Claude Code conversation.
210
210
 
211
211
  ---
212
212
 
213
- ### Rules (22)
213
+ ### Rules (23)
214
214
 
215
215
  | Priority | Count | Purpose |
216
216
  |----------|-------|---------|
@@ -222,7 +222,7 @@ Key rules: R010 (orchestrator never writes files), R009 (parallel execution mand
222
222
 
223
223
  ---
224
224
 
225
- ### Guides (50)
225
+ ### Guides (53)
226
226
 
227
227
  Reference documentation covering best practices, architecture decisions, and integration patterns. Located in `guides/` at project root, covering topics from agent design to CI/CD to observability.
228
228
 
@@ -272,7 +272,7 @@ your-project/
272
272
  ├── CLAUDE.md # Entry point
273
273
  ├── .claude/
274
274
  │ ├── agents/ # 49 agent definitions
275
- │ ├── skills/ # 117 skill modules
275
+ │ ├── skills/ # 118 skill modules
276
276
  │ ├── rules/ # 22 governance rules (R000-R021)
277
277
  │ ├── hooks/ # 15 lifecycle hook scripts
278
278
  │ ├── schemas/ # Tool input validation schemas
package/dist/cli/index.js CHANGED
@@ -2334,7 +2334,7 @@ var init_package = __esm(() => {
2334
2334
  workspaces: [
2335
2335
  "packages/*"
2336
2336
  ],
2337
- version: "0.137.0",
2337
+ version: "0.139.0",
2338
2338
  description: "Batteries-included agent harness for Claude Code",
2339
2339
  type: "module",
2340
2340
  bin: {
package/dist/index.js CHANGED
@@ -2014,7 +2014,7 @@ var package_default = {
2014
2014
  workspaces: [
2015
2015
  "packages/*"
2016
2016
  ],
2017
- version: "0.137.0",
2017
+ version: "0.139.0",
2018
2018
  description: "Batteries-included agent harness for Claude Code",
2019
2019
  type: "module",
2020
2020
  bin: {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "workspaces": [
4
4
  "packages/*"
5
5
  ],
6
- "version": "0.137.0",
6
+ "version": "0.139.0",
7
7
  "description": "Batteries-included agent harness for Claude Code",
8
8
  "type": "module",
9
9
  "bin": {
@@ -31,6 +31,13 @@ You are a QA execution specialist that runs tests, identifies defects, and valid
31
31
 
32
32
  Jest, Vitest, pytest, go test, JUnit, Playwright, Cypress
33
33
 
34
+ ## Verification Discipline
35
+
36
+ - Before writing a QA report, grep/read the target code and quote selectors, identifiers, filenames, and commands verbatim from the implementation.
37
+ - Do not invent `data-testid`, DOM selectors, function names, mapping names, or CLI flags from memory.
38
+ - If a browser/MCP/tool call is denied, do not retry the exact same call; switch to an allowed fallback and record the denial.
39
+ - When the same critical launch/runtime error appears twice, stop repeating launches and re-check flag semantics, existing processes, and environment assumptions.
40
+
34
41
  ## Collaboration
35
42
 
36
43
  Receives from: qa-writer (test cases), qa-planner (priorities). Outputs to: dev-lead (defects), qa-writer (results).
@@ -90,7 +90,17 @@
90
90
  "command": "bash .claude/hooks/scripts/rtk-intercept.sh"
91
91
  }
92
92
  ],
93
- "description": "RTK auto-intercept \u2014 transparently rewrites CLI commands through RTK proxy when available (R015 advisory)"
93
+ "description": "RTK auto-intercept transparently rewrites CLI commands through RTK proxy when available (R015 advisory)"
94
+ },
95
+ {
96
+ "matcher": "tool == \"Bash\" && tool_input.command matches \"git (reset|clean|checkout|restore|switch|rebase|merge)\"",
97
+ "hooks": [
98
+ {
99
+ "type": "command",
100
+ "command": "bash .claude/hooks/scripts/destructive-git-guard.sh"
101
+ }
102
+ ],
103
+ "description": "Warn before destructive git commands — advisory recovery guidance (R001/R021)"
94
104
  },
95
105
  {
96
106
  "matcher": "tool == \"Bash\" && tool_input.command matches \"(rm|git rm|mv|unlink|claude/rules)\"",
@@ -0,0 +1,60 @@
1
+ #!/bin/bash
2
+ # R001/R021 destructive git guard hook
3
+ # Warns before commands that can discard working tree, untracked files, or branches.
4
+ # Advisory tier only: emits stderr guidance, records PPID-scoped warnings, exits 0.
5
+ #
6
+ # PPID Scoping Convention:
7
+ # Session-scoped temp files MUST use $PPID (Claude Code parent PID), not $$.
8
+ # Pattern: /tmp/.claude-{purpose}-${PPID}
9
+
10
+ input=$(cat)
11
+ if command -v jq >/dev/null 2>&1; then
12
+ command_text=$(echo "$input" | jq -r '.tool_input.command // ""' 2>/dev/null)
13
+ elif command -v python3 >/dev/null 2>&1; then
14
+ command_text=$(INPUT_JSON="$input" python3 - <<'PY' 2>/dev/null
15
+ import json, os
16
+ try:
17
+ data = json.loads(os.environ.get('INPUT_JSON', ''))
18
+ print(data.get('tool_input', {}).get('command', ''))
19
+ except Exception:
20
+ print('')
21
+ PY
22
+ )
23
+ else
24
+ command_text=""
25
+ fi
26
+
27
+ VIOLATION_FILE="/tmp/.claude-destructive-git-guard-${PPID}"
28
+ matched=""
29
+
30
+ if printf '%s\n' "$command_text" | grep -Eq '(^|[;&|[:space:]])git[[:space:]]+reset[[:space:]]+--hard([[:space:]]|$)'; then
31
+ matched="git reset --hard"
32
+ elif printf '%s\n' "$command_text" | grep -Eq '(^|[;&|[:space:]])git[[:space:]]+clean[[:space:]]+([^;&|]*[[:space:]])?-f(dx|xd|d|x)?([[:space:]]|$)'; then
33
+ matched="git clean"
34
+ elif printf '%s\n' "$command_text" | grep -Eq '(^|[;&|[:space:]])git[[:space:]]+restore([[:space:]]+--[^;&|[:space:]]+)*([[:space:]]+(\.|\*|/|--worktree|--staged))*([[:space:]]|$)'; then
35
+ matched="git restore"
36
+ elif printf '%s\n' "$command_text" | grep -Eq '(^|[;&|[:space:]])git[[:space:]]+checkout[[:space:]]+--[[:space:]]+(\.|\*|/)([[:space:]]|$)'; then
37
+ matched="git checkout -- ."
38
+ elif printf '%s\n' "$command_text" | grep -Eq '(^|[;&|[:space:]])git[[:space:]]+branch[[:space:]]+-D([[:space:]]|$)'; then
39
+ matched="git branch -D"
40
+ fi
41
+
42
+ if [ -n "$matched" ]; then
43
+ echo "[Hook] DESTRUCTIVE GIT WARNING: detected '$matched' in Bash command" >&2
44
+ echo "[Hook] Advisory only (R021): command is not blocked, but it may discard local work." >&2
45
+ echo "[Hook] Before proceeding, verify git status and preserve work with git stash or a WIP commit." >&2
46
+ echo "[Hook] Recovery: use 'git reflog' to find prior HEADs; for deleted branches, check 'git reflog --all'." >&2
47
+
48
+ if printf '%s\n' "$command_text" | grep -Eq '(^|[;&|[:space:]])git[[:space:]]+branch[[:space:]]+-D([[:space:]]|$)'; then
49
+ echo "[Hook] Branch deletion note: prefer 'git branch -d' first so Git checks for unmerged commits." >&2
50
+ fi
51
+
52
+ printf '%s %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$matched" >> "$VIOLATION_FILE"
53
+ violation_count=$(wc -l < "$VIOLATION_FILE" 2>/dev/null | tr -d ' ')
54
+ if [ "${violation_count:-0}" -ge 3 ]; then
55
+ echo "[Hook] Destructive git warnings: ${violation_count} this session — R021 promotion threshold reached" >&2
56
+ fi
57
+ fi
58
+
59
+ # Always pass through - this hook is advisory only.
60
+ echo "$input"
@@ -0,0 +1,77 @@
1
+ # [SHOULD] Verification Ladder Rules
2
+
3
+ > **Priority**: SHOULD | **ID**: R023
4
+
5
+ ## Core Rule
6
+
7
+ 검증은 비용/속도 ladder로 구성한다: **결정론적 검사 → cheap LLM → expensive LLM → human**. 가장 저렴한 tier가 먼저 통과해야 다음 tier로 진행한다. 더 낮은 tier에서 잡을 수 있는 문제를 더 비싼 tier에 보내지 않는다.
8
+
9
+ ## Ladder Tiers
10
+
11
+ | Tier | 도구 | 비용 | 속도 | 적용 시점 |
12
+ |------|------|------|------|-----------|
13
+ | **1: Deterministic** | hooks, linters, type-check, JSON schema | $0 | <1s | Pre-write, write-time |
14
+ | **2: Cheap LLM** | haiku-based skills (`dev-review`, `action-validator`) | $ | <30s | Per-file review |
15
+ | **3: Expensive LLM** | sonnet/opus skills (`deep-verify`, `adversarial-review`, `multi-model-verification`, `evaluator-optimizer`) | $$$ | 1-5분 | Pre-commit, PR review |
16
+ | **4: Human** | maintainer review | time | hours-days | Final gate, contested decisions |
17
+
18
+ ## Shift-left 원칙
19
+
20
+ 결정론적 단계가 잡을 수 있는 문제는 LLM에 보내지 않는다. LLM 검증은 ambiguous/semantic 문제에 집중한다.
21
+
22
+ - **좋은 예**: JSON schema 오류 → Tier 1 hook이 차단 → LLM에 미전달
23
+ - **나쁜 예**: 탭/스페이스 혼용 오류 → sonnet으로 전달 → 불필요한 비용 발생
24
+
25
+ R013 (SHOULD-ecomode)의 "저렴한 검증 우선" 원칙과 정합: ecomode는 출력 토큰을 절약하고, R023은 검증 비용을 절약한다.
26
+
27
+ ## 기존 자산 매핑
28
+
29
+ | Tier | 자산 | 역할 |
30
+ |------|------|------|
31
+ | **Tier 1** | `.claude/hooks/` (PreToolUse hooks) | 도구 호출 전 결정론적 차단 |
32
+ | **Tier 1** | `mgr-sauron` (R017 구조 검증) | 에이전트/스킬/가이드 frontmatter 검증 |
33
+ | **Tier 1** | pre-commit configs, linters | 코드 품질 정적 검사 |
34
+ | **Tier 2** | `dev-review` | 파일 단위 haiku 코드 리뷰 |
35
+ | **Tier 2** | `action-validator` | CI/CD 액션 구문 검증 |
36
+ | **Tier 2** | `pre-generation-arch-check` | 생성 전 아키텍처 lite 점검 |
37
+ | **Tier 3** | `deep-verify` | 다단계 품질 검증 (sonnet) |
38
+ | **Tier 3** | `adversarial-review` | 공격자 시각 보안 리뷰 (opus) |
39
+ | **Tier 3** | `multi-model-verification` | 복수 모델 교차 검증 |
40
+ | **Tier 3** | `evaluator-optimizer` | 평가-개선 반복 루프 |
41
+ | **Tier 3** | `worker-reviewer-pipeline` | 구현-리뷰 파이프라인 |
42
+ | **Tier 4** | maintainer manual review | PR approval, final gate |
43
+
44
+ ## R021과의 관계
45
+
46
+ R021 (MUST-enforcement-policy)과 R023은 **직교**한다. 두 규칙은 서로 다른 차원을 다룬다:
47
+
48
+ | 규칙 | 질문 | 차원 |
49
+ |------|------|------|
50
+ | **R021** | "어떻게 강제할 것인가?" | Hard block / Soft block / Advisory |
51
+ | **R023** | "어떤 비용으로 검증할 것인가?" | Deterministic / Cheap LLM / Expensive LLM |
52
+
53
+ 같은 도구가 두 규칙에 동시에 속할 수 있다:
54
+
55
+ - `mgr-sauron`: R021 관점에서 Advisory (PostToolUse hook), R023 관점에서 Tier 1 (구조 검증)
56
+ - `deep-verify`: R021 관점에서 Prompt-based (blocking 없음), R023 관점에서 Tier 3 (expensive LLM)
57
+ - `.claude/hooks/` stage-blocker: R021 관점에서 Hard Block, R023 관점에서 Tier 1
58
+
59
+ R021은 위반 시 어떻게 멈출지를, R023은 어떤 순서로 검증할지를 정의한다.
60
+
61
+ ## Self-Check
62
+
63
+ 새 검증 도구 추가 시:
64
+
65
+ - [ ] 어느 tier에 속하는지 명확한가?
66
+ - [ ] 같은 tier 내 중복 도구는 없는가?
67
+ - [ ] Tier 1에서 잡을 수 있는 문제를 다루는가? (상위 tier 대신 시프트 권고)
68
+ - [ ] Ladder 순서를 문서화했는가? (어떤 검사를 먼저 실행하는지)
69
+
70
+ ## Integration
71
+
72
+ | 규칙 | 상호작용 |
73
+ |------|---------|
74
+ | R009 (Parallel Execution) | Tier 1-2 검사는 독립 파일에 대해 병렬 실행 가능 |
75
+ | R013 (Ecomode) | 컨텍스트 압박 시 Tier 3를 Tier 2로 다운그레이드 고려 |
76
+ | R017 (Sync Verification) | Phase 1-3 검증 단계는 R023 Tier 1-3에 대응 |
77
+ | R021 (Enforcement Policy) | 직교: R021은 blocking 방식, R023은 검증 비용 순서 |
@@ -0,0 +1,163 @@
1
+ ---
2
+ name: crg-integration
3
+ description: code-review-graph (CRG) MCP wrapper — token-efficient context retrieval via AST knowledge graph. Exposes 4 core tools from CRG.
4
+ scope: core
5
+ version: 0.1.0
6
+ user-invocable: true
7
+ effort: low
8
+ ---
9
+
10
+ # CRG Integration Skill
11
+
12
+ code-review-graph (CRG) MCP 서버의 핵심 4개 도구를 노출하는 wrapper 스킬.
13
+ 전체 28개 도구 중 oh-my-customcode 워크플로우에서 가장 빈번하게 사용되는 도구만 선별해 사용자 학습 곡선을 축소한다.
14
+
15
+ ## 목적
16
+
17
+ - **8.2× 토큰 절감** (CRG 공식 벤치마크): AST 기반 지식 그래프로 전체 파일 대신 관련 노드만 추출
18
+ - **Recall-우선 설계**: precision 0.38 / MRR 0.35 — 누락 없음이 우선, 잡음은 감수
19
+ - **R013 ecomode 보완**: context 사용량 ≥ 60% 시점에 CRG 호출로 추가 컨텍스트 주입 비용 절감
20
+
21
+ > **⚠️ Recall이 정답이 아니다** — 아래 주의 섹션을 먼저 읽어라.
22
+
23
+ ## 노출 도구 4종
24
+
25
+ CRG 전체 28개 도구 중 핵심 4개만 노출한다.
26
+
27
+ | Tool | 용도 | 출력 형식 |
28
+ |------|------|----------|
29
+ | `get_minimal_context` | 변경 코드의 최소 컨텍스트 (인접 함수, import 그래프) | code excerpt + AST node list |
30
+ | `get_impact_radius` | 변경 시 영향 받는 함수/모듈 (recall-우선) | dependency tree |
31
+ | `query_graph` | AST 노드 그래프 쿼리 (예: "find all callers of X") | node graph |
32
+ | `detect_changes` | 두 시점 간 의미적 차이 감지 | semantic diff |
33
+
34
+ ## 설치 가이드
35
+
36
+ > R001 정책: auto-install 스크립트 금지. 아래 명령어는 **사용자가 직접** 실행한다.
37
+
38
+ ### 1단계: 패키지 설치
39
+
40
+ ```bash
41
+ # 방법 A: pip
42
+ pip install code-review-graph
43
+
44
+ # 방법 B: pipx (격리 환경 권장)
45
+ pipx install code-review-graph
46
+
47
+ # 방법 C: uvx (uv 사용 시)
48
+ uvx code-review-graph
49
+ ```
50
+
51
+ ### 2단계: .mcp.json 수동 설정
52
+
53
+ 프로젝트 루트 또는 `~/.claude/` 아래 `.mcp.json`을 **직접 편집**한다:
54
+
55
+ ```json
56
+ {
57
+ "mcpServers": {
58
+ "code-review-graph": {
59
+ "command": "code-review-graph",
60
+ "args": []
61
+ }
62
+ }
63
+ }
64
+ ```
65
+
66
+ auto-install hook 또는 스크립트로 `.mcp.json`을 자동 수정하는 방식은 R001 위반이다.
67
+
68
+ ### 3단계: 초기 인덱싱
69
+
70
+ ```bash
71
+ # 명시적 인덱싱 (선택 — 첫 MCP 호출 시 lazy 인덱싱도 가능)
72
+ code-review-graph index
73
+ ```
74
+
75
+ 자세한 설치/설정 절차는 `guides/token-efficiency/crg.md` 참조.
76
+
77
+ ## 사용 패턴
78
+
79
+ ### PR 리뷰 전: 변경 폭 파악
80
+
81
+ ```
82
+ get_impact_radius(changed_files=[...])
83
+ → dependency tree 확인 → 리뷰 범위 결정
84
+ ```
85
+
86
+ ### 코드 검색: token-efficient lookup
87
+
88
+ ```
89
+ query_graph(query="find all callers of process_event")
90
+ → AST node graph → 전체 파일 읽지 않고 호출 지점만 추출
91
+ ```
92
+
93
+ ### 디버깅: 관련 함수만 추출
94
+
95
+ ```
96
+ get_minimal_context(file="src/handler.py", line=142)
97
+ → code excerpt + AST nodes → 필요한 컨텍스트만 주입
98
+ ```
99
+
100
+ ### 리팩토링: 의미적 변경 확인
101
+
102
+ ```
103
+ detect_changes(before_ref="HEAD~1", after_ref="HEAD")
104
+ → semantic diff → 이름 변경/이동 등 구조 변경 감지
105
+ ```
106
+
107
+ ## ⚠️ 주의 — Recall이 정답이 아니다
108
+
109
+ CRG는 recall 최적화 도구다. 다음 사항을 반드시 숙지한다:
110
+
111
+ | 오해 | 실제 |
112
+ |------|------|
113
+ | "결과에 없으면 없는 것" | recall-tuned — 일부 관련 코드가 누락될 수 있다 |
114
+ | "precision 0.38 = 결과 62% 오답" | recall-우선 튜닝의 precision trade-off. 잡음은 정상 |
115
+ | "CRG 하나로 충분" | 누락 발생 시 grep, semantic search 병행 필수 |
116
+ | "모든 작업에 8.2× 절감" | AST 검색이 적합한 작업에 한정. UI 리뷰, 자연어 검색은 효과 미미 |
117
+
118
+ **결론**: CRG는 보조 도구다. 결과를 맹신하지 말고 누락 가능성을 항상 고려한다.
119
+
120
+ ## 다른 자산과의 관계
121
+
122
+ ### 보완 관계 (함께 사용)
123
+
124
+ | 자산 | 조합 방식 |
125
+ |------|----------|
126
+ | `dev-review` | CRG로 영향 범위 파악 → dev-review로 상세 리뷰 |
127
+ | `adversarial-review` | CRG `get_minimal_context` → adversarial-review 입력 최적화 |
128
+ | `claude-mem:smart-explore` | CRG `query_graph`로 대체 가능 (Phase β 시퀀싱 — #1169 참조) |
129
+ | `claude-mem:pathfinder` | CRG `get_impact_radius`로 대체 가능 (Phase β 시퀀싱 — #1169 참조) |
130
+
131
+ ### 마이그레이션 예정 (Phase β)
132
+
133
+ - `claude-mem:smart-explore` → CRG `query_graph` (#1169)
134
+ - `claude-mem:pathfinder` → CRG `get_impact_radius` (#1169)
135
+
136
+ Phase β 완료 전까지는 두 자산을 병행 사용한다.
137
+
138
+ ## R013 Ecomode와의 관계
139
+
140
+ R013 ecomode가 자동 활성화되는 시점 (context 사용량 ≥ 60%)에서 CRG를 적극 활용한다:
141
+
142
+ | Ecomode 상황 | CRG 활용법 |
143
+ |-------------|-----------|
144
+ | 파일 전체 읽기 대신 | `get_minimal_context` → 필요한 노드만 추출 |
145
+ | 광범위 grep 대신 | `query_graph` → AST 수준 정밀 검색 |
146
+ | 변경 범위 파악 대신 | `get_impact_radius` → dependency tree만 수신 |
147
+
148
+ ## 트러블슈팅
149
+
150
+ | 증상 | 원인 | 해결 |
151
+ |------|------|------|
152
+ | MCP 도구가 보이지 않음 | `.mcp.json` 미설정 또는 경로 오류 | `.mcp.json` 확인, Claude Code 재시작 |
153
+ | `command not found: code-review-graph` | 패키지 미설치 또는 PATH 누락 | `pip install code-review-graph` 재실행, `which code-review-graph` 확인 |
154
+ | 인덱싱 오류 | 초기 인덱싱 미완료 | `code-review-graph index` 실행 후 재시도 |
155
+ | 결과 누락 (예상 함수 없음) | recall-tuned 동작 — 정상 | grep 또는 semantic search 병행 |
156
+ | 서버 연결 실패 | CRG 서버 미실행 | MCP 서버 로그 확인, Claude Code 재시작 |
157
+
158
+ ## 참고
159
+
160
+ - 상세 설치/설정: `guides/token-efficiency/crg.md`
161
+ - 관련 이슈: #1171 (scout:integrate CRG)
162
+ - Phase β 시퀀싱: #1169 (AgentMemory 전환 계획)
163
+ - 기술 출처: [tirth8205/code-review-graph](https://github.com/tirth8205/code-review-graph)
@@ -0,0 +1,52 @@
1
+ # Pipeline Label Standards
2
+
3
+ Canonical reference for GitHub issue label semantics in the auto-dev pipeline.
4
+ Used by `scope-selection` to include/exclude issues and by `implement` for lifecycle management.
5
+
6
+ ## Label Definitions
7
+
8
+ | Label | Meaning | scope-selection 처리 |
9
+ |-------|---------|----------------------|
10
+ | `verify-ready` | Triage 완료, 즉시 verify 가능 (자동화 후보) | INCLUDE (preferred) |
11
+ | `verify-done` | Triage 완료했으나 deferred 또는 이미 처리됨 (이번 사이클 미포함) | EXCLUDE |
12
+ | `in-progress` | 작업 진행 중 (다른 세션에서 claim됨) | EXCLUDE |
13
+ | `needs-review` | 사람 검토 필요 (자동 파이프라인 진입 불가) | EXCLUDE |
14
+ | `decision-needed` | 결정 필요 (보안, 정책 critical) | EXCLUDE |
15
+ | `automated` | Auto-generated issue (claude-native skill 등) | INCLUDE if other criteria met |
16
+ | `claude-code-release` | CC version compat docs trigger | INCLUDE (preferred) |
17
+ | `documentation` | Docs scope | INCLUDE (preferred for docs-only release) |
18
+ | `enhancement-yaml-only` | YAML/config-only scope change | INCLUDE (eligible for docs-only compression) |
19
+
20
+ ## Selection Rule
21
+
22
+ ```
23
+ EXCLUDE if:
24
+ - blocked_by_decision == true
25
+ - labels ∩ {decision-needed, needs-review, verify-done, manual-action, in-progress} ≠ ∅
26
+
27
+ INCLUDE (preferred tier):
28
+ - labels ∩ {verify-ready, claude-code-release, documentation} ≠ ∅
29
+
30
+ INCLUDE (standard tier):
31
+ - P1/P2/P3 issues not in excluded set
32
+
33
+ Tie-break priority: P1 > P2 > P3 > unclassified
34
+ ```
35
+
36
+ ## Compression Eligibility (G6)
37
+
38
+ An issue is eligible for `docs-only` compression mode if its labels include at least one of:
39
+ `documentation`, `automated`, `claude-code-release`, `enhancement-yaml-only`
40
+
41
+ If ALL scoped issues are compression-eligible AND scope size ≤ 3, the pipeline MAY use
42
+ `compression_mode=docs-only` (skip professor-triage / release-plan / deep-plan / deep-verify skill spawns).
43
+
44
+ ## Lifecycle Labels (set by `implement` step)
45
+
46
+ | Transition | Action |
47
+ |-----------|--------|
48
+ | Work started | Add `in-progress`, assign @me |
49
+ | Work succeeded | Remove `in-progress`, add `verify-ready` |
50
+ | Work failed | Remove `in-progress`, add `needs-review` |
51
+ | Released | Remove `verify-ready`, close with "Fixed in v{version}" |
52
+ | Deferred | Add `verify-done`, label "Deferred from v{version}" |
@@ -1,6 +1,6 @@
1
1
  name: auto-dev
2
2
  description: "Automated development pipeline — from issue triage to release"
3
- version: "2.0.0"
3
+ version: "2.1.0"
4
4
 
5
5
  # Design rule: each pipeline run produces ONE bounded release unit (3-7 issues), not all open issues.
6
6
  # This pipeline is a project-agnostic template. Project-specific overrides belong in
@@ -31,7 +31,20 @@ steps:
31
31
  - Local HEAD: git rev-parse --short HEAD
32
32
  - Behind state: synced or 0
33
33
 
34
- 5. Cross-reference: compare latest tag with any "vX.Y.Z" version references in pipeline memory/context. Flag mismatches for awareness.
34
+ 5. Cross-reference checks (advisory, do NOT halt):
35
+ a. Memory vs git consistency (G7):
36
+ - latest_tag=$(git tag --sort=-v:refname | head -1)
37
+ - Compare with "Last release" or equivalent line in pipeline memory/context
38
+ - If mismatch: stderr warning "[pre-triage] WARNING: memory says vX.Y.Z but git latest tag is vA.B.C — update memory after pipeline completion"
39
+ - Do NOT halt (advisory only — memory updates are session-end responsibility)
40
+
41
+ b. Issue body stale version references (G5):
42
+ - Retrieve open issues: gh issue list --state open --limit 100 --json number,body
43
+ - For each issue body, extract all vX.Y.Z patterns (regex: v\d+\.\d+\.\d+)
44
+ - Retrieve git tag list: git tag --list
45
+ - Flag any issue referencing a version not present in git tags:
46
+ "[pre-triage] WARNING: Issue #N references vX.Y.Z (not in git tags) — body may be stale"
47
+ - Output all warnings as advisory log; do NOT halt
35
48
 
36
49
  Phase 1 — Ensure required labels exist, then scan issues.
37
50
 
@@ -50,44 +63,95 @@ steps:
50
63
  - order: topological sort over dependencies
51
64
 
52
65
  4. Output: dependency-sorted issue table with blocked_by_decision flag.
53
- description: "Ensure labels exist, scan issues, dependency-analyze"
66
+ description: "Sync remote, stale-version check, memory consistency check, scan issues"
54
67
 
55
68
  - name: scope-selection
56
69
  prompt: |
57
70
  Select a single bounded release scope (3-7 issues) for THIS pipeline run.
58
71
 
59
- Selection rules:
72
+ ## Step 0 — Milestone state pre-check (G3)
73
+
74
+ Before creating a milestone for version vX.Y.Z:
75
+ 1. Query all milestones (open and closed):
76
+ existing=$(gh api 'repos/{owner}/{repo}/milestones?state=all&per_page=100' --jq '.[] | select(.title == "vX.Y.Z") | "\(.number)|\(.state)"')
77
+ 2. Evaluate:
78
+ - If existing && state=closed:
79
+ HALT with "[scope-selection] BLOCKED: milestone vX.Y.Z already exists and is closed. Bump version or reopen milestone manually."
80
+ - If existing && state=open:
81
+ Use existing milestone as-is (do not create new)
82
+ - If not existing:
83
+ Create new milestone: gh api repos/{owner}/{repo}/milestones --method POST --field title="vX.Y.Z"
84
+
85
+ ## Step 1 — Label-based filtering (G4)
86
+
87
+ Reference label semantics: .claude/skills/pipeline/labels.md
88
+
89
+ Apply filter rules:
90
+ - EXCLUDE: blocked_by_decision == true OR labels ∩ {decision-needed, needs-review, verify-done, manual-action, in-progress} ≠ ∅
91
+ - INCLUDE (preferred): labels ∩ {verify-ready, claude-code-release, documentation} ≠ ∅
92
+ - INCLUDE (standard): P1/P2/P3 issues not in excluded set
93
+ - Tie-break: P1 > P2 > P3 > unclassified
94
+
95
+ ## Step 2 — Selection rules
96
+
60
97
  1. Determine release tier:
61
98
  - No tags yet → v0.1.0
62
99
  - Otherwise: highest-priority open tier (bug → chore → feature)
63
- 2. Exclude:
64
- - blocked_by_decision == true
65
- - Issues requiring manual/human action
100
+ 2. Apply Step 1 filter (label-based exclusion and preference)
66
101
  3. Sort by dependency: prerequisites before dependents
67
102
  4. Cap at 7 issues; if priority issues < 7, stop at that priority (don't mix tiers)
68
103
  5. Minimum 1 issue; if 0 eligible, halt with "no eligible issues for auto-dev run"
69
104
 
70
- Create release milestone and assign scoped issues.
105
+ Assign scoped issues to milestone.
71
106
  Output markdown release manifest:
72
- | order | # | title | prerequisite | effort |
107
+ | order | # | title | prerequisite | effort | labels |
73
108
 
74
109
  Persist manifest as pipeline state for subsequent steps.
75
- description: "Pick 3-7 issues as v{X.Y.Z} scope, create milestone"
110
+ description: "Milestone state pre-check, label filter, pick 3-7 issues as v{X.Y.Z} scope"
76
111
  depends_on: pre-triage
77
112
 
113
+ - name: compression-mode-eval
114
+ prompt: |
115
+ Evaluate whether this pipeline run qualifies for docs-only compression mode (G6).
116
+
117
+ ## Compression Eligibility Check
118
+
119
+ Reference: .claude/skills/pipeline/labels.md — "Compression Eligibility" section
120
+
121
+ Conditions for compression_mode=docs-only:
122
+ 1. scope size ≤ 3 (number of issues in release manifest)
123
+ 2. ALL scoped issues have labels ∩ {documentation, automated, claude-code-release, enhancement-yaml-only} ≠ ∅
124
+
125
+ ## Decision
126
+
127
+ If BOTH conditions met → set compression_mode=docs-only
128
+ - triage step: skip professor-triage skill; perform direct manifest summary instead
129
+ - plan step: skip release-plan skill; single-response plan instead
130
+ - deep-plan step: skip deep-plan skill; single-response implementation notes instead
131
+ - deep-verify step: skip deep-verify skill; perform self-review checklist instead
132
+ - Log: "[compression-mode] docs-only compression activated (scope={n}, all docs/yaml labels)"
133
+
134
+ Otherwise → set compression_mode=standard
135
+ - All pipeline steps execute normally with full skill spawns
136
+ - Log: "[compression-mode] standard mode (scope={n}, mixed labels or large scope)"
137
+
138
+ Output: compression_mode value as pipeline state for downstream steps.
139
+ description: "Evaluate docs-only compression eligibility; set compression_mode state"
140
+ depends_on: scope-selection
141
+
78
142
  - name: triage
79
143
  skill: professor-triage
80
- description: "Cross-analysis triage with priority assessment (scoped to release manifest)"
81
- depends_on: scope-selection
144
+ description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if compression_mode=docs-only"
145
+ depends_on: compression-mode-eval
82
146
 
83
147
  - name: plan
84
148
  skill: release-plan
85
- description: "Release unit plan from triaged issues"
149
+ description: "Release unit plan from triaged issues — skipped if compression_mode=docs-only"
86
150
  depends_on: triage
87
151
 
88
152
  - name: deep-plan
89
153
  skill: deep-plan
90
- description: "Research-validated implementation plan (research → plan → verify)"
154
+ description: "Research-validated implementation plan (research → plan → verify) — skipped if compression_mode=docs-only"
91
155
  depends_on: plan
92
156
 
93
157
  - name: implement
@@ -165,7 +229,7 @@ steps:
165
229
 
166
230
  - name: deep-verify
167
231
  skill: deep-verify
168
- description: "Multi-angle release quality verification"
232
+ description: "Multi-angle release quality verification — self-review checklist only if compression_mode=docs-only"
169
233
  depends_on: verify-build
170
234
 
171
235
  - name: release
@@ -86,6 +86,7 @@ oh-my-customcode로 구동됩니다.
86
86
  | R013 | Ecomode | 배치 작업 토큰 효율성 |
87
87
  | R019 | Ontology-RAG 라우팅 | 라우팅 스킬의 ontology-RAG enrichment |
88
88
  | R022 | Wiki 동기화 | 에이전트/스킬/룰/가이드 변경 시 위키 자동 동기화 |
89
+ | R023 | Verification Ladder | 검증 비용 ladder: Tier 1(결정론적) → Tier 4(human) shift-left |
89
90
 
90
91
  ### MAY (선택)
91
92
  | ID | 규칙 | 설명 |