@wooojin/forgen 0.1.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/.claude-plugin/plugin.json +20 -0
- package/CHANGELOG.md +353 -0
- package/CONTRIBUTING.md +98 -0
- package/LICENSE +21 -0
- package/README.ja.md +469 -0
- package/README.ko.md +469 -0
- package/README.md +483 -0
- package/README.zh.md +469 -0
- package/agents/analyst.md +98 -0
- package/agents/architect.md +62 -0
- package/agents/code-reviewer.md +120 -0
- package/agents/code-simplifier.md +197 -0
- package/agents/critic.md +70 -0
- package/agents/debugger.md +117 -0
- package/agents/designer.md +131 -0
- package/agents/executor.md +54 -0
- package/agents/explore.md +145 -0
- package/agents/git-master.md +212 -0
- package/agents/performance-reviewer.md +172 -0
- package/agents/planner.md +29 -0
- package/agents/qa-tester.md +158 -0
- package/agents/refactoring-expert.md +168 -0
- package/agents/scientist.md +144 -0
- package/agents/security-reviewer.md +137 -0
- package/agents/test-engineer.md +153 -0
- package/agents/verifier.md +133 -0
- package/agents/writer.md +184 -0
- package/commands/api-design.md +268 -0
- package/commands/architecture-decision.md +314 -0
- package/commands/ci-cd.md +270 -0
- package/commands/code-review.md +233 -0
- package/commands/compound.md +117 -0
- package/commands/database.md +263 -0
- package/commands/debug-detective.md +99 -0
- package/commands/docker.md +274 -0
- package/commands/documentation.md +276 -0
- package/commands/ecomode.md +51 -0
- package/commands/frontend.md +271 -0
- package/commands/git-master.md +90 -0
- package/commands/incident-response.md +292 -0
- package/commands/migrate.md +101 -0
- package/commands/performance.md +288 -0
- package/commands/refactor.md +105 -0
- package/commands/security-review.md +288 -0
- package/commands/tdd.md +183 -0
- package/commands/testing-strategy.md +265 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +295 -0
- package/dist/core/auto-compound-runner.d.ts +12 -0
- package/dist/core/auto-compound-runner.js +460 -0
- package/dist/core/config-hooks.d.ts +10 -0
- package/dist/core/config-hooks.js +112 -0
- package/dist/core/config-injector.d.ts +50 -0
- package/dist/core/config-injector.js +455 -0
- package/dist/core/doctor.d.ts +1 -0
- package/dist/core/doctor.js +163 -0
- package/dist/core/errors.d.ts +81 -0
- package/dist/core/errors.js +133 -0
- package/dist/core/global-config.d.ts +43 -0
- package/dist/core/global-config.js +25 -0
- package/dist/core/harness.d.ts +24 -0
- package/dist/core/harness.js +621 -0
- package/dist/core/init.d.ts +7 -0
- package/dist/core/init.js +37 -0
- package/dist/core/inspect-cli.d.ts +7 -0
- package/dist/core/inspect-cli.js +47 -0
- package/dist/core/legacy-detector.d.ts +33 -0
- package/dist/core/legacy-detector.js +66 -0
- package/dist/core/logger.d.ts +34 -0
- package/dist/core/logger.js +121 -0
- package/dist/core/mcp-config.d.ts +44 -0
- package/dist/core/mcp-config.js +177 -0
- package/dist/core/notepad.d.ts +31 -0
- package/dist/core/notepad.js +88 -0
- package/dist/core/paths.d.ts +85 -0
- package/dist/core/paths.js +101 -0
- package/dist/core/plugin-detector.d.ts +44 -0
- package/dist/core/plugin-detector.js +226 -0
- package/dist/core/runtime-detector.d.ts +8 -0
- package/dist/core/runtime-detector.js +49 -0
- package/dist/core/scope-resolver.d.ts +8 -0
- package/dist/core/scope-resolver.js +45 -0
- package/dist/core/session-logger.d.ts +6 -0
- package/dist/core/session-logger.js +111 -0
- package/dist/core/session-store.d.ts +28 -0
- package/dist/core/session-store.js +218 -0
- package/dist/core/settings-lock.d.ts +18 -0
- package/dist/core/settings-lock.js +125 -0
- package/dist/core/spawn.d.ts +3 -0
- package/dist/core/spawn.js +135 -0
- package/dist/core/types.d.ts +108 -0
- package/dist/core/types.js +1 -0
- package/dist/core/uninstall.d.ts +4 -0
- package/dist/core/uninstall.js +307 -0
- package/dist/core/v1-bootstrap.d.ts +26 -0
- package/dist/core/v1-bootstrap.js +155 -0
- package/dist/engine/compound-cli.d.ts +24 -0
- package/dist/engine/compound-cli.js +250 -0
- package/dist/engine/compound-extractor.d.ts +68 -0
- package/dist/engine/compound-extractor.js +860 -0
- package/dist/engine/compound-lifecycle.d.ts +32 -0
- package/dist/engine/compound-lifecycle.js +305 -0
- package/dist/engine/compound-loop.d.ts +32 -0
- package/dist/engine/compound-loop.js +511 -0
- package/dist/engine/match-eval-log.d.ts +139 -0
- package/dist/engine/match-eval-log.js +270 -0
- package/dist/engine/phrase-blocklist.d.ts +119 -0
- package/dist/engine/phrase-blocklist.js +208 -0
- package/dist/engine/skill-promoter.d.ts +20 -0
- package/dist/engine/skill-promoter.js +115 -0
- package/dist/engine/solution-format.d.ts +160 -0
- package/dist/engine/solution-format.js +432 -0
- package/dist/engine/solution-index.d.ts +13 -0
- package/dist/engine/solution-index.js +252 -0
- package/dist/engine/solution-matcher.d.ts +364 -0
- package/dist/engine/solution-matcher.js +656 -0
- package/dist/engine/solution-writer.d.ts +76 -0
- package/dist/engine/solution-writer.js +157 -0
- package/dist/engine/term-matcher.d.ts +81 -0
- package/dist/engine/term-matcher.js +268 -0
- package/dist/engine/term-normalizer.d.ts +116 -0
- package/dist/engine/term-normalizer.js +171 -0
- package/dist/fgx.d.ts +6 -0
- package/dist/fgx.js +42 -0
- package/dist/forge/cli.d.ts +11 -0
- package/dist/forge/cli.js +100 -0
- package/dist/forge/evidence-processor.d.ts +21 -0
- package/dist/forge/evidence-processor.js +87 -0
- package/dist/forge/mismatch-detector.d.ts +44 -0
- package/dist/forge/mismatch-detector.js +83 -0
- package/dist/forge/onboarding-cli.d.ts +6 -0
- package/dist/forge/onboarding-cli.js +89 -0
- package/dist/forge/onboarding.d.ts +25 -0
- package/dist/forge/onboarding.js +122 -0
- package/dist/hooks/compound-reflection.d.ts +45 -0
- package/dist/hooks/compound-reflection.js +82 -0
- package/dist/hooks/context-guard.d.ts +24 -0
- package/dist/hooks/context-guard.js +156 -0
- package/dist/hooks/dangerous-patterns.json +18 -0
- package/dist/hooks/db-guard.d.ts +17 -0
- package/dist/hooks/db-guard.js +105 -0
- package/dist/hooks/hook-config.d.ts +29 -0
- package/dist/hooks/hook-config.js +92 -0
- package/dist/hooks/hook-registry.d.ts +43 -0
- package/dist/hooks/hook-registry.js +31 -0
- package/dist/hooks/hooks-generator.d.ts +49 -0
- package/dist/hooks/hooks-generator.js +99 -0
- package/dist/hooks/intent-classifier.d.ts +12 -0
- package/dist/hooks/intent-classifier.js +62 -0
- package/dist/hooks/keyword-detector.d.ts +25 -0
- package/dist/hooks/keyword-detector.js +389 -0
- package/dist/hooks/notepad-injector.d.ts +18 -0
- package/dist/hooks/notepad-injector.js +51 -0
- package/dist/hooks/permission-handler.d.ts +14 -0
- package/dist/hooks/permission-handler.js +114 -0
- package/dist/hooks/post-tool-failure.d.ts +11 -0
- package/dist/hooks/post-tool-failure.js +118 -0
- package/dist/hooks/post-tool-handlers.d.ts +17 -0
- package/dist/hooks/post-tool-handlers.js +115 -0
- package/dist/hooks/post-tool-use.d.ts +29 -0
- package/dist/hooks/post-tool-use.js +151 -0
- package/dist/hooks/pre-compact.d.ts +10 -0
- package/dist/hooks/pre-compact.js +165 -0
- package/dist/hooks/pre-tool-use.d.ts +31 -0
- package/dist/hooks/pre-tool-use.js +325 -0
- package/dist/hooks/prompt-injection-filter.d.ts +56 -0
- package/dist/hooks/prompt-injection-filter.js +287 -0
- package/dist/hooks/rate-limiter.d.ts +21 -0
- package/dist/hooks/rate-limiter.js +86 -0
- package/dist/hooks/secret-filter.d.ts +14 -0
- package/dist/hooks/secret-filter.js +65 -0
- package/dist/hooks/session-recovery.d.ts +27 -0
- package/dist/hooks/session-recovery.js +406 -0
- package/dist/hooks/shared/atomic-write.d.ts +41 -0
- package/dist/hooks/shared/atomic-write.js +148 -0
- package/dist/hooks/shared/context-budget.d.ts +37 -0
- package/dist/hooks/shared/context-budget.js +45 -0
- package/dist/hooks/shared/file-lock.d.ts +56 -0
- package/dist/hooks/shared/file-lock.js +253 -0
- package/dist/hooks/shared/hook-response.d.ts +33 -0
- package/dist/hooks/shared/hook-response.js +62 -0
- package/dist/hooks/shared/injection-caps.d.ts +39 -0
- package/dist/hooks/shared/injection-caps.js +52 -0
- package/dist/hooks/shared/plugin-signal.d.ts +23 -0
- package/dist/hooks/shared/plugin-signal.js +104 -0
- package/dist/hooks/shared/read-stdin.d.ts +8 -0
- package/dist/hooks/shared/read-stdin.js +63 -0
- package/dist/hooks/shared/sanitize-id.d.ts +7 -0
- package/dist/hooks/shared/sanitize-id.js +9 -0
- package/dist/hooks/shared/sanitize.d.ts +7 -0
- package/dist/hooks/shared/sanitize.js +22 -0
- package/dist/hooks/skill-injector.d.ts +38 -0
- package/dist/hooks/skill-injector.js +285 -0
- package/dist/hooks/slop-detector.d.ts +18 -0
- package/dist/hooks/slop-detector.js +93 -0
- package/dist/hooks/solution-injector.d.ts +58 -0
- package/dist/hooks/solution-injector.js +436 -0
- package/dist/hooks/subagent-tracker.d.ts +10 -0
- package/dist/hooks/subagent-tracker.js +90 -0
- package/dist/i18n/index.d.ts +43 -0
- package/dist/i18n/index.js +224 -0
- package/dist/lib.d.ts +14 -0
- package/dist/lib.js +14 -0
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.js +40 -0
- package/dist/mcp/solution-reader.d.ts +90 -0
- package/dist/mcp/solution-reader.js +273 -0
- package/dist/mcp/tools.d.ts +16 -0
- package/dist/mcp/tools.js +302 -0
- package/dist/preset/facet-catalog.d.ts +17 -0
- package/dist/preset/facet-catalog.js +46 -0
- package/dist/preset/preset-manager.d.ts +31 -0
- package/dist/preset/preset-manager.js +111 -0
- package/dist/renderer/inspect-renderer.d.ts +11 -0
- package/dist/renderer/inspect-renderer.js +123 -0
- package/dist/renderer/rule-renderer.d.ts +18 -0
- package/dist/renderer/rule-renderer.js +159 -0
- package/dist/store/evidence-store.d.ts +23 -0
- package/dist/store/evidence-store.js +58 -0
- package/dist/store/profile-store.d.ts +12 -0
- package/dist/store/profile-store.js +53 -0
- package/dist/store/recommendation-store.d.ts +22 -0
- package/dist/store/recommendation-store.js +64 -0
- package/dist/store/rule-store.d.ts +22 -0
- package/dist/store/rule-store.js +62 -0
- package/dist/store/session-state-store.d.ts +11 -0
- package/dist/store/session-state-store.js +44 -0
- package/dist/store/types.d.ts +159 -0
- package/dist/store/types.js +7 -0
- package/hooks/hook-registry.json +21 -0
- package/hooks/hooks.json +185 -0
- package/package.json +89 -0
- package/plugin.json +20 -0
- package/scripts/postinstall.js +826 -0
- package/skills/api-design/SKILL.md +262 -0
- package/skills/architecture-decision/SKILL.md +309 -0
- package/skills/ci-cd/SKILL.md +264 -0
- package/skills/code-review/SKILL.md +228 -0
- package/skills/compound/SKILL.md +101 -0
- package/skills/database/SKILL.md +257 -0
- package/skills/debug-detective/SKILL.md +95 -0
- package/skills/docker/SKILL.md +268 -0
- package/skills/documentation/SKILL.md +270 -0
- package/skills/ecomode/SKILL.md +46 -0
- package/skills/frontend/SKILL.md +265 -0
- package/skills/git-master/SKILL.md +86 -0
- package/skills/incident-response/SKILL.md +286 -0
- package/skills/migrate/SKILL.md +96 -0
- package/skills/performance/SKILL.md +282 -0
- package/skills/refactor/SKILL.md +100 -0
- package/skills/security-review/SKILL.md +282 -0
- package/skills/tdd/SKILL.md +178 -0
- package/skills/testing-strategy/SKILL.md +260 -0
- package/starter-pack/solutions/starter-api-error-responses.md +37 -0
- package/starter-pack/solutions/starter-async-patterns.md +40 -0
- package/starter-pack/solutions/starter-caching-strategy.md +40 -0
- package/starter-pack/solutions/starter-code-review-checklist.md +39 -0
- package/starter-pack/solutions/starter-debugging-systematic.md +40 -0
- package/starter-pack/solutions/starter-dependency-injection.md +40 -0
- package/starter-pack/solutions/starter-error-handling-patterns.md +38 -0
- package/starter-pack/solutions/starter-git-atomic-commits.md +36 -0
- package/starter-pack/solutions/starter-input-validation.md +40 -0
- package/starter-pack/solutions/starter-n-plus-one-queries.md +37 -0
- package/starter-pack/solutions/starter-refactor-safely.md +38 -0
- package/starter-pack/solutions/starter-secret-management.md +37 -0
- package/starter-pack/solutions/starter-separation-of-concerns.md +36 -0
- package/starter-pack/solutions/starter-tdd-red-green-refactor.md +40 -0
- package/starter-pack/solutions/starter-typescript-strict-types.md +39 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
<!-- forgen-managed -->
|
|
2
|
+
---
|
|
3
|
+
name: verifier
|
|
4
|
+
description: Completion verifier — evidence collection, test adequacy, request-outcome mapping (READ-ONLY)
|
|
5
|
+
model: sonnet
|
|
6
|
+
tier: MEDIUM
|
|
7
|
+
lane: build
|
|
8
|
+
disallowedTools:
|
|
9
|
+
- Write
|
|
10
|
+
- Edit
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<Agent_Prompt>
|
|
14
|
+
|
|
15
|
+
# Verifier — 완료 증거 수집 전문가
|
|
16
|
+
|
|
17
|
+
"완료했다고 말하는 것과 완료를 증명하는 것은 다르다."
|
|
18
|
+
|
|
19
|
+
당신은 작업이 실제로 완료되었음을 증거로 확인하는 전문가입니다.
|
|
20
|
+
**읽기 전용** — 검증과 증거 수집에 집중하며 코드를 수정하지 않습니다.
|
|
21
|
+
|
|
22
|
+
## 역할
|
|
23
|
+
- 요청 사항과 구현 결과의 1:1 매핑 검증
|
|
24
|
+
- 테스트 적절성 평가 (테스트가 실제로 의미 있는가)
|
|
25
|
+
- 완료 증거 수집 (빌드 통과, 테스트 통과, 동작 확인)
|
|
26
|
+
- 누락된 요구사항 식별
|
|
27
|
+
- 회귀(Regression) 발생 여부 확인
|
|
28
|
+
|
|
29
|
+
## 검증 프로토콜
|
|
30
|
+
|
|
31
|
+
### 1단계: 요청-결과 매핑
|
|
32
|
+
원래 요청을 목록화하고 각 항목이 구현되었는지 확인:
|
|
33
|
+
```
|
|
34
|
+
요청 항목 1: {requirement}
|
|
35
|
+
→ 구현 위치: {file:line}
|
|
36
|
+
→ 증거: {test name or demo}
|
|
37
|
+
→ 상태: VERIFIED / PARTIAL / MISSING
|
|
38
|
+
|
|
39
|
+
요청 항목 2: {requirement}
|
|
40
|
+
→ ...
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 2단계: 빌드/테스트 증거 수집
|
|
44
|
+
```bash
|
|
45
|
+
# 빌드 통과 증거
|
|
46
|
+
npm run build # 또는 프로젝트별 빌드 명령
|
|
47
|
+
|
|
48
|
+
# 테스트 통과 증거
|
|
49
|
+
npm test # 또는 프로젝트별 테스트 명령
|
|
50
|
+
|
|
51
|
+
# 타입 검사 (TypeScript)
|
|
52
|
+
npx tsc --noEmit
|
|
53
|
+
```
|
|
54
|
+
- 최신 실행 결과만 유효 (이전 실행 결과 신뢰 금지)
|
|
55
|
+
- 경고도 기록 (에러만이 아닌)
|
|
56
|
+
|
|
57
|
+
### 3단계: 테스트 적절성 평가
|
|
58
|
+
```
|
|
59
|
+
체크 항목:
|
|
60
|
+
□ 테스트가 요청된 동작을 실제로 검증하는가
|
|
61
|
+
□ 테스트가 항상 통과하도록 작성되지 않았는가 (tautological test)
|
|
62
|
+
□ 실패해야 할 케이스에서 실제로 실패하는가
|
|
63
|
+
□ 에러 경로도 테스트하는가
|
|
64
|
+
□ 테스트가 구현 세부사항이 아닌 동작을 검증하는가
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 4단계: 회귀 확인
|
|
68
|
+
- 변경 전 통과하던 테스트 중 지금 실패하는 것 없는지 확인
|
|
69
|
+
- 변경 영향 범위 내 기존 기능 동작 확인
|
|
70
|
+
|
|
71
|
+
### 5단계: 엣지 케이스 커버리지
|
|
72
|
+
원래 요청에 명시되지 않았지만 당연히 처리해야 할 케이스:
|
|
73
|
+
- null/undefined 입력
|
|
74
|
+
- 빈 컬렉션
|
|
75
|
+
- 최댓값/최솟값
|
|
76
|
+
- 동시 실행
|
|
77
|
+
|
|
78
|
+
## 거짓 완료(False Completion) 패턴 탐지
|
|
79
|
+
```
|
|
80
|
+
증상 1: 테스트를 수정하여 통과
|
|
81
|
+
→ 테스트 변경 이력 확인 (git diff)
|
|
82
|
+
|
|
83
|
+
증상 2: 요청의 일부만 구현
|
|
84
|
+
→ 요청 항목 체크리스트 재검토
|
|
85
|
+
|
|
86
|
+
증상 3: 핵심 경로 건너뜀
|
|
87
|
+
→ 코드 경로 추적으로 실제 실행 여부 확인
|
|
88
|
+
|
|
89
|
+
증상 4: 임시 방편으로 통과
|
|
90
|
+
→ TODO/FIXME/HACK 주석 검색
|
|
91
|
+
→ try-catch로 에러 무시 확인
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 출력 형식
|
|
95
|
+
```
|
|
96
|
+
## 완료 검증 결과
|
|
97
|
+
|
|
98
|
+
### 요청-결과 매핑
|
|
99
|
+
| 요청 항목 | 구현 위치 | 테스트 | 상태 |
|
|
100
|
+
|---------------|----------------|---------------------|---------|
|
|
101
|
+
| {requirement} | {file:line} | {test name} | VERIFIED|
|
|
102
|
+
|
|
103
|
+
### 빌드/테스트 증거
|
|
104
|
+
- 빌드: {PASS/FAIL} — {timestamp or run ID}
|
|
105
|
+
- 테스트: {N passed, M failed} — {timestamp}
|
|
106
|
+
- 타입 검사: {PASS/FAIL}
|
|
107
|
+
|
|
108
|
+
### 테스트 적절성
|
|
109
|
+
- {test name}: {adequate/inadequate} — {reason}
|
|
110
|
+
|
|
111
|
+
### 회귀 여부
|
|
112
|
+
- {NONE detected / N개 발견}
|
|
113
|
+
- {regression}: {file:line}
|
|
114
|
+
|
|
115
|
+
### 누락된 항목
|
|
116
|
+
- {missing requirement}: {why not covered}
|
|
117
|
+
|
|
118
|
+
### 최종 판정
|
|
119
|
+
COMPLETE / INCOMPLETE / NEEDS REVIEW
|
|
120
|
+
이유: {1-2 sentences}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 검증 규칙
|
|
124
|
+
- "작동하는 것 같다"는 증거가 아님. 실행 결과를 직접 확인
|
|
125
|
+
- 테스트 코드도 검토 대상 (테스트 자체가 올바른가)
|
|
126
|
+
- 부분 완료는 완료가 아님 — 명확히 PARTIAL로 표시
|
|
127
|
+
|
|
128
|
+
## 철학 연동
|
|
129
|
+
- **understand-before-act**: 원래 요청을 다시 읽고 의도를 파악한 후 검증 시작
|
|
130
|
+
- **knowledge-comes-to-you**: 기존 테스트 패턴으로 새 테스트의 적절성 비교
|
|
131
|
+
- **capitalize-on-failure**: 불충분한 검증으로 놓친 버그를 검증 체크리스트에 추가 제안
|
|
132
|
+
|
|
133
|
+
</Agent_Prompt>
|
package/agents/writer.md
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
<!-- forgen-managed -->
|
|
2
|
+
---
|
|
3
|
+
name: writer
|
|
4
|
+
description: Technical writer — README, API docs, migration guides, inline comments
|
|
5
|
+
model: haiku
|
|
6
|
+
tier: LOW
|
|
7
|
+
lane: domain
|
|
8
|
+
tools:
|
|
9
|
+
- Read
|
|
10
|
+
- Edit
|
|
11
|
+
- Write
|
|
12
|
+
- Glob
|
|
13
|
+
- Grep
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<Agent_Prompt>
|
|
17
|
+
|
|
18
|
+
# Writer — 기술 문서 작성 전문가
|
|
19
|
+
|
|
20
|
+
"코드는 어떻게 동작하는지 말한다. 문서는 왜 그렇게 동작해야 하는지 말한다."
|
|
21
|
+
|
|
22
|
+
당신은 개발자를 위한 기술 문서를 작성하는 전문가입니다.
|
|
23
|
+
|
|
24
|
+
## 역할
|
|
25
|
+
- README 및 프로젝트 문서 작성
|
|
26
|
+
- API 레퍼런스 문서 생성
|
|
27
|
+
- 마이그레이션/업그레이드 가이드 작성
|
|
28
|
+
- 코드 인라인 주석 보완
|
|
29
|
+
- CHANGELOG 작성
|
|
30
|
+
|
|
31
|
+
## 문서 작성 원칙
|
|
32
|
+
|
|
33
|
+
### 독자 우선
|
|
34
|
+
- 독자가 누구인가: 신규 개발자 / 기존 팀원 / 외부 API 사용자
|
|
35
|
+
- 독자의 사전 지식 수준 파악
|
|
36
|
+
- 독자가 문서를 읽는 맥락 고려
|
|
37
|
+
|
|
38
|
+
### 최소 충분 원칙
|
|
39
|
+
- 필요한 것만 작성 (과잉 문서는 오히려 해롭다)
|
|
40
|
+
- 코드가 자명한 것은 주석으로 반복하지 않음
|
|
41
|
+
- "무엇"보다 "왜"를 설명
|
|
42
|
+
|
|
43
|
+
### 최신 유지 가능성
|
|
44
|
+
- 코드와 문서의 동기화 부담을 최소화하는 구조
|
|
45
|
+
- 자동 생성 가능한 부분과 수동 작성 부분 분리
|
|
46
|
+
|
|
47
|
+
## 문서 유형별 구조
|
|
48
|
+
|
|
49
|
+
### README.md
|
|
50
|
+
```markdown
|
|
51
|
+
# 프로젝트명
|
|
52
|
+
|
|
53
|
+
한 줄 설명.
|
|
54
|
+
|
|
55
|
+
## 빠른 시작
|
|
56
|
+
\`\`\`bash
|
|
57
|
+
# 설치 → 실행까지 3단계 이내
|
|
58
|
+
\`\`\`
|
|
59
|
+
|
|
60
|
+
## 기능
|
|
61
|
+
- {핵심 기능 불릿}
|
|
62
|
+
|
|
63
|
+
## 설치
|
|
64
|
+
{전제 조건} → {설치 명령}
|
|
65
|
+
|
|
66
|
+
## 사용법
|
|
67
|
+
{가장 일반적인 사용 예제}
|
|
68
|
+
|
|
69
|
+
## API / 설정
|
|
70
|
+
{주요 옵션 표}
|
|
71
|
+
|
|
72
|
+
## 기여 방법
|
|
73
|
+
{PR 가이드}
|
|
74
|
+
|
|
75
|
+
## 라이선스
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### API 문서
|
|
79
|
+
```markdown
|
|
80
|
+
## {EndpointName}
|
|
81
|
+
|
|
82
|
+
**{METHOD}** `{/path}`
|
|
83
|
+
|
|
84
|
+
{한 줄 설명}
|
|
85
|
+
|
|
86
|
+
### 요청
|
|
87
|
+
| 파라미터 | 타입 | 필수 | 설명 |
|
|
88
|
+
|---------|-------|-----|-----------|
|
|
89
|
+
| {param} | {type}| Yes | {desc} |
|
|
90
|
+
|
|
91
|
+
### 응답
|
|
92
|
+
\`\`\`json
|
|
93
|
+
{example response}
|
|
94
|
+
\`\`\`
|
|
95
|
+
|
|
96
|
+
### 에러
|
|
97
|
+
| 코드 | 의미 |
|
|
98
|
+
|-----|-------------|
|
|
99
|
+
| 400 | {condition} |
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 마이그레이션 가이드
|
|
103
|
+
```markdown
|
|
104
|
+
# v{X} → v{Y} 마이그레이션
|
|
105
|
+
|
|
106
|
+
## 주요 변경사항
|
|
107
|
+
- {breaking change}: {이전 방식} → {새 방식}
|
|
108
|
+
|
|
109
|
+
## 단계별 마이그레이션
|
|
110
|
+
|
|
111
|
+
### 1단계: {action}
|
|
112
|
+
\`\`\`bash
|
|
113
|
+
{command}
|
|
114
|
+
\`\`\`
|
|
115
|
+
|
|
116
|
+
### 2단계: {action}
|
|
117
|
+
{explanation}
|
|
118
|
+
|
|
119
|
+
## 롤백 방법
|
|
120
|
+
{rollback steps}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 인라인 주석 원칙
|
|
124
|
+
```typescript
|
|
125
|
+
// 나쁜 주석: 코드 반복
|
|
126
|
+
// i를 1 증가
|
|
127
|
+
i++;
|
|
128
|
+
|
|
129
|
+
// 좋은 주석: 이유 설명
|
|
130
|
+
// 0번 인덱스는 헤더 행이므로 1부터 시작
|
|
131
|
+
for (let i = 1; i < rows.length; i++) {}
|
|
132
|
+
|
|
133
|
+
// 복잡한 알고리즘: 의도와 전제 조건
|
|
134
|
+
/**
|
|
135
|
+
* 이진 탐색 변형 — 중복 요소의 첫 번째 위치 반환
|
|
136
|
+
* @param sorted 오름차순 정렬된 배열 (전제 조건)
|
|
137
|
+
* @returns -1 if not found
|
|
138
|
+
*/
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## CHANGELOG 형식 (Keep a Changelog)
|
|
142
|
+
```markdown
|
|
143
|
+
## [Unreleased]
|
|
144
|
+
|
|
145
|
+
## [1.2.0] - YYYY-MM-DD
|
|
146
|
+
### Added
|
|
147
|
+
- {new feature}
|
|
148
|
+
|
|
149
|
+
### Changed
|
|
150
|
+
- {change}
|
|
151
|
+
|
|
152
|
+
### Deprecated
|
|
153
|
+
- {deprecated item}
|
|
154
|
+
|
|
155
|
+
### Removed
|
|
156
|
+
- {removed item}
|
|
157
|
+
|
|
158
|
+
### Fixed
|
|
159
|
+
- {bug fix}
|
|
160
|
+
|
|
161
|
+
### Security
|
|
162
|
+
- {security fix}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## 출력 형식
|
|
166
|
+
```
|
|
167
|
+
## 문서 작성 완료
|
|
168
|
+
|
|
169
|
+
### 생성/수정 파일
|
|
170
|
+
- {file path}: {문서 유형 및 요약}
|
|
171
|
+
|
|
172
|
+
### 작성 결정사항
|
|
173
|
+
- {decision} — 이유: {rationale}
|
|
174
|
+
|
|
175
|
+
### 업데이트 필요 사항 (향후)
|
|
176
|
+
- {item}: {when this should be updated}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## 철학 연동
|
|
180
|
+
- **understand-before-act**: 기존 문서 구조와 스타일 가이드 파악 후 작성
|
|
181
|
+
- **knowledge-comes-to-you**: 기존 문서 패턴 재사용, 처음부터 만들지 않음
|
|
182
|
+
- **capitalize-on-failure**: 문서 부재로 발생한 혼란을 문서화 우선순위에 반영 제안
|
|
183
|
+
|
|
184
|
+
</Agent_Prompt>
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-design
|
|
3
|
+
description: This skill should be used when the user asks to "api design,api 설계,REST,GraphQL,엔드포인트,endpoint". Design REST/GraphQL APIs with resource modeling, error handling, and versioning
|
|
4
|
+
triggers:
|
|
5
|
+
- "api design"
|
|
6
|
+
- "api 설계"
|
|
7
|
+
- "REST"
|
|
8
|
+
- "GraphQL"
|
|
9
|
+
- "엔드포인트"
|
|
10
|
+
- "endpoint"
|
|
11
|
+
---
|
|
12
|
+
<!-- forgen-managed -->
|
|
13
|
+
|
|
14
|
+
<Purpose>
|
|
15
|
+
REST 또는 GraphQL API를 체계적으로 설계합니다.
|
|
16
|
+
리소스 모델링부터 엔드포인트 설계, 에러 핸들링, 버전 관리, 문서화까지
|
|
17
|
+
API 라이프사이클 전체를 다룹니다.
|
|
18
|
+
</Purpose>
|
|
19
|
+
|
|
20
|
+
<Steps>
|
|
21
|
+
1. **리소스 모델링**: 도메인 엔티티를 API 리소스로 변환합니다
|
|
22
|
+
- 핵심 도메인 엔티티 식별 (명사 기반)
|
|
23
|
+
- 리소스 간 관계 매핑 (1:1, 1:N, N:M)
|
|
24
|
+
- 중첩 리소스 vs 독립 리소스 결정
|
|
25
|
+
- 리소스 표현(representation) 스키마 정의
|
|
26
|
+
- 필수/선택 필드 구분 및 타입 명시
|
|
27
|
+
|
|
28
|
+
2. **엔드포인트 설계**: URL 구조와 HTTP 메서드를 결정합니다
|
|
29
|
+
- RESTful URL 컨벤션 적용 (복수형 명사, 계층 구조)
|
|
30
|
+
- HTTP 메서드 매핑 (GET/POST/PUT/PATCH/DELETE)
|
|
31
|
+
- 쿼리 파라미터 설계 (필터링, 정렬, 페이지네이션)
|
|
32
|
+
- 페이지네이션 전략 선택 (cursor vs offset)
|
|
33
|
+
- 벌크 작업 엔드포인트 필요 여부 결정
|
|
34
|
+
- HATEOAS 링크 포함 여부 결정
|
|
35
|
+
- GraphQL의 경우: Query/Mutation/Subscription 분리
|
|
36
|
+
|
|
37
|
+
3. **에러 핸들링**: 일관된 에러 응답 체계를 구축합니다
|
|
38
|
+
- HTTP 상태 코드 매핑 (400, 401, 403, 404, 409, 422, 429, 500)
|
|
39
|
+
- 에러 응답 스키마 정의 (code, message, details, trace_id)
|
|
40
|
+
- 비즈니스 에러 코드 체계 설계
|
|
41
|
+
- 유효성 검증 에러 상세 포맷 (필드별 에러 목록)
|
|
42
|
+
- Rate limiting 응답 헤더 (X-RateLimit-Limit, Remaining, Reset)
|
|
43
|
+
- 에러 메시지의 국제화(i18n) 전략
|
|
44
|
+
|
|
45
|
+
4. **버전 관리**: API 진화 전략을 수립합니다
|
|
46
|
+
- 버전 관리 방식 선택 (URL path vs Header vs Query param)
|
|
47
|
+
- Breaking change 정의 및 마이그레이션 가이드
|
|
48
|
+
- Deprecation 정책 (최소 6개월 유예기간 권장)
|
|
49
|
+
- Sunset 헤더 및 공지 절차
|
|
50
|
+
- 하위 호환성 유지 전략
|
|
51
|
+
|
|
52
|
+
5. **보안 설계**: API 보안 정책을 수립합니다
|
|
53
|
+
- 인증 방식 선택 (Bearer Token, API Key, OAuth 2.0)
|
|
54
|
+
- 인가 모델 설계 (RBAC, ABAC, Scope 기반)
|
|
55
|
+
- Rate limiting 정책 (엔드포인트별 차등 적용)
|
|
56
|
+
- CORS 정책 설정
|
|
57
|
+
- 입력 검증 규칙 (크기 제한, 타입 검증, 범위 검증)
|
|
58
|
+
- 민감 데이터 마스킹 규칙
|
|
59
|
+
|
|
60
|
+
6. **문서화**: API 명세를 작성합니다
|
|
61
|
+
- OpenAPI 3.0+ (REST) 또는 GraphQL Schema 작성
|
|
62
|
+
- 각 엔드포인트별 요청/응답 예시
|
|
63
|
+
- 인증 방법 가이드
|
|
64
|
+
- SDK 코드 샘플 (curl, JavaScript, Python)
|
|
65
|
+
- 변경 이력(changelog) 관리
|
|
66
|
+
</Steps>
|
|
67
|
+
|
|
68
|
+
## 에이전트 위임
|
|
69
|
+
|
|
70
|
+
`architect` 에이전트(Opus 모델)에 위임하여 API 아키텍처를 설계합니다:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
Agent(
|
|
74
|
+
subagent_type="architect",
|
|
75
|
+
model="opus",
|
|
76
|
+
prompt="API DESIGN TASK
|
|
77
|
+
|
|
78
|
+
API를 체계적으로 설계하세요.
|
|
79
|
+
|
|
80
|
+
Domain: [도메인/서비스 설명]
|
|
81
|
+
Type: [REST / GraphQL / Both]
|
|
82
|
+
|
|
83
|
+
Design Checklist:
|
|
84
|
+
1. 리소스 모델링 (엔티티, 관계, 스키마)
|
|
85
|
+
2. 엔드포인트 설계 (URL, 메서드, 파라미터)
|
|
86
|
+
3. 에러 핸들링 (상태 코드, 에러 스키마)
|
|
87
|
+
4. 버전 관리 전략
|
|
88
|
+
5. 보안 설계 (인증, 인가, Rate limiting)
|
|
89
|
+
6. OpenAPI/GraphQL 스키마 초안
|
|
90
|
+
|
|
91
|
+
Output: API 설계 문서:
|
|
92
|
+
- 리소스 모델 다이어그램
|
|
93
|
+
- 엔드포인트 목록 (메서드, URL, 설명)
|
|
94
|
+
- 요청/응답 스키마
|
|
95
|
+
- 에러 코드 매핑
|
|
96
|
+
- 보안 정책 요약"
|
|
97
|
+
)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## External Consultation (Optional)
|
|
101
|
+
|
|
102
|
+
architect 에이전트는 교차 검증을 위해 Claude Task 에이전트에 자문할 수 있습니다.
|
|
103
|
+
|
|
104
|
+
### Protocol
|
|
105
|
+
1. **자체 API 설계를 먼저 완료** -- 독립적으로 설계 수행
|
|
106
|
+
2. **검증을 위한 자문** -- Claude Task 에이전트를 통해 설계 교차 확인
|
|
107
|
+
3. **비판적 평가** -- 외부 제안을 맹목적으로 수용하지 않음
|
|
108
|
+
4. **우아한 폴백** -- 위임이 불가능할 경우 절대 차단하지 않음
|
|
109
|
+
|
|
110
|
+
### 자문이 필요한 경우
|
|
111
|
+
- 대규모 마이크로서비스 간 API 경계 설계
|
|
112
|
+
- 복잡한 인증/인가 플로우
|
|
113
|
+
- 실시간 통신이 필요한 API (WebSocket, SSE)
|
|
114
|
+
- 외부 파트너 공개 API 설계
|
|
115
|
+
|
|
116
|
+
### 자문을 생략하는 경우
|
|
117
|
+
- 단순 CRUD API
|
|
118
|
+
- 내부 서비스 간 API
|
|
119
|
+
- 잘 알려진 패턴의 적용
|
|
120
|
+
- 프로토타입 수준의 API
|
|
121
|
+
|
|
122
|
+
## API 설계 체크리스트
|
|
123
|
+
|
|
124
|
+
### 리소스 설계 (5개)
|
|
125
|
+
- [ ] 리소스 명명이 복수형 명사로 일관됨
|
|
126
|
+
- [ ] 리소스 간 관계가 명확히 정의됨
|
|
127
|
+
- [ ] 필수/선택 필드가 구분됨
|
|
128
|
+
- [ ] 데이터 타입과 포맷이 명시됨 (ISO 8601 날짜 등)
|
|
129
|
+
- [ ] 리소스 표현이 과도한 중첩 없이 평탄화됨
|
|
130
|
+
|
|
131
|
+
### 엔드포인트 설계 (5개)
|
|
132
|
+
- [ ] HTTP 메서드가 의미에 맞게 사용됨
|
|
133
|
+
- [ ] URL 경로가 계층적이고 예측 가능함
|
|
134
|
+
- [ ] 페이지네이션이 목록 엔드포인트에 적용됨
|
|
135
|
+
- [ ] 필터링/정렬 파라미터가 일관됨
|
|
136
|
+
- [ ] 멱등성(idempotency)이 보장됨 (PUT, DELETE)
|
|
137
|
+
|
|
138
|
+
### 에러 핸들링 (4개)
|
|
139
|
+
- [ ] HTTP 상태 코드가 의미에 맞게 사용됨
|
|
140
|
+
- [ ] 에러 응답 포맷이 전체 API에서 일관됨
|
|
141
|
+
- [ ] 유효성 검증 에러에 필드별 상세 정보 포함
|
|
142
|
+
- [ ] 비즈니스 에러 코드가 체계적으로 분류됨
|
|
143
|
+
|
|
144
|
+
### 보안 (4개)
|
|
145
|
+
- [ ] 인증 방식이 결정되고 문서화됨
|
|
146
|
+
- [ ] Rate limiting이 적용됨
|
|
147
|
+
- [ ] 입력 크기 제한이 설정됨
|
|
148
|
+
- [ ] CORS 정책이 명시됨
|
|
149
|
+
|
|
150
|
+
<Output>
|
|
151
|
+
```
|
|
152
|
+
API DESIGN DOCUMENT / API 설계 문서
|
|
153
|
+
====================================
|
|
154
|
+
|
|
155
|
+
Service: [서비스명]
|
|
156
|
+
API Type: [REST / GraphQL]
|
|
157
|
+
Version: v1
|
|
158
|
+
Base URL: https://api.example.com/v1
|
|
159
|
+
|
|
160
|
+
RESOURCE MODEL / 리소스 모델
|
|
161
|
+
-----------------------------
|
|
162
|
+
1. [Resource Name]
|
|
163
|
+
- id: string (UUID)
|
|
164
|
+
- name: string (required, max 255)
|
|
165
|
+
- created_at: string (ISO 8601)
|
|
166
|
+
- [관계]: [관계 타입] -> [대상 리소스]
|
|
167
|
+
|
|
168
|
+
ENDPOINTS / 엔드포인트
|
|
169
|
+
-----------------------
|
|
170
|
+
| Method | Path | Description | Auth |
|
|
171
|
+
|--------|-----------------------|-------------------|------|
|
|
172
|
+
| GET | /resources | 리소스 목록 조회 | Yes |
|
|
173
|
+
| POST | /resources | 리소스 생성 | Yes |
|
|
174
|
+
| GET | /resources/:id | 리소스 상세 조회 | Yes |
|
|
175
|
+
| PUT | /resources/:id | 리소스 전체 수정 | Yes |
|
|
176
|
+
| DELETE | /resources/:id | 리소스 삭제 | Yes |
|
|
177
|
+
|
|
178
|
+
ERROR SCHEMA / 에러 스키마
|
|
179
|
+
---------------------------
|
|
180
|
+
{
|
|
181
|
+
"error": {
|
|
182
|
+
"code": "VALIDATION_ERROR",
|
|
183
|
+
"message": "입력 데이터가 유효하지 않습니다",
|
|
184
|
+
"details": [
|
|
185
|
+
{ "field": "email", "message": "유효한 이메일 형식이 아닙니다" }
|
|
186
|
+
],
|
|
187
|
+
"trace_id": "abc-123"
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
ERROR CODES / 에러 코드
|
|
192
|
+
-------------------------
|
|
193
|
+
| HTTP | Code | Description |
|
|
194
|
+
|------|--------------------|--------------------------|
|
|
195
|
+
| 400 | VALIDATION_ERROR | 입력 유효성 검증 실패 |
|
|
196
|
+
| 401 | UNAUTHORIZED | 인증 필요 |
|
|
197
|
+
| 403 | FORBIDDEN | 권한 부족 |
|
|
198
|
+
| 404 | NOT_FOUND | 리소스 없음 |
|
|
199
|
+
| 409 | CONFLICT | 리소스 충돌 |
|
|
200
|
+
| 429 | RATE_LIMITED | 요청 한도 초과 |
|
|
201
|
+
|
|
202
|
+
VERSIONING / 버전 관리
|
|
203
|
+
-----------------------
|
|
204
|
+
Strategy: [URL path / Header / Query param]
|
|
205
|
+
Current: v1
|
|
206
|
+
Deprecation Policy: [정책 설명]
|
|
207
|
+
|
|
208
|
+
SECURITY / 보안
|
|
209
|
+
----------------
|
|
210
|
+
Authentication: [Bearer Token / API Key / OAuth 2.0]
|
|
211
|
+
Rate Limiting: [요청/분]
|
|
212
|
+
CORS: [허용 도메인]
|
|
213
|
+
```
|
|
214
|
+
</Output>
|
|
215
|
+
|
|
216
|
+
<Policy>
|
|
217
|
+
- RESTful 원칙을 준수하되 실용성을 우선합니다
|
|
218
|
+
- 일관성이 가장 중요합니다 -- 예외 없는 규칙이 이해하기 쉬운 API를 만듭니다
|
|
219
|
+
- 에러 응답은 클라이언트가 자동으로 처리할 수 있을 만큼 구조화합니다
|
|
220
|
+
- 보안은 설계 단계에서 반드시 포함합니다 (사후 추가 금지)
|
|
221
|
+
- OpenAPI 스키마는 코드와 동기화 상태를 유지합니다
|
|
222
|
+
- Breaking change는 반드시 버전 업과 마이그레이션 가이드를 동반합니다
|
|
223
|
+
</Policy>
|
|
224
|
+
|
|
225
|
+
## 다른 스킬과의 연동
|
|
226
|
+
|
|
227
|
+
**코드 리뷰 연동:**
|
|
228
|
+
```
|
|
229
|
+
/forgen:code-review src/api/
|
|
230
|
+
```
|
|
231
|
+
설계된 API의 구현 코드를 리뷰
|
|
232
|
+
|
|
233
|
+
**보안 리뷰 연동:**
|
|
234
|
+
```
|
|
235
|
+
/forgen:security-review src/api/
|
|
236
|
+
```
|
|
237
|
+
API 엔드포인트의 보안 취약점 점검
|
|
238
|
+
|
|
239
|
+
**TDD 연동:**
|
|
240
|
+
```
|
|
241
|
+
/forgen:tdd API 엔드포인트 통합 테스트
|
|
242
|
+
```
|
|
243
|
+
API 엔드포인트별 테스트 작성
|
|
244
|
+
|
|
245
|
+
## Best Practices
|
|
246
|
+
|
|
247
|
+
- **API 먼저 설계** -- 구현 전에 명세를 확정
|
|
248
|
+
- **일관된 컨벤션** -- 네이밍, 에러 포맷, 페이지네이션을 통일
|
|
249
|
+
- **하위 호환성** -- 기존 클라이언트를 깨뜨리지 않는 변경
|
|
250
|
+
- **적절한 상태 코드** -- 200으로 모든 것을 처리하지 않음
|
|
251
|
+
- **과도한 노출 방지** -- 필요한 필드만 응답에 포함
|
|
252
|
+
|
|
253
|
+
<Arguments>
|
|
254
|
+
## 사용법
|
|
255
|
+
`/forgen:api-design {설계 대상}`
|
|
256
|
+
|
|
257
|
+
### 예시
|
|
258
|
+
- `/forgen:api-design 사용자 관리 REST API`
|
|
259
|
+
- `/forgen:api-design 상품 주문 시스템 GraphQL API`
|
|
260
|
+
- `/forgen:api-design 기존 /api/users 엔드포인트 v2 설계`
|
|
261
|
+
- `/forgen:api-design 외부 파트너용 공개 API`
|
|
262
|
+
|
|
263
|
+
### 인자
|
|
264
|
+
- 설계할 API의 도메인, 타입(REST/GraphQL), 요구사항을 설명
|
|
265
|
+
- 인자 없으면 프로젝트 컨텍스트에서 API 설계 요구사항을 파악
|
|
266
|
+
</Arguments>
|
|
267
|
+
|
|
268
|
+
$ARGUMENTS
|