@keke1933/vibe-dictionary-mcp 0.12.0 → 0.13.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.
Files changed (3) hide show
  1. package/README.md +35 -2
  2. package/dist/index.js +841 -15
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Vibe Dictionary MCP
2
2
 
3
- 바이브 코딩 사전의 디자인 기법과 도메인 지식을 검색하고 참고 원문을 가져오는 읽기 전용 로컬 MCP다. Node.js 22.12 이상이 필요하며, 현재 검증 환경은 Node.js 24다. 아래 도메인 지식 도구는 현재 소스 기준이며, npm 배포 버전은 별도로 확인해야 한다.
3
+ 바이브 코딩 사전의 디자인 기법·도메인 지식·용어 사전을 검색하고 참고 원문을 가져오는 읽기 전용 로컬 MCP다. Node.js 22.12 이상이 필요하며, 현재 검증 환경은 Node.js 24다. 아래 도메인 지식 및 용어 사전 도구는 현재 소스 기준이며, npm 배포 버전은 별도로 확인해야 한다.
4
4
 
5
5
  ## 제공하는 도구
6
6
 
@@ -10,8 +10,12 @@
10
10
  | `get_technique` | 필수: `id`, 선택: `locale` | 기법 상세·별칭·키워드·해당 언어의 `promptSnippet` 원문 |
11
11
  | `search_domain_knowledge` | 선택: `query`, `locale`, `limit`, `offset` | 도메인 지식 요약·사용 상황·관련도·매칭 필드와 페이지 정보 |
12
12
  | `get_domain_knowledge` | 필수: `id`, 선택: `locale` | 개념·결정할 질문·예시·관련 기법 ID·참고 자료·프롬프트 |
13
+ | `search_glossary` | 선택: `query`, `locale`, `limit`, `offset` | 용어 분류·한영 이름·정의·별칭·관련 ID·매칭 필드·점수·페이지 정보 |
14
+ | `get_glossary_term` | 필수: `id`, 선택: `locale` | 용어 상세·실제 예시·복사용 `promptSnippet`·별칭·관련 기법/도메인 ID |
13
15
 
14
- 모든 도구의 `locale`은 `ko`(기본) 또는 `en`이다. 기법 조회의 `titleKo`·`titleEn`은 호환성을 위해 두 이름을 유지한다. 검색 언어는 출력 언어와 독립적이므로 한국어로 검색한 뒤 영어 원문을 받을 수 있다.
16
+ 모든 도구의 `locale`은 `ko`(기본) 또는 `en`이다. 기법 조회의 `titleKo`·`titleEn`과 용어 조회의 `nameKo`·`nameEn`은 호환성을 위해 두 이름을 유지한다. 검색 언어는 출력 언어와 독립적이므로 한국어로 검색한 뒤 영어 원문을 받을 수 있다.
17
+
18
+ 용어 사전은 UI·엔지니어링·워크플로우 용어의 한영 이름·별칭(예: `결제 두 번 방지` → `idempotency`)·정의·예시·프롬프트를 함께 검색한다. `search_glossary`는 검색 결과에 `promptSnippet`과 `example` 전문을 포함하지 않고 정의·별칭·관련 ID만 반환하므로, 후보를 고른 뒤 `get_glossary_term`으로 예시와 바로 쓸 수 있는 프롬프트 문장을 조회한다. 반환된 `relatedTechniqueIds`와 `relatedDomainIds`는 각각 `get_technique`, `get_domain_knowledge`에 바로 전달할 수 있는 검증된 ID다. `query`가 비어 있으면 카탈로그 순서로 조회하고, 일치하는 용어가 없으면 `total: 0`과 빈 목록을 반환한다. `matchedOn`은 일치한 필드(`name`, `alias`, `definition`, `example`, `prompt`)를 표시한다.
15
19
 
16
20
  도메인 지식은 한영 이름·별칭·사용 상황과 개념·흐름·결정 질문을 함께 검색한다. `LMS`, `온라인 강의`, `재시도`, `회원 전용`, `신고 처리`, `private group`처럼 짧은 서비스명이나 업무 표현으로 `search_domain_knowledge`를 호출한다. 한영 동의어·대소문자·문장 부호를 정규화하고 매칭 범위와 필드 중요도로 정렬하는 키워드 검색이며, 의미를 추론하는 AI 검색은 아니다. 결과의 `useCases`와 `matchedOn`을 비교해 선택하고 반환된 ID를 `get_domain_knowledge`에 전달한다. `score`는 신뢰 확률이 아니며, 결과가 맞지 않으면 동의어나 더 짧은 검색어로 다시 찾는다. 검색어가 비어 있으면 목록 순서로 조회한다.
17
21
 
@@ -43,12 +47,41 @@ Then call `get_technique`:
43
47
  {"id":"magnetic-hover","locale":"en"}
