optbrew 0.1.3 โ†’ 0.2.1

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 (117) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +2 -2
  4. package/AGENT_INSTALL.md +13 -11
  5. package/CHANGELOG.md +77 -0
  6. package/README.ko.md +40 -15
  7. package/README.md +40 -15
  8. package/THIRD_PARTY_NOTICES.md +88 -0
  9. package/docs/platforms.md +10 -10
  10. package/docs/release.md +37 -5
  11. package/lib/cli.mjs +5 -2
  12. package/lib/install.mjs +2 -1
  13. package/lib/records.mjs +2 -1
  14. package/lib/transaction.mjs +12 -5
  15. package/lib/update.mjs +3 -2
  16. package/package.json +6 -4
  17. package/plugin.json +2 -2
  18. package/skills/.claude-plugin/icon.png +0 -0
  19. package/skills/.claude-plugin/plugin.json +32 -0
  20. package/skills/README.md +27 -0
  21. package/skills/optbrew/SKILL.md +223 -8
  22. package/skills/optbrew/THIRD_PARTY_NOTICES.md +88 -0
  23. package/skills/optbrew/bundle-manifest.json +407 -47
  24. package/skills/optbrew/modules/naver-searchadvisor/scripts/audit.mjs +4 -4
  25. package/skills/optbrew/references/api.md +5 -3
  26. package/skills/optbrew/references/check-registry.json +16 -16
  27. package/skills/optbrew/references/chrome-paths.json +31 -0
  28. package/skills/optbrew/references/endpoints.json +10 -0
  29. package/skills/optbrew/references/harness-signals.json +5 -0
  30. package/skills/optbrew/references/intake.md +76 -5
  31. package/skills/optbrew/references/judging.md +233 -0
  32. package/skills/optbrew/references/limits.json +26 -0
  33. package/skills/optbrew/references/measurement.md +1 -1
  34. package/skills/optbrew/references/messages.ko.json +170 -0
  35. package/skills/optbrew/references/report.md +18 -6
  36. package/skills/optbrew/references/routing.md +2 -2
  37. package/skills/optbrew/references/runbooks/anthropic-api-key.md +34 -0
  38. package/skills/optbrew/references/runbooks/chrome-install.md +56 -0
  39. package/skills/optbrew/references/runbooks/cwv-site-collection.md +38 -0
  40. package/skills/optbrew/references/runbooks/google-api-key.md +51 -0
  41. package/skills/optbrew/references/runbooks/gsc-export.md +32 -0
  42. package/skills/optbrew/references/runbooks/index.json +18 -0
  43. package/skills/optbrew/references/runbooks/key-set-claude-cloud.md +32 -0
  44. package/skills/optbrew/references/runbooks/key-set-codex.md +33 -0
  45. package/skills/optbrew/references/runbooks/key-set-local.md +53 -0
  46. package/skills/optbrew/references/runbooks/naver-searchadvisor-export.md +32 -0
  47. package/skills/optbrew/references/runbooks/network-claude-cloud-custom.md +33 -0
  48. package/skills/optbrew/references/runbooks/network-codex-approval.md +26 -0
  49. package/skills/optbrew/references/runbooks/network-codex-config.md +36 -0
  50. package/skills/optbrew/references/runbooks/seranking.md +38 -0
  51. package/skills/optbrew/references/schemas/contract.schema.json +42 -15
  52. package/skills/optbrew/references/scoring.md +40 -5
  53. package/skills/optbrew/references/source-analysis.md +40 -0
  54. package/skills/optbrew/references/versions.json +9 -0
  55. package/skills/optbrew/scripts/adapters/anthropic.mjs +5 -5
  56. package/skills/optbrew/scripts/adapters/imports.mjs +138 -1
  57. package/skills/optbrew/scripts/audit.mjs +10 -112
  58. package/skills/optbrew/scripts/cli.mjs +5 -2
  59. package/skills/optbrew/scripts/core/bundle.mjs +30 -13
  60. package/skills/optbrew/scripts/core/capabilities.mjs +8 -4
  61. package/skills/optbrew/scripts/core/cdp.mjs +105 -0
  62. package/skills/optbrew/scripts/core/checks/canonical-consistency.mjs +56 -0
  63. package/skills/optbrew/scripts/core/checks/cwv-field.mjs +77 -0
  64. package/skills/optbrew/scripts/core/checks/discovery.mjs +43 -0
  65. package/skills/optbrew/scripts/core/checks/document-title.mjs +62 -0
  66. package/skills/optbrew/scripts/core/checks/entity-identity.mjs +31 -0
  67. package/skills/optbrew/scripts/core/checks/fact-consistency.mjs +31 -0
  68. package/skills/optbrew/scripts/core/checks/fetch-response.mjs +18 -0
  69. package/skills/optbrew/scripts/core/checks/index-policy.mjs +16 -0
  70. package/skills/optbrew/scripts/core/checks/index.mjs +18 -0
  71. package/skills/optbrew/scripts/core/checks/internal-navigation.mjs +67 -0
  72. package/skills/optbrew/scripts/core/checks/locale-links.mjs +55 -0
  73. package/skills/optbrew/scripts/core/checks/naver-markup.mjs +21 -0
  74. package/skills/optbrew/scripts/core/checks/observation.mjs +37 -0
  75. package/skills/optbrew/scripts/core/checks/prepare.mjs +103 -0
  76. package/skills/optbrew/scripts/core/checks/render-content.mjs +104 -0
  77. package/skills/optbrew/scripts/core/checks/search-crawl-policy.mjs +29 -0
  78. package/skills/optbrew/scripts/core/checks/structured-data-truth.mjs +46 -0
  79. package/skills/optbrew/scripts/core/chrome-temp.mjs +68 -0
  80. package/skills/optbrew/scripts/core/chrome.mjs +546 -0
  81. package/skills/optbrew/scripts/core/collector.mjs +45 -49
  82. package/skills/optbrew/scripts/core/compare.mjs +18 -1
  83. package/skills/optbrew/scripts/core/config.mjs +31 -0
  84. package/skills/optbrew/scripts/core/contracts.mjs +31 -2
  85. package/skills/optbrew/scripts/core/cwv.mjs +100 -0
  86. package/skills/optbrew/scripts/core/derive.mjs +10 -186
  87. package/skills/optbrew/scripts/core/evidence-store.mjs +112 -0
  88. package/skills/optbrew/scripts/core/facts.mjs +175 -17
  89. package/skills/optbrew/scripts/core/findings.mjs +19 -1
  90. package/skills/optbrew/scripts/core/html.mjs +41 -3
  91. package/skills/optbrew/scripts/core/index-targets.mjs +118 -0
  92. package/skills/optbrew/scripts/core/judgments.mjs +675 -0
  93. package/skills/optbrew/scripts/core/keys.mjs +91 -0
  94. package/skills/optbrew/scripts/core/link-graph.mjs +93 -0
  95. package/skills/optbrew/scripts/core/messages.mjs +23 -0
  96. package/skills/optbrew/scripts/core/metrics.mjs +4 -2
  97. package/skills/optbrew/scripts/core/migration.mjs +37 -0
  98. package/skills/optbrew/scripts/core/page-select.mjs +136 -0
  99. package/skills/optbrew/scripts/core/probe.mjs +83 -0
  100. package/skills/optbrew/scripts/core/protocol.mjs +38 -14
  101. package/skills/optbrew/scripts/core/render.mjs +160 -0
  102. package/skills/optbrew/scripts/core/report-compose.mjs +377 -0
  103. package/skills/optbrew/scripts/core/report-html.mjs +198 -0
  104. package/skills/optbrew/scripts/core/report-page.mjs +14 -0
  105. package/skills/optbrew/scripts/core/report.mjs +327 -122
  106. package/skills/optbrew/scripts/core/runbooks.mjs +63 -0
  107. package/skills/optbrew/scripts/core/scope.mjs +23 -5
  108. package/skills/optbrew/scripts/core/score.mjs +12 -4
  109. package/skills/optbrew/scripts/core/secrets.mjs +2 -0
  110. package/skills/optbrew/scripts/core/stages.mjs +694 -0
  111. package/skills/optbrew/scripts/core/transport.mjs +157 -0
  112. package/skills/optbrew/scripts/core/weights.mjs +2 -1
  113. package/skills/optbrew/scripts/key.mjs +90 -0
  114. package/skills/optbrew/scripts/preflight.mjs +176 -0
  115. package/skills/optbrew/scripts/run.mjs +81 -0
  116. package/skills/optbrew/source-lock.json +1 -1
  117. package/source-lock.json +1 -1
