optbrew 0.1.2 โ 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +4 -4
- package/.claude-plugin/plugin.json +2 -1
- package/.codex-plugin/plugin.json +2 -2
- package/AGENT_INSTALL.md +94 -0
- package/CHANGELOG.md +74 -1
- package/README.ko.md +129 -105
- package/README.md +129 -105
- package/THIRD_PARTY_NOTICES.md +88 -0
- package/docs/platforms.md +45 -8
- package/docs/release.md +37 -4
- package/lib/cli.mjs +5 -2
- package/lib/install.mjs +2 -1
- package/lib/records.mjs +2 -1
- package/lib/transaction.mjs +12 -5
- package/lib/update.mjs +3 -2
- package/package.json +29 -9
- package/plugin.json +2 -2
- package/skills/.claude-plugin/icon.png +0 -0
- package/skills/.claude-plugin/plugin.json +23 -0
- package/skills/README.md +27 -0
- package/skills/optbrew/SKILL.md +223 -8
- package/skills/optbrew/THIRD_PARTY_NOTICES.md +88 -0
- package/skills/optbrew/bundle-manifest.json +409 -49
- package/skills/optbrew/modules/naver-searchadvisor/scripts/audit.mjs +4 -4
- package/skills/optbrew/references/ai-crawlers.json +1 -1
- package/skills/optbrew/references/ai-crawlers.md +1 -1
- package/skills/optbrew/references/api.md +6 -4
- package/skills/optbrew/references/check-registry.json +16 -16
- package/skills/optbrew/references/chrome-paths.json +31 -0
- package/skills/optbrew/references/endpoints.json +10 -0
- package/skills/optbrew/references/harness-signals.json +5 -0
- package/skills/optbrew/references/intake.md +76 -5
- package/skills/optbrew/references/judging.md +233 -0
- package/skills/optbrew/references/limits.json +26 -0
- package/skills/optbrew/references/measurement.md +1 -1
- package/skills/optbrew/references/messages.ko.json +170 -0
- package/skills/optbrew/references/report.md +18 -6
- package/skills/optbrew/references/routing.md +2 -2
- package/skills/optbrew/references/runbooks/anthropic-api-key.md +34 -0
- package/skills/optbrew/references/runbooks/chrome-install.md +56 -0
- package/skills/optbrew/references/runbooks/cwv-site-collection.md +38 -0
- package/skills/optbrew/references/runbooks/google-api-key.md +51 -0
- package/skills/optbrew/references/runbooks/gsc-export.md +32 -0
- package/skills/optbrew/references/runbooks/index.json +18 -0
- package/skills/optbrew/references/runbooks/key-set-claude-cloud.md +32 -0
- package/skills/optbrew/references/runbooks/key-set-codex.md +33 -0
- package/skills/optbrew/references/runbooks/key-set-local.md +40 -0
- package/skills/optbrew/references/runbooks/naver-searchadvisor-export.md +32 -0
- package/skills/optbrew/references/runbooks/network-claude-cloud-custom.md +33 -0
- package/skills/optbrew/references/runbooks/network-codex-approval.md +26 -0
- package/skills/optbrew/references/runbooks/network-codex-config.md +36 -0
- package/skills/optbrew/references/runbooks/seranking.md +38 -0
- package/skills/optbrew/references/schemas/contract.schema.json +42 -15
- package/skills/optbrew/references/scoring.md +40 -5
- package/skills/optbrew/references/source-analysis.md +40 -0
- package/skills/optbrew/references/versions.json +9 -0
- package/skills/optbrew/scripts/adapters/anthropic.mjs +5 -5
- package/skills/optbrew/scripts/adapters/imports.mjs +138 -1
- package/skills/optbrew/scripts/audit.mjs +10 -96
- package/skills/optbrew/scripts/cli.mjs +5 -2
- package/skills/optbrew/scripts/core/bundle.mjs +30 -13
- package/skills/optbrew/scripts/core/capabilities.mjs +8 -4
- package/skills/optbrew/scripts/core/cdp.mjs +105 -0
- package/skills/optbrew/scripts/core/checks/canonical-consistency.mjs +56 -0
- package/skills/optbrew/scripts/core/checks/cwv-field.mjs +77 -0
- package/skills/optbrew/scripts/core/checks/discovery.mjs +43 -0
- package/skills/optbrew/scripts/core/checks/document-title.mjs +62 -0
- package/skills/optbrew/scripts/core/checks/entity-identity.mjs +31 -0
- package/skills/optbrew/scripts/core/checks/fact-consistency.mjs +31 -0
- package/skills/optbrew/scripts/core/checks/fetch-response.mjs +18 -0
- package/skills/optbrew/scripts/core/checks/index-policy.mjs +16 -0
- package/skills/optbrew/scripts/core/checks/index.mjs +18 -0
- package/skills/optbrew/scripts/core/checks/internal-navigation.mjs +67 -0
- package/skills/optbrew/scripts/core/checks/locale-links.mjs +55 -0
- package/skills/optbrew/scripts/core/checks/naver-markup.mjs +21 -0
- package/skills/optbrew/scripts/core/checks/observation.mjs +37 -0
- package/skills/optbrew/scripts/core/checks/prepare.mjs +103 -0
- package/skills/optbrew/scripts/core/checks/render-content.mjs +104 -0
- package/skills/optbrew/scripts/core/checks/search-crawl-policy.mjs +29 -0
- package/skills/optbrew/scripts/core/checks/structured-data-truth.mjs +46 -0
- package/skills/optbrew/scripts/core/chrome-temp.mjs +68 -0
- package/skills/optbrew/scripts/core/chrome.mjs +546 -0
- package/skills/optbrew/scripts/core/collector.mjs +65 -59
- package/skills/optbrew/scripts/core/compare.mjs +18 -1
- package/skills/optbrew/scripts/core/config.mjs +31 -0
- package/skills/optbrew/scripts/core/contracts.mjs +31 -2
- package/skills/optbrew/scripts/core/cwv.mjs +100 -0
- package/skills/optbrew/scripts/core/derive.mjs +10 -161
- package/skills/optbrew/scripts/core/evidence-store.mjs +112 -0
- package/skills/optbrew/scripts/core/facts.mjs +203 -19
- package/skills/optbrew/scripts/core/findings.mjs +19 -1
- package/skills/optbrew/scripts/core/html.mjs +41 -3
- package/skills/optbrew/scripts/core/index-targets.mjs +118 -0
- package/skills/optbrew/scripts/core/judgments.mjs +675 -0
- package/skills/optbrew/scripts/core/keys.mjs +86 -0
- package/skills/optbrew/scripts/core/link-graph.mjs +93 -0
- package/skills/optbrew/scripts/core/messages.mjs +23 -0
- package/skills/optbrew/scripts/core/metrics.mjs +4 -2
- package/skills/optbrew/scripts/core/migration.mjs +37 -0
- package/skills/optbrew/scripts/core/page-select.mjs +136 -0
- package/skills/optbrew/scripts/core/probe.mjs +83 -0
- package/skills/optbrew/scripts/core/protocol.mjs +38 -14
- package/skills/optbrew/scripts/core/render.mjs +160 -0
- package/skills/optbrew/scripts/core/report-compose.mjs +377 -0
- package/skills/optbrew/scripts/core/report-html.mjs +198 -0
- package/skills/optbrew/scripts/core/report-page.mjs +14 -0
- package/skills/optbrew/scripts/core/report.mjs +357 -131
- package/skills/optbrew/scripts/core/runbooks.mjs +63 -0
- package/skills/optbrew/scripts/core/scope.mjs +23 -5
- package/skills/optbrew/scripts/core/score.mjs +12 -4
- package/skills/optbrew/scripts/core/secrets.mjs +2 -0
- package/skills/optbrew/scripts/core/stages.mjs +694 -0
- package/skills/optbrew/scripts/core/transport.mjs +157 -0
- package/skills/optbrew/scripts/core/weights.mjs +2 -1
- package/skills/optbrew/scripts/key.mjs +90 -0
- package/skills/optbrew/scripts/preflight.mjs +176 -0
- package/skills/optbrew/scripts/run.mjs +81 -0
- package/skills/optbrew/source-lock.json +1 -1
- package/source-lock.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "optbrew
|
|
3
|
-
"description": "
|
|
4
|
-
"owner": { "name": "
|
|
5
|
-
"plugins": [{ "name": "optbrew", "source": "./", "
|
|
2
|
+
"name": "optbrew",
|
|
3
|
+
"description": "optbrew: search, Naver and AI-answer readiness audit skill",
|
|
4
|
+
"owner": { "name": "nowwcastle-sudo", "url": "https://github.com/nowwcastle-sudo" },
|
|
5
|
+
"plugins": [{ "name": "optbrew", "source": "./skills", "description": "Audit a site, fix approved local files, re-check under the same conditions and write a scored report" }]
|
|
6
6
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "optbrew",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"description": "Pinned search audit and improvement skill bundle",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"extensions": {
|
|
8
8
|
"com.openai": {
|
|
9
9
|
"skills": ["./skills/optbrew"],
|
|
10
|
-
"release_version": "0.
|
|
10
|
+
"release_version": "0.2.0"
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
}
|
package/AGENT_INSTALL.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Install optbrew โ instructions for an AI agent
|
|
2
|
+
|
|
3
|
+
You are an AI coding agent installing the optbrew skill for a user. Follow the steps in order. Each step has a command and a check. Stop and ask the user when a step says so. Do not skip a check.
|
|
4
|
+
|
|
5
|
+
Package: `optbrew@0.2.0` on npm. Source: https://github.com/nowwcastle-sudo/optbrew
|
|
6
|
+
|
|
7
|
+
## Rules
|
|
8
|
+
|
|
9
|
+
- Install only what the user asked for. Do not change other skills, settings or accounts.
|
|
10
|
+
- Never delete `.optbrew/runs` or an `optbrew-audit` folder (the user's audit evidence) or a whole `.optbrew` folder (it also holds the user's Google key file). The only deletions in this guide are the paths that the reinstall check in [Update](#update) prints.
|
|
11
|
+
- Do not call paid APIs, submit sites to search engines or publish anything. optbrew itself does none of these without the user's approval.
|
|
12
|
+
- Show the user the planned changes (step 3) before you install.
|
|
13
|
+
- On Windows in PowerShell, write `npx.cmd` wherever this guide says `npx`. Plain `npx` runs `npx.ps1`, which the default execution policy blocks with "running scripts is disabled".
|
|
14
|
+
|
|
15
|
+
## 1. Ask the user two questions
|
|
16
|
+
|
|
17
|
+
1. Which agents should get the skill? Valid IDs: `codex`, `claude-code`, `cursor`, `opencode`, `pi`. Default: the agent you are running in.
|
|
18
|
+
2. Install for the user account (`user`, every project) or for one project folder (`project`)? Default: `user`.
|
|
19
|
+
|
|
20
|
+
Write the answers as `AGENTS` (comma-separated, no spaces) and `SCOPE`. For `project`, also get the absolute folder path as `PROJECT`.
|
|
21
|
+
|
|
22
|
+
## 2. Check Node.js
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
node -p "process.versions.node"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Check: the major version is 22 or higher. If Node.js is missing or older, stop and tell the user to install Node.js 22 or later from https://nodejs.org.
|
|
29
|
+
|
|
30
|
+
## 3. Show the planned changes
|
|
31
|
+
|
|
32
|
+
User scope:
|
|
33
|
+
|
|
34
|
+
```text
|
|
35
|
+
npx --yes optbrew@0.2.0 install --agents AGENTS --scope user --dry-run --json
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Project scope:
|
|
39
|
+
|
|
40
|
+
```text
|
|
41
|
+
npx --yes optbrew@0.2.0 install --agents AGENTS --scope project --project PROJECT --dry-run --json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Check: exit code 0 and `"status": "dry_run"`. Show the user `decision.targets[].path` from the output and ask for approval before step 4.
|
|
45
|
+
|
|
46
|
+
If the output says `existing release differs; use optbrew update`, optbrew is already installed: go to [Update](#update) instead. If it says `unmanaged optbrew target exists`, stop: tell the user the path and ask them what to do with that folder. Do not delete it yourself.
|
|
47
|
+
|
|
48
|
+
## 4. Install
|
|
49
|
+
|
|
50
|
+
Run the command from step 3 without `--dry-run`.
|
|
51
|
+
|
|
52
|
+
Check: exit code 0 and `"status": "installed"` (or `"unchanged"` when the same release was already in place).
|
|
53
|
+
|
|
54
|
+
## 5. Verify
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
npx --yes optbrew@0.2.0 doctor --agents AGENTS --scope SCOPE --json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Add `--project PROJECT` for project scope. Check: every entry in `targets` has `file_present: true`, `hash_ok: true` and `registered: true`. `session_discovery` and `invocation_verified` are always `not_verified`: doctor checks files, not whether the agent loaded them. A new agent session in step 6 confirms that.
|
|
61
|
+
|
|
62
|
+
## 6. Hand over
|
|
63
|
+
|
|
64
|
+
Tell the user:
|
|
65
|
+
|
|
66
|
+
- The skill is installed for AGENTS (SCOPE scope).
|
|
67
|
+
- Start a new agent session. Then say "run optbrew" (or "optbrew ์คํํด") with the site URL and the goal, for example search traffic, Naver visibility, or AI answer citations.
|
|
68
|
+
- optbrew asks for the URL first if it is missing. Then it checks the setup and sends all start questions in one message. The user can answer each number or reply "์์" (start) to accept the defaults.
|
|
69
|
+
- The audit then runs in one go and writes `report.html`, `report.md` and `report.json` to `optbrew-audit/<site>-<date>` in the working folder. The user opens `report.html` first.
|
|
70
|
+
- A Google API key is optional. It fills the real-visitor speed scores. The user saves it from their own terminal with `optbrew key set google` (or the `key.mjs` command that the key guide shows). Never ask the user to paste a key into the chat, and never read the key file.
|
|
71
|
+
|
|
72
|
+
## Update
|
|
73
|
+
|
|
74
|
+
1. Find the installed release: run `npx --yes optbrew@0.2.0 doctor --agents AGENTS --scope SCOPE --json` (add `--project PROJECT` for project scope) and read `release_version`.
|
|
75
|
+
2. Find the latest release: `npm view optbrew version`.
|
|
76
|
+
3. If they are equal, stop: nothing to update.
|
|
77
|
+
4. Otherwise run `npx --yes optbrew@latest update --scope SCOPE --json` (add `--project PROJECT` for project scope). Check: `"status": "updated"`. Then repeat step 5 with `optbrew@latest`.
|
|
78
|
+
|
|
79
|
+
If `update` stops with `migration_required`, the installed release scores with an older evaluation version and cannot be updated in place. Its scores are not comparable with the new release. Every managed 0.1.x install ends here when it is updated to 0.2.0. Tell the user that an output folder from a 0.1.x audit cannot be reused: the new release refuses it with one sentence, and the audit has to run again in a new folder. Reinstall it:
|
|
80
|
+
|
|
81
|
+
1. `git clone --depth 1 --branch v0.2.0 https://github.com/nowwcastle-sudo/optbrew optbrew-src` (needs git; use the tag of the release you install).
|
|
82
|
+
2. In `optbrew-src`, run the read-only check from https://github.com/nowwcastle-sudo/optbrew/blob/v0.2.0/docs/platforms.md#reinstall-after-a-migration_required-update: `node bin/optbrew.mjs reinstall-plan --scope SCOPE` (add `--project PROJECT` for project scope).
|
|
83
|
+
3. Show the user the printed `delete-link` and `delete-dir` paths and ask for approval. If the check refuses the install record, stop and show the user the message.
|
|
84
|
+
4. After approval, run the block from that section that matches the user's shell (PowerShell or Bash) and scope, from `optbrew-src`. It deletes only the printed paths, installs again and runs doctor.
|
|
85
|
+
|
|
86
|
+
## Troubleshooting
|
|
87
|
+
|
|
88
|
+
| Message | What to do |
|
|
89
|
+
|---|---|
|
|
90
|
+
| `running scripts is disabled` (PowerShell) | Use `npx.cmd` instead of `npx`. |
|
|
91
|
+
| `npx` cannot find `optbrew` | Check network access to the npm registry, then retry once. |
|
|
92
|
+
| `unmanaged optbrew target exists` | Stop. Show the path to the user and ask. |
|
|
93
|
+
| `bundle integrity failed` | Stop. Report the full message to the user. |
|
|
94
|
+
| `doctor` shows `hash_ok: false` | Read the doctor `warnings`. If one says `migration_required`, the install is an older release: follow [Update](#update). Otherwise someone edited the installed files: ask the user before you run `npx --yes optbrew@0.2.0 update --scope SCOPE --local-changes backup-and-replace --json`, which keeps a backup of the edited files. |
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,78 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
The beginner audit in one call. You answer one set of start questions, the agent runs the whole audit, and you get an HTML report in Korean with the fixes in order and the blanks explained.
|
|
6
|
+
|
|
7
|
+
### What you see
|
|
8
|
+
|
|
9
|
+
- **One call.** The agent checks your setup (`preflight.mjs`), sends the start questions in one message (one setup guide at most when something blocks the audit, plus up to three one-line offers), runs the audit with one command (`run.mjs`), judges the page text that code cannot judge, runs the same command again with `--judgments`, and hands you three reports: `report.html`, `report.md` and `report.json`. You answer once. The questions, guides and report are in Korean, and "์์" (start) takes every default.
|
|
10
|
+
- **Which pages.** The audit takes pages from the sitemap and from links on the start page, up to the limit you choose: 50 pages by default, up to 200. The limit counts every request, including redirects and the robots and sitemap files. The same site gives the same pages every time. An address that redirects to its `www` or `https` twin is followed, and the report says so. A redirect to a different site stops the run with one sentence.
|
|
11
|
+
- **Pages the site keeps out of the index.** A page with `noindex` that is not the home page and is missing from the site's own sitemap (a contact form, a thank-you page) is treated as meant that way: it gets no index, sitemap, crawler, title, canonical or Naver markup check and is no blocker. The run conditions list these pages. Without a sitemap that lists pages, a `noindex` stays a blocker.
|
|
12
|
+
- **Which engines.** Google is always a target. Naver is a target when a goal names it, when you give a Naver export, or when the site is Korean (`lang="ko"` or an address ending in `.kr`).
|
|
13
|
+
- **One fix per problem.** Pages with the same problem are one fix that lists how many pages it affects, instead of one finding per page. The fixes are sorted by what to do first.
|
|
14
|
+
- **Fixes the model judged.** A missing date, an unnamed operator or a claim with no source is worded in Korean from the message catalog, one fix per page: the problem (an answer-clarity fail names its question), the page, the text it cites, where to look, what to do, how much work, and how to check. The model's own reason stays in `report.json` as evidence.
|
|
15
|
+
- **Questions.** A page may answer several of your start questions, and a line every page repeats (a footer phone number) counts for a question when the model cites it for that question. A question with no answering page reads "not found within the pages read", never "the site lacks it".
|
|
16
|
+
- **Korean report.** Every sentence in `report.md` and `report.html` is Korean: the fixes and the remaining work. A few ids in the run conditions stay English, and so do JSON keys and ids. The HTML report is one self-contained file with no script and no outside request. Runbook steps are a plain numbered list. A step shows a screen drawing only where a runbook names the position, and no runbook does yet.
|
|
17
|
+
- **Speed scores.** Core Web Vitals of real visitors (LCP, INP, CLS) come from Google's Chrome UX Report and PageSpeed Insights when they have data. A free Google API key makes this work; without one those cells can stay blank, with the steps to get a key in the report. The lab values measured in your Chrome are shown as a run condition and are never scored.
|
|
18
|
+
- **Google key command.** `optbrew key set google`, `optbrew key status` and `optbrew key remove google` (or `node <skill folder>/scripts/key.mjs ...`). You run it in your own terminal with hidden input. The key is saved in `.optbrew/credentials.json` in your home folder, outside every project; `OPTBREW_GOOGLE_API_KEY` takes priority. It is sent to Google only in a request header and is never written to a report, a log or the evidence. The agent never asks for it in the chat.
|
|
19
|
+
- **Chrome.** The audit renders up to 10 pages, one of each kind, in a headless Chrome of its own, with a temporary profile that it removes at the end. Your running Chrome is never touched. The audit works through a proxy (`HTTPS_PROXY`); proxy credentials are never recorded. Without Chrome the render checks are blank, with the steps to install it.
|
|
20
|
+
- **Owner exports.** A Search Console zip and a Naver Search Advisor text file are read when you give their paths. Their numbers appear as actual outcomes and do not enter the score.
|
|
21
|
+
- **Setup guides (runbooks).** Step-by-step guides cover what needs your account or your machine: a Google API key and where to save it (your terminal, Codex, Claude Code cloud), Chrome, the two export files, network permission for Codex and Claude Code cloud, collecting visitor speed data inside your site, and the optional Anthropic and SE Ranking connections. The agent shows a full guide unasked only when something blocks the audit; every other guide appears when you ask for it, at the guidance level you picked.
|
|
22
|
+
- **Old output folders.** A folder or evidence packet from a 0.1.x run is refused with one sentence: run the audit again in a new folder. A finished folder, or one that holds files the audit did not write, is refused too.
|
|
23
|
+
|
|
24
|
+
### Versions
|
|
25
|
+
|
|
26
|
+
Release 0.2.0, evaluation 0.4.0 (was 0.3.0), audit protocol 0.2.0 (was 0.1.0), contract schema 2.0.0. Scores of different evaluation versions are not comparable: `compare` reports `not_comparable` against a 0.1.x baseline.
|
|
27
|
+
|
|
28
|
+
### Upgrading from 0.1.x
|
|
29
|
+
|
|
30
|
+
- A managed install of any 0.1.x release (0.1.2 and 0.1.3 were tested) stops `optbrew update` with `migration_required` and changes nothing. Replace it with the blocks in `docs/platforms.md`, "Reinstall after a migration_required update". They run the read-only `optbrew reinstall-plan` first and never touch your evidence.
|
|
31
|
+
- A plugin install from the marketplace follows `main`; the plugin update commands of your host are enough.
|
|
32
|
+
- Run the baseline audit again with 0.2.0 before you compare.
|
|
33
|
+
|
|
34
|
+
### Known limitations
|
|
35
|
+
|
|
36
|
+
- The one-call audit refuses private and local addresses; a local target can no longer be declared from the start questions.
|
|
37
|
+
- The fix step writes a change record for each edited file, but the 0.2.0 report does not read it, and a re-check after deploy does not update its `verification`; it stays `pending`. The re-check compares two audits (`cli.mjs compare`) and says what is resolved.
|
|
38
|
+
- Core Web Vitals field data can stay unknown: a site with few visitors has no Google data, and the `cwv-site-collection` guide explains how to collect it in the site itself.
|
|
39
|
+
- A runbook shows no screen drawing yet. A drawing appears only for a step that carries an explicit position tag.
|
|
40
|
+
|
|
41
|
+
### Release checks that stay with the owner
|
|
42
|
+
|
|
43
|
+
- The wording of the eli5 notice in `skills/optbrew/THIRD_PARTY_NOTICES.md`: its licence text was reconstructed because upstream has no licence file and no year. Decide the wording before the release is published. The caveman notice is copied from the installed 4.0.1 package.
|
|
44
|
+
- After the merge: the claude.ai copy shows the merge commit (a check that waits for the sync). A directory review result does not block the release.
|
|
45
|
+
- The steps in `docs/release.md`: CI on the merge commit, the tag, the GitHub Release and `npm publish` are run by the owner, not by an agent.
|
|
46
|
+
|
|
47
|
+
### Carried over from the unreleased 0.1.4
|
|
48
|
+
|
|
49
|
+
- The Claude marketplace now serves the `skills/` folder (new `skills/.claude-plugin/plugin.json`) instead of the repository root, because claude.ai, Claude Desktop and Cowork refuse a plugin with a top-level `bin/` folder and the marketplace sync failed. The marketplace entry and the served manifest pin no version, so every commit is picked up by marketplace sync. Claude Code installs keep the name `optbrew@optbrew` and the skill `/optbrew:optbrew`.
|
|
50
|
+
- No `.gitattributes` at the repository root or inside `skills/`. The Claude plugin directory refuses one there whatever its lines say, `* -text` included, so the root file is gone. `tests/` and `docs/` keep their own `* -text`, because the test fixtures, evidence hashes and the documented shell blocks need exact bytes. A test rejects a `.gitattributes` at the root or inside `skills/`, and every file is still committed with LF.
|
|
51
|
+
- Bundle hashes ignore the line endings a checkout adds. With `core.autocrlf=true` (the Git for Windows default) a Claude Code plugin install from the marketplace checks the skill out with CRLF. `bundle.mjs` and `score.mjs` now hash a file without a NUL byte as its LF form, so `doctor`, `install` and scoring accept that copy; LF files keep their old hashes and binary files hash as is. The ZIP and npm verifiers still compare exact bytes, so releases are built from a `core.autocrlf=false` clone (`docs/release.md`).
|
|
52
|
+
- `docs/release.md` adds two steps: publish a GitHub Release for each tag and read it back, and confirm that the webhook got a push for `refs/heads/main` with the merge commit (a branch deletion is answered `ignored_delete` and does not sync).
|
|
53
|
+
- The served `skills/` folder is a complete directory plugin: `skills/README.md` describes what the plugin runs, reads and sends, and `skills/.claude-plugin/plugin.json` adds `displayName`, `homepage`, `repository`, `license`, `keywords` and a 1024 px icon (`skills/.claude-plugin/icon.png`). Submit to the Claude directory with plugin path `skills`, so the scan reads only the plugin and not the repository's CLI, tests and npm files. A test checks the directory's README, license, icon, file-size and file-count rules.
|
|
54
|
+
|
|
55
|
+
## 0.1.3
|
|
56
|
+
|
|
57
|
+
Resolves the seven known limitations listed under 0.1.2.
|
|
58
|
+
|
|
59
|
+
- Evaluation version 0.3.0 (was 0.2.0; protocol stays 0.1.0 because its source files are unchanged). The discovery and fact observations change, so 0.1.2 and 0.1.3 scores are not comparable: `compare()` returns `not_comparable` for a 0.1.2 baseline against 0.1.3 inputs. Run the baseline audit again with 0.1.3.
|
|
60
|
+
- A managed install of 0.1.2 cannot be updated to 0.1.3. The updater guard is unchanged, so `optbrew update` stops with `migration_required` and changes nothing. Replace the install with the copy-paste blocks in `docs/platforms.md` ("Reinstall after a migration_required update"; the READMEs link there); they run the read-only `optbrew reinstall-plan` first. Audit evidence from 0.1.2 has no hashed failure records and is refused by 0.1.3 report replay with an "older optbrew release" error.
|
|
61
|
+
- The request limit is a hard ceiling again. Every request, each redirect hop included, takes one budget slot immediately before it is sent, so the total never exceeds `max_urls` (the 0.1.2 overshoot of up to concurrency x min(10, `max_urls`) requests is gone). A redirect chain the limit stops leaves its URL as a `request_limit` unknown and keeps the hops it already received. A failed fetch now writes a hashed `<sha256>.failure.json` record (answered redirect hops plus whether one more attempt got no response; listed in `failures` in the audit index), and report replay checks the ledger entry against it. An honest run that reaches the limit inside a redirect chain therefore replays, and a limit claim is accepted only when the recorded requests use the whole limit.
|
|
62
|
+
- Report replay rejects a URL that appears in more than one ledger entry, so duplicate failed-fetch entries for already fetched linked URLs can no longer prove a false request limit.
|
|
63
|
+
- Orphan pages are decided in steps. An unlinked page is an orphan unless another collected page's own bytes (inline scripts included) name its path as a whole path, or a script-only page loads a same-origin script file that was not collected; a fetched sitemap that lists other pages and leaves the page out still proves the orphan. A script-only widget page that never mentions the orphan no longer hides it.
|
|
64
|
+
- Phone extraction reads a national number written with spaces only (`02 555 0142`) and Korean nationwide representative numbers (15xx, 16xx and 18xx plus four digits) in labelled fields, `tel:` links and JSON-LD `telephone`. Prose, dates, fax numbers and a spaced number followed by more digits stay unread.
|
|
65
|
+
- A page is a separate entity only on structural evidence: JSON-LD `branchOf`, `parentOrganization` or another `@id`, a branch-list URL path (`/branch/`, `/branches/`, `/locations/`, `/stores/`, `/์ง์ /`), or the word branch, ์ง์ or ์ง์ฌ in the title or first heading together with an address of its own. A title word alone no longer hides a wrong phone or address.
|
|
66
|
+
- The Naver crawler token `Yeti` is confirmed against Naver's robots.txt guide, read again on 2026-10-15 (page text sha256 `ff8ddc85c5dd42e0d1133abae6928fb9b42f67f35d1b2c89b40378009571ed49`); `ai-crawlers.json` and `ai-crawlers.md` carry the source, the date and the hash.
|
|
67
|
+
- Five install routes in the README: npm, npx, a pinned PowerShell installer (`install.ps1`, which reads `doctor` and stops on a failed check), Claude Code and Codex plugins (marketplace `optbrew`, so the plugin is `optbrew@optbrew`; Codex reads `.agents/plugins/marketplace.json`), and a prompt that hands an agent the new step-by-step `AGENT_INSTALL.md`. The READMEs were rewritten around why, how it works and installation; checkout commands and the reinstall blocks moved to `docs/platforms.md`. New `CONTRIBUTING.md`.
|
|
68
|
+
- Seeded-defect detection on the frozen answer key: 29 of 61 detected (0.1.2: 28), 2 module-only, no new failure on a clean control page; the orphan page (SEO-12) is detected again. See `docs/validation/detection-0.1.3.md` (repository only).
|
|
69
|
+
|
|
70
|
+
### Known limitations
|
|
71
|
+
|
|
72
|
+
- An inline script that builds a URL from pieces can hide the link from the orphan check, so such a page is reported as an orphan although the script links it.
|
|
73
|
+
- Report replay checks that evidence files agree with each other and with their hashes. Someone who rewrites the collection, the ledger, the hashed records and the audit index together can still make a coherent false run; the failure-record chain length is bounded (at most eleven answered hops per failed fetch), a URL can appear once, and every failed fetch or skipped URL needs provenance, which limits how far such an edit can pad the request total.
|
|
74
|
+
- Phone extraction does not read numbers shorter than nine digits other than the 15xx, 16xx and 18xx representative numbers, nor national numbers separated by spaces outside a label.
|
|
75
|
+
|
|
3
76
|
## 0.1.2
|
|
4
77
|
|
|
5
78
|
- The report headline no longer lets a measured score read as a complete one. Each headline score carries its coverage; below the 80% coverage rule the single number is withheld and the report shows `insufficient coverage` with the measured-subset value and the missing-data bounds (`report.json` `headline[]`).
|
|
@@ -20,7 +93,7 @@
|
|
|
20
93
|
- `build-release` writes `bundle-manifest.json` through the same temporary file and rename as `build-bundle`, and the release tests build on a private copy of the tree.
|
|
21
94
|
- Not scripted yet: the `robots.txt` Sitemap line, og:image size, hreflang, JavaScript-only navigation, answer structure, claim support, authorship and freshness.
|
|
22
95
|
|
|
23
|
-
### Known limitations
|
|
96
|
+
### Known limitations (all resolved in 0.1.3)
|
|
24
97
|
|
|
25
98
|
- Report replay does not reject a URL that appears in more than one ledger entry, so adding failed-fetch duplicates of already fetched linked URLs to `collection.json`, `ledger.json` and the audit index can prove a false request limit and turn a discovery failure into `unknown`; this needs deliberate edits to local evidence files.
|
|
26
99
|
- A run that reaches the request limit while a failed fetch was following redirects can record fewer requests than the limit, and report replay then refuses it as unprovable; run the audit again.
|
package/README.ko.md
CHANGED
|
@@ -1,149 +1,173 @@
|
|
|
1
1
|
# optbrew
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/optbrew)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
|
|
3
6
|
[English](README.md)
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
์ฝ๋ฉ ์์ด์ ํธ์ฉ ๊ฒ์ ์ค๋น๋ ๊ฐ์ฌ ์คํฌ์
๋๋ค. optbrew๋ ๊ตฌ๊ธยท๋ค์ด๋ฒยทAI ๋ต๋ณ ์์ง ๊ธฐ์ค์ผ๋ก ์ฌ์ดํธ๋ฅผ ์ ๊ฒํฉ๋๋ค. ์น์ธํ ๋ก์ปฌ ํ์ผ๋ง ๊ณ ์น๊ณ , ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ๋ค์ ํ์ธํ ๋ค, ๋ค์ ๊ณ์ฐํ ์ ์๋ ๊ทผ๊ฑฐ๋ก ์ ์ ๋ณด๊ณ ์๋ฅผ ์๋๋ค.
|
|
9
|
+
|
|
10
|
+
- ์คํฌ ํ๋๋ก ๋ค์ฏ ๊ฐ์ง๋ฅผ ๋ด
๋๋ค: **SEO**, **NEO**(๋ค์ด๋ฒ), **AEO**, **GEO**, **LLMO**.
|
|
11
|
+
- ์ด๋ณด์๋ ํ ๋ฒ์ ๋๋
๋๋ค. ์์ ์ง๋ฌธ์ ํ ๋ฒ ๋ตํ๋ฉด ์์ด์ ํธ๊ฐ ๊ฐ์ฌ ์ ์ฒด๋ฅผ ๋๋ฆฌ๊ณ HTML ๋ณด๊ณ ์๋ฅผ ๊ฑด๋ค ์ค๋๋ค.
|
|
12
|
+
- ๊ณ ์ ๋ ๊ฐ์ฌ ๊ฐ์ด๋ ๋ฌถ์ 5๊ฐ๋ฅผ ์ ๊ฒ ํญ๋ชฉ 22๊ฐ๋ก ํฉ์ณค์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ด๋๊ฐ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ง์ด๋ ํ ๋ฒ๋ง ์
๋๋ค.
|
|
13
|
+
- ๋ณด๊ณ ์์ ํ์ ์ ๋ชจ๋ ์์งํ ์๋ณธ ์๋ต(ํด์ ๊ธฐ๋ก)์์ ๋ค์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
|
|
14
|
+
- ๊ทผ๊ฑฐ๊ฐ ๋ชจ์๋ผ๋ฉด ๋ํ ์ ์๋ฅผ ๋ด์ง ์์ต๋๋ค. ์ธก์ ๋ฒ์๊ฐ 80% ๋ฏธ๋ง์ด๋ฉด ์ฐ ๋ถ๋ถ๊ณผ ๊ทธ ๋ฒ์๋ง ๋ณด์ฌ ์ค๋๋ค.
|
|
15
|
+
- Codex, Claude Code, Cursor, OpenCode, Pi์์ ์๋๋ค. ์ ์ ๊ณ์ฐ๊ณผ ๋ณด๊ณ ์์๋ API ๊ณ์ ์ด ํ์ ์์ต๋๋ค.
|
|
16
|
+
|
|
17
|
+
## ์ optbrew์ธ๊ฐ
|
|
18
|
+
|
|
19
|
+
์ด์ ใ๊ฒ์์ ์กํ๋คใ๋ ๋ง์ ์ธ ๊ฐ์ง๋ฅผ ๋ปํฉ๋๋ค. ๊ตฌ๊ธ ์์, ๋ค์ด๋ฒ ๋
ธ์ถ, AI ๋ต๋ณ ์ ์ธ์ฉ์
๋๋ค. ์
๋ค ๊ฐ์ด๋๊ฐ ๋ฐ๋ก ์๊ณ , ๊ฐ์ด๋๋ผ๋ฆฌ ๊ฒน์น๊ฑฐ๋ ์๋ก ๋ค๋ฅธ ๋ง์ ํฉ๋๋ค. ์์ด์ ํธ์๊ฒ ใSEO ๊ฐ์ ํด ์คใ๋ผ๊ณ ํ๋ฉด ๋ณดํต ์ฒดํฌ๋ฆฌ์คํธ ํ๋๋ฅผ ๊ณจ๋ผ ํ์ผ์ ๊ณ ์น๊ณ , ๊ทผ๊ฑฐ ์์ด ๋๋ฌ๋ค๊ณ ๋ณด๊ณ ํฉ๋๋ค.
|
|
20
|
+
|
|
21
|
+
optbrew๋ ๋ค์ฏ ๊ธฐ์ค ๋ชจ๋์ ๊ฐ์ ์์
์์์ ๊ฐ์ ์ฑ์ ๊ท์น์ ์๋๋ค. ์ฐ ๊ฒ๋ง ์ ์์ ๋ฃ๊ณ , ์ฌ์ง ๋ชปํ ๊ฒ์ ํต๊ณผ๊ฐ ์๋๋ผ ใ์ ์ ์์ใ์ผ๋ก ๋จ๊น๋๋ค. ๋ก์ปฌ์์ ๊ณ ์น ๊ฒ๊ณผ ์ค์ ์ด์ ๊ฒฐ๊ณผ๋ ๋ฐ๋ก ์ ์ต๋๋ค. ์ค๋น๋ ์ ์๊ฐ ๋์๋ ๋ฐฉ๋ฌธ์๋ ์ธ์ฉ์ด ๋๋ค๋ ๋ณด์ฅ์ ์์ผ๋ฉฐ, ๋ณด๊ณ ์์๋ ๊ทธ๋ ๊ฒ ์ ํ๋๋ค.
|
|
6
22
|
|
|
7
|
-
|
|
23
|
+
## ๋์ ๋ฐฉ์
|
|
24
|
+
|
|
25
|
+
1. **์ง๋ฌธ.** URL์ ์๋ ค ์ฃผ๋ฉด optbrew๊ฐ ์์ ์ชฝ, ์ฌ์ดํธ๋งต, ์ฌ์ฉ์์ ํ๊ฒฝ(ํฌ๋กฌ, ๊ตฌ๊ธ ํค, ๋คํธ์ํฌ)์ ์ฝ์ต๋๋ค. ๊ทธ๋ค์ ์์ ์ง๋ฌธ์ ํ ๋ฉ์์ง๋ก ๋ณด๋
๋๋ค. ์๋ด ์์ค, ๋ชฉํ, ์ฌ๋๋ค์ด ์ฐพ์ ์ง๋ฌธ, ์ฌ์ดํธ์์ ์ฝ์ ์ฌ์ค, ์ชฝ์ ์ํ์ ๋ฌป์ต๋๋ค. ๋ฒํธ๋ง๋ค ๋ตํ๊ฑฐ๋ ใ์์ใ๋ง ๋ตํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ๋๋ค. ๋คํธ์ํฌ๊ฐ ๋งํ ์๋ ๊ฒ์ฒ๋ผ ๊ฐ์ฌ๋ฅผ ๋ง๋ ์ผ์ด ํ๋ ์์ผ๋ฉด ์ค์ ์๋ด๋ฅผ ๋จผ์ ๋ณด์ฌ ์ค๋๋ค. ๊ทธ ๋ฐ์ ์๋ด๋ ํ ์ค์ง๋ฆฌ ์ ์์ผ๋ก ์ต๋ ์ธ ๊ฐ๊น์ง ๋์ค๊ณ , ๊ทธ ๋จ์ด๋ก ๋ตํ๋ฉด ์ด๋ฆฝ๋๋ค.
|
|
26
|
+
2. **๊ฐ์ฌ.** ๋ช
๋ น ํ ๋ฒ์ผ๋ก ์์ง, ํ์ด์ง ์ข
๋ฅ๋ง๋ค ํ ์ชฝ์ฉ ์ต๋ 10์ชฝ์ ์ ์ฉ ํค๋๋ฆฌ์ค ํฌ๋กฌ์ผ๋ก ๋ ๋๋ง, ์๋ ์ธก์ , ์ฝ๋ ํ์ ์ ๋๋
๋๋ค. ์ฌ์ดํธ๋งต๊ณผ ์์ ์ชฝ์ ๋งํฌ์์ ์ชฝ์ ๊ณจ๋ผ ์ํ๊น์ง ๊ฐ์ฌํฉ๋๋ค. ๊ธฐ๋ณธ์ 50์ชฝ์ด๊ณ ์ฌ๋ฆฌ๋ฉด ์ต๋ 200์ชฝ์
๋๋ค. ์ํ์ ๋ชจ๋ ์์ฒญ์ ์ธ๋ฏ๋ก ๋ฆฌ๋ค์ด๋ ํธ์ robotsยท์ฌ์ดํธ๋งต ํ์ผ๋ ํ๋๋ฅผ ์๋๋ค. ์ฃผ์๊ฐ `www`๋ `https` ์๋ฅ์ด ์ฃผ์๋ก ๋์ด๊ฐ๋ฉด ๋ฐ๋ผ๊ฐ๊ณ , ๋ณด๊ณ ์์ ๊ทธ๋ ๊ฒ ์ ์ต๋๋ค. ์๋ต๋ง๋ค ํด์์ ํจ๊ป ์ ์ฅํฉ๋๋ค.
|
|
27
|
+
3. **ํ์ .** ์ฝ๋๊ฐ ํ์ ํ ์ ์๋ ๊ธ ๋ด์ฉ(์ฃผ์ฅ, ๋ต์ ๋ช
ํ์ฑ, ์ต์ ์ฑ ๋ฑ)์ ์์ด์ ํธ๊ฐ ์ฝ๊ณ ํ์ ํฉ๋๋ค. ๊ทผ๊ฑฐ๋ก ์ผ์ ๋ฌธ์ฅ์ ์ธ์ฉํ๊ณ , ๊ฐ์ ๋ช
๋ น์ ํ ๋ฒ ๋ ์คํํ๋ฉด ์ธ์ฉํ ๊ธ์ด ์ฆ๊ฑฐ ์์ ์ค์ ๋ก ์๋์ง ํ์ธํ ๋ค ์ ์๋ฅผ ๋
๋๋ค.
|
|
28
|
+
4. **๋ณด๊ณ .** ๋ด์ฉ์ด ๊ฐ์ ํ์ผ ์
์ด ๋์ต๋๋ค. `report.html`(๋จผ์ ์ฌ์ญ์์ค. ํ์ผ ํ๋๋ก ์๊ฒฐ๋ฉ๋๋ค), `report.md`, `report.json`์
๋๋ค. ๊ธ์ ํ๊ตญ์ด์
๋๋ค. ๋ฌธ์ ๋ง๋ค ๊ณ ์น ๊ฒ์ด ํ๋์ด๊ณ ์ํฅ์ ์ฃผ๋ ์ชฝ์๊ฐ ๋ถ์ต๋๋ค. ๊ตฌ๊ธ ํค๊ฐ ์์ ๋์ฒ๋ผ ๋น์ด ์๋ ์นธ์ ๋ฒํธ๋ฅผ ๋งค๊ธด ๋จ๊ณ๋ก ์ฑ์ฐ๋ ๋ฒ์ ์๋ ค ์ค๋๋ค. ๋น์ด ์๋ ์นธ์ ํต๊ณผ๊ฐ ์๋๋ผ ใ์ ์ ์์ใ์ผ๋ก ๋ณด์
๋๋ค.
|
|
29
|
+
5. **์์ ๊ณผ ์ฌํ์ธ(์ ํ).** ์์ด์ ํธ๊ฐ ๋ก์ปฌ ํ์ผ ์์ ์์ ๋
๋๋ค. ์น์ธ ์์ด ๊ณ ์น๊ฑฐ๋ ๋ฐฐํฌํ๊ฑฐ๋ ๊ฒ์์์ง์ ์ ์ถํ์ง ์์ต๋๋ค. ๋ฐฐํฌํ ๋ค์๋ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ๋ค์ ์์งํฉ๋๋ค. ๊ทธ๋์ ์์ ์ ํ๋ฅผ ๋น๊ตํ ์ ์์ต๋๋ค.
|
|
30
|
+
|
|
31
|
+
์คํฌ๋ฆฝํธ๊ฐ ์ง์ ์ฌ๋ ๊ฒ๊ณผ ๊ฐ์ด๋ยท์์ด์ ํธ ํ๋จ์ ๋งก๊ธฐ๋ ๊ฒ์ ์ด๋ ๊ฒ ๋๋ฉ๋๋ค.
|
|
32
|
+
|
|
33
|
+
| ๊ธฐ์ค | ๋์ | ์คํฌ๋ฆฝํธ๊ฐ ์ฌ๋ ๊ฒ | ํ๋จ์ ๋งก๊ธฐ๋ ๊ฒ |
|
|
34
|
+
|---|---|---|---|
|
|
35
|
+
| SEO | ๊ตฌ๊ธ๊ณผ ์น ๊ฒ์ | ์๋ต ์ํ, meta์ `X-Robots-Tag`์ `noindex`, ์ ๋ชฉ, Googlebot์ฉ robots.txt, canonical, ๋ฆฌ๋ค์ด๋ ํธ ๋จ๊ณ, ๋งํฌยท์ฌ์ดํธ๋งต์ผ๋ก ์ฐพ์ ์ ์๋์ง, JSON-LD ๋ฌธ๋ฒ | ์ฝํ
์ธ ํ์ง, ๊ฒ์ ์๋์ ๋ง๋์ง |
|
|
36
|
+
| NEO | ๋ค์ด๋ฒ | Yeti์ฉ robots.txt, Open Graph, description, canonical, viewport, ์ ๋ชฉ ๋ฐ๋ณต, ๋งํ CSSยทJS | ๋ค์ด๋ฒ ์ฝํ
์ธ ๊ฐ์ด๋ |
|
|
37
|
+
| AEO, GEO | ๋ต๋ณ ์์ง๊ณผ AI ๊ฒ์ | [ai-crawlers.md](skills/optbrew/references/ai-crawlers.md)์ ์ ์ AI ๊ฒ์ ๋ด์ฉ robots.txt(ํ์ต์ฉ ๋ด์ ์ฑ์ ํ์ง ์์) | ๋ต๋ณ ๊ตฌ์กฐ, ์ฃผ์ฅ, ์์ฑ์, ์ต์ ์ฑ |
|
|
38
|
+
| LLMO | AI๊ฐ ์ฐ๋ฆฌ๋ฅผ ์ค๋ช
ํ๋ ๋ฐฉ์ | ์ํธยท์ฃผ์ยท์ ํยท์ค๋ฆฝ ์ฐ๋๊ฐ ํ์ด์ง๋ผ๋ฆฌ ์ผ์นํ๋์ง, ํ์ด์ง๋ค์ด ํ ์
์ฒด๋ฅผ ์ค๋ช
ํ๋์ง | ๊ทธ ์ฌ์ค์ด ๋ง๋์ง |
|
|
39
|
+
| ์ ์ฒด | ์๋์ ์คํฌ๋ฆฝํธ | ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ ๋ค์๋ ๊ธ์ด ๋ณด์ด๋์ง(ํฌ๋กฌ). ๊ตฌ๊ธ Chrome UX Report์ PageSpeed Insights์ ๋ฐฉ๋ฌธ์ ์ค์ธก ์ ์(LCP, INP, CLS) | ์์. ํฌ๋กฌ์ผ๋ก ์ฐ ์คํ์ค ๊ฐ์ ์คํ ์กฐ๊ฑด์ผ๋ก๋ง ๋ณด์ด๊ณ ์ฑ์ ํ์ง ์์ต๋๋ค |
|
|
40
|
+
|
|
41
|
+
์์ง๋ณ ๊ฒ์ฌ๋ ๋์์ผ๋ก ๋ฐํ ์์ง์๋ง ์ ์ฉ๋ฉ๋๋ค. ChatGPTยทClaudeยทPerplexity์ฒ๋ผ ์ ๊ฒฝ ์ฐ๋ AI ๋ต๋ณ ์์ง์ ์๋ ค ์ฃผ์ญ์์ค. ๋ชฉํ์ ๋ค์ด๋ฒ๊ฐ ๋ค์ด ์๊ฑฐ๋, ๋ค์ด๋ฒ ๋ด๋ณด๋ด๊ธฐ ํ์ผ์ ์ฃผ์๊ฑฐ๋, ์ฌ์ดํธ๊ฐ ํ๊ตญ์ด(`lang="ko"` ๋๋ `.kr`๋ก ๋๋๋ ์ฃผ์)์ด๋ฉด ๋ค์ด๋ฒ๋ ์ ์ ๋ก ๋์์ด ๋ฉ๋๋ค. ๊ตฌ๊ธ์ ํญ์ ๋์์
๋๋ค. ์ฑ์ ๊ท์น์ [scoring.md](skills/optbrew/references/scoring.md)์ ์์ต๋๋ค. ์ธก์ ๋ฒ์ 80% ๊ธฐ์ค์ optbrew๊ฐ ์ ํ ๊ท์น์ด๋ฉฐ, ๊ฒ์์์ง ํ์ค์ด ์๋๋๋ค.
|
|
8
42
|
|
|
9
43
|
## ์ค์น
|
|
10
44
|
|
|
11
|
-
Node.js 22 ์ด์์ด ํ์ํฉ๋๋ค. ๋ด๋ถ Python ๊ฐ์ฌ
|
|
45
|
+
[Node.js](https://nodejs.org) 22 ์ด์์ด ํ์ํฉ๋๋ค. Python 3.10 ์ด์์ ์ ํ์
๋๋ค. ์์ผ๋ฉด ๋ด๋ถ Python ๊ฐ์ฌ ๋๊ตฌ๋ง ์คํํ์ง ์์ต๋๋ค. ์๋ ๋ค์ฏ ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ๊ณ ๋ฅด์ญ์์ค. ์์๋ Codex์ Claude Code์ ์ฌ์ฉ์ ๋ฒ์๋ก ์ค์นํฉ๋๋ค. ์์ด์ ํธ ID๋ `codex`, `claude-code`, `cursor`, `opencode`, `pi`์
๋๋ค.
|
|
12
46
|
|
|
13
|
-
|
|
47
|
+
Windows PowerShell์์ `npx`๋ `optbrew`๊ฐ ใ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์์ต๋๋คใ๋ผ๊ณ ํ๋ฉด `npx.cmd`, `optbrew.cmd`๋ก ๋ฐ๊ฟ ์
๋ ฅํ์ญ์์ค.
|
|
14
48
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
49
|
+
### 1. npm
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install -g optbrew@0.2.0
|
|
53
|
+
optbrew install --agents codex,claude-code --scope user --dry-run
|
|
54
|
+
optbrew install --agents codex,claude-code --scope user
|
|
55
|
+
optbrew doctor --agents codex,claude-code --scope user
|
|
19
56
|
```
|
|
20
57
|
|
|
21
|
-
|
|
58
|
+
๋ฏธ๋ฆฌ๋ณด๊ธฐ(`--dry-run`)๋ ์ธ ํด๋๋ฅผ ๋ณด์ฌ ์ค๋๋ค. `doctor`๋ ํ์ผ๊ณผ ํด์๋ฅผ ํ์ธํฉ๋๋ค.
|
|
22
59
|
|
|
23
|
-
|
|
60
|
+
### 2. npx
|
|
24
61
|
|
|
25
|
-
|
|
62
|
+
์ ์ญ ์ค์น ์์ด ๊ฐ์ CLI๋ฅผ ์คํํฉ๋๋ค.
|
|
26
63
|
|
|
27
|
-
|
|
64
|
+
```bash
|
|
65
|
+
npx optbrew@0.2.0 install --agents codex,claude-code --scope user
|
|
66
|
+
npx optbrew@0.2.0 doctor --agents codex,claude-code --scope user
|
|
67
|
+
```
|
|
28
68
|
|
|
29
|
-
|
|
69
|
+
### 3. PowerShell (Windows)
|
|
30
70
|
|
|
31
|
-
|
|
71
|
+
```powershell
|
|
72
|
+
irm https://raw.githubusercontent.com/nowwcastle-sudo/optbrew/v0.2.0/install.ps1 | iex
|
|
73
|
+
```
|
|
32
74
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
75
|
+
์ด ์คํฌ๋ฆฝํธ๋ ์ด๋ฒ ๋ฒ์ ์ ๊ณ ์ ๋ผ ์์ต๋๋ค. Node.js๋ฅผ ํ์ธํ๊ณ , ์ค์นํ ํด๋๋ฅผ ๋ณด์ฌ ์ฃผ๊ณ , Codex์ Claude Code์ ์ค์นํฉ๋๋ค. `doctor`๊ฐ ๋ฌธ์ ๋ฅผ ์ฐพ์ผ๋ฉด ์ค๋ฅ๋ก ๋ฉ์ถฅ๋๋ค. ๋จผ์ ์ฝ์ด ๋ณด๊ฑฐ๋ ์์ด์ ํธยทํ๋ก์ ํธ ํด๋๋ฅผ ๊ณ ๋ฅด๋ ค๋ฉด ์ด๋ ๊ฒ ์คํํฉ๋๋ค.
|
|
76
|
+
|
|
77
|
+
```powershell
|
|
78
|
+
irm https://raw.githubusercontent.com/nowwcastle-sudo/optbrew/v0.2.0/install.ps1 -OutFile install.ps1
|
|
79
|
+
powershell -ExecutionPolicy Bypass -File .\install.ps1 -Agents codex,claude-code,cursor
|
|
37
80
|
```
|
|
38
81
|
|
|
39
|
-
|
|
82
|
+
ํ ํ๋ก์ ํธ์๋ง ์ค์นํ๋ ค๋ฉด `-Scope project -Project C:\path\to\site`๋ฅผ ๋ถ์
๋๋ค.
|
|
40
83
|
|
|
41
|
-
|
|
84
|
+
### 4. ํ๋ฌ๊ทธ์ธ
|
|
42
85
|
|
|
43
|
-
|
|
86
|
+
Claude Code:
|
|
44
87
|
|
|
45
|
-
|
|
88
|
+
```bash
|
|
89
|
+
claude plugin marketplace add nowwcastle-sudo/optbrew
|
|
90
|
+
claude plugin install optbrew@optbrew
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Codex:
|
|
46
94
|
|
|
47
|
-
|
|
95
|
+
```bash
|
|
96
|
+
codex plugin marketplace add nowwcastle-sudo/optbrew
|
|
97
|
+
codex plugin add optbrew@optbrew
|
|
98
|
+
```
|
|
48
99
|
|
|
49
|
-
|
|
100
|
+
claude.ai, Claude Desktop, Cowork: Customize > Plugins์์ Add > Add marketplace๋ฅผ ๊ณ ๋ฅด๊ณ `nowwcastle-sudo/optbrew`๋ฅผ ์
๋ ฅํ ๋ค `optbrew`๋ฅผ ์ถ๊ฐํฉ๋๋ค.
|
|
50
101
|
|
|
51
|
-
|
|
102
|
+
ํ๋ฌ๊ทธ์ธ์ ์ด ์ ์ฅ์์ `main` ๋ธ๋์น๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ์
๋ฐ์ดํธ๋ ๊ฐ ํธ์คํธ์ ํ๋ฌ๊ทธ์ธ ๋ช
๋ น์ด๋ ๋ง์ผํ๋ ์ด์ค ๋๊ธฐํ๋ก ํฉ๋๋ค.
|
|
52
103
|
|
|
53
|
-
|
|
104
|
+
### 5. ์์ด์ ํธ์๊ฒ ๋งก๊ธฐ๊ธฐ
|
|
54
105
|
|
|
55
|
-
|
|
106
|
+
Codex, Claude Code ๊ฐ์ ์ฝ๋ฉ ์์ด์ ํธ์ ์๋ ๊ธ์ ๋ถ์ฌ ๋ฃ์ผ์ญ์์ค.
|
|
56
107
|
|
|
57
|
-
|
|
108
|
+
```text
|
|
109
|
+
optbrew ์คํฌ์ ์ค์นํด ์ค. https://raw.githubusercontent.com/nowwcastle-sudo/optbrew/v0.2.0/AGENT_INSTALL.md ๋ฅผ ์ฝ๊ณ ๋จ๊ณ๋๋ก ๋ฐ๋ผ ํด. ์ด๋ ์์ด์ ํธ์, ์ด๋ ๋ฒ์๋ก ์ค์นํ ์ง ๋จผ์ ๋ฌป๊ณ , ์ค์น ์ ์ ๋ฐ๋ ๋ด์ฉ์ ๋ณด์ฌ ์ค.
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
[AGENT_INSTALL.md](AGENT_INSTALL.md)๋ ๋จ๊ณ๋ง๋ค ์คํํ ๋ช
๋ น๊ณผ ํต๊ณผ ๊ธฐ์ค, ๋ฉ์ถ๊ณ ์ฌ์ฉ์์๊ฒ ๋ฌผ์ด์ผ ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ด ๋ ์์ด์ ํธ์ฉ ์๋ด์์
๋๋ค.
|
|
58
113
|
|
|
59
|
-
|
|
114
|
+
์์ค checkout์์ ์ค์นํ๊ธฐ, Agent Skills CLI, Pi ํจํค์ง, Claude ์น ์
๋ก๋๋ [ํ๋ซํผ ์๋ด](docs/platforms.md)์ ์์ต๋๋ค.
|
|
60
115
|
|
|
61
|
-
|
|
116
|
+
## ๋น ๋ฅธ ์์
|
|
62
117
|
|
|
63
|
-
|
|
118
|
+
์ ์์ด์ ํธ ์ธ์
์ ์ด๊ณ ์ด๋ ๊ฒ ์์ฒญํฉ๋๋ค.
|
|
64
119
|
|
|
65
120
|
```text
|
|
66
|
-
|
|
67
|
-
node bin/optbrew.mjs update --scope project --project ./site --json
|
|
68
|
-
node bin/optbrew.mjs rollback --scope project --project ./site --release-version 0.1.0 --json
|
|
121
|
+
https://example.com ์ optbrew ๋๋ ค ์ค. ๋ชฉํ: ๋ค์ด๋ฒ ๋
ธ์ถ, AI ๋ต๋ณ ์ธ์ฉ.
|
|
69
122
|
```
|
|
70
123
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
### migration_required ๋ค ์ฌ์ค์น
|
|
74
|
-
|
|
75
|
-
0.1.2๋ ํ๊ฐ ๋ฒ์ 0.2.0์ ์ฌ์ฉํฉ๋๋ค(0.1.1์ 0.1.0). ๊ทธ๋์ 0.1.1๋ก ๋ง๋ ์ ์์ ๊ธฐ์ค์ ์ 0.1.2์ ๋น๊ตํ ์ ์๊ณ `compare`๋ `not_comparable`์ ๋ฐํํฉ๋๋ค. ๊ธฐ์ค์ ๊ฐ์ฌ๋ 0.1.2๋ก ๋ค์ ์คํํ์ญ์์ค. ๊ฐ์ ์ด์ ๋ก ๊ด๋ฆฌ ์ค์ธ 0.1.1 ์ค์น์์ `optbrew update`๋ฅผ ์คํํ๋ฉด `migration_required`๋ก ๋ฉ์ถ๊ณ ์๋ฌด๊ฒ๋ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ, ๋ฉ์์ง์ ๊ฒฝ๋ก์ ๋ช
๋ น์ด ๋์ต๋๋ค. `uninstall` ๋ช
๋ น์ ์์ต๋๋ค. 0.1.2 ์ ์ฅ์ ๋ฃจํธ์์ ์๋ ๋ธ๋ก์ผ๋ก ๊ต์ฒดํฉ๋๋ค. ๊ฐ ๋ธ๋ก์ ๋จผ์ ์ฝ๊ธฐ ์ ์ฉ `reinstall-plan`์ ์คํํด ์ค์น ๊ธฐ๋ก์ ๊ฒ์ฆํ๊ณ (๋ชจ๋ ๋์์ด ์ ํํ ํด๋น ์์ด์ ํธ์ `skills/optbrew` ๊ฒฝ๋ก์ฌ์ผ ํฉ๋๋ค) ๋ณ์กฐ๋ ๊ธฐ๋ก์ด๋ฉด ์๋ฌด๊ฒ๋ ์ง์ฐ๊ธฐ ์ ์ ๊ฑฐ์ ํฉ๋๋ค. ์ดํ ์
ธ์ ๊ทธ ๋ช
๋ น์ด ์ถ๋ ฅํ ๊ฒฝ๋ก๋ง, ๋์์ ๋จผ์ ์ง์ฐ๊ณ ๊ด๋ฆฌ ๋ฃจํธ๋ฅผ ๋ง์ง๋ง์ ์ง์ฐ๋ฏ๋ก ์คํจํ ๋ค ๊ฐ์ ๋ธ๋ก์ ๋ค์ ์คํํ ์ ์์ต๋๋ค. ์ด ๋ช
๋ น์ `.optbrew/runs`(๊ฐ์ฌ ์ฆ๊ฑฐ)๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค. `.optbrew` ํด๋ ์ ์ฒด๋ฅผ ์ง์ฐ์ง ๋ง์ญ์์ค. ์์ธํ ์ค๋ช
์ [ํ๋ซํผ ์๋ด](docs/platforms.md)๋ฅผ ๋ณด์ญ์์ค.
|
|
76
|
-
|
|
77
|
-
์ฌ์ฉ์ ๋ฒ์:
|
|
78
|
-
|
|
79
|
-
```powershell user
|
|
80
|
-
$ErrorActionPreference = 'Stop'
|
|
81
|
-
[Console]::OutputEncoding = [Text.Encoding]::UTF8
|
|
82
|
-
$plan = @(node bin/optbrew.mjs reinstall-plan --scope user)
|
|
83
|
-
if ($LASTEXITCODE) { exit $LASTEXITCODE }
|
|
84
|
-
foreach ($line in $plan) {
|
|
85
|
-
$f = $line -split "`t"
|
|
86
|
-
if ($f[0] -eq 'delete-link') { [IO.Directory]::Delete($f[1]) }
|
|
87
|
-
elseif ($f[0] -eq 'delete-dir') { Remove-Item -Recurse -Force -LiteralPath $f[1] }
|
|
88
|
-
}
|
|
89
|
-
foreach ($line in $plan) {
|
|
90
|
-
$f = $line -split "`t"
|
|
91
|
-
if ($f[0] -eq 'install') { node bin/optbrew.mjs install --agents $f[1] --scope user --strategy $f[2]; if ($LASTEXITCODE) { exit $LASTEXITCODE } }
|
|
92
|
-
elseif ($f[0] -eq 'agents') { node bin/optbrew.mjs doctor --agents $f[1] --scope user; exit $LASTEXITCODE }
|
|
93
|
-
}
|
|
94
|
-
```
|
|
124
|
+
optbrew๋ ํ๊ฒฝ์ ์ ๊ฒํ ๋ค ์์ ์ง๋ฌธ์ ํ ๋ฉ์์ง๋ก ๋ณด๋
๋๋ค. ๋ฒํธ๋ง๋ค ๋ตํ๊ฑฐ๋ ใ์์ใ๋ง ๋ตํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ๋๋ค. ๊ตฌ๊ธ ํค, ํฌ๋กฌ, ๋ด๋ณด๋ด๊ธฐ ํ์ผ์ด ์์ด๋ ๊ฐ์ฌ๋ ๋ฉ์ถ์ง ์์ต๋๋ค. ๋น ์นธ์ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ๊ณผ ํจ๊ป ๋ณด๊ณ ์์ ์ ํ๋๋ค.
|
|
95
125
|
|
|
96
|
-
|
|
97
|
-
set -e
|
|
98
|
-
plan=$(node bin/optbrew.mjs reinstall-plan --scope user)
|
|
99
|
-
while IFS=$'\t' read -r kind a b; do
|
|
100
|
-
case "$kind" in delete-link | delete-dir) rm -r -- "$a" ;; esac
|
|
101
|
-
done <<< "$plan"
|
|
102
|
-
while IFS=$'\t' read -r kind a b; do
|
|
103
|
-
case "$kind" in
|
|
104
|
-
install) node bin/optbrew.mjs install --agents "$a" --scope user --strategy "$b" ;;
|
|
105
|
-
agents) node bin/optbrew.mjs doctor --agents "$a" --scope user ;;
|
|
106
|
-
esac
|
|
107
|
-
done <<< "$plan"
|
|
108
|
-
```
|
|
126
|
+
๊ฐ์ฌ์๋ ๋ช ๋ถ์ด ๊ฑธ๋ฆฝ๋๋ค. ๊ฒฐ๊ณผ๋ ์์
ํด๋์ `optbrew-audit/<์ฌ์ดํธ>-<๋ ์ง>`์ ์์
๋๋ค. ์๋ณธ ๊ทผ๊ฑฐ(์๋ต๋ง๋ค ํด์)์ ๋ณด๊ณ ์ ์
์ด ๋ค์ด ์์ต๋๋ค. `report.html`์ ๋จผ์ ์ฌ์ญ์์ค. ๊ฐ์ ์ด๋ฆ์ ํด๋๊ฐ ์์ผ๋ฉด `-2`, `-3`์ ๋ถ์
๋๋ค. ์ฌ์คยท๋ด๋ถยท๋ก์ปฌ ์ฃผ์(`localhost`, `192.168.x.x` ๋ฑ)๋ ๊ฐ์ฌํ์ง ์์ต๋๋ค. ๊ณต๊ฐ ์ฃผ์๋ก ๊ฐ์ฌํ์ญ์์ค.
|
|
109
127
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
foreach ($line in $plan) {
|
|
119
|
-
$f = $line -split "`t"
|
|
120
|
-
if ($f[0] -eq 'delete-link') { [IO.Directory]::Delete($f[1]) }
|
|
121
|
-
elseif ($f[0] -eq 'delete-dir') { Remove-Item -Recurse -Force -LiteralPath $f[1] }
|
|
122
|
-
}
|
|
123
|
-
foreach ($line in $plan) {
|
|
124
|
-
$f = $line -split "`t"
|
|
125
|
-
if ($f[0] -eq 'install') { node bin/optbrew.mjs install --agents $f[1] --scope project --project $project --strategy $f[2]; if ($LASTEXITCODE) { exit $LASTEXITCODE } }
|
|
126
|
-
elseif ($f[0] -eq 'agents') { node bin/optbrew.mjs doctor --agents $f[1] --scope project --project $project; exit $LASTEXITCODE }
|
|
127
|
-
}
|
|
128
|
+
### ๊ตฌ๊ธ API ํค(์ ํ)
|
|
129
|
+
|
|
130
|
+
๋ฌด๋ฃ ๊ตฌ๊ธ API ํค๊ฐ ์์ผ๋ฉด ์ค์ ๋ฐฉ๋ฌธ์๊ฐ ๊ฒช๋ ์๋ ์ ์(LCP, INP, CLS)๊ฐ ์์ ์ ์ผ๋ก ์ฑ์์ง๋๋ค. optbrew๊ฐ ๊ถํ๋ฉด ใํคใ๋ผ๊ณ ๋ตํ์ญ์์ค. ๋ฐ๊ธ ๋ฐฉ๋ฒ์ด ๋์ต๋๋ค. ํค๋ ๋ํ์ฐฝ์ด ์๋๋ผ ๋ณธ์ธ ํฐ๋ฏธ๋์์ ์ ์ฅํ์ญ์์ค. Codex๋ Claude Code ํด๋ผ์ฐ๋์์๋ ํค ์๋ด๊ฐ ์ ์ฅํ ๊ณณ์ ๋์ ์๋ ค ์ค๋๋ค.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
optbrew key set google
|
|
134
|
+
optbrew key status
|
|
135
|
+
optbrew key remove google
|
|
128
136
|
```
|
|
129
137
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
while IFS=$'\t' read -r kind a b; do
|
|
138
|
-
case "$kind" in
|
|
139
|
-
install) node bin/optbrew.mjs install --agents "$a" --scope project --project "$project" --strategy "$b" ;;
|
|
140
|
-
agents) node bin/optbrew.mjs doctor --agents "$a" --scope project --project "$project" ;;
|
|
141
|
-
esac
|
|
142
|
-
done <<< "$plan"
|
|
138
|
+
`set`์ ์จ๊ฒจ์ง ์
๋ ฅ ์ฐฝ์ผ๋ก ํค๋ฅผ ๋ฐ์ต๋๋ค. `status`๋ ํค๊ฐ ์๋์ง์ ํด์ ์ 8์๋ง ๋ณด์ฌ ์ค๋๋ค. `remove`๋ ํค๋ฅผ ์ง์๋๋ค. npm์ผ๋ก ์ค์นํ์ง ์์๋ค๋ฉด `npx optbrew@0.2.0 key set google`์ ์ฐ๊ฑฐ๋, ใํคใ๋ผ๊ณ ๋ตํด ์๋ด์ ๋์จ ๋ช
๋ น์ ๊ทธ๋๋ก ๋ณต์ฌํ์ญ์์ค. ์คํฌ ํด๋์๋ ๊ฐ์ ๋ช
๋ น์ด ์์ต๋๋ค: `node <์คํฌ ํด๋>/scripts/key.mjs set google`. ํค๋ ํ ํด๋์ `.optbrew/credentials.json`์ ์ ์ฅ๋๋ฉฐ ์ด๋ ํ๋ก์ ํธ ์์๋ ๋ค์ด๊ฐ์ง ์์ต๋๋ค. ํ๊ฒฝ ๋ณ์ `OPTBREW_GOOGLE_API_KEY`๊ฐ ์์ผ๋ฉด ๊ทธ๊ฒ์ด ๋จผ์ ์
๋๋ค. optbrew๋ ํค๋ฅผ ์์ฒญ ํค๋๋ก๋ง ๊ตฌ๊ธ์ ๋ณด๋ด๊ณ , ๋ณด๊ณ ์ยท๋ก๊ทธยท๊ทผ๊ฑฐ์๋ ์ฐ์ง ์์ต๋๋ค.
|
|
139
|
+
|
|
140
|
+
## ์
๋ฐ์ดํธ
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
npm install -g optbrew@latest
|
|
144
|
+
optbrew update --scope user
|
|
143
145
|
```
|
|
144
146
|
|
|
145
|
-
|
|
147
|
+
npx๋ฅผ ์ด๋ค๋ฉด `npx optbrew@latest update --scope user`๋ฅผ ์คํํฉ๋๋ค. `optbrew check-updates --package optbrew`๋ ์๋ฌด๊ฒ๋ ๋ฐ๊พธ์ง ์๊ณ , ์ง๊ธ ์คํํ CLI๋ณด๋ค ์ ๋ฒ์ ์ด npm์ ์๋์ง ์๋ ค ์ค๋๋ค. ์์ด์ ํธ ํด๋์ ์ค์น๋ ๋ฒ์ ์ `optbrew doctor --json`์ `release_version`์ ๋์ต๋๋ค. `npm update`๋ง์ผ๋ก๋ ์์ด์ ํธ ํด๋์ ์ด๋ฏธ ๋์ธ ์ฌ๋ณธ์ด ๋ฐ๋์ง ์์ต๋๋ค. ์ฌ๋ณธ์ `update` ๋ช
๋ น์ด ๋ฐ๊ฟ๋๋ค.
|
|
148
|
+
|
|
149
|
+
### 0.1.x์์ ์ฌ๋ฆฌ๊ธฐ
|
|
150
|
+
|
|
151
|
+
0.2.0์ ํ๊ฐ ๋ฒ์ (0.4.0), ๊ฐ์ฌ ํ๋กํ ์ฝ(0.2.0), ๊ณ์ฝ ์คํค๋ง(2.0.0)๋ฅผ ๋ฐ๊ฟจ์ต๋๋ค. ๊ทธ๋์ ์ด๋ ์ต๋๋ค.
|
|
152
|
+
|
|
153
|
+
- 0.1.x ์ค์น๋ณธ(managed install)์ `migration_required`๋ก ๋ฉ์ถ๋ฉฐ, `optbrew update`๋ ์๋ฌด๊ฒ๋ ๋ฐ๊พธ์ง ์์ต๋๋ค. [migration_required ๋ค ์ฌ์ค์น](docs/platforms.md#reinstall-after-a-migration_required-update) ์ ์ฐจ๋ฅผ ๋ฐ๋ฅด์ญ์์ค. ์ด ์ ์ฐจ๋ ์ฝ๊ธฐ ์ ์ฉ ๊ฒ์ฌ๊ฐ ์ถ๋ ฅํ ๊ฒฝ๋ก๋ง ์ง์ฐ๋ฉฐ, ๊ฐ์ฌ ๊ทผ๊ฑฐ๋ ๊ฑด๋๋ฆฌ์ง ์์ต๋๋ค.
|
|
154
|
+
- ํ๋ฌ๊ทธ์ธ ์ค์น(Claude Code, Codex, claude.ai)๋ `main`์ ๋ฐ๋ผ๊ฐ๋ฏ๋ก, ์ฐ๋ ๋๊ตฌ์ ํ๋ฌ๊ทธ์ธ ์
๋ฐ์ดํธ ๋ช
๋ น์ด ๊ทธ๋๋ก ๋ฉ๋๋ค.
|
|
155
|
+
- 0.1.x ์คํ์ด ๋จ๊ธด ๊ฒฐ๊ณผ ํด๋์ ๊ทผ๊ฑฐ ๋ฌถ์์ ํ ๋ฌธ์ฅ์ผ๋ก ๊ฑฐ๋ถ๋ฉ๋๋ค. ์ ํด๋์์ ๊ฐ์ฌ๋ฅผ ๋ค์ ์คํํ์ญ์์ค. ํ๊ฐ ๋ฒ์ ์ด ๋ค๋ฅธ ์ ์๋ผ๋ฆฌ๋ ๋น๊ตํ ์ ์์ด์, 0.1.x ๊ธฐ์ค์ ๊ณผ `compare`ํ๋ฉด `not_comparable`์ด ๋์ต๋๋ค. ๊ธฐ์ค์ ๊ฐ์ฌ๋ฅผ 0.2.0์ผ๋ก ๋ค์ ๋๋ฆฌ์ญ์์ค.
|
|
156
|
+
|
|
157
|
+
## API์ ๋น์ฉ
|
|
158
|
+
|
|
159
|
+
์ ๋ฃ ๊ณ์ ์์ด ์ธ ์ ์์ต๋๋ค. Anthropic API๋ [SE Ranking](https://seranking.com/api.html)์ ์ง์ ํธ์ถํ๋ ค๋ฉด ๋จผ์ ์ฌ์ฉ์ ์น์ธ, ์์ฐ ๊ธฐ๋ก, ์ค๋จ ์กฐ๊ฑด์ด ์์ด์ผ ํฉ๋๋ค. Claude ๊ตฌ๋
์๋ API ์๊ธ์ด ํฌํจ๋์ง ์์ต๋๋ค. ์์ ๊ตฌ๊ธ ํค๋ ๋ณธ์ธ ํค์ด๊ณ , ๊ทธ ํค๋ก ๋ถ๋ฅด๋ ๊ตฌ๊ธ ์๋ ์๋น์ค๋ ๋ฌด๋ฃ์
๋๋ค. ํค๋ ํ๊ฒฝ ๋ณ์๋ ํค ํ์ผ์๋ง ๋๋ฉฐ ๋ณด๊ณ ์์๋ ๋ฃ์ง ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ [API ๊ฒฝ๊ณ](skills/optbrew/references/api.md)๋ฅผ ๋ณด์ญ์์ค.
|
|
160
|
+
|
|
161
|
+
## ๋ฌธ์
|
|
162
|
+
|
|
163
|
+
- [ํ๋ซํผ ์๋ด](docs/platforms.md): ์์ด์ ํธ๋ณ ์ค์น ๊ฒฝ๋ก, checkout ๋ช
๋ น, ์ฌ์ค์น ์ ์ฐจ
|
|
164
|
+
- [์ฑ์ ](skills/optbrew/references/scoring.md), [์ธก์ ](skills/optbrew/references/measurement.md), [๋ณด๊ณ ์ ๊ทผ๊ฑฐ](skills/optbrew/references/report.md)
|
|
165
|
+
- [๋ณ๊ฒฝ ๊ธฐ๋ก](CHANGELOG.md), [์ถ์ ์ ์ฐจ](docs/release.md)
|
|
166
|
+
|
|
167
|
+
## ๊ธฐ์ฌ
|
|
168
|
+
|
|
169
|
+
๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค. ๋ฒ๊ทธ ์ ๋ณด, ์ค์ ์ฌ์ดํธ์์ ๋์จ ์คํ, ๊ฐ์ด๋ ๊ฐฑ์ , ๋ฒ์ญ, ์ฝ๋ ๋ชจ๋ ์ข์ต๋๋ค. [CONTRIBUTING.md](CONTRIBUTING.md)๋ฅผ ๋ณด์ญ์์ค.
|
|
146
170
|
|
|
147
|
-
|
|
171
|
+
## ๋ผ์ด์ ์ค
|
|
148
172
|
|
|
149
|
-
|
|
173
|
+
optbrew ์์ฒด ์ฝ๋๋ [MIT ๋ผ์ด์ ์ค](LICENSE)์
๋๋ค. ํฌํจ๋ ๊ฐ์ด๋๋ ๊ฐ์์ ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฅด๋ฉฐ, [์ 3์ ๊ณ ์ง](skills/optbrew/THIRD_PARTY_NOTICES.md)์ ์ ๋ฆฌ๋ผ ์์ต๋๋ค. ๋ค์ด๋ฒ ๋ฌถ์์๋ ๊ณต์ [์์น์ด๋๋ฐ์ด์ ๊ฐ์ด๋](https://searchadvisor.naver.com/guide) ์์ธ๋ง ์๊ณ , ์๋ฌธ 55ํธ์ ์์ต๋๋ค. ์จ๋ผ์ธ์์ ๊ณต์ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ์ญ์์ค.
|