good-spec
npx skills add https://github.com/ssiumha/dots --skill good-spec
Agent 安装分布
Skill 文档
Good Spec
Addy Osmaniì “Good Spec” ìì¹ì 기ë°í íë¡ì í¸ ì¤í ìì± ê°ì´ëì ëë¤.
íµì¬ ì² í:
- ê³ ìì¤ ë¹ì ì ì â AIìê² ì¸ë¶ì¬í ìì
- 모ëì ë¶í : í ë²ì í ê°ì§ focused ìì
- ìì²´ ê²ì¦: ì²´í¬ë¦¬ì¤í¸ + LLM-as-a-Judge
- ì¤í ì§í: ë²ì ê´ë¦¬, SPEC.mdë¡ ì ì¥
6ê°ì§ íµì¬ ìì
| ìì | í´ê²°íë ì§ë¬¸ | íµì¬ ìì |
|---|---|---|
| Commands | “ì´ë»ê² ì¤ííëì?” | ê°ë°/í ì¤í¸/ë¹ë ëª ë ¹ì´ + ê²°ê³¼ |
| Testing | “ì´ë»ê² ê²ì¦íëì?” | íë ììí¬ + 커ë²ë¦¬ì§ ê¸°ì¤ |
| Project Structure | “ì´ëì ìì±íëì?” | ëë í 리 ìí + íì¼ ëª ëª ê·ì¹ |
| Code Style | “ì´ë»ê² ìì±íëì?” | â /â ìì (ì¤ëª < ìì) |
| Git Workflow | “ì´ë»ê² íì íëì?” | ë¸ëì¹/커ë°/PR ê·ì¹ |
| Boundaries | “무ìì íë©´/ë§ìì¼ íëì?” | Always/Ask/Never 3ë¨ê³ |
ìì¸ ìì± ê°ì´ë: resources/01-spec-template.md
ë³µì¬ì© í
í릿: templates/SPEC-template.md
3ë¨ê³ ê²½ê³ ìì¤í
ì¤íì ê°ì¥ ì¤ìí ë¶ë¶ì ê²½ê³ ì ìì ëë¤:
| ë 벨 | ì미 | ìì |
|---|---|---|
| â Always | íì ì¤í | í ì¤í¸ ì¤í, 컨벤ì ì¤ì, ë¦°í¸ ê²ì¬ |
| â ï¸ Ask First | ì¹ì¸ íì | DB ì¤í¤ë§ ë³ê²½, ìì¡´ì± ì¶ê°, API ë³ê²½ |
| ð« Never | ì ë ê¸ì§ | ìí¬ë¦¿ 커ë°, vendor í´ë í¸ì§, –force ìµì |
Phase 1: Discovery (ì구ì¬í íì )
ì íë¡ì í¸ ëë 기존 íë¡ì í¸ ì¤í ìì± ì:
-
íë¡ì í¸ ì»¨í ì¤í¸ íì
- íë¡ì í¸ ëª©ì ê³¼ ë²ì
- 기ì ì¤í íì¸
- í êµ¬ì± (ê°ë°ì ì, ìí )
- 기존 문ì ê²í (README.md, package.json ë±)
-
íì¬ ìí ë¶ì
- 기존 SPEC.md ëë CLAUDE.md ì¡´ì¬ ì¬ë¶
- íë¡ì í¸ êµ¬ì¡° íì
(
Glob,lsíì©) - 주ì ëª ë ¹ì´ íì¸ (package.json scripts, Makefile ë±)
-
íµì¬ ì§ë¬¸ ëì¶
- “ì´ë¤ ëª ë ¹ì´ë¡ í ì¤í¸íëì?”
- “ì½ë ì¤íì¼ ê°ì´ëê° ìëì?”
- “AIê° ìì íë©´ ì ëë íì¼ì´ ìëì?”
-
ì¬ì©ì íì¸
- íì í 컨í ì¤í¸ ê³µì
- ëë½ë ì ë³´ íì¸
- Phase 2ë¡ ì§í ëì
ì¤ì ìì¹
- ìì ì°ì : ì¤ëª 3ë¨ë½ < ìì 1ê°
- 구체ì±: “ì ì í” “ê°ë¥íë©´” ê¸ì§, 구체ì ê¸°ì¤ ëª ì
- ê²½ê³ê° íµì¬: Always/Ask/Never ëª íí 구ë¶
- ì¤í ê°ë¥: 모ë ëª ë ¹ì´ ê²ì¦ ê°ë¥
- ì§í: ì¤íì ì´ììë 문ì, ì 기 ì ë°ì´í¸
Phase 2: Formulation (ì¤í ìì±)
6ê° ììì ììëë¡ ìì±í©ëë¤. ê° ììì ìì¸ ììì ìì± ê°ì´ëë resources/01-spec-template.md를 참조íì¸ì.
ìì 1: Commands
- ê°ë°/í ì¤í¸/ë¹ë ëª ë ¹ì´ ëì´
- 주ìì¼ë¡ í¬í¸, ê²½ë¡, 기ë ê²°ê³¼ ëª ì
- ìµì ì구ì¬í ê¸°ì¬ (ì: coverage 80%)
ìì 2: Testing
- íë ììí¬ ëª ì (Jest, Vitest, Playwright ë±)
- í
ì¤í¸ íì¼ ìì¹ í¨í´ (
src/**/*.test.ts) - 커ë²ë¦¬ì§ 기ëì¹ (ì ì²´, critical paths 구ë¶)
- í ì¤í¸ ëª ëª ê·ì¹
ìì 3: Project Structure
- 주ì ëë í ë¦¬ë§ (3-7ê°)
- ê° ëë í 리 ìí 주ì
- ìë ìì± í´ë íì (
dist/,node_modules/)
ìì 4: Code Style
- ì¤ëª 3ë¨ë½ë³´ë¤ ìì 1ê°ê° í¨ê³¼ì
- â /â ë¹êµ íì íì
- ì¤ì íë¡ì í¸ ì½ëìì ì¶ì¶
- í¨ì, ì»´í¬ëí¸, ìë¬ ì²ë¦¬ ë± ì¹´í ê³ ë¦¬ë³ ìì
ìì 5: Git Workflow
- ë¸ëì¹ ëª
ëª
í¨í´ (
feat/,fix/,refactor/) - ì»¤ë° ë©ìì§ íì (Conventional Commits)
- PR ì²´í¬ë¦¬ì¤í¸
- ë¨¸ì§ ì ëµ (Squash/Merge/Rebase)
ìì 6: Boundaries (ê°ì¥ ì¤ì!)
3ë¨ê³ ê²½ê³ ìì¤í (ìë¨ í ì´ë¸ 참조) ì ì©:
- 3ë¨ê³ ëª íí êµ¬ë¶ (Always/Ask First/Never)
- 구체ì íì¼/ëª ë ¹ì´ ëª ì (“ì¤ìí íì¼” â â “src/config/*.json” â )
- Never í목ì ë³´ì/ìì ì± ì¤ì¬
Phase 3: Validation (ê²ì¦)
ì¤í ìì± í ìì²´ ê²ì¦:
ì²´í¬ë¦¬ì¤í¸
- 6ê° ìì 모ë ìì±ë¨
- ê° ëª ë ¹ì´ì ì¤ëª í¬í¨ (í¬í¸, ê²½ë¡, ê²°ê³¼)
- Code Styleì â /â ìì í¬í¨
- Boundaries 3ë¨ê³ (Always/Ask/Never) ëª íí 구ë¶
- 모ë ëª ë ¹ì´ ì¤ì ì¤í ê°ë¥
- 모í¸í íí ìì (“ì ì í”, “ê°ë¥íë©´” ê¸ì§)
AI Red Flags ð¨
ë¤ì ì§í ë°ê²¬ ì ì¦ì ì¤ë¨íê³ Phase 2ë¡ ëìê°ê¸°:
- ð¨ Boundaries ìì – ì¤íì ê°ì¥ ì¤ìí ë¶ë¶ ëë½
- ð¨ ì¤ëª ë§ ìê³ ìì ìì – Code Styleì ë°ëì ì½ë ìì í¬í¨
- ð¨ ì¤í ë¶ê°ë¥í ëª ë ¹ì´ – 모ë Commandsë ê²ì¦ ê°ë¥í´ì¼ í¨
- ð¨ 모í¸í Boundaries – “ì¤ìí íì¼ ìì ê¸ì§” â â “src/config/*.json ìì ê¸ì§” â
LLM-as-a-Judge (ì í)
ë¤ì ì¤íì ê²í íê³ ê°ì ì ì ì ìí´ì£¼ì¸ì:
1. ëë½ë ì ë³´ê° ìëì?
2. 모í¸í ííì´ ìëì?
3. ììê° ì¶©ë¶íê°ì?
Phase 4: Evolution (ì¤í ì§í)
ì¤íì íë¡ì í¸ì í¨ê» ì§íí´ì¼ í©ëë¤:
-
ë²ì ê´ë¦¬
# SPEC.md Version: 2.1.0 Last Updated: 2026-01-19 -
ë³ê²½ ì´ë ¥
## Changelog ### 2.1.0 (2026-01-19) - Added E2E testing with Playwright - Updated Node.js version to 20.x ### 2.0.0 (2025-12-01) - Migrated to TypeScript - Introduced strict boundary rules -
ì 기 리뷰
- ì 1í ëë major change ì
- ì íì ì¨ë³´ë© í í¼ëë°± ë°ì
- AI ì¬ì© ì¤ ë°ë³µëë 문ì ë°ê²¬ ì
-
ì¤í ê°ì í¸ë¦¬ê±°
- AIê° Ask First를 ì주 ìë° â Neverë¡ ì¹ê²©
- ìë¡ì´ ë구 ëì (ì: ì í ì¤í¸ íë ììí¬)
- í 컨벤ì ë³ê²½
Examples
ì ê· íë¡ì í¸ ì¤í ìì±
User: "ì Next.js íë¡ì í¸ ì¤í ìì±í´ì¤"
AI ëª
ë ¹ íë¦:
1. Glob "package.json" + Read package.json (기ì ì¤í íì
)
2. Glob "**/*" (íë¡ì í¸ êµ¬ì¡° íì
)
3. Phase 1: ì¬ì©ììê² ì»¨í
ì¤í¸ íì¸
- "Next.js 14, TypeScript, Tailwind CSS ì¬ì© ì¤ì´ìë¤ì"
- "í
ì¤í¸ íë ììí¬ë ì´ë¤ 걸 ì¬ì©íìëì? (Jest/Vitest)"
4. Phase 2: 6ê° ìì ìì±
- Commands: package.json scripts 기ë°
- Testing: ëµë³ë°ì íë ììí¬ ê¸°ë°
- Project Structure: íì¬ ëë í 리 구조 ë°ì
- Code Style: Next.js ëª¨ë² ì¬ë¡ + TypeScript
- Git Workflow: Conventional Commits
- Boundaries: Next.js í¹ì íì¼ (next.config.js ë±) ë³´í¸
5. Phase 3: ê²ì¦ ì²´í¬ë¦¬ì¤í¸ íì¸
6. Write SPEC.md
기존 íë¡ì í¸ ì¤í ê°ì
User: "SPEC.mdì E2E í
ì¤í¸ ì ì±
ì¶ê°í´ì¤"
AI ëª
ë ¹ íë¦:
1. Read SPEC.md (íì¬ ì¤í íì
)
2. Phase 1: íì¬ E2E í
ì¤í¸ ìí íì¸
- "Playwright ì¬ì©íìëì, Cypressì¸ê°ì?"
- "E2E í
ì¤í¸ íì¼ì ì´ëì ìì¹íëì?"
3. Phase 2: ê´ë ¨ ìì ì
ë°ì´í¸
- Testing ìì: E2E íë ììí¬, íì¼ ìì¹, 커ë²ë¦¬ì§ ì¶ê°
- Commands ìì: E2E ì¤í ëª
ë ¹ ì¶ê° (`npm run test:e2e`)
- Boundaries: E2E í
ì¤í¸ Always ê·ì¹ ì¶ê°
4. Phase 3: ê²ì¦
5. Phase 4: ë²ì ì
ë°ì´í¸ (1.0.0 â 1.1.0), Changelog ì¶ê°
6. Edit SPEC.md
Boundaries ê°í
User: "AIê° ì꾸 .env íì¼ ìì íë ¤ê³ í´"
AI ëª
ë ¹ íë¦:
1. Read SPEC.md
2. Phase 1: íì¬ Boundaries íì¸
3. Phase 2: Never ì¹ì
ì ëª
ìì ì¶ê°
ð« Never (ì ë ê¸ì§)
- â Commit or edit
.envfiles (use.env.examplefor templates) - â Hardcode API keys, passwords, tokens
4. Phase 3: ê²ì¦
5. Edit SPEC.md
6. ì¬ì©ììê² ë³ê²½ì¬í ê³µì
---
## Technical Details
### ìì¸ í
í릿
- `resources/01-spec-template.md`: 6ê° ìì ìì¸ ì¤ëª
+ ìì± ìì
- `templates/SPEC-template.md`: ë³µì¬í´ì ë°ë¡ ì¬ì© ê°ë¥í í
í릿
### 참조 리ìì¤
- Addy Osmaniì ì본 ê°ì´ë: https://addyosmani.com/blog/good-spec/
- ldoc skill: ì구ì¬í 문ìíì ì°ê³
- bdd-practices: Testing ìì ìì± ì ìëë¦¬ì¤ íì©