@@ -0,0 +1,170 @@
1
+ {
2
+ "word.unknown": "์•Œ ์ˆ˜ ์—†์Œ",
3
+ "fetch-response.http-error": "์ด ํŽ˜์ด์ง€๊ฐ€ {status} ์˜ค๋ฅ˜๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธ์ž์™€ ํฌ๋กค๋Ÿฌ๊ฐ€ ์—ด ์ˆ˜ ์žˆ๊ฒŒ ๊ณ ์น˜์„ธ์š”.",
4
+ "search-crawl-policy.disallowed": "robots.txt๊ฐ€ {agent:crawler}์—๊ฒŒ ์ด ํŽ˜์ด์ง€๋ฅผ ๋ง‰๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์— ๋‚˜์™€์•ผ ํ•˜๋Š” ํŽ˜์ด์ง€๋ผ๋ฉด robots.txt์˜ ์ด ๊ทœ์น™์„ ๊ณ ์น˜์„ธ์š”.",
5
+ "index-policy.noindex": "์ด ํŽ˜์ด์ง€๊ฐ€ noindex๋กœ ์ƒ‰์ธ์„ ๋ง‰๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์— ๋‚˜์™€์•ผ ํ•˜๋Š” ํŽ˜์ด์ง€๋ผ๋ฉด noindex๋ฅผ ์ง€์šฐ์„ธ์š”.",
6
+ "render-content.no-body-text": "์›๋ณธ HTML์—๋„ ํฌ๋กฌ์œผ๋กœ ๊ทธ๋ฆฐ ํ™”๋ฉด์—๋„ ๋ณธ๋ฌธ ๊ธ€์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์ด ๋ณด์ด๊ฒŒ ๊ณ ์น˜์„ธ์š”.",
7
+ "discovery.orphan": "์ด๋ฒˆ์— ํ™•์ธํ•œ ํŽ˜์ด์ง€ ์ค‘ ์–ด๋””์—์„œ๋„ ์ด ํŽ˜์ด์ง€๋กœ ๊ฐ€๋Š” ๋งํฌ๊ฐ€ ์—†๊ณ , ์‚ฌ์ดํŠธ๋งต์—๋„ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ๋งต์— ๋„ฃ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ๋งํฌํ•˜์„ธ์š”.",
8
+ "discovery.orphan-sitemap-unusable": "์ด๋ฒˆ์— ํ™•์ธํ•œ ํŽ˜์ด์ง€ ์ค‘ ์–ด๋””์—์„œ๋„ ์ด ํŽ˜์ด์ง€๋กœ ๊ฐ€๋Š” ๋งํฌ๊ฐ€ ์—†๊ณ , ์„ ์–ธํ•œ ์‚ฌ์ดํŠธ๋งต๋„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {broken}. ์‚ฌ์ดํŠธ๋งต๋ถ€ํ„ฐ ๊ณ ์นœ ๋’ค ์ด ํŽ˜์ด์ง€๋ฅผ ๋„ฃ์œผ์„ธ์š”.",
9
+ "document-title.missing": "์›๋ณธ HTML์— <title>์ด ์—†์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋Š” <title>์„ ๋„ฃ์œผ์„ธ์š”.",
10
+ "document-title.duplicate": "๋‹ค๋ฅธ ํŽ˜์ด์ง€์™€ <title>์ด ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ <title>์„ ์“ฐ์„ธ์š”.",
11
+ "document-title.same-document": "์ด ํŽ˜์ด์ง€์˜ <title>์€ ๊ฐ™์€ ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ๋งŒ ๋‹ค๋ฅธ ๋ณ€ํ˜•({pages})ํ•˜๊ณ ๋งŒ ๊ฐ™๊ณ , ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ <title>๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.",
12
+ "canonical-consistency.redirect-chain": "์ด ์ฃผ์†Œ๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ๊ฑฐ์ณ ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ์ตœ์ข… ์ฃผ์†Œ๋กœ ๊ฐ€๊ฒŒ ์ค„์ด์„ธ์š”.",
13
+ "canonical-consistency.target-status": "canonical์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ€ ์ •์ƒ์œผ๋กœ ์—ด๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. canonical์„ ์—ด๋ฆฌ๋Š” ์ฃผ์†Œ๋กœ ๋ฐ”๊พธ์„ธ์š”.",
14
+ "canonical-consistency.invalid-url": "canonical ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅธ ์ฃผ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. canonical์„ ์ „์ฒด ์ฃผ์†Œ๋กœ ๊ณ ์น˜์„ธ์š”.",
15
+ "internal-navigation.too-deep": "ํ™ˆ ํŽ˜์ด์ง€์—์„œ ์ด ํŽ˜์ด์ง€๊นŒ์ง€ ํด๋ฆญ์ด ๋„ˆ๋ฌด ๋งŽ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ™ˆ ํŽ˜์ด์ง€๋‚˜ ๋ฉ”๋‰ด์—์„œ ๋” ๊ฐ€๊นŒ์šด ๋งํฌ๋ฅผ ๋งŒ๋“œ์„ธ์š”.",
16
+ "internal-navigation.weak-anchors": "๋งํฌ ๊ธ€์ž๊ฐ€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ '๋”๋ณด๊ธฐ'์ฒ˜๋Ÿผ ๋œป์ด ์—†๋Š” ๋งํฌ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋งํฌ ๊ธ€์ž์— ๊ฐ€๋Š” ๊ณณ์„ ์“ฐ์„ธ์š”.",
17
+ "structured-data-truth.parse-error": "JSON-LD๊ฐ€ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋กœ ์ฝํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‰ผํ‘œ์™€ ๋”ฐ์˜ดํ‘œ๋ฅผ ํ™•์ธํ•ด ์˜ฌ๋ฐ”๋ฅธ JSON์œผ๋กœ ๊ณ ์น˜์„ธ์š”.",
18
+ "structured-data-truth.fact-differs": "JSON-LD์˜ {type:fact-type} ๊ฐ’๊ณผ ํ™”๋ฉด ๊ธ€์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. JSON-LD๋Š” \"{linked}\", ํ™”๋ฉด์€ \"{visible}\"์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ’์„ ๋งž์ถ”์„ธ์š”.",
19
+ "locale-links.no-x-default": "hreflang์— x-default๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์œผ๋กœ ๋ณด์—ฌ ์ค„ ์–ธ์–ด ํŽ˜์ด์ง€๋ฅผ x-default๋กœ ์ถ”๊ฐ€ํ•˜์„ธ์š”.",
20
+ "locale-links.no-return": "์ด ํŽ˜์ด์ง€๊ฐ€ ๊ฐ€๋ฆฌํ‚จ ์–ธ์–ด๋ณ„ ํŽ˜์ด์ง€์— ์ด ํŽ˜์ด์ง€๋กœ ๋Œ์•„์˜ค๋Š” hreflang์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ํŽ˜์ด์ง€๊ฐ€ ์„œ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์„ธ์š”.",
21
+ "locale-links.not-listed-back": "๋‹ค๋ฅธ ํŽ˜์ด์ง€๊ฐ€ ์ด ํŽ˜์ด์ง€๋ฅผ ์–ธ์–ด๋ณ„ ํŽ˜์ด์ง€๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ, ์ด ํŽ˜์ด์ง€๋Š” ๊ทธ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์„ธ์š”.",
22
+ "naver-markup.no-og": "og:{name} ํƒœ๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์œ„ํ•ด og:{name} ํƒœ๊ทธ๋ฅผ ๋„ฃ์œผ์„ธ์š”.",
23
+ "naver-markup.no-description": "meta description์ด ์—†์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ ํ•œ๋‘ ๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” meta description์„ ๋„ฃ์œผ์„ธ์š”.",
24
+ "naver-markup.no-canonical": "canonical ๋งํฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์˜ ๋Œ€ํ‘œ ์ฃผ์†Œ๋ฅผ canonical๋กœ ๋„ฃ์œผ์„ธ์š”.",
25
+ "naver-markup.canonical-relative": "canonical์ด ์ƒ๋Œ€ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค: {canonical}. ์ „์ฒด ์ฃผ์†Œ๋กœ ๊ณ ์น˜์„ธ์š”.",
26
+ "naver-markup.title-keyword-repeat": "<title>์—์„œ ๊ฐ™์€ ๋‹จ์–ด๊ฐ€ ์„ธ ๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค: {words}. ๋ฐ˜๋ณต์„ ์ค„์—ฌ ์ œ๋ชฉ์„ ์งง๊ฒŒ ์“ฐ์„ธ์š”.",
27
+ "naver-markup.no-viewport": "meta viewport๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํœด๋Œ€ํฐ ํ™”๋ฉด์— ๋งž๋„๋ก meta viewport๋ฅผ ๋„ฃ์œผ์„ธ์š”.",
28
+ "naver-markup.resource-blocked": "robots.txt๊ฐ€ ๋„ค์ด๋ฒ„ ํฌ๋กค๋Ÿฌ(Yeti)์—๊ฒŒ ์ด ํŽ˜์ด์ง€๊ฐ€ ์“ฐ๋Š” ํŒŒ์ผ {path}์„(๋ฅผ) ๋ง‰๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. robots.txt์—์„œ ์ด ํŒŒ์ผ์„ ๋ง‰๋Š” Disallow ๊ทœ์น™์„ ์ง€์šฐ์„ธ์š”.",
29
+ "entity-identity.name-differs": "ํŽ˜์ด์ง€๋งˆ๋‹ค ์‚ฌ์—…์ฒด ์ด๋ฆ„์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ๊ฐ™์€ ์ด๋ฆ„์„ ์“ฐ์„ธ์š”.",
30
+ "entity-identity.no-same-as": "Organization JSON-LD์— sameAs๊ฐ€ ์—†๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ SNS๋‚˜ ์ง€๋„ ์ฃผ์†Œ๋ฅผ sameAs์— ๋„ฃ์œผ์„ธ์š”.",
31
+ "entity-identity.no-home-organization": "ํ™ˆ ํŽ˜์ด์ง€์— Organization์ด๋‚˜ LocalBusiness JSON-LD๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ™ˆ ํŽ˜์ด์ง€์— ์‚ฌ์—…์ฒด ์ •๋ณด๋ฅผ JSON-LD๋กœ ๋„ฃ์œผ์„ธ์š”.",
32
+ "fact-consistency.differs": "{type:fact-type} ๊ฐ’์ด ํŽ˜์ด์ง€๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋Š” \"{found}\"์ด๊ณ , ๋‹ค๋ฅธ {count}๊ฐœ ํŽ˜์ด์ง€๋Š” \"{label}\"์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ํ™•์ธ์šฉ ๋ชฉ๋ก์ด ์—†์–ด ํŽ˜์ด์ง€๋ผ๋ฆฌ๋งŒ ๋น„๊ตํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์–ด๋А ์ชฝ์ด ๋งž๋Š”์ง€ ํ™•์ธํ•œ ๋’ค ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ๊ณ ์น˜์„ธ์š”.",
33
+ "fact-consistency.jsonld-differs": "JSON-LD์˜ {type:fact-type} ๊ฐ’๊ณผ ํ™”๋ฉด ๊ธ€์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. JSON-LD๋Š” \"{linked}\", ํ™”๋ฉด์€ \"{visible}\"์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ’์„ ๋งž์ถ”์„ธ์š”.",
34
+ "lcp-field.slow": "๋ฐฉ๋ฌธ์ž ์‹ค์ธก LCP(๊ฐ€์žฅ ํฐ ๋‚ด์šฉ์ด ๋œจ๋Š” ์‹œ๊ฐ„)๊ฐ€ {value} ms์ž…๋‹ˆ๋‹ค. {poor} ms๋ฅผ ๋„˜์œผ๋ฉด ๋А๋ฆฐ ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค(์ข‹์Œ์€ {good} ms ์ดํ•˜). ์ž๋ฃŒ ์ถœ์ฒ˜๋Š” {source:cwv-source}์ž…๋‹ˆ๋‹ค. ํฐ ์ด๋ฏธ์ง€๋‚˜ ๊ธ€์ด ๋” ๋นจ๋ฆฌ ๋œจ๊ฒŒ ๊ณ ์น˜์„ธ์š”.",
35
+ "inp-field.slow": "๋ฐฉ๋ฌธ์ž ์‹ค์ธก INP(๋ˆ„๋ฅธ ๋’ค ํ™”๋ฉด์ด ๋ฐ˜์‘ํ•˜๋Š” ์‹œ๊ฐ„)๊ฐ€ {value} ms์ž…๋‹ˆ๋‹ค. {poor} ms๋ฅผ ๋„˜์œผ๋ฉด ๋А๋ฆฐ ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค(์ข‹์Œ์€ {good} ms ์ดํ•˜). ์ž๋ฃŒ ์ถœ์ฒ˜๋Š” {source:cwv-source}์ž…๋‹ˆ๋‹ค. ๋ˆ„๋ฅผ ๋•Œ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ค„์ด์„ธ์š”.",
36
+ "cls-field.slow": "๋ฐฉ๋ฌธ์ž ์‹ค์ธก CLS(ํ™”๋ฉด์ด ๊ฐ‘์ž๊ธฐ ๋ฐ€๋ฆฌ๋Š” ์ •๋„)๊ฐ€ {value}์ž…๋‹ˆ๋‹ค. {poor}๋ฅผ ๋„˜์œผ๋ฉด ๋‚˜์œ ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค(์ข‹์Œ์€ {good} ์ดํ•˜). ์ž๋ฃŒ ์ถœ์ฒ˜๋Š” {source:cwv-source}์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์™€ ๊ด‘๊ณ ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์žก์•„ ๋‘์„ธ์š”.",
37
+ "fact-type.name": "์ด๋ฆ„",
38
+ "fact-type.phone": "์ „ํ™”๋ฒˆํ˜ธ",
39
+ "fact-type.year": "์—ฐ๋„",
40
+ "fact-type.address": "์ฃผ์†Œ",
41
+ "fact-type.headline": "๊ธ€ ์ œ๋ชฉ(headline)",
42
+ "cwv-source.crux": "Google์˜ Chrome UX Report(CrUX)",
43
+ "cwv-source.psi": "PageSpeed Insights",
44
+ "remediation.restore-http-access.mechanism": "์˜ค๋ฅ˜๋ฅผ ๋‚ด๋Š” ์‘๋‹ต์ด๋‚˜ ์ž˜๋ชป๋œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๊ณ ์ณ์„œ, ์ด ์ฃผ์†Œ๊ฐ€ ์›๋ž˜ ๋ณด์—ฌ ์ค„ ํŽ˜์ด์ง€๋ฅผ ๋Œ๋ ค์ฃผ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.",
45
+ "remediation.restore-http-access.validation": "๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๋‹ค์‹œ ๋ฐ›์•„์„œ ์ƒํƒœ ์ฝ”๋“œ, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๊ฒฝ๋กœ, ์›๋ณธ ์‘๋‹ต์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.",
46
+ "remediation.restore-http-access.effort": "์‚ฌ์ดํŠธ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค",
47
+ "remediation.restore-http-access.cost": "์•Œ ์ˆ˜ ์—†์Œ",
48
+ "remediation.restore-http-access.location_hint": "์ด ์ฃผ์†Œ๋ฅผ ๋งก์€ ์›น ์„œ๋ฒ„ ๊ฒฝ๋กœ, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๊ทœ์น™, ๋˜๋Š” ํŽ˜์ด์ง€ ๋ฐฐํฌ",
49
+ "remediation.allow-target-crawler.mechanism": "๊ฒ€์ƒ‰์— ๋‚˜์™€์•ผ ํ•˜๋Š” ๊ฒฝ๋กœ์™€ ๋Œ€์ƒ ํฌ๋กค๋Ÿฌ์— ํ•ด๋‹นํ•˜๋Š” robots.txt ๊ทœ์น™์„ ๊ณ ์นฉ๋‹ˆ๋‹ค.",
50
+ "remediation.allow-target-crawler.validation": "robots.txt๋ฅผ ๋ฐ›์•„์„œ ๊ฐ™์€ ํฌ๋กค๋Ÿฌ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ๋‹ค์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.",
51
+ "remediation.allow-target-crawler.effort": "์‚ฌ์ดํŠธ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค",
52
+ "remediation.allow-target-crawler.cost": "์•Œ ์ˆ˜ ์—†์Œ",
53
+ "remediation.allow-target-crawler.location_hint": "์‚ฌ์ดํŠธ ์ฃผ์†Œ ๋ฐ”๋กœ ์•„๋ž˜์˜ robots.txt(์˜ˆ: https://example.com/robots.txt)์—์„œ ํ•ด๋‹น ํฌ๋กค๋Ÿฌ์™€ ๊ฒฝ๋กœ์˜ ๊ทœ์น™",
54
+ "remediation.remove-unintended-noindex.mechanism": "์›๋ณธ ์‘๋‹ต์ด๋‚˜ X-Robots-Tag ํ—ค๋”์—์„œ ์˜๋„ํ•˜์ง€ ์•Š์€ noindex๋ฅผ ์ง€์›๋‹ˆ๋‹ค.",
55
+ "remediation.remove-unintended-noindex.validation": "์›๋ณธ HTML๊ณผ ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ฐ›์•„์„œ robots ์ง€์‹œ์–ด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.",
56
+ "remediation.remove-unintended-noindex.effort": "์‚ฌ์ดํŠธ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค",
57
+ "remediation.remove-unintended-noindex.cost": "์•Œ ์ˆ˜ ์—†์Œ",
58
+ "remediation.remove-unintended-noindex.location_hint": "ํ•ด๋‹น ํŽ˜์ด์ง€ ํ…œํ”Œ๋ฆฟ์˜ robots meta, ๋˜๋Š” ์„œ๋ฒ„์˜ X-Robots-Tag ํ—ค๋”",
59
+ "remediation.repair-document-title.mechanism": "ํ•ด๋‹น ํŽ˜์ด์ง€ ํ…œํ”Œ๋ฆฟ์— ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋Š” <title>์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.",
60
+ "remediation.repair-document-title.validation": "์›๋ณธ HTML์„ ๋ฐ›์•„์„œ ํ•ด๋‹น ์ฃผ์†Œ์˜ <title>์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.",
61
+ "remediation.repair-document-title.effort": "์‚ฌ์ดํŠธ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค",
62
+ "remediation.repair-document-title.cost": "์•Œ ์ˆ˜ ์—†์Œ",
63
+ "remediation.repair-document-title.location_hint": "ํ•ด๋‹น ํŽ˜์ด์ง€ ํ…œํ”Œ๋ฆฟ์˜ <title> ์š”์†Œ",
64
+ "remediation.repair-structured-data.mechanism": "ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋‚ด์šฉ๊ณผ ํ•„์ˆ˜ ํ•ญ๋ชฉ์— ๋งž๊ฒŒ ๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ(JSON-LD)๋ฅผ ๊ณ ์นฉ๋‹ˆ๋‹ค.",
65
+ "remediation.repair-structured-data.validation": "์›๋ณธ HTML์˜ ๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด ๋‚ด์šฉ๊ณผ ๋งž์ถฐ ๋ณด๊ณ , ํ•ด๋‹น ๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ ์ข…๋ฅ˜์˜ ํ•„์ˆ˜ ํ•ญ๋ชฉ์ด ๋น ์ง€์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.",
66
+ "remediation.repair-structured-data.effort": "์‚ฌ์ดํŠธ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค",
67
+ "remediation.repair-structured-data.cost": "์•Œ ์ˆ˜ ์—†์Œ",
68
+ "remediation.repair-structured-data.location_hint": "ํ•ด๋‹น ํŽ˜์ด์ง€ ์›๋ณธ HTML์˜ ๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ ๋ธ”๋ก",
69
+ "authority.site_owner_edit": "์‚ฌ์ดํŠธ ์†Œ์œ ์ž์˜ ์ˆ˜์ • ๊ถŒํ•œ",
70
+ "headline.not-indexed": "noindex๊ฐ€ ๋ถ™์–ด ์žˆ๊ณ  ์‚ฌ์ดํŠธ๋งต์—๋„ ์—†๋Š” ํŽ˜์ด์ง€ {count}๊ฐœ๋Š” ์‚ฌ์ดํŠธ๊ฐ€ ์ผ๋ถ€๋Ÿฌ ๊ฒ€์ƒ‰์—์„œ ๋บ€ ํŽ˜์ด์ง€๋กœ ๋ณด๊ณ  ์ƒ‰์ธ ๊ฒ€์‚ฌ์—์„œ ๋บ์Šต๋‹ˆ๋‹ค({pages}). ์ด ๊ฐ€์šด๋ฐ ๊ฒ€์ƒ‰์— ๋‚˜์™€์•ผ ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ํŽ˜์ด์ง€์˜ noindex๋ฅผ ์ง€์šฐ์„ธ์š”.",
71
+ "follow-up.finding.input": "์›๋ณธ ์ฆ๊ฑฐ์™€ ์‚ฌ์ดํŠธ ์†Œ์œ ์ž์˜ ๊ฒ€ํ† ",
72
+ "follow-up.finding.next": "์œ„ ๋ฌธ์ œ ๋ฌธ์žฅ์˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ ๊ณ ์นœ ๋’ค, ๊ฐ์‚ฌ๋ฅผ ๋‹ค์‹œ ํ•ด์„œ ํ™•์ธํ•˜์„ธ์š”.",
73
+ "follow-up.finding.when": "์ƒˆ ์ฆ๊ฑฐ๋ฅผ ๋ชจ์€ ๋’ค",
74
+ "follow-up.preflight-unreadable.problem": "์‹œ์ž‘ ์งˆ๋ฌธ ์ „์— ์‚ฌ์ดํŠธ๋ฅผ ๋ฏธ๋ฆฌ ์ฝ์€ ๊ฒฐ๊ณผ๋ฅผ ์“ธ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹œ์ž‘ ํŽ˜์ด์ง€์™€ ์‚ฌ์‹ค์ด ํ™•์ธ๋œ ํŽ˜์ด์ง€๋งŒ ๊ฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.",
75
+ "follow-up.preflight-unreadable.reason": "์‚ฌ์ดํŠธ ๋ฏธ๋ฆฌ ์ฝ๊ธฐ๋ฅผ ์“ธ ์ˆ˜ ์—†์Œ",
76
+ "follow-up.preflight-unreadable.input": "์‚ฌ์ดํŠธ๋ฅผ ๋ฏธ๋ฆฌ ์ฝ์€ ์ƒˆ ๊ฒฐ๊ณผ",
77
+ "follow-up.preflight-unreadable.next": "์—์ด์ „ํŠธ์—๊ฒŒ ๊ฐ์‚ฌ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ•ด ๋‹ฌ๋ผ๊ณ  ํ•˜์„ธ์š”. ๊ฐ์‚ฌ๋Š” ์ƒˆ ํด๋”์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.",
78
+ "follow-up.preflight-unreadable.when": "์‚ฌ์ดํŠธ๋ฅผ ๋ฏธ๋ฆฌ ์ฝ์€ ๊ฒฐ๊ณผ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ๊ฐ์‚ฌ์—์„œ",
79
+ "follow-up.export-unusable.problem": "{kind:export-kind} ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ์„ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. {reason:export-problem}",
80
+ "follow-up.export-unusable.reason": "๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ์„ ์“ธ ์ˆ˜ ์—†์Œ",
81
+ "follow-up.export-unusable.input": "์‚ฌ์ดํŠธ ์†Œ์œ ์ž๊ฐ€ ์ƒˆ๋กœ ๋‚ด๋ ค๋ฐ›์€ ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ",
82
+ "follow-up.export-unusable.next": "๋Ÿฐ๋ถ์— ๋‚˜์˜จ ๋Œ€๋กœ ํŒŒ์ผ์„ ๋‹ค์‹œ ๋‚ด๋ ค๋ฐ›๊ณ , ๋‹ค์Œ ๊ฐ์‚ฌ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์—์ด์ „ํŠธ์—๊ฒŒ ๊ทธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์•Œ๋ ค ์ฃผ์„ธ์š”.",
83
+ "follow-up.export-unusable.when": "์ƒˆ ํŒŒ์ผ์„ ๋„ฃ๊ณ  ํ•˜๋Š” ๋‹ค์Œ ๊ฐ์‚ฌ์—์„œ",
84
+ "follow-up.production-pending.problem": "์ด ๊ณ ์นจ์€ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋งŒ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค: {fix} {pages}. ์‹ค์ œ ์‚ฌ์ดํŠธ์— ์ ์šฉํ•˜๊ณ  ํ™•์ธํ•˜๋Š” ์ผ์ด ๋‚จ์•˜์Šต๋‹ˆ๋‹ค.",
85
+ "follow-up.production-pending.reason": "์‹ค์ œ ์‚ฌ์ดํŠธ์— ์ ์šฉํ•˜๊ธฐ ์ „",
86
+ "follow-up.production-pending.input": "์‹ค์ œ ์‚ฌ์ดํŠธ์— ๋ฐฐํฌํ•  ๊ถŒํ•œ๊ณผ ์‹ค์ œ ์‚ฌ์ดํŠธ ์ฃผ์†Œ",
87
+ "follow-up.production-pending.next": "๋‚ด ์ปดํ“จํ„ฐ์—์„œ ํ™•์ธํ•œ ๋ณ€๊ฒฝ์„ ๋ฐฐํฌํ•œ ๋’ค, ์‹ค์ œ ์‚ฌ์ดํŠธ์˜ ์‘๋‹ต์„ ๋ฐ›์œผ์„ธ์š”.",
88
+ "follow-up.production-pending.when": "ํ—ˆ๊ฐ€๋ฐ›์•„ ๋ฐฐํฌํ•œ ๋’ค ์ƒˆ ์›๋ณธ ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ",
89
+ "export-problem.export_file_missing": "๋ฐ›์€ ๊ฒฝ๋กœ์—์„œ ํŒŒ์ผ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.",
90
+ "export-problem.export_file_unreadable": "ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.",
91
+ "export-problem.export_file_too_large": "ํŒŒ์ผ์ด ์ด ๊ฐ์‚ฌ๊ฐ€ ์ฝ๋Š” ํฌ๊ธฐ๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค.",
92
+ "export-problem.export_not_a_zip": "Search Console์ด ์ฃผ๋Š” zip ํŒŒ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.",
93
+ "export-problem.export_zip_damaged": "zip ํŒŒ์ผ์ด ๊นจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.",
94
+ "export-problem.export_zip_method_unsupported": "์ด ๊ฐ์‚ฌ๊ฐ€ ์ฝ์ง€ ๋ชปํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์••์ถ•๋œ zip ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.",
95
+ "export-problem.export_table_not_found": "ํด๋ฆญ ์ˆ˜์™€ ๋…ธ์ถœ ์ˆ˜๊ฐ€ ์žˆ๋Š” ํ‘œ๋ฅผ ํŒŒ์ผ์—์„œ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.",
96
+ "export-problem.export_numbers_unreadable": "ํ‘œ์˜ ์ˆซ์ž๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.",
97
+ "export-problem.export_period_missing": "๋ถ™์—ฌ ๋„ฃ์€ ๊ธ€์— ์–ด๋А ๊ธฐ๊ฐ„์˜ ์ž๋ฃŒ์ธ์ง€ ์ ํ˜€ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
98
+ "export-problem.export_not_accepted": "์ˆซ์ž๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ์„ ๋‹ค์‹œ ๋‚ด๋ ค๋ฐ›์•„ ๋ณด์„ธ์š”.",
99
+ "cost-status.unknown": "์•Œ ์ˆ˜ ์—†์Œ",
100
+ "cost-status.overrun": "ํ•œ๋„ ์ดˆ๊ณผ",
101
+ "cost.reservation": "{provider}: ๋น„์šฉ ์ƒํƒœ๊ฐ€ '{status:cost-status}'์ž…๋‹ˆ๋‹ค (์˜ˆ์•ฝ {reserved}, ์‹ค์ œ {actual}).",
102
+ "cost.host-policy": "{provider}: ์œ ๋ฃŒ ๋น„์šฉ ์ƒํ•œ์„ ์ฝ”๋“œ๊ฐ€ ์ง€ํ‚ค์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์“ฐ๋Š” ์—์ด์ „ํŠธ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค์ •์ด ๋น„์šฉ ์ƒํ•œ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.",
103
+ "cost.bulk-crawl-unverified": "๋Œ€๋Ÿ‰ ์ˆ˜์ง‘: ๋ฒ”์œ„์™€ ๋น„์šฉ ์ƒํ•œ์„ ์ฝ”๋“œ๊ฐ€ ์ง€ํ‚ค๋Š”์ง€ ํ™•์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์“ฐ๋Š” ์—์ด์ „ํŠธ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค์ •์ด ์ƒํ•œ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.",
104
+ "cost.anthropic": "Anthropic ์ง์ ‘ ํ˜ธ์ถœ v{version}: ๊ธ€์ž๋งŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ธ์€ claude-fable-5-1, claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€ ์ถœ๋ ฅ์€ 128000์ž…๋‹ˆ๋‹ค. ์‹œ๋„๋งˆ๋‹ค ํ† ํฐ 1000000+max_tokens ์ด์ƒ์„ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ์™€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์€ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธˆ์•ก๋งŒ์œผ๋กœ ์ •ํ•œ ํ•œ๋„๋‚˜ ๊ธˆ์•ก๊ณผ ํ† ํฐ์„ ์„ž์€ ํ•œ๋„๋„ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ์•ฝํ•œ ์–‘์€ ์“ธ ์ˆ˜ ์žˆ๋Š” ์šฉ๋Ÿ‰์ด๋ฉฐ ์‹ค์ œ ์ฒญ๊ตฌ์•ก์ด ์•„๋‹™๋‹ˆ๋‹ค.",
105
+ "crawler.Googlebot": "๊ตฌ๊ธ€ ํฌ๋กค๋Ÿฌ(Googlebot)",
106
+ "crawler.Yeti": "๋„ค์ด๋ฒ„ ํฌ๋กค๋Ÿฌ(Yeti)",
107
+ "export-kind.gsc": "Search Console",
108
+ "export-kind.naver": "๋„ค์ด๋ฒ„ ์„œ์น˜์–ด๋“œ๋ฐ”์ด์ €",
109
+ "metric-origin.owner-export": "์‚ฌ์ดํŠธ ์†Œ์œ ์ž๊ฐ€ ์ค€ ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ์˜ ์ถœ์ฒ˜์™€ ์ œ๊ณต์ฒ˜์˜ ์™„์ „์„ฑ์€ ๋”ฐ๋กœ ํ™•์ธํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.",
110
+ "metric-origin.panel": "๊ฒ€์ƒ‰ ์„œ๋น„์Šค๊ฐ€ ๋Œ๋ ค์ค€ ๋‹ต์˜ ์ถœ์ฒ˜์™€ ์˜๋ฏธ ํŒ๋‹จ์€ ๊ธฐ๋ก๋œ ์˜์ˆ˜์ฆ์— ๊ทผ๊ฑฐํ•˜๋ฉฐ, ๋”ฐ๋กœ ํ™•์ธํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.",
111
+ "outcome-word.comparable_windows": "๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ฐ„",
112
+ "outcome-word.not_comparable_or_missing_window": "๋น„๊ตํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๊ธฐ๊ฐ„์ด ๋น ์ง",
113
+ "outcome-word.measured": "์ธก์ •๋จ",
114
+ "outcome-word.unknown": "์•Œ ์ˆ˜ ์—†์Œ",
115
+ "outcome-word.zero_or_missing": "0์ด๊ฑฐ๋‚˜ ๋น ์ง",
116
+ "outcome-word.not_applicable": "ํ•ด๋‹น ์—†์Œ",
117
+ "state.pass": "ํ†ต๊ณผ",
118
+ "state.fail": "์‹คํŒจ",
119
+ "state.partial": "์ผ๋ถ€ ํ†ต๊ณผ",
120
+ "state.unknown": "์•Œ ์ˆ˜ ์—†์Œ",
121
+ "state.not_applicable": "ํ•ด๋‹น ์—†์Œ",
122
+ "identity-basis.name_and_fact": "์ด๋ฆ„๊ณผ ์‹๋ณ„ ์‚ฌ์‹ค์ด ๋งž์Œ",
123
+ "identity-basis.name_only": "์ด๋ฆ„๋งŒ ๋งž์Œ",
124
+ "identity-basis.no_matching_name": "๋งž๋Š” ์ด๋ฆ„์ด ์—†์Œ",
125
+ "question-coverage.none-answered": "์ด๋ฒˆ์— ์ฝ์€ ํŽ˜์ด์ง€ ์ค‘์—์„œ๋Š” ์‹œ์ž‘ ์งˆ๋ฌธ ๋ชฉ๋ก์˜ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.",
126
+ "question-coverage.none-answered.mechanism": "์‚ฌ์ดํŠธ์— ๋‹ต์ด ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ๊ทธ ์งˆ๋ฌธ์˜ ๋ง์„ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ œ๋ชฉ์ด๋‚˜ ์ฒซ ๋ฌธ์žฅ์— ์“ฐ๊ณ , ์—†๋‹ค๋ฉด ์งˆ๋ฌธ๋งˆ๋‹ค ๋‹ต์ด ๋ฐ”๋กœ ๋ณด์ด๋Š” ํŽ˜์ด์ง€๋ฅผ ํ•˜๋‚˜์”ฉ ๋งŒ๋“œ์„ธ์š”.",
127
+ "question-coverage.none-answered.effort": "์‚ฌ์ดํŠธ๋งˆ๋‹ค ๋‹ค๋ฆ„ โ€” ์ด๋ฏธ ์žˆ๋Š” ํŽ˜์ด์ง€์˜ ์ œ๋ชฉ์„ ๊ณ ์น˜๋ฉด ์ž‘๊ณ , ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ์“ฐ๋ฉด ํผ",
128
+ "question-coverage.none-answered.validation": "๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๋ฉด ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์ฐพ์€ ์งˆ๋ฌธ์˜ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.",
129
+ "question-coverage.not-found": "์ด๋ฒˆ์— ์ฝ์€ ํŽ˜์ด์ง€์—์„œ๋Š” ์ด ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.",
130
+ "question-coverage.note": "ใ€Œ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹คใ€๋Š” ์ด๋ฒˆ ๊ฐ์‚ฌ์˜ ํŒ์ •์—์„œ ๊ทธ ์งˆ๋ฌธ์˜ ๋‹ต์œผ๋กœ ๊ผฝํžŒ ํŽ˜์ด์ง€๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ผ ๋ฟ ์‚ฌ์ดํŠธ์— ๋‹ต์ด ์—†๋‹ค๋Š” ๋œป์ด ์•„๋‹ˆ๋ฉฐ, ๋จธ๋ฆฌ๋งยท๋ฐ”๋‹ฅ๊ธ€์ฒ˜๋Ÿผ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋˜ํ’€์ด๋˜๋Š” ๊ธ€์€ ํŒ์ •์ด ๊ทธ ๊ธ€์„ ์ธ์šฉํ•œ ์งˆ๋ฌธ๋งŒ ๋‹ตํ•œ ๊ฒƒ์œผ๋กœ ์…‰๋‹ˆ๋‹ค.",
131
+ "model-fix.cited": "ํ•ด๋‹น ๊ธ€: ใ€Œ{quote}ใ€",
132
+ "model-fix.where": "{pages}์˜ ๋ณธ๋ฌธ",
133
+ "model-fix.claim-support": "์ด ํŽ˜์ด์ง€๋Š” ์ˆซ์žยทํšจ๊ณผยท์‚ฌ์‹ค์„ ๋งํ•˜๋Š”๋ฐ, ๊ทผ๊ฑฐ๋‚˜ ์ถœ์ฒ˜๊ฐ€ ํ•˜๋‚˜๋„ ๋ถ™์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
134
+ "model-fix.claim-support.mechanism": "์ฃผ์žฅ ์˜†์— ์ถœ์ฒ˜(๊ธฐ๊ด€์ด๋‚˜ ์ž๋ฃŒ ์ด๋ฆ„)์™€ ๊ธฐ์ค€ ๋‚ ์งœ๋ฅผ ์ ๊ณ , ์ˆซ์ž์—๋Š” ์–ด๋–ป๊ฒŒ ์…Œ๋Š”์ง€ ํ•œ ์ค„์„ ๋ง๋ถ™์ด์„ธ์š”.",
135
+ "model-fix.claim-support.effort": "์ž‘์Œ โ€” ์ฃผ์žฅ๋งˆ๋‹ค ๋ฌธ์žฅ ํ•œ ์ค„",
136
+ "model-fix.claim-support.validation": "๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๋ฉด ์ด ํ•ญ๋ชฉ์ด ํ†ต๊ณผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.",
137
+ "model-fix.answer-clarity": "์ด ํŽ˜์ด์ง€๋Š” ใ€Œ{question}ใ€์— ๋‹ตํ•˜๋ ค๋Š” ํŽ˜์ด์ง€์ธ๋ฐ, ๊ทธ ๋‹ต์ด ํ‹€๋ ธ๊ฑฐ๋‚˜ ๋น ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.",
138
+ "model-fix.answer-clarity.mechanism": "ใ€Œ{question}ใ€์˜ ๋‹ต(๊ธˆ์•กยท์‹œ๊ฐ„ยท์žฅ์†Œ ๋“ฑ)์„ ํŽ˜์ด์ง€ ์ฒซ๋จธ๋ฆฌ์— ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ง์ ‘ ์ ์œผ์„ธ์š”.",
139
+ "model-fix.answer-clarity.effort": "๋ณดํ†ต โ€” ๋ฌธ๋‹จ ํ•˜๋‚˜ ๊ณ ์น˜๊ธฐ",
140
+ "model-fix.answer-clarity.validation": "๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๋ฉด ์ด ํ•ญ๋ชฉ์ด ํ†ต๊ณผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.",
141
+ "model-fix.original-value": "์ด ํŽ˜์ด์ง€๋Š” ์ง์ ‘ ๊ฒช์€ ์ผ์ด๋‚˜ ์ง์ ‘ ๋ชจ์€ ์ž๋ฃŒ๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ณ , ๊ฐ™์€ ๋ง์˜ ๋ฐ˜๋ณต์ด๋‚˜ ๊ฒ€์ƒ‰์–ด ์ฑ„์šฐ๊ธฐ์ฒ˜๋Ÿผ ์ฝํž™๋‹ˆ๋‹ค.",
142
+ "model-fix.original-value.mechanism": "์šฐ๋ฆฌ ๊ธฐ๊ด€์ด ์ง์ ‘ ํ•œ ์ผ, ์ง์ ‘ ์„ผ ์ˆซ์ž, ์‹ค์ œ ์ง„ํ–‰ ์ ˆ์ฐจ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฌธ๋‹จ์œผ๋กœ ๋„ฃ์œผ์„ธ์š”.",
143
+ "model-fix.original-value.effort": "๋ณดํ†ต โ€” ๋ฌธ๋‹จ ํ•˜๋‚˜ ์“ฐ๊ธฐ",
144
+ "model-fix.original-value.validation": "๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๋ฉด ์ด ํ•ญ๋ชฉ์ด ํ†ต๊ณผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.",
145
+ "model-fix.freshness-truth.absence": "์ด ํŽ˜์ด์ง€์— ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ(์šด์˜ ์‹œ๊ฐ„ยท์ •์›ยท๊ฐ€๊ฒฉ ๋“ฑ)์ด ์žˆ๋Š”๋ฐ ์–ธ์ œ ๊ธฐ์ค€์ธ์ง€ ๋‚ ์งœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.",
146
+ "model-fix.freshness-truth.absence.mechanism": "๊ทธ ๋‚ด์šฉ ์˜†์— ใ€Œ2026๋…„ 10์›” 17์ผ ๊ธฐ์ค€ใ€์ฒ˜๋Ÿผ ํ™•์ธํ•œ ๋‚ ์งœ๋ฅผ ์ ์œผ์„ธ์š”.",
147
+ "model-fix.freshness-truth.absence.effort": "์ž‘์Œ โ€” ๋ฌธ์žฅ ํ•œ ์ค„",
148
+ "model-fix.freshness-truth.absence.validation": "๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๋ฉด ์ด ํ•ญ๋ชฉ์ด ํ†ต๊ณผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.",
149
+ "model-fix.freshness-truth.shown": "์ด ํŽ˜์ด์ง€์˜ ๋‚ ์งœ๊ฐ€ ๋‚ด์šฉ๊ณผ ๋งž์ง€ ์•Š๊ฑฐ๋‚˜, ์ค‘์š”ํ•œ ๋‚ด์šฉ์ด ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.",
150
+ "model-fix.freshness-truth.shown.mechanism": "์ง€๋‚œ ์ผ์€ ์ง€๋‚œ ์ผ๋กœ ๊ณ ์น˜๊ณ , ๋ฐ”๋€ ๋‚ด์šฉ์€ ์ตœ์‹ ์œผ๋กœ ๊ณ ์นœ ๋’ค ํ™•์ธํ•œ ๋‚ ์งœ๋ฅผ ์˜†์— ์ ์œผ์„ธ์š”.",
151
+ "model-fix.freshness-truth.shown.effort": "์ž‘์Œ โ€” ๋ฌธ์žฅ ํ•œ๋‘ ์ค„",
152
+ "model-fix.freshness-truth.shown.validation": "๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๋ฉด ์ด ํ•ญ๋ชฉ์ด ํ†ต๊ณผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.",
153
+ "model-fix.source-transparency.absence": "์ด ํŽ˜์ด์ง€์˜ ๋ณธ๋ฌธ์—๋Š” ๋ˆ„๊ฐ€ ์šด์˜ํ•˜๊ฑฐ๋‚˜ ์“ด ๊ธ€์ธ์ง€(๊ธฐ๊ด€ยท๊ธ€์“ด์ด)๊ฐ€ ์ ํ˜€ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
154
+ "model-fix.source-transparency.absence.mechanism": "ํŽ˜์ด์ง€ ๋ณธ๋ฌธ ์•ˆ์—, ์ œ๋ชฉ ์•„๋ž˜๋‚˜ ๊ธ€ ๋์— ์šด์˜ ๊ธฐ๊ด€์ด๋‚˜ ๊ธ€์“ด์ด์˜ ์ด๋ฆ„๊ณผ ์—ฐ๋ฝ ๋ฐฉ๋ฒ•์„ ํ•œ ์ค„๋กœ ์ ์œผ์„ธ์š”(๋Œ€๋ถ€๋ถ„์˜ ํŽ˜์ด์ง€์— ๋˜‘๊ฐ™์ด ๋˜ํ’€์ด๋˜๋Š” ์ค„์€ ๊ฒ€์‚ฌ๊ฐ€ ๊ทธ ํŽ˜์ด์ง€์˜ ๊ธ€๋กœ ์„ธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค).",
155
+ "model-fix.source-transparency.absence.effort": "์ž‘์Œ โ€” ๋ฌธ์žฅ ํ•œ ์ค„",
156
+ "model-fix.source-transparency.absence.validation": "๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๋ฉด ์ด ํŽ˜์ด์ง€์˜ ๋ณธ๋ฌธ์— ์ ์€ ์šด์˜ ๊ธฐ๊ด€์ด ํ™•์ธ๋˜์–ด ์ด ํ•ญ๋ชฉ์ด ํ†ต๊ณผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.",
157
+ "model-fix.source-transparency.shown": "์ด ํŽ˜์ด์ง€๋Š” ์ถœ์ฒ˜๋‚˜ ์ฑ…์ž„์ž๊ฐ€ ๊ผญ ํ•„์š”ํ•œ ๋‚ด์šฉ์ธ๋ฐ, ํŽ˜์ด์ง€์—์„œ ๊ทธ๊ฒƒ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
158
+ "model-fix.source-transparency.shown.mechanism": "๋‚ด์šฉ์˜ ์ถœ์ฒ˜(๊ธฐ๊ด€์ด๋‚˜ ์ž๋ฃŒ ์ด๋ฆ„), ์ฑ…์ž„ ๊ธฐ๊ด€, ์—ฐ๋ฝ ๋ฐฉ๋ฒ•์„ ํŽ˜์ด์ง€ ๋ณธ๋ฌธ์— ์ ์œผ์„ธ์š”.",
159
+ "model-fix.source-transparency.shown.effort": "์ž‘์Œ โ€” ๋ฌธ์žฅ ํ•œ๋‘ ์ค„",
160
+ "model-fix.source-transparency.shown.validation": "๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๋ฉด ์ด ํ•ญ๋ชฉ์ด ํ†ต๊ณผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.",
161
+ "model-fix.entity-identity": "ํ™ˆ ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์—…์ฒด์˜ ์ด๋ฆ„์„ ๋งํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๋งํ•ฉ๋‹ˆ๋‹ค.",
162
+ "model-fix.entity-identity.mechanism": "ํ™ˆ ํŽ˜์ด์ง€ ์ฒซ ํ™”๋ฉด์— ์‚ฌ์—…์ฒด์˜ ์ •์‹ ์ด๋ฆ„๊ณผ ์ „ํ™”๋ฒˆํ˜ธยท์ฃผ์†Œ๋ฅผ ์ ์œผ์„ธ์š”.",
163
+ "model-fix.entity-identity.effort": "์ž‘์Œ โ€” ๋ฌธ์žฅ ํ•œ ์ค„",
164
+ "model-fix.entity-identity.validation": "๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜๋ฉด ์ด ํ•ญ๋ชฉ์ด ํ†ต๊ณผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.",
165
+ "readiness.blocked": "๋ง‰ํž˜",
166
+ "readiness.unverified": "ํ™•์ธ ์ „",
167
+ "readiness.provisional": "์ž„์‹œ",
168
+ "readiness.measured": "์ธก์ •๋จ",
169
+ "readiness.not_applicable": "ํ•ด๋‹น ์—†์Œ"
170
+ }
@@ -1,6 +1,6 @@
1
- # Report packet and evidence contract (v0.1.0)
1
+ # Report packet and evidence contract (contract 2.0.0)
2
2
 