44
48
  ```
45
49
 
50
+ For bilingual glossary terms (UI, engineering, and workflow vocabulary), call `search_glossary` with a short Korean or English term or natural alias (such as `"결제 두 번 방지"` or `"skeleton"`):
51
+
52
+ ```json
53
+ {"query":"결제 두 번 방지","locale":"en","limit":5}
54
+ ```
55
+
56
+ `search_glossary` omits `example` and `promptSnippet`; call `get_glossary_term` with the returned `id` for the full example and prompt sentence, and pass any `relatedTechniqueIds` or `relatedDomainIds` directly to `get_technique` or `get_domain_knowledge`:
57
+
58
+ ```json
59
+ {"id":"idempotency","locale":"en"}
60
+ ```
61
+
46
62
  Search matches both Korean and English regardless of output locale. Scores indicate relative ranking, not confidence. Unknown or unsuitable results require reformulating the query or clarifying the request. Tools return reference text only and never modify your project.
47
63
 
48
64
  If candidates are empty or unsuitable, retry a synonym, the other language or fewer modifiers. Broaden only optional filters and restart at offset zero when changing the query or filters. The MCP runs keyword search locally and requires no embedding model, vector index or API key.
49
65
 
50
66
  These capabilities describe the current source. An installed, pinned npm version does not automatically pick up local source changes. For local verification, build the repository and register `node <repository>/apps/mcp/dist/index.js` with your MCP client, then restart that server.
51
67
 
68
+ ## 로컬 소스 빌드로 stdio 연결
69
+
70
+ 저장소 소스로 MCP를 실행하려면 빌드한 뒤 생성된 `apps/mcp/dist/index.js`를 stdio 서버로 등록한다.
71
+
72
+ ```sh
73
+ npm ci
74
+ npm run build:mcp
75
+ ```
76
+
77
+ 이 저장소에서만 로컬 빌드를 사용하려면 신뢰한 프로젝트의 `.codex/config.toml`에 다음 항목을 추가한 뒤 Codex 세션을 다시 연다. `<repository>`는 저장소의 절대 경로로 바꾼다. Windows에서도 경로에 `/`를 쓸 수 있다.
78
+
79
+ ```toml
80
+ [mcp_servers.vibe-dictionary]
81
+ command = "node"
82
+ args = ["<repository>/apps/mcp/dist/index.js"]
83
+ ```
84
+
52
85
  ## npm 패키지로 Codex에 연결
53
86
 
54
87
  공개 패키지는 [@keke1933/vibe-dictionary-mcp](https://www.npmjs.com/package/@keke1933/vibe-dictionary-mcp)다. 저장소 복제·로컬 빌드·웹 서버 실행 없이 사용할 수 있다. Node.js 22.12 이상과 npm, `codex` CLI를 먼저 설치하고 터미널에서 다음 명령이 동작하는지 확인한다. MCP 자체에는 API 키나 npm 로그인이 필요 없다. Codex는 별도로 사용할 수 있도록 설정되어 있어야 한다.
package/dist/index.js CHANGED
@@ -30330,14 +30330,14 @@ function createSearchEntries(fields, tokenize) {
30330
30330
  tokens: new Set(tokenize(value))
30331
30331
  })));
30332
30332
  }
30333
- function rankSearchEntries(entries3, queryTokens, weights3, exact, exactBonus = 100) {
30333
+ function rankSearchEntries(entries4, queryTokens, weights4, exact, exactBonus = 100) {
30334
30334
  if (!queryTokens.length && !exact) return null;
30335
30335
  const matchedOn = [];
30336
30336
  const best = /* @__PURE__ */ new Map();
30337
- for (const entry of entries3) {
30337
+ for (const entry of entries4) {
30338
30338
  const matched = queryTokens.filter((token) => entry.tokens.has(token));
30339
30339
  if (!matched.length) continue;
30340
- for (const token of matched) best.set(token, Math.max(best.get(token) ?? 0, weights3[entry.field]));
30340
+ for (const token of matched) best.set(token, Math.max(best.get(token) ?? 0, weights4[entry.field]));
30341
30341
  if (!matchedOn.some((match) => match.field === entry.field)) matchedOn.push({ field: entry.field, value: entry.value });
30342
30342
  }
30343
30343
  if (!exact && best.size < Math.max(1, Math.ceil(queryTokens.length * 0.6))) return null;
@@ -30399,6 +30399,755 @@ function rankDomainKnowledge(query = "") {
30399
30399
  return results.sort((a, b) => b.score - a.score);
30400
30400
  }
30401
30401
 
30402
+ // ../../packages/catalog/src/glossary-links.ts
30403
+ var GLOSSARY_CATEGORIES = ["ui", "engineering", "workflow"];
30404
+ var GLOSSARY_LINK_META = [
30405
+ // UI (8)
30406
+ {
30407
+ id: "skeleton-loading",
30408
+ name: { ko: "\uC2A4\uCF08\uB808\uD1A4 \uB85C\uB529", en: "Skeleton Loading" },
30409
+ category: "ui",
30410
+ relatedTechniqueIds: ["stable-skeleton-content", "skeleton-shimmer"],
30411
+ relatedDomainIds: ["file-upload-processing-and-access-control", "analytics-metric-aggregation-and-export"]
30412
+ },
30413
+ {
30414
+ id: "empty-state",
30415
+ name: { ko: "\uBE48 \uC0C1\uD0DC", en: "Empty State" },
30416
+ category: "ui",
30417
+ relatedTechniqueIds: ["recoverable-search-empty-state"],
30418
+ relatedDomainIds: ["workspace-task-assignment-and-status", "analytics-metric-aggregation-and-export"]
30419
+ },
30420
+ {
30421
+ id: "inline-validation",
30422
+ name: { ko: "\uC778\uB77C\uC778 \uC720\uD6A8\uC131 \uAC80\uC99D", en: "Inline Validation" },
30423
+ category: "ui",
30424
+ relatedTechniqueIds: ["inline-email-validation", "linked-form-error-summary", "character-budget-feedback"],
30425
+ relatedDomainIds: ["account-auth-recovery-and-deletion", "automation-form-branching-validation-and-partial-save"]
30426
+ },
30427
+ {
30428
+ id: "progressive-disclosure",
30429
+ name: { ko: "\uC810\uC9C4\uC801 \uACF5\uAC1C", en: "Progressive Disclosure" },
30430
+ category: "ui",
30431
+ relatedTechniqueIds: ["smooth-accordion", "inline-footnote-disclosure", "ly-expandable-data-rows"],
30432
+ relatedDomainIds: ["automation-form-branching-validation-and-partial-save", "support-faq-self-service-and-deflection"]
30433
+ },
30434
+ {
30435
+ id: "toast-and-snackbar",
30436
+ name: { ko: "\uD1A0\uC2A4\uD2B8\uC640 \uC2A4\uB0B5\uBC14", en: "Toast and Snackbar" },
30437
+ category: "ui",
30438
+ relatedTechniqueIds: ["toast-slide-stack", "undo-delete-snackbar", "dismissible-inline-banner"],
30439
+ relatedDomainIds: ["notification-channels-preferences-and-read-state"]
30440
+ },
30441
+ {
30442
+ id: "command-palette",
30443
+ name: { ko: "\uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8", en: "Command Palette" },
30444
+ category: "ui",
30445
+ relatedTechniqueIds: ["ly-command-palette", "ai-slash-command", "manual-search-combobox"],
30446
+ relatedDomainIds: ["workspace-task-assignment-and-status", "support-canned-response-and-merge-tickets"]
30447
+ },
30448
+ {
30449
+ id: "focus-trap",
30450
+ name: { ko: "\uD3EC\uCEE4\uC2A4 \uD2B8\uB7A9", en: "Focus Trap" },
30451
+ category: "ui",
30452
+ relatedTechniqueIds: ["lay-bottom-sheet-modal", "spotlight-focus", "spring-bounce-modal"],
30453
+ relatedDomainIds: ["account-mfa-stepup-and-backup-codes"]
30454
+ },
30455
+ {
30456
+ id: "virtual-scrolling",
30457
+ name: { ko: "\uAC00\uC0C1 \uC2A4\uD06C\uB864", en: "Virtual Scrolling" },
30458
+ category: "ui",
30459
+ relatedTechniqueIds: ["ly-fixed-row-virtual-scroll", "ly-prepend-scroll-anchor"],
30460
+ relatedDomainIds: ["notification-chat-room-delivery-and-recall", "analytics-metric-aggregation-and-export"]
30461
+ },
30462
+ // Engineering (8)
30463
+ {
30464
+ id: "debounce",
30465
+ name: { ko: "\uB514\uBC14\uC6B4\uC2A4", en: "Debounce" },
30466
+ category: "engineering",
30467
+ relatedTechniqueIds: ["manual-search-combobox", "recoverable-search-empty-state", "search-match-highlight"],
30468
+ relatedDomainIds: ["support-faq-self-service-and-deflection"]
30469
+ },
30470
+ {
30471
+ id: "optimistic-update",
30472
+ name: { ko: "\uB099\uAD00\uC801 \uC5C5\uB370\uC774\uD2B8", en: "Optimistic Update" },
30473
+ category: "engineering",
30474
+ relatedTechniqueIds: ["toggle-reaction-picker", "heart-like-burst", "dirty-note-save-state"],
30475
+ relatedDomainIds: ["community-comment-thread-mention-and-reaction", "workspace-task-assignment-and-status"]
30476
+ },
30477
+ {
30478
+ id: "idempotency",
30479
+ name: { ko: "\uBA71\uB4F1\uC131", en: "Idempotency" },
30480
+ category: "engineering",
30481
+ relatedTechniqueIds: [],
30482
+ relatedDomainIds: [
30483
+ "fintech-wallet-ledger-idempotency-and-hold",
30484
+ "automation-webhook-retry-dead-letter-and-replay",
30485
+ "notification-channels-preferences-and-read-state"
30486
+ ]
30487
+ },
30488
+ {
30489
+ id: "role-based-access-control",
30490
+ name: { ko: "\uC5ED\uD560 \uAE30\uBC18 \uC811\uADFC \uC81C\uC5B4 (RBAC)", en: "Role-Based Access Control (RBAC)" },
30491
+ category: "engineering",
30492
+ relatedTechniqueIds: ["ly-workspace-switcher", "ly-column-visibility-table"],
30493
+ relatedDomainIds: [
30494
+ "security-rbac-role-assignment-and-least-privilege",
30495
+ "community-post-visibility-and-moderation",
30496
+ "account-organization-switch-and-membership"
30497
+ ]
30498
+ },
30499
+ {
30500
+ id: "server-sent-events",
30501
+ name: { ko: "\uC11C\uBC84 \uC804\uC1A1 \uC774\uBCA4\uD2B8 (SSE)", en: "Server-Sent Events (SSE)" },
30502
+ category: "engineering",
30503
+ relatedTechniqueIds: ["ai-streaming-text", "ui-ai-streaming-pulse"],
30504
+ relatedDomainIds: ["ai-streaming-response-and-reconnection", "notification-chat-room-delivery-and-recall"]
30505
+ },
30506
+ {
30507
+ id: "retrieval-augmented-generation",
30508
+ name: { ko: "\uAC80\uC0C9 \uC99D\uAC15 \uC0DD\uC131 (RAG)", en: "Retrieval-Augmented Generation (RAG)" },
30509
+ category: "engineering",
30510
+ relatedTechniqueIds: ["ai-source-citation", "ai-context-pill"],
30511
+ relatedDomainIds: ["ai-rag-retrieval-and-source-attribution", "ai-prompt-context-and-token-budget"]
30512
+ },
30513
+ {
30514
+ id: "dead-letter-queue",
30515
+ name: { ko: "\uB370\uB4DC \uB808\uD130 \uD050 (DLQ)", en: "Dead-Letter Queue (DLQ)" },
30516
+ category: "engineering",
30517
+ relatedTechniqueIds: ["ly-collapsible-run-log"],
30518
+ relatedDomainIds: ["automation-webhook-retry-dead-letter-and-replay", "subscription-invoice-tax-and-payment-retry"]
30519
+ },
30520
+ {
30521
+ id: "audit-log",
30522
+ name: { ko: "\uAC10\uC0AC \uB85C\uADF8", en: "Audit Log" },
30523
+ category: "engineering",
30524
+ relatedTechniqueIds: ["ly-activity-timeline", "ly-context-code-diff"],
30525
+ relatedDomainIds: ["security-audit-log-retention-and-tamper-evidence", "file-version-replacement-and-download-audit"]
30526
+ },
30527
+ // Workflow (8)
30528
+ {
30529
+ id: "human-in-the-loop",
30530
+ name: { ko: "\uC778\uAC04 \uAC1C\uC785 \uC2B9\uC778 (HITL)", en: "Human-in-the-Loop (HITL)" },
30531
+ category: "workflow",
30532
+ relatedTechniqueIds: ["ai-human-in-the-loop", "ai-tool-call-card"],
30533
+ relatedDomainIds: ["ai-tool-calling-and-human-approval", "security-approval-maker-checker-and-breakglass"]
30534
+ },
30535
+ {
30536
+ id: "service-level-agreement",
30537
+ name: { ko: "\uC11C\uBE44\uC2A4 \uC218\uC900 \uD611\uC57D (SLA)", en: "Service-Level Agreement (SLA)" },
30538
+ category: "workflow",
30539
+ relatedTechniqueIds: ["ly-sortable-data-table", "faceted-filter-chips"],
30540
+ relatedDomainIds: ["support-sla-priority-and-escalation", "support-ticket-routing-and-resolution"]
30541
+ },
30542
+ {
30543
+ id: "know-your-customer",
30544
+ name: { ko: "\uACE0\uAC1D \uD655\uC778 \uC808\uCC28 (KYC)", en: "Know Your Customer (KYC)" },
30545
+ category: "workflow",
30546
+ relatedTechniqueIds: ["onboarding-progress-checklist", "linked-form-error-summary"],
30547
+ relatedDomainIds: ["fintech-limit-tier-kyc-and-aml-review", "marketplace-seller-onboarding-kyc-and-payout-account"]
30548
+ },
30549
+ {
30550
+ id: "user-onboarding",
30551
+ name: { ko: "\uC0AC\uC6A9\uC790 \uC628\uBCF4\uB529", en: "User Onboarding" },
30552
+ category: "workflow",
30553
+ relatedTechniqueIds: ["onboarding-progress-checklist", "horizontal-milestone-rail"],
30554
+ relatedDomainIds: ["marketplace-seller-onboarding-kyc-and-payout-account", "coding-lesson-objectives-and-practice"]
30555
+ },
30556
+ {
30557
+ id: "escrow-settlement",
30558
+ name: { ko: "\uC5D0\uC2A4\uD06C\uB85C \uC815\uC0B0", en: "Escrow Settlement" },
30559
+ category: "workflow",
30560
+ relatedTechniqueIds: ["hold-to-confirm-ring", "horizontal-milestone-rail"],
30561
+ relatedDomainIds: ["marketplace-escrow-settlement-and-dispute", "marketplace-quote-custom-offer-and-milestone"]
30562
+ },
30563
+ {
30564
+ id: "proration",
30565
+ name: { ko: "\uC77C\uD560 \uACC4\uC0B0", en: "Proration" },
30566
+ category: "workflow",
30567
+ relatedTechniqueIds: ["billing-cycle-pricing-card"],
30568
+ relatedDomainIds: ["subscription-plan-entitlement-and-billing", "subscription-seat-license-and-member-change"]
30569
+ },
30570
+ {
30571
+ id: "grace-period",
30572
+ name: { ko: "\uC720\uC608 \uAE30\uAC04", en: "Grace Period" },
30573
+ category: "workflow",
30574
+ relatedTechniqueIds: ["dismissible-inline-banner", "sticky-announcement-banner"],
30575
+ relatedDomainIds: [
30576
+ "subscription-plan-entitlement-and-billing",
30577
+ "account-auth-recovery-and-deletion",
30578
+ "security-api-key-webhook-and-secret-rotation"
30579
+ ]
30580
+ },
30581
+ {
30582
+ id: "maker-checker-approval",
30583
+ name: { ko: "\uC774\uC911 \uC2B9\uC778 (\uBA54\uC774\uCEE4-\uCCB4\uCEE4)", en: "Dual-Control Approval (Maker-Checker)" },
30584
+ category: "workflow",
30585
+ relatedTechniqueIds: ["inline-delete-confirmation", "ly-activity-timeline"],
30586
+ relatedDomainIds: [
30587
+ "security-approval-maker-checker-and-breakglass",
30588
+ "workspace-approval-stage-and-signoff",
30589
+ "recruiting-offer-approval-and-expiration"
30590
+ ]
30591
+ }
30592
+ ];
30593
+
30594
+ // ../../packages/catalog/src/glossary/ui.ts
30595
+ var UI_GLOSSARY_DATA = {
30596
+ "skeleton-loading": {
30597
+ aliases: {
30598
+ ko: ["\uC2A4\uCF08\uB808\uD1A4 UI", "\uBF08\uB300 \uD654\uBA74", "\uB85C\uB529 \uD50C\uB808\uC774\uC2A4\uD640\uB354", "\uC790\uB9AC \uC720\uC9C0 \uB85C\uB529", "\uB85C\uB529 \uC911 \uD68C\uC0C9 \uBC15\uC2A4"],
30599
+ en: ["skeleton screen", "skeleton placeholder", "loading placeholder", "shimmer skeleton", "content placeholder"]
30600
+ },
30601
+ text: {
30602
+ ko: {
30603
+ definition: "\uB370\uC774\uD130\uAC00 \uB3C4\uCC29\uD558\uAE30 \uC804 \uCD5C\uC885 \uCE74\uB4DC\uB098 \uBAA9\uB85D\uACFC \uAC19\uC740 \uD06C\uAE30\xB7\uBC30\uCE58\uC758 \uBE48 \uBF08\uB300 \uBC15\uC2A4\uB97C \uBA3C\uC800 \uBCF4\uC5EC \uC8FC\uC5B4 \uD654\uBA74\uC774 \uAC11\uC790\uAE30 \uBC00\uB9AC\uC9C0 \uC54A\uAC8C \uD558\uB294 \uB85C\uB529 \uD328\uD134\uC785\uB2C8\uB2E4.",
30604
+ example: "\uC0C1\uD488 \uBAA9\uB85D\uC744 \uBD88\uB7EC\uC624\uB294 \uB3D9\uC548 \uC378\uB124\uC77C \uC0AC\uAC01\uD615\uACFC \uB450 \uC904\uC9DC\uB9AC \uD68C\uC0C9 \uB9C9\uB300\uB97C \uC2E4\uC81C \uCE74\uB4DC \uB192\uC774 \uADF8\uB300\uB85C \uBA3C\uC800 \uB744\uC6CC \uB450\uACE0, \uB370\uC774\uD130\uAC00 \uC624\uBA74 \uAC19\uC740 \uC790\uB9AC\uC5D0\uC11C \uCF58\uD150\uCE20\uB85C \uBC14\uAFC9\uB2C8\uB2E4. UI \uB370\uBAA8\uB294 \uD615\uD0DC \uC804\uD658 \uC2DC\uC5F0\uC774\uBA70 \uC2E4\uC81C \uB124\uD2B8\uC6CC\uD06C \uC694\uCCAD\uC744 \uC218\uD589\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
30605
+ promptSnippet: "\uB370\uC774\uD130 \uB85C\uB529 \uC911\uC5D0\uB294 \uCD5C\uC885 \uCF58\uD150\uCE20\uC640 \uB3D9\uC77C\uD55C \uB192\uC774\xB7\uACA9\uC790 \uBE44\uC728\uC744 \uAC00\uC9C4 \uC2A4\uCF08\uB808\uD1A4 \uD50C\uB808\uC774\uC2A4\uD640\uB354\uB97C \uBA3C\uC800 \uB80C\uB354\uB9C1\uD558\uACE0, aria-busy\uC640 \uBD80\uB4DC\uB7EC\uC6B4 \uBD88\uD22C\uBA85\uB3C4 \uB610\uB294 \uC2DC\uBA38 \uC804\uD658\uC73C\uB85C \uB808\uC774\uC544\uC6C3 \uBC00\uB9BC(CLS) \uC5C6\uC774 \uC2E4\uC81C \uCF58\uD150\uCE20\uB85C \uAD50\uCCB4\uD574 \uC918. prefers-reduced-motion\uC5D0\uC11C\uB294 \uC560\uB2C8\uBA54\uC774\uC158\uC744 \uBA48\uCDB0 \uC918."
30606
+ },
30607
+ en: {
30608
+ definition: "A loading pattern that renders low-fidelity wireframe blocks matching the final layout dimensions before data arrives, preventing sudden layout shifts.",
30609
+ example: "While a product feed fetches, show an avatar circle and two text bars inside the exact final card height, then swap them for real items in place. UI demos illustrate the visual transition without performing real network fetches.",
30610
+ promptSnippet: 'While content is loading, render skeleton placeholders matching the exact height and grid proportions of the final layout with aria-busy="true", then swap in loaded content without layout shift while respecting prefers-reduced-motion.'
30611
+ }
30612
+ }
30613
+ },
30614
+ "empty-state": {
30615
+ aliases: {
30616
+ ko: ["\uBE48 \uD654\uBA74", "\uACB0\uACFC \uC5C6\uC74C \uD654\uBA74", "\uB370\uC774\uD130 \uC5C6\uC74C \uC548\uB0B4", "\uCD08\uAE30 \uBE48 \uC0C1\uD0DC", "\uAC80\uC0C9 \uACB0\uACFC \uC5C6\uC744 \uB54C"],
30617
+ en: ["no results state", "zero state", "blank slate", "no data screen", "empty list fallback"]
30618
+ },
30619
+ text: {
30620
+ ko: {
30621
+ definition: "\uC544\uC9C1 \uC0DD\uC131\uB41C \uD56D\uBAA9\uC774 \uC5C6\uAC70\uB098 \uAC80\uC0C9\xB7\uD544\uD130 \uC870\uAC74\uC5D0 \uB9DE\uB294 \uACB0\uACFC\uAC00 0\uAC74\uC77C \uB54C, \uC774\uC720\uC640 \uB2E4\uC74C \uD589\uB3D9\uC744 \uC548\uB0B4\uD574 \uC0AC\uC6A9\uC790\uAC00 \uB9C9\uD788\uC9C0 \uC54A\uAC8C \uB3D5\uB294 UI \uC0C1\uD0DC\uC785\uB2C8\uB2E4.",
30622
+ example: '\uAC80\uC0C9\uC5B4\uC5D0 \uB9DE\uB294 \uB178\uD2B8\uAC00 \uC5C6\uC744 \uB54C \uBE48 \uC5EC\uBC31\uB9CC \uB0A8\uAE30\uB294 \uB300\uC2E0 "\uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" \uBB38\uAD6C\uC640 [\uAC80\uC0C9\uC5B4 \uC9C0\uC6B0\uAE30] \uBC84\uD2BC\uC744 \uD568\uAED8 \uB450\uC5B4 \uBC14\uB85C \uC804\uCCB4 \uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC08 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.',
30623
+ promptSnippet: "\uBAA9\uB85D\uC774\uB098 \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uBE44\uC5B4 \uC788\uC744 \uB54C \uB2E8\uC21C\uD788 \uBE48 \uD654\uBA74\uC744 \uB450\uC9C0 \uB9D0\uACE0, \uCC98\uC74C \uC0DD\uC131 \uC804\uC778\uC9C0 \uD544\uD130/\uAC80\uC0C9 \uACB0\uACFC 0\uAC74\uC778\uC9C0 \uC6D0\uC778\uC744 \uD55C \uC904\uB85C \uC54C\uB9B0 \uB4A4 [\uAC80\uC0C9 \uCD08\uAE30\uD654] \uB610\uB294 [\uC0C8 \uD56D\uBAA9 \uB9CC\uB4E4\uAE30] \uAC19\uC740 \uBCF5\uAD6C \uBC84\uD2BC\uC744 \uBC14\uB85C \uC81C\uACF5\uD574 \uC918."
30624
+ },
30625
+ en: {
30626
+ definition: "A dedicated UI state shown when a collection has no items yet or a search/filter returns zero matches, explaining why and offering a clear next action.",
30627
+ example: 'When a search finds no matching notes, show a concise "No matching results" message paired with a [Clear search] button that restores the list and returns focus to the search input.',
30628
+ promptSnippet: "Provide a purposeful empty state that distinguishes first-time creation from zero search/filter results, displays a concise status message, and includes a primary recovery action such as resetting filters or creating the first item."
30629
+ }
30630
+ }
30631
+ },
30632
+ "inline-validation": {
30633
+ aliases: {
30634
+ ko: ["\uC2E4\uC2DC\uAC04 \uC785\uB825 \uAC80\uC0AC", "\uC785\uB825\uCC3D \uC624\uB958 \uD45C\uC2DC", "\uC778\uB77C\uC778 \uC5D0\uB7EC", "\uC785\uB825 \uC544\uB798 \uBE68\uAC04 \uC548\uB0B4", "\uD3FC \uC989\uC2DC \uAC80\uC99D"],
30635
+ en: ["inline form validation", "field-level validation", "live field error", "input error feedback"]
30636
+ },
30637
+ text: {
30638
+ ko: {
30639
+ definition: "\uD3FC \uC804\uCCB4\uB97C \uC81C\uCD9C\uD558\uAE30 \uC804\uC774\uB098 \uAC01 \uC785\uB825 \uD544\uB4DC\uB97C \uBC97\uC5B4\uB09C \uC9C1\uD6C4, \uD574\uB2F9 \uC785\uB825\uCC3D \uBC14\uB85C \uC544\uB798\uC5D0 \uC624\uB958 \uC6D0\uC778\uACFC \uC218\uC815 \uC870\uAC74\uC744 \uC989\uC2DC \uD45C\uC2DC\uD558\uB294 \uAC80\uC99D \uBC29\uC2DD\uC785\uB2C8\uB2E4.",
30640
+ example: "\uD68C\uC6D0\uAC00\uC785 \uC774\uBA54\uC77C \uC785\uB825\uCC3D\uC5D0\uC11C \uD3EC\uCEE4\uC2A4\uB97C \uC62E\uAE34 \uB4A4 \uD615\uC2DD\uC774 \uD2C0\uB838\uC744 \uB54C\uB9CC \uC785\uB825\uCC3D \uC544\uB798\uC5D0 \uBE68\uAC04 \uC548\uB0B4 \uBB38\uAD6C\uC640 aria-invalid \uC0C1\uD0DC\uB97C \uB744\uC6B0\uACE0, \uC62C\uBC14\uB974\uAC8C \uACE0\uCE58\uBA74 \uBC14\uB85C \uD574\uC81C\uD569\uB2C8\uB2E4. \uC774\uB294 \uD074\uB77C\uC774\uC5B8\uD2B8 \uC785\uB825 \uC548\uB0B4\uC774\uBA70 \uC2E4\uC81C \uC11C\uBC84 \uC911\uBCF5 \uD655\uC778\uC774\uB098 \uBCF4\uC548 \uAC80\uC99D\uC744 \uB300\uCCB4\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
30641
+ promptSnippet: "\uC785\uB825 \uD544\uB4DC\uB294 \uCCAB blur \uB610\uB294 \uC81C\uCD9C \uC2DC\uC810\uBD80\uD130 \uC720\uD6A8\uC131\uC744 \uAC80\uC0AC\uD574 \uC624\uB958 \uBB38\uAD6C\uB97C \uC785\uB825\uCC3D \uBC14\uB85C \uC544\uB798\uC5D0 \uD45C\uC2DC\uD558\uACE0 aria-invalid \uBC0F aria-describedby\uB85C \uC5F0\uACB0\uD574 \uC918. \uC218\uC815 \uC911 \uC624\uB958\uAC00 \uD574\uC18C\uB418\uBA74 \uC989\uC2DC \uC815\uC0C1 \uC0C1\uD0DC\uB85C \uBCF5\uAD6C\uD558\uB418, \uD0C0\uC774\uD551 \uCCAB \uAE00\uC790\uBD80\uD130 \uC131\uAE09\uD788 \uACBD\uACE0\uB97C \uB744\uC6B0\uC9C0 \uB9C8."
30642
+ },
30643
+ en: {
30644
+ definition: "Field-level validation that displays error reasons and fix guidance directly beside or beneath the relevant input after blur or submission rather than waiting for a separate error page.",
30645
+ example: "Wait until a user blurs the email field before showing an inline format error linked via aria-describedby, then clear the error immediately once corrected. Client-side checks improve usability and never replace real server-side validation.",
30646
+ promptSnippet: "Validate each input on blur or submit (not prematurely on the first keystroke), render concise error text directly below the field linked with aria-invalid and aria-describedby, and clear it immediately when fixed."
30647
+ }
30648
+ }
30649
+ },
30650
+ "progressive-disclosure": {
30651
+ aliases: {
30652
+ ko: ["\uB2E8\uACC4\uC801 \uC815\uBCF4 \uB178\uCD9C", "\uD544\uC694\uD560 \uB54C \uD3BC\uCE58\uAE30", "\uC544\uCF54\uB514\uC5B8 \uD3BC\uCE68", "\uACE0\uAE09 \uC635\uC158 \uC811\uAE30", "\uC815\uBCF4 \uACC4\uCE35\uD654"],
30653
+ en: ["gradual reveal", "expandable details", "on-demand details", "collapsible details", "layered disclosure"]
30654
+ },
30655
+ text: {
30656
+ ko: {
30657
+ definition: "\uCC98\uC74C\uC5D0\uB294 \uD575\uC2EC \uC815\uBCF4\uC640 \uAE30\uBCF8 \uC870\uC791\uB9CC \uAC04\uACB0\uD558\uAC8C \uBCF4\uC5EC \uC8FC\uACE0, \uC138\uBD80 \uC124\uBA85\xB7\uACE0\uAE09 \uC124\uC815\xB7\uBD80\uC18D \uD56D\uBAA9\uC740 \uC0AC\uC6A9\uC790\uAC00 \uC694\uCCAD\uD560 \uB54C \uD3BC\uCCD0 \uBCF4\uC5EC \uC8FC\uB294 \uC815\uBCF4 \uC124\uACC4 \uC6D0\uCE59\uC785\uB2C8\uB2E4.",
30658
+ example: "\uC8FC\uBB38 \uD45C\uC5D0\uC11C\uB294 \uC8FC\uBB38\uBC88\uD638\uC640 \uC0C1\uD0DC\uB9CC \uAE30\uBCF8 \uD589\uC5D0 \uD45C\uC2DC\uD558\uACE0, \uC0C1\uC138 \uD589 \uD655\uC7A5 \uBC84\uD2BC\uC744 \uB20C\uB800\uC744 \uB54C\uB9CC \uBC30\uC1A1\uC9C0\xB7\uACB0\uC81C \uC218\uB2E8\xB7\uCC98\uB9AC \uC774\uB825\uC744 \uC544\uB798\uB85C \uD3BC\uCCD0 \uD654\uBA74 \uBCF5\uC7A1\uB3C4\uB97C \uB0AE\uCDA5\uB2C8\uB2E4.",
30659
+ promptSnippet: "\uCD08\uAE30 \uD654\uBA74\uC5D0\uB294 \uD575\uC2EC \uC815\uBCF4\uC640 \uC8FC\uC694 \uC561\uC158\uB9CC \uB178\uCD9C\uD558\uACE0, \uBD80\uAC00 \uC124\uBA85\uC774\uB098 \uACE0\uAE09 \uC635\uC158\uC740 native button \uD1A0\uAE00(aria-expanded, aria-controls)\uB85C \uD544\uC694\uD560 \uB54C\uB9CC \uD3BC\uCCD0\uC9C0\uB3C4\uB85D \uC810\uC9C4\uC801 \uACF5\uAC1C \uAD6C\uC870\uB85C \uAD6C\uC131\uD574 \uC918."
30660
+ },
30661
+ en: {
30662
+ definition: "An interaction principle that shows only essential options upfront and reveals secondary details or advanced settings only when the user asks for them.",
30663
+ example: "Show order ID and status in each summary row, and expand shipping address and item breakdown only when the user toggles the row disclosure button.",
30664
+ promptSnippet: "Keep the default view focused on primary information and reveal secondary details or advanced controls on demand using accessible disclosure toggles (aria-expanded and aria-controls)."
30665
+ }
30666
+ }
30667
+ },
30668
+ "toast-and-snackbar": {
30669
+ aliases: {
30670
+ ko: ["\uD1A0\uC2A4\uD2B8 \uC54C\uB9BC", "\uC2A4\uB0B5\uBC14 \uC54C\uB9BC", "\uC2E4\uD589 \uCDE8\uC18C \uBC30\uB108", "\uC7A0\uAE50 \uB728\uB294 \uC54C\uB9BC", "\uD558\uB2E8 \uC54C\uB9BC \uBC14"],
30671
+ en: ["toast notification", "snackbar", "undo snackbar", "ephemeral notification", "status toast"]
30672
+ },
30673
+ text: {
30674
+ ko: {
30675
+ definition: "\uC0AC\uC6A9\uC790 \uC791\uC5C5\uC758 \uACB0\uACFC\uB098 \uC9E7\uC740 \uC0C1\uD0DC \uBCC0\uD654\uB97C \uD604\uC7AC \uD654\uBA74 \uD750\uB984\uC744 \uB04A\uC9C0 \uC54A\uACE0 \uD654\uBA74 \uBAA8\uC11C\uB9AC\uC5D0 \uC7A0\uAE50 \uB744\uC6CC \uC54C\uB9AC\uAC70\uB098 \uC2E4\uD589 \uCDE8\uC18C \uC561\uC158\uC744 \uC81C\uACF5\uD558\uB294 \uC77C\uC2DC\uC801 \uD53C\uB4DC\uBC31 \uCEF4\uD3EC\uB10C\uD2B8\uC785\uB2C8\uB2E4.",
30676
+ example: '\uBB38\uC11C\uB97C \uBCF4\uAD00\uD568\uC73C\uB85C \uC62E\uAE34 \uC9C1\uD6C4 \uD558\uB2E8\uC5D0 "\uBB38\uC11C 1\uAC74\uC744 \uBCF4\uAD00\uD588\uC2B5\uB2C8\uB2E4 [\uC2E4\uD589 \uCDE8\uC18C]" \uC2A4\uB0B5\uBC14\uB97C \uB744\uC6CC \uC791\uC5C5\uC744 \uD655\uC778\uC2DC\uCF1C \uC8FC\uACE0, \uC2E4\uC218\uD55C \uACBD\uC6B0 \uBC14\uB85C \uB418\uB3CC\uB9B4 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.',
30677
+ promptSnippet: '\uC791\uC5C5 \uC644\uB8CC\uB098 \uB418\uB3CC\uB9AC\uAE30 \uAC00\uB2A5\uD55C \uC0AD\uC81C \uD53C\uB4DC\uBC31\uC740 \uBAA8\uB2EC\uB85C \uD750\uB984\uC744 \uB9C9\uC9C0 \uB9D0\uACE0 role="status"\uB97C \uAC16\uCD98 \uD1A0\uC2A4\uD2B8/\uC2A4\uB0B5\uBC14\uB85C \uD45C\uC2DC\uD574 \uC918. \uC2E4\uD589 \uCDE8\uC18C \uBC84\uD2BC\uC774 \uC788\uB2E4\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uC640 \uCDA9\uBD84\uD55C \uB300\uAE30 \uC2DC\uAC04\uC744 \uBCF4\uC7A5\uD574 \uC918.'
30678
+ },
30679
+ en: {
30680
+ definition: "A non-blocking temporary banner or floating message used to confirm an action or offer an immediate Undo option without interrupting the user\u2019s current flow.",
30681
+ example: 'After archiving a document, display a bottom snackbar saying "Archived 1 document" with an [Undo] button instead of interrupting with a full-screen dialog.',
30682
+ promptSnippet: 'Surface non-blocking action confirmations as a toast or snackbar inside an accessible live region (role="status"), ensuring any Undo action remains keyboard-reachable before dismissal.'
30683
+ }
30684
+ }
30685
+ },
30686
+ "command-palette": {
30687
+ aliases: {
30688
+ ko: ["\uBA85\uB839 \uD314\uB808\uD2B8", "\uBE60\uB978 \uC2E4\uD589\uCC3D", "\uB2E8\uCD95\uD0A4 \uAC80\uC0C9\uCC3D", "Cmd+K \uBA54\uB274", "\uC2AC\uB798\uC2DC \uBA85\uB839\uCC3D"],
30689
+ en: ["quick launcher", "command menu", "Cmd+K palette", "action switcher", "slash command menu"]
30690
+ },
30691
+ text: {
30692
+ ko: {
30693
+ definition: "\uD0A4\uBCF4\uB4DC \uB2E8\uCD95\uD0A4(\uC608: Cmd/Ctrl+K)\uB098 `/` \uC785\uB825\uC73C\uB85C \uC5F4\uC5B4 \uD398\uC774\uC9C0 \uC774\uB3D9, \uAC80\uC0C9, \uAE30\uB2A5 \uC2E4\uD589\uC744 \uB9C8\uC6B0\uC2A4 \uC5C6\uC774 \uBE60\uB974\uAC8C \uCC98\uB9AC\uD558\uB294 \uD1B5\uD569 \uAC80\uC0C9\uD615 \uBA85\uB839\uCC3D\uC785\uB2C8\uB2E4.",
30694
+ example: '\uD611\uC5C5 \uD234\uC5D0\uC11C \uC5B4\uB290 \uD654\uBA74\uC5D0 \uC788\uB4E0 Cmd+K\uB97C \uB20C\uB7EC "\uB2E4\uD06C \uBAA8\uB4DC \uC804\uD658", "\uC0C8 \uBB38\uC11C \uB9CC\uB4E4\uAE30", "\uCD5C\uADFC \uD504\uB85C\uC81D\uD2B8 \uC5F4\uAE30"\uB97C \uBC14\uB85C \uAC80\uC0C9\uD558\uACE0 Enter\uB85C \uC2E4\uD589\uD569\uB2C8\uB2E4.',
30695
+ promptSnippet: "Cmd/Ctrl+K\uB85C \uC5EC\uB2EB\uC744 \uC218 \uC788\uB294 \uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8\uB97C \uB9CC\uB4E4\uACE0, \uAC80\uC0C9 \uC785\uB825\uACFC \uBC29\uD5A5\uD0A4(ArrowUp/ArrowDown)\xB7Enter \uC120\uD0DD\xB7Escape \uB2EB\uAE30\xB7\uD3EC\uCEE4\uC2A4 \uBCF5\uADC0\uB97C \uBAA8\uB450 \uD0A4\uBCF4\uB4DC\uB9CC\uC73C\uB85C \uC870\uC791\uD560 \uC218 \uC788\uAC8C \uAD6C\uD604\uD574 \uC918."
30696
+ },
30697
+ en: {
30698
+ definition: "A keyboard-first modal launcher (typically opened via Cmd/Ctrl+K or `/`) that lets users search and trigger navigation, settings, or actions from anywhere.",
30699
+ example: 'Press Cmd+K inside a workspace app to filter commands like "Switch theme" or "Open project" and execute them immediately with Enter.',
30700
+ promptSnippet: "Build a keyboard-accessible command palette triggered by Cmd/Ctrl+K with live query filtering, ArrowUp/ArrowDown item navigation, Enter execution, Escape dismissal, and focus restoration."
30701
+ }
30702
+ }
30703
+ },
30704
+ "focus-trap": {
30705
+ aliases: {
30706
+ ko: ["\uD3EC\uCEE4\uC2A4 \uAC00\uB450\uAE30", "\uBAA8\uB2EC \uD3EC\uCEE4\uC2A4 \uAD00\uB9AC", "\uD0A4\uBCF4\uB4DC \uCD08\uC810 \uACE0\uC815", "\uBAA8\uB2EC \uBC16\uC73C\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uD0C8 \uBC29\uC9C0"],
30707
+ en: ["focus containment", "modal focus lock", "dialog focus management", "keyboard focus trap"]
30708
+ },
30709
+ text: {
30710
+ ko: {
30711
+ definition: "\uBAA8\uB2EC \uB2E4\uC774\uC5BC\uB85C\uADF8\uB098 \uB4DC\uB85C\uC5B4\uAC00 \uC5F4\uB824 \uC788\uB294 \uB3D9\uC548 Tab \uD0A4 \uC774\uB3D9\uC774 \uBC30\uACBD \uD654\uBA74\uC73C\uB85C \uBE60\uC838\uB098\uAC00\uC9C0 \uC54A\uACE0 \uB2E4\uC774\uC5BC\uB85C\uADF8 \uB0B4\uBD80 \uC694\uC18C\uB4E4 \uC0AC\uC774\uC5D0\uC11C\uB9CC \uC21C\uD658\uD558\uB3C4\uB85D \uC81C\uD55C\uD558\uACE0, \uB2EB\uD790 \uB54C \uC6D0\uB798 \uBC84\uD2BC\uC73C\uB85C \uD3EC\uCEE4\uC2A4\uB97C \uB3CC\uB824\uC8FC\uB294 \uC811\uADFC\uC131 \uAE30\uBC95\uC785\uB2C8\uB2E4.",
30712
+ example: "\uC0AD\uC81C \uD655\uC778 \uBAA8\uB2EC\uC744 \uC5F4\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uBAA8\uB2EC \uB0B4\uBD80\uB85C \uB4E4\uC5B4\uC624\uACE0 \uBC30\uACBD \uBC84\uD2BC\uC740 \uBE44\uD65C\uC131\uD654\uB418\uBA70, Escape\uB098 \uB2EB\uAE30\uB97C \uB204\uB974\uBA74 \uCC98\uC74C \uBAA8\uB2EC\uC744 \uC5F4\uC5C8\uB358 \uBC84\uD2BC\uC73C\uB85C \uCD08\uC810\uC774 \uB418\uB3CC\uC544\uAC11\uB2C8\uB2E4.",
30713
+ promptSnippet: "\uBAA8\uB2EC\uC774\uB098 \uC2DC\uD2B8 \uB2E4\uC774\uC5BC\uB85C\uADF8\uB97C \uAD6C\uD604\uD560 \uB54C native <dialog> showModal() \uB610\uB294 \uD3EC\uCEE4\uC2A4 \uD2B8\uB7A9\uC744 \uC801\uC6A9\uD574 Tab \uD0A4\uAC00 \uBC30\uACBD\uC73C\uB85C \uC0C8\uC9C0 \uC54A\uAC8C \uD558\uACE0, Escape\xB7\uB2EB\uAE30 \uBC84\uD2BC \uC9C0\uC6D0\uACFC \uD568\uAED8 \uB2EB\uD78C \uB4A4 \uD2B8\uB9AC\uAC70 \uC694\uC18C\uB85C \uD3EC\uCEE4\uC2A4\uB97C \uBCF5\uADC0\uC2DC\uCF1C \uC918."
30714
+ },
30715
+ en: {
30716
+ definition: "An accessibility pattern that keeps Tab/Shift+Tab keyboard focus inside an active modal dialog or drawer and returns focus to the triggering element when closed.",
30717
+ example: "Opening a confirmation dialog traps keyboard navigation inside the modal controls; pressing Escape closes it and restores focus to the button that opened it.",
30718
+ promptSnippet: "Use native <dialog> showModal() or an explicit focus trap so Tab navigation stays inside the open modal, support Escape and explicit close controls, and restore focus to the original trigger on close."
30719
+ }
30720
+ }
30721
+ },
30722
+ "virtual-scrolling": {
30723
+ aliases: {
30724
+ ko: ["\uBAA9\uB85D \uAC00\uC0C1\uD654", "\uC708\uB3C4\uC789", "\uB300\uC6A9\uB7C9 \uB9AC\uC2A4\uD2B8 \uCD5C\uC801\uD654", "\uBCF4\uC774\uB294 \uC601\uC5ED\uB9CC \uB80C\uB354\uB9C1"],
30725
+ en: ["list virtualization", "windowing", "virtual list", "windowed rendering"]
30726
+ },
30727
+ text: {
30728
+ ko: {
30729
+ definition: "\uC218\uCC9C~\uC218\uB9CC \uAC74\uC758 \uAE34 \uBAA9\uB85D\uC5D0\uC11C \uC804\uCCB4 \uC2A4\uD06C\uB864 \uB192\uC774\uB9CC \uC720\uC9C0\uD55C \uCC44 \uD604\uC7AC \uD654\uBA74 \uBDF0\uD3EC\uD2B8\uC640 \uC57D\uAC04\uC758 \uC5EC\uC720(overscan) \uBC94\uC704\uC5D0 \uB4E4\uC5B4\uC628 \uD589\uB9CC DOM\uC5D0 \uB80C\uB354\uB9C1\uD574 \uC131\uB2A5\uC744 \uC9C0\uD0A4\uB294 \uAE30\uBC95\uC785\uB2C8\uB2E4.",
30730
+ example: "10,000\uAC74\uC758 \uB85C\uADF8 \uBAA9\uB85D\uC744 \uD55C \uBC88\uC5D0 DOM\uC5D0 \uC62C\uB9AC\uB294 \uB300\uC2E0 \uD604\uC7AC \uBCF4\uC774\uB294 15\uD589\uACFC \uC704\uC544\uB798 \uC5EC\uC720 10\uD589\uB9CC \uB9C8\uC6B4\uD2B8\uD574 \uC2A4\uD06C\uB864 \uBC84\uBC85\uC784\uC744 \uC904\uC785\uB2C8\uB2E4.",
30731
+ promptSnippet: "\uD589 \uC218\uAC00 \uB9CE\uC740 \uAE34 \uBAA9\uB85D\uC5D0\uB294 \uC804\uCCB4 \uC2A4\uD06C\uB864 \uB192\uC774\uB97C \uBE48 \uC2A4\uD398\uC774\uC11C\uB85C \uC720\uC9C0\uD558\uBA74\uC11C \uD604\uC7AC \uBDF0\uD3EC\uD2B8 \uC8FC\uBCC0\uACFC overscan \uD589\uB9CC DOM\uC5D0 \uB80C\uB354\uB9C1\uD558\uB294 \uAC00\uC0C1 \uC2A4\uD06C\uB864\uC744 \uC801\uC6A9\uD558\uACE0, aria-setsize\uC640 aria-posinset\uC73C\uB85C \uC804\uCCB4 \uC21C\uBC88\uC744 \uC720\uC9C0\uD574 \uC918."
30732
+ },
30733
+ en: {
30734
+ definition: "A rendering optimization that preserves full scroll height while mounting only the visible rows plus a small overscan buffer in the DOM.",
30735
+ example: "Instead of rendering 10,000 chat or log rows at once, mount only the ~25 rows near the current scroll position while keeping native scrollbar proportions accurate.",
30736
+ promptSnippet: "Virtualize large lists by mounting only visible rows plus an overscan buffer between top/bottom spacer elements, preserving exact scroll height and aria-setsize/aria-posinset semantics."
30737
+ }
30738
+ }
30739
+ }
30740
+ };
30741
+
30742
+ // ../../packages/catalog/src/glossary/engineering.ts
30743
+ var ENGINEERING_GLOSSARY_DATA = {
30744
+ debounce: {
30745
+ aliases: {
30746
+ ko: ["\uB514\uBC14\uC6B4\uC2F1", "\uC785\uB825 \uC9C0\uC5F0 \uD638\uCD9C", "\uD0C0\uC790 \uBA48\uCD98 \uB4A4 \uAC80\uC0C9", "\uC5F0\uC18D \uC785\uB825 \uBB36\uAE30", "API \uD638\uCD9C \uD69F\uC218 \uC904\uC774\uAE30"],
30747
+ en: ["debouncing", "input delay", "trailing debounce", "search input throttling"]
30748
+ },
30749
+ text: {
30750
+ ko: {
30751
+ definition: "\uC5F0\uC18D\uD574\uC11C \uBE60\uB974\uAC8C \uBC1C\uC0DD\uD558\uB294 \uC774\uBCA4\uD2B8\uAC00 \uC77C\uC815 \uC2DC\uAC04 \uB3D9\uC548 \uBA48\uCD98 \uB4A4 \uB9C8\uC9C0\uB9C9 \uD55C \uBC88\uB9CC \uC2E4\uC81C \uD568\uC218\uB97C \uC2E4\uD589\uD558\uB3C4\uB85D \uC9C0\uC5F0\uC2DC\uD0A4\uB294 \uC81C\uC5B4 \uAE30\uBC95\uC785\uB2C8\uB2E4.",
30752
+ example: '\uAC80\uC0C9\uCC3D\uC5D0 "\uC2A4\uCF08\uB808\uD1A4"\uC744 \uC785\uB825\uD558\uB294 \uB3D9\uC548 \uAE00\uC790\uB9C8\uB2E4 \uC11C\uBC84 \uC694\uCCAD\uC744 \uBCF4\uB0B4\uC9C0 \uC54A\uACE0, \uC785\uB825\uC774 250ms \uBA48\uCD98 \uB4A4 \uD55C \uBC88\uB9CC \uAC80\uC0C9 API\uB97C \uD638\uCD9C\uD558\uBA70 \uC5B8\uB9C8\uC6B4\uD2B8 \uC2DC \uB300\uAE30 \uD0C0\uC774\uBA38\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.',
30753
+ promptSnippet: "\uAC80\uC0C9 \uC785\uB825\uC774\uB098 \uC790\uB3D9 \uC800\uC7A5 \uC774\uBCA4\uD2B8\uC5D0\uB294 \uC785\uB825\uC774 \uC77C\uC815 \uC2DC\uAC04(\uC608: 250ms) \uBA48\uCD98 \uB4A4 \uB9C8\uC9C0\uB9C9 \uAC12\uC73C\uB85C\uB9CC \uC2E4\uD589\uB418\uB3C4\uB85D \uB514\uBC14\uC6B4\uC2A4\uB97C \uC801\uC6A9\uD558\uACE0, \uC774\uC804 \uB300\uAE30 \uD0C0\uC774\uBA38\uC640 \uCDE8\uC18C \uAC00\uB2A5\uD55C \uBE44\uB3D9\uAE30 \uC694\uCCAD\uC740 \uC5B8\uB9C8\uC6B4\uD2B8\uB098 \uC0C8 \uC785\uB825 \uC2DC \uC815\uB9AC\uD574 \uC918."
30754
+ },
30755
+ en: {
30756
+ definition: "A rate-control technique that delays execution until a burst of rapid events settles for a specified quiet window, running only once with the latest input.",
30757
+ example: "Rather than firing an API call on every keystroke while typing a search query, wait 250ms after the last keystroke and cancel pending timers on unmount.",
30758
+ promptSnippet: "Debounce high-frequency handlers like search inputs or autosave (e.g., 250ms quiet window) so only the final value triggers work, and clean up pending timers or stale requests on unmount or newer input."
30759
+ }
30760
+ }
30761
+ },
30762
+ "optimistic-update": {
30763
+ aliases: {
30764
+ ko: ["\uB099\uAD00\uC801 UI", "\uC120\uBC18\uC601 \uD6C4\uB3D9\uAE30\uD654", "\uC11C\uBC84 \uC751\uB2F5 \uC804\uC5D0 \uD654\uBA74 \uBA3C\uC800 \uBC14\uAFB8\uAE30", "\uC989\uC2DC \uBC18\uC601 \uD6C4 \uC2E4\uD328 \uC2DC \uBCF5\uAD6C"],
30765
+ en: ["optimistic UI", "optimistic rendering", "instant UI update with rollback"]
30766
+ },
30767
+ text: {
30768
+ ko: {
30769
+ definition: "\uC11C\uBC84 \uC694\uCCAD\uC774 \uC131\uACF5\uD560 \uAC83\uC774\uB77C\uACE0 \uAC00\uC815\uD574 UI \uC0C1\uD0DC\uB97C \uBA3C\uC800 \uC989\uC2DC \uBC18\uC601\uD558\uACE0, \uC2E4\uC81C \uC694\uCCAD\uC774 \uC2E4\uD328\uD558\uBA74 \uC774\uC804 \uC0C1\uD0DC\uB85C \uB418\uB3CC\uB9AC\uACE0 \uC624\uB958\uB97C \uC548\uB0B4\uD558\uB294 \uAC31\uC2E0 \uD328\uD134\uC785\uB2C8\uB2E4.",
30770
+ example: "\uB313\uAE00 \uC88B\uC544\uC694 \uBC84\uD2BC\uC744 \uB204\uB974\uBA74 \uC989\uC2DC \uD65C\uC131 \uC0C1\uD0DC\uC640 +1\uC744 \uD45C\uC2DC\uD55C \uB4A4 \uC11C\uBC84\uC5D0 \uC800\uC7A5 \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0, \uB124\uD2B8\uC6CC\uD06C\uAC00 \uC2E4\uD328\uD558\uBA74 \uC6D0\uB798 \uC22B\uC790\uB85C \uB864\uBC31\uD569\uB2C8\uB2E4. \uC815\uC801 UI \uB370\uBAA8\uB294 \uB85C\uCEEC \uC0C1\uD0DC \uC804\uD658\uB9CC \uC2DC\uC5F0\uD558\uBA70 \uC2E4\uC81C \uC11C\uBC84 \uB864\uBC31\uC744 \uAD6C\uD604\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
30771
+ promptSnippet: "\uC88B\uC544\uC694 \uD1A0\uAE00\uC774\uB098 \uC791\uC5C5 \uC0C1\uD0DC \uBCC0\uACBD\uCC98\uB7FC \uCCB4\uAC10 \uC18D\uB3C4\uAC00 \uC911\uC694\uD55C \uC561\uC158\uC5D0\uB294 \uB099\uAD00\uC801 \uC5C5\uB370\uC774\uD2B8\uB97C \uC801\uC6A9\uD574 UI\uB97C \uBA3C\uC800 \uAC31\uC2E0\uD558\uACE0, \uC2E4\uC81C API \uC694\uCCAD\uC774 \uC2E4\uD328\uD558\uBA74 \uC9C1\uC804 \uC2A4\uB0C5\uC0F7\uC73C\uB85C \uB864\uBC31\uD55C \uB4A4 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC624\uB958 \uC548\uB0B4\uB97C \uD45C\uC2DC\uD574 \uC918."
30772
+ },
30773
+ en: {
30774
+ definition: "An update pattern that immediately applies the expected UI change before the server responds, then confirms on success or rolls back with an error if the request fails.",
30775
+ example: "Toggling a heart reaction highlights the button right away while the save request is in flight, rolling back the count if the server rejects it. Static UI demos only toggle local state without real persistence.",
30776
+ promptSnippet: "Apply optimistic updates for responsive interactions like reactions or status toggles by updating local state immediately, keeping a previous snapshot to roll back on API failure, and surfacing a clear error."
30777
+ }
30778
+ }
30779
+ },
30780
+ idempotency: {
30781
+ aliases: {
30782
+ ko: ["\uBA71\uB4F1\uC131 \uD0A4", "\uACB0\uC81C \uB450 \uBC88 \uBC29\uC9C0", "\uC911\uBCF5 \uACB0\uC81C \uB9C9\uAE30", "\uC911\uBCF5 \uC694\uCCAD \uBC29\uC9C0", "\uC7AC\uC2DC\uB3C4 \uC548\uC804\uC131"],
30783
+ en: ["idempotency key", "duplicate request prevention", "prevent double charge", "safe retry"]
30784
+ },
30785
+ text: {
30786
+ ko: {
30787
+ definition: "\uAC19\uC740 \uC694\uCCAD\uC744 \uB124\uD2B8\uC6CC\uD06C \uC7AC\uC2DC\uB3C4\uB098 \uB354\uBE14 \uD074\uB9AD\uC73C\uB85C \uC5EC\uB7EC \uBC88 \uBCF4\uB0B4\uB354\uB77C\uB3C4 \uC11C\uBC84 \uC0C1\uD0DC\uAC00 \uCC98\uC74C \uD55C \uBC88 \uCC98\uB9AC\uB41C \uAC83\uACFC \uB3D9\uC77C\uD558\uAC8C \uC720\uC9C0\uB418\uB294 \uC131\uC9C8\uC785\uB2C8\uB2E4.",
30788
+ example: "\uACB0\uC81C \uC694\uCCAD\uB9C8\uB2E4 \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uACE0\uC720\uD55C Idempotency-Key\uB97C \uD568\uAED8 \uBCF4\uB0B4\uBA74, \uD0C0\uC784\uC544\uC6C3 \uD6C4 \uC7AC\uC804\uC1A1\uD558\uB354\uB77C\uB3C4 \uC11C\uBC84\uAC00 \uC774\uBBF8 \uCC98\uB9AC\uB41C \uB3D9\uC77C \uD0A4\uB97C \uAC10\uC9C0\uD574 \uB450 \uBC88 \uCD9C\uAE08\uD558\uC9C0 \uC54A\uACE0 \uAE30\uC874 \uACB0\uACFC\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. \uC774\uB294 \uC11C\uBC84\xB7\uC6D0\uC7A5 \uC124\uACC4 \uC6D0\uCE59\uC774\uBA70 \uB2E8\uC21C UI \uBC84\uD2BC \uBE44\uD65C\uC131\uD654\uB9CC\uC73C\uB85C\uB294 \uBCF4\uC7A5\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
30789
+ promptSnippet: "\uACB0\uC81C\xB7\uCD9C\uAE08\xB7\uC6F9\uD6C5 \uC7AC\uC2E4\uD589 \uB4F1 \uC911\uBCF5 \uC2E4\uD589\uB418\uBA74 \uC548 \uB418\uB294 \uBCC0\uACBD API\uC5D0\uB294 \uC694\uCCAD\uBCC4 \uACE0\uC720 idempotency key\uB97C \uC800\uC7A5\xB7\uAC80\uC99D\uD574 \uB3D9\uC77C \uD0A4\uC758 \uC7AC\uC2DC\uB3C4\uAC00 \uAE30\uC874 \uCC98\uB9AC \uACB0\uACFC\uB97C \uBC18\uD658\uD558\uB3C4\uB85D \uAD6C\uD604\uD558\uACE0, UI \uBC84\uD2BC \uC81C\uC5B4\uB9CC\uC73C\uB85C \uC911\uBCF5\uC744 \uB9C9\uC73C\uB824 \uD558\uC9C0 \uB9C8."
30790
+ },
30791
+ en: {
30792
+ definition: "A property ensuring that repeating the exact same operation\u2014due to retries, timeouts, or double clicks\u2014produces the same state as executing it once.",
30793
+ example: "Attaching a unique Idempotency-Key per checkout attempt lets the backend recognize retried requests and return the original receipt instead of charging twice. UI button disabling alone cannot guarantee idempotency.",
30794
+ promptSnippet: "Protect critical mutations such as payments, payouts, or webhook replays on the server using unique idempotency keys persisted atomically with the transaction, returning the original outcome on duplicate attempts."
30795
+ }
30796
+ }
30797
+ },
30798
+ "role-based-access-control": {
30799
+ aliases: {
30800
+ ko: ["RBAC", "\uC5ED\uD560 \uAE30\uBC18 \uAD8C\uD55C", "\uAD8C\uD55C \uC81C\uC5B4", "\uAD00\uB9AC\uC790 \uC77C\uBC18 \uC0AC\uC6A9\uC790 \uAD8C\uD55C \uBD84\uB9AC", "\uCD5C\uC18C \uAD8C\uD55C"],
30801
+ en: ["RBAC", "role based access control", "role permissions", "least privilege access"]
30802
+ },
30803
+ text: {
30804
+ ko: {
30805
+ definition: "\uAC1C\uBCC4 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C1\uC811 \uAD8C\uD55C\uC744 \uBD99\uC774\uB294 \uB300\uC2E0 \uAD00\uB9AC\uC790\xB7\uD3B8\uC9D1\uC790\xB7\uC5F4\uB78C\uC790 \uAC19\uC740 \uC5ED\uD560(Role)\uC5D0 \uAD8C\uD55C\uC744 \uBB36\uC5B4 \uBD80\uC5EC\uD558\uACE0, \uC11C\uBC84\uC640 UI\uC5D0\uC11C \uC5ED\uD560\uC5D0 \uB530\uB77C \uC811\uADFC\uC744 \uD1B5\uC81C\uD558\uB294 \uBC29\uC2DD\uC785\uB2C8\uB2E4.",
30806
+ example: "\uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC5D0\uC11C \uC5F4\uB78C\uC790 \uC5ED\uD560\uC740 \uBB38\uC11C\uB97C \uC77D\uC744 \uC218\uB9CC \uC788\uACE0 \uACB0\uC81C \uC124\uC815\uC774\uB098 \uAD6C\uC131\uC6D0 \uC0AD\uC81C API\uB294 \uC11C\uBC84\uC5D0\uC11C 403\uC73C\uB85C \uCC28\uB2E8\uD569\uB2C8\uB2E4. UI\uC5D0\uC11C \uBA54\uB274\uB97C \uC228\uAE30\uB294 \uAC83\uC740 \uBCF4\uC870 \uC218\uB2E8\uC77C \uBFD0 \uC2E4\uC81C \uAD8C\uD55C \uD1B5\uC81C\uB294 \uC11C\uBC84 \uC778\uAC00\uC5D0\uC11C \uAC15\uC81C\uD569\uB2C8\uB2E4.",
30807
+ promptSnippet: "\uC5ED\uD560 \uAE30\uBC18 \uC811\uADFC \uC81C\uC5B4(RBAC)\uB97C \uC124\uACC4\uD560 \uB54C \uC5ED\uD560\uBCC4 \uD5C8\uC6A9 \uC561\uC158 \uB9E4\uD2B8\uB9AD\uC2A4\uC640 \uCD5C\uC18C \uAD8C\uD55C \uC6D0\uCE59\uC744 \uC815\uC758\uD558\uACE0, UI \uB178\uCD9C \uC81C\uC5B4\uC640 \uBCC4\uAC1C\uB85C \uBAA8\uB4E0 \uC11C\uBC84 API \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uC5D0\uC11C \uD604\uC7AC \uC870\uC9C1\xB7\uC5ED\uD560 \uAD8C\uD55C\uC744 \uAC80\uC99D\uD574 \uC918. \uB9C8\uC9C0\uB9C9 \uCD5C\uACE0\uAD00\uB9AC\uC790 \uAC15\uB4F1\xB7\uC0AD\uC81C\uB3C4 \uCC28\uB2E8\uD574 \uC918."
30808
+ },
30809
+ en: {
30810
+ definition: "An authorization model that assigns permissions to roles (such as Admin, Editor, Viewer) rather than individual users, enforcing access boundaries across APIs and views.",
30811
+ example: "A Viewer can read workspace documents while billing mutations are rejected with 403 on the backend. Hiding buttons in the UI is only cosmetic; real enforcement lives in server authorization.",
30812
+ promptSnippet: "Implement Role-Based Access Control (RBAC) with explicit role-permission mappings and least-privilege defaults, enforcing checks on every backend endpoint (not just hiding UI controls) and guarding against removing the last admin."
30813
+ }
30814
+ }
30815
+ },
30816
+ "server-sent-events": {
30817
+ aliases: {
30818
+ ko: ["SSE", "\uB2E8\uBC29\uD5A5 \uC11C\uBC84 \uC2A4\uD2B8\uB9AC\uBC0D", "\uC2E4\uC2DC\uAC04 \uD1A0\uD070 \uC2A4\uD2B8\uB9AC\uBC0D", "EventSource \uC2A4\uD2B8\uB9BC"],
30819
+ en: ["SSE", "EventSource", "HTTP streaming", "unidirectional server push"]
30820
+ },
30821
+ text: {
30822
+ ko: {
30823
+ definition: "\uD558\uB098\uC758 HTTP \uC5F0\uACB0\uC744 \uC720\uC9C0\uD55C \uCC44 \uC11C\uBC84\uAC00 \uD074\uB77C\uC774\uC5B8\uD2B8\uB85C \uD14D\uC2A4\uD2B8 \uC774\uBCA4\uD2B8 \uC2A4\uD2B8\uB9BC\uC744 \uB2E8\uBC29\uD5A5\uC73C\uB85C \uC2E4\uC2DC\uAC04 \uBC00\uC5B4\uC8FC\uB294 \uC6F9 \uD45C\uC900 \uAE30\uC220\uC785\uB2C8\uB2E4.",
30824
+ example: "AI \uCC57\uBD07 \uB2F5\uBCC0\uC774 \uC0DD\uC131\uB418\uB294 \uB300\uB85C \uD1A0\uD070 \uC870\uAC01\uC744 \uD654\uBA74\uC5D0 \uD55C \uAE00\uC790\uC529 \uD758\uB824\uBCF4\uB0B4\uAC70\uB098, \uC9C4\uD589 \uC911\uC778 \uC791\uC5C5 \uB85C\uADF8\uB97C \uBE0C\uB77C\uC6B0\uC800\uAC00 \uC911\uB2E8(AbortController) \uBC0F \uC7AC\uC5F0\uACB0\uD560 \uC218 \uC788\uAC8C \uC2A4\uD2B8\uB9AC\uBC0D\uD569\uB2C8\uB2E4.",
30825
+ promptSnippet: "AI \uC751\uB2F5\uC774\uB098 \uC2E4\uC2DC\uAC04 \uC9C4\uD589 \uB85C\uADF8\uB97C \uB2E8\uBC29\uD5A5\uC73C\uB85C \uC2A4\uD2B8\uB9AC\uBC0D\uD560 \uB54C \uC11C\uBC84 \uC804\uC1A1 \uC774\uBCA4\uD2B8(SSE) \uADDC\uACA9\uC744 \uC0AC\uC6A9\uD558\uACE0, \uD074\uB77C\uC774\uC5B8\uD2B8\uC5D0\uB294 \uC911\uC9C0(AbortController), \uC5F0\uACB0 \uB04A\uAE40 \uC548\uB0B4, \uB9C8\uC9C0\uB9C9 \uC218\uC2E0 \uC774\uBCA4\uD2B8 ID \uAE30\uBC18 \uBCF5\uAD6C \uD750\uB984\uC744 \uD568\uAED8 \uAD6C\uD604\uD574 \uC918."
30826
+ },
30827
+ en: {
30828
+ definition: "A web standard allowing a server to push real-time text events over a single long-lived HTTP connection from server to client.",
30829
+ example: "Stream LLM response tokens incrementally as they are generated while supporting user-triggered AbortController cancellation and automatic reconnection.",
30830
+ promptSnippet: "Use Server-Sent Events (SSE) for unidirectional streaming such as LLM token output or live status feeds, pairing it with AbortController cancellation, disconnect banners, and safe reconnect handling."
30831
+ }
30832
+ }
30833
+ },
30834
+ "retrieval-augmented-generation": {
30835
+ aliases: {
30836
+ ko: ["RAG", "\uBB38\uC11C \uAC80\uC0C9 \uAE30\uBC18 \uB2F5\uBCC0", "\uCD9C\uCC98 \uC778\uC6A9 AI", "\uC9C0\uC2DD \uAE30\uBC18 \uAC80\uC0C9 \uC99D\uAC15", "\uD560\uB8E8\uC2DC\uB124\uC774\uC158 \uC904\uC774\uAE30"],
30837
+ en: ["RAG", "retrieval augmented generation", "grounded generation", "citation-backed AI"]
30838
+ },
30839
+ text: {
30840
+ ko: {
30841
+ definition: "\uC5B8\uC5B4 \uBAA8\uB378\uC774 \uD559\uC2B5 \uAE30\uC5B5\uC5D0\uB9CC \uC758\uC874\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC678\uBD80 \uBB38\uC11C\xB7\uC9C0\uC2DD\uBCA0\uC774\uC2A4\uC5D0\uC11C \uAD00\uB828 \uADFC\uAC70\uB97C \uBA3C\uC800 \uAC80\uC0C9\uD574 \uD504\uB86C\uD504\uD2B8 \uBB38\uB9E5\uC5D0 \uC8FC\uC785\uD55C \uB4A4, \uCD9C\uCC98\uC640 \uD568\uAED8 \uB2F5\uBCC0\uC744 \uC0DD\uC131\uD558\uAC8C \uD558\uB294 \uC544\uD0A4\uD14D\uCC98\uC785\uB2C8\uB2E4.",
30842
+ example: "\uC0AC\uB0B4 \uADDC\uC815 \uCC57\uBD07\uC774 \uC9C8\uBB38\uACFC \uAD00\uB828\uB41C \uCD5C\uC2E0 \uBB38\uC11C \uB2E8\uB77D 3\uAC74\uC744 \uBA3C\uC800 \uCC3E\uC544 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0 \uB123\uACE0, \uB2F5\uBCC0 \uBB38\uC7A5 \uB05D\uC5D0 [1], [2] \uC778\uB77C\uC778 \uC778\uC6A9 \uCE69\uC744 \uBD99\uC5EC \uC6D0\uBB38 \uADFC\uAC70\uB97C \uBC14\uB85C \uD655\uC778\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.",
30843
+ promptSnippet: "\uAC80\uC0C9 \uC99D\uAC15 \uC0DD\uC131(RAG) \uD750\uB984\uC5D0\uC11C\uB294 \uC0AC\uC6A9\uC790 \uC9C8\uC758\uB85C \uAC80\uC99D\uB41C \uBB38\uC11C\uB97C \uBA3C\uC800 \uAC80\uC0C9\uD574 \uCEE8\uD14D\uC2A4\uD2B8 \uC608\uC0B0 \uC548\uC5D0 \uC8FC\uC785\uD558\uACE0, \uB2F5\uBCC0\uC5D0\uB294 \uC778\uB77C\uC778 \uCD9C\uCC98 \uC778\uC6A9\uACFC \uADFC\uAC70\uAC00 \uBD80\uC871\uD560 \uB54C \uBAA8\uB978\uB2E4\uACE0 \uB2F5\uD558\uB294 \uAC00\uB4DC\uB808\uC77C\uC744 \uD3EC\uD568\uD574 \uC918."
30844
+ },
30845
+ en: {
30846
+ definition: "An AI architecture that retrieves relevant passages from an external knowledge base before generation and injects them into the prompt context so answers stay grounded and citable.",
30847
+ example: "A policy assistant retrieves the top matching handbook excerpts, passes them within the token budget, and renders inline citation chips linking back to each source.",
30848
+ promptSnippet: "Design the Retrieval-Augmented Generation (RAG) pipeline to retrieve relevant documents within the context token budget, attach inline source citations to claims, and fall back safely when no supporting evidence is found."
30849
+ }
30850
+ }
30851
+ },
30852
+ "dead-letter-queue": {
30853
+ aliases: {
30854
+ ko: ["DLQ", "\uC2E4\uD328 \uC791\uC5C5 \uBCF4\uAD00 \uD050", "\uC6F9\uD6C5 \uC2E4\uD328 \uC7AC\uCC98\uB9AC \uD050", "\uC7AC\uC2DC\uB3C4 \uCD08\uACFC \uD050"],
30855
+ en: ["DLQ", "dead letter queue", "failed job queue", "poison message queue"]
30856
+ },
30857
+ text: {
30858
+ ko: {
30859
+ definition: "\uBC31\uADF8\uB77C\uC6B4\uB4DC \uC791\uC5C5\uC774\uB098 \uC6F9\uD6C5 \uC804\uC1A1\uC774 \uC815\uD574\uC9C4 \uC7AC\uC2DC\uB3C4 \uD69F\uC218\uB97C \uBAA8\uB450 \uCD08\uACFC\uD574 \uC2E4\uD328\uD588\uC744 \uB54C \uBA54\uC2DC\uC9C0\uB97C \uBC84\uB9AC\uC9C0 \uC54A\uACE0 \uBCC4\uB3C4 \uD050\uC5D0 \uACA9\uB9AC\uD574 \uC6D0\uC778 \uC870\uC0AC\uC640 \uC218\uB3D9 \uC7AC\uC2E4\uD589\uC744 \uAC00\uB2A5\uD558\uAC8C \uD558\uB294 \uD328\uD134\uC785\uB2C8\uB2E4.",
30860
+ example: "\uACB0\uC81C \uC644\uB8CC \uC6F9\uD6C5\uC774 \uC0C1\uB300 \uC11C\uBC84 \uC7A5\uC560\uB85C 5\uD68C \uC5F0\uC18D \uC2E4\uD328\uD558\uBA74 \uB370\uB4DC \uB808\uD130 \uD050(DLQ)\uB85C \uC774\uB3D9\uC2DC\uCF1C \uC6B4\uC601\uC790\uAC00 \uC624\uB958 \uC6D0\uC778\uC744 \uD655\uC778\uD55C \uB4A4 \uBA71\uB4F1\uC131 \uC788\uAC8C \uB2E4\uC2DC \uC804\uC1A1\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.",
30861
+ promptSnippet: "\uBE44\uB3D9\uAE30 \uC6F9\uD6C5\xB7\uC54C\uB9BC\xB7\uACB0\uC81C \uD6C4\uCC98\uB9AC \uC6CC\uCEE4\uC5D0\uB294 \uC9C0\uC218 \uBC31\uC624\uD504 \uC7AC\uC2DC\uB3C4\uC640 \uD568\uAED8 \uCD5C\uB300 \uC7AC\uC2DC\uB3C4 \uCD08\uACFC \uC2DC \uBA54\uC2DC\uC9C0\uB97C \uACA9\uB9AC\uD558\uB294 \uB370\uB4DC \uB808\uD130 \uD050(DLQ)\uB97C \uB450\uACE0, \uC6B4\uC601\uC790\uAC00 \uC624\uB958 payload\uB97C \uC870\uD68C\uD574 \uBA71\uB4F1\uD558\uAC8C \uC7AC\uC2E4\uD589\uD560 \uC218 \uC788\uAC8C \uD574 \uC918."
30862
+ },
30863
+ en: {
30864
+ definition: "A dedicated holding queue where messages or webhook deliveries are routed after exhausting all retry attempts, preventing silent data loss and enabling inspection and replay.",
30865
+ example: "When an outbound billing webhook fails 5 times due to a partner outage, move the payload to a Dead-Letter Queue (DLQ) so operators can inspect the error and safely replay it later.",
30866
+ promptSnippet: "Configure exponential-backoff retries paired with a Dead-Letter Queue (DLQ) for exhausted jobs or webhooks, exposing failure metadata and an idempotent manual replay action."
30867
+ }
30868
+ }
30869
+ },
30870
+ "audit-log": {
30871
+ aliases: {
30872
+ ko: ["\uBCF4\uC548 \uAC10\uC0AC \uB85C\uADF8", "\uBCC0\uACBD \uC774\uB825 \uAE30\uB85D", "\uAD00\uB9AC\uC790 \uD65C\uB3D9 \uB85C\uADF8", "\uB204\uAC00 \uC5B8\uC81C \uBC14\uAFE8\uB294\uC9C0 \uAE30\uB85D"],
30873
+ en: ["audit trail", "activity audit log", "security event log", "change history log"]
30874
+ },
30875
+ text: {
30876
+ ko: {
30877
+ definition: "\uB204\uAC00\xB7\uC5B8\uC81C\xB7\uC5B4\uB5A4 \uB300\uC0C1\uC5D0\xB7\uBB34\uC2A8 \uBCC0\uACBD\uC774\uB098 \uC5F4\uB78C\uC744 \uC218\uD589\uD588\uB294\uC9C0 \uBCC0\uC870\uD558\uAE30 \uC5B4\uB835\uAC8C \uC2DC\uAC04\uC21C\uC73C\uB85C \uB0A8\uAE30\uB294 \uCD94\uC801 \uAE30\uB85D\uC785\uB2C8\uB2E4.",
30878
+ example: "\uAD00\uB9AC\uC790\uAC00 \uD300\uC6D0\uC758 \uC5ED\uD560\uC744 \uBCC0\uACBD\uD558\uAC70\uB098 API \uD0A4\uB97C \uD3D0\uAE30\uD558\uBA74 \uD589\uC704\uC790, IP, \uB300\uC0C1 \uB9AC\uC18C\uC2A4, \uBCC0\uACBD \uC804\uD6C4 \uC694\uC57D\uC744 \uAC10\uC0AC \uB85C\uADF8\uC5D0 \uB0A8\uAE30\uB418 \uBE44\uBC00\uBC88\uD638\uB098 \uD1A0\uD070 \uC6D0\uBB38\uC740 \uB9C8\uC2A4\uD0B9\uD569\uB2C8\uB2E4.",
30879
+ promptSnippet: "\uAD8C\uD55C \uBCC0\uACBD, API \uD0A4 \uBC1C\uAE09\xB7\uD3D0\uAE30, \uBBFC\uAC10 \uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC \uAC19\uC740 \uC911\uC694 \uC774\uBCA4\uD2B8\uB9C8\uB2E4 \uD589\uC704\uC790\xB7\uC2DC\uAC01\xB7\uB300\uC0C1\xB7\uC694\uCCAD \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uAC10\uC0AC \uB85C\uADF8(Audit Log)\uC5D0 \uCD94\uAC00 \uC804\uC6A9\uC73C\uB85C \uAE30\uB85D\uD558\uACE0, \uBE44\uBC00\uAC12\uACFC \uAC1C\uC778\uC815\uBCF4\uB294 \uB9C8\uC2A4\uD0B9\uD574 \uC918."
30880
+ },
30881
+ en: {
30882
+ definition: "An append-only chronological record capturing who performed what action, on which resource, and when\u2014used for security review, compliance, and incident investigation.",
30883
+ example: "Record role changes, API key revocations, and sensitive file downloads with actor, timestamp, and before/after summary while redacting secrets or raw tokens.",
30884
+ promptSnippet: "Emit append-only audit log entries for security- and billing-sensitive events (actor, timestamp, target resource, action outcome) while redacting credentials and sensitive PII."
30885
+ }
30886
+ }
30887
+ }
30888
+ };
30889
+
30890
+ // ../../packages/catalog/src/glossary/workflow.ts
30891
+ var WORKFLOW_GLOSSARY_DATA = {
30892
+ "human-in-the-loop": {
30893
+ aliases: {
30894
+ ko: ["HITL", "\uD734\uBA3C\uC778\uB354\uB8E8\uD504", "\uC0AC\uB78C \uC2B9\uC778 \uB2E8\uACC4", "\uC5D0\uC774\uC804\uD2B8 \uC2E4\uD589 \uC804 \uD655\uC778", "\uC704\uD5D8 \uC791\uC5C5 \uC2B9\uC778"],
30895
+ en: ["HITL", "human in the loop", "human approval guardrail", "manual review gate"]
30896
+ },
30897
+ text: {
30898
+ ko: {
30899
+ definition: "AI \uC5D0\uC774\uC804\uD2B8\uB098 \uC790\uB3D9\uD654 \uC6CC\uD06C\uD50C\uB85C\uAC00 \uB418\uB3CC\uB9AC\uAE30 \uC5B4\uB824\uC6B4 \uC791\uC5C5(\uC0AD\uC81C\xB7\uACB0\uC81C\xB7\uC678\uBD80 \uBC1C\uC1A1 \uB4F1)\uC744 \uC2E4\uD589\uD558\uAE30 \uC9C1\uC804\uC5D0 \uC2E4\uD589\uC744 \uBA48\uCD94\uACE0 \uC0AC\uB78C\uC758 \uBA85\uC2DC\uC801 \uC2B9\uC778 \uB610\uB294 \uAC70\uC808\uC744 \uC694\uAD6C\uD558\uB294 \uC548\uC804 \uC808\uCC28\uC785\uB2C8\uB2E4.",
30900
+ example: "AI \uBE44\uC11C\uAC00 \uACE0\uAC1D\uC5D0\uAC8C \uD658\uBD88 \uBA54\uC77C\uC744 \uBC1C\uC1A1\uD558\uAC70\uB098 DB \uD14C\uC774\uBE14\uC744 \uC218\uC815\uD558\uAE30 \uC804\uC5D0 \uC601\uD5A5 \uBC94\uC704\uC640 \uC2E4\uD589 \uD30C\uB77C\uBBF8\uD130\uB97C \uCE74\uB4DC\uB85C \uBCF4\uC5EC \uC8FC\uACE0 [\uC2B9\uC778] \uBC84\uD2BC\uC744 \uB204\uB978 \uACBD\uC6B0\uC5D0\uB9CC \uC2E4\uC81C \uB3C4\uAD6C\uB97C \uC2E4\uD589\uD569\uB2C8\uB2E4.",
30901
+ promptSnippet: "AI \uC5D0\uC774\uC804\uD2B8\uB098 \uC790\uB3D9\uD654 \uD30C\uC774\uD504\uB77C\uC778\uC5D0\uC11C \uD30C\uAD34\uC801\xB7\uAE08\uC804\uC801\xB7\uC678\uBD80 \uC804\uD30C \uC791\uC5C5\uC740 \uC790\uB3D9 \uC2E4\uD589\uD558\uC9C0 \uB9D0\uACE0 \uC778\uAC04 \uAC1C\uC785 \uC2B9\uC778(HITL) \uAC8C\uC774\uD2B8\uB97C \uB450\uC5B4 \uB300\uC0C1\uACFC \uD30C\uB77C\uBBF8\uD130 \uC694\uC57D\uC744 \uBCF4\uC5EC \uC900 \uB4A4 \uBA85\uC2DC\uC801 \uC2B9\uC778 \uD6C4\uC5D0\uB9CC \uC9C4\uD589\uB418\uAC8C \uD574 \uC918."
30902
+ },
30903
+ en: {
30904
+ definition: "A workflow guardrail that pauses an AI agent or automation before high-impact or irreversible actions, requiring explicit human approval or rejection to proceed.",
30905
+ example: "Before an agent sends external emails or deletes records, pause execution and surface the exact tool parameters and impact summary for a user to approve or reject.",
30906
+ promptSnippet: "Gate irreversible, financial, or external-facing automated actions behind a Human-in-the-Loop (HITL) approval step that displays exact parameters and risk context before execution."
30907
+ }
30908
+ }
30909
+ },
30910
+ "service-level-agreement": {
30911
+ aliases: {
30912
+ ko: ["SLA", "\uC751\uB300 \uBAA9\uD45C \uC2DC\uAC04", "\uCC98\uB9AC \uAE30\uD55C \uC57D\uC18D", "\uC9C0\uC6D0 \uD2F0\uCF13 \uB9C8\uAC10 \uAE30\uD55C", "SLA \uD0C0\uC774\uBA38"],
30913
+ en: ["SLA", "response time target", "resolution target", "support SLA timer"]
30914
+ },
30915
+ text: {
30916
+ ko: {
30917
+ definition: "\uACE0\uAC1D\uC9C0\uC6D0\xB7\uC6B4\uC601 \uC870\uC9C1\uC774 \uBB38\uC758\uB098 \uC7A5\uC560\uC5D0 \uCCAB \uC751\uB2F5\xB7\uD574\uACB0\uC744 \uC644\uB8CC\uD558\uAE30\uB85C \uC57D\uC18D\uD55C \uBAA9\uD45C \uC2DC\uAC04\uACFC \uC601\uC5C5\uC2DC\uAC04 \uACC4\uC0B0\xB7\uC784\uBC15 \uACBD\uACE0\xB7\uC5D0\uC2A4\uCEEC\uB808\uC774\uC158 \uAE30\uC900\uC785\uB2C8\uB2E4.",
30918
+ example: "\uAE34\uAE09 \uBB38\uC758\uB294 \uCCAB \uC751\uB2F5 1\uC2DC\uAC04 \uC774\uB0B4 SLA\uB97C \uC801\uC6A9\uD558\uACE0, \uACE0\uAC1D \uB2F5\uBCC0\uC744 \uAE30\uB2E4\uB9AC\uB294 \uB3D9\uC548\uC5D0\uB294 \uD0C0\uC774\uBA38\uB97C \uC77C\uC2DC\uC815\uC9C0\uD558\uBA70, \uB9C8\uAC10 15\uBD84 \uC804\uC5D0\uB294 \uB2F4\uB2F9 \uD300\uC5D0 \uACBD\uACE0\uB97C \uBCF4\uB0C5\uB2C8\uB2E4.",
30919
+ promptSnippet: "\uBB38\uC758 \uD050\uB098 \uC6B4\uC601 \uC6CC\uD06C\uD50C\uB85C\uC5D0 \uC11C\uBE44\uC2A4 \uC218\uC900 \uD611\uC57D(SLA) \uAE30\uC900\uC744 \uBC18\uC601\uD560 \uB54C \uC6B0\uC120\uC21C\uC704\uBCC4 \uBAA9\uD45C \uC2DC\uAC04, \uC601\uC5C5\uC2DC\uAC04 \uAE30\uC900 \uD0C0\uC774\uBA38, \uACE0\uAC1D \uB300\uAE30 \uC911 \uC77C\uC2DC\uC815\uC9C0 \uC870\uAC74, \uC784\uBC15\xB7\uCD08\uACFC \uC2DC \uC5D0\uC2A4\uCEEC\uB808\uC774\uC158 \uADDC\uCE59\uC744 \uBA85\uD655\uD788 \uBD84\uB9AC\uD574 \uC124\uACC4\uD574 \uC918."
30920
+ },
30921
+ en: {
30922
+ definition: "A formal commitment defining target first-response and resolution times for support or operations, including business-hour calendars, pause states, and escalation rules.",
30923
+ example: "Apply a 1-hour first-response SLA to urgent tickets, pause the clock while waiting on customer reply, and flag approaching breaches before timeout.",
30924
+ promptSnippet: "Model Service-Level Agreement (SLA) tracking with priority-based target durations, business-hours calculation, explicit pause states (e.g., waiting on customer), and breach escalation alerts."
30925
+ }
30926
+ }
30927
+ },
30928
+ "know-your-customer": {
30929
+ aliases: {
30930
+ ko: ["KYC", "\uACE0\uAC1D \uC2E0\uC6D0 \uD655\uC778", "\uD310\uB9E4\uC790 \uC785\uC810 \uBCF8\uC778\uC778\uC99D", "\uC2E0\uBD84\uC99D \uC778\uC99D \uB2E8\uACC4", "\uD55C\uB3C4 \uC0C1\uD5A5 \uC2EC\uC0AC"],
30931
+ en: ["KYC", "identity verification", "customer verification", "seller onboarding KYC"]
30932
+ },
30933
+ text: {
30934
+ ko: {
30935
+ definition: "\uAE08\uC735\xB7\uC815\uC0B0\xB7\uB9C8\uCF13\uD50C\uB808\uC774\uC2A4 \uC11C\uBE44\uC2A4\uAC00 \uBC95\uC801 \uADDC\uC81C\uC640 \uBD80\uC815 \uAC70\uB798 \uBC29\uC9C0\uB97C \uC704\uD574 \uC0AC\uC6A9\uC790\uC758 \uC2E4\uBA85\xB7\uC0AC\uC5C5\uC790\xB7\uACC4\uC88C \uC18C\uC720 \uC5EC\uBD80\uB97C \uB2E8\uACC4\uBCC4\uB85C \uAC80\uC99D\uD558\uB294 \uC808\uCC28\uC785\uB2C8\uB2E4.",
30936
+ example: "\uD540\uD14C\uD06C \uC9C0\uAC11\uC774\uB098 \uC624\uD508\uB9C8\uCF13\uC5D0\uC11C \uBBF8\uC778\uC99D \uACC4\uC815\uC740 \uC18C\uC561 \uC870\uD68C\uB9CC \uD5C8\uC6A9\uD558\uACE0, \uC2E0\uBD84\uC99D\xB7\uACC4\uC88C \uC778\uC99D(KYC)\uC744 \uB9C8\uCCD0\uC57C \uCD9C\uAE08\uC774\uB098 \uD310\uB9E4\uC790 \uC815\uC0B0 \uD55C\uB3C4\uB97C \uC5F4\uC5B4 \uC90D\uB2C8\uB2E4.",
30937
+ promptSnippet: "\uACB0\uC81C\xB7\uC815\uC0B0\xB7\uCD9C\uAE08 \uAE30\uB2A5\uC774 \uD3EC\uD568\uB41C \uC11C\uBE44\uC2A4\uC5D0\uC11C\uB294 \uACE0\uAC1D \uD655\uC778 \uC808\uCC28(KYC)\uC758 \uAC80\uC99D \uB2E8\uACC4(\uBBF8\uC81C\uCD9C\xB7\uC2EC\uC0AC \uC911\xB7\uC2B9\uC778\xB7\uBCF4\uB958)\uB97C \uBD84\uB9AC\uD558\uACE0, \uBBF8\uC644\uB8CC \uC0C1\uD0DC\uC758 \uAE30\uB2A5 \uC81C\uD55C\uACFC \uBC18\uB824 \uC0AC\uC720 \uC7AC\uC81C\uCD9C \uD750\uB984\uC744 \uC124\uACC4\uD574 \uC918."
30938
+ },
30939
+ en: {
30940
+ definition: "A regulated verification workflow used by fintech and marketplace platforms to confirm user or merchant identity, business legitimacy, and payout account ownership.",
30941
+ example: "Restrict withdrawals and seller payouts while an account is unverified or pending KYC review, and show clear resubmission guidance if documents are rejected.",
30942
+ promptSnippet: "Structure Know Your Customer (KYC) onboarding with explicit verification states (unverified, under review, approved, rejected), capability limits per tier, and clear resubmission feedback."
30943
+ }
30944
+ }
30945
+ },
30946
+ "user-onboarding": {
30947
+ aliases: {
30948
+ ko: ["\uC628\uBCF4\uB529 \uD750\uB984", "\uCD08\uAE30 \uC124\uC815 \uAC00\uC774\uB4DC", "\uC2DC\uC791\uD558\uAE30 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8", "\uCCAB \uC0AC\uC6A9\uC790 \uC548\uB0B4"],
30949
+ en: ["onboarding flow", "getting started checklist", "first-run experience", "activation checklist"]
30950
+ },
30951
+ text: {
30952
+ ko: {
30953
+ definition: "\uC0C8\uB85C \uAC00\uC785\uD55C \uC0AC\uC6A9\uC790\uB098 \uD300\uC774 \uC11C\uBE44\uC2A4\uC758 \uCCAB \uD575\uC2EC \uAC00\uCE58\uB97C \uBE60\uB974\uAC8C \uACBD\uD5D8\uD558\uB3C4\uB85D \uCD08\uAE30 \uC124\uC815\xB7\uD544\uC218 \uC785\uB825\xB7\uB458\uB7EC\uBCF4\uAE30 \uB2E8\uACC4\uB97C \uC21C\uC11C\uB300\uB85C \uC548\uB0B4\uD558\uB294 \uD750\uB984\uC785\uB2C8\uB2E4.",
30954
+ example: '\uD300 \uD611\uC5C5 SaaS \uAC00\uC785 \uC9C1\uD6C4 "1. \uD504\uB85C\uD544 \uC124\uC815 \u2192 2. \uD300\uC6D0 \uCD08\uB300 \u2192 3. \uCCAB \uD504\uB85C\uC81D\uD2B8 \uB9CC\uB4E4\uAE30" \uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uC640 \uC9C4\uD589\uB960 \uB9C9\uB300\uB97C \uBCF4\uC5EC \uC8FC\uC5B4 \uC774\uD0C8 \uC5C6\uC774 \uC2DC\uC791\uD558\uAC8C \uD569\uB2C8\uB2E4.',
30955
+ promptSnippet: "\uC2E0\uADDC \uC0AC\uC6A9\uC790 \uC628\uBCF4\uB529\uC740 \uD55C \uBC88\uC5D0 \uBAA8\uB4E0 \uC124\uC815\uC744 \uAC15\uC694\uD558\uC9C0 \uB9D0\uACE0 3~4\uAC1C\uC758 \uC791\uC740 \uC644\uB8CC \uAC00\uB2A5\uD55C \uB2E8\uACC4\uC640 \uC9C4\uD589\uB960 \uD45C\uC2DC\uB85C \uB098\uB204\uACE0, \uAC74\uB108\uB6F0\uAE30\uC640 \uB098\uC911\uC5D0 \uC774\uC5B4\uD558\uAE30\uB97C \uD5C8\uC6A9\uD574 \uC918."
30956
+ },
30957
+ en: {
30958
+ definition: "A guided activation flow that helps new users or teams complete essential setup steps and reach their first meaningful outcome without feeling overwhelmed.",
30959
+ example: 'After sign-up, present a 3-step checklist ("Profile", "Invite teammates", "Create first project") with a live progress indicator and optional skip.',
30960
+ promptSnippet: "Design user onboarding as a concise 3-4 step checklist with visible progress, clear next-action cues, and safe skip/resume support so users reach core value quickly."
30961
+ }
30962
+ }
30963
+ },
30964
+ "escrow-settlement": {
30965
+ aliases: {
30966
+ ko: ["\uC5D0\uC2A4\uD06C\uB85C \uACB0\uC81C \uC815\uC0B0", "\uAD6C\uB9E4 \uD655\uC815 \uD6C4 \uC9C0\uAE09", "\uB300\uAE08 \uBCF4\uAD00 \uC815\uC0B0", "\uC815\uC0B0 \uBCF4\uB958 \uBC0F \uBD84\uC7C1 \uCC98\uB9AC"],
30967
+ en: ["escrow payout", "held funds settlement", "buyer confirmation release", "marketplace escrow"]
30968
+ },
30969
+ text: {
30970
+ ko: {
30971
+ definition: "\uAD6C\uB9E4\uC790\uC640 \uD310\uB9E4\uC790 \uC0AC\uC774 \uAC70\uB798\uC5D0\uC11C \uD50C\uB7AB\uD3FC\uC774 \uACB0\uC81C \uB300\uAE08\uC744 \uC548\uC804\uD558\uAC8C \uBCF4\uAD00\uD558\uACE0 \uC788\uB2E4\uAC00, \uAD6C\uB9E4 \uD655\uC815\xB7\uBC30\uC1A1 \uC644\uB8CC\xB7\uB9C8\uC77C\uC2A4\uD1A4 \uAC80\uC218\uAC00 \uB05D\uB09C \uB4A4 \uC218\uC218\uB8CC\uB97C \uCC28\uAC10\uD574 \uC815\uC0B0\uD574 \uC8FC\uB294 \uD750\uB984\uC785\uB2C8\uB2E4.",
30972
+ example: "\uB9C8\uCF13\uD50C\uB808\uC774\uC2A4\uC5D0\uC11C \uAD6C\uB9E4\uC790\uAC00 \uACB0\uC81C\uD558\uBA74 \uB300\uAE08\uC740 \uC5D0\uC2A4\uD06C\uB85C \uB300\uAE30 \uC0C1\uD0DC\uB85C \uBB36\uC774\uACE0, \uC0C1\uD488 \uC218\uB839 \uD6C4 [\uAD6C\uB9E4 \uD655\uC815]\uC744 \uB204\uB974\uAC70\uB098 \uC790\uB3D9 \uD655\uC815 \uAE30\uAC04\uC774 \uC9C0\uB098\uBA74 \uC218\uC218\uB8CC\uB97C \uC81C\uC678\uD55C \uAE08\uC561\uC774 \uD310\uB9E4\uC790\uC5D0\uAC8C \uC815\uC0B0\uB429\uB2C8\uB2E4.",
30973
+ promptSnippet: "\uB9C8\uCF13\uD50C\uB808\uC774\uC2A4\uB098 \uC678\uC8FC \uAC70\uB798\uC5D0\uB294 \uACB0\uC81C \uB300\uAE08\uC744 \uC989\uC2DC \uCD9C\uAE08\uC2DC\uD0A4\uC9C0 \uC54A\uACE0 \uBCF4\uAD00 \u2192 \uAD6C\uB9E4 \uD655\uC815(\uB610\uB294 \uAE30\uD55C \uB9CC\uB8CC) \u2192 \uC218\uC218\uB8CC \uCC28\uAC10 \uC815\uC0B0 \u2192 \uBD84\uC7C1 \uC2DC \uC9C0\uAE09 \uBCF4\uB958 \uC0C1\uD0DC\uB97C \uAC70\uCE58\uB294 \uC5D0\uC2A4\uD06C\uB85C \uC815\uC0B0 \uD750\uB984\uC744 \uC801\uC6A9\uD574 \uC918."
30974
+ },
30975
+ en: {
30976
+ definition: "A marketplace settlement workflow where the platform holds buyer funds safely until delivery confirmation or milestone sign-off, then releases net payouts after fee deduction.",
30977
+ example: "Hold order funds in escrow at checkout and release the seller payout minus platform fees only after buyer confirmation or auto-confirm expiry, pausing payout if a dispute opens.",
30978
+ promptSnippet: "Model escrow settlement with distinct ledger states\u2014held on payment, frozen during active disputes, and released net of platform fees upon buyer confirmation or milestone approval."
30979
+ }
30980
+ }
30981
+ },
30982
+ proration: {
30983
+ aliases: {
30984
+ ko: ["\uD504\uB85C\uB808\uC774\uC158", "\uC911\uB3C4 \uBCC0\uACBD \uCC28\uC561 \uACC4\uC0B0", "\uB0A8\uC740 \uAE30\uAC04 \uC77C\uD560 \uC815\uC0B0", "\uC694\uAE08\uC81C \uC5C5\uADF8\uB808\uC774\uB4DC \uCC28\uC561"],
30985
+ en: ["pro-rata billing", "prorated charge", "mid-cycle plan adjustment", "seat proration"]
30986
+ },
30987
+ text: {
30988
+ ko: {
30989
+ definition: "\uAD6C\uB3C5 \uACB0\uC81C \uC8FC\uAE30 \uB3C4\uC911\uC5D0 \uC694\uAE08\uC81C\uB97C \uBCC0\uACBD\uD558\uAC70\uB098 \uD300 \uC88C\uC11D \uC218\uB97C \uB298\uB9AC\uACE0 \uC904\uC77C \uB54C, \uB0A8\uC740 \uC0AC\uC6A9 \uC77C\uC218\xB7\uC2DC\uAC04 \uBE44\uC728\uC5D0 \uB9DE\uCDB0 \uCD94\uAC00 \uCCAD\uAD6C\uC561\uC774\uB098 \uD06C\uB808\uB527 \uCC28\uC561\uC744 \uC815\uC0B0\uD558\uB294 \uADDC\uCE59\uC785\uB2C8\uB2E4.",
30990
+ example: "\uC6D4\uAC04 30\uC77C \uC8FC\uAE30 \uC911 15\uC77C\uC774 \uB0A8\uC740 \uC2DC\uC810\uC5D0 \uC88C\uC11D\uC744 1\uAC1C \uCD94\uAC00\uD558\uBA74 \uC804\uCCB4 \uD55C \uB2EC \uC694\uAE08\uC774 \uC544\uB2C8\uB77C \uB0A8\uC740 15\uC77C\uCE58 \uC808\uBC18 \uAE08\uC561\uB9CC \uACC4\uC0B0\uD574 \uCCAD\uAD6C\uC11C\uC5D0 \uBC18\uC601\uD569\uB2C8\uB2E4.",
30991
+ promptSnippet: "\uAD6C\uB3C5 \uD50C\uB79C \uC5C5\uADF8\uB808\uC774\uB4DC\xB7\uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC \uB610\uB294 \uC88C\uC11D \uC99D\uAC10 \uC2DC \uACB0\uC81C \uC8FC\uAE30 \uB0A8\uC740 \uAE30\uAC04\uC5D0 \uB530\uB978 \uC77C\uD560 \uACC4\uC0B0(Proration) \uC801\uC6A9 \uC5EC\uBD80\uC640 \uC608\uC0C1 \uCC28\uC561\xB7\uC801\uC6A9 \uC2DC\uC810(\uC989\uC2DC vs \uB2E4\uC74C \uC8FC\uAE30)\uC744 \uBCC0\uACBD \uD655\uC778 \uD654\uBA74\uC5D0 \uBBF8\uB9AC \uBCF4\uC5EC \uC918."
30992
+ },
30993
+ en: {
30994
+ definition: "A billing calculation that adjusts charges or credits proportionally based on the remaining days in a billing cycle when a plan or seat count changes mid-cycle.",
30995
+ example: "Adding a team seat halfway through a 30-day billing cycle charges roughly half the monthly seat price rather than the full month.",
30996
+ promptSnippet: "Preview prorated charges or credits clearly before confirming mid-cycle plan or seat changes, specifying whether adjustments apply immediately or on the next invoice."
30997
+ }
30998
+ }
30999
+ },
31000
+ "grace-period": {
31001
+ aliases: {
31002
+ ko: ["\uC720\uC608\uAE30\uAC04", "\uACB0\uC81C \uC2E4\uD328 \uC720\uC608", "\uD0C8\uD1F4 \uCCA0\uD68C \uAE30\uAC04", "\uC2DC\uD06C\uB9BF \uAD50\uCCB4 \uC720\uC608"],
31003
+ en: ["grace window", "dunning grace period", "deletion grace period", "dual-valid window"]
31004
+ },
31005
+ text: {
31006
+ ko: {
31007
+ definition: "\uACB0\uC81C \uC2E4\uD328\xB7\uAD6C\uB3C5 \uB9CC\uB8CC\xB7\uD68C\uC6D0 \uD0C8\uD1F4 \uC694\uCCAD\xB7API \uC2DC\uD06C\uB9BF \uAD50\uCCB4 \uAC19\uC740 \uC804\uD658\uC774 \uBC1C\uC0DD\uD55C \uB4A4, \uC989\uC2DC \uCC28\uB2E8\uD558\uAC70\uB098 \uC601\uAD6C \uC0AD\uC81C\uD558\uC9C0 \uC54A\uACE0 \uBCF5\uAD6C\xB7\uC804\uD658\uD560 \uC218 \uC788\uB3C4\uB85D \uD5C8\uC6A9\uD558\uB294 \uC77C\uC815 \uC720\uC608 \uC2DC\uAC04\uC785\uB2C8\uB2E4.",
31008
+ example: "\uC815\uAE30 \uACB0\uC81C\uAC00 \uC2E4\uD328\uD574\uB3C4 \uC989\uC2DC \uACC4\uC815\uC744 \uC7A0\uADF8\uC9C0 \uC54A\uACE0 7\uC77C\uAC04 \uC720\uC608 \uAE30\uAC04 \uBC30\uB108\uC640 \uACB0\uC81C \uC218\uB2E8 \uAD50\uCCB4 \uC548\uB0B4\uB97C \uB744\uC6CC \uC815\uC0C1 \uBCF5\uAD6C\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.",
31009
+ promptSnippet: "\uACB0\uC81C \uC2E4\uD328, \uD574\uC9C0 \uC608\uC57D, \uACC4\uC815 \uC0AD\uC81C, \uC6F9\uD6C5 \uC2DC\uD06C\uB9BF \uAD50\uCCB4\uC5D0\uB294 \uC989\uC2DC \uCC28\uB2E8 \uB300\uC2E0 \uBA85\uC2DC\uC801 \uC720\uC608 \uAE30\uAC04(Grace Period)\uACFC \uB0A8\uC740 \uAE30\uD55C \uBC30\uB108\xB7\uBCF5\uAD6C \uC561\uC158\uC744 \uC81C\uACF5\uD574 \uC758\uB3C4\uCE58 \uC54A\uC740 \uC11C\uBE44\uC2A4 \uC911\uB2E8\uC744 \uC904\uC5EC \uC918."
31010
+ },
31011
+ en: {
31012
+ definition: "A configured buffer window after payment failure, cancellation, deletion request, or credential rotation during which users can recover or transition before hard enforcement.",
31013
+ example: "After a recurring card charge fails, grant a 7-day grace period with a persistent banner to update payment details before downgrading entitlements.",
31014
+ promptSnippet: "Include an explicit grace period with countdown banners and recovery actions for failed renewals, scheduled account deletions, or dual-valid secret rotations before hard cutoff."
31015
+ }
31016
+ }
31017
+ },
31018
+ "maker-checker-approval": {
31019
+ aliases: {
31020
+ ko: ["\uBA54\uC774\uCEE4 \uCCB4\uCEE4", "2\uC778 \uC2B9\uC778 \uCCB4\uACC4", "\uAD50\uCC28 \uC2B9\uC778", "\uACE0\uC704\uD5D8 \uC791\uC5C5 \uACB0\uC7AC", "4-eyes \uC6D0\uCE59"],
31021
+ en: ["maker-checker", "four-eyes principle", "two-person approval", "peer sign-off"]
31022
+ },
31023
+ text: {
31024
+ ko: {
31025
+ definition: "\uACE0\uC561 \uCD9C\uAE08, \uAD8C\uD55C \uC2B9\uACA9, \uC6B4\uC601 \uC124\uC815 \uBCC0\uACBD \uAC19\uC740 \uACE0\uC704\uD5D8 \uC791\uC5C5\uC744 \uC694\uCCAD\uD558\uB294 \uC0AC\uB78C(Maker)\uACFC \uC774\uB97C \uAC80\uD1A0\xB7\uC2B9\uC778\uD558\uB294 \uC0AC\uB78C(Checker)\uC744 \uBD84\uB9AC\uD574 \uB2E8\uB3C5 \uC2E4\uC218\uB098 \uC545\uC6A9\uC744 \uB9C9\uB294 \uC2B9\uC778 \uC6CC\uD06C\uD50C\uB85C\uC785\uB2C8\uB2E4.",
31026
+ example: "\uB2F4\uB2F9\uC790 A\uAC00 \uB300\uB7C9 \uC815\uC0B0 \uC9C0\uAE09\uC744 \uAE30\uC548\uD558\uB354\uB77C\uB3C4 \uBCF8\uC778 \uACC4\uC815\uC740 \uC2B9\uC778 \uBC84\uD2BC\uC774 \uB9C9\uD600 \uC788\uACE0, \uB2E4\uB978 \uAD00\uB9AC\uC790 B\uAC00 \uB0B4\uC6A9\uC744 \uAC80\uD1A0\uD55C \uB4A4 \uC2B9\uC778\uD574\uC57C\uB9CC \uC2E4\uD589\uB429\uB2C8\uB2E4.",
31027
+ promptSnippet: "\uACE0\uC704\uD5D8 \uC6B4\uC601 \uC791\uC5C5\uC5D0\uB294 \uC694\uCCAD\uC790(Maker)\uC640 \uC2B9\uC778\uC790(Checker)\uB97C \uB3D9\uC77C \uC778\uBB3C\uB85C \uD5C8\uC6A9\uD558\uC9C0 \uC54A\uB294 \uC774\uC911 \uC2B9\uC778 \uC6CC\uD06C\uD50C\uB85C\uB97C \uB450\uACE0, \uC2B9\uC778 \uB9CC\uB8CC \uC2DC\uAC04\xB7\uBC18\uB824 \uC0AC\uC720\xB7\uAC10\uC0AC \uB85C\uADF8\uB97C \uD568\uAED8 \uAE30\uB85D\uD574 \uC918."
31028
+ },
31029
+ en: {
31030
+ definition: "A governance workflow requiring two distinct authorized people\u2014a Maker who initiates a high-risk action and a Checker who independently reviews and approves it.",
31031
+ example: "An operator who drafts a bulk payout or production permission change cannot self-approve; a second reviewer must approve before execution.",
31032
+ promptSnippet: "Enforce Maker-Checker dual-control approval on high-risk actions by blocking self-approval on the backend, adding request expiration and rejection reasons, and logging every decision."
31033
+ }
31034
+ }
31035
+ }
31036
+ };
31037
+
31038
+ // ../../packages/catalog/src/glossary.ts
31039
+ var GLOSSARY_BODIES = {
31040
+ ...UI_GLOSSARY_DATA,
31041
+ ...ENGINEERING_GLOSSARY_DATA,
31042
+ ...WORKFLOW_GLOSSARY_DATA
31043
+ };
31044
+ function buildGlossaryTerm(meta) {
31045
+ const body = GLOSSARY_BODIES[meta.id];
31046
+ if (!body) {
31047
+ throw new Error(`Missing glossary body data for term "${meta.id}"`);
31048
+ }
31049
+ return {
31050
+ ...meta,
31051
+ aliases: body.aliases,
31052
+ text: {
31053
+ ko: { name: meta.name.ko, ...body.text.ko },
31054
+ en: { name: meta.name.en, ...body.text.en }
31055
+ }
31056
+ };
31057
+ }
31058
+ var GLOSSARY_TERMS = GLOSSARY_LINK_META.map(buildGlossaryTerm);
31059
+ var GLOSSARY_BY_ID = new Map(GLOSSARY_TERMS.map((term) => [term.id, term]));
31060
+ function getGlossaryTerm(id) {
31061
+ return GLOSSARY_BY_ID.get(id);
31062
+ }
31063
+
31064
+ // ../../packages/catalog/src/glossary-search.ts
31065
+ var GLOSSARY_SYNONYMS = [
31066
+ ["skeleton", "\uC2A4\uCF08\uB808\uD1A4", "\uBF08\uB300"],
31067
+ ["loading", "\uB85C\uB529", "\uBD88\uB7EC\uC624\uAE30"],
31068
+ ["emptystate", "empty state", "\uBE48 \uC0C1\uD0DC", "\uBE48\uC0C1\uD0DC", "\uBE48 \uD654\uBA74", "\uACB0\uACFC \uC5C6\uC74C", "\uB370\uC774\uD130 \uC5C6\uC74C"],
31069
+ ["validation", "\uC720\uD6A8\uC131 \uAC80\uC99D", "\uC720\uD6A8\uC131 \uAC80\uC0AC", "\uC785\uB825 \uAC80\uC99D", "\uC778\uB77C\uC778 \uC5D0\uB7EC"],
31070
+ ["disclosure", "\uC810\uC9C4\uC801 \uACF5\uAC1C", "\uC811\uAE30 \uD3BC\uCE58\uAE30", "\uC544\uCF54\uB514\uC5B8"],
31071
+ ["toast", "\uD1A0\uC2A4\uD2B8"],
31072
+ ["snackbar", "\uC2A4\uB0B5\uBC14"],
31073
+ ["commandpalette", "command palette", "\uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8", "\uBA85\uB839 \uD314\uB808\uD2B8", "\uBE60\uB978 \uC2E4\uD589\uCC3D"],
31074
+ ["focustrap", "focus trap", "\uD3EC\uCEE4\uC2A4 \uD2B8\uB7A9", "\uD3EC\uCEE4\uC2A4 \uAC00\uB450\uAE30", "\uCD08\uC810 \uACE0\uC815"],
31075
+ ["virtualscroll", "virtual scroll", "virtual scrolling", "\uAC00\uC0C1 \uC2A4\uD06C\uB864", "\uBAA9\uB85D \uAC00\uC0C1\uD654", "\uC708\uB3C4\uC789"],
31076
+ ["debounce", "\uB514\uBC14\uC6B4\uC2A4", "\uB514\uBC14\uC6B4\uC2F1", "\uC785\uB825 \uC9C0\uC5F0"],
31077
+ ["optimistic", "\uB099\uAD00\uC801"],
31078
+ ["idempotency", "\uBA71\uB4F1\uC131", "\uACB0\uC81C \uB450 \uBC88 \uBC29\uC9C0", "\uC911\uBCF5 \uACB0\uC81C \uB9C9\uAE30", "\uC911\uBCF5 \uC694\uCCAD \uBC29\uC9C0"],
31079
+ ["rbac", "role-based access control", "role based access control", "\uC5ED\uD560 \uAE30\uBC18 \uC811\uADFC \uC81C\uC5B4", "\uC5ED\uD560 \uAE30\uBC18 \uAD8C\uD55C"],
31080
+ ["sse", "server-sent events", "\uC11C\uBC84 \uC804\uC1A1 \uC774\uBCA4\uD2B8", "eventsource"],
31081
+ ["rag", "retrieval-augmented generation", "retrieval augmented generation", "\uAC80\uC0C9 \uC99D\uAC15 \uC0DD\uC131"],
31082
+ ["dlq", "dead-letter queue", "dead letter queue", "\uB370\uB4DC \uB808\uD130 \uD050", "\uC2E4\uD328 \uC791\uC5C5 \uBCF4\uAD00 \uD050"],
31083
+ ["auditlog", "audit log", "audit trail", "\uAC10\uC0AC \uB85C\uADF8", "\uBCC0\uACBD \uC774\uB825"],
31084
+ ["hitl", "human-in-the-loop", "human in the loop", "\uC778\uAC04 \uAC1C\uC785 \uC2B9\uC778", "\uD734\uBA3C\uC778\uB354\uB8E8\uD504"],
31085
+ ["sla", "service-level agreement", "service level agreement", "\uC11C\uBE44\uC2A4 \uC218\uC900 \uD611\uC57D", "\uC751\uB300 \uBAA9\uD45C \uC2DC\uAC04"],
31086
+ ["kyc", "know your customer", "\uACE0\uAC1D \uD655\uC778 \uC808\uCC28", "\uACE0\uAC1D \uC2E0\uC6D0 \uD655\uC778"],
31087
+ ["onboarding", "\uC628\uBCF4\uB529", "\uCD08\uAE30 \uC124\uC815"],
31088
+ ["escrow", "\uC5D0\uC2A4\uD06C\uB85C"],
31089
+ ["proration", "prorated", "pro-rata", "\uC77C\uD560 \uACC4\uC0B0", "\uC77C\uD560\uACC4\uC0B0", "\uD504\uB85C\uB808\uC774\uC158"],
31090
+ ["graceperiod", "grace period", "\uC720\uC608 \uAE30\uAC04", "\uC720\uC608\uAE30\uAC04"],
31091
+ ["makerchecker", "maker-checker", "dual-control", "\uC774\uC911 \uC2B9\uC778", "\uBA54\uC774\uCEE4 \uCCB4\uCEE4", "\uBA54\uC774\uCEE4-\uCCB4\uCEE4", "2\uC778 \uC2B9\uC778"]
31092
+ ];
31093
+ var GLOSSARY_STOP_WORDS = [
31094
+ "\uC6A9\uC5B4",
31095
+ "\uB73B",
31096
+ "\uC758\uBBF8",
31097
+ "\uC124\uBA85",
31098
+ "\uBB50\uC57C",
31099
+ "\uBB34\uC5C7",
31100
+ "\uC54C\uB824\uC918",
31101
+ "\uC54C\uACE0",
31102
+ "\uB300\uD55C",
31103
+ "term",
31104
+ "glossary",
31105
+ "what",
31106
+ "mean",
31107
+ "meaning",
31108
+ "explain",
31109
+ "definition"
31110
+ ];
31111
+ var tokens2 = createSearchTokenizer(GLOSSARY_SYNONYMS, GLOSSARY_STOP_WORDS);
31112
+ var weights2 = {
31113
+ name: 35,
31114
+ alias: 28,
31115
+ definition: 12,
31116
+ example: 6,
31117
+ prompt: 2
31118
+ };
31119
+ var index2 = /* @__PURE__ */ new Map();
31120
+ function entries2(item) {
31121
+ const cached = index2.get(item);
31122
+ if (cached) return cached;
31123
+ const fields = [
31124
+ ["name", [item.id, item.name.ko, item.name.en]],
31125
+ ["alias", [...item.aliases.ko, ...item.aliases.en]],
31126
+ ["definition", [item.text.ko.definition, item.text.en.definition]],
31127
+ ["example", [item.text.ko.example, item.text.en.example]],
31128
+ ["prompt", [item.text.ko.promptSnippet, item.text.en.promptSnippet]]
31129
+ ];
31130
+ const result2 = createSearchEntries(fields, tokens2);
31131
+ index2.set(item, result2);
31132
+ return result2;
31133
+ }
31134
+ function rankGlossaryTerms(query = "") {
31135
+ if (!query.trim()) {
31136
+ return GLOSSARY_TERMS.map((item) => ({ item, score: 0, matchedOn: [] }));
31137
+ }
31138
+ const queryTokens = tokens2(query);
31139
+ const normalizedQuery = normalizeSearchText(query);
31140
+ const results = [];
31141
+ for (const item of GLOSSARY_TERMS) {
31142
+ const allEntries = entries2(item);
31143
+ const exact = allEntries.find((entry) => entry.field !== "prompt" && entry.normalizedValue === normalizedQuery);
31144
+ const exactBonus = exact?.field === "name" ? 150 : exact?.field === "alias" ? 120 : 100;
31145
+ const result2 = rankSearchEntries(allEntries, queryTokens, weights2, exact, exactBonus);
31146
+ if (result2) results.push({ item, ...result2 });
31147
+ }
31148
+ return results.sort((a, b) => b.score - a.score);
31149
+ }
31150
+
30402
31151
  // ../../packages/catalog/src/search.ts
30403
31152
  var SEARCH_SYNONYMS = [
30404
31153
  ["button", "buttons", "\uBC84\uD2BC", "cta"],
@@ -30508,11 +31257,11 @@ var SEARCH_SYNONYMS = [
30508
31257
  ["spectrum", "\uC2A4\uD399\uD2B8\uB7FC"],
30509
31258
  ["ticker", "\uD2F0\uCEE4", "\uB274\uC2A4\uB760"]
30510
31259
  ];
30511
- var tokens2 = createSearchTokenizer(SEARCH_SYNONYMS);
30512
- var weights2 = { title: 30, alias: 28, keyword: 20, useCase: 18, target: 8, trigger: 6, summary: 12, prompt: 1 };
30513
- var index2 = /* @__PURE__ */ new Map();
30514
- function entries2(item) {
30515
- const cached = index2.get(item);
31260
+ var tokens3 = createSearchTokenizer(SEARCH_SYNONYMS);
31261
+ var weights3 = { title: 30, alias: 28, keyword: 20, useCase: 18, target: 8, trigger: 6, summary: 12, prompt: 1 };
31262
+ var index3 = /* @__PURE__ */ new Map();
31263
+ function entries3(item) {
31264
+ const cached = index3.get(item);
30516
31265
  if (cached) return cached;
30517
31266
  const en = getTechniqueText(item, "en");
30518
31267
  const meta = getSearchMetadata(item);
@@ -30526,21 +31275,21 @@ function entries2(item) {
30526
31275
  ["summary", [item.summary, en.summary]],
30527
31276
  ["prompt", [item.promptSnippet, en.promptSnippet]]
30528
31277
  ];
30529
- const result2 = createSearchEntries(fields, tokens2);
30530
- index2.set(item, result2);
31278
+ const result2 = createSearchEntries(fields, tokens3);
31279
+ index3.set(item, result2);
30531
31280
  return result2;
30532
31281
  }
30533
31282
  function rank(item, query, queryTokens) {
30534
31283
  if (!query.trim()) return { item, score: 0, matchedOn: [] };
30535
31284
  const normalizedQuery = normalizeSearchText(query);
30536
- const allEntries = entries2(item);
31285
+ const allEntries = entries3(item);
30537
31286
  const exact = allEntries.find((entry) => entry.field !== "prompt" && entry.normalizedValue === normalizedQuery);
30538
- const result2 = rankSearchEntries(allEntries, queryTokens, weights2, exact, exact?.field === "title" ? 150 : 100);
31287
+ const result2 = rankSearchEntries(allEntries, queryTokens, weights3, exact, exact?.field === "title" ? 150 : 100);
30539
31288
  return result2 ? { item, ...result2 } : null;
30540
31289
  }
30541
31290
  function searchTechniques(options = {}) {
30542
31291
  const query = options.query ?? "";
30543
- const queryTokens = tokens2(query);
31292
+ const queryTokens = tokens3(query);
30544
31293
  const results = [];
30545
31294
  for (const item of TECHNIQUES) {
30546
31295
  if (options.domain && item.domain !== options.domain || options.category && item.category !== options.category) continue;
@@ -30555,10 +31304,10 @@ function searchTechniques(options = {}) {
30555
31304
  // package.json
30556
31305
  var package_default = {
30557
31306
  name: "@keke1933/vibe-dictionary-mcp",
30558
- version: "0.12.0",
31307
+ version: "0.13.0",
30559
31308
  license: "MIT",
30560
31309
  author: "leejh96",
30561
- description: "Read-only local MCP for searching Vibe Dictionary techniques and retrieving implementation prompts",
31310
+ description: "Read-only local MCP for searching Vibe Dictionary techniques, domain knowledge, and glossary terms",
30562
31311
  type: "module",
30563
31312
  repository: {
30564
31313
  type: "git",
@@ -30630,6 +31379,34 @@ var summaryShape = {
30630
31379
  };
30631
31380
  var readOnlyAnnotations = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
30632
31381
  var knowledgeSummaryShape = { id: z.string(), locale: z.enum(["ko", "en"]), domain: z.string(), title: z.string(), summary: z.string() };
31382
+ var glossaryCategorySchema = z.enum(GLOSSARY_CATEGORIES);
31383
+ var glossaryMatchFieldSchema = z.enum(["name", "alias", "definition", "example", "prompt"]);
31384
+ var glossarySummaryShape = {
31385
+ id: z.string(),
31386
+ locale: z.enum(["ko", "en"]),
31387
+ category: glossaryCategorySchema,
31388
+ name: z.string(),
31389
+ nameKo: z.string(),
31390
+ nameEn: z.string(),
31391
+ definition: z.string(),
31392
+ aliases: z.array(z.string()),
31393
+ relatedTechniqueIds: z.array(z.string()),
31394
+ relatedDomainIds: z.array(z.string())
31395
+ };
31396
+ function summarizeGlossary(item, locale) {
31397
+ return {
31398
+ id: item.id,
31399
+ locale,
31400
+ category: item.category,
31401
+ name: item.text[locale].name,
31402
+ nameKo: item.name.ko,
31403
+ nameEn: item.name.en,
31404
+ definition: item.text[locale].definition,
31405
+ aliases: item.aliases[locale],
31406
+ relatedTechniqueIds: item.relatedTechniqueIds,
31407
+ relatedDomainIds: item.relatedDomainIds
31408
+ };
31409
+ }
30633
31410
  function summarize(item, locale) {
30634
31411
  const text2 = getTechniqueText(item, locale);
30635
31412
  const metadata = getSearchMetadata(item);
@@ -30657,6 +31434,7 @@ function createServer() {
30657
31434
  instructions: [
30658
31435
  "Find UI, graphics, layout, style, pixel art, video and AI native techniques. Search for a few candidates, compare summaries, useCases and matchedOn fields, then get_technique by exact ID only for the selected prompts.",
30659
31436
  'Before choosing designs for an education, community, commerce, booking, subscription, collaboration, customer-support, auth/account, notification, CMS/publishing, file/media, marketplace, event/check-in, recruiting/ATS, analytics, security/RBAC, logistics, fintech/wallet, healthcare, form/workflow-automation or AI agent service, use search_domain_knowledge with a short domain or workflow phrase such as "LMS", "\uD68C\uC6D0 \uC804\uC6A9", "\uBD80\uBD84 \uD658\uBD88", "\uD0C0\uC784\uC2AC\uB86F", "\uC815\uAE30 \uACB0\uC81C", "\uCE78\uBC18", "\uD5EC\uD504\uB370\uC2A4\uD06C", "RBAC", "\uD569\uD3EC\uC7A5", "\uBCF5\uC2DD \uC6D0\uC7A5" or "\uD1A0\uD070 \uC608\uC0B0". Compare summaries, useCases and matchedOn fields, then call get_domain_knowledge by a returned ID for concepts, workflows, pitfalls, open decisions, sources, related technique IDs and a reference prompt. Search supports bilingual aliases and ranked keyword matching, not semantic AI. If no entry fits, retry fewer terms or a synonym, or browse with an empty query. Workflows and examples are design references, not established policies. Do not assume answers to the open questions. Related designs do not implement the domain rules.',
31437
+ 'To look up or clarify UI, engineering or workflow vocabulary such as "skeleton loading", "empty state", "debounce", "optimistic update", "\uACB0\uC81C \uB450 \uBC88 \uBC29\uC9C0", "RBAC" or "\uC774\uC911 \uC2B9\uC778", use search_glossary with a short Korean or English phrase or natural alias. search_glossary searches both languages and aliases regardless of output locale and omits full examples and promptSnippet; call get_glossary_term with a returned ID for the full example, ready-to-use promptSnippet and verified relatedTechniqueIds/relatedDomainIds you can pass directly to get_technique or get_domain_knowledge. Glossary examples and prompts are reference material, not implemented backend policies.',
30660
31438
  "The calling assistant interprets the user request and generates short Korean or English search phrases for one effect at a time. The MCP performs bilingual weighted keyword/alias matching and runs no AI model. Extract concrete effects and targets; omit uncertain filters. For broad requests such as a clean or premium webpage, use the stated purpose and preferences; do not equate an adjective with one fixed style. Ask for clarification when missing context prevents a meaningful choice.",
30661
31439
  "For requests combining techniques, search distinct needs such as style, layout and interaction separately. Retrieve the selected prompts, then decide where each technique applies and compare their visual treatment, inputs and timing for conflicts. The tools do not compose techniques or check compatibility; the calling assistant makes those judgments.",
30662
31440
  "Use target/trigger filters only for required demo inputs. Compare summaries and useCases against the original request. If candidates are missing or unsuitable, retry a synonym, the other language or fewer modifiers, and remove only filters that are not required. Reset offset to zero when changing the query or filters. Do not select an unrelated result merely because it ranks first; clarify if useful candidates still cannot be found. Scores are not probabilities. locale selects output language independently of search language. These read-only tools return reference data only."
@@ -30759,6 +31537,54 @@ function createServer() {
30759
31537
  if (!item) return { isError: true, content: [{ type: "text", text: locale === "en" ? "Domain knowledge ID not found. Use search_domain_knowledge to find a valid ID." : "\uB3C4\uBA54\uC778 \uC9C0\uC2DD ID\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. search_domain_knowledge\uB85C \uC720\uD6A8\uD55C ID\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694." }] };
30760
31538
  return result({ id: item.id, locale, ...item.text[locale], sources: item.sources });
30761
31539
  });
31540
+ server.registerTool("search_glossary", {
31541
+ title: "Search glossary / \uC6A9\uC5B4 \uC0AC\uC804 \uAC80\uC0C9",
31542
+ description: 'Search Korean and English UI, engineering and workflow glossary terms by name, aliases (including natural user descriptions such as "\uACB0\uC81C \uB450 \uBC88 \uBC29\uC9C0"), definition, example and prompt. Bilingual normalization and weighted term coverage rank results regardless of output locale; this is not semantic AI search. Nonempty queries return score (not confidence) and matchedOn field names; empty queries browse catalog order. Non-matching queries return an empty list with total 0. Results exclude full example and promptSnippet; use get_glossary_term with a returned ID for full details and ready-to-use promptSnippet.',
31543
+ inputSchema: {
31544
+ query: z.string().max(500).default("").describe("Short Korean/English term, acronym or natural description; omit to browse."),
31545
+ locale: localeSchema,
31546
+ limit: z.number().int().min(1).max(50).default(20),
31547
+ offset: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).default(0)
31548
+ },
31549
+ outputSchema: {
31550
+ total: z.number().int(),
31551
+ offset: z.number().int(),
31552
+ nextOffset: z.number().int().nullable(),
31553
+ items: z.array(z.object({
31554
+ ...glossarySummaryShape,
31555
+ score: z.number(),
31556
+ matchedOn: z.array(glossaryMatchFieldSchema)
31557
+ }))
31558
+ },
31559
+ annotations: readOnlyAnnotations
31560
+ }, async ({ query, locale, limit, offset }) => {
31561
+ const matches = rankGlossaryTerms(query);
31562
+ const items = matches.slice(offset, offset + limit).map(({ item, score, matchedOn }) => ({
31563
+ ...summarizeGlossary(item, locale),
31564
+ score,
31565
+ matchedOn: matchedOn.map((match) => match.field)
31566
+ }));
31567
+ return result({ total: matches.length, offset, nextOffset: offset + items.length < matches.length ? offset + items.length : null, items });
31568
+ });
31569
+ server.registerTool("get_glossary_term", {
31570
+ title: "Get glossary term / \uC6A9\uC5B4 \uC0C1\uC138 \uC870\uD68C",
31571
+ description: "Retrieve a bilingual glossary term by exact ID in the requested locale (ko default, en supported), including definition, realistic example, ready-to-use promptSnippet, aliases and verified relatedTechniqueIds / relatedDomainIds that can be passed directly to get_technique and get_domain_knowledge. Examples and prompts are reference material, not implemented backend policies. Unknown IDs return an error.",
31572
+ inputSchema: { id: z.string().trim().min(1).max(200), locale: localeSchema },
31573
+ outputSchema: {
31574
+ ...glossarySummaryShape,
31575
+ example: z.string(),
31576
+ promptSnippet: z.string()
31577
+ },
31578
+ annotations: readOnlyAnnotations
31579
+ }, async ({ id, locale }) => {
31580
+ const item = getGlossaryTerm(id);
31581
+ if (!item) return { isError: true, content: [{ type: "text", text: locale === "en" ? "Glossary term ID not found. Use search_glossary to find a valid ID." : "\uC6A9\uC5B4 ID\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. search_glossary\uB85C \uC720\uD6A8\uD55C ID\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694." }] };
31582
+ return result({
31583
+ ...summarizeGlossary(item, locale),
31584
+ example: item.text[locale].example,
31585
+ promptSnippet: item.text[locale].promptSnippet
31586
+ });
31587
+ });
30762
31588
  return server;
30763
31589
  }
30764
31590
 
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@keke1933/vibe-dictionary-mcp",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "license": "MIT",
5
5
  "author": "leejh96",
6
- "description": "Read-only local MCP for searching Vibe Dictionary techniques and retrieving implementation prompts",
6
+ "description": "Read-only local MCP for searching Vibe Dictionary techniques, domain knowledge, and glossary terms",
7
7
  "type": "module",
8
8
  "repository": {
9
9
  "type": "git",