oh-my-customcode 0.141.0 → 0.143.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 +5 -5
- package/dist/cli/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/skills/instinct-extractor/SKILL.md +176 -0
- package/templates/.claude/skills/profile/SKILL.md +57 -0
- package/templates/.claude/skills/sec-agentshield-wrapper/SKILL.md +174 -0
- package/templates/CLAUDE.md +2 -2
- package/templates/README.md +1 -1
- package/templates/guides/profiles/manifest-install.md +177 -0
- package/templates/guides/security/agentshield-pre-flight.md +196 -0
- package/templates/guides/skill-promotion/instinct-extraction.md +114 -0
- package/templates/manifest.json +109 -4
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
**[한국어 문서 (Korean)](./README_ko.md)**
|
|
15
15
|
|
|
16
|
-
49 agents.
|
|
16
|
+
49 agents. 121 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 (
|
|
135
|
+
### Skills (121)
|
|
136
136
|
|
|
137
137
|
| Category | Count | Includes |
|
|
138
138
|
|----------|-------|----------|
|
|
@@ -222,7 +222,7 @@ Key rules: R010 (orchestrator never writes files), R009 (parallel execution mand
|
|
|
222
222
|
|
|
223
223
|
---
|
|
224
224
|
|
|
225
|
-
### Guides (
|
|
225
|
+
### Guides (57)
|
|
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,14 +272,14 @@ your-project/
|
|
|
272
272
|
├── CLAUDE.md # Entry point
|
|
273
273
|
├── .claude/
|
|
274
274
|
│ ├── agents/ # 49 agent definitions
|
|
275
|
-
│ ├── skills/ #
|
|
275
|
+
│ ├── skills/ # 121 skill modules
|
|
276
276
|
│ ├── rules/ # 22 governance rules (R000-R021)
|
|
277
277
|
│ ├── hooks/ # 15 lifecycle hook scripts
|
|
278
278
|
│ ├── schemas/ # Tool input validation schemas
|
|
279
279
|
│ ├── specs/ # Extracted canonical specs
|
|
280
280
|
│ ├── contexts/ # 4 shared context files
|
|
281
281
|
│ └── ontology/ # Knowledge graph for RAG
|
|
282
|
-
└── guides/ #
|
|
282
|
+
└── guides/ # 57 reference documents
|
|
283
283
|
```
|
|
284
284
|
|
|
285
285
|
---
|
package/dist/cli/index.js
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: instinct-extractor
|
|
3
|
+
description: 다중 세션 transcript에서 반복 실패 패턴(instinct)을 자동 채굴하여 신규 skill candidate 생성
|
|
4
|
+
scope: core
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: "[--days <n>] [--min-repeat <n>] [--dry-run]"
|
|
7
|
+
version: 0.1.0
|
|
8
|
+
effort: medium
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Instinct Extractor
|
|
12
|
+
|
|
13
|
+
세션 transcript 시계열에서 _instinct_ (실패 학습 + 대응 본능) 패턴을 자동 채굴하여 신규 skill candidate를 생성한다.
|
|
14
|
+
R016 연속 개선 루프의 자동화 단계로, 사람이 명시적으로 호출하거나 R016 Skill Promotion 트리거(동일 패턴 3회 이상 반복)에 의해 자동 실행된다.
|
|
15
|
+
|
|
16
|
+
## skill-extractor와의 차별점
|
|
17
|
+
|
|
18
|
+
| 자산 | trigger | input | output |
|
|
19
|
+
|------|---------|-------|--------|
|
|
20
|
+
| `skill-extractor` | 명시 호출 (`--mode success` / `--mode failure`) | 단일 세션 task trajectory + feedback memory | SKILL.md candidate |
|
|
21
|
+
| `instinct-extractor` | 자동/스케줄 (R016 3회 반복 트리거) | 다중 세션 transcript 시계열 (N일 범위) | failure pattern + 대응 본능 클러스터 → SKILL.md candidate |
|
|
22
|
+
|
|
23
|
+
**보완 관계**: `skill-extractor --mode failure`는 현재 세션의 feedback memory를 분석한다.
|
|
24
|
+
`instinct-extractor`는 여러 세션을 가로질러 시계열 패턴을 채굴한다.
|
|
25
|
+
두 스킬은 경쟁하지 않으며, instinct-extractor가 발견한 후보를 skill-extractor의 결과물과 교차 검증하는 것을 권장한다.
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
/instinct-extractor # 최근 14일 transcript 분석
|
|
31
|
+
/instinct-extractor --days 30 # 분석 범위 확장
|
|
32
|
+
/instinct-extractor --min-repeat 2 # 반복 임계값 낮춤 (기본: 3)
|
|
33
|
+
/instinct-extractor --dry-run # 제안만 출력, 파일 미생성
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Options
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
--days, -d 분석할 transcript 범위 (일 단위, 기본: 14)
|
|
40
|
+
--min-repeat, -r instinct 후보 최소 반복 횟수 (기본: 3)
|
|
41
|
+
--dry-run 후보 목록만 stdout 출력, mgr-creator 위임 없음
|
|
42
|
+
--cluster-only 클러스터링 결과만 출력, SKILL.md 제안 없음
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 입력
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
~/.claude/projects/*/session-*.jsonl # Claude Code 세션 transcript
|
|
49
|
+
.claude/agent-memory*/feedback_*.md # 누적 feedback memory (보조)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
transcript 파일이 없을 경우: `"분석 가능한 transcript 없음 (--days 범위 내)"` 보고 후 종료.
|
|
53
|
+
|
|
54
|
+
## 워크플로우
|
|
55
|
+
|
|
56
|
+
### Phase 1: Transcript 스캔
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# 분석 대상 수집
|
|
60
|
+
find ~/.claude/projects -name "session-*.jsonl" \
|
|
61
|
+
-newer $(date -v-${DAYS}d +%Y-%m-%dT00:00:00) 2>/dev/null
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
각 transcript에서 다음 이벤트 추출:
|
|
65
|
+
- `type: "error"` — 오류 발생 기록
|
|
66
|
+
- `type: "correction"` — 사용자 수정 지시
|
|
67
|
+
- `type: "feedback"` — 부정 피드백 (`"no"`, `"wrong"`, `"don't"` 키워드 포함)
|
|
68
|
+
- `type: "retry"` — 동일 작업 재시도
|
|
69
|
+
|
|
70
|
+
### Phase 2: 패턴 클러스터링
|
|
71
|
+
|
|
72
|
+
추출된 이벤트를 `(domain, action_verb, error_class)` 튜플로 그룹화:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
Cluster: (agent-design, write, missing-frontmatter)
|
|
76
|
+
→ sessions: [s1, s3, s7], count: 4
|
|
77
|
+
→ first_seen: 2026-05-01, last_seen: 2026-05-15
|
|
78
|
+
→ example_corrections: ["bypassPermissions 누락", "name 필드 없음"]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
필터링 기준:
|
|
82
|
+
- `count >= --min-repeat` (기본: 3)
|
|
83
|
+
- `last_seen` >= 7일 이내 (오래된 패턴 제외)
|
|
84
|
+
- 기존 skill과 80% 이상 키워드 겹침 → 새 skill 대신 기존 skill 업데이트 제안
|
|
85
|
+
|
|
86
|
+
### Phase 3: Instinct 후보 생성
|
|
87
|
+
|
|
88
|
+
각 클러스터를 "instinct 후보"로 명명:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
instinct: prevent-missing-bypassPermissions
|
|
92
|
+
근거: 4회 반복 (2주), agent spawn 시 mode 누락
|
|
93
|
+
대응 패턴: spawn 전 bypassPermissions 자가 체크
|
|
94
|
+
제안 자산: 기존 R010 강화 OR 신규 guard skill
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**분류 기준**:
|
|
98
|
+
|
|
99
|
+
| 패턴 성격 | 권장 자산 |
|
|
100
|
+
|-----------|----------|
|
|
101
|
+
| 동일 실수 반복 (행동 교정) | feedback memory 강화 |
|
|
102
|
+
| 워크플로우 절차 누락 | 기존 skill 섹션 추가 |
|
|
103
|
+
| 명확한 재사용 루틴 | 신규 SKILL.md 제안 |
|
|
104
|
+
| 규칙 미준수 (R007~R022) | 해당 rule 자가 체크 섹션 강화 제안 |
|
|
105
|
+
|
|
106
|
+
context fork cap (12개) 확인: 신규 skill이 `context: fork` 필요 시 현재 사용량 체크.
|
|
107
|
+
현재 cap: 10/12 (secretary/dev-lead/de-lead/qa-lead-routing, dag-orchestration, task-decomposition, worker-reviewer-pipeline, deep-plan, professor-triage, roundtable-debate).
|
|
108
|
+
|
|
109
|
+
### Phase 4: 사용자 제시
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
[instinct-extractor] {N}개 instinct 후보 발견 (최근 {DAYS}일, {M}개 세션)
|
|
113
|
+
|
|
114
|
+
1. [high] prevent-missing-bypassPermissions
|
|
115
|
+
반복: 4회 | 마지막: 2026-05-15 | 도메인: agent-design
|
|
116
|
+
대응 본능: spawn 전 mode 체크 → skill 후보: bypassPermissions-guard
|
|
117
|
+
|
|
118
|
+
2. [medium] transcript-scan-format-mismatch
|
|
119
|
+
반복: 3회 | 마지막: 2026-05-10 | 도메인: memory
|
|
120
|
+
대응 본능: JSONL 파싱 전 format 버전 체크
|
|
121
|
+
|
|
122
|
+
생성할 항목 선택 [1-N], "all", 또는 "skip":
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Phase 5: Skill Candidate 생성 (승인 시)
|
|
126
|
+
|
|
127
|
+
mgr-creator에 위임:
|
|
128
|
+
- 후보 이름 및 설명
|
|
129
|
+
- 클러스터 데이터 (반복 횟수, 예시 수정 사항)
|
|
130
|
+
- 분류 결과 (신규 skill / 기존 확장 / rule 강화)
|
|
131
|
+
- 기존 skill과의 겹침 경고
|
|
132
|
+
|
|
133
|
+
## 아티팩트 출력
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
.claude/outputs/sessions/{YYYY-MM-DD}/instinct-extractor-{HHmmss}.md
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
CC v2.1.121+ 환경에서 `.claude/outputs/` 직접 Write 가능 (`bypassPermissions` 모드).
|
|
140
|
+
CC < v2.1.121 환경: `/tmp/instinct-extractor-{ts}.md` 경유 후 이동.
|
|
141
|
+
|
|
142
|
+
## R016 자동화 연동
|
|
143
|
+
|
|
144
|
+
R016 Defect Response Matrix의 "Skill Promotion" 조건:
|
|
145
|
+
> feedback memory가 동일 패턴으로 3회 이상 반복 → skill-extractor `--mode failure` 실행 권장
|
|
146
|
+
|
|
147
|
+
`instinct-extractor`는 이 조건을 **cross-session 범위로 확장**한다:
|
|
148
|
+
- 단일 세션의 feedback memory 분석 → `skill-extractor --mode failure`
|
|
149
|
+
- 다중 세션 시계열 채굴 → `instinct-extractor`
|
|
150
|
+
|
|
151
|
+
R016 트리거 감지 시 오케스트레이터는 두 스킬을 순차 실행하여 결과를 교차 검증할 수 있다.
|
|
152
|
+
|
|
153
|
+
## 통합
|
|
154
|
+
|
|
155
|
+
| 시스템 | 연동 방식 |
|
|
156
|
+
|--------|----------|
|
|
157
|
+
| `skill-extractor --mode failure` | 보완 관계 — 결과 교차 검증 권장 |
|
|
158
|
+
| R016 (continuous-improvement) | 3회 반복 트리거 → 자동 실행 후보 |
|
|
159
|
+
| mgr-creator | 승인된 후보 SKILL.md 생성 위임 |
|
|
160
|
+
| sys-memory-keeper | 채굴 결과를 project memory로 보존 |
|
|
161
|
+
| feedback-collector | feedback 이벤트 소스 공유 |
|
|
162
|
+
| R011 (memory) | User Model의 Override Decisions 반영 |
|
|
163
|
+
|
|
164
|
+
## 안전 규칙
|
|
165
|
+
|
|
166
|
+
- **사용자 승인 필수**: skill 자동 생성 없음, 항상 사용자 확인 후 mgr-creator 위임
|
|
167
|
+
- **중복 체크**: 기존 skill과 80%+ 겹침 시 신규 생성 대신 업데이트 권장
|
|
168
|
+
- **dry-run 모드**: 부작용 없는 미리보기
|
|
169
|
+
- **context fork cap 체크**: `context: fork` 필요 skill은 cap(12) 초과 여부 사전 확인
|
|
170
|
+
|
|
171
|
+
## 한계
|
|
172
|
+
|
|
173
|
+
- **transcript 형식 의존**: CC `session-*.jsonl` 스키마 변경 시 파싱 재구현 필요.
|
|
174
|
+
AgentMemory 마이그레이션(#1169, Phase 3 DECOUPLE) 완료 후 transcript 경로/형식 재검토 예정.
|
|
175
|
+
- **클러스터링 정확도**: 키워드 기반 클러스터링으로 의미적 동의어 처리 제한.
|
|
176
|
+
- **Phase γ 제약**: #1169 AgentMemory Phase 3 이전에는 transcript 형식 불안정 — `--dry-run` 권장.
|
|
@@ -137,3 +137,60 @@ IMPORTANT: Restart this Claude Code session for plugin changes to take effect.
|
|
|
137
137
|
- Profiles define a subset: plugins not listed in `enabled` or `disabled` keep their current state
|
|
138
138
|
- Profile JSON `enabled`/`disabled` lists use full plugin keys: `<name>@<marketplace>` format
|
|
139
139
|
- All `.claude/` writes use the /tmp bypass pattern (see Implementation rules above)
|
|
140
|
+
|
|
141
|
+
## Manifest Profile Integration
|
|
142
|
+
|
|
143
|
+
`templates/manifest.json` 의 `profiles` 키는 **자산 필터링** (에이전트·스킬·가이드 범위)을 정의합니다. 기존 `.claude/profiles/*.json` 의 **플러그인 전환** 역할과 분리된 개념입니다.
|
|
144
|
+
|
|
145
|
+
### 두 프로필 시스템 비교
|
|
146
|
+
|
|
147
|
+
| 시스템 | 경로 | 역할 | 적용 시점 |
|
|
148
|
+
|--------|------|------|-----------|
|
|
149
|
+
| Plugin profiles | `.claude/profiles/*.json` | `~/.claude/settings.json` plugin on/off | 세션 재시작 후 |
|
|
150
|
+
| Manifest profiles | `templates/manifest.json#profiles` | 설치 시 에이전트·스킬·가이드 범위 지정 | `omcustom install --profile <name>` |
|
|
151
|
+
|
|
152
|
+
### Manifest Profile 사용 시나리오
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# 최소 자산으로 설치 (학습·실험 환경)
|
|
156
|
+
omcustom install --profile minimal
|
|
157
|
+
|
|
158
|
+
# Web 앱 개발 전용 자산 설치
|
|
159
|
+
omcustom install --profile web-app
|
|
160
|
+
|
|
161
|
+
# 데이터 엔지니어링 전용 자산 설치
|
|
162
|
+
omcustom install --profile data-eng
|
|
163
|
+
|
|
164
|
+
# 전체 자산 설치 (기본값)
|
|
165
|
+
omcustom install --profile full
|
|
166
|
+
# 또는 (profile 생략 시 full과 동일)
|
|
167
|
+
omcustom install
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### include 패턴 해석 규칙
|
|
171
|
+
|
|
172
|
+
| 패턴 | 의미 | 예시 |
|
|
173
|
+
|------|------|------|
|
|
174
|
+
| `"*"` | 해당 카테고리 전체 포함 | `"include": "*"` |
|
|
175
|
+
| `"mgr-*"` | glob 패턴, 접두사 매칭 | mgr-creator, mgr-gitnerd 등 |
|
|
176
|
+
| `{"scope": "core"}` | SKILL.md의 scope 필드 기준 | scope: core인 스킬 전체 |
|
|
177
|
+
| `"react-best-practices"` | 특정 스킬/가이드 이름 | 해당 항목만 포함 |
|
|
178
|
+
|
|
179
|
+
### Plugin + Manifest 프로필 연동 가이드
|
|
180
|
+
|
|
181
|
+
동일 이름(예: `web-app`)으로 두 시스템을 함께 사용할 수 있습니다:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# 1. Manifest profile로 자산 설치
|
|
185
|
+
omcustom install --profile web-app
|
|
186
|
+
|
|
187
|
+
# 2. Plugin profile로 플러그인 전환
|
|
188
|
+
/profile load web-app
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
두 시스템은 독립적이므로 어느 하나만 사용해도 무방합니다.
|
|
192
|
+
|
|
193
|
+
### 관련 문서
|
|
194
|
+
|
|
195
|
+
- `guides/profiles/manifest-install.md` — 전체 사용 가이드 및 프로필별 자산 표
|
|
196
|
+
- `templates/manifest.json#profiles` — 프로필 정의 소스
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sec-agentshield-wrapper
|
|
3
|
+
description: Pre-flight security analysis before code changes — identifies trust boundary risks, dangerous patterns, and provides proceed/caution/block advisory before implementation starts
|
|
4
|
+
scope: core
|
|
5
|
+
version: 0.1.0
|
|
6
|
+
user-invocable: true
|
|
7
|
+
effort: medium
|
|
8
|
+
argument-hint: '"<파일/영역 설명> — <변경 의도>"'
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# 보안 사전 분석 Wrapper (sec-agentshield-wrapper)
|
|
12
|
+
|
|
13
|
+
코드 작업을 시작하기 전에 보안 위험을 사전 식별하는 pre-flight 스킬.
|
|
14
|
+
작업 진입 전 단계에서 트러스트 경계, 위험 패턴, 권한 변경을 분석하여 진행 여부 advisory를 제공한다.
|
|
15
|
+
|
|
16
|
+
## 기존 보안 자산과의 차별점
|
|
17
|
+
|
|
18
|
+
| 자산 | 시점 | 강점 | 약점 |
|
|
19
|
+
|------|------|------|------|
|
|
20
|
+
| `sec-codeql-expert` | post-write (작성 후 분석) | CodeQL 정적 분석, CVE 매칭, SARIF 출력 | 코드가 이미 작성된 후 문제 발견 |
|
|
21
|
+
| `adversarial-review` | post-write (리뷰 단계) | 공격자 마인드, STRIDE+OWASP 4단계 리뷰 | 구현 완료 후 대규모 수정 필요할 수 있음 |
|
|
22
|
+
| `cve-triage` | issue-triggered (CVE 발생 후) | CVE 평가, 재현 분석, 패치 검증 | 알려진 CVE에만 반응, 사전 예방 불가 |
|
|
23
|
+
| **sec-agentshield-wrapper** | **pre-write (작업 시작 전)** | **사전 차단, 작업 진입 전 위험 식별** | 휴리스틱 기반, 구현 세부사항 미파악 |
|
|
24
|
+
|
|
25
|
+
**핵심 차별점**: 이 스킬은 코드를 쓰기 _전에_ 실행한다. 작업 범위와 의도만으로 위험 패턴을 식별하여 설계 단계에서 보안 방향을 잡는다.
|
|
26
|
+
|
|
27
|
+
## 워크플로우
|
|
28
|
+
|
|
29
|
+
### 입력 형식
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/sec-agentshield-wrapper "<변경 대상 파일/영역> — <변경 의도>"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
예시:
|
|
36
|
+
```
|
|
37
|
+
/sec-agentshield-wrapper "auth-middleware.ts — refresh token 처리 추가"
|
|
38
|
+
/sec-agentshield-wrapper "UserController.java — 외부 API 호출 기능 추가"
|
|
39
|
+
/sec-agentshield-wrapper "upload.py — 파일 업로드 엔드포인트 신규 구현"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 1단계: 트러스트 경계 영역 식별
|
|
43
|
+
|
|
44
|
+
변경 대상 파일/영역이 트러스트 경계에 해당하는지 판단한다.
|
|
45
|
+
|
|
46
|
+
**고위험 영역 분류**:
|
|
47
|
+
|
|
48
|
+
| 영역 유형 | 예시 | 위험 수준 |
|
|
49
|
+
|-----------|------|-----------|
|
|
50
|
+
| 인증/인가 로직 | auth, jwt, session, permission | CRITICAL |
|
|
51
|
+
| 외부 입력 처리 | request body, query params, file upload | HIGH |
|
|
52
|
+
| 외부 API 호출 | HTTP client, SDK wrapper, webhook | HIGH |
|
|
53
|
+
| 데이터 직렬화 | JSON parse, YAML, XML | MEDIUM |
|
|
54
|
+
| 파일 시스템 접근 | read/write path, temp files | MEDIUM |
|
|
55
|
+
| 설정/환경 변수 | config, env, secrets | HIGH |
|
|
56
|
+
| 데이터베이스 쿼리 | raw SQL, ORM query builder | HIGH |
|
|
57
|
+
|
|
58
|
+
CRG `query_graph` 활용 권장 — 변경 함수의 caller 체인을 추적하여 트러스트 경계 도달 여부를 확인한다.
|
|
59
|
+
|
|
60
|
+
### 2단계: 위험 패턴 매칭
|
|
61
|
+
|
|
62
|
+
변경 의도에서 다음 위험 패턴을 식별한다:
|
|
63
|
+
|
|
64
|
+
**자동 트리거 패턴**:
|
|
65
|
+
|
|
66
|
+
| 패턴 키워드 | 위험 유형 | 체크 항목 |
|
|
67
|
+
|-------------|-----------|-----------|
|
|
68
|
+
| token, jwt, session | 토큰 위조/재사용 | 서명 검증, 만료 처리, 재사용 방지 |
|
|
69
|
+
| refresh, rotation | 토큰 갱신 경쟁 조건 | 원자성, 동시 요청 처리 |
|
|
70
|
+
| upload, file, multipart | 파일 업로드 공격 | 확장자 검증, 경로 탐색, 크기 제한 |
|
|
71
|
+
| admin, role, permission | 권한 상승 | 역할 검증, 최소 권한, 기본값 |
|
|
72
|
+
| external, api, webhook | SSRF/외부 요청 | URL 화이트리스트, 타임아웃, 재시도 |
|
|
73
|
+
| query, sql, filter | SQL 인젝션 | 파라미터화 쿼리, ORM 사용 여부 |
|
|
74
|
+
| eval, exec, subprocess | 코드 실행 | 입력 새니타이즈, 허용 명령 목록 |
|
|
75
|
+
| serialize, deserialize, pickle | 역직렬화 공격 | 신뢰할 수 없는 데이터 처리 여부 |
|
|
76
|
+
| redirect, url, callback | 오픈 리다이렉트 | URL 검증, 도메인 화이트리스트 |
|
|
77
|
+
|
|
78
|
+
### 3단계: Advisory 출력
|
|
79
|
+
|
|
80
|
+
분석 결과를 3가지 레벨로 출력한다:
|
|
81
|
+
|
|
82
|
+
- **PROCEED** — 식별된 고위험 패턴 없음, 표준 구현 진행 가능
|
|
83
|
+
- **CAUTION** — 주의 필요 항목 존재, 체크리스트와 함께 진행
|
|
84
|
+
- **BLOCK** — 설계 재검토 권장, 보안 전문가 리뷰 후 진행
|
|
85
|
+
|
|
86
|
+
## 출력 형식
|
|
87
|
+
|
|
88
|
+
```markdown
|
|
89
|
+
## 보안 사전 분석 — sec-agentshield-wrapper
|
|
90
|
+
|
|
91
|
+
**대상**: {파일/영역}
|
|
92
|
+
**의도**: {변경 의도}
|
|
93
|
+
**Advisory**: PROCEED | CAUTION | BLOCK
|
|
94
|
+
|
|
95
|
+
### 트러스트 경계 분석
|
|
96
|
+
|
|
97
|
+
| 영역 | 해당 여부 | 위험 수준 |
|
|
98
|
+
|------|-----------|-----------|
|
|
99
|
+
| {영역명} | Yes/No | CRITICAL/HIGH/MEDIUM/LOW |
|
|
100
|
+
|
|
101
|
+
### 식별된 위험 패턴
|
|
102
|
+
|
|
103
|
+
| 패턴 | 위험 유형 | 권장 사항 |
|
|
104
|
+
|------|-----------|-----------|
|
|
105
|
+
| {패턴} | {유형} | {권장} |
|
|
106
|
+
|
|
107
|
+
### 구현 전 체크리스트
|
|
108
|
+
|
|
109
|
+
- [ ] {체크 항목 1}
|
|
110
|
+
- [ ] {체크 항목 2}
|
|
111
|
+
|
|
112
|
+
### 권장 후속 작업
|
|
113
|
+
|
|
114
|
+
- 구현 후: `adversarial-review` 로 공격자 관점 리뷰
|
|
115
|
+
- 패턴 기반 분석: `sec-codeql-expert` 로 CodeQL 정적 분석
|
|
116
|
+
- CVE 관련: `cve-triage` 로 의존성 취약점 확인
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 호출 패턴 예시
|
|
120
|
+
|
|
121
|
+
**단일 파일**:
|
|
122
|
+
```
|
|
123
|
+
/sec-agentshield-wrapper "auth-middleware.ts — refresh token 처리 추가"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**여러 파일/영역**:
|
|
127
|
+
```
|
|
128
|
+
/sec-agentshield-wrapper "UserService.java, AuthController.java — OAuth2 로그인 플로우 추가"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**신규 기능**:
|
|
132
|
+
```
|
|
133
|
+
/sec-agentshield-wrapper "upload/ 디렉토리 — 사용자 파일 업로드 기능 신규 구현"
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## 다른 자산과의 조합
|
|
137
|
+
|
|
138
|
+
권장 보안 파이프라인:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
sec-agentshield-wrapper (pre-write)
|
|
142
|
+
→ 구현
|
|
143
|
+
→ adversarial-review (post-write, 공격자 관점)
|
|
144
|
+
→ sec-codeql-expert (post-write, 정적 분석)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
CVE 발생 시 별도 트리거:
|
|
148
|
+
```
|
|
149
|
+
cve-triage (CVE 이슈 수신 시)
|
|
150
|
+
→ sec-codeql-expert (영향 범위 분석)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## CRG 통합 (선택)
|
|
154
|
+
|
|
155
|
+
CRG MCP 연결 시 1단계 트러스트 경계 분석 정확도가 향상된다:
|
|
156
|
+
|
|
157
|
+
| CRG 도구 | 활용 목적 |
|
|
158
|
+
|----------|-----------|
|
|
159
|
+
| `query_graph` | 변경 함수의 caller 체인 추적, 트러스트 경계 도달 여부 확인 |
|
|
160
|
+
| `get_impact_radius` | 변경의 영향 반경 파악, 위험 확산 범위 예측 |
|
|
161
|
+
| `detect_changes` | 보안 관련 함수의 의미적 변경 감지 |
|
|
162
|
+
|
|
163
|
+
CRG 미연결 시 Grep + Read 조합으로 fallback.
|
|
164
|
+
|
|
165
|
+
## 한계
|
|
166
|
+
|
|
167
|
+
- **휴리스틱 기반**: 키워드 매칭과 영역 분류 기반이므로 100% recall을 보장하지 않음
|
|
168
|
+
- **구현 세부사항 미파악**: 실제 코드가 없으므로 로직 플로우 분석 불가
|
|
169
|
+
- **False positive 가능성**: 보안 관련 키워드가 포함되어도 실제 위험이 없을 수 있음
|
|
170
|
+
- **보완 필요**: 구현 후 `adversarial-review` + `sec-codeql-expert` 조합으로 보완 권장
|
|
171
|
+
|
|
172
|
+
## Permission Mode
|
|
173
|
+
|
|
174
|
+
이 스킬에서 Agent 도구를 사용하여 에이전트를 스폰할 경우, 항상 `mode: "bypassPermissions"` 를 전달해야 한다. Agent 도구의 기본값(`acceptEdits`)은 에이전트 frontmatter `permissionMode` 를 덮어쓰므로 무인 실행 중 권한 프롬프트가 발생할 수 있다.
|
package/templates/CLAUDE.md
CHANGED
|
@@ -117,11 +117,11 @@ project/
|
|
|
117
117
|
+-- CLAUDE.md # 진입점
|
|
118
118
|
+-- .claude/
|
|
119
119
|
| +-- agents/ # 서브에이전트 정의 (49 파일)
|
|
120
|
-
| +-- skills/ # 스킬 (
|
|
120
|
+
| +-- skills/ # 스킬 (121 디렉토리)
|
|
121
121
|
| +-- rules/ # 전역 규칙 (R000-R023)
|
|
122
122
|
| +-- hooks/ # 훅 스크립트 (보안, 검증, HUD)
|
|
123
123
|
| +-- contexts/ # 컨텍스트 파일 (ecomode)
|
|
124
|
-
+-- guides/ # 레퍼런스 문서 (
|
|
124
|
+
+-- guides/ # 레퍼런스 문서 (57 토픽)
|
|
125
125
|
```
|
|
126
126
|
|
|
127
127
|
## 오케스트레이션
|
package/templates/README.md
CHANGED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Manifest Profiles — Install Guide
|
|
2
|
+
|
|
3
|
+
> **Source**: `templates/manifest.json#profiles`
|
|
4
|
+
> **Related skill**: `.claude/skills/profile/SKILL.md`
|
|
5
|
+
> **Issue**: #1177 (ECC manifest-install `--profile minimal/full` pattern)
|
|
6
|
+
|
|
7
|
+
`--profile` 플래그를 사용하면 설치 시 포함할 에이전트·스킬·가이드 범위를 지정할 수 있습니다. 사용자 진입 비용(deactivation cost)을 줄이고, 목적에 맞는 최소 자산 세트로 빠르게 시작할 수 있습니다.
|
|
8
|
+
|
|
9
|
+
## 사용 방법
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# 기본 설치 (full — 전체 자산)
|
|
13
|
+
omcustom install
|
|
14
|
+
|
|
15
|
+
# 프로필 지정 설치
|
|
16
|
+
omcustom install --profile minimal
|
|
17
|
+
omcustom install --profile web-app
|
|
18
|
+
omcustom install --profile data-eng
|
|
19
|
+
omcustom install --profile harness-dev
|
|
20
|
+
omcustom install --profile full
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 프로필 목록
|
|
24
|
+
|
|
25
|
+
| 프로필 | 설명 | 추천 대상 |
|
|
26
|
+
|--------|------|-----------|
|
|
27
|
+
| `minimal` | 필수 최소 자산 (코어 SW Engineer + Manager) | 학습·실험·경량 환경 |
|
|
28
|
+
| `full` | 전체 자산 (기본값) | 프로덕션, 다양한 도메인 |
|
|
29
|
+
| `web-app` | 풀스택 웹 앱 개발 자산 | TypeScript/Python 풀스택 팀 |
|
|
30
|
+
| `data-eng` | 데이터 엔지니어링 자산 | Airflow/Spark/dbt/Kafka/Snowflake |
|
|
31
|
+
| `harness-dev` | oh-my-customcode 하네스 개발 자산 | 에이전트·스킬·룰 작성자 |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 프로필별 포함 자산
|
|
36
|
+
|
|
37
|
+
### minimal
|
|
38
|
+
|
|
39
|
+
사용 시나리오: 첫 설치, 학습 환경, 토큰 비용 최소화.
|
|
40
|
+
|
|
41
|
+
| 카테고리 | 포함 자산 |
|
|
42
|
+
|----------|-----------|
|
|
43
|
+
| 에이전트 | `mgr-*` (6개), `lang-*-expert` (6개), `sys-memory-keeper` |
|
|
44
|
+
| 스킬 | scope: `core` + scope: `harness` 전체 |
|
|
45
|
+
| 가이드 | `agent-design`, `git-safety`, `claude-code` |
|
|
46
|
+
|
|
47
|
+
**배제**: 프레임워크 전문가(BE/FE/DE), QA 팀, 인프라, 보안, DB 전문가.
|
|
48
|
+
|
|
49
|
+
### full
|
|
50
|
+
|
|
51
|
+
사용 시나리오: 프로덕션 팀, 다양한 기술 스택, 기본 설치.
|
|
52
|
+
|
|
53
|
+
| 카테고리 | 포함 자산 |
|
|
54
|
+
|----------|-----------|
|
|
55
|
+
| 에이전트 | 전체 49개 |
|
|
56
|
+
| 스킬 | 전체 119개 |
|
|
57
|
+
| 가이드 | 전체 54개 |
|
|
58
|
+
|
|
59
|
+
`omcustom install` (profile 플래그 생략 시) 와 동일합니다.
|
|
60
|
+
|
|
61
|
+
### web-app
|
|
62
|
+
|
|
63
|
+
사용 시나리오: TypeScript/Python 풀스택 웹 앱 개발팀.
|
|
64
|
+
|
|
65
|
+
| 카테고리 | 포함 자산 |
|
|
66
|
+
|----------|-----------|
|
|
67
|
+
| 에이전트 | `lang-typescript-expert`, `lang-python-expert`, `fe-vercel-agent`, `fe-design-expert`, `be-fastapi-expert`, `be-express-expert`, `be-nestjs-expert`, `db-postgres-expert`, `db-supabase-expert`, `db-redis-expert`, `infra-docker-expert`, `mgr-*` |
|
|
68
|
+
| 스킬 | scope: `core` + `react-best-practices`, `typescript-best-practices`, `fastapi-best-practices`, `nextjs-best-practices` |
|
|
69
|
+
| 가이드 | `agent-design`, `git-safety`, `claude-code`, `drizzle-orm`, `docker`, `fastapi`, `nextjs`, `react` |
|
|
70
|
+
|
|
71
|
+
**배제**: 데이터 엔지니어링(DE), Java/Kotlin/Go/Rust 전문가, QA 팀, 보안.
|
|
72
|
+
|
|
73
|
+
### data-eng
|
|
74
|
+
|
|
75
|
+
사용 시나리오: 데이터 파이프라인 엔지니어링 팀.
|
|
76
|
+
|
|
77
|
+
| 카테고리 | 포함 자산 |
|
|
78
|
+
|----------|-----------|
|
|
79
|
+
| 에이전트 | `de-*` (6개), `db-postgres-expert`, `db-redis-expert`, `db-alembic-expert`, `lang-python-expert`, `mgr-*` |
|
|
80
|
+
| 스킬 | scope: `core` + `airflow-best-practices`, `dbt-best-practices` |
|
|
81
|
+
| 가이드 | `agent-design`, `git-safety`, `airflow`, `dbt`, `snowflake` |
|
|
82
|
+
|
|
83
|
+
**배제**: 프론트엔드, 백엔드 프레임워크, 인프라, QA.
|
|
84
|
+
|
|
85
|
+
### harness-dev
|
|
86
|
+
|
|
87
|
+
사용 시나리오: oh-my-customcode 시스템 자체 개발·유지보수.
|
|
88
|
+
|
|
89
|
+
| 카테고리 | 포함 자산 |
|
|
90
|
+
|----------|-----------|
|
|
91
|
+
| 에이전트 | `mgr-*` (6개), `arch-*` (2개), `sys-*` (4개 중 sys-naggy 포함), `wiki-curator`, `tracker-checkpoint` |
|
|
92
|
+
| 스킬 | scope: `harness` 전체 |
|
|
93
|
+
| 가이드 | `agent-design`, `git-safety`, `claude-code`, `skill-authoring`, `agent-workflow` |
|
|
94
|
+
|
|
95
|
+
**배제**: 언어/프레임워크/DE/QA/인프라 전문가.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## include 패턴 레퍼런스
|
|
100
|
+
|
|
101
|
+
`manifest.json#profiles[].include` 필드에 사용 가능한 패턴:
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"include": "*"
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
전체 포함 (full 프로필과 동일).
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"include": {
|
|
113
|
+
"agents": ["mgr-*", "lang-typescript-expert"],
|
|
114
|
+
"skills": [{"scope": "core"}, "react-best-practices"],
|
|
115
|
+
"guides": ["agent-design", "git-safety"]
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
카테고리별 부분 포함.
|
|
120
|
+
|
|
121
|
+
| 표현식 | 의미 |
|
|
122
|
+
|--------|------|
|
|
123
|
+
| `"*"` | 카테고리 전체 포함 |
|
|
124
|
+
| `"mgr-*"` | 접두사 glob 매칭 |
|
|
125
|
+
| `"lang-*-expert"` | 와일드카드 glob 매칭 |
|
|
126
|
+
| `{"scope": "core"}` | SKILL.md `scope` 필드 기준 필터 |
|
|
127
|
+
| `"react-best-practices"` | 정확한 이름 매칭 |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Plugin Profile vs Manifest Profile
|
|
132
|
+
|
|
133
|
+
두 프로필 시스템은 **서로 독립**입니다.
|
|
134
|
+
|
|
135
|
+
| 구분 | 경로 | 역할 | 적용 시점 |
|
|
136
|
+
|------|------|------|-----------|
|
|
137
|
+
| **Plugin profiles** | `.claude/profiles/*.json` | `~/.claude/settings.json` plugin on/off | 세션 재시작 후 |
|
|
138
|
+
| **Manifest profiles** | `templates/manifest.json#profiles` | 설치 시 에이전트·스킬·가이드 범위 | `omcustom install --profile` |
|
|
139
|
+
|
|
140
|
+
동일한 이름(예: `web-app`)이 두 시스템에 모두 존재하면 각각 독립적으로 적용됩니다:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# Manifest profile: 설치 자산 범위
|
|
144
|
+
omcustom install --profile web-app
|
|
145
|
+
|
|
146
|
+
# Plugin profile: 플러그인 on/off
|
|
147
|
+
/profile load web-app
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 커스텀 프로필 추가
|
|
153
|
+
|
|
154
|
+
`templates/manifest.json` 의 `profiles` 객체에 새 키를 추가합니다:
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
"my-profile": {
|
|
158
|
+
"description": "My custom profile description",
|
|
159
|
+
"include": {
|
|
160
|
+
"agents": ["lang-golang-expert", "be-go-backend-expert", "mgr-*"],
|
|
161
|
+
"skills": [{"scope": "core"}],
|
|
162
|
+
"guides": ["agent-design", "git-safety"]
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
커스텀 프로필은 `omcustom install --profile my-profile` 로 즉시 사용 가능합니다.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 관련 자료
|
|
172
|
+
|
|
173
|
+
- `.claude/skills/profile/SKILL.md` — Plugin profile 전환 스킬
|
|
174
|
+
- `templates/manifest.json` — 전체 manifest 및 profiles 정의
|
|
175
|
+
- `guides/agent-design/` — 에이전트 설계 가이드
|
|
176
|
+
- Issue #1177 — ECC manifest-install 패턴 흡수
|
|
177
|
+
- Issue #1170 — ECC 4 패턴 흡수 epic
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# 보안 사전 분석 패턴 (AgentShield Pre-flight)
|
|
2
|
+
|
|
3
|
+
코드 변경을 시작하기 전에 보안 위험을 식별하는 pre-flight 패턴에 대한 레퍼런스 가이드.
|
|
4
|
+
|
|
5
|
+
## 배경
|
|
6
|
+
|
|
7
|
+
전통적인 보안 검토는 코드가 작성된 후(post-write)에 이루어진다. 이 패턴은 작성 전(pre-write) 단계에서 보안 위험을 식별하여 설계 단계에서 방향을 잡는다.
|
|
8
|
+
|
|
9
|
+
**ECC(External Code Corpus) 출처**: `sec-agentshield-wrapper` 패턴은 ECC의 AgentShield 구현에서 흡수되었다. 원본은 코드 변경 전 보안 사전 분석 wrapper로 사용되었으며, oh-my-customcode의 기존 보안 자산(`sec-codeql-expert`, `adversarial-review`, `cve-triage`)과 통합된 형태로 재설계되었다.
|
|
10
|
+
|
|
11
|
+
## 보안 자산 전체 매트릭스
|
|
12
|
+
|
|
13
|
+
oh-my-customcode의 보안 관련 자산 전체를 시점과 역할 기준으로 정리한다:
|
|
14
|
+
|
|
15
|
+
| 자산 | 유형 | 실행 시점 | 주요 역할 | 인터페이스 |
|
|
16
|
+
|------|------|-----------|-----------|-----------|
|
|
17
|
+
| `sec-agentshield-wrapper` | skill | pre-write | 변경 의도 기반 위험 사전 식별 | `/sec-agentshield-wrapper "<설명>"` |
|
|
18
|
+
| `adversarial-review` | skill | post-write | 공격자 마인드 4단계 리뷰 | `/adversarial-review <파일>` |
|
|
19
|
+
| `sec-codeql-expert` | agent | post-write | CodeQL 정적 분석, CVE 매칭 | `@sec-codeql-expert` |
|
|
20
|
+
| `cve-triage` | skill | issue-triggered | CVE 평가, 재현 분석, 패치 검증 | (sec-codeql-expert 내부 호출) |
|
|
21
|
+
|
|
22
|
+
## Pre-flight 패턴의 필요성
|
|
23
|
+
|
|
24
|
+
### 기존 방식의 문제
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
기존 흐름:
|
|
28
|
+
요구사항 → 구현 시작 → (보안 문제 포함) 구현 완료 → 코드 리뷰 → 보안 결함 발견 → 재작업
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
재작업 비용이 크다. 특히 인증/인가 로직, 외부 API 연동, 파일 업로드 등 보안 민감 영역에서 설계 단계의 잘못된 방향은 구현 완료 후 전면 수정으로 이어질 수 있다.
|
|
32
|
+
|
|
33
|
+
### Pre-flight 방식
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
개선된 흐름:
|
|
37
|
+
요구사항 → sec-agentshield-wrapper 실행 → 위험 식별 + 체크리스트 수령 → 안전한 구현 → adversarial-review → sec-codeql-expert
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
변경 의도와 대상 파일만으로 트러스트 경계와 위험 패턴을 사전 식별한다.
|
|
41
|
+
|
|
42
|
+
## 사용 시나리오
|
|
43
|
+
|
|
44
|
+
### 시나리오 1: 인증 로직 변경
|
|
45
|
+
|
|
46
|
+
**상황**: refresh token 처리 로직 추가
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
/sec-agentshield-wrapper "auth-middleware.ts — refresh token rotation 추가"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**예상 Advisory**: CAUTION 또는 BLOCK
|
|
53
|
+
|
|
54
|
+
**식별 위험**:
|
|
55
|
+
- 토큰 재사용 공격 (token replay)
|
|
56
|
+
- 동시 요청 경쟁 조건 (refresh token race condition)
|
|
57
|
+
- 만료 처리 누락
|
|
58
|
+
|
|
59
|
+
**체크리스트**:
|
|
60
|
+
- [ ] refresh token은 1회 사용 후 무효화(rotation)
|
|
61
|
+
- [ ] 동시 refresh 요청에 대한 원자적 처리
|
|
62
|
+
- [ ] 이전 토큰 즉시 무효화
|
|
63
|
+
- [ ] refresh token 만료 시간 설정
|
|
64
|
+
|
|
65
|
+
### 시나리오 2: 파일 업로드 신규 구현
|
|
66
|
+
|
|
67
|
+
**상황**: 사용자 파일 업로드 기능 추가
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
/sec-agentshield-wrapper "upload.py — 사용자 이미지 업로드 엔드포인트 신규 구현"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**예상 Advisory**: CAUTION
|
|
74
|
+
|
|
75
|
+
**식별 위험**:
|
|
76
|
+
- 파일 확장자 우회 (Content-Type 스푸핑)
|
|
77
|
+
- 경로 탐색 (path traversal)
|
|
78
|
+
- 파일 크기 미제한
|
|
79
|
+
|
|
80
|
+
**체크리스트**:
|
|
81
|
+
- [ ] MIME 타입 + 확장자 이중 검증 (allowlist 방식)
|
|
82
|
+
- [ ] 파일명 새니타이즈 (경로 문자 제거)
|
|
83
|
+
- [ ] 최대 파일 크기 제한
|
|
84
|
+
- [ ] 저장 경로를 웹 루트 외부로 설정
|
|
85
|
+
|
|
86
|
+
### 시나리오 3: 외부 API 연동 추가
|
|
87
|
+
|
|
88
|
+
**상황**: 외부 결제 API 연동
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
/sec-agentshield-wrapper "PaymentService.java — Stripe 웹훅 수신 처리 추가"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**예상 Advisory**: CAUTION
|
|
95
|
+
|
|
96
|
+
**식별 위험**:
|
|
97
|
+
- 웹훅 서명 검증 누락
|
|
98
|
+
- SSRF 가능성 (URL 파라미터화 시)
|
|
99
|
+
- 재시도 처리에서의 중복 결제
|
|
100
|
+
|
|
101
|
+
**체크리스트**:
|
|
102
|
+
- [ ] Stripe 서명 헤더(`Stripe-Signature`) 검증
|
|
103
|
+
- [ ] 이벤트 ID 기반 멱등성 처리
|
|
104
|
+
- [ ] 웹훅 페이로드 크기 제한
|
|
105
|
+
|
|
106
|
+
### 시나리오 4: 위험 없는 변경
|
|
107
|
+
|
|
108
|
+
**상황**: 로깅 포맷 변경
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
/sec-agentshield-wrapper "logger.ts — 로그 출력 포맷 JSON으로 변경"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**예상 Advisory**: PROCEED
|
|
115
|
+
|
|
116
|
+
패턴 매칭 결과 고위험 패턴 없음. 단, 로그에 민감 정보(토큰, PII) 포함 여부는 구현 시 주의.
|
|
117
|
+
|
|
118
|
+
## 다른 자산과의 조합 패턴
|
|
119
|
+
|
|
120
|
+
### 표준 보안 파이프라인
|
|
121
|
+
|
|
122
|
+
보안 민감 기능 개발 시 권장 순서:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
1. sec-agentshield-wrapper ← 설계 전 위험 식별
|
|
126
|
+
2. 구현
|
|
127
|
+
3. adversarial-review ← 공격자 관점 코드 리뷰
|
|
128
|
+
4. sec-codeql-expert ← 정적 분석 (선택, CI에서도 가능)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### CVE 대응 파이프라인
|
|
132
|
+
|
|
133
|
+
CVE 알림 수신 시:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
1. cve-triage ← CVE 영향 평가
|
|
137
|
+
2. sec-codeql-expert ← 영향 범위 코드 분석
|
|
138
|
+
3. 패치 적용
|
|
139
|
+
4. adversarial-review ← 패치 후 회귀 검증
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 긴급 핫픽스 시
|
|
143
|
+
|
|
144
|
+
시간이 제한된 긴급 수정 시:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
1. sec-agentshield-wrapper ← 빠른 위험 체크 (5분)
|
|
148
|
+
2. 구현
|
|
149
|
+
3. adversarial-review --depth quick ← 빠른 리뷰
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 트리거 키워드 참고
|
|
153
|
+
|
|
154
|
+
다음 키워드가 변경 의도에 포함될 경우 반드시 pre-flight 실행:
|
|
155
|
+
|
|
156
|
+
**CRITICAL 트리거** (즉시 BLOCK 고려):
|
|
157
|
+
- `admin`, `superuser`, `root`, `privilege escalation`
|
|
158
|
+
- `bypass`, `skip auth`, `disable security`
|
|
159
|
+
- `eval(`, `exec(`, `system(`, `shell`
|
|
160
|
+
|
|
161
|
+
**HIGH 트리거** (CAUTION 이상 예상):
|
|
162
|
+
- `token`, `jwt`, `session`, `cookie`
|
|
163
|
+
- `password`, `credential`, `secret`, `key`
|
|
164
|
+
- `upload`, `file`, `multipart`
|
|
165
|
+
- `external`, `webhook`, `callback`, `redirect`
|
|
166
|
+
- `query`, `sql`, `filter`, `search`
|
|
167
|
+
- `permission`, `role`, `acl`
|
|
168
|
+
|
|
169
|
+
**MEDIUM 트리거** (상황에 따라 CAUTION):
|
|
170
|
+
- `serialize`, `deserialize`, `parse`
|
|
171
|
+
- `config`, `env`, `environment`
|
|
172
|
+
- `log`, `audit` (민감 정보 로깅 위험)
|
|
173
|
+
|
|
174
|
+
## 한계 및 향후 개선
|
|
175
|
+
|
|
176
|
+
### 현재 한계
|
|
177
|
+
|
|
178
|
+
1. **휴리스틱 기반**: 키워드와 영역 분류 기반이므로 100% recall 보장 불가
|
|
179
|
+
2. **구현 세부사항 부재**: 실제 코드가 없으므로 로직 플로우 분석 불가 — `adversarial-review` 로 보완 필요
|
|
180
|
+
3. **False positive**: 보안 관련 키워드 포함 코드가 실제로는 안전할 수 있음
|
|
181
|
+
4. **프레임워크 비인식**: Spring Security, Next.js Auth 등 프레임워크 레벨 보안 기능은 인식 못함
|
|
182
|
+
|
|
183
|
+
### 향후 개선 방향
|
|
184
|
+
|
|
185
|
+
1. **CRG 통합 강화**: `query_graph`로 caller 체인 자동 분석 → 트러스트 경계 도달 여부 자동 판단
|
|
186
|
+
2. **프로젝트별 패턴 학습**: `instinct-extractor` 연동으로 프로젝트 고유 위험 패턴 축적 (#1169)
|
|
187
|
+
3. **CI 통합**: PR 생성 시 변경 파일 기반 자동 pre-flight 실행
|
|
188
|
+
4. **severity calibration**: 프로젝트 히스토리 기반 false positive 감소
|
|
189
|
+
|
|
190
|
+
## 관련 자산
|
|
191
|
+
|
|
192
|
+
- `.claude/skills/sec-agentshield-wrapper/SKILL.md` — 스킬 정의 및 실행 워크플로우
|
|
193
|
+
- `.claude/skills/adversarial-review/SKILL.md` — post-write 공격자 관점 리뷰
|
|
194
|
+
- `.claude/skills/cve-triage/SKILL.md` — CVE 평가 워크플로우
|
|
195
|
+
- `.claude/agents/sec-codeql-expert.md` — CodeQL 정적 분석 에이전트
|
|
196
|
+
- `guides/security/agentshield-pre-flight.md` — 이 문서
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Skill Promotion: Instinct Extraction 가이드
|
|
2
|
+
|
|
3
|
+
> **관련 자산**: `skill-extractor`, `instinct-extractor`, R016 (MUST-continuous-improvement.md)
|
|
4
|
+
|
|
5
|
+
## 개요
|
|
6
|
+
|
|
7
|
+
oh-my-customcode는 두 개의 보완적인 skill 채굴 도구를 제공한다.
|
|
8
|
+
두 스킬은 **동일한 목표** (실패 패턴 → 영구 구조 전환)를 **다른 범위와 트리거**로 달성한다.
|
|
9
|
+
|
|
10
|
+
## 두 스킬 비교
|
|
11
|
+
|
|
12
|
+
| 속성 | `skill-extractor --mode failure` | `instinct-extractor` |
|
|
13
|
+
|------|----------------------------------|----------------------|
|
|
14
|
+
| **scope** | 단일 세션 | 다중 세션 시계열 (N일) |
|
|
15
|
+
| **trigger** | 명시 호출 | 자동 / R016 3회 반복 트리거 |
|
|
16
|
+
| **input** | `.claude/agent-memory*/feedback_*.md` | `~/.claude/projects/*/session-*.jsonl` |
|
|
17
|
+
| **clustering** | feedback memory의 Why/How to apply 필드 | (domain, action_verb, error_class) 튜플 |
|
|
18
|
+
| **output** | 기존 skill 확장 / rule 강화 / 신규 SKILL.md | failure pattern 클러스터 + instinct 후보 → SKILL.md candidate |
|
|
19
|
+
| **사용자 승인** | 필수 | 필수 |
|
|
20
|
+
| **context fork** | 신규 skill 전 cap 확인 | 신규 skill 전 cap 확인 |
|
|
21
|
+
|
|
22
|
+
## 언제 어떤 스킬을 쓸까
|
|
23
|
+
|
|
24
|
+
### skill-extractor 사용 시나리오
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
/skill-extractor # 현재 세션 성공 패턴 추출
|
|
28
|
+
/skill-extractor --mode failure # 현재 세션 누적 실패 패턴 분석
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- 오늘 세션에서 반복된 오류를 즉시 구조화하고 싶을 때
|
|
32
|
+
- 특정 feedback memory 항목이 skill로 전환될 준비가 됐다고 느낄 때
|
|
33
|
+
- 명시적·즉각적 분석이 필요할 때
|
|
34
|
+
|
|
35
|
+
### instinct-extractor 사용 시나리오
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
/instinct-extractor # 최근 14일 cross-session 채굴
|
|
39
|
+
/instinct-extractor --days 30 # 한 달 범위 확장
|
|
40
|
+
/instinct-extractor --dry-run # 후보 목록만 확인
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- R016 트리거: 동일 패턴이 여러 세션에 걸쳐 3회 이상 반복된다고 판단될 때
|
|
44
|
+
- 주기적 시스템 점검 (예: 릴리즈 전, 스프린트 종료 시)
|
|
45
|
+
- `skill-extractor`가 탐지하지 못한 cross-session 패턴이 의심될 때
|
|
46
|
+
|
|
47
|
+
## R016 자동화 패턴
|
|
48
|
+
|
|
49
|
+
R016 Defect Response Matrix에서 **Skill Promotion** 조건:
|
|
50
|
+
> feedback memory가 동일 패턴으로 **3회 이상 반복** → skill candidate 분석
|
|
51
|
+
|
|
52
|
+
### 권장 실행 순서
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
1. skill-extractor --mode failure
|
|
56
|
+
→ 현재 세션 feedback memory 분석
|
|
57
|
+
→ 즉각적 후보 식별
|
|
58
|
+
|
|
59
|
+
2. instinct-extractor --days 14
|
|
60
|
+
→ cross-session 시계열 검증
|
|
61
|
+
→ skill-extractor 결과와 교차 검증
|
|
62
|
+
|
|
63
|
+
3. 교차 검증: 두 스킬이 동일 패턴 발견 시 → high confidence → mgr-creator 위임
|
|
64
|
+
4. 한쪽만 발견 시 → medium confidence → 추가 관찰 권장
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 자동 트리거 조건
|
|
68
|
+
|
|
69
|
+
오케스트레이터는 다음 조건에서 `instinct-extractor` 자동 실행을 고려한다:
|
|
70
|
+
- R016 Defect Response Matrix 기록 시 동일 domain의 feedback memory가 3개 이상일 때
|
|
71
|
+
- 릴리즈 준비 단계 (`/release-plan` 실행 전)
|
|
72
|
+
- 스프린트 회고 (수동 트리거: `/instinct-extractor`)
|
|
73
|
+
|
|
74
|
+
## 호출 빈도 및 조건
|
|
75
|
+
|
|
76
|
+
| 시나리오 | 권장 스킬 | 주기 |
|
|
77
|
+
|----------|----------|------|
|
|
78
|
+
| 일상 개발 세션 종료 | `skill-extractor` | 세션마다 (Stop hook 알림 시) |
|
|
79
|
+
| 주간 점검 | `instinct-extractor --days 7` | 주 1회 |
|
|
80
|
+
| 릴리즈 전 | `instinct-extractor --days 30` | 릴리즈마다 |
|
|
81
|
+
| R016 트리거 감지 | 두 스킬 순차 실행 | 즉시 |
|
|
82
|
+
| 신규 에이전트 설계 전 | `instinct-extractor --cluster-only` | 필요 시 |
|
|
83
|
+
|
|
84
|
+
## Confidence 교차 검증 매트릭스
|
|
85
|
+
|
|
86
|
+
| skill-extractor 결과 | instinct-extractor 결과 | 종합 Confidence | 권장 행동 |
|
|
87
|
+
|---------------------|------------------------|----------------|----------|
|
|
88
|
+
| 후보 있음 | 동일 패턴 발견 | **high** | mgr-creator 즉시 위임 |
|
|
89
|
+
| 후보 있음 | 패턴 없음 | medium | 추가 세션 관찰 후 재분석 |
|
|
90
|
+
| 후보 없음 | 패턴 발견 | medium | skill-extractor --mode failure 재실행 |
|
|
91
|
+
| 후보 없음 | 패턴 없음 | low | 현재 구조 유지, 다음 주기에 재검토 |
|
|
92
|
+
|
|
93
|
+
## 아티팩트 경로
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
# skill-extractor 출력
|
|
97
|
+
.claude/outputs/sessions/{date}/skill-extractor-failure-{HH}.md
|
|
98
|
+
|
|
99
|
+
# instinct-extractor 출력
|
|
100
|
+
.claude/outputs/sessions/{date}/instinct-extractor-{HHmmss}.md
|
|
101
|
+
|
|
102
|
+
# 교차 검증 요약 (선택)
|
|
103
|
+
.claude/outputs/sessions/{date}/skill-promotion-summary-{HHmmss}.md
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 관련 자료
|
|
107
|
+
|
|
108
|
+
- `.claude/skills/skill-extractor/SKILL.md` — 명시 호출 skill 채굴
|
|
109
|
+
- `.claude/skills/instinct-extractor/SKILL.md` — cross-session instinct 채굴
|
|
110
|
+
- `.claude/rules/MUST-continuous-improvement.md` — R016 Defect Response Matrix
|
|
111
|
+
- `.claude/rules/MUST-agent-design.md` — context fork cap (12/12)
|
|
112
|
+
- `guides/skill-bundle-design/README.md` — skill 설계 패턴
|
|
113
|
+
- Issue #1175 — instinct-extractor 흡수 결정 맥락
|
|
114
|
+
- Issue #1169 — AgentMemory 마이그레이션 (transcript format 안정화 전제)
|
package/templates/manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.143.0",
|
|
3
3
|
"lastUpdated": "2026-05-18T00:00:00.000Z",
|
|
4
4
|
"omcustomMinClaudeCode": "2.1.121",
|
|
5
5
|
"omcustomMinClaudeCodeReason": "Sensitive-path direct Write/Edit on .claude/** under bypassPermissions (R010 deprecation, #1101)",
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
"name": "skills",
|
|
21
21
|
"path": ".claude/skills",
|
|
22
22
|
"description": "Reusable skill modules (includes slash commands)",
|
|
23
|
-
"files":
|
|
23
|
+
"files": 121
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"name": "guides",
|
|
27
27
|
"path": "guides",
|
|
28
28
|
"description": "Reference documentation",
|
|
29
|
-
"files":
|
|
29
|
+
"files": 57
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"name": "hooks",
|
|
@@ -47,5 +47,110 @@
|
|
|
47
47
|
"files": 8
|
|
48
48
|
}
|
|
49
49
|
],
|
|
50
|
-
"source": "https://github.com/baekenough/oh-my-customcode"
|
|
50
|
+
"source": "https://github.com/baekenough/oh-my-customcode",
|
|
51
|
+
"profiles": {
|
|
52
|
+
"minimal": {
|
|
53
|
+
"description": "Essential assets only — core SW Engineers + Managers. Reduces deactivation cost on first use.",
|
|
54
|
+
"include": {
|
|
55
|
+
"agents": ["mgr-*", "lang-*-expert", "sys-memory-keeper"],
|
|
56
|
+
"skills": [
|
|
57
|
+
{"scope": "core"},
|
|
58
|
+
{"scope": "harness"}
|
|
59
|
+
],
|
|
60
|
+
"guides": ["agent-design", "git-safety", "claude-code"]
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"full": {
|
|
64
|
+
"description": "All assets (default). Equivalent to installing without --profile flag.",
|
|
65
|
+
"include": "*"
|
|
66
|
+
},
|
|
67
|
+
"web-app": {
|
|
68
|
+
"description": "Full-stack web application development profile.",
|
|
69
|
+
"include": {
|
|
70
|
+
"agents": [
|
|
71
|
+
"lang-typescript-expert",
|
|
72
|
+
"lang-python-expert",
|
|
73
|
+
"fe-vercel-agent",
|
|
74
|
+
"fe-design-expert",
|
|
75
|
+
"be-fastapi-expert",
|
|
76
|
+
"be-express-expert",
|
|
77
|
+
"be-nestjs-expert",
|
|
78
|
+
"db-postgres-expert",
|
|
79
|
+
"db-supabase-expert",
|
|
80
|
+
"db-redis-expert",
|
|
81
|
+
"infra-docker-expert",
|
|
82
|
+
"mgr-*"
|
|
83
|
+
],
|
|
84
|
+
"skills": [
|
|
85
|
+
{"scope": "core"},
|
|
86
|
+
"react-best-practices",
|
|
87
|
+
"typescript-best-practices",
|
|
88
|
+
"fastapi-best-practices",
|
|
89
|
+
"nextjs-best-practices"
|
|
90
|
+
],
|
|
91
|
+
"guides": [
|
|
92
|
+
"agent-design",
|
|
93
|
+
"git-safety",
|
|
94
|
+
"claude-code",
|
|
95
|
+
"drizzle-orm",
|
|
96
|
+
"docker",
|
|
97
|
+
"fastapi",
|
|
98
|
+
"nextjs",
|
|
99
|
+
"react"
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"data-eng": {
|
|
104
|
+
"description": "Data engineering sessions — Airflow, Spark, Kafka, Snowflake, dbt.",
|
|
105
|
+
"include": {
|
|
106
|
+
"agents": [
|
|
107
|
+
"de-airflow-expert",
|
|
108
|
+
"de-dbt-expert",
|
|
109
|
+
"de-spark-expert",
|
|
110
|
+
"de-kafka-expert",
|
|
111
|
+
"de-snowflake-expert",
|
|
112
|
+
"de-pipeline-expert",
|
|
113
|
+
"db-postgres-expert",
|
|
114
|
+
"db-redis-expert",
|
|
115
|
+
"db-alembic-expert",
|
|
116
|
+
"lang-python-expert",
|
|
117
|
+
"mgr-*"
|
|
118
|
+
],
|
|
119
|
+
"skills": [
|
|
120
|
+
{"scope": "core"},
|
|
121
|
+
"airflow-best-practices",
|
|
122
|
+
"dbt-best-practices"
|
|
123
|
+
],
|
|
124
|
+
"guides": [
|
|
125
|
+
"agent-design",
|
|
126
|
+
"git-safety",
|
|
127
|
+
"airflow",
|
|
128
|
+
"dbt",
|
|
129
|
+
"snowflake"
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"harness-dev": {
|
|
134
|
+
"description": "oh-my-customcode harness development — agent, skill, rule authoring.",
|
|
135
|
+
"include": {
|
|
136
|
+
"agents": [
|
|
137
|
+
"mgr-*",
|
|
138
|
+
"arch-*",
|
|
139
|
+
"sys-*",
|
|
140
|
+
"wiki-curator",
|
|
141
|
+
"tracker-checkpoint"
|
|
142
|
+
],
|
|
143
|
+
"skills": [
|
|
144
|
+
{"scope": "harness"}
|
|
145
|
+
],
|
|
146
|
+
"guides": [
|
|
147
|
+
"agent-design",
|
|
148
|
+
"git-safety",
|
|
149
|
+
"claude-code",
|
|
150
|
+
"skill-authoring",
|
|
151
|
+
"agent-workflow"
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
51
156
|
}
|