@wooojin/forgen 0.2.1 → 0.3.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/CHANGELOG.md +44 -0
- package/README.ko.md +25 -14
- package/README.md +61 -17
- package/agents/analyst.md +48 -4
- package/agents/architect.md +39 -4
- package/agents/code-reviewer.md +107 -77
- package/agents/critic.md +47 -4
- package/agents/debugger.md +46 -4
- package/agents/designer.md +40 -4
- package/agents/executor.md +112 -30
- package/agents/explore.md +45 -5
- package/agents/git-master.md +48 -4
- package/agents/planner.md +121 -18
- package/agents/test-engineer.md +58 -4
- package/agents/verifier.md +92 -77
- package/commands/architecture-decision.md +127 -258
- package/commands/calibrate.md +225 -0
- package/commands/code-review.md +163 -178
- package/commands/compound.md +127 -68
- package/commands/deep-interview.md +212 -110
- package/commands/docker.md +68 -178
- package/commands/forge-loop.md +215 -0
- package/commands/learn.md +231 -0
- package/commands/retro.md +215 -0
- package/commands/ship.md +277 -0
- package/dist/cli.js +17 -9
- package/dist/core/auto-compound-runner.js +14 -0
- package/dist/core/config-injector.d.ts +2 -1
- package/dist/core/config-injector.js +2 -1
- package/dist/core/dashboard.d.ts +17 -0
- package/dist/core/dashboard.js +112 -2
- package/dist/core/harness.d.ts +6 -1
- package/dist/core/harness.js +75 -19
- package/dist/core/paths.d.ts +6 -1
- package/dist/core/paths.js +18 -2
- package/dist/core/spawn.d.ts +3 -2
- package/dist/core/spawn.js +27 -8
- package/dist/core/types.d.ts +34 -0
- package/dist/engine/compound-lifecycle.d.ts +4 -3
- package/dist/engine/compound-lifecycle.js +91 -46
- package/dist/engine/meta-learning/adaptive-thresholds.d.ts +20 -0
- package/dist/engine/meta-learning/adaptive-thresholds.js +126 -0
- package/dist/engine/meta-learning/extraction-tuner.d.ts +15 -0
- package/dist/engine/meta-learning/extraction-tuner.js +99 -0
- package/dist/engine/meta-learning/matcher-weight-tuner.d.ts +21 -0
- package/dist/engine/meta-learning/matcher-weight-tuner.js +151 -0
- package/dist/engine/meta-learning/runner.d.ts +14 -0
- package/dist/engine/meta-learning/runner.js +90 -0
- package/dist/engine/meta-learning/scope-promoter.d.ts +21 -0
- package/dist/engine/meta-learning/scope-promoter.js +84 -0
- package/dist/engine/meta-learning/session-quality-scorer.d.ts +61 -0
- package/dist/engine/meta-learning/session-quality-scorer.js +166 -0
- package/dist/engine/meta-learning/types.d.ts +114 -0
- package/dist/engine/meta-learning/types.js +43 -0
- package/dist/engine/solution-format.d.ts +2 -2
- package/dist/engine/solution-format.js +249 -34
- package/dist/engine/solution-index.d.ts +1 -1
- package/dist/engine/solution-matcher.d.ts +7 -1
- package/dist/engine/solution-matcher.js +114 -37
- package/dist/fgx.js +12 -8
- package/dist/hooks/context-guard.d.ts +5 -0
- package/dist/hooks/context-guard.js +118 -2
- package/dist/hooks/hooks-generator.d.ts +3 -0
- package/dist/hooks/hooks-generator.js +23 -6
- package/dist/hooks/keyword-detector.js +16 -100
- package/dist/hooks/skill-injector.d.ts +4 -3
- package/dist/hooks/skill-injector.js +6 -4
- package/dist/host/codex-adapter.d.ts +10 -0
- package/dist/host/codex-adapter.js +154 -0
- package/dist/mcp/solution-reader.d.ts +5 -5
- package/dist/mcp/solution-reader.js +34 -24
- package/dist/services/session.d.ts +19 -0
- package/dist/services/session.js +62 -0
- package/hooks/hooks.json +2 -2
- package/package.json +2 -1
- package/skills/architecture-decision/SKILL.md +113 -257
- package/skills/calibrate/SKILL.md +207 -0
- package/skills/code-review/SKILL.md +151 -178
- package/skills/compound/SKILL.md +126 -68
- package/skills/deep-interview/SKILL.md +210 -110
- package/skills/docker/SKILL.md +57 -179
- package/skills/forge-loop/SKILL.md +198 -0
- package/skills/learn/SKILL.md +216 -0
- package/skills/retro/SKILL.md +199 -0
- package/skills/ship/SKILL.md +259 -0
- package/agents/code-simplifier.md +0 -197
- package/agents/performance-reviewer.md +0 -172
- package/agents/qa-tester.md +0 -158
- package/agents/refactoring-expert.md +0 -168
- package/agents/scientist.md +0 -144
- package/agents/security-reviewer.md +0 -137
- package/agents/writer.md +0 -184
- package/commands/api-design.md +0 -268
- package/commands/ci-cd.md +0 -270
- package/commands/database.md +0 -263
- package/commands/debug-detective.md +0 -99
- package/commands/documentation.md +0 -276
- package/commands/ecomode.md +0 -51
- package/commands/frontend.md +0 -271
- package/commands/git-master.md +0 -90
- package/commands/incident-response.md +0 -292
- package/commands/migrate.md +0 -101
- package/commands/performance.md +0 -288
- package/commands/refactor.md +0 -105
- package/commands/security-review.md +0 -288
- package/commands/specify.md +0 -128
- package/commands/tdd.md +0 -183
- package/commands/testing-strategy.md +0 -265
- package/skills/api-design/SKILL.md +0 -262
- package/skills/ci-cd/SKILL.md +0 -264
- package/skills/database/SKILL.md +0 -257
- package/skills/debug-detective/SKILL.md +0 -95
- package/skills/documentation/SKILL.md +0 -270
- package/skills/ecomode/SKILL.md +0 -46
- package/skills/frontend/SKILL.md +0 -265
- package/skills/git-master/SKILL.md +0 -86
- package/skills/incident-response/SKILL.md +0 -286
- package/skills/migrate/SKILL.md +0 -96
- package/skills/performance/SKILL.md +0 -282
- package/skills/refactor/SKILL.md +0 -100
- package/skills/security-review/SKILL.md +0 -282
- package/skills/specify/SKILL.md +0 -122
- package/skills/tdd/SKILL.md +0 -178
- package/skills/testing-strategy/SKILL.md +0 -260
|
@@ -1,152 +1,252 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: deep-interview
|
|
3
|
-
description: This skill should be used when the user asks to "deep-interview,딥인터뷰,심층인터뷰,deep interview". Deep requirement interview with
|
|
3
|
+
description: This skill should be used when the user asks to "deep-interview,딥인터뷰,심층인터뷰,deep interview". Deep requirement interview with weighted dimension scoring, challenge modes, and ontology tracking
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<Purpose>
|
|
7
|
-
프로젝트의
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
프로젝트의 요구사항을 체계적으로 심층 인터뷰하여 모호성을 제거합니다.
|
|
8
|
+
가중 차원 점수(Weighted Dimension Scoring)로 모호성을 정량화하고,
|
|
9
|
+
한 번에 하나의 질문만 던져 깊이 있는 답변을 이끌어냅니다.
|
|
10
|
+
목표: ambiguity <= 0.20 (20% 이하)까지 인터뷰를 진행합니다.
|
|
10
11
|
</Purpose>
|
|
11
12
|
|
|
12
|
-
<
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
</Steps>
|
|
13
|
+
<Compound_Integration>
|
|
14
|
+
## 시작 전: compound-search로 이전 인터뷰 검색
|
|
15
|
+
|
|
16
|
+
인터뷰 시작 전 반드시 compound-search MCP 도구로 유사한 프로젝트의 이전 인터뷰를 검색합니다.
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
compound-search("[프로젝트명 또는 핵심 도메인 키워드]")
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
검색 결과가 있으면 인터뷰 시작 시 표시합니다:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
이전 인터뷰 발견:
|
|
26
|
+
- [프로젝트명]: [핵심 토픽] (최종 ambiguity: 0.XX)
|
|
27
|
+
- 재사용 가능한 결정사항: [패턴/결론]
|
|
28
|
+
- 이전 인터뷰에서 해결된 항목은 이번에 건너뜁니다.
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 진행 중: 관련 compound 솔루션 로드
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
질문 주제와 관련된 compound 솔루션이 있으면 더 정확한 질문을 구성합니다.
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|------|------|------|---------------|
|
|
37
|
-
| **0** | Crystal | 완벽히 명확. 코드로 즉시 변환 가능. | 즉시 가능 |
|
|
38
|
-
| **1-2** | Clear | 사소한 세부사항만 미정. 합리적 가정으로 진행 가능. | 가능 |
|
|
39
|
-
| **3** | Mostly Clear | 한두 가지 선택지가 남음. 가정을 명시하면 진행 가능. | 조건부 가능 |
|
|
40
|
-
| **4-5** | Hazy | 핵심 결정이 1-2개 미정. 가정 위험이 있음. | 위험 감수 시 가능 |
|
|
41
|
-
| **6-7** | Foggy | 주요 방향이 불확실. 잘못된 가정 시 재작업 발생. | 비권장 |
|
|
42
|
-
| **8-9** | Opaque | 요구사항의 대부분이 미정. 프로토타입 수준만 가능. | 불가 |
|
|
43
|
-
| **10** | Black Box | 무엇을 만들어야 하는지조차 불명확. | 불가 |
|
|
35
|
+
## 종료 후: 인터뷰 결과를 compound로 저장
|
|
44
36
|
|
|
45
|
-
|
|
37
|
+
```bash
|
|
38
|
+
forgen compound --solution "interview-{project}-spec" "인터뷰 결과 명세서 전문"
|
|
39
|
+
```
|
|
40
|
+
</Compound_Integration>
|
|
41
|
+
|
|
42
|
+
<Steps>
|
|
43
|
+
## Phase 0: 프로젝트 유형 감지
|
|
46
44
|
|
|
47
|
-
|
|
45
|
+
사용자 요청을 분석하여 프로젝트 유형을 자동 판별합니다.
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
| **What** (무엇을) | 기능이 구체적으로 정의됨 | 기능의 범위가 애매함 | 무엇을 만드는지 불명확 |
|
|
52
|
-
| **Who** (누구를 위해) | 대상 사용자가 특정됨 | 대상 사용자가 넓게 정의됨 | 사용자가 누구인지 모름 |
|
|
53
|
-
| **How** (어떻게) | 기술 구현 방식이 결정됨 | 후보 기술이 있으나 미결정 | 구현 방식을 모름 |
|
|
54
|
-
| **When** (언제까지) | 기한과 우선순위가 명확함 | 대략적 일정만 있음 | 기한/우선순위 미정 |
|
|
55
|
-
| **Why** (왜) | 비즈니스 근거가 명확함 | 근거가 있으나 검증 안 됨 | 왜 필요한지 불분명 |
|
|
47
|
+
### Greenfield (새 프로젝트)
|
|
48
|
+
- 채점 공식: `ambiguity = 1 - (goal * 0.40 + constraints * 0.30 + criteria * 0.30)`
|
|
56
49
|
|
|
57
|
-
|
|
50
|
+
### Brownfield (기존 코드베이스 확장/수정)
|
|
51
|
+
- Glob/Grep/Read로 기존 코드베이스를 탐색하여 기술 컨텍스트를 자동 수집
|
|
52
|
+
- 채점 공식: `ambiguity = 1 - (goal * 0.35 + constraints * 0.25 + criteria * 0.25 + context * 0.15)`
|
|
58
53
|
|
|
54
|
+
### 자동 감지 절차
|
|
59
55
|
```
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
1. 현재 디렉토리에 package.json, tsconfig.json, go.mod 등이 있는가?
|
|
57
|
+
2. git log가 존재하는가?
|
|
58
|
+
3. 사용자 요청에 "기존", "현재", "수정", "추가" 등의 키워드가 있는가?
|
|
59
|
+
→ 2개 이상 해당하면 Brownfield → 아니면 Greenfield
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Phase 1: 차원 초기 채점
|
|
63
|
+
|
|
64
|
+
각 차원을 0.0 ~ 1.0 범위로 채점합니다 (1.0 = 완전히 명확, 0.0 = 전혀 모름).
|
|
65
|
+
|
|
66
|
+
### Greenfield 차원 (3개)
|
|
67
|
+
| 차원 | 가중치 | 의미 |
|
|
68
|
+
|------|--------|------|
|
|
69
|
+
| **goal** | 0.40 | 무엇을 만드는가? 최종 산출물은? 성공 기준은? |
|
|
70
|
+
| **constraints** | 0.30 | 기술 제약, 시간, 예산, 팀 역량, 비기능 요구사항 |
|
|
71
|
+
| **criteria** | 0.30 | 완료 기준, 수용 기준, 테스트 가능한 조건 |
|
|
72
|
+
|
|
73
|
+
### Brownfield 추가 차원 (1개)
|
|
74
|
+
| 차원 | 가중치 | 의미 |
|
|
75
|
+
|------|--------|------|
|
|
76
|
+
| **context** | 0.15 | 기존 아키텍처, 의존성, 코드 패턴, 데이터 모델 |
|
|
77
|
+
|
|
78
|
+
### 채점 기준 상세
|
|
79
|
+
|
|
80
|
+
**goal (가중치 0.40)**
|
|
81
|
+
- 최종 산출물이 명확한가? (0.0~1.0)
|
|
82
|
+
- 핵심 기능이 열거되었는가? (0.0~1.0)
|
|
83
|
+
- 사용자/대상이 특정되었는가? (0.0~1.0)
|
|
84
|
+
- 비즈니스 근거(왜 만드는가)가 있는가? (0.0~1.0)
|
|
85
|
+
|
|
86
|
+
**constraints (가중치 0.30)**
|
|
87
|
+
- 기술 스택이 결정되었는가? (0.0~1.0)
|
|
88
|
+
- 비기능 요구사항이 정의되었는가? (0.0~1.0)
|
|
89
|
+
- 일정/예산 제약이 있는가? (0.0~1.0)
|
|
90
|
+
- 외부 연동/의존성이 파악되었는가? (0.0~1.0)
|
|
62
91
|
|
|
63
|
-
|
|
64
|
-
|
|
92
|
+
**criteria (가중치 0.30)**
|
|
93
|
+
- 수용 기준이 테스트 가능한 형태인가? (0.0~1.0)
|
|
94
|
+
- 엣지 케이스가 고려되었는가? (0.0~1.0)
|
|
95
|
+
- 비정상 시나리오 대응이 정의되었는가? (0.0~1.0)
|
|
65
96
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
3 Data Model 2/10 0 0 1 0 1 6→2 ↓↓
|
|
72
|
-
4 Error Handling 5/10 1 1 1 1 1 5 —
|
|
73
|
-
5 Performance 8/10 2 2 2 1 1 8 NEW
|
|
74
|
-
────────────────────────────────────────────────
|
|
75
|
-
Avg: 5.0
|
|
97
|
+
**context (가중치 0.15, Brownfield만)**
|
|
98
|
+
- 기존 아키텍처를 파악했는가? (0.0~1.0)
|
|
99
|
+
- 영향받는 모듈/파일을 식별했는가? (0.0~1.0)
|
|
100
|
+
- 기존 테스트 커버리지를 확인했는가? (0.0~1.0)
|
|
101
|
+
- 기존 코드 패턴을 이해했는가? (0.0~1.0)
|
|
76
102
|
|
|
77
|
-
|
|
103
|
+
## Phase 2: 인터뷰 루프 (라운드 기반)
|
|
78
104
|
|
|
79
|
-
|
|
80
|
-
────────────────────────
|
|
81
|
-
[Targeting: #5 Performance (8/10), #2 Payment Flow (7/10)]
|
|
105
|
+
### 질문 프로토콜 -- 반드시 한 번에 하나의 질문만
|
|
82
106
|
|
|
83
|
-
|
|
84
|
-
|
|
107
|
+
매 라운드마다:
|
|
108
|
+
1. **가장 약한 차원 식별**: 가중 점수가 가장 낮은 차원을 선택
|
|
109
|
+
2. **질문 하나만 생성**: 해당 차원의 점수를 가장 효과적으로 올릴 수 있는 질문
|
|
110
|
+
3. **표시 형식**:
|
|
111
|
+
```
|
|
112
|
+
Round N | ambiguity: 0.XX | 목표 차원: {dimension}
|
|
113
|
+
─────────────────────────────────────────────────
|
|
114
|
+
Q. [구체적이고 개방형 질문]
|
|
115
|
+
(이 답변으로 {dimension} 점수 +0.X 예상)
|
|
116
|
+
```
|
|
117
|
+
4. **답변 수신 후**: 점수 재산정 -> 보드 갱신 -> 다음 라운드
|
|
85
118
|
|
|
86
|
-
|
|
87
|
-
→ 이 답변으로 Payment Score -1~2 예상
|
|
119
|
+
### Push Until Evidence 규칙
|
|
88
120
|
|
|
89
|
-
|
|
90
|
-
|
|
121
|
+
모호한 답변("대충", "아마", "비슷한") → 같은 차원에서 후속 질문.
|
|
122
|
+
가정 기반 답변("아마 ~일 거예요") → "확인된 사실인가요, 검증이 필요한 가정인가요?"
|
|
123
|
+
범위 미정 답변("다 되면 좋겠어요") → "MVP 범위에서 반드시 포함해야 하는 3가지는?"
|
|
91
124
|
|
|
92
|
-
|
|
93
|
-
───────────────
|
|
94
|
-
- [#1] JWT 기반 인증, 만료 15분, 리프레시 토큰 7일
|
|
95
|
-
- [#3] PostgreSQL, users/orders/payments 3테이블
|
|
96
|
-
- [#1] bcrypt 해싱, salt rounds 12
|
|
125
|
+
## Phase 3: 챌린지 모드 (라운드 기반 자동 활성화)
|
|
97
126
|
|
|
98
|
-
|
|
127
|
+
### Round 4+: Contrarian (반론 모드)
|
|
128
|
+
"만약 정반대가 사실이라면?" — 사용자의 전제를 뒤집어 검증합니다.
|
|
129
|
+
|
|
130
|
+
### Round 6+: Simplifier (단순화 모드)
|
|
131
|
+
"가장 단순하면서도 가치있는 버전은?" — 불필요한 복잡성을 제거합니다.
|
|
132
|
+
|
|
133
|
+
### Round 8+ (ambiguity > 0.30): Ontologist (본질 탐구 모드)
|
|
134
|
+
"이것은 본질적으로 무엇인가요?" — 핵심 엔티티의 정의와 경계를 명확히 합니다.
|
|
135
|
+
|
|
136
|
+
## Phase 4: 온톨로지 추적
|
|
137
|
+
|
|
138
|
+
매 라운드마다 핵심 엔티티(명사)를 추적합니다.
|
|
139
|
+
```
|
|
140
|
+
ONTOLOGY TRACKER
|
|
141
|
+
──────────────────────────────────────
|
|
142
|
+
Entity | First | Last | Status
|
|
143
|
+
User | R1 | R5 | stable
|
|
144
|
+
Order | R1 | R6 | refined
|
|
145
|
+
──────────────────────────────────────
|
|
146
|
+
Stability: 3/4 (75%)
|
|
99
147
|
```
|
|
148
|
+
- stability_ratio >= 0.90: 도메인 모델 안정 -> 종료 가능
|
|
149
|
+
- stability_ratio < 0.70: 유동적 -> 본질 질문 필요
|
|
150
|
+
</Steps>
|
|
100
151
|
|
|
101
|
-
##
|
|
152
|
+
## 반아첨(Anti-Sycophancy) 규칙
|
|
153
|
+
|
|
154
|
+
| 금지 표현 | 대체 행동 |
|
|
155
|
+
|-----------|-----------|
|
|
156
|
+
| "좋은 접근이네요" | 입장을 취합니다. 근거와 함께 동의 또는 반대. |
|
|
157
|
+
| "그것도 될 수 있어요" | 근거를 바탕으로 된다/안 된다 판단. |
|
|
158
|
+
| "고려해 보시면..." | "이것은 틀렸습니다. 이유는..." 또는 "이것이 맞습니다. 이유는..." |
|
|
159
|
+
| "흥미로운 접근이네요" | "이 접근은 {구체적 이유}로 {성공/실패}할 것입니다." |
|
|
160
|
+
|
|
161
|
+
사용자가 틀렸으면 틀렸다고 말합니다. 근거를 함께 제시합니다.
|
|
102
162
|
|
|
103
|
-
|
|
163
|
+
## Ambiguity Score 보드
|
|
104
164
|
|
|
105
|
-
|
|
165
|
+
```
|
|
166
|
+
DEEP INTERVIEW BOARD
|
|
167
|
+
═══════════════════════════════════════════════════
|
|
168
|
+
Project: {name} | Type: {Greenfield/Brownfield}
|
|
169
|
+
Round: {N} | Ambiguity: {0.XX} | Target: <= 0.20
|
|
170
|
+
|
|
171
|
+
DIMENSION SCORES
|
|
172
|
+
────────────────────────────────────────────────────
|
|
173
|
+
Dimension Weight Score Weighted Trend
|
|
174
|
+
goal 0.40 0.75 0.300 0.2->0.5->0.75 ++
|
|
175
|
+
constraints 0.30 0.50 0.150 0.1->0.50 +
|
|
176
|
+
criteria 0.30 0.30 0.090 0.3 NEW
|
|
177
|
+
────────────────────────────────────────────────────
|
|
178
|
+
Clarity: 0.540 | Ambiguity: 0.460 | Status: Continue
|
|
179
|
+
|
|
180
|
+
ONTOLOGY ({N} entities, {stability}% stable)
|
|
181
|
+
ACTIVE CHALLENGE: {None / CONTRARIAN / SIMPLIFIER / ONTOLOGIST}
|
|
182
|
+
═══════════════════════════════════════════════════
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## 종료 조건
|
|
186
|
+
|
|
187
|
+
| 조건 | 기준 |
|
|
106
188
|
|------|------|
|
|
107
|
-
| **
|
|
108
|
-
| **
|
|
109
|
-
| **User Exit** |
|
|
110
|
-
| **Plateau** | 3라운드 연속
|
|
189
|
+
| **Ready** | ambiguity <= 0.20 |
|
|
190
|
+
| **Conditional** | 0.20 < ambiguity <= 0.35 |
|
|
191
|
+
| **User Exit** | 사용자 요청 (경고 표시 후 종료) |
|
|
192
|
+
| **Plateau** | 3라운드 연속 변화 < 0.05 -> Ontologist 전환 |
|
|
193
|
+
| **Hard Cap** | 20라운드 도달 -> 강제 종료 |
|
|
111
194
|
|
|
112
|
-
|
|
195
|
+
라운드 제한: 최소 3, 소프트 캡 10, 하드 캡 20.
|
|
113
196
|
|
|
114
|
-
##
|
|
197
|
+
## 실행 브릿지
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
ambiguity <= 0.20 -> "준비 완료. 권장: /forge-loop"
|
|
201
|
+
ambiguity 0.20~0.35 -> "가정 목록 확인 필요. 확인 후 /forge-loop"
|
|
202
|
+
ambiguity > 0.35 -> "인터뷰 계속 필요."
|
|
203
|
+
```
|
|
115
204
|
|
|
205
|
+
## 최종 명세서 형식
|
|
206
|
+
|
|
207
|
+
```markdown
|
|
208
|
+
# Deep Interview Spec: {title}
|
|
209
|
+
## Metadata (rounds, score, type, timestamp)
|
|
210
|
+
## Clarity Breakdown (dimension scores table)
|
|
211
|
+
## Goal
|
|
212
|
+
## Constraints
|
|
213
|
+
## Non-Goals
|
|
214
|
+
## Acceptance Criteria (testable)
|
|
215
|
+
## Assumptions (exposed & resolved)
|
|
216
|
+
## Technical Context
|
|
217
|
+
## Key Entities (ontology table)
|
|
218
|
+
## Ontology Convergence (round-by-round stability)
|
|
219
|
+
## Next Action: /forge-loop | /ch-architecture-decision | manual
|
|
116
220
|
```
|
|
117
|
-
DEEP INTERVIEW REPORT / 심층 인터뷰 결과
|
|
118
|
-
=========================================
|
|
119
221
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
Score Reduction: [감소량] ([감소율]%)
|
|
222
|
+
<Failure_Modes>
|
|
223
|
+
## 피해야 할 실패 패턴
|
|
123
224
|
|
|
124
|
-
|
|
125
|
-
─────────────
|
|
126
|
-
[각 주제별 최종 점수 + 핵심 결정사항 1-2줄]
|
|
225
|
+
NEVER: **한 번에 여러 질문**: 질문은 반드시 1개. 2개 이상 금지.
|
|
127
226
|
|
|
128
|
-
|
|
129
|
-
─────────────────────
|
|
130
|
-
[점수 1-3인 항목의 가정 목록 — 검증 필요]
|
|
227
|
+
NEVER: **코드에서 답을 찾을 수 있는 것을 질문**: Brownfield에서 Read/Grep으로 먼저 확인.
|
|
131
228
|
|
|
132
|
-
|
|
133
|
-
────────────────────
|
|
134
|
-
[점수 0인 항목 → 즉시 구현 가능한 명세]
|
|
229
|
+
NEVER: **보드 갱신 누락**: 매 라운드 종료 후 반드시 보드 표시.
|
|
135
230
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
231
|
+
NEVER: **아첨/동의 기본값**: 근거 없는 동의 금지. 모든 판단에 근거 필요.
|
|
232
|
+
|
|
233
|
+
NEVER: **모호한 답변 수용**: Push Until Evidence 규칙 적용.
|
|
234
|
+
|
|
235
|
+
NEVER: **3라운드 전 종료**: 경고 표시 필수.
|
|
236
|
+
|
|
237
|
+
NEVER: **챌린지 모드 건너뛰기**: Round 4+ 이후 반드시 적용.
|
|
238
|
+
</Failure_Modes>
|
|
141
239
|
|
|
142
240
|
<Policy>
|
|
143
|
-
- 라운드당
|
|
144
|
-
- 가장
|
|
145
|
-
- 답변 후 즉시
|
|
146
|
-
-
|
|
147
|
-
-
|
|
148
|
-
-
|
|
149
|
-
-
|
|
241
|
+
- 라운드당 질문은 반드시 1개만 (깊이 > 넓이)
|
|
242
|
+
- 가장 낮은 가중 점수의 차원부터 공략
|
|
243
|
+
- 답변 후 즉시 점수 재산정 + 보드 갱신
|
|
244
|
+
- 사용자가 "모르겠다" -> 해당 요소 0.0 유지, 다음 질문
|
|
245
|
+
- 기술적 판단 가능한 항목 -> 합리적 가정 제안
|
|
246
|
+
- 비즈니스 판단 필요 항목 -> 반드시 사용자 확인
|
|
247
|
+
- Anti-Sycophancy 규칙 준수
|
|
248
|
+
- Brownfield -> 코드 탐색 선행, context 차원 자동 채점
|
|
249
|
+
- 온톨로지 추적 매 라운드 수행
|
|
150
250
|
</Policy>
|
|
151
251
|
|
|
152
252
|
<Arguments>
|
|
@@ -160,7 +260,7 @@ NEXT ACTIONS
|
|
|
160
260
|
|
|
161
261
|
### 인자
|
|
162
262
|
- 인터뷰할 프로젝트 또는 기능의 자연어 설명
|
|
163
|
-
- 기존 코드베이스가 있으면
|
|
263
|
+
- 기존 코드베이스가 있으면 Brownfield로 자동 전환
|
|
164
264
|
</Arguments>
|
|
165
265
|
|
|
166
266
|
$ARGUMENTS
|
package/skills/docker/SKILL.md
CHANGED
|
@@ -1,117 +1,43 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: docker
|
|
3
|
-
description: This skill should be used when the user asks to "docker,container,컨테이너,dockerfile,도커,docker-compose".
|
|
3
|
+
description: This skill should be used when the user asks to "docker,container,컨테이너,dockerfile,도커,docker-compose". Docker 컨테이너화 -- Dockerfile 최적화, Compose 구성, 보안 강화
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- forgen-managed -->
|
|
7
|
-
|
|
8
6
|
<Purpose>
|
|
9
7
|
Docker를 활용한 컨테이너화를 체계적으로 수행합니다.
|
|
10
8
|
의존성 분석, Dockerfile 작성, 레이어 최적화,
|
|
11
9
|
Docker Compose 구성, 헬스 체크까지 컨테이너 라이프사이클 전체를 다룹니다.
|
|
12
10
|
</Purpose>
|
|
13
11
|
|
|
14
|
-
<
|
|
15
|
-
|
|
16
|
-
- 런타임 환경 (Node.js, Python, Go 등)
|
|
17
|
-
- 시스템 의존성 (네이티브 바이너리, 라이브러리)
|
|
18
|
-
- 환경 변수 목록 및 기본값
|
|
19
|
-
- 포트 매핑 (애플리케이션 포트, 디버그 포트)
|
|
20
|
-
- 볼륨 마운트 필요 사항 (데이터 영속성, 설정 파일)
|
|
21
|
-
- 외부 서비스 의존성 (DB, Redis, 메시지 큐)
|
|
22
|
-
|
|
23
|
-
2. **Dockerfile 작성**: 최적화된 Dockerfile을 구성합니다
|
|
24
|
-
- 베이스 이미지 선택 (alpine vs slim vs distroless)
|
|
25
|
-
- 멀티스테이지 빌드 적용 (빌드 스테이지 / 런타임 스테이지)
|
|
26
|
-
- 레이어 캐싱 최적화 (변경 빈도 낮은 것부터 순서)
|
|
27
|
-
* 시스템 의존성 설치
|
|
28
|
-
* package.json / lockfile 복사 + npm install
|
|
29
|
-
* 소스 코드 복사 + 빌드
|
|
30
|
-
- .dockerignore 설정 (node_modules, .git, 테스트 파일)
|
|
31
|
-
- 비루트 사용자 설정 (보안)
|
|
32
|
-
- 시그널 핸들링 (SIGTERM graceful shutdown)
|
|
33
|
-
- HEALTHCHECK 명령 설정
|
|
34
|
-
|
|
35
|
-
3. **이미지 최적화**: 이미지 크기와 보안을 개선합니다
|
|
36
|
-
- 레이어 수 최소화 (RUN 명령 결합)
|
|
37
|
-
- 불필요한 파일 제거 (빌드 도구, 캐시, 문서)
|
|
38
|
-
- 프로덕션 의존성만 설치 (--omit=dev)
|
|
39
|
-
- 이미지 크기 측정 및 목표 설정
|
|
40
|
-
- 보안 스캔 (Trivy, Docker Scout)
|
|
41
|
-
- 이미지 태깅 전략 (semver, git SHA, latest)
|
|
42
|
-
|
|
43
|
-
4. **Docker Compose 구성**: 멀티 컨테이너 환경을 정의합니다
|
|
44
|
-
- 서비스 정의 (app, db, cache, proxy)
|
|
45
|
-
- 네트워크 구성 (서비스 간 통신)
|
|
46
|
-
- 볼륨 정의 (데이터 영속성)
|
|
47
|
-
- 환경 변수 관리 (.env 파일, 인라인)
|
|
48
|
-
- 의존성 순서 (depends_on + healthcheck)
|
|
49
|
-
- 개발/프로덕션 오버라이드 분리
|
|
50
|
-
- 리소스 제한 설정 (CPU, 메모리)
|
|
12
|
+
<Compound_Integration>
|
|
13
|
+
## 시작 전: 이전 Docker 구성 패턴 검색
|
|
51
14
|
|
|
52
|
-
|
|
53
|
-
- HEALTHCHECK 엔드포인트 구현 (/health, /ready)
|
|
54
|
-
- Liveness probe vs Readiness probe 구분
|
|
55
|
-
- 로그 수집 구성 (stdout/stderr → 로그 시스템)
|
|
56
|
-
- 메트릭 노출 (Prometheus 엔드포인트)
|
|
57
|
-
- Graceful shutdown 구현 (SIGTERM 처리)
|
|
58
|
-
- 재시작 정책 설정 (restart: unless-stopped)
|
|
59
|
-
</Steps>
|
|
60
|
-
|
|
61
|
-
## 에이전트 위임
|
|
62
|
-
|
|
63
|
-
`executor` 에이전트(Sonnet 모델)에 위임하여 Docker 구성을 구현합니다:
|
|
15
|
+
컨테이너화를 시작하기 전에 compound-search MCP 도구로 유사한 런타임/애플리케이션의 과거 Docker 구성을 검색합니다.
|
|
64
16
|
|
|
65
17
|
```
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
model="sonnet",
|
|
69
|
-
prompt="DOCKER TASK
|
|
70
|
-
|
|
71
|
-
Docker 컨테이너화를 구현하세요.
|
|
72
|
-
|
|
73
|
-
Application: [애플리케이션 설명]
|
|
74
|
-
Runtime: [Node.js / Python / Go / etc.]
|
|
75
|
-
Services: [필요한 외부 서비스 목록]
|
|
76
|
-
|
|
77
|
-
Docker Checklist:
|
|
78
|
-
1. Dockerfile 작성 (멀티스테이지, 최적화)
|
|
79
|
-
2. .dockerignore 설정
|
|
80
|
-
3. Docker Compose 구성 (개발/프로덕션)
|
|
81
|
-
4. 헬스 체크 설정
|
|
82
|
-
5. 보안 설정 (비루트 사용자, 이미지 스캔)
|
|
83
|
-
6. 볼륨 및 네트워크 구성
|
|
84
|
-
|
|
85
|
-
Output: Docker 구성 파일 및 문서:
|
|
86
|
-
- Dockerfile
|
|
87
|
-
- .dockerignore
|
|
88
|
-
- docker-compose.yml (dev/prod)
|
|
89
|
-
- 이미지 크기 리포트
|
|
90
|
-
- 실행 명령 가이드"
|
|
91
|
-
)
|
|
18
|
+
compound-search("[런타임명 또는 애플리케이션 타입 키워드]")
|
|
19
|
+
compound-search("Docker 최적화")
|
|
92
20
|
```
|
|
93
21
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
3. **비판적 평가** -- 외부 제안을 맹목적으로 수용하지 않음
|
|
102
|
-
4. **우아한 폴백** -- 위임이 불가능할 경우 절대 차단하지 않음
|
|
22
|
+
검색 결과가 있으면 의존성 분석 단계 전에 표시합니다:
|
|
23
|
+
```
|
|
24
|
+
이전 Docker 구성 패턴:
|
|
25
|
+
- [애플리케이션명]: [베이스 이미지] → 최종 크기 [N]MB (날짜: YYYY-MM-DD)
|
|
26
|
+
- 주요 최적화: [레이어 전략, 보안 설정 등]
|
|
27
|
+
- 주의사항: [이전에 발견된 문제나 트릭]
|
|
28
|
+
```
|
|
103
29
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
- 오케스트레이션 (Kubernetes 연동)
|
|
108
|
-
- 네이티브 의존성이 있는 이미지 최적화
|
|
30
|
+
이전 구성을 출발점으로 삼아 중복 탐색을 줄이고, 검증된 패턴을 재사용합니다.
|
|
31
|
+
완료 후 주요 최적화 내용과 이미지 크기를 compound에 기록합니다.
|
|
32
|
+
</Compound_Integration>
|
|
109
33
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
34
|
+
<Steps>
|
|
35
|
+
1. **의존성 분석**: 런타임 환경, 시스템 의존성, 포트, 볼륨, 외부 서비스
|
|
36
|
+
2. **Dockerfile 작성**: 멀티스테이지, 레이어 캐싱, 비루트 사용자, HEALTHCHECK
|
|
37
|
+
3. **이미지 최적화**: 레이어 최소화, 프로덕션 의존성만, 보안 스캔, 크기 측정
|
|
38
|
+
4. **Docker Compose 구성**: 서비스, 네트워크, 볼륨, 환경 변수, 오버라이드
|
|
39
|
+
5. **헬스 체크 및 모니터링**: probe, 로그 수집, graceful shutdown, 재시작 정책
|
|
40
|
+
</Steps>
|
|
115
41
|
|
|
116
42
|
## Docker 체크리스트
|
|
117
43
|
|
|
@@ -123,11 +49,12 @@ executor 에이전트는 교차 검증을 위해 Claude Task 에이전트에 자
|
|
|
123
49
|
- [ ] 레이어 캐싱이 최적화됨
|
|
124
50
|
- [ ] HEALTHCHECK가 설정됨
|
|
125
51
|
|
|
126
|
-
### 보안 (
|
|
52
|
+
### 보안 (5개)
|
|
127
53
|
- [ ] 이미지 취약점 스캔 완료
|
|
128
54
|
- [ ] 최소 권한 원칙 적용 (비루트, 읽기 전용 파일시스템)
|
|
129
|
-
- [ ] 시크릿이 이미지에 포함되지 않음
|
|
55
|
+
- [ ] 시크릿이 이미지에 포함되지 않음 (ENV, ARG, COPY 모두 확인)
|
|
130
56
|
- [ ] 불필요한 도구/패키지가 제거됨
|
|
57
|
+
- [ ] 빌드 시 민감 레이어 캐시 방지
|
|
131
58
|
|
|
132
59
|
### 운영 (4개)
|
|
133
60
|
- [ ] Graceful shutdown이 구현됨 (SIGTERM)
|
|
@@ -148,7 +75,28 @@ executor 에이전트는 교차 검증을 위해 Claude Task 에이전트에 자
|
|
|
148
75
|
| Node.js | < 150MB | node:20-alpine |
|
|
149
76
|
| Python | < 200MB | python:3.12-slim |
|
|
150
77
|
| Go | < 30MB | gcr.io/distroless/static |
|
|
151
|
-
| Rust | < 30MB | debian:bookworm-slim
|
|
78
|
+
| Rust | < 30MB | debian:bookworm-slim + scratch |
|
|
79
|
+
| Java | < 250MB | eclipse-temurin:21-jre-alpine |
|
|
80
|
+
|
|
81
|
+
<Failure_Modes>
|
|
82
|
+
## 피해야 할 실패 패턴
|
|
83
|
+
|
|
84
|
+
### 이미지 빌드
|
|
85
|
+
- **:latest 태그 사용**: 빌드 재현 불가능. 항상 `node:20.11.1-alpine3.19` 같이 고정.
|
|
86
|
+
- **단일 스테이지**: 빌드 도구가 런타임에 포함됨. 멀티스테이지 필수.
|
|
87
|
+
- **레이어 순서 오류**: 소스 코드를 lockfile보다 먼저 배치하면 캐시 무효화.
|
|
88
|
+
|
|
89
|
+
### 보안
|
|
90
|
+
- **root 실행**: `USER` 지시어 없이 실행. 컨테이너 탈출 시 호스트 루트 권한 획득 위험.
|
|
91
|
+
- **시크릿 하드코딩**: ENV/ARG/RUN에 시크릿 포함. BuildKit `--mount=type=secret` 사용.
|
|
92
|
+
- **ARG로 시크릿 전달**: 중간 레이어에 남음. BuildKit secret mount 사용.
|
|
93
|
+
|
|
94
|
+
### 구성
|
|
95
|
+
- **.dockerignore 누락**: node_modules, .git, .env가 이미지에 포함됨.
|
|
96
|
+
- **SIGTERM 미처리**: 10초 후 SIGKILL로 강제 종료. 데이터 손실 가능.
|
|
97
|
+
- **HEALTHCHECK 누락**: 애플리케이션 응답 불능 상태 미감지.
|
|
98
|
+
- **Compose 비밀번호 하드코딩**: .env 파일 또는 Docker secrets 사용.
|
|
99
|
+
</Failure_Modes>
|
|
152
100
|
|
|
153
101
|
<Output>
|
|
154
102
|
```
|
|
@@ -160,95 +108,25 @@ Runtime: [Node.js 20]
|
|
|
160
108
|
Image Size: [최종 이미지 크기]
|
|
161
109
|
|
|
162
110
|
DOCKERFILE / Dockerfile
|
|
163
|
-
-------------------------
|
|
164
|
-
# Build stage
|
|
165
|
-
FROM node:20-alpine AS builder
|
|
166
|
-
WORKDIR /app
|
|
167
|
-
COPY package*.json ./
|
|
168
|
-
RUN npm ci --omit=dev
|
|
169
|
-
COPY . .
|
|
170
|
-
RUN npm run build
|
|
171
|
-
|
|
172
|
-
# Runtime stage
|
|
173
|
-
FROM node:20-alpine AS runtime
|
|
174
|
-
RUN addgroup -g 1001 -S appgroup && \
|
|
175
|
-
adduser -S appuser -u 1001 -G appgroup
|
|
176
|
-
WORKDIR /app
|
|
177
|
-
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
|
|
178
|
-
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
|
|
179
|
-
USER appuser
|
|
180
|
-
EXPOSE 3000
|
|
181
|
-
HEALTHCHECK --interval=30s --timeout=3s \
|
|
182
|
-
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
|
|
183
|
-
CMD ["node", "dist/index.js"]
|
|
184
|
-
|
|
185
111
|
DOCKER COMPOSE / docker-compose.yml
|
|
186
|
-
--------------------------------------
|
|
187
|
-
services:
|
|
188
|
-
app:
|
|
189
|
-
build: .
|
|
190
|
-
ports: ["3000:3000"]
|
|
191
|
-
depends_on:
|
|
192
|
-
db: { condition: service_healthy }
|
|
193
|
-
environment:
|
|
194
|
-
DATABASE_URL: postgres://user:pass@db:5432/app
|
|
195
|
-
db:
|
|
196
|
-
image: postgres:16-alpine
|
|
197
|
-
volumes: ["pgdata:/var/lib/postgresql/data"]
|
|
198
|
-
healthcheck:
|
|
199
|
-
test: ["CMD-SHELL", "pg_isready"]
|
|
200
|
-
|
|
201
112
|
IMAGE ANALYSIS / 이미지 분석
|
|
202
|
-
------------------------------
|
|
203
|
-
Total Size: 142MB
|
|
204
|
-
Layers: 8
|
|
205
|
-
Base Image: node:20-alpine (45MB)
|
|
206
|
-
Dependencies: 85MB
|
|
207
|
-
Application: 12MB
|
|
208
|
-
|
|
209
113
|
SECURITY SCAN / 보안 스캔
|
|
210
|
-
---------------------------
|
|
211
|
-
Vulnerabilities: 0 CRITICAL, 0 HIGH, 2 MEDIUM
|
|
212
|
-
Recommendation: [조치 사항]
|
|
213
114
|
```
|
|
214
115
|
</Output>
|
|
215
116
|
|
|
216
117
|
<Policy>
|
|
217
|
-
- 베이스 이미지에 항상 고정
|
|
218
|
-
- 프로덕션 이미지에서
|
|
219
|
-
- 시크릿은 절대 이미지에 포함하지
|
|
220
|
-
-
|
|
221
|
-
-
|
|
222
|
-
- Graceful shutdown
|
|
118
|
+
- 베이스 이미지에 항상 고정 태그 사용 (latest 금지)
|
|
119
|
+
- 프로덕션 이미지에서 비루트 사용자 실행 필수
|
|
120
|
+
- 시크릿은 절대 이미지에 포함하지 않음
|
|
121
|
+
- 멀티스테이지 빌드 기본 적용
|
|
122
|
+
- .dockerignore 필수 작성
|
|
123
|
+
- Graceful shutdown 필수 구현
|
|
223
124
|
</Policy>
|
|
224
125
|
|
|
225
126
|
## 다른 스킬과의 연동
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
/forgen:ci-cd Docker 이미지 빌드 및 푸시 파이프라인
|
|
230
|
-
```
|
|
231
|
-
CI에서 Docker 이미지 자동 빌드/배포
|
|
232
|
-
|
|
233
|
-
**보안 리뷰 연동:**
|
|
234
|
-
```
|
|
235
|
-
/forgen:security-review Dockerfile 및 이미지
|
|
236
|
-
```
|
|
237
|
-
Docker 구성의 보안 취약점 점검
|
|
238
|
-
|
|
239
|
-
**성능 연동:**
|
|
240
|
-
```
|
|
241
|
-
/forgen:performance 컨테이너 리소스 사용량 분석
|
|
242
|
-
```
|
|
243
|
-
컨테이너의 리소스 최적화
|
|
244
|
-
|
|
245
|
-
## Best Practices
|
|
246
|
-
|
|
247
|
-
- **작은 이미지** -- 불필요한 것을 빼서 크기를 줄임
|
|
248
|
-
- **멀티스테이지** -- 빌드 도구를 런타임에 포함하지 않음
|
|
249
|
-
- **캐시 활용** -- 레이어 순서를 변경 빈도 기준으로 정렬
|
|
250
|
-
- **보안 우선** -- 비루트, 최소 권한, 시크릿 분리
|
|
251
|
-
- **헬스 체크** -- 컨테이너 상태를 자동으로 모니터링
|
|
127
|
+
- `/forgen:ci-cd` -- Docker 이미지 빌드/배포 파이프라인
|
|
128
|
+
- `/forgen:security-review` -- Dockerfile/이미지 보안 점검
|
|
129
|
+
- `/forgen:performance` -- 컨테이너 리소스 최적화
|
|
252
130
|
|
|
253
131
|
<Arguments>
|
|
254
132
|
## 사용법
|