3
- `node skills/optbrew/scripts/cli.mjs report --input <packet.json> --output-dir <new-directory>` writes `report.json` and `report.md`. It makes no network or paid calls. It refuses to replace an existing report. A report is a local audit artifact; a local passing verification does not establish deployment, indexing, traffic, ranking, citations, or business impact.
3
+ `node skills/optbrew/scripts/cli.mjs report --input <packet.json> --output-dir <new-directory>` writes `report.json`, `report.md` and `report.html` (the page shows the full-steps runbooks, because a packet does not record the guidance level). It makes no network or paid calls. It refuses to replace an existing report. A report is a local audit artifact; a local passing verification does not establish deployment, indexing, traffic, ranking, citations, or business impact.
4
4
 
5
5
  `ReportPacket` retains the approved `run_context`, raw `baseline.input`, optional `after.input`, their `score()` results, `compare()` result, metrics, findings, changes, costs, remaining work, and source identity. `evidence_root` points to the run directory. The CLI resolves a relative root against the packet's directory. Each `evidence_index` item has `{ref,sha256,kind,run_id,source_ref?,source_url?}`. Every indexed file is reopened, checked against its SHA-256, and contained by the resolved run directory. The context file at each phase's `run_context.evidence_ref` must contain exactly that run context.
6
6
 
