@wooojin/forgen 0.2.0 → 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 +72 -0
- package/README.ja.md +79 -14
- package/README.ko.md +100 -14
- package/README.md +124 -17
- package/README.zh.md +79 -14
- 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 +273 -0
- 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 +26 -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 +108 -0
- package/dist/core/dashboard.js +495 -0
- package/dist/core/doctor.js +151 -21
- package/dist/core/drift-score.d.ts +49 -0
- package/dist/core/drift-score.js +87 -0
- package/dist/core/harness.d.ts +6 -1
- package/dist/core/harness.js +75 -19
- package/dist/core/mcp-config.d.ts +2 -0
- package/dist/core/mcp-config.js +6 -1
- 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-export.d.ts +41 -0
- package/dist/engine/compound-export.js +169 -0
- package/dist/engine/compound-lifecycle.d.ts +4 -3
- package/dist/engine/compound-lifecycle.js +91 -46
- package/dist/engine/compound-loop.js +18 -0
- 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 +30 -1
- package/dist/engine/solution-matcher.js +235 -45
- package/dist/fgx.js +12 -8
- package/dist/hooks/context-guard.d.ts +15 -0
- package/dist/hooks/context-guard.js +218 -56
- package/dist/hooks/db-guard.js +2 -2
- package/dist/hooks/hook-config.d.ts +27 -1
- package/dist/hooks/hook-config.js +72 -12
- package/dist/hooks/hooks-generator.d.ts +3 -0
- package/dist/hooks/hooks-generator.js +23 -6
- package/dist/hooks/intent-classifier.d.ts +0 -2
- package/dist/hooks/intent-classifier.js +32 -18
- package/dist/hooks/keyword-detector.js +126 -204
- package/dist/hooks/notepad-injector.js +2 -2
- package/dist/hooks/permission-handler.js +2 -2
- package/dist/hooks/post-tool-failure.js +12 -6
- package/dist/hooks/post-tool-handlers.d.ts +1 -1
- package/dist/hooks/post-tool-handlers.js +14 -11
- package/dist/hooks/post-tool-use.d.ts +11 -0
- package/dist/hooks/post-tool-use.js +184 -71
- package/dist/hooks/pre-compact.d.ts +11 -1
- package/dist/hooks/pre-compact.js +112 -37
- package/dist/hooks/pre-tool-use.js +86 -56
- package/dist/hooks/rate-limiter.js +3 -3
- package/dist/hooks/secret-filter.js +2 -2
- package/dist/hooks/session-recovery.js +256 -236
- package/dist/hooks/shared/hook-response.d.ts +4 -4
- package/dist/hooks/shared/hook-response.js +13 -24
- package/dist/hooks/shared/hook-timing.d.ts +15 -0
- package/dist/hooks/shared/hook-timing.js +64 -0
- package/dist/hooks/skill-injector.d.ts +4 -3
- package/dist/hooks/skill-injector.js +47 -16
- package/dist/hooks/slop-detector.js +3 -3
- package/dist/hooks/solution-injector.js +224 -197
- package/dist/hooks/subagent-tracker.js +2 -2
- 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/renderer/rule-renderer.js +9 -11
- 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 +266 -0
- 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/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/tdd/SKILL.md +0 -178
- package/skills/testing-strategy/SKILL.md +0 -260
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: forge-loop
|
|
3
|
+
description: This skill should be used when the user asks to "forge-loop, 포지루프, 끝까지, don't stop". 주어진 작업을 PRD(User Story)로 분해하고, 모든 수용 기준이 충족될 때까지 반복 실행합니다.
|
|
4
|
+
argument-hint: "[task description]"
|
|
5
|
+
model: inherit
|
|
6
|
+
allowed-tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Grep
|
|
9
|
+
- Glob
|
|
10
|
+
- Bash
|
|
11
|
+
- Agent
|
|
12
|
+
- Edit
|
|
13
|
+
- Write
|
|
14
|
+
triggers:
|
|
15
|
+
- "forge-loop"
|
|
16
|
+
- "포지루프"
|
|
17
|
+
- "끝까지"
|
|
18
|
+
- "don't stop"
|
|
19
|
+
- "완료될 때까지"
|
|
20
|
+
- "루프로 실행"
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
<Purpose>
|
|
24
|
+
주어진 작업을 User Story + 수용 기준으로 분해하고, 모든 스토리가 검증을 통과할 때까지
|
|
25
|
+
ch-planner -> ch-executor -> ch-verifier 사이클을 반복합니다.
|
|
26
|
+
스토리 하나가 완료되면 멈추지 않고 즉시 다음 스토리로 진행합니다.
|
|
27
|
+
사용자에게 보고하는 시점은 "전부 완료", "에스컬레이션", "컨텍스트 한계" 세 가지뿐입니다.
|
|
28
|
+
</Purpose>
|
|
29
|
+
|
|
30
|
+
<Compound_Integration>
|
|
31
|
+
## Compound-In: 관련 패턴 로드
|
|
32
|
+
|
|
33
|
+
루프 시작 전 + 각 스토리 시작 전에 compound-search를 수행합니다.
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
compound-search 도구로 작업 키워드를 검색하세요.
|
|
37
|
+
예: compound-search("TypeScript", "테스트", "리팩토링") 등
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Compound-Out: 세션 종료 시 패턴 추출
|
|
41
|
+
|
|
42
|
+
모든 스토리 완료 후:
|
|
43
|
+
- 실패 후 성공한 패턴 -> troubleshoot 후보
|
|
44
|
+
- 반복 사용된 접근법 -> pattern 후보
|
|
45
|
+
- 아키텍처 결정 -> decision 후보
|
|
46
|
+
</Compound_Integration>
|
|
47
|
+
|
|
48
|
+
<Steps>
|
|
49
|
+
## Phase 1: PRD 설정
|
|
50
|
+
|
|
51
|
+
### PRD 구조
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"task": "{$ARGUMENTS}",
|
|
55
|
+
"stories": [
|
|
56
|
+
{
|
|
57
|
+
"id": "US-001",
|
|
58
|
+
"title": "스토리 제목",
|
|
59
|
+
"description": "As a {role}, I want {feature} so that {value}",
|
|
60
|
+
"acceptanceCriteria": ["구체적이고 테스트 가능한 기준"],
|
|
61
|
+
"passes": false,
|
|
62
|
+
"attempts": 0,
|
|
63
|
+
"dependencies": []
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 수용 기준 품질 규칙
|
|
70
|
+
|
|
71
|
+
| 금지 (일반적) | 교체 (구체적) |
|
|
72
|
+
|--------------|-------------|
|
|
73
|
+
| "코드가 컴파일된다" | "npm run build가 exit 0으로 완료된다" |
|
|
74
|
+
| "테스트가 통과한다" | "npm test의 {test-name}이 PASS한다" |
|
|
75
|
+
| "기능이 동작한다" | "POST /api/users에 {payload}를 보내면 201이 반환된다" |
|
|
76
|
+
|
|
77
|
+
### 상태 파일 저장 (필수 — Stop 훅 연동)
|
|
78
|
+
|
|
79
|
+
PRD 확정 직후 **반드시** `~/.forgen/state/forge-loop.json`에 저장:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
mkdir -p ~/.forgen/state
|
|
83
|
+
cat > ~/.forgen/state/forge-loop.json <<EOF
|
|
84
|
+
{"active":true,"startedAt":"$(date -u +%Y-%m-%dT%H:%M:%SZ)","stories":[
|
|
85
|
+
{"id":"US-001","title":"...","passes":false,"attempts":0}
|
|
86
|
+
]}
|
|
87
|
+
EOF
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
이 파일이 있어야 Claude가 중간에 멈추지 않도록 Stop 훅이 차단합니다.
|
|
91
|
+
스토리 완료 시 `passes: true`로 업데이트. 전체 완료는 Stop 훅이 자동 처리.
|
|
92
|
+
|
|
93
|
+
## Phase 2: 스토리 실행 루프
|
|
94
|
+
|
|
95
|
+
### 2-1. Compound-In (스토리별)
|
|
96
|
+
해당 스토리의 키워드로 compound-search 실행. 관련 패턴을 Planner에게 전달.
|
|
97
|
+
|
|
98
|
+
### 2-2. Planner
|
|
99
|
+
구현 계획 수립: 변경 파일, 접근법, compound 패턴 적용, 위험 요소, 검증 방법.
|
|
100
|
+
|
|
101
|
+
### 2-3. Executor
|
|
102
|
+
최소 변경으로 구현: 기존 패턴 준수, <200줄, 빌드 통과, 임시 코드 금지.
|
|
103
|
+
|
|
104
|
+
### 2-4. Verifier
|
|
105
|
+
각 AC를 독립적으로 검증. PASS/FAIL + 증거(테스트 출력, 빌드 로그, curl 응답).
|
|
106
|
+
"should work"는 증거가 아닙니다 -- 반드시 실행합니다.
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
수용 기준 검증:
|
|
110
|
+
- AC1: "POST /api/users가 201을 반환한다"
|
|
111
|
+
-> PASS | 증거: `curl -X POST ... -> HTTP/1.1 201 Created`
|
|
112
|
+
- AC2: "잘못된 이메일 시 400 반환"
|
|
113
|
+
-> FAIL | 증거: `curl -X POST ... -> 500`
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 2-5. 스토리 완료 판정
|
|
117
|
+
- 모든 AC PASS -> `passes: true` -> 즉시 다음 스토리 (보고하지 않음)
|
|
118
|
+
- FAIL -> `attempts++` -> ch-debugger -> ch-executor -> ch-verifier 재실행
|
|
119
|
+
- attempt == 3 -> 에스컬레이션
|
|
120
|
+
|
|
121
|
+
## Anti-Polite-Stop 규칙
|
|
122
|
+
|
|
123
|
+
스토리 완료 후 멈추지 않고 즉시 다음 스토리로 진행합니다.
|
|
124
|
+
보고 시점:
|
|
125
|
+
- **전부 완료**: 모든 스토리 PASS + 최종 검증 통과
|
|
126
|
+
- **에스컬레이션**: 3회 실패
|
|
127
|
+
- **컨텍스트 한계**: 토큰 80% 사용
|
|
128
|
+
|
|
129
|
+
## Phase 3: 최종 검증
|
|
130
|
+
|
|
131
|
+
모든 스토리 passes: true 후:
|
|
132
|
+
1. 전체 빌드 + 테스트
|
|
133
|
+
2. Critic 에이전트 리뷰 (코드 패턴, 디버그 코드, 보안)
|
|
134
|
+
3. CRITICAL 이슈 -> 수정 스토리 추가 -> Phase 2 복귀
|
|
135
|
+
4. Compound-Out: 패턴 추출 제안
|
|
136
|
+
|
|
137
|
+
## 서킷 브레이커
|
|
138
|
+
|
|
139
|
+
| 브레이커 | 임계값 | 동작 |
|
|
140
|
+
|---------|--------|------|
|
|
141
|
+
| max_attempts_per_story | 3 | 에스컬레이션 |
|
|
142
|
+
| max_total_iterations | 30 | 강제 종료 + 상태 리포트 |
|
|
143
|
+
| same_error_repeat | 3회 | 접근법 변경 요구 |
|
|
144
|
+
| context_limit | 80% 토큰 | 상태 저장 + resume 안내 |
|
|
145
|
+
|
|
146
|
+
## 진행 상황 추적
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
FORGE-LOOP PROGRESS
|
|
150
|
+
═══════════════════
|
|
151
|
+
Story 1/4: User Authentication [DONE] (1 attempt)
|
|
152
|
+
Story 2/4: Payment API [IN PROGRESS] (attempt 2/3)
|
|
153
|
+
|- AC1: POST /pay returns 200 [PASS]
|
|
154
|
+
|- AC2: Webhook verification [FAIL]
|
|
155
|
+
+- AC3: Idempotency key [PENDING]
|
|
156
|
+
Story 3/4: Error Handling [PENDING]
|
|
157
|
+
Story 4/4: Tests [PENDING]
|
|
158
|
+
═══════════════════
|
|
159
|
+
```
|
|
160
|
+
</Steps>
|
|
161
|
+
|
|
162
|
+
<Failure_Modes>
|
|
163
|
+
NEVER: **PRD 없이 구현**: 스토리 분해를 먼저 수행합니다.
|
|
164
|
+
|
|
165
|
+
NEVER: **일반적 수용 기준**: "코드가 컴파일된다" -> 프로젝트 특화 기준으로 교체.
|
|
166
|
+
|
|
167
|
+
NEVER: **3회 실패 후 같은 접근**: 에스컬레이션하고 접근법을 변경합니다.
|
|
168
|
+
|
|
169
|
+
NEVER: **검증 스킵**: "should work"는 증거가 아닙니다. 실행하여 확인합니다.
|
|
170
|
+
|
|
171
|
+
NEVER: **중간 보고 (Polite-Stop)**: 스토리 완료 후 즉시 다음으로 진행합니다.
|
|
172
|
+
|
|
173
|
+
NEVER: **Compound 무시**: 시작 전과 각 스토리 전에 compound-search를 수행합니다.
|
|
174
|
+
|
|
175
|
+
NEVER: **디버그 코드 방치**: console.log, TODO, HACK, debugger 원천 차단.
|
|
176
|
+
</Failure_Modes>
|
|
177
|
+
|
|
178
|
+
<Output>
|
|
179
|
+
```
|
|
180
|
+
FORGE-LOOP COMPLETE
|
|
181
|
+
═══════════════════════════════════════════════════
|
|
182
|
+
Task: {task description}
|
|
183
|
+
|
|
184
|
+
STORIES
|
|
185
|
+
US-001: {title} [DONE] ({N} attempts)
|
|
186
|
+
US-002: {title} [DONE] ({N} attempts)
|
|
187
|
+
|
|
188
|
+
METRICS
|
|
189
|
+
Total: {N} stories, {N} iterations (avg {N.N}/story)
|
|
190
|
+
Build: PASS | Tests: {N} passed, 0 failed
|
|
191
|
+
Critic: {N} warnings, 0 critical
|
|
192
|
+
|
|
193
|
+
COMPOUND CANDIDATES
|
|
194
|
+
[troubleshoot] "{title}" -- {desc}
|
|
195
|
+
[pattern] "{title}" -- {desc}
|
|
196
|
+
compound에 저장하시겠습니까? [Y/n]
|
|
197
|
+
═══════════════════════════════════════════════════
|
|
198
|
+
```
|
|
199
|
+
</Output>
|
|
200
|
+
|
|
201
|
+
<Policy>
|
|
202
|
+
- 수용 기준은 구체적이고 검증 가능해야 합니다
|
|
203
|
+
- "should work"는 증거가 아닙니다 -- 반드시 실행
|
|
204
|
+
- 스토리 완료 후 즉시 다음 스토리 (Anti-Polite-Stop)
|
|
205
|
+
- 3회 실패 시 에스컬레이션
|
|
206
|
+
- 전체 완료 후 compound 추출 제안
|
|
207
|
+
- 서킷 브레이커 임계값 절대 무시 금지
|
|
208
|
+
</Policy>
|
|
209
|
+
|
|
210
|
+
<Arguments>
|
|
211
|
+
- `[task description]`: 실행할 작업 설명. 생략 시 현재 대화 컨텍스트에서 추론.
|
|
212
|
+
- `resume`: 이전에 중단된 루프를 재개합니다.
|
|
213
|
+
</Arguments>
|
|
214
|
+
|
|
215
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: learn
|
|
3
|
+
description: This skill should be used when the user asks to "learn, 학습 관리, compound 정리, 솔루션 정리". Compound 지식의 관리 인터페이스 — 검색, 통계, 가지치기, 내보내기/가져오기.
|
|
4
|
+
argument-hint: "[search {query}|stats|prune|export|import {path}]"
|
|
5
|
+
model: inherit
|
|
6
|
+
allowed-tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Grep
|
|
9
|
+
- Glob
|
|
10
|
+
- Bash
|
|
11
|
+
triggers:
|
|
12
|
+
- "learn"
|
|
13
|
+
- "학습 관리"
|
|
14
|
+
- "compound 정리"
|
|
15
|
+
- "솔루션 정리"
|
|
16
|
+
- "compound 관리"
|
|
17
|
+
- "솔루션 관리"
|
|
18
|
+
- "지식 관리"
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
<Purpose>
|
|
22
|
+
compound에 축적된 솔루션을 관리합니다.
|
|
23
|
+
시간이 지남에 따라 솔루션은 낡거나 중복되거나 모순됩니다.
|
|
24
|
+
learn은 이를 정기적으로 정리하여 compound의 신호 대 잡음 비율을 유지합니다.
|
|
25
|
+
|
|
26
|
+
서브커맨드: search, stats, prune, export, import
|
|
27
|
+
서브커맨드 생략 시: stats 실행
|
|
28
|
+
</Purpose>
|
|
29
|
+
|
|
30
|
+
<Compound_Integration>
|
|
31
|
+
## Compound 데이터 직접 조작
|
|
32
|
+
|
|
33
|
+
learn은 compound의 관리 도구입니다.
|
|
34
|
+
모든 서브커맨드에서 compound MCP 도구를 직접 사용합니다:
|
|
35
|
+
- `compound-stats` -- 전체 현황 조회
|
|
36
|
+
- `compound-list` -- 솔루션 목록 조회
|
|
37
|
+
- `compound-read` -- 개별 솔루션 상세 조회
|
|
38
|
+
- `compound-search` -- 키워드 검색
|
|
39
|
+
|
|
40
|
+
retire/merge 전에 반드시 사용자 확인을 받습니다.
|
|
41
|
+
mature 상태 솔루션은 어떤 경우에도 자동 정리 대상이 아닙니다.
|
|
42
|
+
</Compound_Integration>
|
|
43
|
+
|
|
44
|
+
<Steps>
|
|
45
|
+
## search {query}
|
|
46
|
+
|
|
47
|
+
compound-search MCP로 검색하고 결과를 정리합니다.
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
compound-search("{query}")
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
SEARCH RESULTS / 검색 결과
|
|
55
|
+
===========================
|
|
56
|
+
Query: "{query}"
|
|
57
|
+
Found: {N}개
|
|
58
|
+
|
|
59
|
+
# | Title | Type | Status | Last Used
|
|
60
|
+
----+--------------------------|---------------|------------|----------
|
|
61
|
+
1 | {제목} | {type} | {status} | {date}
|
|
62
|
+
2 | {제목} | {type} | {status} | {date}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
결과 없으면: "검색 결과 없음. 관련 키워드 제안: {1-3개}"
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## stats
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
compound-stats
|
|
73
|
+
compound-list
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
COMPOUND KNOWLEDGE / 복리 지식 현황
|
|
78
|
+
════════════════════════════════════
|
|
79
|
+
Total: {N} solutions
|
|
80
|
+
|
|
81
|
+
By Status:
|
|
82
|
+
mature (3+ hits): {N} ({N}%) {bar}
|
|
83
|
+
verified (2 hits): {N} ({N}%) {bar}
|
|
84
|
+
candidate (1 hit): {N} ({N}%) {bar}
|
|
85
|
+
experiment (0 hits): {N} ({N}%) {bar}
|
|
86
|
+
|
|
87
|
+
By Type:
|
|
88
|
+
pattern: {N} | troubleshoot: {N} | decision: {N} | anti-pattern: {N}
|
|
89
|
+
|
|
90
|
+
By Scope:
|
|
91
|
+
me: {N} | project: {N} | universal: {N}
|
|
92
|
+
|
|
93
|
+
Activity (last 7 days):
|
|
94
|
+
Injected: {N}/{total} ({N}%)
|
|
95
|
+
New: +{N} | Promoted: +{N} | Retired: -{N}
|
|
96
|
+
Top: "{title}" ({N} hits)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
바 차트는 비율에 따라 `#` 문자로 시각화 (최대 20자).
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## prune
|
|
104
|
+
|
|
105
|
+
**prune은 항상 stats를 먼저 실행합니다.**
|
|
106
|
+
|
|
107
|
+
### 감지 기준
|
|
108
|
+
1. STALE: 30일+ 미사용
|
|
109
|
+
2. DUPLICATE: 유사도 80%+ (제목+내용 키워드 비교)
|
|
110
|
+
3. CONTRADICTORY: 같은 주제에 서로 반대 결론
|
|
111
|
+
4. LOW-QUALITY: experiment 상태 60일+ 미승격
|
|
112
|
+
|
|
113
|
+
### 제외 규칙
|
|
114
|
+
- mature 상태는 절대 prune 대상이 아님
|
|
115
|
+
- verified 상태는 STALE일 때만 후보
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
PRUNE CANDIDATES / 정리 후보
|
|
119
|
+
════════════════════════════
|
|
120
|
+
|
|
121
|
+
STALE (30d+ unused):
|
|
122
|
+
1. "{title}" ({N}일 미사용) [retire / keep]
|
|
123
|
+
2. "{title}" ({N}일 미사용) [retire / keep]
|
|
124
|
+
|
|
125
|
+
DUPLICATE (similarity {N}%+):
|
|
126
|
+
3. "{title-a}" ~ "{title-b}" ({N}%) [merge / keep both]
|
|
127
|
+
|
|
128
|
+
CONTRADICTORY:
|
|
129
|
+
4. "{title-a}" vs "{title-b}" [resolve / keep both]
|
|
130
|
+
|
|
131
|
+
LOW-QUALITY (experiment {N}d+):
|
|
132
|
+
5. "{title}" (experiment {N}일 경과) [retire / promote / keep]
|
|
133
|
+
|
|
134
|
+
선택하세요 (번호 + 행동, 예: "1 retire, 3 merge, 4 resolve"):
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
사용자 선택을 받은 후에만 실행합니다.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## export
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# tar.gz (기본)
|
|
145
|
+
tar -czf compound-export-$(date +%Y%m%d).tar.gz ~/.forgen/me/solutions/
|
|
146
|
+
|
|
147
|
+
# markdown (--md 인수)
|
|
148
|
+
# 각 솔루션을 하나의 markdown으로 결합
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
EXPORT COMPLETE / 내보내기 완료
|
|
153
|
+
================================
|
|
154
|
+
Format: {tar.gz / markdown}
|
|
155
|
+
File: {파일 경로}
|
|
156
|
+
Size: {크기}
|
|
157
|
+
Count: {솔루션 수}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## import {path}
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
tar -xzf {path} -C /tmp/compound-import/
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
중복 검사 후 처리:
|
|
169
|
+
- 동일 -> skip
|
|
170
|
+
- 유사 -> 사용자에게 merge/skip/replace 선택
|
|
171
|
+
- 신규 -> 추가
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
IMPORT RESULTS / 가져오기 결과
|
|
175
|
+
===============================
|
|
176
|
+
Source: {path}
|
|
177
|
+
Total: {N}개
|
|
178
|
+
Added: {N}개
|
|
179
|
+
Skipped: {N}개 (중복)
|
|
180
|
+
Merged: {N}개
|
|
181
|
+
```
|
|
182
|
+
</Steps>
|
|
183
|
+
|
|
184
|
+
<Failure_Modes>
|
|
185
|
+
**확인 없이 retire**: 각 후보의 선택을 반드시 사용자에게 받는다. 자동 삭제 없음.
|
|
186
|
+
**mature 솔루션 삭제 제안**: mature는 prune 대상에서 제외. 3회 이상 활용된 지식은 가치가 검증됨.
|
|
187
|
+
**stats 없이 prune**: stats 먼저, 그 다음 prune 후보. 전체 맥락 없이 개별 삭제 불가.
|
|
188
|
+
**import 무조건 덮어쓰기**: 기존 솔루션과 충돌 시 반드시 중복 검사 먼저.
|
|
189
|
+
**빈 compound에서 prune 시도**: 솔루션이 없으면 "/compound로 세션 패턴을 축적하세요" 안내.
|
|
190
|
+
</Failure_Modes>
|
|
191
|
+
|
|
192
|
+
<Output>
|
|
193
|
+
## stats 출력
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
COMPOUND KNOWLEDGE / 복리 지식 현황
|
|
197
|
+
════════════════════════════════════
|
|
198
|
+
Total: {N} solutions
|
|
199
|
+
...
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## prune 출력
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
PRUNE CANDIDATES / 정리 후보
|
|
206
|
+
════════════════════════════
|
|
207
|
+
[stale] "{title}" -- {N}일 미사용 -> retire/keep?
|
|
208
|
+
[duplicate] "{a}" ~ "{b}" -> merge/keep?
|
|
209
|
+
[low-quality] "{title}" -- experiment {N}일 -> retire/promote/keep?
|
|
210
|
+
```
|
|
211
|
+
</Output>
|
|
212
|
+
|
|
213
|
+
<Policy>
|
|
214
|
+
- retire/merge는 반드시 사용자 확인 후 실행.
|
|
215
|
+
- mature 상태 솔루션은 prune 대상이 아님. 예외 없음.
|
|
216
|
+
- prune은 항상 stats 출력 이후에 후보 제시.
|
|
217
|
+
- export는 현재 디렉토리에 날짜 포함 파일명.
|
|
218
|
+
- import는 중복 검사 먼저, 충돌 시 사용자 선택.
|
|
219
|
+
- 서브커맨드 없으면 stats 기본 실행.
|
|
220
|
+
</Policy>
|
|
221
|
+
|
|
222
|
+
<Arguments>
|
|
223
|
+
- `search {query}`: 솔루션 검색
|
|
224
|
+
- `stats`: 전체 현황 통계 (기본값)
|
|
225
|
+
- `prune`: stale/중복/모순/저품질 감지 및 정리
|
|
226
|
+
- `export`: tar.gz 내보내기
|
|
227
|
+
- `export --md`: markdown 내보내기
|
|
228
|
+
- `import {path}`: 외부 compound 가져오기 (중복 검사 후 머지)
|
|
229
|
+
</Arguments>
|
|
230
|
+
|
|
231
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: retro
|
|
3
|
+
description: This skill should be used when the user asks to "retro, 회고, retrospective, 돌아보기". Git 메트릭 + compound 건강도 + 학습 추세를 교차 분석하는 회고 리포트.
|
|
4
|
+
argument-hint: "[7d|14d|30d] [compare]"
|
|
5
|
+
model: inherit
|
|
6
|
+
allowed-tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Grep
|
|
9
|
+
- Glob
|
|
10
|
+
- Bash
|
|
11
|
+
triggers:
|
|
12
|
+
- "retro"
|
|
13
|
+
- "회고"
|
|
14
|
+
- "retrospective"
|
|
15
|
+
- "돌아보기"
|
|
16
|
+
- "주간 회고"
|
|
17
|
+
- "월간 회고"
|
|
18
|
+
- "주간회고"
|
|
19
|
+
- "월간회고"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
<Purpose>
|
|
23
|
+
git log + compound 통계 + 교정 기록을 교차 분석하여 최근 기간의 개발 패턴을 파악합니다.
|
|
24
|
+
"잘 하고 있는가"가 아니라 "어디서 반복 마찰이 생기는가"를 발견하는 것이 목적입니다.
|
|
25
|
+
데이터 없이 추측하지 않습니다. 모든 분석은 실제 수집된 데이터에 근거합니다.
|
|
26
|
+
</Purpose>
|
|
27
|
+
|
|
28
|
+
<Compound_Integration>
|
|
29
|
+
## Compound 데이터 활용
|
|
30
|
+
|
|
31
|
+
retro는 compound stats를 핵심 데이터 소스로 사용합니다.
|
|
32
|
+
|
|
33
|
+
분석 신호:
|
|
34
|
+
- 활용률 낮음 -> 축적은 되지만 재사용 안 됨 (검색 키워드 품질 문제)
|
|
35
|
+
- stale 많음 -> 정리 필요 (`/learn prune` 추천)
|
|
36
|
+
- experiment 비율 높음 -> 검증 없이 축적만 됨
|
|
37
|
+
- mature 비율 높음 -> 건강한 지식 베이스
|
|
38
|
+
</Compound_Integration>
|
|
39
|
+
|
|
40
|
+
<Steps>
|
|
41
|
+
## Phase 1: 데이터 수집
|
|
42
|
+
|
|
43
|
+
기간 기본값: 7d
|
|
44
|
+
`$ARGUMENTS`에서 파싱 (7d, 14d, 30d, compare).
|
|
45
|
+
|
|
46
|
+
### 1-1: Git 활동 데이터
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# 커밋 이력
|
|
50
|
+
git log --since="{period}" --oneline --stat --format="%h|%an|%ai|%s"
|
|
51
|
+
|
|
52
|
+
# 기여자별 커밋
|
|
53
|
+
git shortlog --since="{period}" -sn
|
|
54
|
+
|
|
55
|
+
# 핫스팟 (파일별 변경 빈도)
|
|
56
|
+
git log --since="{period}" --name-only --pretty=format: | sort | uniq -c | sort -rn | head -10
|
|
57
|
+
|
|
58
|
+
# 변경 줄 수
|
|
59
|
+
git log --since="{period}" --stat --format="" | tail -1
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 1-2: Compound 데이터
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
compound-stats
|
|
66
|
+
compound-list
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 1-3: 교정 기록
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
ls -la ~/.forgen/me/evidence/ 2>/dev/null || echo "교정 데이터 없음"
|
|
73
|
+
find ~/.forgen/me/evidence/ -name "*.json" -mtime -{period_days} 2>/dev/null | wc -l
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Phase 2: 코드 활동 분석
|
|
77
|
+
|
|
78
|
+
- 커밋 수 (일 평균 포함)
|
|
79
|
+
- +추가 / -삭제 비율
|
|
80
|
+
- 핫스팟 Top 5 (3회+ 수정 -> 불안정 영역)
|
|
81
|
+
|
|
82
|
+
## Phase 3: 세션 패턴 분석
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
세션 분리: 45분+ 간격 = 새 세션
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
- 세션 수, 평균 길이
|
|
89
|
+
- 시간대 분포 (정보 제공용, 판단은 사용자에게)
|
|
90
|
+
|
|
91
|
+
## Phase 4: Compound 건강도 분석
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
총 솔루션, 상태별/유형별 비율, 활용률, stale 후보
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
건강도 판정:
|
|
98
|
+
- HEALTHY: mature 20%+, stale < 5, 활용률 30%+
|
|
99
|
+
- ATTENTION: experiment 40%+, 또는 stale 5-10
|
|
100
|
+
- NEEDS CARE: stale 10+, 또는 활용률 10% 미만
|
|
101
|
+
|
|
102
|
+
## Phase 5: 학습 추세 분석
|
|
103
|
+
|
|
104
|
+
- 교정 감소 -> 학습 중 (좋은 신호)
|
|
105
|
+
- 교정 증가 -> 드리프트 발생
|
|
106
|
+
- 동일 축 반복 -> `/calibrate` 권장
|
|
107
|
+
- 데이터 없음 -> "교정 데이터 없음" 표시
|
|
108
|
+
|
|
109
|
+
## Phase 6: 추천 생성 (반드시 3개)
|
|
110
|
+
|
|
111
|
+
데이터 근거 규칙:
|
|
112
|
+
- 핫스팟 존재 -> `/code-review {파일}`
|
|
113
|
+
- stale 5개+ -> `/learn prune`
|
|
114
|
+
- 동일 교정 3회+ -> `/calibrate`
|
|
115
|
+
- experiment 40%+ -> compound 품질 개선
|
|
116
|
+
- 활용률 10% 미만 -> compound 검색 개선
|
|
117
|
+
- 커밋 급감 -> 블로커 확인
|
|
118
|
+
</Steps>
|
|
119
|
+
|
|
120
|
+
<Compare_Mode>
|
|
121
|
+
## Compare 모드
|
|
122
|
+
|
|
123
|
+
`/retro compare` 또는 `/retro 14d compare`
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# 현재 기간
|
|
127
|
+
git log --since="{period}" --oneline --stat
|
|
128
|
+
# 이전 기간
|
|
129
|
+
git log --since="{period*2}" --until="{period}" --oneline --stat
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
COMPARE / 기간 비교
|
|
134
|
+
════════════════════
|
|
135
|
+
Previous {N}d This {N}d Delta
|
|
136
|
+
Commits: {N} {N} {+/-N}%
|
|
137
|
+
LOC: +{N} +{N} {+/-N}%
|
|
138
|
+
Files: {N} {N} {+/-N}%
|
|
139
|
+
Hotspot: {file}({N}) {file}({N}) {NEW/SAME/GONE}
|
|
140
|
+
Sessions: {N} {N} {+/-N}%
|
|
141
|
+
Compound hits: {N} {N} {+/-N}%
|
|
142
|
+
Corrections: {N} {N} {+/-N}% {arrow}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Delta 해석:
|
|
146
|
+
- 커밋 증가 + 교정 감소 -> 생산성 + 학습 (최고)
|
|
147
|
+
- 커밋 감소 + 핫스팟 동일 -> 같은 파일에서 막힘 (구조적 문제)
|
|
148
|
+
- Compound hits 증가 -> 복리 효과 발현
|
|
149
|
+
</Compare_Mode>
|
|
150
|
+
|
|
151
|
+
<Failure_Modes>
|
|
152
|
+
**데이터 없이 추측**: git log + compound stats 수집 후 분석. 느낌 기반 회고 금지.
|
|
153
|
+
**긍정만 보고**: 핫스팟, stale, 개선점 반드시 포함. 칭찬 보고서는 가치 없음.
|
|
154
|
+
**추천 없는 보고서**: 반드시 3개 next action. "계속 잘 하세요"는 추천이 아님.
|
|
155
|
+
**기간 무시**: `--since` 파라미터 정확 적용.
|
|
156
|
+
**세션 패턴 판단**: 데이터만 보여주고 판단은 사용자에게.
|
|
157
|
+
</Failure_Modes>
|
|
158
|
+
|
|
159
|
+
<Output>
|
|
160
|
+
```
|
|
161
|
+
RETRO / 회고
|
|
162
|
+
════════════
|
|
163
|
+
기간: {start} ~ {end}
|
|
164
|
+
|
|
165
|
+
CODE ACTIVITY
|
|
166
|
+
─────────────
|
|
167
|
+
커밋: {N}개 (일 평균 {N}개) | +{N} / -{N} | 파일: {N}개
|
|
168
|
+
세션: {N}개 (평균 {N}분)
|
|
169
|
+
|
|
170
|
+
핫스팟:
|
|
171
|
+
1. {file} ({N}회 수정) <- 구조 리뷰 권장
|
|
172
|
+
2. {file} ({N}회 수정)
|
|
173
|
+
3. {file} ({N}회 수정)
|
|
174
|
+
4. {file} ({N}회 수정)
|
|
175
|
+
5. {file} ({N}회 수정)
|
|
176
|
+
|
|
177
|
+
COMPOUND HEALTH [{HEALTHY/ATTENTION/NEEDS CARE}]
|
|
178
|
+
───────────────
|
|
179
|
+
총: {N}개 | mature: {N} | verified: {N} | candidate: {N} | experiment: {N}
|
|
180
|
+
활용률: {N}% (지난주 대비 {+/-N}%)
|
|
181
|
+
Stale 후보: {N}개
|
|
182
|
+
신규: +{N}개 | 승격: +{N}개 | 은퇴: -{N}개
|
|
183
|
+
|
|
184
|
+
LEARNING TREND
|
|
185
|
+
──────────────
|
|
186
|
+
교정: {N} -> {N} ({down/up/flat} {arrow})
|
|
187
|
+
드리프트: {N}회
|
|
188
|
+
|
|
189
|
+
RECOMMENDATIONS
|
|
190
|
+
───────────────
|
|
191
|
+
1. {action} -- {data-backed reason}
|
|
192
|
+
2. {action} -- {data-backed reason}
|
|
193
|
+
3. {action} -- {data-backed reason}
|
|
194
|
+
```
|
|
195
|
+
</Output>
|
|
196
|
+
|
|
197
|
+
<Policy>
|
|
198
|
+
- 데이터 수집 없이 회고 시작하지 않음.
|
|
199
|
+
- 기간 없으면 7d 기본.
|
|
200
|
+
- 추천은 수집된 데이터에만 근거. 추측 금지.
|
|
201
|
+
- 추천 반드시 3개.
|
|
202
|
+
- compare 모드: 두 기간 delta 시각화.
|
|
203
|
+
- 핫스팟 Top 5.
|
|
204
|
+
- compound 건강도 3단계 판정.
|
|
205
|
+
</Policy>
|
|
206
|
+
|
|
207
|
+
<Arguments>
|
|
208
|
+
- `7d`: 최근 7일 회고 (기본값)
|
|
209
|
+
- `14d`: 최근 14일 회고
|
|
210
|
+
- `30d`: 최근 30일 회고
|
|
211
|
+
- `compare`: 현재 기간 vs 이전 동일 기간 비교
|
|
212
|
+
- `14d compare`: 14일 회고 + 기간 비교
|
|
213
|
+
</Arguments>
|
|
214
|
+
|
|
215
|
+
$ARGUMENTS
|