@wooojin/forgen 0.4.7 → 0.4.9
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 +1 -1
- package/CHANGELOG.md +40 -0
- package/assets/dev-guide/be/README.md +226 -0
- package/assets/dev-guide/be/adapters/build-agents-md.sh +63 -0
- package/assets/dev-guide/be/principles/common.md +433 -0
- package/assets/dev-guide/be/principles/go.md +469 -0
- package/assets/dev-guide/be/principles/node.md +388 -0
- package/assets/dev-guide/be/skills/go/be-build/SKILL.md +262 -0
- package/assets/dev-guide/be/skills/go/be-perf/SKILL.md +308 -0
- package/assets/dev-guide/be/skills/go/be-review/SKILL.md +119 -0
- package/assets/dev-guide/be/skills/go/be-security/SKILL.md +362 -0
- package/assets/dev-guide/be/skills/node/be-build/SKILL.md +239 -0
- package/assets/dev-guide/be/skills/node/be-perf/SKILL.md +272 -0
- package/assets/dev-guide/be/skills/node/be-review/SKILL.md +118 -0
- package/assets/dev-guide/be/skills/node/be-security/SKILL.md +355 -0
- package/assets/dev-guide/be/sources/12factor/INDEX.md +53 -0
- package/assets/dev-guide/be/sources/api-design/INDEX.md +56 -0
- package/assets/dev-guide/be/sources/ddia/INDEX.md +55 -0
- package/assets/dev-guide/be/sources/go-runtime/INDEX.md +62 -0
- package/assets/dev-guide/be/sources/node-runtime/INDEX.md +60 -0
- package/assets/dev-guide/be/sources/otel/INDEX.md +53 -0
- package/assets/dev-guide/be/sources/owasp-api/INDEX.md +52 -0
- package/assets/dev-guide/be/sources/postgres/INDEX.md +55 -0
- package/assets/dev-guide/be/sources/sre-book/INDEX.md +48 -0
- package/assets/dev-guide/fe/README.md +197 -0
- package/assets/dev-guide/fe/adapters/build-agents-md.sh +63 -0
- package/assets/dev-guide/fe/adapters/refresh.sh +68 -0
- package/assets/dev-guide/fe/principles/common.md +160 -0
- package/assets/dev-guide/fe/principles/react.md +183 -0
- package/assets/dev-guide/fe/principles/vue.md +196 -0
- package/assets/dev-guide/fe/skills/react/fe-build/SKILL.md +139 -0
- package/assets/dev-guide/fe/skills/react/fe-perf/SKILL.md +179 -0
- package/assets/dev-guide/fe/skills/react/fe-review/SKILL.md +141 -0
- package/assets/dev-guide/fe/skills/vue/fe-build/SKILL.md +148 -0
- package/assets/dev-guide/fe/skills/vue/fe-perf/SKILL.md +163 -0
- package/assets/dev-guide/fe/skills/vue/fe-review/SKILL.md +136 -0
- package/assets/dev-guide/fe/sources/a11y-dx/INDEX.md +41 -0
- package/assets/dev-guide/fe/sources/a11y-dx/chrome-devtools-memory.md +150 -0
- package/assets/dev-guide/fe/sources/a11y-dx/chrome-devtools-performance.md +99 -0
- package/assets/dev-guide/fe/sources/a11y-dx/lighthouse-audits.md +146 -0
- package/assets/dev-guide/fe/sources/a11y-dx/react-devtools-profiler.md +128 -0
- package/assets/dev-guide/fe/sources/a11y-dx/wcag22-new-criteria.md +174 -0
- package/assets/dev-guide/fe/sources/perf/01-core-web-vitals.md +58 -0
- package/assets/dev-guide/fe/sources/perf/02-inp.md +83 -0
- package/assets/dev-guide/fe/sources/perf/03-lcp-cls.md +130 -0
- package/assets/dev-guide/fe/sources/perf/04-speculation-rules.md +148 -0
- package/assets/dev-guide/fe/sources/perf/05-view-transitions.md +153 -0
- package/assets/dev-guide/fe/sources/perf/06-nextjs-caching.md +188 -0
- package/assets/dev-guide/fe/sources/perf/07-server-components.md +181 -0
- package/assets/dev-guide/fe/sources/perf/08-ppr.md +133 -0
- package/assets/dev-guide/fe/sources/perf/09-nextjs-image.md +200 -0
- package/assets/dev-guide/fe/sources/perf/10-optimize-lcp.md +201 -0
- package/assets/dev-guide/fe/sources/perf/INDEX.md +88 -0
- package/assets/dev-guide/fe/sources/react/INDEX.md +41 -0
- package/assets/dev-guide/fe/sources/react/keeping-components-pure.md +135 -0
- package/assets/dev-guide/fe/sources/react/no-effect-patterns.md +183 -0
- package/assets/dev-guide/fe/sources/react/react-compiler.md +182 -0
- package/assets/dev-guide/fe/sources/react/server-components.md +194 -0
- package/assets/dev-guide/fe/sources/react/server-functions.md +192 -0
- package/assets/dev-guide/fe/sources/react/suspense.md +218 -0
- package/assets/dev-guide/fe/sources/react/use-action-state.md +123 -0
- package/assets/dev-guide/fe/sources/react/use-form-status.md +158 -0
- package/assets/dev-guide/fe/sources/react/use-hook.md +153 -0
- package/assets/dev-guide/fe/sources/react/use-optimistic.md +194 -0
- package/assets/dev-guide/fe/sources/toss-ff/INDEX.md +58 -0
- package/assets/dev-guide/fe/sources/toss-ff/cohesion-code-directory.md +79 -0
- package/assets/dev-guide/fe/sources/toss-ff/cohesion-form-fields.md +110 -0
- package/assets/dev-guide/fe/sources/toss-ff/cohesion-magic-number.md +47 -0
- package/assets/dev-guide/fe/sources/toss-ff/coupling-item-edit-modal.md +124 -0
- package/assets/dev-guide/fe/sources/toss-ff/coupling-use-bottom-sheet.md +57 -0
- package/assets/dev-guide/fe/sources/toss-ff/coupling-use-page-state.md +71 -0
- package/assets/dev-guide/fe/sources/toss-ff/overview-4-principles.md +77 -0
- package/assets/dev-guide/fe/sources/toss-ff/predictability-hidden-logic.md +59 -0
- package/assets/dev-guide/fe/sources/toss-ff/predictability-http.md +77 -0
- package/assets/dev-guide/fe/sources/toss-ff/predictability-use-user.md +110 -0
- package/assets/dev-guide/fe/sources/toss-ff/readability-comparison-order.md +52 -0
- package/assets/dev-guide/fe/sources/toss-ff/readability-condition-name.md +64 -0
- package/assets/dev-guide/fe/sources/toss-ff/readability-login-start-page.md +183 -0
- package/assets/dev-guide/fe/sources/toss-ff/readability-magic-number.md +53 -0
- package/assets/dev-guide/fe/sources/toss-ff/readability-submit-button.md +73 -0
- package/assets/dev-guide/fe/sources/toss-ff/readability-ternary-operator.md +38 -0
- package/assets/dev-guide/fe/sources/toss-ff/readability-use-page-state.md +77 -0
- package/assets/dev-guide/fe/sources/toss-ff/readability-user-policy.md +98 -0
- package/assets/dev-guide/fe/sources/vue/INDEX.md +17 -0
- package/assets/dev-guide/fe/sources/vue/composition-api.md +251 -0
- package/assets/dev-guide/fe/sources/vue/nuxt-data-fetching.md +232 -0
- package/assets/dev-guide/fe/sources/vue/pinia-state-management.md +134 -0
- package/assets/dev-guide/fe/sources/vue/reactivity-pitfalls.md +261 -0
- package/assets/dev-guide/fe/sources/vue/style-guide-priority-a.md +117 -0
- package/assets/dev-guide/fe/sources/vue/style-guide-priority-b.md +231 -0
- package/assets/dev-guide/fe/sources/vue/style-guide-priority-c.md +86 -0
- package/assets/dev-guide/fe/sources/vue/style-guide-priority-d.md +72 -0
- package/dist/checks/self-score-deflation.js +6 -4
- package/dist/cli.js +47 -2
- package/dist/core/auto-compound-runner.js +6 -2
- package/dist/core/dashboard-cli.d.ts +12 -0
- package/dist/core/dashboard-cli.js +226 -0
- package/dist/core/dashboard.js +2 -2
- package/dist/core/dev-guide-injector.d.ts +26 -0
- package/dist/core/dev-guide-injector.js +137 -0
- package/dist/core/doctor.d.ts +10 -0
- package/dist/core/doctor.js +49 -8
- package/dist/core/harness.js +8 -2
- package/dist/core/init.js +53 -0
- package/dist/core/inspect-cli.js +4 -4
- package/dist/core/lifecycle-classifier.d.ts +23 -0
- package/dist/core/lifecycle-classifier.js +104 -0
- package/dist/core/migrate-evidence-host.js +1 -1
- package/dist/core/notify.js +7 -0
- package/dist/core/observability-backfill.d.ts +31 -0
- package/dist/core/observability-backfill.js +178 -0
- package/dist/core/observability-store.d.ts +58 -0
- package/dist/core/observability-store.js +195 -0
- package/dist/core/paths.d.ts +16 -2
- package/dist/core/paths.js +16 -2
- package/dist/core/session-store.d.ts +12 -1
- package/dist/core/session-store.js +77 -1
- package/dist/core/spawn.d.ts +17 -0
- package/dist/core/spawn.js +191 -8
- package/dist/core/statusline-cli.js +34 -1
- package/dist/core/v1-bootstrap.d.ts +7 -0
- package/dist/core/v1-bootstrap.js +28 -6
- package/dist/engine/compound-extractor.js +40 -1
- package/dist/engine/compound-loop.js +6 -0
- package/dist/engine/compound-retire.d.ts +20 -0
- package/dist/engine/compound-retire.js +85 -0
- package/dist/engine/learn-cli.js +2 -2
- package/dist/engine/lifecycle/bypass-detector.js +3 -2
- package/dist/engine/lifecycle/meta-reclassifier.js +1 -1
- package/dist/engine/lifecycle/signals.js +2 -2
- package/dist/engine/lifecycle/trigger-t1-correction.js +1 -1
- package/dist/engine/solution-candidate.js +1 -1
- package/dist/engine/solution-outcomes.js +1 -1
- package/dist/engine/solution-quarantine.js +1 -1
- package/dist/engine/solution-weakness.js +8 -2
- package/dist/forge/cli.js +1 -1
- package/dist/hooks/context-guard.js +25 -1
- package/dist/hooks/keyword-detector.js +1 -1
- package/dist/hooks/post-tool-use.js +48 -0
- package/dist/hooks/secret-filter.js +2 -2
- package/dist/hooks/shared/hook-response.js +1 -1
- package/dist/hooks/shared/hook-timing.js +3 -3
- package/dist/hooks/solution-injector.js +94 -1
- package/dist/hooks/stop-guard.js +3 -3
- package/dist/host/install-claude.d.ts +6 -2
- package/dist/host/install-claude.js +74 -2
- package/dist/host/install-codex.d.ts +4 -0
- package/dist/host/install-codex.js +72 -1
- package/dist/host/install-orchestrator.js +1 -0
- package/dist/mcp/tools.js +1 -1
- package/dist/preset/facet-catalog.js +2 -2
- package/dist/renderer/rule-renderer.js +7 -7
- package/dist/store/compound-usage-store.js +1 -1
- package/dist/store/implicit-feedback-store.js +2 -2
- package/dist/store/profile-store.d.ts +11 -0
- package/dist/store/profile-store.js +23 -0
- package/package.json +6 -6
- package/plugin.json +1 -1
- package/scripts/postinstall.js +134 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: OWASP API Security Top 10 문서 인덱스
|
|
3
|
+
fetched: 예정 (2026-05-18 스캐폴드)
|
|
4
|
+
license: CC BY-SA 4.0 (https://owasp.org)
|
|
5
|
+
priority: 3 (출처 우선순위)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# OWASP API Security Top 10 (2023)
|
|
9
|
+
|
|
10
|
+
> 가장 위험한 API 보안 취약점 10가지. 2023년판 (2019년 대비 갱신).
|
|
11
|
+
|
|
12
|
+
## 출처
|
|
13
|
+
|
|
14
|
+
| URL | 설명 |
|
|
15
|
+
|-----|------|
|
|
16
|
+
| https://owasp.org/API-Security/editions/2023/en/0x00-header/ | OWASP API Security Top 10 2023 |
|
|
17
|
+
| https://github.com/OWASP/API-Security | GitHub 원본 |
|
|
18
|
+
| https://owasp.org/www-project-api-security/ | 프로젝트 페이지 |
|
|
19
|
+
|
|
20
|
+
## 라이선스
|
|
21
|
+
|
|
22
|
+
Creative Commons Attribution-ShareAlike 4.0 (CC BY-SA 4.0)
|
|
23
|
+
|
|
24
|
+
## 수집일
|
|
25
|
+
|
|
26
|
+
예정 (2026-05-18 스캐폴드)
|
|
27
|
+
|
|
28
|
+
## 참조 우선순위
|
|
29
|
+
|
|
30
|
+
3 (common.md 출처 우선순위)
|
|
31
|
+
|
|
32
|
+
## 문서 목록 (수집 예정)
|
|
33
|
+
|
|
34
|
+
| 파일명 (예정) | 항목 | 제목 |
|
|
35
|
+
|--------------|------|------|
|
|
36
|
+
| api1-bola.md | API1 | Broken Object Level Authorization |
|
|
37
|
+
| api2-broken-auth.md | API2 | Broken Authentication |
|
|
38
|
+
| api3-bopla.md | API3 | Broken Object Property Level Authorization |
|
|
39
|
+
| api4-unrestricted-consumption.md | API4 | Unrestricted Resource Consumption |
|
|
40
|
+
| api5-bfla.md | API5 | Broken Function Level Authorization |
|
|
41
|
+
| api6-ssrf.md | API6 | Unrestricted Access to Sensitive Business Flows |
|
|
42
|
+
| api7-ssrf.md | API7 | Server Side Request Forgery |
|
|
43
|
+
| api8-misconfig.md | API8 | Security Misconfiguration |
|
|
44
|
+
| api9-inventory.md | API9 | Improper Inventory Management |
|
|
45
|
+
| api10-unsafe-apis.md | API10 | Unsafe Consumption of APIs |
|
|
46
|
+
|
|
47
|
+
## 핵심 참조 원칙 (principles/common.md 연결)
|
|
48
|
+
|
|
49
|
+
- 전체 → Security E.4 OWASP API Top 10 매핑 테이블
|
|
50
|
+
- API1 (BOLA) → E.2 인증/인가 분리 (소유권 검증)
|
|
51
|
+
- API4 (Rate Limit) → E.1 입력 검증 경계
|
|
52
|
+
- API7 (SSRF) → E.1 신뢰 경계
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: PostgreSQL 성능 및 인덱스 문서 인덱스
|
|
3
|
+
fetched: 예정 (2026-05-18 스캐폴드)
|
|
4
|
+
license: PostgreSQL License + CC BY-NC 4.0 (Use The Index, Luke)
|
|
5
|
+
priority: 6 (출처 우선순위)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# PostgreSQL — Use The Index, Luke + 공식 성능 가이드
|
|
9
|
+
|
|
10
|
+
> 인덱스 설계, 실행 계획, 슬로우 쿼리 최적화.
|
|
11
|
+
|
|
12
|
+
## 출처
|
|
13
|
+
|
|
14
|
+
| URL | 설명 | 라이선스 |
|
|
15
|
+
|-----|------|----------|
|
|
16
|
+
| https://use-the-index-luke.com/ | Use The Index, Luke — Markus Winand | CC BY-NC 4.0 |
|
|
17
|
+
| https://www.postgresql.org/docs/current/performance-tips.html | PostgreSQL 공식 성능 가이드 | PostgreSQL License |
|
|
18
|
+
| https://www.postgresql.org/docs/current/indexes.html | 인덱스 유형 | PostgreSQL License |
|
|
19
|
+
| https://www.postgresql.org/docs/current/using-explain.html | EXPLAIN 사용법 | PostgreSQL License |
|
|
20
|
+
| https://www.postgresql.org/docs/current/transaction-iso.html | 트랜잭션 격리 수준 | PostgreSQL License |
|
|
21
|
+
|
|
22
|
+
## 라이선스
|
|
23
|
+
|
|
24
|
+
- PostgreSQL 공식 문서: PostgreSQL License (자유 사용)
|
|
25
|
+
- Use The Index, Luke: CC BY-NC 4.0 (비상업적 이용)
|
|
26
|
+
|
|
27
|
+
## 수집일
|
|
28
|
+
|
|
29
|
+
예정 (2026-05-18 스캐폴드)
|
|
30
|
+
|
|
31
|
+
## 참조 우선순위
|
|
32
|
+
|
|
33
|
+
6 (common.md 출처 우선순위)
|
|
34
|
+
|
|
35
|
+
## 문서 목록 (수집 예정)
|
|
36
|
+
|
|
37
|
+
| 파일명 (예정) | 출처 | 주제 |
|
|
38
|
+
|--------------|------|------|
|
|
39
|
+
| index-basics.md | UTIL | B-Tree 인덱스 동작 원리 |
|
|
40
|
+
| composite-index.md | UTIL | 복합 인덱스 설계 (컬럼 순서) |
|
|
41
|
+
| covering-index.md | UTIL | Index-Only Scan (covering index) |
|
|
42
|
+
| index-on-expressions.md | UTIL | 함수/표현식 인덱스 |
|
|
43
|
+
| partial-index.md | UTIL | 부분 인덱스 (WHERE 조건 포함) |
|
|
44
|
+
| explain-analyze.md | PG 공식 | EXPLAIN ANALYZE 읽는 법 |
|
|
45
|
+
| slow-query.md | PG 공식 | pg_stat_statements + 슬로우 쿼리 |
|
|
46
|
+
| vacuum-autovacuum.md | PG 공식 | VACUUM / Autovacuum 설정 |
|
|
47
|
+
| transaction-isolation.md | PG 공식 | 격리 수준 (RC/RR/Serializable) |
|
|
48
|
+
| locking.md | PG 공식 | Row-level locking, deadlock |
|
|
49
|
+
|
|
50
|
+
## 핵심 참조 원칙 (principles/common.md 연결)
|
|
51
|
+
|
|
52
|
+
- Index design → DB G.3 인덱스 의도 주석
|
|
53
|
+
- EXPLAIN ANALYZE → be-perf N+1 진단
|
|
54
|
+
- Transaction isolation → DB G.1 트랜잭션 경계
|
|
55
|
+
- Locking → be-perf lock contention 카테고리
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Google SRE Book 문서 인덱스
|
|
3
|
+
fetched: 예정 (2026-05-18 스캐폴드)
|
|
4
|
+
license: CC BY-NC-ND 4.0 (https://sre.google/books/)
|
|
5
|
+
priority: 2 (출처 우선순위)
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Google SRE Book
|
|
9
|
+
|
|
10
|
+
> Site Reliability Engineering — Google의 운영 철학. SLO, Error Budget, Toil, Observability.
|
|
11
|
+
|
|
12
|
+
## 출처
|
|
13
|
+
|
|
14
|
+
| URL | 설명 |
|
|
15
|
+
|-----|------|
|
|
16
|
+
| https://sre.google/sre-book/table-of-contents/ | SRE Book (온라인) |
|
|
17
|
+
| https://sre.google/workbook/table-of-contents/ | SRE Workbook (온라인) |
|
|
18
|
+
|
|
19
|
+
## 라이선스
|
|
20
|
+
|
|
21
|
+
Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 (CC BY-NC-ND 4.0)
|
|
22
|
+
상업적 이용 및 변형 금지. 내부 참조 학습 목적으로만 사용.
|
|
23
|
+
|
|
24
|
+
## 수집일
|
|
25
|
+
|
|
26
|
+
예정 (2026-05-18 스캐폴드)
|
|
27
|
+
|
|
28
|
+
## 참조 우선순위
|
|
29
|
+
|
|
30
|
+
2 (common.md 출처 우선순위)
|
|
31
|
+
|
|
32
|
+
## 문서 목록 (수집 예정)
|
|
33
|
+
|
|
34
|
+
| 파일명 (예정) | 챕터 | 주제 |
|
|
35
|
+
|--------------|------|------|
|
|
36
|
+
| ch04-slo.md | 4 | SLOs — Service Level Objectives |
|
|
37
|
+
| ch06-monitoring.md | 6 | Monitoring Distributed Systems |
|
|
38
|
+
| ch12-on-call.md | 12 | Effective On-Call |
|
|
39
|
+
| ch17-testing.md | 17 | Testing for Reliability |
|
|
40
|
+
| ch26-data-integrity.md | 26 | Data Integrity |
|
|
41
|
+
| red-method.md | 참조 | RED Method (Rate/Errors/Duration) |
|
|
42
|
+
| four-golden-signals.md | 참조 | 4 Golden Signals |
|
|
43
|
+
|
|
44
|
+
## 핵심 참조 원칙 (principles/common.md 연결)
|
|
45
|
+
|
|
46
|
+
- 4 Golden Signals (latency, traffic, errors, saturation) → Observability C.2 RED Method
|
|
47
|
+
- SLO / Error Budget → Performance F.1 SLO 명시 의무
|
|
48
|
+
- Monitoring → Observability C.1 구조화 로그
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# fe-guide — 사내 프론트엔드 스킬 (Claude + Codex)
|
|
2
|
+
|
|
3
|
+
> AI 코딩 에이전트가 사내 합의된 FE 원칙대로 *구현 / 리뷰 / 성능 진단* 하게 만드는 스킬 번들.
|
|
4
|
+
> 단일 소스 (이 폴더), 양쪽 어댑터 (Claude SKILL.md / Codex AGENTS.md).
|
|
5
|
+
|
|
6
|
+
## 1. 무엇이 들어있는가
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
fe-guide/
|
|
10
|
+
├─ sources/ # 원본 코퍼스 (수집일 2026-05-18)
|
|
11
|
+
│ ├─ toss-ff/ Toss Frontend Fundamentals 4원칙 19파일
|
|
12
|
+
│ ├─ react/ React 19 + Compiler + RSC 11파일
|
|
13
|
+
│ ├─ vue/ Vue 3 + Pinia + Nuxt 9파일
|
|
14
|
+
│ ├─ perf/ web.dev (Core Web Vitals 2024 INP) + Next.js 16 캐싱 11파일
|
|
15
|
+
│ └─ a11y-dx/ WCAG 2.2 + Chrome/React DevTools 5파일
|
|
16
|
+
├─ principles/ # 합의 원칙 (코퍼스 위에서 사내 의사결정)
|
|
17
|
+
│ ├─ common.md 프레임워크 중립 (4원칙 + Vitals + WCAG)
|
|
18
|
+
│ ├─ react.md React/Next 특화
|
|
19
|
+
│ └─ vue.md Vue/Nuxt 특화
|
|
20
|
+
├─ skills/ # 실제 호출되는 스킬
|
|
21
|
+
│ ├─ react/{fe-build,fe-review,fe-perf}/SKILL.md
|
|
22
|
+
│ └─ vue/{fe-build,fe-review,fe-perf}/SKILL.md
|
|
23
|
+
├─ adapters/
|
|
24
|
+
│ ├─ build-agents-md.sh SKILL.md → Codex AGENTS.md 변환
|
|
25
|
+
│ └─ refresh.sh 코퍼스 재수집 워크플로우 (수동)
|
|
26
|
+
└─ README.md
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
3개 스킬 × 2개 스택 = **6개 스킬**:
|
|
30
|
+
|
|
31
|
+
| 스킬 | 호출 시점 | 무엇을 해주는가 |
|
|
32
|
+
|------|-----------|----------------|
|
|
33
|
+
| **fe-build** | "이 명세대로 구현해줘" | 명세→체크리스트→테스트 매핑 강제, 원칙대로 코드 작성 |
|
|
34
|
+
| **fe-review** | "이 PR 리뷰해줘" | `[SEVERITY] file:line — 이슈` 형식 리뷰 |
|
|
35
|
+
| **fe-perf** | "느려졌어 / 메모리 누는 것 같아" | DevTools 절차 + 흔한 패턴별 픽스 |
|
|
36
|
+
|
|
37
|
+
## 2. Claude Code 사용법
|
|
38
|
+
|
|
39
|
+
### 2.1 전역 설치 (모든 프로젝트에서 사용)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# 1. fe-guide 를 원하는 위치에 clone (또는 이미 받아둔 경로)
|
|
43
|
+
export FE_GUIDE_ROOT=~/work/fe-guide # 본인 환경에 맞게
|
|
44
|
+
|
|
45
|
+
# 2. ~/.claude/skills 에 심볼릭 링크
|
|
46
|
+
cd ~/.claude/skills
|
|
47
|
+
ln -s "$FE_GUIDE_ROOT/skills/react/fe-build" fe-build-react
|
|
48
|
+
ln -s "$FE_GUIDE_ROOT/skills/react/fe-review" fe-review-react
|
|
49
|
+
ln -s "$FE_GUIDE_ROOT/skills/react/fe-perf" fe-perf-react
|
|
50
|
+
ln -s "$FE_GUIDE_ROOT/skills/vue/fe-build" fe-build-vue
|
|
51
|
+
ln -s "$FE_GUIDE_ROOT/skills/vue/fe-review" fe-review-vue
|
|
52
|
+
ln -s "$FE_GUIDE_ROOT/skills/vue/fe-perf" fe-perf-vue
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
이후 Claude Code 에서:
|
|
56
|
+
```
|
|
57
|
+
/fe-build-react # 또는 자연어로 "fe-build-react 스킬로 이 명세 구현해줘"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 2.2 프로젝트별 설치 (저장소에 묶어 배포)
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
cd <your-repo>
|
|
64
|
+
mkdir -p .claude/skills
|
|
65
|
+
ln -s "$FE_GUIDE_ROOT/skills/react/fe-build" .claude/skills/fe-build
|
|
66
|
+
# 또는 git submodule / sparse-checkout 으로 fe-guide 자체를 묶음
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`.claude/skills/` 의 SKILL.md 는 Claude Code 가 자동 인식.
|
|
70
|
+
|
|
71
|
+
## 3. Codex CLI 사용법
|
|
72
|
+
|
|
73
|
+
Codex 는 프로젝트 루트의 `AGENTS.md` (또는 `~/.codex/AGENTS.md` 전역) 를 읽음.
|
|
74
|
+
|
|
75
|
+
### 3.1 AGENTS.md 생성
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
export FE_GUIDE_ROOT=~/work/fe-guide
|
|
79
|
+
export FE_GUIDE_SOURCE="사내 공유 fe-guide v2026-05-18 (배포: <본인 이름>)" # AGENTS.md 출처 표기용 (선택)
|
|
80
|
+
|
|
81
|
+
cd <your-repo>
|
|
82
|
+
"$FE_GUIDE_ROOT/adapters/build-agents-md.sh" react fe-build > AGENTS.md
|
|
83
|
+
|
|
84
|
+
# 또는 여러 스킬 합치기:
|
|
85
|
+
{
|
|
86
|
+
"$FE_GUIDE_ROOT/adapters/build-agents-md.sh" react fe-build
|
|
87
|
+
echo
|
|
88
|
+
"$FE_GUIDE_ROOT/adapters/build-agents-md.sh" react fe-review
|
|
89
|
+
echo
|
|
90
|
+
"$FE_GUIDE_ROOT/adapters/build-agents-md.sh" react fe-perf
|
|
91
|
+
} > AGENTS.md
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
생성된 `AGENTS.md` 는 Codex 가 매 세션 자동 로딩. principles/sources 는 같은 폴더에서 직접 참조 가능 (저장소 안에 fe-guide 포함하거나 심볼릭 링크).
|
|
95
|
+
|
|
96
|
+
### 3.2 sources/principles 도 같이 배포
|
|
97
|
+
|
|
98
|
+
`AGENTS.md` 가 `principles/common.md`, `sources/toss-ff/*` 를 참조하므로:
|
|
99
|
+
|
|
100
|
+
- **Option A** — `fe-guide/` 자체를 저장소에 git submodule 로 포함
|
|
101
|
+
- **Option B** — 빌드 시 `cp -R fe-guide/{principles,sources} <repo>/.fe-guide/` (배포물)
|
|
102
|
+
- **Option C** — 사내 npm 패키지로 배포 후 `node_modules/@company/fe-guide`
|
|
103
|
+
|
|
104
|
+
권장: **A (submodule)** — 버전 명시적, AI가 직접 참조 가능.
|
|
105
|
+
|
|
106
|
+
## 4. 사용 시나리오 예시
|
|
107
|
+
|
|
108
|
+
### 4.1 fe-build
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
사용자: 첨부한 요구사항 명세대로 주문 상세 페이지 구현해줘.
|
|
112
|
+
/fe-build-react
|
|
113
|
+
|
|
114
|
+
AI: ## 체크리스트
|
|
115
|
+
- [ ] R-01: "옵션은 그리드/셀렉트 두 종류이며, 셀렉트는 옵셔널이다"
|
|
116
|
+
- [ ] R-02: "..."
|
|
117
|
+
...
|
|
118
|
+
빠진 항목이 있으면 알려주세요. 없으면 매핑표 → TDD 들어갑니다.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 4.2 fe-review
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
사용자: PR #123 리뷰. 요구사항 명세는 attached.
|
|
125
|
+
/fe-review-react
|
|
126
|
+
|
|
127
|
+
AI: ## 리뷰 요약
|
|
128
|
+
- 변경: 8 files +312 -45
|
|
129
|
+
- HIGH 3, MED 5, LOW 2 / 머지 차단
|
|
130
|
+
|
|
131
|
+
[HIGH] src/pages/order/OrderForm.tsx:88 — select 옵션 옵셔널인데 검증에서 차단
|
|
132
|
+
...
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 4.3 fe-perf
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
사용자: 주문 페이지에서 옵션 선택할 때 INP가 480ms 나와. 잡아줘.
|
|
139
|
+
/fe-perf-react
|
|
140
|
+
|
|
141
|
+
AI: ## INP 진단
|
|
142
|
+
- 분류: CPU/렌더 병목
|
|
143
|
+
- 측정 절차: web-vitals/attribution 로 inputDelay/processing/presentation 분해...
|
|
144
|
+
- 가설: 핸들러 안 동기 필터링
|
|
145
|
+
- 검증 후 픽스: startTransition + useDeferredValue
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## 5. 유지보수
|
|
149
|
+
|
|
150
|
+
### 5.1 코퍼스 갱신
|
|
151
|
+
|
|
152
|
+
외부 사이트 (react.dev, web.dev 등) 가 자주 바뀌므로 **월 1회 수동 갱신** 권장:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
./adapters/refresh.sh --check # 마지막 수집 날짜 확인
|
|
156
|
+
./adapters/refresh.sh # 재수집 절차 안내
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
재수집은 Claude/Codex 에이전트에게 위임이 가장 안정:
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
sources/<dir>/INDEX.md 의 출처들을 최신화해서 같은 형식으로 재저장해줘
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 5.2 principles 수정 시
|
|
166
|
+
|
|
167
|
+
`principles/*.md` 는 사내 합의 문서. 수정 시:
|
|
168
|
+
1. 출처 (sources/ 또는 외부 URL) 명시
|
|
169
|
+
2. 변경 이력 PR 로 남김
|
|
170
|
+
3. 영향받는 SKILL.md 의 참조 위치 확인
|
|
171
|
+
|
|
172
|
+
### 5.3 새 스킬 추가
|
|
173
|
+
|
|
174
|
+
`skills/<stack>/<name>/SKILL.md` 한 파일 추가 + `adapters/build-agents-md.sh` 그대로 사용.
|
|
175
|
+
|
|
176
|
+
## 6. 출처 우선순위 (충돌 시)
|
|
177
|
+
|
|
178
|
+
코퍼스 간 충돌 발생 시 `principles/common.md` 에 명시된 순서 적용:
|
|
179
|
+
|
|
180
|
+
1. Toss FF (코드 품질 4원칙)
|
|
181
|
+
2. web.dev (성능 임계값)
|
|
182
|
+
3. WCAG 2.2 (접근성)
|
|
183
|
+
4. React.dev / Vue.js / Nuxt (프레임워크 공식)
|
|
184
|
+
5. Vercel / Meta engineering (벤더 권장)
|
|
185
|
+
|
|
186
|
+
사용자 영향 우선순위: **a11y > perf > 가독성**.
|
|
187
|
+
|
|
188
|
+
## 7. 라이선스 / 출처 주의
|
|
189
|
+
|
|
190
|
+
- Toss FF: Apache-2.0 (frontend-fundamentals)
|
|
191
|
+
- React.dev / web.dev: CC BY 4.0
|
|
192
|
+
- Vue.js / Nuxt: MIT
|
|
193
|
+
- 사내 배포 시 각 코퍼스 원본 출처 보존 (sources/<dir>/INDEX.md 에 명시됨)
|
|
194
|
+
|
|
195
|
+
## 8. 관련 문서
|
|
196
|
+
|
|
197
|
+
- fe-build/fe-review 의 "명세→체크리스트→테스트 매핑" 강제는 다수의 실패 사례에서 도출된 패턴 — 표시(UI 분기)와 검증(로직 분기) 불일치 회피가 핵심.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# build-agents-md.sh
|
|
3
|
+
#
|
|
4
|
+
# Claude SKILL.md (frontmatter + body) 를 Codex AGENTS.md 형식으로 변환.
|
|
5
|
+
#
|
|
6
|
+
# 사용법:
|
|
7
|
+
# ./adapters/build-agents-md.sh react fe-build > /path/to/project/AGENTS.md
|
|
8
|
+
# ./adapters/build-agents-md.sh vue fe-review
|
|
9
|
+
#
|
|
10
|
+
# 동작:
|
|
11
|
+
# 1. skills/<stack>/<skill>/SKILL.md 읽음
|
|
12
|
+
# 2. YAML frontmatter (name, description) 떼어내고 본문만 추출
|
|
13
|
+
# 3. AGENTS.md 표준 헤더로 감싸고 stdout 출력
|
|
14
|
+
#
|
|
15
|
+
# Codex CLI 는 프로젝트 루트의 AGENTS.md 를 자동으로 읽음 (또는 ~/.codex/AGENTS.md 전역).
|
|
16
|
+
# Claude Code 는 SKILL.md 를 직접 사용 (skill loader 가 frontmatter 인식).
|
|
17
|
+
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
if [[ $# -lt 2 ]]; then
|
|
21
|
+
echo "Usage: $0 <stack> <skill>" >&2
|
|
22
|
+
echo " stack: react | vue" >&2
|
|
23
|
+
echo " skill: fe-build | fe-review | fe-perf" >&2
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
STACK="$1"
|
|
28
|
+
SKILL="$2"
|
|
29
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
30
|
+
SKILL_FILE="$ROOT/skills/$STACK/$SKILL/SKILL.md"
|
|
31
|
+
|
|
32
|
+
if [[ ! -f "$SKILL_FILE" ]]; then
|
|
33
|
+
echo "Error: $SKILL_FILE not found" >&2
|
|
34
|
+
exit 2
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# frontmatter 파싱: 첫 --- 부터 두번째 --- 사이가 YAML
|
|
38
|
+
NAME=$(awk '/^---$/{c++; next} c==1 && /^name:/ {sub(/^name:[[:space:]]*/,""); print; exit}' "$SKILL_FILE")
|
|
39
|
+
DESC=$(awk '/^---$/{c++; next} c==1 && /^description:/ {sub(/^description:[[:space:]]*/,""); print; exit}' "$SKILL_FILE")
|
|
40
|
+
|
|
41
|
+
# 본문: 두번째 --- 이후
|
|
42
|
+
BODY=$(awk '/^---$/{c++; next} c>=2 {print}' "$SKILL_FILE")
|
|
43
|
+
|
|
44
|
+
cat <<EOF
|
|
45
|
+
# ${NAME:-$SKILL}
|
|
46
|
+
|
|
47
|
+
> ${DESC:-FE engineering guide for $STACK}
|
|
48
|
+
>
|
|
49
|
+
> Generated from \`skills/$STACK/$SKILL/SKILL.md\` on $(date +%Y-%m-%d).
|
|
50
|
+
> Source of truth: ${FE_GUIDE_SOURCE:-fe-guide (OSS skill bundle — set FE_GUIDE_SOURCE to override)}
|
|
51
|
+
|
|
52
|
+
## When to apply
|
|
53
|
+
|
|
54
|
+
When working on $STACK code in this repository, follow the guidance below.
|
|
55
|
+
You can also load the principles via:
|
|
56
|
+
|
|
57
|
+
- \`principles/common.md\` — framework-neutral rules
|
|
58
|
+
- \`principles/$STACK.md\` — $STACK-specific rules
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
$BODY
|
|
63
|
+
EOF
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# refresh.sh
|
|
3
|
+
#
|
|
4
|
+
# 코퍼스 재수집 — 이벤트 기반 (주기 X).
|
|
5
|
+
# 코드 컨벤션은 잘 안 바뀐다. 갱신이 필요한 건 다음 이벤트 발생 시:
|
|
6
|
+
#
|
|
7
|
+
# 1. React 메이저 버전 릴리스 (예: 19 → 20)
|
|
8
|
+
# 2. Next.js 메이저 버전 릴리스 (예: 16 → 17)
|
|
9
|
+
# 3. Vue/Nuxt 메이저 버전 릴리스
|
|
10
|
+
# 4. web.dev Core Web Vitals 변경 (예: 2024 FID → INP 교체)
|
|
11
|
+
# 5. WCAG 개정 (2.2 → 3.0 등, W3C 권고 발표)
|
|
12
|
+
# 6. Toss FF / Vercel / Google a11y 가이드 큰 개정 (블로그 공지)
|
|
13
|
+
#
|
|
14
|
+
# 사용법:
|
|
15
|
+
# ./adapters/refresh.sh # 이벤트 체크리스트 + 각 이벤트별 갱신 절차 출력
|
|
16
|
+
# ./adapters/refresh.sh --check # 코퍼스 마지막 수집 날짜 확인 (감시용)
|
|
17
|
+
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
21
|
+
SOURCES="$ROOT/sources"
|
|
22
|
+
|
|
23
|
+
if [[ "${1:-}" == "--check" ]]; then
|
|
24
|
+
echo "코퍼스 마지막 수집 날짜:"
|
|
25
|
+
for dir in "$SOURCES"/*/; do
|
|
26
|
+
name=$(basename "$dir")
|
|
27
|
+
if [[ -f "$dir/INDEX.md" ]]; then
|
|
28
|
+
date=$(grep -m1 -oE 'fetched: *[0-9]{4}-[0-9]{2}-[0-9]{2}' "$dir/INDEX.md" | awk '{print $2}' || echo "unknown")
|
|
29
|
+
count=$(find "$dir" -name "*.md" ! -name "INDEX.md" | wc -l | tr -d ' ')
|
|
30
|
+
printf " %-12s fetched=%s files=%s\n" "$name" "$date" "$count"
|
|
31
|
+
else
|
|
32
|
+
printf " %-12s (INDEX.md 없음)\n" "$name"
|
|
33
|
+
fi
|
|
34
|
+
done
|
|
35
|
+
exit 0
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
cat <<'EOF'
|
|
39
|
+
=== fe-guide 코퍼스 갱신 — 이벤트 트리거 ===
|
|
40
|
+
|
|
41
|
+
코드 컨벤션은 잘 안 바뀐다. 주기 갱신 X, 아래 이벤트 발생 시에만 해당 디렉토리 갱신.
|
|
42
|
+
|
|
43
|
+
┌─ 이벤트 ────────────────────────┬─ 갱신 대상 ──────────────────┬─ 영향받는 principles ─┐
|
|
44
|
+
│ React 메이저 (19→20 등) │ sources/react/ │ principles/react.md │
|
|
45
|
+
│ Next.js 메이저 (16→17 등) │ sources/perf/06-09.md │ principles/react.md │
|
|
46
|
+
│ Vue 메이저 (3→4) / Nuxt 메이저 │ sources/vue/ │ principles/vue.md │
|
|
47
|
+
│ web.dev Core Web Vitals 변경 │ sources/perf/01-03.md │ principles/common.md B│
|
|
48
|
+
│ WCAG 개정 (2.2→3.0 등) │ sources/a11y-dx/wcag22-*.md │ principles/common.md C│
|
|
49
|
+
│ Toss FF 신규 챕터 / 큰 개정 │ sources/toss-ff/ │ principles/common.md A│
|
|
50
|
+
│ Chrome DevTools 큰 UI 변경 │ sources/a11y-dx/chrome-*.md │ (스킬 fe-perf 절차) │
|
|
51
|
+
└─────────────────────────────────┴─────────────────────────────┴───────────────────────┘
|
|
52
|
+
|
|
53
|
+
체크 절차 (이벤트 발생 의심 시):
|
|
54
|
+
1. ./refresh.sh --check # 마지막 수집 날짜 확인
|
|
55
|
+
2. 위 표에서 해당 행 식별
|
|
56
|
+
3. Claude/Codex 에이전트에 위임 (가장 안정):
|
|
57
|
+
"fe-guide/sources/<dir>/INDEX.md 의 출처들을 최신화해서 같은 형식으로 재저장해줘"
|
|
58
|
+
4. 갱신 후 영향받는 principles/*.md 검토 → 합의 원칙 변경 필요한지 판단
|
|
59
|
+
5. principles 변경 시 PR 로 이력 남김 (사내 합의 문서)
|
|
60
|
+
|
|
61
|
+
이벤트 모니터링 (선택):
|
|
62
|
+
- React/Next 릴리스: github.com/facebook/react/releases, vercel/next.js/releases (RSS)
|
|
63
|
+
- Vue/Nuxt: github.com/vuejs/core/releases, nuxt/nuxt/releases
|
|
64
|
+
- web.dev/WCAG: web.dev/blog RSS, w3.org/WAI/standards-guidelines/wcag/
|
|
65
|
+
|
|
66
|
+
권장: 큰 이벤트는 보통 한미국·유럽 컨퍼런스 시즌(React Conf, Next.js Conf, Google I/O)에 발표됨.
|
|
67
|
+
그 직후 1주 안에 --check 한 번 돌리고 위 표 매칭이면 갱신.
|
|
68
|
+
EOF
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 공통 FE 원칙 (프레임워크 중립)
|
|
3
|
+
version: 2026-05-18
|
|
4
|
+
sources:
|
|
5
|
+
- sources/toss-ff/
|
|
6
|
+
- sources/perf/
|
|
7
|
+
- sources/a11y-dx/
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# 공통 FE 원칙
|
|
11
|
+
|
|
12
|
+
> 모든 프론트엔드 코드(React/Vue/Vanilla)에 적용되는 합의 원칙.
|
|
13
|
+
> 프레임워크 특화 가이드는 [`react.md`](./react.md), [`vue.md`](./vue.md) 참조.
|
|
14
|
+
|
|
15
|
+
## 출처 우선순위 (충돌 시)
|
|
16
|
+
|
|
17
|
+
1. **코드 품질**: Toss Frontend Fundamentals 4원칙 (가독성 > 예측성 > 응집도 > 결합도 순으로 검토)
|
|
18
|
+
2. **성능**: web.dev Core Web Vitals 임계값 (LCP ≤ 2.5s, INP ≤ 200ms, CLS ≤ 0.1)
|
|
19
|
+
3. **접근성**: WCAG 2.2 AA (2023.10 W3C 권고)
|
|
20
|
+
4. 충돌 시 — 사용자 영향 큰 쪽 우선 (a11y > perf > 가독성).
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## A. 코드 품질 4원칙 (Toss FF 기반)
|
|
25
|
+
|
|
26
|
+
각 원칙은 **트레이드오프 관계**다. 동시 만족 불가능 시 위 우선순위로 판단.
|
|
27
|
+
|
|
28
|
+
### A.1 가독성 (Readability) — 최우선
|
|
29
|
+
|
|
30
|
+
- **같이 실행되지 않는 코드는 분리**한다. 권한별 분기 한 컴포넌트 → 권한별 컴포넌트.
|
|
31
|
+
근거: `sources/toss-ff/readability-submit-button.md`
|
|
32
|
+
- **구현 상세는 추상화**한다. 로그인 체크 로직 노출 → `<AuthGuard>` 래퍼.
|
|
33
|
+
근거: `sources/toss-ff/readability-login-start-page.md`
|
|
34
|
+
- **로직 종류에 따라 함수를 쪼갠다**. "페이지 전체 쿼리파람 훅" 같은 다목적 훅 금지 → 파라미터별 독립 훅.
|
|
35
|
+
근거: `sources/toss-ff/readability-use-page-state.md`
|
|
36
|
+
- **복잡한 조건에 이름 붙인다**. 중첩 `filter().some()` 익명 → `const isSameCategory = ...`.
|
|
37
|
+
근거: `sources/toss-ff/readability-condition-name.md`
|
|
38
|
+
- **매직 넘버에 이름 붙인다**. `delay(300)` → `const ANIMATION_DELAY_MS = 300`.
|
|
39
|
+
- **시점 이동을 줄인다**. 3단계 이상의 객체 참조 추적 → 인라인 또는 1단계로 평탄화.
|
|
40
|
+
- **삼항 단순화**. 중첩 삼항 금지 → IIFE + early return.
|
|
41
|
+
- **수학 부등식 순서**. `b <= a && a <= c` (a를 가운데에).
|
|
42
|
+
|
|
43
|
+
### A.2 예측 가능성 (Predictability)
|
|
44
|
+
|
|
45
|
+
- **이름 충돌 회피**. 라이브러리 이름과 동일한 `http` 등 → `httpService.getWithAuth` 같은 구분자 부착.
|
|
46
|
+
- **같은 종류 함수는 반환 타입 통일**. 모든 데이터 훅은 React Query/SWR 등 *Query 객체* 반환으로 통일.
|
|
47
|
+
- **숨은 로직을 드러낸다**. `fetchBalance` 안에 logging 숨김 금지 → fetch는 fetch만, logging은 호출 측.
|
|
48
|
+
|
|
49
|
+
### A.3 응집도 (Cohesion)
|
|
50
|
+
|
|
51
|
+
- **함께 수정되는 파일은 같은 디렉토리에**. 모듈 종류별 flat 구조(`/components`, `/hooks`) 지양 → 도메인별 (`/order/components`, `/order/hooks`).
|
|
52
|
+
- **같이 변하는 상수는 한곳에 묶는다**. 애니메이션 길이 같은 결합 값을 분리하면 한쪽만 수정되는 버그 발생.
|
|
53
|
+
- **폼 응집 전략을 의도적으로 선택한다**. 필드 단위(react-hook-form) vs 폼 전체(zod) — 검증 요구사항에 따라.
|
|
54
|
+
|
|
55
|
+
### A.4 결합도 (Coupling)
|
|
56
|
+
|
|
57
|
+
- **책임 하나씩 관리**. 통합 훅은 수정 영향 범위가 폭발한다 → 책임별 분리.
|
|
58
|
+
- **중복을 허용하라**. 유사해 보이는 두 바텀시트의 공통화는 페이지별 분기를 만든다 → 차라리 중복.
|
|
59
|
+
근거: `sources/toss-ff/coupling-use-bottom-sheet.md` (반직관적이지만 매우 중요)
|
|
60
|
+
- **Props Drilling 제거**. 3단 이상 prop 전달 → Composition (`children`) 또는 Context.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## B. 성능 (Core Web Vitals 2024)
|
|
65
|
+
|
|
66
|
+
### B.1 임계값 (75퍼센타일 기준)
|
|
67
|
+
|
|
68
|
+
| 지표 | Good | Poor | 측정 시점 |
|
|
69
|
+
|------|------|------|-----------|
|
|
70
|
+
| **LCP** (Largest Contentful Paint) | ≤ 2.5s | > 4.0s | 로드 |
|
|
71
|
+
| **INP** (Interaction to Next Paint) | ≤ 200ms | > 500ms | 인터랙션 |
|
|
72
|
+
| **CLS** (Cumulative Layout Shift) | ≤ 0.1 | > 0.25 | 로드~수명 |
|
|
73
|
+
|
|
74
|
+
> **INP는 2024년 3월 FID를 대체했다.** FID는 첫 입력만 봤지만 INP는 페이지 수명 전체의 모든 인터랙션 응답성을 본다.
|
|
75
|
+
|
|
76
|
+
### B.2 LCP 개선 우선순위 (4 하위 구성 요소)
|
|
77
|
+
|
|
78
|
+
근거: `sources/perf/03-lcp-cls.md`, `sources/perf/10-optimize-lcp.md`
|
|
79
|
+
|
|
80
|
+
1. **TTFB** (서버 응답 + 리다이렉트) — 평균 40%
|
|
81
|
+
2. **Resource Load Delay** (LCP 자원 발견까지) — `<link rel="preload">`, `fetchpriority="high"`
|
|
82
|
+
3. **Resource Load Time** (다운로드) — 이미지 최적화, CDN
|
|
83
|
+
4. **Render Delay** (렌더링) — 클라이언트 측 렌더링 최소화
|
|
84
|
+
|
|
85
|
+
### B.3 INP 개선
|
|
86
|
+
|
|
87
|
+
근거: `sources/perf/02-inp.md`
|
|
88
|
+
|
|
89
|
+
- **Input Delay → Processing → Presentation Delay** 3단계 중 가장 큰 단계 식별
|
|
90
|
+
- 200ms 이상 Long Task 분할: `scheduler.yield()` (지원 시) 또는 `setTimeout(0)`
|
|
91
|
+
- 이벤트 핸들러 안의 동기 작업 최소화. React 18+ 는 `startTransition`으로 우선순위 낮춤.
|
|
92
|
+
|
|
93
|
+
### B.4 CLS 방지
|
|
94
|
+
|
|
95
|
+
- 이미지/iframe/광고에 `width`/`height` 명시 (또는 CSS `aspect-ratio`)
|
|
96
|
+
- 동적 콘텐츠 삽입은 `min-height` 예약
|
|
97
|
+
- 폰트 `font-display: optional` 또는 `size-adjust` 사용
|
|
98
|
+
|
|
99
|
+
### B.5 네트워크/네비게이션 (선택)
|
|
100
|
+
|
|
101
|
+
- **Speculation Rules API** — `<script type="speculationrules">` 로 즉시 페이지 전환 (Chrome 109+)
|
|
102
|
+
근거: `sources/perf/04-speculation-rules.md`
|
|
103
|
+
- **View Transitions API** — 페이지 전환 애니메이션 (Same-doc: Chrome 111+, Cross-doc: Chrome 126+)
|
|
104
|
+
근거: `sources/perf/05-view-transitions.md`
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## C. 접근성 (WCAG 2.2 AA)
|
|
109
|
+
|
|
110
|
+
근거: `sources/a11y-dx/wcag22-new-criteria.md`
|
|
111
|
+
|
|
112
|
+
### C.1 필수 (Level A/AA, 2.2 신규 9개 중 핵심)
|
|
113
|
+
|
|
114
|
+
| SC | 요건 | 코드/CSS 영향 |
|
|
115
|
+
|----|------|---------------|
|
|
116
|
+
| **2.4.11 Focus Not Obscured** (AA) | 포커스 받은 요소가 sticky header/footer에 가려지면 안 됨 | `scroll-padding-top` 등으로 보정 |
|
|
117
|
+
| **2.5.8 Target Size Minimum** (AA) | 인터랙티브 영역 최소 24×24 CSS px | 버튼/링크 `min-width/height: 24px` |
|
|
118
|
+
| **3.2.6 Consistent Help** (A) | 도움말 메커니즘의 위치/순서 일관성 | 헤더/푸터 도움말 위치 고정 |
|
|
119
|
+
| **3.3.7 Redundant Entry** (A) | 같은 정보 재입력 요구 금지 | 폼 자동 채움, autocomplete 속성 |
|
|
120
|
+
| **3.3.8 Accessible Authentication** (AA) | 인지 기능 의존 인증 금지 (CAPTCHA 등 대체 제공) | 패스키/생체/2FA 옵션 |
|
|
121
|
+
| **2.5.7 Dragging Movements** (AA) | 드래그 동작은 단일 포인터 대체 제공 | 드래그 슬라이더에 + / − 버튼 병행 |
|
|
122
|
+
|
|
123
|
+
### C.2 기존 핵심 (1.x / 2.x — 위반 시 즉시 픽스)
|
|
124
|
+
|
|
125
|
+
- **1.1.1 Non-text Content** — `<img alt>`, 장식 이미지는 `alt=""`
|
|
126
|
+
- **1.3.1 Info & Relationships** — 시멘틱 HTML (`<button>` vs `<div onClick>`)
|
|
127
|
+
- **1.4.3 Contrast (Minimum)** — 본문 4.5:1, 큰 글자 3:1
|
|
128
|
+
- **2.1.1 Keyboard** — 모든 기능 키보드 접근 가능
|
|
129
|
+
- **4.1.2 Name, Role, Value** — 폼 컨트롤 `<label>` 또는 `aria-label`
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## D. 안티패턴 카탈로그 (리뷰에서 즉시 [HIGH] 잡아라)
|
|
134
|
+
|
|
135
|
+
| 안티패턴 | 근거 | 픽스 |
|
|
136
|
+
|----------|------|------|
|
|
137
|
+
| 빈 catch 블록 | global rules/anti-pattern | 최소 로그 또는 re-throw |
|
|
138
|
+
| 50줄 초과 함수 | global rules | 책임별 분리 |
|
|
139
|
+
| 중첩 깊이 5+ | global rules | early return |
|
|
140
|
+
| 같은 파일 3+회 수정 | global rules | 전체 재설계 |
|
|
141
|
+
| 명세 옵셔널 항목을 검증 로직에서 필수 취급 | 표시(UI)와 검증(로직) 불일치 → 라이브 데모 즉시 적발 | 명세→체크리스트→테스트 라인 매핑 |
|
|
142
|
+
| 매직 넘버 인라인 | FF 가독성 | 상수로 추출 |
|
|
143
|
+
| 통합 훅 (모든 쿼리파람 등) | FF 결합도 | 책임별 분리 |
|
|
144
|
+
| Props 3단 드릴링 | FF 결합도 | Composition 또는 Context |
|
|
145
|
+
| 라이브러리 이름 재사용 (`http`, `axios`, `query`) | FF 예측성 | 구분자 부착 |
|
|
146
|
+
| 이미지 `width/height` 없음 | CLS | 명시 또는 `aspect-ratio` |
|
|
147
|
+
| `<div onClick>` 버튼 흉내 | WCAG 1.3.1, 2.1.1 | `<button>` 사용 |
|
|
148
|
+
| 포커스 안 보이는 `outline: none` | WCAG 2.4.7 | `:focus-visible` 별도 스타일 |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## E. 워크플로우 원칙 (메타)
|
|
153
|
+
|
|
154
|
+
> 근거: 명세 위반으로 인한 코드 리뷰/과제 실패 패턴 누적 관찰.
|
|
155
|
+
|
|
156
|
+
1. **명세 → 체크리스트 → 코드 + 테스트 라인 매핑표** 를 우선 작성. 장문 ARCHITECTURE 문서보다 가치 있음.
|
|
157
|
+
2. **임의 UX 결정은 명세 100% 충족 후에만**. 명세가 모호한 부분은 *결정 전에* 명시적으로 질문.
|
|
158
|
+
3. **명세에서 "옵셔널"이라고 한 항목은 반드시 "안 골라도 통과" 테스트 작성**. 표시(UI 분기)와 검증(로직 분기)이 같은 진실을 보는지 점검.
|
|
159
|
+
4. **README/주석이 자랑하는 패턴(discriminated union, 특정 아키텍처 이름)과 실제 코드 결함 공존을 경계**. 자랑한 패턴은 가장 먼저 검증.
|
|
160
|
+
5. **도메인 직관이 명세 위에 올라가는 순간을 경계**. "당연히 이래야 한다" 가 등장하면 명세를 다시 펴라.
|