@@ -20,10 +20,22 @@ For `verification.status:"passed"`, the indexed receipt has `{run_id,change_id,t
20
20
 
21
21
  Collector verdicts are replayed, not trusted. For each collector-sourced `index-policy`, `document-title` and `search-crawl-policy` observation the report reopens the preserved raw bytes of the same phase and rebuilds the verdict with the code the audit used. Index directives come from the HTML `<head>` meta tags (comments and script, style, textarea and title text are ignored) and the collected `X-Robots-Tag` header. The generic `robots` directives combine with the target engine's own (`googlebot` for Google, `yeti` for Naver); a header prefixed with another crawler name does not apply, and a crawler prefix scopes only the header line that carries it. Meta directives may be separated by commas or semicolons. A robots meta tag inside `<template>` or `<noscript>` is conservatively counted as a noindex directive. A present title replays as `unknown` because uniqueness and descriptiveness need separate evidence; a missing title replays as `fail`; reviewed duplicate-title or semantic verdicts from other evaluators are not rejected for having a title. A crawl-policy verdict needs the declared `robots` auxiliary artifact, its content hash, the page's final URL and a target engine, then recomputes `pass` or `fail` from the robots bytes. Every collected response is replayed from its hashed `*.response.json` record: the collection entry must equal the record, the final URL must follow the recorded redirect chain (no redirect means the final URL is the normalized request URL), and header lines come from the record, so index every `responses[].evidence_ref` from the audit index with `source_ref:"optbrew:collector"`. A selected page must be either collected or listed in `skipped`, and an indexed collector artifact requires its baseline audit snapshot. Every observation the collector plans for a selected page (fetch, title, index and, for Naver with a disallowing declared robots file, crawl policy) must be present in the packet and in the saved observations; a missing one is an error, never a silent pass. A redirected URL binds its requested unit to the artifact first; the module output must describe that artifact's final URL (`requested_url` and `redirect_chain` stay with it). A header-only `noindex` finding uses the same HTML plus header replay as the observation and must belong to the finding's own unit.
22
22
 
23
- `verified_local` uses the production binding: the change and its receipt name an `observation_id` and `observation_evidence_ref` for a passing after observation that the collector produced (so the audit replay covers it); that raw evidence entry is labelled `phase:"after"`, `environment:"local"` and the run target, and the after context is `local` for the same target. A byte-hash receipt or an agent-written observation alone leaves the finding `modified_unverified`. For `verified_production` the finding carries `resolution` (observation ID, evaluator type, source) and the Status cell reads `resolved by <evaluator_type> observation from <source_ref>`, so a model-attested resolution is visibly distinct from a collector-verified one; the production gating rules are unchanged. Native path mappings match whole path segments: the exported path starts with a single `/` (protocol-relative paths and absolute URLs on another host are refused) and equals the approved `path_prefix` or continues after a `/`.
23
+ `verified_local` uses the production binding: the change and its receipt name an `observation_id` and `observation_evidence_ref` for a passing after observation that the collector produced (so the audit replay covers it); that raw evidence entry is labelled `phase:"after"`, `environment:"local"` and the run target, and the after context is `local` for the same target. A byte-hash receipt or an agent-written observation alone leaves the finding `modified_unverified`. For `verified_production` the finding carries `resolution` (observation ID, evaluator type, source) and the Status cell reads `resolved by <evaluator_type> observation from <source_ref>`, which names the observation that resolved the finding (only a `code` observation from `optbrew:collector` can, because a model judgment is bound to spans of the stored judge queue and never stands for a code-judged check); the production gating rules are unchanged. Native path mappings match whole path segments: the exported path starts with a single `/` (protocol-relative paths and absolute URLs on another host are refused) and equals the approved `path_prefix` or continues after a `/`.
24
24
 
25
- Collector verdicts for the families below come from one derivation, `scripts/core/derive.mjs`, which the audit runs on the live responses and the report runs again on the hashed raw evidence. Every derived observation must be in the packet and in the saved observations, and each packet observation must match its derivation in state, credit and evidence reference; an extra or missing collector observation is an error. The families: `fetch-response`; `index-policy`; `document-title` (missing or duplicated across the selected pages fails; a unique title stays `unknown`); `search-crawl-policy` for every engine with a token in `ai-crawlers.json`, judged on the declared robots file; `canonical-consistency` (a redirect chain of two or more hops, or a canonical target that returns an error, fails; a self-referencing or reachable canonical within one hop passes; the collector fetches in-scope canonical targets within the request limit); `discovery` (a selected public page that no collected page links to and no reachable declared sitemap lists fails when the crawl was complete and at least two pages were collected; a sitemap index or an incomplete crawl leaves it `unknown`; an unlinked page is `unknown` when another collected page's own bytes (inline scripts included) name its path as a whole path, or when a script-only page loads a same-origin script file that was not collected, unless a fetched sitemap that lists other pages leaves it out (an inline script that builds the URL from pieces can still give a false orphan); entity-encoded hrefs are decoded and `index.html` equals its directory); `structured-data-truth` (a live JSON-LD block that does not parse fails; blocks inside HTML comments and empty placeholder blocks are ignored; parsing alone never passes); `naver-markup` (Open Graph, description, canonical, viewport, title repetition, CSS or JS blocked for Yeti); and, for runs that enable them, `fact-consistency` and `entity-identity`. Fact consistency compares name, address, phone and founding year across the selected pages. Values come only from Organization or LocalBusiness JSON-LD, `tel:` links (counted only on a page with no labelled or JSON-LD phone, so a mobile inquiry link never contradicts the landline) and explicitly labelled fields (`Phone:`, `Tel`, `Address:`, `Founded:` and Korean equivalents); prose, dates and numbers elsewhere are never read as facts, and a fax or registration number is not a phone. A national number written with spaces only (02 555 0142) is read in a label, and so are Korean nationwide representative numbers (15xx, 16xx or 18xx plus four digits). Addresses are compared after unifying street abbreviations, dropping postal codes and a trailing country, and treating a street address with or without city detail as the same. A page is a separate entity and is not compared only on structural evidence: JSON-LD `branchOf`, `parentOrganization` or a different `@id`; a branch-list URL path (`/branch/`, `/branches/`, `/locations/`, `/stores/`, `/์ง€์ /`); or the word branch, ์ง€์  or ์ง€์‚ฌ in its title or first heading together with an address of its own that differs from the main entity's. A title word alone does not hide a wrong phone. A reference value needs at least two pages and a unique majority; a page that disagrees, or whose JSON-LD disagrees with its own visible text, fails; a tie or a single page stays `unknown`. This is consistency between pages, not accuracy against an approved fact list. `entity-identity` (site unit) fails on conflicting names, Organization JSON-LD without `sameAs`, or no Organization JSON-LD on the home page while other pages have it. The `robots.txt` Sitemap line, og:image size, hreflang and JavaScript-only navigation are not scripted. Audit evidence from 0.1.2 or earlier has no hashed failure records and lacks the 0.1.3 discovery and fact observations, so report replay refuses it with an "older optbrew release" error; run the audit again with 0.1.3 and build a new packet. Every audit also writes `ledger.json`: one entry per queued or rejected URL with its request count. Index it with `source_ref:"optbrew:collector"`. Replay checks that the skipped list, `limit_reached`, `request_count` and `evaluated_count` equal the ledger, that each response entry matches a hashed response record (requests = redirect hops + 1), that each failed fetch matches a hashed failure record (`*.failure.json`, listed in `failures`; requests = answered redirect hops + at most one attempt that got no response), that a URL appears in only one entry, that a failed fetch or a request-limit skip belongs to a URL with provenance (selected, auxiliary, or linked from a collected page), that the total never exceeds the request limit and a limit is claimed only when the recorded requests use all of it, and that a selected page is skipped only for the request limit. Index every `*.failure.json` file with `source_ref:"optbrew:collector"`, as for `*.response.json`. The audit index also lists the modules that ran; every listed module must have its output in `modules.json`. All derived families above are computed from the collector evidence whether or not a module ran.
25
+ Collector verdicts for the families below come from one derivation, `scripts/core/derive.mjs`, which the audit runs on the live responses and the report runs again on the hashed raw evidence. Every derived observation must be in the packet and in the saved observations, and each packet observation must match its derivation in state, credit and evidence reference; an extra or missing collector observation is an error. The families: `fetch-response`; `index-policy`; `document-title` (missing or duplicated across the selected pages fails; with at least two audited pages a unique title that is not only the site name or a generic word passes, and otherwise it stays `unknown`; only pages meant to be indexed count. A page whose canonical link names the same page without the query string or fragment (same site with `www.` and http/https folded, same path; a relative canonical is resolved against `<base href>` when the head has one) is a variant of that page, and the variants and the page are one document that never duplicates itself; its pass reason says the title is shared only with query variants of the same page. A canonical to the home page, to another path or to another site leaves each page its own document, so those pages still duplicate each other); `search-crawl-policy` for every engine with a token in `ai-crawlers.json`, judged on the declared robots file; `canonical-consistency` (a redirect chain of two or more hops, or a canonical target that returns an error, fails; a self-referencing or reachable canonical within one hop passes; the collector fetches in-scope canonical targets within the request limit); `discovery` (a selected public page that no collected page links to and no reachable declared sitemap lists fails when the crawl was complete and at least two pages were collected; a sitemap index or an incomplete crawl leaves it `unknown`; an unlinked page is `unknown` when another collected page's own bytes (inline scripts included) name its path as a whole path, or when a script-only page loads a same-origin script file that was not collected, unless a fetched sitemap that lists other pages leaves it out (an inline script that builds the URL from pieces can still give a false orphan); entity-encoded hrefs are decoded and `index.html` equals its directory); `structured-data-truth` (a live JSON-LD block that does not parse fails; blocks inside HTML comments and empty placeholder blocks are ignored; parsing alone never passes); `naver-markup` (Open Graph, description, canonical, viewport, title repetition, CSS or JS blocked for Yeti); and, for runs that enable them, `fact-consistency` and `entity-identity`. Fact consistency compares name, address, phone and founding year across the selected pages. Values come only from Organization or LocalBusiness JSON-LD, `tel:` links (counted only on a page with no labelled or JSON-LD phone, so a mobile inquiry link never contradicts the landline) and explicitly labelled fields (`Phone:`, `Tel`, `Address:`, `Founded:` and Korean equivalents); prose, dates and numbers elsewhere are never read as facts, and a fax or registration number is not a phone. A national number written with spaces only (02 555 0142) is read in a label, and so are Korean nationwide representative numbers (15xx, 16xx or 18xx plus four digits). Addresses are compared after unifying street abbreviations, dropping postal codes and a trailing country, and treating a street address with or without city detail as the same. A page is a separate entity and is not compared only on structural evidence: JSON-LD `branchOf`, `parentOrganization` or a different `@id`; a branch-list URL path (`/branch/`, `/branches/`, `/locations/`, `/stores/`, `/์ง€์ /`); or the word branch, ์ง€์  or ์ง€์‚ฌ in its title or first heading together with an address of its own that differs from the main entity's. A title word alone does not hide a wrong phone. A reference value needs at least two pages and a unique majority; a page that disagrees, or whose JSON-LD disagrees with its own visible text, fails; a tie or a single page stays `unknown`. This is consistency between pages, not accuracy against an approved fact list. `entity-identity` (site unit) fails on conflicting names, Organization JSON-LD without `sameAs`, or no Organization JSON-LD on the home page while other pages have it. The `robots.txt` Sitemap line, og:image size, hreflang and JavaScript-only navigation are not scripted. Audit evidence from 0.1.2 or earlier has no hashed failure records and lacks the 0.1.3 discovery and fact observations, so report replay refuses it with an "older optbrew release" error; run the audit again with the current release and build a new packet. Every audit also writes `ledger.json`: one entry per queued or rejected URL with its request count. Index it with `source_ref:"optbrew:collector"`. Replay checks that the skipped list, `limit_reached`, `request_count` and `evaluated_count` equal the ledger, that each response entry matches a hashed response record (requests = redirect hops + 1), that each failed fetch matches a hashed failure record (`*.failure.json`, listed in `failures`; requests = answered redirect hops + at most one attempt that got no response), that a URL appears in only one entry, that a failed fetch or a request-limit skip belongs to a URL with provenance (selected, auxiliary, or linked from a collected page), that the total never exceeds the request limit and a limit is claimed only when the recorded requests use all of it, and that a selected page is skipped only for the request limit. Index every `*.failure.json` file with `source_ref:"optbrew:collector"`, as for `*.response.json`. The audit index also lists the modules that ran; every listed module must have its output in `modules.json`. All derived families above are computed from the collector evidence whether or not a module ran.
26
26
 
27
- The report opens with a Headline per profile. At least 80% measured coverage and a verdict on every core access and indexing check print the score with its coverage; below 80% the headline is `insufficient coverage`, and with no verdict on a core check it is `insufficient core checks`, with the measured-subset score and the missing-data bounds, and `json.headline[]` carries `status` (`sufficient`, `insufficient_coverage`, `insufficient_core`), `coverage_exact`, `headline_score` (null when withheld), `measured_subset_score`, `coverage` and `missing_bounds`.
27
+ **Composed once.** `core/report-compose.mjs` builds one `Composed` object from the checked report data, and `report.json`, `report.md` and `report.html` only render it: `json.composed = { headline, fixes, completeness, remaining, conditions, follow_ups }` comes before the evidence it was built from, and no score field appears before `fixes`. `headline` is the one-line conclusion `{ open, blocking, already_fixed, text, not_indexed }`; `not_indexed` is `{ count, pages, message_key, message_values, text }` when the run treated pages as deliberately not indexed (noindex and absent from the sitemaps it read), else null, and `report.md` prints it under the result line (`์ƒ‰์ธ ์ œ์™ธ:`) and `report.html` in the top box, so an owner sees a noindex that was hidden by mistake without opening the run conditions; with no open fix and any latest-phase headline other than `sufficient` it says nothing failed in what was checked but the check is incomplete and points to the completeness section (์–ผ๋งˆ๋‚˜ ํ™•์ธํ–ˆ๋‚˜), where the cause is shown, never that nothing is left to fix. `fixes` (each with its `change_paths`, `where` (the place to fix), `priority_label` and `status_label`) are the findings sorted open before resolved, then blocker first, then priority (P0 first, an unknown priority last), then the problem seen on the most pages. `completeness` has, per profile, `pass_rate_in_measured` (the score: the pass rate within what was measured), `coverage` and `coverage_without_cwv` (coverage if the three field-data checks were left out), all from the latest phase (the after phase when there is one), plus `before` and `after` (`headline`, `coverage`, `missing_bounds`, `readiness_status` of each phase), `difference` and `between_measured_subsets`. `remaining` lists what is still blank in the latest phase: `{ item, fills, runbook_ids }` for each unknown reason a runbook can fix and each start item the user did not answer (`answered_runbooks` in the packet lists those answered). `item` says what is missing and what it adds; the export file adds actual outcomes, not a score. A user who has a Google key (or Chrome) is not offered the runbook for getting it; the Google key item names the key-saving runbook for the probe's harness. `follow_ups` is the remaining-work list (the checked `follow_ups` rows, composed here so the HTML only formats them). `conditions.lines` is the one list of label and value pairs both formats print under the run conditions. `conditions` holds the start probe (of the latest phase's run context, the same phase as the blanks), the blocker counts `blockers: { before, after }` (`{ count, items, core_unknown }`, `after` null without an after phase), the checked model judgments, the lab Core Web Vitals (`lab_cwv` in the packet, reference only, never a score input) and unscored `notes`: the JavaScript note (Naver and AI crawlers may not run JavaScript) appears only when a page passed `render-content` after rendering. Report text is Korean (R64): every label, headline sentence and note in `report.md` and `report.html`; JSON keys and ids stay English. In the Markdown the order is: result line, ๋จผ์ € ๊ณ ์น  ๊ฒƒ (fixes), ์–ผ๋งˆ๋‚˜ ํ™•์ธํ–ˆ๋‚˜ (completeness), ์•„์ง ๋น„์–ด ์žˆ๋Š” ๊ณณ (still blank), ์‹คํ–‰ ์กฐ๊ฑด (run conditions), ๋‚จ์€ ์ผ (remaining work), ์‹ค์ œ ๊ฒฐ๊ณผ (actual outcomes), ๋ชจ๋ธ ํŒ๋‹จ (model judgments). Terms are fixed: ํฌ๋กฌ and ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, never Chrome or JavaScript spelled in Korean text. Finding messages, remediation text, remaining-work rows and cost notes are Korean too (R65): a finding keeps its English `message` (the text findings are grouped by, and the text in the golden files and replay) and carries `message_key` and `message_values`; the Korean sentence for a key is in `references/messages.ko.json`, and `composed.fixes[].text_ko` (`message`, and the chosen remediation's `mechanism`, `validation`, `effort`, `cost`, `location_hint`) and `composed.follow_ups[].text_ko` hold it for the renderers. A key with no entry, such as a model's finding, shows its own words. A remaining-work row that a host writes itself (a caller of `buildReport` outside the run path) has no key, so it must be written in the user's language: the report prints it as it is. Replay binds the key and values of a finding to the failed verdict that states the problem, as it does the English message.
28
28
 
29
- Both formats show four tables: score, remediation, actual outcomes, and remaining work. Score arithmetic comes from `score()` and `compare()`. Actual outcome pairs require the same native metric definition, filters, sample selection and panel, plus two adjacent complete 28-day windows. An absent or ambiguous value stays unknown. Markdown escapes pipes, HTML and line breaks in evidence and titles. `data_class:synthetic` labels fixture reports and cannot be presented as observed production performance.
29
+ **HTML report.** `core/report-html.mjs` formats the composed report as one self-contained page (inline CSS and SVG, no script, no outside file, a policy line that refuses any outside request, light and dark by `prefers-color-scheme`, readable at phone width). The top three sections are the fixes, the completeness and the blanks, in few words; every value from the site or the user is escaped. Each blank item opens its runbooks in `<details>` at the guidance level of the start answers as plain lists. A step has a small schematic drawing only where the runbook names the zone with a trailing tag such as `{ํ™”๋ฉด: ์ฃผ์†Œ์ฐฝ}` (zones: ์ฃผ์†Œ์ฐฝ, ํ™”๋ฉด ์œ„์ชฝ, ์™ผ์ชฝ ๋ฉ”๋‰ด, ํ™”๋ฉด ๊ฐ€์šด๋ฐ, ์ƒˆ ์ฐฝ, ํ„ฐ๋ฏธ๋„); a zone is never guessed from the words of a step (R66), and no shipped runbook carries a tag today. Every coverage the report shows is the floor to a tenth that the 80% threshold is judged on. Each profile card shows one verdict word, a meter and one plain sentence, with the long line folded; ๋‚จ์€ ์ผ (`follow_ups`) and the run conditions are folded sections. The audit writes the page as `report.html` beside the other two and prints its path in `reports.html`.
30
+
31
+ Other `report.json` fields: `findings` repeats `composed.fixes` for readers of earlier reports, `model_judgments` stays the checked judgment list, and `follow_ups` (called `remaining` before 0.2.0) holds the per-finding follow-up rows shown under Remaining work. `composed.remaining` is a different list: the blanks.
32
+
33
+ The Completeness section opens with a Headline per profile. At least 80% measured coverage and a verdict on every core access and indexing check print the score with its coverage; below 80% the headline is `insufficient coverage`, and with no verdict on a core check it is `insufficient core checks`, with the measured-subset score and the missing-data bounds, and a phase that was not audited (its `RunContext.audited` is not true) shows `not audited` instead of a score when the score would otherwise print, and says so beside any other status (`audited: false`); each phase headline in `composed.completeness[]` carries `status` (`sufficient`, `unaudited`, `insufficient_coverage`, `insufficient_core`), `coverage_exact`, `headline_score` (null when withheld), `measured_subset_score`, `coverage` and `missing_bounds`. One rule shows every coverage in the three formats (`baseline.scores[]` and `after.scores[]` are the replayed ScoreResult objects with their own one-decimal rounding; the coverage the report shows is `composed.completeness[].coverage`): the floor to a tenth of the exact value, the value the 80% threshold reads. `coverage_exact` keeps the exact value, and `completeness[].coverage_without_cwv` follows the same rule. The conditions list and the Model judgments section say how many units the model declared not applicable, for each family (`composed.conditions.model_not_applicable`), apart from the coverage those units leave out, and each profile card of the HTML says how many units that is. Under Model judgments, `composed.conditions.question_coverage` lists each question of the fixed panel with the pages that answer it.
34
+
35
+ Both formats show the same tables (`json.tables`): fixes (`remediation`), completeness (`score`), actual outcomes, remaining work and model judgments. Score arithmetic comes from `score()` and `compare()`. Actual outcome pairs require the same native metric definition, filters, sample selection and panel, plus two adjacent complete 28-day windows. An absent or ambiguous value stays unknown. Markdown escapes pipes, HTML and line breaks in evidence and titles. `data_class:synthetic` labels fixture reports and cannot be presented as observed production performance.
36
+
37
+ **Model judgments.** The audit stores the model's work list as a `judge-queue` evidence file, listed with its hash in the audit index section `judge_queue` (candidate text spans per page and per content family; index the file as `kind:"judge-queue"`). A `host_model` observation has `source_ref:"optbrew:model-judgment"`, cites the raw evidence of the page its unit names, and, with a state other than `unknown`, carries `evidence_span: [{ evidence_sha256, start, end }]`: one UTF-8 byte range (end excluded) per cited span, each starting and ending on character boundaries. Report replay checks that the evidence is the audit raw entry of that page, that each range has that entry's hash, lies inside the bytes and is exactly a candidate of the stored queue, and rejects a tampered span or queue. Replay also recomputes the candidate text runs from the raw bytes, so a forged queue cannot widen them, and reads the queue only from evidence of kind `judge-queue`. A model's `not_applicable` carries one of the family's registry conditions in `applicability_decision` (its evidence is the verdict's own page evidence) and cites spans like any other verdict; replay refuses a condition the family does not have and a span the queue did not offer. An answer-clarity verdict other than unknown records the panel question it answers in `measurement.question_id`, and a pass or partial one may list the other questions the page answers in `measurement.also_question_ids` (other, distinct panel questions; replay checks them). A failed model verdict records one `problem_messages` entry, the catalog key `model-fix.<family>[.<basis>]` with the cited text as `quote`; replay recomputes it from the family, the basis and the cited spans, and the report words the problem, the fix method, the effort and the check from the catalog (the model's own reason stays in the verdict as evidence). Allowed pairs: `code` with `optbrew:collector`, `host_model` with `optbrew:model-judgment`, and `code` with `optbrew:judgment-derived`. A content family (per-page, no code check) accepts only the model pair; a code-judged family refuses any host_model observation, and beside an audit snapshot accepts only the code pair, which is re-derived. Two units are exceptions. `entity-identity|site` may carry the model pair when code gave no verdict for it (the home page has no Organization JSON-LD); replay then reads the home page's raw entry and refuses a model verdict next to a code verdict. `question-coverage|site` is the derived pair: the number of fixed-panel questions that an audited page answers (a pass or partial answer-clarity verdict naming the question in `measurement.question_id` or `measurement.also_question_ids`, which replay checks against the panel, counted once per question) over the panel length, with the list in `measurement`; replay computes it again from the answer-clarity verdicts and the panel and refuses any other figure. Observations from other sources stay what they were: unverified inputs of a packet without an audit. A checked judgment is listed in `model_judgments` and in a "Model judgments" section labelled ๊ทผ๊ฑฐ ํ™•์ธ๋จ, ํŒ์ •์€ ๋ชจ๋ธ: the evidence is verified, the verdict is the model's.
38
+
39
+ **Audited phases.** Each phase's `RunContext` carries `audited: true` when the phase was audited (written with the context at run start, so it is hashed run evidence). Replay refuses a packet whose audit snapshot for a phase exists exactly when its context does not say `audited`. A phase without an audit accepts only outside or synthetic inputs: the collector and model sources are refused there, no finding can reach `verified_local` or `verified_production`, and its score readiness is never `measured` (it reads `unverified`). `verified_*` needs an after observation that is `code` with `optbrew:collector`, re-derived against the after snapshot.
40
+
41
+ Every `ChangeRecord` carries `analysis: { tools, queries, self_analysis }`: the tools and queries used to reach the change, and whether the agent analysed the page itself.
@@ -1,6 +1,6 @@
1
1
  # Situation routing
2
2
 
3
- ํ•„์š”ํ•œ ๋ถ„๊ธฐ์˜ GUIDE๋งŒ ์—ฐ๋‹ค. ๋ชจ๋“  ๋ชจ๋“ˆ ์ถœ๋ ฅ์€ ๊ด€์ฐฐ ํ›„๋ณด์ด๋ฉฐ ํ•œ URLยท๋ฌธ์ œยท๊ฒ€์‚ฌ๋Š” ํ•œ ๋ฒˆ๋งŒ ์ฑ„์ ํ•œ๋‹ค. ๋ฌด๋ฃŒ ๊ฒฝ๋กœ๋Š” ํ—ˆ์šฉ๋œ ๊ณต๊ฐœ HTTP/HTML๊ณผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜ธ์ŠคํŠธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์›๋ณธ HTML, ๋ Œ๋”, ์†Œ์œ ์ž ํŒจ๋„๊ณผ AI ์ œ๊ณต์ž ์‘๋‹ต์˜ ์ถœ์ฒ˜๋ฅผ ๊ฐ๊ฐ ๊ธฐ๋กํ•œ๋‹ค.
3
+ ์ด ํ‘œ๋Š” SKILL.md 10๋‹จ๊ณ„์—์„œ ์ˆ˜์ •์•ˆ์˜ ๊ทผ๊ฑฐ ๊ฐ€์ด๋“œ๋ฅผ ๊ณ ๋ฅผ ๋•Œ ์“ด๋‹ค. ์ˆ˜์ง‘, ํŒ์ •, ์ฑ„์ ์€ `run.mjs`๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋ฏ€๋กœ, ํ‘œ์˜ ๋ชจ๋“ˆ์„ ๊ฐ์‚ฌ ๋‹จ๊ณ„์—์„œ ๋”ฐ๋กœ ๋Œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ํ•„์š”ํ•œ ๋ถ„๊ธฐ์˜ GUIDE๋งŒ ์—ฐ๋‹ค. ๋ชจ๋“  ๋ชจ๋“ˆ ์ถœ๋ ฅ์€ ๊ด€์ฐฐ ํ›„๋ณด์ด๋ฉฐ ํ•œ URLยท๋ฌธ์ œยท๊ฒ€์‚ฌ๋Š” ํ•œ ๋ฒˆ๋งŒ ์ฑ„์ ํ•œ๋‹ค. ๋ฌด๋ฃŒ ๊ฒฝ๋กœ๋Š” ํ—ˆ์šฉ๋œ ๊ณต๊ฐœ HTTP/HTML๊ณผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜ธ์ŠคํŠธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์›๋ณธ HTML, ๋ Œ๋”, ์†Œ์œ ์ž ํŒจ๋„๊ณผ AI ์ œ๊ณต์ž ์‘๋‹ต์˜ ์ถœ์ฒ˜๋ฅผ ๊ฐ๊ฐ ๊ธฐ๋กํ•œ๋‹ค.
4
4
 
5
5
  | ์ƒํ™ฉ | ์ฃผ๋ ฅ | ๋ณด์™„ยท์ž…๋ ฅ | ์‚ฐ์ถœ๋ฌผ |
6
6
  |---|---|---|---|
@@ -12,4 +12,4 @@
12
12
  | AI ์ธ์šฉยท๊ฒฝ์Ÿ ๋น„๊ต | [SE Ranking](../modules/seranking-seo/skills/seo-ai-search-share-of-voice/GUIDE.md) | ์Šน์ธ๋œ API ๋˜๋Š” ๋‚ ์งœ๊ฐ€ ์žˆ๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ, Magnus ์งˆ๋ฌธ ํ”„๋กœํ† ์ฝœ | ์—”์ง„๋ณ„ ์ธ์šฉ ์‹ค์ธก; ๋ฌด๋ฃŒ ๊ฐ์‚ฌ์˜ ํ•„์ˆ˜ ์กฐ๊ฑด ์•„๋‹˜ |
13
13
  | ์œ ์ž…ยท์ „ํ™˜ ๋น„๊ต | [mblode monitoring](../modules/mblode-seo/references/monitoring.md), [analytics](../modules/marketing-search/skills/analytics/GUIDE.md) | ๊ฐ™์€ ์†Œ์œ  ์†์„ฑยทํ•„ํ„ฐยท์™„๊ฒฐ๋œ 28์ผ ์ฐฝ | ์‹ค์ œ ์„ฑ๊ณผ์™€ ๋น„๊ต ๊ฐ€๋Šฅ์„ฑ |
14
14
 
15
- ํ˜ธ์ŠคํŠธ ๋„๊ตฌ์˜ ๊ฒฝ๊ณ„ยท๋น„์šฉ ๊ฐ•์ œ๊ฐ€ ํ™•์ธ๋˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ง์ ‘ Anthropic v0.1.0์€ [api.md](api.md)์˜ ํ…์ŠคํŠธ ์ „์šฉ Messages ํ˜•ํƒœ์™€ ์ •ํ™•ํ•œ ๋ชจ๋ธ ID ๋„ค ๊ฐœ๋งŒ ์ง€์›ํ•œ๋‹ค. ๋‹ค๋ฅธ API์™€ SE Ranking ์‹คํ–‰์€ ๊ฐ์ž์˜ ์Šน์ธยท์ƒํ•œยท๋Šฅ๋ ฅ ๊ทผ๊ฑฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํ˜ธ์ŠคํŠธ ์ •์ฑ…๋งŒ ๋น„์šฉ์„ ๊ฐ•์ œํ•˜๋ฉด ๊ทธ ํ•œ๊ณ„๋ฅผ ๋ณด๊ณ ํ•œ๋‹ค.
15
+ ํ˜ธ์ŠคํŠธ ๋„๊ตฌ์˜ ๊ฒฝ๊ณ„ยท๋น„์šฉ ๊ฐ•์ œ๊ฐ€ ํ™•์ธ๋˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ง์ ‘ Anthropic์€ [api.md](api.md)์˜ ํ…์ŠคํŠธ ์ „์šฉ Messages ํ˜•ํƒœ์™€ ์ •ํ™•ํ•œ ๋ชจ๋ธ ID ๋„ค ๊ฐœ๋งŒ ์ง€์›ํ•œ๋‹ค. ๋‹ค๋ฅธ API์™€ SE Ranking ์‹คํ–‰์€ ๊ฐ์ž์˜ ์Šน์ธยท์ƒํ•œยท๋Šฅ๋ ฅ ๊ทผ๊ฑฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํ˜ธ์ŠคํŠธ ์ •์ฑ…๋งŒ ๋น„์šฉ์„ ๊ฐ•์ œํ•˜๋ฉด ๊ทธ ํ•œ๊ณ„๋ฅผ ๋ณด๊ณ ํ•œ๋‹ค.
@@ -0,0 +1,34 @@
1
+ ---
2
+ checked: 2026-10-16
3
+ source: https://platform.claude.com/docs/en/get-api-key
4
+ harness: any
5
+ ---
6
+
7
+ # Anthropic API ํ‚ค ๋งŒ๋“ค๊ธฐ (์„ ํƒ, ๋‚ด ๊ณ„์ •์— ๋น„์šฉ ๋ฐœ์ƒ)
8
+
9
+ ## beginner
10
+
11
+ ์™œ ํ•„์š”ํ•œ๊ฐ€: ๊ธฐ๋ณธ ๊ฐ์‚ฌ๋Š” ์ด ํ‚ค ์—†์ด ๋๊นŒ์ง€ ๊ฐ‘๋‹ˆ๋‹ค. ์ด ํ‚ค๋Š” optbrew๊ฐ€ Claude API๋ฅผ ์ง์ ‘ ๋ถˆ๋Ÿฌ ์“ฐ๋Š” ์„ ํƒ ๊ธฐ๋Šฅ์šฉ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ ๋น„์šฉ์€ ๋‚ด Anthropic ๊ณ„์ •์— ์ฒญ๊ตฌ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ๋…(Claude ProยทMax, Claude Code ์š”๊ธˆ์ œ)๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ๊ฒฐ์ œ์ž…๋‹ˆ๋‹ค. ๋น„์šฉ์ด ๋ถ€๋‹ด๋˜๋ฉด ์ด ๋Ÿฐ๋ถ ์ „์ฒด๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
12
+
13
+ 1. ๋ธŒ๋ผ์šฐ์ €์—์„œ platform.claude.com์„ ์—ด๊ณ  ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ •์ด ์—†์œผ๋ฉด ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณ„์ • ์ƒ์„ฑ๊ณผ ๊ฒฐ์ œ ์„ค์ •์€ ๋‚ด๊ฐ€ ์ง์ ‘ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
14
+ 2. ์ฃผ์†Œ์ฐฝ์— `platform.claude.com/settings/keys`๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Enter๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. **API keys** ํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค.
15
+ 3. **Create key** ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑ์ด๋ฉด ๋‚ด ์—ญํ• ๋กœ๋Š” ํ‚ค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์กฐ์ง ๊ด€๋ฆฌ์ž์—๊ฒŒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
16
+ 4. ํ‚ค ์ด๋ฆ„(์˜ˆ: `optbrew`)์„ ์ ์Šต๋‹ˆ๋‹ค.
17
+ 5. ๋งŒ๋ฃŒ ์‹œ๊ธฐ(expiration)๋ฅผ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. ์งง๊ฒŒ ์“ธ ํ‚ค๋ฉด ๊ฐ€๊นŒ์šด ๋‚ ์งœ๋ฅผ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. (ํ™”๋ฉด ํ™•์ธ ํ•„์š”: ์„ ํƒ์ง€)
18
+ 6. **Linked account**๊ฐ€ ๋‚˜ ์ž์‹ ์œผ๋กœ ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
19
+ 7. ๋งŒ๋“ค๊ธฐ๋ฅผ ํ™•์ •ํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. (ํ™”๋ฉด ํ™•์ธ ํ•„์š”: ๋ฒ„ํŠผ ์ด๋ฆ„)
20
+ 8. ํ‚ค ์ „์ฒด๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ ์•„์ด์ฝ˜์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฐฝ์„ ๋‹ซ์œผ๋ฉด ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
21
+ 9. ํ‚ค๋ฅผ ๋Œ€ํ™”์ฐฝ, ๋ฉ”๋ชจ, ๋ฌธ์„œ์— ๋ถ™์—ฌ ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
22
+ 10. Windows์—์„œ ์ปดํ“จํ„ฐ์— ๋„ฃ์œผ๋ ค๋ฉด ์‹œ์ž‘ ๋ฉ”๋‰ด์—์„œ `ํ™˜๊ฒฝ ๋ณ€์ˆ˜`๋ฅผ ๊ฒ€์ƒ‰ํ•ด **๊ณ„์ •์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŽธ์ง‘**์„ ์—ฝ๋‹ˆ๋‹ค. (ํ™”๋ฉด ํ™•์ธ ํ•„์š”: ํ•œ๊ธ€ ์ด๋ฆ„)
23
+ 11. **์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ**(New)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
24
+ 12. ๋ณ€์ˆ˜ ์ด๋ฆ„์— `ANTHROPIC_API_KEY`๋ฅผ ์ ์Šต๋‹ˆ๋‹ค.
25
+ 13. ๋ณ€์ˆ˜ ๊ฐ’ ์นธ์— ๋ณต์‚ฌํ•œ ํ‚ค๋ฅผ ๋ถ™์—ฌ ๋„ฃ๊ณ  **ํ™•์ธ**์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ์—ด๋ ค ์žˆ๋Š” ํ„ฐ๋ฏธ๋„๊ณผ ์—์ด์ „ํŠธ๋ฅผ ๋ชจ๋‘ ๋‹ซ์•˜๋‹ค ๋‹ค์‹œ ์ผญ๋‹ˆ๋‹ค.
26
+ 14. macOSยทLinux๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ์“ฐ๋Š” ์…ธ ์„ค์ • ํŒŒ์ผ์— `export ANTHROPIC_API_KEY=ํ‚ค` ํ•œ ์ค„์„ ๋„ฃ๋Š” ๋ฐฉ์‹์ด ์ผ๋ฐ˜์ ์ด์ง€๋งŒ, ํŒŒ์ผ ์œ„์น˜๊ฐ€ ์…ธ๋งˆ๋‹ค ๋‹ค๋ฅด๋ฏ€๋กœ ์—์ด์ „ํŠธ์—๊ฒŒ ๋‚ด ์…ธ์— ๋งž๋Š” ๋ฐฉ๋ฒ•์„ ๋ฌป์Šต๋‹ˆ๋‹ค. ํ‚ค ๊ฐ’์€ ๋งํ•˜์ง€ ์•Š๊ณ  "๋ถ™์—ฌ ๋„ฃ์„ ์นธ์„ ์•Œ๋ ค ๋‹ฌ๋ผ"๊ณ ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
27
+
28
+ ํ‚ค ์‚ฌ์šฉ ํ•œ๋„์™€ ์š”๊ธˆ์€ Anthropic Console์˜ ๊ฒฐ์ œ ํ™”๋ฉด์—์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ ์ƒˆ์–ด ๋‚˜๊ฐ”๋‹ค๊ณ  ์˜์‹ฌ๋˜๋ฉด **API keys** ๋ชฉ๋ก์—์„œ ๊ทธ ํ‚ค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. (ํ™”๋ฉด ํ™•์ธ ํ•„์š”: ์‚ญ์ œ ๋ฉ”๋‰ด ์œ„์น˜)
29
+
30
+ ## brief
31
+
32
+ - platform.claude.com/settings/keys โ†’ **Create key** โ†’ ์ด๋ฆ„ยท๋งŒ๋ฃŒยทLinked account๋ฅผ ์ •ํ•˜๊ณ  ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ‚ค๋Š” ์ƒ์„ฑ ๋•Œ ํ•œ ๋ฒˆ๋งŒ ๋ณด์ž…๋‹ˆ๋‹ค.
33
+ - ํ™˜๊ฒฝ ๋ณ€์ˆ˜ `ANTHROPIC_API_KEY`์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ํ‚ค๋ฅผ ๋Œ€ํ™”์ฐฝ์— ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
34
+ - ํ˜ธ์ถœ ๋น„์šฉ์€ ๋‚ด Anthropic ๊ณ„์ •์— ์ฒญ๊ตฌ๋˜๋ฉฐ Claude ๊ตฌ๋…๊ณผ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ํ•„์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
@@ -0,0 +1,56 @@
1
+ ---
2
+ checked: 2026-10-17
3
+ source: https://support.google.com/chrome/answer/95346
4
+ harness: local
5
+ ---
6
+
7
+ # ํฌ๋กฌ ์„ค์น˜ํ•˜๊ธฐ
8
+
9
+ ## beginner
10
+
11
+ ์™œ ํ•„์š”ํ•œ๊ฐ€: optbrew๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ทธ๋ฆฐ ๋’ค์˜ ํ™”๋ฉด์„ ํ™•์ธํ•˜๋ ค๊ณ  ํฌ๋กฌ์„ ์ž ๊น ๋„์›๋‹ˆ๋‹ค. ํฌ๋กฌ์ด ์—†์œผ๋ฉด ์ด ํ™•์ธ๋งŒ ๋นˆ์นธ์œผ๋กœ ๋‚จ๊ณ  ๋‚˜๋จธ์ง€ ๊ฐ์‚ฌ๋Š” ๊ทธ๋Œ€๋กœ ๋ฉ๋‹ˆ๋‹ค. Microsoft Edge๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์“ฐ์ด๋ฏ€๋กœ ํฌ๋กฌ์„ ์ƒˆ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ํŒŒ์ผ์€ Google ๊ณต์‹ ์ฃผ์†Œ์—์„œ๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค.
12
+
13
+ 1. ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— `google.com/chrome`์„ ์ž…๋ ฅํ•˜๊ณ  Enter๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
14
+ 2. ์—ด๋ฆฐ ์‚ฌ์ดํŠธ์˜ ์ฃผ์†Œ์ฐฝ์— `google.com`์ด ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ด๋ฆ„์ด๋ฉด ๋‹ซ๊ณ  1๋ฒˆ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ•ฉ๋‹ˆ๋‹ค.
15
+ 3. **Chrome ๋‹ค์šด๋กœ๋“œ**(Download Chrome) ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
16
+ 4. ๋‚ด ์šด์˜์ฒด์ œ์— ๋งž๋Š” ์•„๋ž˜ ๋ชฉ๋ก ํ•˜๋‚˜๋งŒ ๋”ฐ๋ผ ํ•ฉ๋‹ˆ๋‹ค.
17
+
18
+ Windows:
19
+
20
+ 1. ๋ฐ›์€ ์„ค์น˜ ํŒŒ์ผ์„ ๋‘ ๋ฒˆ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
21
+ 2. "์ด ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"๋ผ๊ณ  ๋ฌผ์œผ๋ฉด **์‹คํ–‰**(Run)์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
22
+ 3. ์‚ฌ์šฉ์ž ๊ณ„์ • ์ปจํŠธ๋กค ์ฐฝ์ด "โ€ฆ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์‹œ๊ฒ โ€ฆ?"๋ผ๊ณ  ๋ฌผ์œผ๋ฉด, ์ฐฝ์— ๋ณด์ด๋Š” ์ด๋ฆ„์ด Google Chrome์ผ ๋•Œ๋งŒ **์˜ˆ**(Yes)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
23
+ 4. ์„ค์น˜๊ฐ€ ๋๋‚˜๋ฉด ํฌ๋กฌ ์ฐฝ์ด ์ €์ ˆ๋กœ ์—ด๋ฆฝ๋‹ˆ๋‹ค. Windows 10 ์ด์ƒ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.
24
+
25
+ macOS:
26
+
27
+ 1. ๋ฐ›์€ `googlechrome.dmg`๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
28
+ 2. ๋‚˜ํƒ€๋‚œ ์ฐฝ์—์„œ Chrome ์•„์ด์ฝ˜์„ **Applications** ํด๋”๋กœ ๋Œ์–ด๋‹ค ๋†“์Šต๋‹ˆ๋‹ค.
29
+ 3. ๊ด€๋ฆฌ์ž ์•”ํ˜ธ๋ฅผ ๋ฌผ์œผ๋ฉด ์ง์ ‘ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
30
+
31
+ Linux:
32
+
33
+ 1. ๋‚ด ๋ฐฐํฌํŒ๊ณผ CPU์— ๋งž๋Š” `.deb`(DebianยทUbuntu) ๋˜๋Š” `.rpm`(FedoraยทopenSUSE) ํŒŒ์ผ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
34
+ 2. ๋ฐ›์€ ํŒŒ์ผ์„ ์—ด๊ณ  **์„ค์น˜**(Install)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
35
+ 3. ๊ด€๋ฆฌ์ž ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
36
+
37
+ ์„ค์น˜๋ฅผ ๋งˆ์นœ ๋’ค ์ด์–ด์„œ ํ•ฉ๋‹ˆ๋‹ค.
38
+
39
+ 5. ์—์ด์ „ํŠธ์—๊ฒŒ "ํฌ๋กฌ ์„ค์น˜ํ–ˆ์–ด"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๊ฐ€ ํ‘œ์ค€ ์„ค์น˜ ์œ„์น˜์—์„œ ํฌ๋กฌ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
40
+ 6. ์—์ด์ „ํŠธ๊ฐ€ ํฌ๋กฌ์„ ์ฐพ์•˜๋‹ค๊ณ  ํ•˜๋ฉด ๋์ž…๋‹ˆ๋‹ค.
41
+ 7. ์—์ด์ „ํŠธ๊ฐ€ ํฌ๋กฌ์„ ๋ชป ์ฐพ์•˜๋‹ค๊ณ  ํ•˜๋ฉด, ํฌ๋กฌ์„ ํ‘œ์ค€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ๊ณณ์— ์„ค์น˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ํฌ๋กฌ ์‹คํ–‰ ํŒŒ์ผ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ์—์ด์ „ํŠธ์—๊ฒŒ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค. Windows์˜ ํ‘œ์ค€ ๊ฒฝ๋กœ๋Š” `C:\Program Files\Google\Chrome\Application\chrome.exe`, macOS๋Š” `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`, Linux๋Š” `/opt/google/chrome/chrome`์ž…๋‹ˆ๋‹ค.
42
+ 8. ์—์ด์ „ํŠธ๊ฐ€ ๊ทธ ๊ฒฝ๋กœ๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ `OPTBREW_CHROME`์— ๋„ฃ๊ณ  ๊ฐ์‚ฌ๋ฅผ ์ด์–ด ๊ฐ‘๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๊ฐ€ ํ•˜์ง€ ๋ชปํ•˜๋ฉด ์•„๋ž˜ 9๋ฒˆ๋ถ€ํ„ฐ ์ง์ ‘ ํ•ฉ๋‹ˆ๋‹ค.
43
+ 9. Windows์—์„œ ์ง์ ‘ ํ•˜๋ ค๋ฉด ํ‚ค๋ณด๋“œ์—์„œ Windows ํ‚ค์™€ R์„ ํ•จ๊ป˜ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ์—ด๋ฆฐ ์นธ์— `rundll32 sysdm.cpl,EditEnvironmentVariables`๋ฅผ ์ ๊ณ  Enter๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฐฝ์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค.
44
+ 10. ์œ„์ชฝ ์‚ฌ์šฉ์ž ๋ณ€์ˆ˜ ์นธ ์•„๋ž˜์˜ **์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ**(New)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
45
+ 11. ๋ณ€์ˆ˜ ์ด๋ฆ„์— `OPTBREW_CHROME`์„ ์ ์Šต๋‹ˆ๋‹ค.
46
+ 12. ๋ณ€์ˆ˜ ๊ฐ’์— ํฌ๋กฌ ์‹คํ–‰ ํŒŒ์ผ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ์ ๊ณ  **ํ™•์ธ**์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ์—ด๋ ค ์žˆ๋Š” ํ„ฐ๋ฏธ๋„๊ณผ ์—์ด์ „ํŠธ๋ฅผ ๋‹ซ์•˜๋‹ค ๋‹ค์‹œ ์ผญ๋‹ˆ๋‹ค.
47
+ 13. macOSยทLinux์—์„œ ์ง์ ‘ ํ•˜๋ ค๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ ์“ฐ๋Š” ์…ธ ์„ค์ • ํŒŒ์ผ์— `export OPTBREW_CHROME="ํฌ๋กฌ ์‹คํ–‰ ํŒŒ์ผ์˜ ์ „์ฒด ๊ฒฝ๋กœ"` ํ•œ ์ค„์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์œ„์น˜๊ฐ€ ์…ธ๋งˆ๋‹ค ๋‹ค๋ฅด๋ฏ€๋กœ ์—์ด์ „ํŠธ์—๊ฒŒ ๋‚ด ์…ธ์— ๋งž๋Š” ํŒŒ์ผ์„ ๋ฌป์Šต๋‹ˆ๋‹ค.
48
+
49
+ ์„ค์น˜ ํŒŒ์ผ์„ ๋ฐ›์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํšŒ์‚ฌ ์ •์ฑ…์œผ๋กœ ์„ค์น˜๊ฐ€ ๋ง‰ํžŒ ์ปดํ“จํ„ฐ์—์„œ๋Š” ์ด ๋Ÿฐ๋ถ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ๋Š” ๋ Œ๋” ํ™•์ธ ํ•ญ๋ชฉ๋งŒ ๋นˆ์นธ์œผ๋กœ ๋‘๊ณ  ๋๊นŒ์ง€ ๊ฐ‘๋‹ˆ๋‹ค.
50
+
51
+ ## brief
52
+
53
+ - `google.com/chrome`์—์„œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. Windows๋Š” ์„ค์น˜ ํŒŒ์ผ ์‹คํ–‰, macOS๋Š” `googlechrome.dmg`๋ฅผ Applications๋กœ ๋Œ๊ธฐ, Linux๋Š” `.deb`/`.rpm` ์„ค์น˜์ž…๋‹ˆ๋‹ค.
54
+ - ํ‘œ์ค€ ์„ค์น˜ ์œ„์น˜์™€ `PATH`์˜ `chrome`ยท`google-chrome`ยท`chromium`ยท`msedge`๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์Šต๋‹ˆ๋‹ค. Edge๋„ ๋ฉ๋‹ˆ๋‹ค.
55
+ - ๋‹ค๋ฅธ ์œ„์น˜์— ์„ค์น˜ํ–ˆ๋‹ค๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ `OPTBREW_CHROME`์— ์‹คํ–‰ ํŒŒ์ผ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ๋‘ก๋‹ˆ๋‹ค.
56
+ - ํด๋ผ์šฐ๋“œ ํ•˜๋„ค์Šค์—์„œ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ™•์ธ ์•ˆ ๋จ์ž…๋‹ˆ๋‹ค. ์ด ๋Ÿฐ๋ถ์€ ๋‚ด ์ปดํ“จํ„ฐ์šฉ์ž…๋‹ˆ๋‹ค.
@@ -0,0 +1,38 @@
1
+ ---
2
+ checked: 2026-10-16
3
+ source: https://github.com/GoogleChrome/web-vitals https://web.dev/articles/vitals-measurement-getting-started
4
+ harness: any
5
+ ---
6
+
7
+ # ์‚ฌ์ดํŠธ ์•ˆ์—์„œ ๋ฐฉ๋ฌธ์ž ์ธก์ •๊ฐ’ ๋ชจ์œผ๊ธฐ (web-vitals)
8
+
9
+ ## beginner
10
+
11
+ ์™œ ํ•„์š”ํ•œ๊ฐ€: ๋ฐฉ๋ฌธ์ž ์ˆ˜๊ฐ€ ์ ์€ ์‚ฌ์ดํŠธ๋Š” Google CrUX์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด LCPยทINPยทCLS ์‹ค์ธก๊ฐ’์ด ๋นˆ์นธ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ์‚ฌ์ดํŠธ ์•ˆ์— ์ž‘์€ ์Šคํฌ๋ฆฝํŠธ(web-vitals)๋ฅผ ๋„ฃ์–ด ๋ฐฉ๋ฌธ์ž์˜ ์‹ค์ œ ์ธก์ •๊ฐ’์„ ์ง์ ‘ ๋ชจ์๋‹ˆ๋‹ค. ์ด ๋Ÿฐ๋ถ์€ ์‚ฌ์ดํŠธ ์†Œ์Šค๋ฅผ ์ง์ ‘ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์šฉ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ๋ฅผ ๊ณ ์น  ์ˆ˜ ์—†์œผ๋ฉด ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ฐ’์ด ์Œ“์ด๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ ์ด๋ฒˆ ๊ฐ์‚ฌ์˜ ๋นˆ์นธ์€ ์ด ์ž‘์—…์œผ๋กœ ๋ฐ”๋กœ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
12
+
13
+ 1. ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณตํ†ต์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ํŒŒ์ผ(๋ ˆ์ด์•„์›ƒยทํ…œํ”Œ๋ฆฟยทํ‘ธํ„ฐ)์„ ์—ฝ๋‹ˆ๋‹ค. ์–ด๋–ค ํŒŒ์ผ์ธ์ง€ ๋ชจ๋ฅด๋ฉด ์—์ด์ „ํŠธ์—๊ฒŒ ๋กœ์ปฌ ์†Œ์Šค์—์„œ ์ฐพ์•„ ๋‹ฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
14
+ 2. `</body>` ๋‹ซ๋Š” ํƒœ๊ทธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
15
+ 3. `</body>` ๋ฐ”๋กœ ์œ„์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ๋ฐฉ๋ฌธ์ž์˜ ์ธก์ •๊ฐ’์ด ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์— ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.
16
+
17
+ ```html
18
+ <script type="module">
19
+ import {onCLS, onINP, onLCP} from 'https://unpkg.com/web-vitals@5?module';
20
+ onCLS(console.log);
21
+ onINP(console.log);
22
+ onLCP(console.log);
23
+ </script>
24
+ ```
25
+
26
+ 4. ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ์‚ฌ์ดํŠธ์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
27
+ 5. ์‚ฌ์ดํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด๊ณ  F12๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. **Console**(์ฝ˜์†”) ํƒญ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
28
+ 6. ํŽ˜์ด์ง€์„ ํ•œ ๋ฒˆ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํƒญ์œผ๋กœ ๊ฐ”๋‹ค ๋Œ์•„์˜ค๋ฉด ์ธก์ •๊ฐ’ ์ค„์ด ์ฐํž™๋‹ˆ๋‹ค. LCPยทINPยทCLS ์ด๋ฆ„์ด ๋ณด์ด๋ฉด ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ฐ’์€ ํด๋ฆญ, ํƒญ ์ „ํ™˜, ํŽ˜์ด์ง€ ์ดํƒˆ ๋•Œ ์ฒ˜์Œ ๋‚˜์˜ต๋‹ˆ๋‹ค.
29
+ 7. ์ธก์ •๊ฐ’์„ ๋ชจ์œผ๋ ค๋ฉด ๋ฐ›๋Š” ๊ณณ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์„ ๋„๊ตฌ๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด web-vitals ์„ค๋ช…์„œ(GitHub ์ €์žฅ์†Œ์˜ README)์— ์žˆ๋Š” ๋ถ„์„ ๋„๊ตฌ ์ „์†ก ์˜ˆ์‹œ๋Œ€๋กœ `console.log` ์ž๋ฆฌ์— ์ „์†ก ์ฝ”๋“œ๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋ถ„์„ ๋„๊ตฌ๊ฐ€ ์—†์œผ๋ฉด Google Analytics๊ฐ€ ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค.
30
+ 8. ์•ˆ์ •์„ฑ์„ ์›ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” CDN ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์“ฐ์ง€ ๋ง๊ณ  ๋‚ด ์‚ฌ์ดํŠธ ์„œ๋ฒ„์— ํŒŒ์ผ์„ ๋‚ด๋ ค๋ฐ›์•„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. README๋„ ๊ฐ™์€ ๊ถŒ๊ณ ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
31
+ 9. ์ด ์ฝ”๋“œ๋ฅผ ๋„ฃ์€ ์‚ฌ์‹ค์€ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ์— ๋งž๋Š”์ง€ ์‚ฌ์ดํŠธ ์šด์˜์ž์™€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
32
+ 10. ๋ฉฐ์น  ๋’ค ๋ถ„์„ ๋„๊ตฌ์—์„œ ๋ฐฉ๋ฌธ์ž ์ธก์ •๊ฐ’์ด ์Œ“์ด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
33
+
34
+ ## brief
35
+
36
+ - ๋ชจ๋“  ํŽ˜์ด์ง€์— `<script type="module">import {onCLS, onINP, onLCP} from 'https://unpkg.com/web-vitals@5?module';`์™€ `onCLS(...)`ยท`onINP(...)`ยท`onLCP(...)` ํ˜ธ์ถœ์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.
37
+ - ์ฝœ๋ฐฑ์—์„œ `navigator.sendBeacon`์œผ๋กœ ๋‚ด ์ˆ˜์ง‘ ์ฃผ์†Œ๋‚˜ ๋ถ„์„ ๋„๊ตฌ(์˜ˆ: Google Analytics)์— ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ฐ’์€ ํด๋ฆญยทํƒญ ์ „ํ™˜ยทํŽ˜์ด์ง€ ์ดํƒˆ ๋•Œ ๋‚˜์˜ต๋‹ˆ๋‹ค.
38
+ - ๊ฐ€๋Šฅํ•˜๋ฉด CDN ๋Œ€์‹  ํŒŒ์ผ์„ ๋‚ด ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธ์ž ์ˆ˜๊ฐ€ ์ ์€ ์‚ฌ์ดํŠธ๋Š” ๊ฐ’์ด ์Œ“์ด๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
@@ -0,0 +1,51 @@
1
+ ---
2
+ checked: 2026-10-18
3
+ source: https://docs.cloud.google.com/docs/authentication/api-keys https://docs.cloud.google.com/apis/docs/getting-started https://docs.cloud.google.com/resource-manager/docs/creating-managing-projects https://developer.chrome.com/docs/crux/api https://developers.google.com/speed/docs/insights/v5/get-started
4
+ harness: any
5
+ ---
6
+
7
+ # Google API ํ‚ค ๋ฐœ๊ธ‰ํ•˜๊ณ  CrUXยทPageSpeed API ์ผœ๊ธฐ
8
+
9
+ ## beginner
10
+
11
+ ์™œ ํ•„์š”ํ•œ๊ฐ€: ๋ฐฉ๋ฌธ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒช์€ ์†๋„ ์ ์ˆ˜(LCPยทINPยทCLS)๋Š” Google์˜ Chrome UX Report(CrUX)์™€ PageSpeed Insights(PSI)์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ์ด ์„ธ ํ•ญ๋ชฉ์ด ์ฑ„์›Œ์ง€๊ณ , ์—†์œผ๋ฉด ๋นˆ์นธ์œผ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค. ํ‚ค๋Š” ๋ณธ์ธ Google ๊ณ„์ •์—์„œ ์ง์ ‘ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‘ API๋Š” ๋ฌด๋ฃŒ์ด๋ฉฐ CrUX๋Š” ํ”„๋กœ์ ํŠธ๋‹น ๋ถ„๋‹น 150ํšŒ ํ•œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ํ™”๋ฉด์ด ๋‚˜์˜ค๋ฉด ๋ฉˆ์ถ”์„ธ์š”. ํ‚ค๊ฐ€ ์—†์–ด๋„ ๊ฐ์‚ฌ๋Š” ๋๊นŒ์ง€ ๊ฐ‘๋‹ˆ๋‹ค.
12
+
13
+ 1. ๋ธŒ๋ผ์šฐ์ €์—์„œ console.cloud.google.com์„ ์—ฝ๋‹ˆ๋‹ค.
14
+ 2. Google ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
15
+ 3. ์ฒ˜์Œ์ด๋ฉด ์•ฝ๊ด€ ๋™์˜ ์ฐฝ์ด ๋œฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์šฉ์„ ์ฝ๊ณ  ์ง์ ‘ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
16
+ 4. ํ™”๋ฉด ๋งจ ์œ„ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ์ƒ์ž(Project picker)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
17
+ 5. ์—ด๋ฆฐ ๋ชฉ๋ก์— ์“ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ด๋ฆ„์„ ๋ˆ„๋ฅด๊ณ  10๋ฒˆ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค.
18
+ 6. ์“ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์œผ๋ฉด **์ƒˆ ํ”„๋กœ์ ํŠธ**(New project)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
19
+ 7. **ํ”„๋กœ์ ํŠธ ์ด๋ฆ„**(Project name) ์นธ์— `optbrew`์ฒ˜๋Ÿผ ์•Œ์•„๋ณผ ์ด๋ฆ„์„ ์ ์Šต๋‹ˆ๋‹ค.
20
+ 8. **๋งŒ๋“ค๊ธฐ**(Create)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
21
+ 9. ๋ช‡ ์ดˆ ๊ธฐ๋‹ค๋ฆฐ ๋’ค ์œ„์ชฝ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ์ƒ์ž(ํ”„๋กœ์ ํŠธ ์„ ํƒ๊ธฐ)๋ฅผ ๋ˆŒ๋Ÿฌ ๋ฐฉ๊ธˆ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.
22
+ 10. ์œ„์ชฝ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ์ƒ์ž์— ์“ธ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์ด ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
23
+ 11. ์™ผ์ชฝ ์œ„์˜ ๋ฉ”๋‰ด ์•„์ด์ฝ˜(โ˜ฐ)์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
24
+ 12. **API ๋ฐ ์„œ๋น„์Šค**(APIs & Services) โ†’ **๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**(Library)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ๋Š” ์ด ํ™”๋ฉด์„ **API ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
25
+ 13. ๊ฒ€์ƒ‰ ์ƒ์ž์— `Chrome UX Report API`๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
26
+ 14. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ **Chrome UX Report API**๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
27
+ 15. **์‚ฌ์šฉ ์„ค์ •**(Enable) ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
28
+ 16. 12๋ฒˆ์ฒ˜๋Ÿผ **๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.
29
+ 17. ๊ฒ€์ƒ‰ ์ƒ์ž์— `PageSpeed Insights API`๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
30
+ 18. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ **PageSpeed Insights API**๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
31
+ 19. **์‚ฌ์šฉ ์„ค์ •**(Enable) ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
32
+ 20. ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ **์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด**(Credentials)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
33
+ 21. ์œ„์ชฝ **+ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ**(+ Create credentials)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ์—ด๋ฆฐ ๋ฉ”๋‰ด์— **API ํ‚ค**(API key), OAuth ํด๋ผ์ด์–ธํŠธ ID, ์„œ๋น„์Šค ๊ณ„์ •์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.
34
+ 22. ์—ด๋ฆฐ ๋ฉ”๋‰ด์—์„œ **API ํ‚ค**(API key)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
35
+ 23. ํ‚ค ๋งŒ๋“ค๊ธฐ ํ™”๋ฉด์— **API ์ œํ•œ์‚ฌํ•ญ**(API restrictions) ์˜์—ญ์ด ๋ณด์ด๋ฉด **ํ‚ค ์ œํ•œ**(Restrict key)์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ๋ณด์ด์ง€ ์•Š์œผ๋ฉด 27๋ฒˆ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค.
36
+ 24. API ๋ชฉ๋ก์„ ์—ฝ๋‹ˆ๋‹ค.
37
+ 25. ๋ชฉ๋ก์—์„œ **Chrome UX Report API**๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
38
+ 26. ๋ชฉ๋ก์—์„œ **PageSpeed Insights API**๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
39
+ 27. **๋งŒ๋“ค๊ธฐ**(Create)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
40
+ 28. **API ํ‚ค ์ƒ์„ฑ ์™„๋ฃŒ**(API key created) ์ฐฝ์— ํ‚ค ๋ฌธ์ž์—ด์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ํ‚ค ์˜† ๋ณต์‚ฌ ์•„์ด์ฝ˜์„ ๋ˆŒ๋Ÿฌ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฐฝ์„ ๋‹ซ๊ธฐ ์ „์— ๋ณต์‚ฌ๋ฅผ ๋งˆ์นฉ๋‹ˆ๋‹ค.
41
+ 29. ํ‚ค๋ฅผ ์ฑ„ํŒ…์ฐฝ, ๋ฉ”๋ชจ, ๋ฌธ์„œ, ํ™”๋ฉด ๊ณต์œ ์— ๋ถ™์—ฌ ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
42
+ 30. ํ‚ค๋ฅผ optbrew์— ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ ์ค‘์ธ ํ™˜๊ฒฝ์— ๋งž๋Š” ๋Ÿฐ๋ถ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋‚ด ์ปดํ“จํ„ฐ์˜ ํ„ฐ๋ฏธ๋„๊ณผ Claude Code ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •์€ `key-set-local`, Claude Code ํด๋ผ์šฐ๋“œ๋Š” `key-set-claude-cloud`, Codex๋Š” `key-set-codex`์ž…๋‹ˆ๋‹ค.
43
+
44
+ ํ‚ค๊ฐ€ ์œ ์ถœ๋๋‹ค๊ณ  ์˜์‹ฌ๋˜๋ฉด **์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด** ๋ชฉ๋ก์—์„œ ๊ทธ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
45
+
46
+ ## brief
47
+
48
+ - console.cloud.google.com์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ ๋ฅด๊ฑฐ๋‚˜ ๋งŒ๋“ค๊ณ , API ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ `Chrome UX Report API`์™€ `PageSpeed Insights API`๋ฅผ ๊ฐ๊ฐ **ENABLE** ํ•ฉ๋‹ˆ๋‹ค.
49
+ - **API ๋ฐ ์„œ๋น„์Šค โ†’ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด โ†’ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ โ†’ API ํ‚ค**. ๋ฌธ์„œ๋Š” ํ‚ค๋ฅผ ์ œํ•œํ•˜๋ผ๊ณ  ๊ถŒํ•˜๋ฏ€๋กœ ์œ„ ๋‘ API๋กœ ์ œํ•œํ•˜๊ณ  **๋งŒ๋“ค๊ธฐ**๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
50
+ - ํ‚ค ๋ฌธ์ž์—ด์€ ํ•œ ๋ฒˆ ๋ณต์‚ฌํ•ด `key-set-local`ยท`key-set-claude-cloud`ยท`key-set-codex` ์ค‘ ๋งž๋Š” ๋Ÿฐ๋ถ์œผ๋กœ๋งŒ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”์ฐฝ์— ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
51
+ - CrUX๋Š” ๋ฌด๋ฃŒ, ํ”„๋กœ์ ํŠธ๋‹น ๋ถ„๋‹น 150ํšŒ. ๊ฒฐ์ œ ์ •๋ณด๋ฅผ ์š”๊ตฌํ•˜๋ฉด ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.
@@ -0,0 +1,32 @@
1
+ ---
2
+ checked: 2026-10-18
3
+ source: https://support.google.com/webmasters/answer/12919797 https://developers.google.com/search/blog/2020/02/data-export
4
+ harness: any
5
+ ---
6
+
7
+ # Search Console ์‹ค์  ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ
8
+
9
+ ## beginner
10
+
11
+ ์ด ์ ˆ์ฐจ๋Š” Google Search Console์šฉ์ž…๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋ฉด ์ด ์ ˆ์ฐจ๋Š” ๊ฑด๋„ˆ๋›ฐ์„ธ์š”.
12
+
13
+ ์™œ ํ•„์š”ํ•œ๊ฐ€: optbrew๋Š” ์‚ฌ์ดํŠธ๋ฅผ ๋ฐ–์—์„œ ์ฝ๋Š” ๊ฒƒ๋งŒ ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ์‚ฌ์ดํŠธ๊ฐ€ Google ๊ฒ€์ƒ‰์—์„œ ์‹ค์ œ๋กœ ๋ช‡ ๋ฒˆ ๋ณด์ด๊ณ  ํด๋ฆญ๋๋Š”์ง€๋Š” ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ ์†Œ์œ ์ž๋งŒ ๋ณด๋Š” Search Console ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๋กœ ๋‚ด๋ ค๋ฐ›์•„ ์ฃผ๋ฉด ๊ทธ ์ˆซ์ž๋ฅผ ๊ฐ์‚ฌ ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ๊ฐ€ Search Console์— ๋“ฑ๋ก๋˜์–ด ์žˆ๊ณ  ๋‚ด๊ฐ€ ์†Œ์œ ์ž(๋˜๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž)์ผ ๋•Œ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
14
+
15
+ 1. ๋ธŒ๋ผ์šฐ์ €์—์„œ search.google.com/search-console์„ ์—ฝ๋‹ˆ๋‹ค.
16
+ 2. ์‚ฌ์ดํŠธ ์†Œ์œ  ๊ถŒํ•œ์ด ์žˆ๋Š” Google ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
17
+ 3. ์™ผ์ชฝ ์œ„์˜ ์†์„ฑ ์„ ํƒ ์ƒ์ž๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฐ์‚ฌํ•  ์‚ฌ์ดํŠธ๋ฅผ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ๊ฐ€ ๋ชฉ๋ก์— ์—†์œผ๋ฉด ์ด ๊ณ„์ •์— ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.
18
+ 4. ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ **์‹ค์ **(Performance)์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ๊ทธ ์•„๋ž˜์— **๊ฒ€์ƒ‰๊ฒฐ๊ณผ**(Search results)๊ฐ€ ๋”ฐ๋กœ ๋ณด์ด๋ฉด ๊ทธ๊ฒƒ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
19
+ 5. ์œ„์ชฝ ๊ธฐ๊ฐ„ ๋‹จ์ถ”(24์‹œ๊ฐ„ยท7์ผยท28์ผยท3๊ฐœ์›”) ๋์˜ **๋”๋ณด๊ธฐ**๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. **์ง€๋‚œ 16๊ฐœ์›”**์„ ๊ณ ๋ฅด๊ณ  **์ ์šฉ**(Apply)์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
20
+ 6. ํ™”๋ฉด ์˜ค๋ฅธ์ชฝ ์œ„์˜ **๋‚ด๋ณด๋‚ด๊ธฐ**(Export) ๋ฒ„ํŠผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์ชฝ ํ™”์‚ดํ‘œ๊ฐ€ ๊ทธ๋ ค์ง„ ๋‹ค์šด๋กœ๋“œ ์•„์ด์ฝ˜์ด ๋ถ™์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
21
+ 7. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด **Google Sheets**, **Excel ๋‹ค์šด๋กœ๋“œ**, **CSV ๋‹ค์šด๋กœ๋“œ**๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์—‘์…€ ์—†์ด ์“ฐ๋ ค๋ฉด **CSV ๋‹ค์šด๋กœ๋“œ**(Download CSV)๊ฐ€ ๊ฐ€์žฅ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค.
22
+ 8. ํŒŒ์ผ์ด ๋‚ด๋ ค๋ฐ›์•„์ง‘๋‹ˆ๋‹ค. CSV๋Š” ์—ฌ๋Ÿฌ ์‹œํŠธ๊ฐ€ ๋“  ์••์ถ•(.zip) ํŒŒ์ผ๋กœ ๋ฐ›์•„์ง‘๋‹ˆ๋‹ค. ์••์ถ•์„ ํ’€์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ์••์ถ• ์•ˆ์—๋Š” ์ฟผ๋ฆฌ, ํŽ˜์ด์ง€, ๊ตญ๊ฐ€, ๊ธฐ๊ธฐ, ๋‚ ์งœ ๋“ฑ์ด ๋”ฐ๋กœ ๋“ค์–ด ์žˆ๊ณ , ์ ์šฉํ•œ ํ•„ํ„ฐ๋ฅผ ์ ์€ ํŒŒ์ผ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
23
+ 9. ํŒŒ์ผ์€ ๋ณดํ†ต ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์ €์žฅ ํด๋”์ธ **๋‹ค์šด๋กœ๋“œ**(Downloads) ํด๋”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ํด๋”์—์„œ ๋ฐฉ๊ธˆ ๋ฐ›์€ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ํ™•์ธํ•ด, ํด๋” ์ด๋ฆ„๊ณผ ํŒŒ์ผ ์ด๋ฆ„์„ ์—์ด์ „ํŠธ์—๊ฒŒ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ์€ ๋Œ€ํ™”์— ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
24
+ 10. ์•Œ์•„๋‘˜ ์ : ํ™”๋ฉด์—์„œ ๋‚ด๋ ค๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ตœ๋Œ€ 1,000ํ–‰์ž…๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธ ๋งŽ์€ ์‚ฌ์ดํŠธ๋Š” ์ผ๋ถ€๋งŒ ๋‹ด๊น๋‹ˆ๋‹ค.
25
+
26
+ ## brief
27
+
28
+ - Google Search Console์šฉ์ž…๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋ฉด ์ด ์ ˆ์ฐจ๋Š” ๊ฑด๋„ˆ๋›ฐ์„ธ์š”.
29
+ - search.google.com/search-console โ†’ ์†์„ฑ ์„ ํƒ โ†’ **์‹ค์ **(์•„๋ž˜์— **๊ฒ€์ƒ‰๊ฒฐ๊ณผ**๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ) โ†’ **๋”๋ณด๊ธฐ**์—์„œ **์ง€๋‚œ 16๊ฐœ์›”** โ†’ ์˜ค๋ฅธ์ชฝ ์œ„ **๋‚ด๋ณด๋‚ด๊ธฐ**๋กœ Google SheetsยทExcelยทCSV ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
30
+ - CSV๋Š” ์‹œํŠธ๋ณ„ ํŒŒ์ผ์ด ๋“  zip์œผ๋กœ ๋ฐ›์•„์ง‘๋‹ˆ๋‹ค. ์ฟผ๋ฆฌยทํŽ˜์ด์ง€ยท๊ตญ๊ฐ€ยท๊ธฐ๊ธฐยท๋‚ ์งœ์™€ ์ ์šฉ ํ•„ํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
31
+ - ํ™”๋ฉด ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” 1,000ํ–‰๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ๋” ํ•„์š”ํ•˜๋ฉด API๋‚˜ BigQuery ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
32
+ - ํŒŒ์ผ ๊ฒฝ๋กœ๋งŒ ์—์ด์ „ํŠธ์— ์•Œ๋ฆฌ๊ณ  ๋‚ด์šฉ์€ ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
@@ -0,0 +1,18 @@
1
+ [
2
+ { "id": "network-codex-approval", "kind": "blocking", "when": { "block_reason": "codex_sandbox" }, "fills": [], "item": "Codex ๋„คํŠธ์›Œํฌ ํ—ˆ์šฉ โ€” ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด" },
3
+ { "id": "network-claude-cloud-custom", "kind": "blocking", "when": { "block_reason": "cloud_network_level" }, "fills": [], "item": "Claude Code ํด๋ผ์šฐ๋“œ ๋„คํŠธ์›Œํฌ ํ—ˆ์šฉ โ€” ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด" },
4
+ { "id": "network-codex-config", "kind": "improving", "when": {}, "fills": [], "item": "Codex ๋„คํŠธ์›Œํฌ ํ—ˆ์šฉ ์„ค์ • ์ €์žฅ โ€” ๋‹ค์Œ ๊ฐ์‚ฌ์—์„œ ๋‹ค์‹œ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด" },
5
+ { "id": "google-api-key", "kind": "improving", "when": { "missing": "google_key", "unknown_reason": "field_data_unavailable" }, "fills": ["lcp-field", "inp-field", "cls-field"], "item": "Google ํ‚ค โ€” ๋ฐฉ๋ฌธ์ž ์‹ค์ธก ์ ์ˆ˜(LCPยทINPยทCLS)๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด",
6
+ "line": "Google ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐฉ๋ฌธ์ž ์‹ค์ธก ์ ์ˆ˜(LCPยทINPยทCLS)๊ฐ€ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. 'ํ‚ค'๋ผ๊ณ  ๋‹ตํ•˜๋ฉด ๋ฐœ๊ธ‰ ์ ˆ์ฐจ๋ฅผ ๋ณด์—ฌ ๋“œ๋ฆฝ๋‹ˆ๋‹ค." },
7
+ { "id": "cwv-site-collection", "kind": "improving", "when": { "unknown_reason": "field_data_unavailable" }, "fills": ["lcp-field", "inp-field", "cls-field"], "item": "์‚ฌ์ดํŠธ ์•ˆ์—์„œ ๋ฐฉ๋ฌธ์ž ์ธก์ •๊ฐ’ ๋ชจ์œผ๊ธฐ โ€” ๋ฐฉ๋ฌธ์ž๊ฐ€ ์ ์–ด Google์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ์‹ค์ธก ์ ์ˆ˜(LCPยทINPยทCLS)๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด" },
8
+ { "id": "key-set-local", "kind": "improving", "when": {}, "fills": ["lcp-field", "inp-field", "cls-field"], "item": "๋‚ด ์ปดํ“จํ„ฐ์— Google ํ‚ค ์ €์žฅ โ€” ํ‚ค๋ฅผ ๋‹ค์Œ ๊ฐ์‚ฌ์—์„œ๋„ ์“ฐ๊ธฐ ์œ„ํ•ด" },
9
+ { "id": "key-set-claude-cloud", "kind": "improving", "when": {}, "fills": ["lcp-field", "inp-field", "cls-field"], "item": "Claude Code ํด๋ผ์šฐ๋“œ์— Google ํ‚ค ์ €์žฅ โ€” ํ‚ค๋ฅผ ๋‹ค์Œ ๊ฐ์‚ฌ์—์„œ๋„ ์“ฐ๊ธฐ ์œ„ํ•ด" },
10
+ { "id": "key-set-codex", "kind": "improving", "when": {}, "fills": ["lcp-field", "inp-field", "cls-field"], "item": "Codex์— Google ํ‚ค ์ €์žฅ โ€” ํ‚ค๋ฅผ ๋‹ค์Œ ๊ฐ์‚ฌ์—์„œ๋„ ์“ฐ๊ธฐ ์œ„ํ•ด" },
11
+ { "id": "chrome-install", "kind": "improving", "when": { "missing": "chrome", "unknown_reason": "chrome_missing" }, "fills": ["render-content"], "item": "ํฌ๋กฌ โ€” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ทธ๋ ค์ง€๋Š” ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด",
12
+ "line": "ํฌ๋กฌ์ด ์žˆ์œผ๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ทธ๋ ค์ง€๋Š” ๋‚ด์šฉ๊นŒ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 'ํฌ๋กฌ'์ด๋ผ๊ณ  ๋‹ตํ•˜๋ฉด ์„ค์น˜ ์ ˆ์ฐจ๋ฅผ ๋ณด์—ฌ ๋“œ๋ฆฝ๋‹ˆ๋‹ค." },
13
+ { "id": "gsc-export", "kind": "improving", "when": { "missing": "owner_export" }, "fills": [], "expands_to": ["gsc-export", "naver-searchadvisor-export"], "item": "Search Consoleยท๋„ค์ด๋ฒ„ ์„œ์น˜์–ด๋“œ๋ฐ”์ด์ € ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ โ€” ์‹ค์ œ ๊ฒ€์ƒ‰ ๋ฐ˜์‘(์ ์ˆ˜์—๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š์Œ)์„ ํ•จ๊ป˜ ๋ณด๊ธฐ ์œ„ํ•ด",
14
+ "line": "Search Console์ด๋‚˜ ๋„ค์ด๋ฒ„ ์„œ์น˜์–ด๋“œ๋ฐ”์ด์ €์—์„œ ๋‚ด๋ ค๋ฐ›์€ ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ์‹ค์ œ ๊ฒ€์ƒ‰ ๋ฐ˜์‘์„ ํ•จ๊ป˜ ๋ด…๋‹ˆ๋‹ค. '๋‚ด๋ณด๋‚ด๊ธฐ'๋ผ๊ณ  ๋‹ตํ•˜๋ฉด ๋‘ ์„œ๋น„์Šค์˜ ์ ˆ์ฐจ๋ฅผ ๋ชจ๋‘ ๋ณด์—ฌ ๋“œ๋ฆฝ๋‹ˆ๋‹ค." },
15
+ { "id": "naver-searchadvisor-export", "kind": "improving", "when": {}, "fills": [], "item": "๋„ค์ด๋ฒ„ ์„œ์น˜์–ด๋“œ๋ฐ”์ด์ € ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ โ€” ๋„ค์ด๋ฒ„์˜ ์‹ค์ œ ๊ฒ€์ƒ‰ ๋ฐ˜์‘(์ ์ˆ˜์—๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š์Œ)์„ ํ•จ๊ป˜ ๋ณด๊ธฐ ์œ„ํ•ด" },
16
+ { "id": "anthropic-api-key", "kind": "improving", "when": {}, "fills": [], "item": "Anthropic ํ‚ค(์„ ํƒ) โ€” optbrew๊ฐ€ Claude API๋ฅผ ์ง์ ‘ ๋ถˆ๋Ÿฌ ์“ฐ๋Š” ๊ธฐ๋Šฅ์„ ์ผœ๊ธฐ ์œ„ํ•ด" },
17
+ { "id": "seranking", "kind": "improving", "when": {}, "fills": [], "item": "SE Ranking ์—ฐ๊ฒฐ(์„ ํƒ) โ€” AI ๊ฒ€์ƒ‰ ์ธ์šฉ ๊ฐ™์€ ์‹ค์ธก ์ˆ˜์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด" }
18
+ ]
@@ -0,0 +1,32 @@
1
+ ---
2
+ checked: 2026-10-18
3
+ source: https://code.claude.com/docs/en/cloud-environments
4
+ harness: claude-code-cloud
5
+ ---
6
+
7
+ # Claude Code ํด๋ผ์šฐ๋“œ์—์„œ Google ํ‚ค ๋„ฃ๊ธฐ (ํ™˜๊ฒฝ ๋ณ€์ˆ˜)
8
+
9
+ ## beginner
10
+
11
+ ์™œ ํ•„์š”ํ•œ๊ฐ€: ํด๋ผ์šฐ๋“œ ์„ธ์…˜์—๋Š” ๋‚ด ์ปดํ“จํ„ฐ์˜ ํ‚ค ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ ์„ค์ •์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์นธ์— ํ‚ค๋ฅผ ๋„ฃ์–ด ๋‘๋ฉด, ๊ทธ ํ™˜๊ฒฝ์—์„œ ์‹œ์ž‘ํ•œ ์„ธ์…˜์ด `OPTBREW_GOOGLE_API_KEY`๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ํ‚ค๋Š” ์ด ์„ค์ • ์ฐฝ์—๋งŒ ๋ถ™์—ฌ ๋„ฃ๊ณ  ์—์ด์ „ํŠธ ๋Œ€ํ™”์ฐฝ์—๋Š” ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์˜: ๊ทธ ํ™˜๊ฒฝ์„ ์“ฐ๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋งŒ ์“ฐ๋Š” ๊ฐœ์ธ ํ™˜๊ฒฝ์—๋งŒ ๋„ฃ๊ณ , ์กฐ์ง์ด ๊ณต์œ ํ•˜๋Š” ํ™˜๊ฒฝ์—๋Š” ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
12
+
13
+ 1. ๋ธŒ๋ผ์šฐ์ €์—์„œ claude.ai/code๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
14
+ 2. ์ƒˆ ์„ธ์…˜ ํ™”๋ฉด์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค. ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์„ธ์…˜์„ ๊ณ ์น˜๋ ค๋ฉด ์œ„์ชฝ ์„ธ์…˜ ์ œ๋ชฉ ์˜† ํ™”์‚ดํ‘œ(caret)๋ฅผ ๋ˆ„๋ฅด๊ณ  **Edit cloud environment**๋ฅผ ๊ณ ๋ฅธ ๋’ค 5๋ฒˆ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค.
15
+ 3. ๋ฉ”์‹œ์ง€ ์ž…๋ ฅ ์ƒ์ž ๋ฐ”๋กœ ์•„๋ž˜ ์ค„์—์„œ ์ฒซ ๋ฒˆ์งธ ์ปจํŠธ๋กค(ํ™˜๊ฒฝ ์ด๋ฆ„์ด ์ ํžŒ ๋ฒ„ํŠผ)์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
16
+ 4. ์—ด๋ฆฐ ๋ชฉ๋ก์—์„œ **ํด๋ผ์šฐ๋“œ**(Cloud)๋ฅผ ๋ˆ„๋ฅด๋ฉด ์˜†์— ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ ๋ชฉ๋ก์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด ๊ฐœ์ธ ํ™˜๊ฒฝ ์ค„์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ค„ ์˜ค๋ฅธ์ชฝ์— ํ†ฑ๋‹ˆ๋ฐ”ํ€ด์™€ ๋ณ„ ์•„์ด์ฝ˜์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ํ†ฑ๋‹ˆ๋ฐ”ํ€ด(์„ค์ •)๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์ด ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ๊ทธ ๋ชฉ๋ก ๋งจ ์•„๋ž˜ **ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ ์ถ”๊ฐ€โ€ฆ**(Add cloud environment)๋ฅผ ๋ˆŒ๋Ÿฌ ํ™˜๊ฒฝ์„ ๋งŒ๋“  ๋’ค, ๋งŒ๋“  ํ™˜๊ฒฝ์˜ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
17
+ 5. ์„ค์ • ์ฐฝ์—์„œ **Environment variables** ์นธ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
18
+ 6. ์นธ์˜ ๋งจ ์•„๋ž˜ ์ƒˆ ์ค„์— `OPTBREW_GOOGLE_API_KEY=`๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋“ฑํ˜ธ ์•ž๋’ค์— ๊ณต๋ฐฑ์„ ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
19
+ 7. ๋“ฑํ˜ธ ๋ฐ”๋กœ ๋’ค์— ๋ณต์‚ฌํ•ด ๋‘” Google ํ‚ค๋ฅผ ๋ถ™์—ฌ ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋Š” ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
20
+ 8. ์ค„ ํ•˜๋‚˜์— ๋ณ€์ˆ˜ ํ•˜๋‚˜๋งŒ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด ๊ทธ ์ค„์€ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค.
21
+ 9. ์ฐฝ์˜ **Save changes** ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
22
+ 10. ์ƒˆ ์„ธ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  ๊ฐ์‚ฌ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •์€ ์ƒˆ ์„ธ์…˜์—์„œ ํ™•์‹คํžˆ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
23
+ 11. ์—์ด์ „ํŠธ๊ฐ€ "Google ํ‚ค ์žˆ์Œ"์ด๋ผ๊ณ  ์•Œ๋ ค ์ฃผ๋ฉด ๋์ž…๋‹ˆ๋‹ค. ํ‚ค ๊ฐ’์€ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.
24
+
25
+ ํ‚ค๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ง€์šฐ๋ ค๋ฉด ๊ฐ™์€ ์ฐฝ์—์„œ ๊ทธ ์ค„์„ ๊ณ ์น˜๊ฑฐ๋‚˜ ์ง€์šฐ๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•œ๊ธ€ ํ™”๋ฉด์—์„œ๋Š” ํ•ญ๋ชฉ ์ด๋ฆ„์ด ๋ฒˆ์—ญ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์˜๋ฌธ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ž๋ฆฌ์˜ ํ•ญ๋ชฉ์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.
26
+
27
+ ## brief
28
+
29
+ - claude.ai/code ์ƒˆ ์„ธ์…˜ ํ™”๋ฉด์—์„œ ๋ฉ”์‹œ์ง€ ์ƒ์ž ์•„๋ž˜ ์ฒซ ์ปจํŠธ๋กค โ†’ ํ™˜๊ฒฝ ํ–‰์˜ ์„ค์ • ์•„์ด์ฝ˜ โ†’ **Environment variables**.
30
+ - `OPTBREW_GOOGLE_API_KEY=ํ‚ค` ํ•œ ์ค„(๊ณต๋ฐฑยท๋”ฐ์˜ดํ‘œ ์—†์Œ)์„ ๋„ฃ๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. `.env` ํ˜•์‹์ด๋ฉฐ `#`๊ฐ€ ๋“  ๊ฐ’์€ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.
31
+ - ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๊ทธ ํ™˜๊ฒฝ์„ ์“ฐ๋Š” ๋ชจ๋‘๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ์ธ ํ™˜๊ฒฝ์—๋งŒ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์„ธ์…˜์—์„œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
32
+ - ํ‚ค๋ฅผ ๋Œ€ํ™”์ฐฝ์— ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.