* feat(action): extract reusable OpenCodeReview PR review GitHub Action
Consolidate the reusable-action work into one commit:
- Add composite action (action.yml at repo root for GitHub Marketplace;
helper at scripts/github-actions/post-review-comments.js) porting the
sticky summary, incremental posting, and retry idempotency logic.
- Add unit tests covering the ported idempotency behavior.
- Switch the in-repo CI workflow to use the reusable action.
- Add and refine example reusable workflows for consumers.
* ci(workflow): point ocr-review at root action.yml and quote boolean inputs
- Fix uses: to ./ now that action.yml lives at the repo root.
- Quote sticky_summary/incremental/upload_artifacts as strings to
match action.yml's input declarations (composite-action inputs are
always strings) and silence actionlint.
- Enable upload_artifacts for this workflow.
* docs(examples): point reusable demo at root action.yml
The example workflow referenced alibaba/open-code-review/action@v1,
but action.yml now lives at the repo root, so the /action subpath no
longer resolves. Use alibaba/open-code-review@v1 and update the stale
action/README.md comment to point at the root action.yml.
* docs(examples): sync README to root action.yml references
The example README still pointed at the relocated/deleted locations:
action.yml is now at the repo root, so update all 11
alibaba/open-code-review/action@v1 references to
alibaba/open-code-review@v1, and repoint the action/ directory and
action/README.md links to the root action.yml.
* fix(examples): prevent unrelated PR comments from canceling ocr-review
GitHub Actions evaluates concurrency before the job-level if-condition.
The flat group mapped every issue_comment event on a PR into the review's
group, so any comment (even a skipped conversation reply) canceled any
in-progress review.
Match the reusable demo's conditional group: PR events and human-authored
/open-code-review/@open-code-review comments share a per-PR group, while
non-matching comments fall back to a unique noop-<run_id> group that can
never collide with a real review.
* fix(action): address code-review findings across reusable PR review
- post-review-comments: parse retry delays via parseNonNegInt (0/negative fix);
paginate findExistingSummaryComment through readAllPages; remove dead
rangeOf and hasIssueCommentWithId (plus duplicated comment block)
- action.yml: move ${{ }} interpolations into env: (resolve refs, PR_NUM,
ocr_version); fail fast on PR head fetch instead of swallowing errors
- workflows: add timeout-minutes: 30; gate issue_comment on
author_association; tighten pr-context if to == 'issue_comment'
* fix(action): harden review posting after code review
- pass incremental_overlap_threshold via env to avoid github-script injection
- capture ocr review exit code directly instead of &&/|| chain
- drop redundant SUMMARY_MARKER prepend in postSummary (callers already add it)
- align example job if-condition bot check with its concurrency group
* fix(action): always upload review artifacts and capture ocr exit code
* fix(action): merge posting statistics into the summary header
The PR summary issue comment used to present two overlapping breakdowns:
a leading "posted as inline / posted as summary" header and a trailing
"ð Posting Statistics" block. Their definitions overlapped (the header's
"summary" count included failures the trailer also listed as failed), and
when incremental filtering skipped comments the header counts no longer
summed to the total, making the summary hard to interpret.
Merge them into a single header whose four counts (inline / summary /
skipped / failed) are mutually exclusive and sum to the total, and drop
the trailing Posting Statistics section. buildSummaryBody now takes an
options object.
* fix(action): support local action resolution in container/self-hosted setups
- Checkout trusted base + mark workspace safe for pull_request_target so
the local `uses: ./` action can be resolved and loaded
- Check for git/Node.js and install git when missing, making the
composite action resilient across runner images
- Move Setup Node.js earlier and make it conditional on availability
- Resolve post-review-comments helper at runtime via
GITHUB_ACTION_PATH falling back to GITHUB_WORKSPACE, fixing helper
lookup for local actions where the action path is a host path
invisible inside containers
* refactor(examples): consolidate github_actions demo to reusable action
Drop the inline-script full-control demo; the renamed ocr-review.yml
(from ocr-review-reusable.yml) is now the single demo, invoking
alibaba/open-code-review@main.
Sync the README to the current implementation:
- normalize action refs to @main; point self-hosted-runner users to the
repo's own workflow (noting uses: ./ is internal-only)
- document config via action inputs (posting modes: sticky/incremental)
- update the comment-trigger if with defensive bot/author_association
guards and the concurrency mirror
- fix Example Output to cover the summary comment + inline comments
- replace the non-existent OCR_DEBUG debugging with
artifacts/outputs/ACTIONS_STEP_DEBUG
- use --replace-all for safe.directory
* fix(action): harden withRetry against silent undefined return
withRetry's for loop had no terminal return/throw after the loop body.
Although the current loop invariant (last attempt always throws, and
parseNonNegInt guards against negative MAX_RETRIES) makes fall-through
unreachable, an async function that falls through resolves to undefined,
which would surface as a confusing downstream TypeError for the read-API
callers that rely on it.
Capture lastErr in the loop and add an explicit terminal throw so any
future break of the invariant fails loudly instead of silently returning
undefined.
* docs(readme): document the reusable GitHub Action in CI/CD section
* fix(action): restore language config via a language input
The old inline workflow ran `ocr config set language English`, but the
composite action's Configure OCR step only set llm.extra_body, with no
language input. Add a language input (default English) and write it via
`ocr config set language` so review output language is no longer left
to the tool's default.
Addresses #337 (discussion_r3550069843).
* fix(action): warn when incremental comment listing hits page cap
listExistingReviewComments silently dropped comments beyond its 10-page
cap, unlike readAllPages which logs when truncation occurs. Add the
same max-page-limit warning after the loop so a partial walk during
incremental dedup is visible in the logs.
Addresses #337 (discussion_r3550069871).
* docs(readme): sync GitHub Action section to localized READMEs
49 KiB
English | ç®äœäžæ | æ¥æ¬èª | íêµìŽ | Ð ÑÑÑкОй
Open Code Reviewãšã¯ïŒ
Open Code Reviewã¯AIãæŽ»çšããã³ãŒãã¬ãã¥ãŒCLIããŒã«ã§ããããšããšã¯Alibaba Group瀟å ã®å ¬åŒAIã³ãŒãã¬ãã¥ãŒã¢ã·ã¹ã¿ã³ããšããŠèªçããéå»2幎éã§æ°äžäººã®éçºè ã«ãµãŒãã¹ãæäŸããæ°çŸäžä»¶ã®ã³ãŒãæ¬ é¥ãçºèŠããŠããŸãããå€§èŠæš¡ãªç°å¢ã§åŸ¹åºçã«æ€èšŒãããåŸãã³ãã¥ããã£åãã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ããšããŠå ¬éãããŸãããã¢ãã«ã®ãšã³ããã€ã³ããèšå®ããã ãã§äœ¿ãå§ããããŸãã
Gitã®diffãèªã¿åãã倿Žããããã¡ã€ã«ãããŒã«å©çšæ©èœãæã€ãšãŒãžã§ã³ãçµç±ã§èšå®å¯èœãªLLMã«éä¿¡ããè¡ã¬ãã«ã®ç²ŸåºŠã§æ§é åãããã¬ãã¥ãŒã³ã¡ã³ããçæããŸãããšãŒãžã§ã³ãã¯ãã¡ã€ã«å
šäœã®å
容ãèªã¿åããã³ãŒãããŒã¹ãæ€çŽ¢ããã³ã³ããã¹ãã®ããã«ä»ã®å€æŽãã¡ã€ã«ãåç
§ããæ·±ãã¬ãã¥ãŒãçæã§ããŸã â åãªã衚é¢çãªdiffãžã®ãã£ãŒãããã¯ã§ã¯ãããŸãããdiffã¬ãã¥ãŒä»¥å€ã«ããocr scan ã¯ãã¡ã€ã«å
šäœãã¬ãã¥ãŒã§ããŸããäžæ
£ããªã³ãŒãããŒã¹ã®ç£æ»ããæå³ã®ããdiffããªããã£ã¬ã¯ããªã®æ€æ»ã«äŸ¿å©ã§ãã
詳现ã¯å ¬åŒãµã€ããã芧ãã ããã
ãã³ãããŒã¯
æ±çšãšãŒãžã§ã³ãïŒClaude CodeïŒãšæ¯èŒããŠãOpen Code Reviewã¯åãåºç€ã¢ãã«ã§ææã«é«ã粟床ïŒPrecisionïŒãšF1ã¹ã³ã¢ãéæããããŒã¯ã³æ¶è²»éã¯çŽ1/9ã«ãšã©ãŸããã¬ãã¥ãŒãããé«éã§ãããã ãããªã³ãŒã«ïŒRecallïŒã¯æ±çšãšãŒãžã§ã³ãããäœããªããŸãââããã¯ãã€ãºãæã粟床ãåªå ããèšèšäžã®ãã¬ãŒããªãã§ãã
å®éã®ã³ãŒãã¬ãã¥ãŒã«åºã¥ããã³ãããŒã¯ã50ã®äººæ°ãªãŒãã³ãœãŒã¹ãªããžããªãã200ã®å®éã®Pull Requestãå³éžãã10ã®ããã°ã©ãã³ã°èšèªãã«ããŒââ80人以äžã®ã·ãã¢ãšã³ãžãã¢ã«ããã¯ãã¹ããªããŒã·ã§ã³ïŒ1,505ä»¶ã®ã¢ãããŒã·ã§ã³æžã¿æ¬ é¥ïŒã
| ææš | 枬å®å 容 | éèŠæ§ |
|---|---|---|
| F1 | 粟床ãšãªã³ãŒã«ã®èª¿åå¹³å | ã¬ãã¥ãŒå質ã瀺ãæè¯ã®åäžææš |
| 粟床 (Precision) | å ±åãããåé¡ã®ãã¡å®éã®æ¬ é¥ã®å²å | é«ã = 確èªãã¹ãåœéœæ§ãå°ãªã |
| ãªã³ãŒã« (Recall) | å®éã®æ¬ é¥ã®ãã¡çºèŠãããå²å | é«ã = èŠéããå°ãªã |
| å¹³åæé (Avg Time) | ã¬ãã¥ãŒãããã®å®æé | CIãã€ãã©ã€ã³ã®åŸ æ©æéã«åœ±é¿ |
| å¹³åããŒã¯ã³ (Avg Token) | ã¬ãã¥ãŒãããã®ç·ããŒã¯ã³æ¶è²»é | APIã³ã¹ãã«çŽæ¥åœ±é¿ |
ãªãOpen Code Reviewãªã®ãïŒ
æ±çšãšãŒãžã§ã³ãã®åé¡ç¹
Claude Codeã®Skillsã®ãããªæ±çšãšãŒãžã§ã³ããã³ãŒãã¬ãã¥ãŒã«äœ¿ã£ãããšãããã°ã次ã®ãããªèª²é¡ã«çŽé¢ããããšãããã¯ãã§ãïŒ
- äžå®å šãªã«ãã¬ããž â 倧ããªå€æŽã»ããã§ã¯ããšãŒãžã§ã³ãããæãæãããäžéšã®ãã¡ã€ã«ã ããéžæçã«ã¬ãã¥ãŒããŠä»ãèŠèœãšããã¡ã§ãã
- äœçœ®ã®ãã â å ±åãããåé¡ãå®éã®ã³ãŒãäœçœ®ãšäžèŽãããè¡çªå·ããã¡ã€ã«åç §ãã¿ãŒã²ãããããããããšãé »ç¹ã«ãããŸãã
- äžå®å®ãªå質 â èªç¶èšèªé§åã®Skillsã¯ãããã°ãé£ãããããããªããã³ããã®éãã§ã¬ãã¥ãŒå質ã倧ããå€åããŸãã
æ ¹æ¬åå ã¯ãçŽç²ã«èšèªé§åã®ã¢ãŒããã¯ãã£ã«ã¯ã¬ãã¥ãŒããã»ã¹ã«å¯ŸããããŒããªå¶çŽãæ¬ ããŠããããšã§ãã
ã³ã¢èšèš: 決å®è«çãšã³ãžãã¢ãªã³ã° à ãšãŒãžã§ã³ãã®ãã€ããªãã
Open Code Reviewã®ã³ã¢å²åŠã¯ã決å®è«çãšã³ãžãã¢ãªã³ã°ãšãšãŒãžã§ã³ããçµã¿åããããããããåŸæãšããé åãæ åœãããããšã§ãã
決å®è«çãšã³ãžãã¢ãªã³ã° â ããŒããªå¶çŽ
絶察ã«ééããŠã¯ãªããªãã¬ãã¥ãŒã¹ãããã«ã€ããŠã¯ãèšèªã¢ãã«ã§ã¯ãªããšã³ãžãã¢ãªã³ã°ããžãã¯ãæ£ãããä¿èšŒããŸãïŒ
- æ£ç¢ºãªãã¡ã€ã«éžæ â ã©ã®ãã¡ã€ã«ãã¬ãã¥ãŒããã©ã®ãã¡ã€ã«ããã£ã«ã¿ãªã³ã°ãã¹ãããæ£ç¢ºã«æ±ºå®ããéèŠãªå€æŽãèŠèœãšãããªãããã«ããŸãã
- ã¹ããŒããªãã¡ã€ã«ãã³ãã« â é¢é£ãããã¡ã€ã«ãåäžã®ã¬ãã¥ãŒãŠãããã«ã°ã«ãŒãåããŸãïŒäŸïŒ
message_en.propertiesãšmessage_zh.propertiesã¯ãŸãšããŠãã³ãã«ãããŸãïŒãåãã³ãã«ã¯åé¢ãããã³ã³ããã¹ããæã€ãµããšãŒãžã§ã³ããšããŠå®è¡ãããŸã â éåžžã«å€§ããªå€æŽã»ããã§ãå®å®ããåå²çµ±æ²»æŠç¥ã§ãèªç¶ã«äžŠè¡ã¬ãã¥ãŒããµããŒãããŸãã - ãã现ããªã«ãŒã«ãããã³ã° â åãã¡ã€ã«ã®ç¹æ§ã«å¿ããŠã¬ãã¥ãŒã«ãŒã«ããããã³ã°ããã¢ãã«ã®æ³šæãéãéäžãããæ å ±ãã€ãºãçºçæºããæé€ããŸããçŽç²ã«èšèªé§åã®ã«ãŒã«èªå°ãšæ¯ã¹ãŠããã³ãã¬ãŒããšã³ãžã³ããŒã¹ã®ã«ãŒã«ãããã³ã°ã¯ããå®å®çã§äºæž¬å¯èœã§ãã
- å€éšã®äœçœ®ç¹å®ã»ãªãã¬ã¯ã·ã§ã³ã¢ãžã¥ãŒã« â ç¬ç«ããã³ã¡ã³ãäœçœ®ç¹å®ã¢ãžã¥ãŒã«ãšã³ã¡ã³ããªãã¬ã¯ã·ã§ã³ã¢ãžã¥ãŒã«ã«ãããAIãã£ãŒãããã¯ã®äœçœ®ç²ŸåºŠãšå 容粟床ã®äž¡æ¹ãäœç³»çã«åäžãããŸãã
ãšãŒãžã§ã³ã â åçãªæææ±ºå®
ãšãŒãžã§ã³ãã®åŒ·ã¿ã¯ãæãéèŠãªé å â åçãªæææ±ºå®ãšåçãªã³ã³ããã¹ãååŸ â ã«éäžãããŠããŸãïŒ
- ã·ããªãªã«æé©åãããããã³ãã â ã³ãŒãã¬ãã¥ãŒåãã«æ·±ãæé©åãããããã³ãããã³ãã¬ãŒãã«ããã广ãé«ãã€ã€ããŒã¯ã³æ¶è²»ãåæžããŸãã
- ã·ããªãªã«æé©åãããããŒã«ã»ãã â å€§èŠæš¡ãªæ¬çªããŒã¿ã«ãããããŒã«åŒã³åºããã¬ãŒã¹ã®è©³çްãªåæ â åŒã³åºãé »åºŠã®ååžãããŒã«ããšã®ç¹°ãè¿ãçãæ°ããããŒã«ãåŒã³åºããã§ãŒã³å šäœã«äžãã圱é¿ãªã© â ããæœåºããããæ±çšãšãŒãžã§ã³ãããŒã«ããããããã³ãŒãã¬ãã¥ãŒã«ãããŠå®å®çã§äºæž¬å¯èœãªå°çšããŒã«ã»ããã§ãã
äœ¿ãæ¹
åææ¡ä»¶
- Git >= 2.41 â Open Code Review 㯠diff çæãã³ãŒãæ€çŽ¢ããªããžããªæäœã« Git ãå©çšããŸãã
CLI
ã€ã³ã¹ããŒã«
NPMçµç±ïŒæšå¥šïŒ
npm install -g @alibaba-group/open-code-review
ã€ã³ã¹ããŒã«åŸãocrã³ãã³ããã°ããŒãã«ã«å©çšå¯èœã«ãªããŸãã
æŽæ°
NPM ã§ã€ã³ã¹ããŒã«ããå Žåã¯ãæåã§ææ°ããŒãžã§ã³ãžæŽæ°ã§ããŸãïŒ
npm install -g @alibaba-group/open-code-review@latest
NPM ã€ã³ã¹ããŒã«çã® ocr ã¯ãæ¢å®ã§ããã¯ã°ã©ãŠã³ãã§æ°ããããŒãžã§ã³ã確èªããèªåçã«æŽæ°ããŸããèªåæŽæ°ãç¡å¹ã«ããã«ã¯ãOCR_NO_UPDATE=1 ãèšå®ããŠãã ããã
ã€ã³ã¹ããŒã«ã¹ã¯ãªãããŸãã¯æåããŠã³ããŒããããã€ããªã§ã€ã³ã¹ããŒã«ããå Žåã¯ãåãã€ã³ã¹ããŒã«/ããŠã³ããŒãã³ãã³ããåå®è¡ãããšãããŒã«ã«ã®ãã€ããªãææ°ãªãªãŒã¹ã«çœ®ãæããããŸããç¹å®ã®ãªãªãŒã¹ã¿ã°ã«åºå®ããå¿
èŠãããå Žå㯠OCR_VERSION ã䜿ããŸãã
GitHub Releaseãã
1 ã€ã®ã³ãã³ãã§ãã䜿ãã® OS / ã¢ãŒããã¯ãã£åãã®ææ°ãã€ããªãã€ã³ã¹ããŒã«ã§ããŸãïŒmacOS / LinuxïŒïŒ
curl -fsSL https://raw.githubusercontent.com/alibaba/open-code-review/main/install.sh | sh
ãã®ã¹ã¯ãªããã¯é©åãªãªãªãŒã¹ãã€ããªãéžæããSHA-256 ãã§ãã¯ãµã ãæ€èšŒããŠãocr ãšã㊠/usr/local/bin ã«ã€ã³ã¹ããŒã«ããŸããã€ã³ã¹ããŒã«å
㯠OCR_INSTALL_DIR ã§ããªãªãŒã¹ããŒãžã§ã³ã¯ OCR_VERSION ã§äžæžãã§ããŸãïŒ
OCR_INSTALL_DIR="$HOME/.local/bin" OCR_VERSION=v1.3.13 \
sh -c "$(curl -fsSL https://raw.githubusercontent.com/alibaba/open-code-review/main/install.sh)"
æåããŠã³ããŒãïŒWindows ãå«ãå šãã©ãããã©ãŒã ïŒ
GitHub Releasesããã䜿ãã®ãã©ãããã©ãŒã åãã®ãã€ããªãããŠã³ããŒãããŸãïŒ
# macOS (Apple Silicon)
curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-darwin-arm64
chmod +x ocr && sudo mv ocr /usr/local/bin/ocr
# macOS (Intel)
curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-darwin-amd64
chmod +x ocr && sudo mv ocr /usr/local/bin/ocr
# Linux (x86_64)
curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-linux-amd64
chmod +x ocr && sudo mv ocr /usr/local/bin/ocr
# Linux (ARM64)
curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-linux-arm64
chmod +x ocr && sudo mv ocr /usr/local/bin/ocr
# Windows (x86_64) â ocr.exe ã PATH ã®éã£ããã£ã¬ã¯ããªã«ç§»åããŠãã ãã
curl -Lo ocr.exe https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-windows-amd64.exe
# Windows (ARM64) â ocr.exe ã PATH ã®éã£ããã£ã¬ã¯ããªã«ç§»åããŠãã ãã
curl -Lo ocr.exe https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-windows-arm64.exe
ãœãŒã¹ãã
git clone https://github.com/alibaba/open-code-review.git
cd open-code-review
make build
sudo cp dist/opencodereview /usr/local/bin/ocr
ã¯ã€ãã¯ã¹ã¿ãŒã
1. LLMã®èšå®
ã³ãŒãã¬ãã¥ãŒã®åã«å¿ ãLLMãèšå®ããå¿ èŠããããŸãã
OCRã¯çµ±äžããã**ãããã€ããŒïŒProviderïŒ**ã·ã¹ãã ã§LLMèšå®ã管çããŸãã倿°ã®äž»èŠãããã€ããŒãçµã¿èŸŒãŸããŠããããã©ã€ããŒããããã€ã¡ã³ãããã®ä»ã®äºæãšã³ããã€ã³ãã«æ¥ç¶ããããã®ã«ã¹ã¿ã ãããã€ããŒã®è¿œå ããµããŒãããŠããŸããèšå®ã¯~/.opencodereview/config.jsonã«ä¿åãããŸãã
ãªãã·ã§ã³A: 察話çã»ããã¢ããïŒæšå¥šïŒ
ocr config provider # ãã«ãã€ã³ãããã€ããŒãéžæãŸãã¯ã«ã¹ã¿ã ãããã€ããŒã远å
ocr config model # ã¢ã¯ãã£ããªãããã€ããŒã®ã¢ãã«ãéžæ
察話çUIããããã€ããŒã®éžæãAPIããŒã®å ¥åãã¢ãã«èšå®ãã¬ã€ãããå®äºåŸã«èªåçã«æ¥ç¶ãã¹ããè¡ããŸãã
ocr llm providersãå®è¡ãããšããã¹ãŠã®ãã«ãã€ã³ãããã€ããŒã確èªã§ããŸãããã«ãã€ã³ãããã€ããŒã«ã¯API URLãšãããã³ã«ãããªã»ãããããŠãããããAPIããŒãæäŸããã ãã§äœ¿çšã§ããŸãã察å¿ããç°å¢å€æ°ïŒäŸïŒANTHROPIC_API_KEYãOPENAI_API_KEYïŒãèšå®æžã¿ã®å ŽåãAPIããŒã¯èªåçã«èªã¿åãããŸãã
ã«ã¹ã¿ã ãããã€ããŒã察話çUIãã远å ã§ããŸã â ãããã€ããŒåãAPI URLããããã³ã«ã¿ã€ãïŒanthropicãŸãã¯openaiïŒãAPIããŒãå
¥åããŸãã
ãªãã·ã§ã³B: CLIã»ããã¢ããïŒCI/CDãªã©é察話ç°å¢åãïŒ
ocr config setã³ãã³ãã§ãããã€ããŒèšå®ãçŽæ¥æžã蟌ã¿ãŸããã¹ã¯ãªãããèªååã«é©ããŠããŸãã
ãã«ãã€ã³ãããã€ããŒã䜿çšããå ŽåïŒ
ocr config set provider anthropic
ocr config set providers.anthropic.api_key your-api-key-here
ocr config set providers.anthropic.model claude-sonnet-4-6
ã«ã¹ã¿ã ãããã€ããŒã䜿çšããå ŽåïŒãã©ã€ããŒãã²ãŒããŠã§ã€ããã®ä»ã®äºæãšã³ããã€ã³ãïŒïŒ
ocr config set provider my-gateway
ocr config set custom_providers.my-gateway.url https://my-llm-gateway.internal/v1
ocr config set custom_providers.my-gateway.protocol openai
ocr config set custom_providers.my-gateway.api_key your-api-key-here
ocr config set custom_providers.my-gateway.model gpt-4o
ã«ã¹ã¿ã ãããã€ããŒã§ã¯
urlãšprotocolãå¿ é ã§ãããµããŒãããããããã³ã«ïŒanthropicãopenaiã
ãªãã·ã§ã³èšå®ïŒ
| ã㌠| 説æ |
|---|---|
providers.<name>.auth_header |
èªèšŒããããŒïŒx-api-keyãŸãã¯authorizationïŒããã©ã«ãïŒauthorizationïŒ |
providers.<name>.extra_body |
ãªã¯ãšã¹ãããã£ã«ããŒãžãããã«ã¹ã¿ã JSONãã£ãŒã«ã |
providers.<name>.extra_headers |
ã«ã³ãåºåãã® key=value ãã¢ã§ãåãªã¯ãšã¹ãã«è¿œå ãããã«ã¹ã¿ã HTTPããã㌠|
providers.<name>.models |
察話çéžæçšã®ã¢ãã«ãªã¹ã |
extra_headersïŒãªãã·ã§ã³ïŒïŒ ãã¹ãŠã®LLM APIãªã¯ãšã¹ãã«ã«ã¹ã¿ã HTTPããããŒã远å ããŸãããããã·ãã²ãŒããŠã§ã€ã远å ããããŒãå¿
èŠãšãããšã³ã¿ãŒãã©ã€ãºãšã³ããã€ã³ãïŒçµç¹IDããã¬ãŒã¹IDãªã©ïŒã«äŸ¿å©ã§ãã圢åŒã¯ã«ã³ãåºåãã® key=value ãã¢ã§ããã«ã³ããå«ãå€ã¯ããã«ã¯ã©ãŒãã§å²ãã§ãã ããïŒ
ocr config set llm.extra_headers "X-Org-ID=org-123,X-Forwarded-For=\"1.2.3.4,5.6.7.8\""
ãããã€ããŒããšã«è¿œå ããããŒãèšå®ããããšãã§ããŸãïŒ
ocr config set providers.anthropic.extra_headers "X-Org-ID=org-123"
ç°å¢å€æ°ïŒæåªå ïŒ
ç°å¢å€æ°ã¯èšå®ãã¡ã€ã«ã®èšå®ãäžæžãããŸããèšå®ãã¡ã€ã«ã®æžã蟌ã¿ãäžäŸ¿ãªCI/CDã·ããªãªã«é©ããŠããŸãïŒ
export OCR_LLM_URL=https://api.anthropic.com/v1/messages
export OCR_LLM_TOKEN=your-api-key-here
export OCR_LLM_MODEL=claude-opus-4-6
export OCR_USE_ANTHROPIC=true
Claude Codeã®ç°å¢å€æ°ïŒANTHROPIC_BASE_URLãANTHROPIC_AUTH_TOKENãANTHROPIC_MODELïŒãšãäºææ§ãããã~/.zshrc / ~/.bashrcãããããã®exportãããŒã¹ããŸãã
CC-SwitchãŠãŒã¶ãŒåãã®æ³šæ: CC-Switchãã«ãŒãã£ã³ã°ãµãŒãã¹æå¹ã§äœ¿çšããŠããå Žåããããã€ããŒã®
urlãCC-Switchã®ãããã·ã¢ãã¬ã¹ã«åããããšã§ã远å èšå®ãªãã§å©çšã§ããŸãïŒ
- Claudeãããã€ããŒã®å ŽåïŒ
providers.anthropic.urlãhttp://127.0.0.1:15721ã«èšå®- Codexãããã€ããŒã®å ŽåïŒå¯Ÿå¿ãããããã€ããŒã®
urlãhttp://127.0.0.1:15721/v1ã«èšå®api_keyã¯ä»»æã®å€ã§æ§ããŸãããextra_bodyèšå®ã¯åŒãç¶ãæå¹ã§ã
2. çéãã¹ã
ocr llm test
3. ã¬ãã¥ãŒ
cd your-project
# ã¯ãŒã¯ã¹ããŒã¹ã¢ãŒã â ã¹ããŒãžæžã¿ã»æªã¹ããŒãžã»æªè¿œè·¡ã®ãã¹ãŠã®å€æŽãã¬ãã¥ãŒ
ocr review
# ãã©ã³ãç¯å² â 2ã€ã®refãæ¯èŒ
ocr review --from main --to feature-branch
# åäžã³ããã
ocr review --commit abc123
# äžæããç¯å²ãŸãã¯åäž commit ã¬ãã¥ãŒãåé
ocr session list
ocr review --from main --to feature-branch --resume <session-id>
# ãã«ãã¡ã€ã«ã¹ãã£ã³ â diffã§ã¯ãªããã¡ã€ã«å
šäœãã¬ãã¥ãŒïŒgitå±¥æŽäžèŠïŒ
ocr scan # ãªããžããªå
šäœãã¹ãã£ã³
ocr scan --path internal/agent # ãã£ã¬ã¯ããªãŸãã¯ç¹å®ã®ãã¡ã€ã«ãã¹ãã£ã³
ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããšã®çµ±å
OCRã¯ã¹ã©ãã·ã¥ã³ãã³ããšããŠAIã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã«ã·ãŒã ã¬ã¹ã«çµ±åã§ãããšãŒãžã§ã³ãã®ã¯ãŒã¯ãããŒå ã§çŽæ¥ã³ãŒãã¬ãã¥ãŒãå¯èœã«ãªããŸãã
ãªãã·ã§ã³1: SkillãšããŠã€ã³ã¹ããŒã«
npxã䜿ã£ãŠOCRã¹ãã«ããããžã§ã¯ãã«ã€ã³ã¹ããŒã«ããŸãïŒ
npx skills add alibaba/open-code-review --skill open-code-review
ããã«ãããskillsã¬ãžã¹ããªããopen-code-reviewã¹ãã«ãã€ã³ã¹ããŒã«ãããã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã«ã³ãŒãã¬ãã¥ãŒã®ããã®ocrã®åŒã³åºãæ¹ãåªå
床ã«ããåé¡ã®åé¡ãå¿
èŠã«å¿ããä¿®æ£ã®é©çšãæããŸãã
ãªãã·ã§ã³2: Claude Codeãã©ã°ã€ã³ãšããŠã€ã³ã¹ããŒã«
Claude Codeã®å ŽåãClaude Codeå ã§ä»¥äžã®ã³ãã³ããå®è¡ããŠã³ãã³ããã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŸãïŒ
/plugin marketplace add alibaba/open-code-review
/plugin install open-code-review@open-code-review
ããã«ãã/open-code-review:reviewã¹ã©ãã·ã¥ã³ãã³ããç»é²ãããOCRãå®è¡ããŠåé¡ãèªåçã«ãã£ã«ã¿ãªã³ã°ã»ä¿®æ£ããŸãã
ãªãã·ã§ã³3: Codexãã©ã°ã€ã³ãšããŠã€ã³ã¹ããŒã«
ããŒã«ã«Codexã§ã¯ããã®ãªããžããªããOpen Code Reviewãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ã§ããŸãïŒ
codex plugin marketplace add alibaba/open-code-review
codex
/plugins
ããŒã«ã«checkoutãŸãã¯forkã§ã¯ã次ã䜿çšã§ããŸãïŒ
codex plugin marketplace add .
codex
/plugins
Open Code Reviewãã€ã³ã¹ããŒã«ããŠæå¹åããåŸãæ°ããCodex threadãéå§ããŠæç€ºçã«åŒã³åºããŸãïŒ
@Open Code Review review my current changes
@Open Code Review review this branch against main
@Open Code Review review and fix high-confidence issues
ããã«ãããããŒã«ã«OCR CLIãå®è¡ããCodex skillãç»é²ãããŸãïŒ
ocr review --audience agent
ãã®çµ±åã¯OCRã®å
éšLLM backendã倿ŽãããCodexçšã®OpenAI Responses API endpointèšå®ãå¿
èŠãããŸãããOCRèªäœã«ã¯ãCLI setupã»ã¯ã·ã§ã³ã§èª¬æãããŠããocr CLIã®ã€ã³ã¹ããŒã«ãšèšå®ãåŒãç¶ãå¿
èŠã§ãã
éåœèªã¬ã€ãïŒplugins/open-code-review/CODEX.ko-KR.md
ãªãã·ã§ã³4: Cursorãã©ã°ã€ã³ãšããŠã€ã³ã¹ããŒã«
Cursorã§ã¯ããã®ãªããžããªããOpen Code Reviewãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ã§ããŸãïŒ
cursor-plugin marketplace add alibaba/open-code-review
æåã§marketplaceã远å ããããšãã§ããŸããCursorã§/pluginsãéããOpen Code Reviewãæ€çŽ¢ããŠã€ã³ã¹ããŒã«ããŠãã ããã
ããŒã«ã«checkoutãŸãã¯forkã®å ŽåïŒ
cursor-plugin marketplace add .
ã€ã³ã¹ããŒã«åŸãCursorã§æ¬¡ã®ããã«åŒã³åºããŸãïŒ
@Open Code Review review my current changes
@Open Code Review review this branch against main
@Open Code Review review and fix high-confidence issues
ããã«ãããããŒã«ã«OCR CLIãå®è¡ããCursor skillãç»é²ãããŸãïŒ
ocr review --audience agent
ãã®çµ±åã¯OCRã®å
éšLLM backendã倿ŽããŸãããOCRèªäœã«ã¯ãCLI setupã»ã¯ã·ã§ã³ã§èª¬æãããŠããocr CLIã®ã€ã³ã¹ããŒã«ãšèšå®ãåŒãç¶ãå¿
èŠã§ãã
ãªãã·ã§ã³5: ã³ãã³ããã¡ã€ã«ãçŽæ¥ã³ããŒ
ããã±ãŒãžãããŒãžã£ãŒã䜿ããã«çŽ æ©ãã»ããã¢ãããããå Žåã¯ãã³ãã³ããã¡ã€ã«ãã³ããŒããã ãã§Claude Codeã§/open-code-reviewã¹ã©ãã·ã¥ã³ãã³ãã䜿ããããã«ãªããŸãã
ãããžã§ã¯ãã¬ãã«ïŒgitã§ããŒã ãšå ±æïŒïŒ
mkdir -p .claude/commands
curl -o .claude/commands/open-code-review.md \
https://raw.githubusercontent.com/alibaba/open-code-review/main/plugins/open-code-review/commands/review.md
ãŠãŒã¶ãŒã¬ãã«ïŒå šãããžã§ã¯ãã§å人çšã«ã°ããŒãã«å©çšïŒïŒ
mkdir -p ~/.claude/commands
curl -o ~/.claude/commands/open-code-review.md \
https://raw.githubusercontent.com/alibaba/open-code-review/main/plugins/open-code-review/commands/review.md
åææ¡ä»¶: ãã¹ãŠã®çµ±åæ¹æ³ã«ãããŠã
ocrCLIã®ã€ã³ã¹ããŒã«ãšLLMã®èšå®ãå¿ èŠã§ããäžèšã®ã€ã³ã¹ããŒã«ãšLLMã®èšå®ãåç §ããŠãã ããã
CI/CDçµ±å
OCRãCI/CDãã€ãã©ã€ã³ã«çµ±åããŠãMerge Request / Pull Requestã®ã³ãŒãã¬ãã¥ãŒãèªååã§ããŸãã
CIçµ±åã®ã³ã¢ã³ãã³ãïŒ
ocr review \
--from "origin/main" \
--to "origin/feature-branch" \
--format json
--format jsonãã©ã°ã¯ãCIã¹ã¯ãªããã§ã®ããŒã¹ã«é©ããæ©æ¢°å¯èªãªçµæãåºåããŸãã
åææã«ã¯2ã€ã®æ§é åãã£ãŒã«ããä»äžãããCIçµ±åã¯ã³ã¡ã³ãæ¬æãåããŒã¹ããã«äžŠã¹æ¿ãã»ã°ã«ãŒãåã»ãã£ã«ã¿ãªã³ã°ã»ãã«ãã®ã²ãŒãå€å®ãè¡ããŸãïŒ
| ãã£ãŒã«ã | èš±å¯ãããå€ | 説æ |
|---|---|---|
category |
bugãsecurityãperformanceãmaintainabilityãtestãstyleãdocumentationãother |
ææãå±ããã«ããŽãªã |
severity |
criticalãhighãmediumãlow |
ææã®éèŠåºŠã |
JSONåºåã§ã¯ãã®2ã€ã®ãã£ãŒã«ãã¯contentãstart_lineãªã©ãšåãéå±€ã«äžŠã³ãŸããã¿ãŒããã«ã§ã¯ãã³ã¡ã³ãã®åã«ã€ã³ã©ã€ã³ã®[category · severity]ãããžãšããŠè¡šç€ºãããéèŠåºŠã«å¿ããŠè²åããããŸãã
çµ±åäŸã¯examples/ãã£ã¬ã¯ããªãåç
§ããŠãã ããïŒ
github_actions/â GitHub Actionsçµ±åã®äŸgitlab_ci/â GitLab CIçµ±åã®äŸgitflic_ci/â GitFlic CIçµ±åã®äŸ
GitHub Action
GitHub åãã«ãæ¬ãªããžããªã¯ãªããžããªã«ãŒãã«ãã䜿ãã composite ActionïŒaction.ymlïŒã忢±ããŠããŸããèªåã§ ocr review ãã¹ã¯ãªããåãã代ããã«ããããçŽæ¥åç
§ããã ãã§ãcheckoutãOCR ã®ã€ã³ã¹ããŒã«ãã¬ãã¥ãŒã®å®è¡ãã€ã³ã©ã€ã³ã³ã¡ã³ããšãµããªãŒã³ã¡ã³ãã®æçš¿ãã¢ãŒãã£ãã¡ã¯ãã®ã¢ããããŒããå詊è¡ã»åªçæ§ãŸã§ã®å
šãã€ãã©ã€ã³ãåŠçã§ããŸãïŒ
- uses: alibaba/open-code-review@main
with:
llm_url: ${{ secrets.OCR_LLM_URL }}
llm_auth_token: ${{ secrets.OCR_LLM_AUTH_TOKEN }}
llm_model: ${{ vars.OCR_LLM_MODEL }}
llm_use_anthropic: ${{ vars.OCR_LLM_USE_ANTHROPIC }}
åçŸæ§ãé«ãããããããŒãžã§ã³ã¿ã°ãŸãã¯ã³ããã SHA ã«åºå®ããŠãã ãããå®å
šãªã¯ãŒã¯ãããŒãã¢ãinputs/outputs ã®å
šäžèЧãã³ã¡ã³ãæçš¿ã¢ãŒãïŒã¹ãã£ãããŒãµããªãŒãéç Žå£çãªã€ã³ã¯ãªã¡ã³ã¿ã«æçš¿ïŒã«ã€ããŠã¯ examples/github_actions/ ãã£ã¬ã¯ããªãåç
§ããŠãã ããã
ã³ãã³ã
| ã³ãã³ã | ãšã€ãªã¢ã¹ | 説æ |
|---|---|---|
ocr review |
ocr r |
diffããŒã¹ã®ã³ãŒãã¬ãã¥ãŒãéå§ |
ocr scan |
ocr s |
ãã¡ã€ã«å šäœãã¬ãã¥ãŒïŒdiffäžèŠïŒ |
ocr rules check <file> |
â | ãã¡ã€ã«ãã¹ã«é©çšãããã¬ãã¥ãŒã«ãŒã«ããã¬ãã¥ãŒ |
ocr config provider |
â | 察話çãããã€ããŒã»ããã¢ããïŒãã«ãã€ã³ãã«ã¹ã¿ã ãæåïŒ |
ocr config model |
â | ã¢ã¯ãã£ããªãããã€ããŒã®å¯Ÿè©±çã¢ãã«éžæ |
ocr config set <key> <value> |
â | èšå®å€ãã»ãã |
ocr config unset custom_providers.<name> |
â | ã«ã¹ã¿ã ãããã€ããŒãåé€ |
ocr llm test |
â | LLMã®çéãã¹ã |
ocr llm providers |
â | ãã«ãã€ã³LLMãããã€ããŒãäžèŠ§è¡šç€º |
ocr session list |
ocr sessions list, ocr session ls |
ä¿åæžã¿ã¬ãã¥ãŒã»ãã·ã§ã³ãäžèŠ§è¡šç€º |
ocr session show <id> |
ocr sessions show <id> |
1ã€ã®ã»ãã·ã§ã³ãšãã¡ã€ã«åäœã®ãã§ãã¯ãã€ã³ãã衚瀺 |
ocr viewer |
ocr v |
localhost:5483ã§WebUIã»ãã·ã§ã³ãã¥ãŒã¢ãŒãèµ·å |
ocr version |
â | ããŒãžã§ã³æ å ±ã衚瀺 |
ocr reviewã®ãã©ã°
| ãã©ã° | ç瞮圢 | ããã©ã«ã | 説æ |
|---|---|---|---|
--repo |
â | ã«ã¬ã³ããã£ã¬ã¯ã㪠| Gitãªããžããªã®ã«ãŒã |
--from |
â | â | ãœãŒã¹refïŒäŸïŒmainïŒ |
--to |
â | â | ã¿ãŒã²ããrefïŒäŸïŒfeature-branchïŒ |
--commit |
-c |
â | ã¬ãã¥ãŒå¯Ÿè±¡ã®åäžã³ããã |
--exclude |
â | â | ã«ã³ãåºåãã®gitignoreã¹ã¿ã€ã«ãã¿ãŒã³ã§ã¹ããã察象ãæå®ïŒrule.jsonã®excludesãšããŒãž |
--preview |
-p |
false |
LLMãå®è¡ããã«ã¬ãã¥ãŒå¯Ÿè±¡ãã¡ã€ã«ããã¬ãã¥ãŒ |
--resume |
â | â | 以åã®äºææ§ã®ããç¯å²ãŸãã¯åäž commit ã¬ãã¥ãŒã»ãã·ã§ã³ããåé |
--format |
-f |
text |
åºå圢åŒïŒtextãŸãã¯json |
--concurrency |
â | 8 |
ãã¡ã€ã«ã¬ãã¥ãŒã®æå€§åæå®è¡æ° |
--timeout |
â | 10 |
åæå®è¡ã¿ã¹ã¯ã®ã¿ã€ã ã¢ãŠãïŒåïŒ |
--audience |
â | human |
humanïŒé²æã衚瀺ïŒãŸãã¯agentïŒãµããªãŒã®ã¿ïŒ |
--background |
-b |
â | ã¬ãã¥ãŒã®ããã®ä»»æã®èŠä»¶/ããžãã¹ã³ã³ããã¹ãã--commitäœ¿çšæã«æªæå®ã®å Žåãã³ãããã¡ãã»ãŒãžããèªåååŸ |
--background-file |
-B |
â | Markdownãã¡ã€ã«ããèªã¿èŸŒãä»»æã®èŠä»¶/ããžãã¹ã³ã³ããã¹ãã--backgroundãšäœµçšããå Žåã¯ã€ã³ã©ã€ã³ã®å€ãå
ã«é
眮ãããŸã |
--model |
â | â | ãã®ã¬ãã¥ãŒã§LLMã¢ãã«ãéžæãŸãã¯äžæžã |
--rule |
â | â | ã«ã¹ã¿ã JSONã¬ãã¥ãŒã«ãŒã«ãžã®ãã¹ |
--max-tools |
â | çµã¿èŸŒã¿å€ | ãã¡ã€ã«ããšã®ããŒã«åŒã³åºãã©ãŠã³ãã®äžéããã³ãã¬ãŒãã®ããã©ã«ããã倧ããå Žåã®ã¿æå¹ |
--max-git-procs |
â | çµã¿èŸŒã¿å€ | gitãµãããã»ã¹ã®æå€§åæå®è¡æ° |
--tools |
â | â | ã«ã¹ã¿ã JSONããŒã«èšå®ãžã®ãã¹ |
åéå¯èœãªã¬ãã¥ãŒãšã»ãã·ã§ã³
ãã¹ãŠã® ocr review å®è¡ã¯ã~/.opencodereview/sessions/ é
äžã«ããŒã«ã«
ã»ãã·ã§ã³ãã°ãä¿åããŸããæ£åžžçµäºããããã¹ãåºåã¯ã¬ãã¥ãŒçµæã«éäžããsession ID
ã¯è¡šç€ºããŸãããä¿åæžã¿ã»ãã·ã§ã³ã¯ ocr session list/show ã§ç¢ºèªã§ãã
--format json ã§ã¯æ©æ¢°å¯èªåºåã« session_id ãå«ãŸããŸããç¯å²ãŸãã¯åäž commit
ã¬ãã¥ãŒãäžæãããå Žåã¯ãä¿åæžã¿ã»ãã·ã§ã³ãäžèŠ§è¡šç€ºããåãã¬ãã¥ãŒå¯Ÿè±¡ã«äžèŽããã»ãã·ã§ã³ããåéããŸã:
ocr session list
ocr session show <session-id>
ocr review --from main --to feature-branch --resume <session-id>
ocr review --commit abc123 --resume <session-id>
åéã¯æå³çã«å³å¯ã§ããç¯å²ã¬ãã¥ãŒãšåäž commit ã¬ãã¥ãŒã®ã¿å¯Ÿå¿ããã¯ãŒã¯ã¹ããŒã¹ã¬ãã¥ãŒã¯åéã§ããŸããã
çŸåšã® --from/--to ãŸã㯠--commit ã¯ä¿åæžã¿ã»ãã·ã§ã³ãšäžèŽããå¿
èŠããããŸãã--preview ãš --resume ã¯äœµçšã§ããŸããã
--format json ã䜿çšãããšãåéããå®è¡ã«ã¯æ¬¡ãå«ãŸããŸã:
session_idâ çŸåšã®å®è¡ã® session IDresume.resumed_fromâ åéå ã® session IDresume.reused_filesâ ä¿åæžã¿ãã§ãã¯ãã€ã³ãããåå©çšãããã¡ã€ã«æ°resume.rerun_filesâ çŸåšã®å®è¡ã§åã¬ãã¥ãŒãããã¡ã€ã«æ°
ocr sessionã®ãã©ã°
| ã³ãã³ã | ãã©ã° | ããã©ã«ã | 説æ |
|---|---|---|---|
ocr session list |
--repo |
ã«ã¬ã³ããã£ã¬ã¯ã㪠| äžèŠ§è¡šç€ºããã»ãã·ã§ã³ã®ãªããžã㪠|
ocr session list |
--json |
false |
ã»ãã·ã§ã³æŠèŠãJSONã§åºå |
ocr session list |
--limit |
20 |
äžèŠ§è¡šç€ºããã»ãã·ã§ã³æ°ã®äžéã0 ã¯ç¡å¶é |
ocr session show <id> |
--repo |
ã«ã¬ã³ããã£ã¬ã¯ã㪠| 確èªããã»ãã·ã§ã³ã®ãªããžã㪠|
ocr session show <id> |
--json |
false |
ã»ãã·ã§ã³ã¡ã¿ããŒã¿ãšãã¡ã€ã«åäœã®é ç®ãJSONã§åºå |
ocr scanã®ãã©ã°
ocr scan ã¯diffã§ã¯ãªããã¡ã€ã«å
šäœãã¬ãã¥ãŒããŸã â äžæ
£ããªã³ãŒãããŒã¹ã®ç£æ»ããã€ã°ã¬ãŒã·ã§ã³åã®ã¹ãã£ã³ãæå³ã®ããdiffããªããã£ã¬ã¯ããªãªã©ã«æçšã§ããégitãã£ã¬ã¯ããªã§ãåäœããŸãïŒ.gitignore ãå°éãããã¡ã€ã«ã·ã¹ãã ãŠã©ãŒã¯ã«ãã©ãŒã«ããã¯ïŒã
| ãã©ã° | ç瞮圢 | ããã©ã«ã | 説æ |
|---|---|---|---|
--path |
â | ãªããžããªå šäœ | ã«ã³ãåºåãã®ã¹ãã£ã³å¯Ÿè±¡ãã£ã¬ã¯ããª/ãã¡ã€ã« |
--exclude |
â | â | ã«ã³ãåºåãã®gitignoreã¹ã¿ã€ã«ãã¿ãŒã³ã§ã¹ããã察象ãæå®ïŒrule.jsonã®excludesãšããŒãž |
--preview |
-p |
false |
LLMãå®è¡ããã«ã¹ãã£ã³å¯Ÿè±¡ãã¡ã€ã«ãäžèŠ§è¡šç€º |
--max-tokens-budget |
â | 0ïŒç¡å¶éïŒ |
ããŒã¯ã³äœ¿çšéã®äžéïŒè¶ éãããšãã£ã¹ãããã忢 |
--no-plan |
â | false |
ãã¡ã€ã«ããšã®ãã©ã³ãã³ã°ååŠçãã¹ããã |
--no-dedup |
â | false |
ãããããšã®é¡äŒŒã³ã¡ã³ãéè€æé€ãã¹ããã |
--no-summary |
â | false |
ãããžã§ã¯ãã¬ãã«ã®ãµããªãŒãã¹ããã |
--batch |
â | by-language |
ãããæŠç¥ïŒnoneãby-languageããŸã㯠by-directory |
--format |
-f |
text |
åºå圢åŒïŒtext ãŸã㯠jsonïŒJSONã«ã¯ project_summary ãã£ãŒã«ããå«ãïŒ |
--concurrency |
â | 8 |
æå€§åæãã¡ã€ã«ã¹ãã£ã³æ° |
--rule |
â | â | ã«ã¹ã¿ã JSONã¬ãã¥ãŒã«ãŒã«ãžã®ãã¹ |
--repo |
â | ã«ã¬ã³ããã£ã¬ã¯ã㪠| ã¹ãã£ã³å¯Ÿè±¡ã®ãªããžããªãŸãã¯ãã£ã¬ã¯ããªã«ãŒã |
åå®è¡åã«ãocr scan ã¯ãããŸããªããŒã¯ã³ã³ã¹ãèŠç©ããã衚瀺ããŸãã--preview ã§ãŸããã¡ã€ã«ãªã¹ãã確èªãã--max-tokens-budget ã§å€§èŠæš¡ãªããžããªã®æ¯åºãå¶éã§ããŸãã
äŸ
# 察話çãããã€ããŒãšã¢ãã«ã®ã»ããã¢ãã
ocr config provider
ocr config model
ocr llm providers
# ã«ã¹ã¿ã ãããã€ããŒãåé€
ocr config unset custom_providers.my-gateway
# ã¬ãã¥ãŒå¯Ÿè±¡ãã¡ã€ã«ããã¬ãã¥ãŒïŒLLMåŒã³åºããªãïŒ
ocr review --preview
ocr review -c abc123 -p
# ããã©ã«ãèšå®ã§ã¯ãŒã¯ã¹ããŒã¹ã®å€æŽãã¬ãã¥ãŒ
ocr review
# é«ãã®åæå®è¡æ°ã§ãã©ã³ãã®diffãã¬ãã¥ãŒ
ocr review --from main --to my-feature --concurrency 4
# ç¹å®ã®ã³ãããã詳现ãªJSONåºåã§ã¬ãã¥ãŒ
ocr review --commit abc123 --format json --audience agent
# äžæããç¯å²ãŸãã¯åäž commit ã¬ãã¥ãŒãåé
ocr session list
ocr session show <session-id>
ocr review --from main --to my-feature --resume <session-id>
ocr review --commit abc123 --resume <session-id>
# ãã®ã¬ãã¥ãŒã§ã¢ãã«ãéžæãŸãã¯ãªãŒããŒã©ã€ã
ocr review --model claude-opus-4-6
ocr review --commit abc123 --model claude-sonnet-4-6
# èŠä»¶ã³ã³ããã¹ããæäŸããŠããç確ãªã¬ãã¥ãŒã宿œ
ocr review --background "ãã°ã€ã³APIã«ã¬ãŒãå¶éã远å "
# Markdownãã¡ã€ã«ããèŠä»¶ã³ã³ããã¹ããæäŸ
ocr review --background-file ./docs/my_business_context.md
# ã€ã³ã©ã€ã³ã®ã³ã³ããã¹ããšããŒã«ã«ã®ã³ã³ããã¹ããã¡ã€ã«ãçµã¿åãããïŒäž¡æ¹ã䜿çšãããŸãïŒ
ocr review --background "èªèšŒã«æ³šç®" --background-file ./docs/my_business_context.md
# ã«ã¹ã¿ã ã¬ãã¥ãŒã«ãŒã«ã䜿çš
ocr review --rule /path/to/my-rules.json
# ãã¡ã€ã«ã«é©çšãããã«ãŒã«ããã¬ãã¥ãŒ
ocr rules check src/main/java/com/example/Foo.java
ocr rules check --rule custom.json src/main/resources/mapper/UserMapper.xml
# ãã«ãã¡ã€ã«ã¹ãã£ã³ïŒãŸããã¡ã€ã«ãªã¹ãããã¬ãã¥ãŒïŒLLMåŒã³åºããªãïŒ
ocr scan --preview
# ãªããžããªå
šäœãã¹ãã£ã³ãæ¯åºãçŽ500kããŒã¯ã³ã«å¶é
ocr scan --max-tokens-budget 500000
# ãµããã£ã¬ã¯ããªãã¹ãã£ã³ãçæãã¡ã€ã«/ãã¹ããã¡ã€ã«ãã¹ããã
ocr scan --path internal --exclude '**/*_test.go,**/generated/**'
# égitãã£ã¬ã¯ããªãJSONåºåã§ã¹ãã£ã³ïŒproject_summaryãå«ãïŒ
ocr scan --repo /path/to/plain/dir --format json
# æéã¹ãã£ã³ïŒãã©ã³ãã³ã°ãéè€æé€ããããžã§ã¯ããµããªãŒãã¹ããã
ocr scan --no-plan --no-dedup --no-summary
# ãã©ãŠã¶ã§ã¬ãã¥ãŒã»ãã·ã§ã³å±¥æŽã衚瀺
ocr viewer
ocr viewer --addr :3000
ãã¥ãŒã¢ãŒã®ã»ãã¥ãªãã£
ãã¥ãŒã¢ãŒã¯ã»ãã·ã§ã³ã®JSONLã³ã³ãã³ãïŒLLMãªã¯ãšã¹ãã¡ãã»ãŒãžãšã¬ã¹ãã³ã¹ïŒãHTTPã§é
ä¿¡ããŸãããã¹ãŠã®ãªã¯ãšã¹ãã«å¯ŸããŠHostããããŒã®èš±å¯ãªã¹ãã匷å¶ããŸãïŒã«ãŒãããã¯åïŒlocalhostã127.0.0.0/8ã::1ïŒãšå®éã®ãã€ã³ããã¹ãã¯åžžã«èš±å¯ãããŸããã¯ã€ã«ãã«ãŒããã€ã³ãïŒ--addr :3000ã--addr 0.0.0.0:3000ïŒããã®ä»ã®éã«ãŒãããã¯ã®ãã¹ãåã¯ãç°å¢å€æ°OCR_VIEWER_ALLOWED_HOSTSïŒã«ã³ãåºåãïŒã§è¿œå ããå¿
èŠããããŸãïŒ
OCR_VIEWER_ALLOWED_HOSTS=review.internal,ocr.lan ocr viewer --addr :3000
ããã«ãããããŒã«ã«ãã¥ãŒã¢ãŒã«å¯ŸããDNSãªãã€ã³ãã£ã³ã°æ»æããããã¯ããŸãã
ã¬ãã¥ãŒã«ãŒã«
OCRã¯4å±€ã®åªå 床ãã§ãŒã³ã䜿ã£ãŠã¬ãã¥ãŒã«ãŒã«ã解決ããŸããåå±€ã¯ãã¡ãŒã¹ããããåªå ã§ãïŒãã¡ã€ã«ãã¹ããã¿ãŒã³ã«ãããããã°ãã®ã«ãŒã«ã䜿ããããããããªããã°æ¬¡ã®å±€ã«ãã©ãŒã«ã¹ã«ãŒããŸãã
| åªå 床 | ãœãŒã¹ | ãã¹ | 説æ |
|---|---|---|---|
| 1ïŒæé«ïŒ | --ruleãã©ã° |
ãŠãŒã¶ãŒæå®ãã¹ | CLIã«ããæç€ºçãªãªãŒããŒã©ã€ã |
| 2 | ãããžã§ã¯ãèšå® | <repoDir>/.opencodereview/rule.json |
ãããžã§ã¯ãããšã®ã«ãŒã«ãgitã«ã³ãããå¯èœ |
| 3 | ã°ããŒãã«èšå® | ~/.opencodereview/rule.json |
ãŠãŒã¶ãŒå šäœã®å人èšå® |
| 4ïŒæäœïŒ | ã·ã¹ãã ããã©ã«ã | çµã¿èŸŒã¿ã®system_rules.json |
äžè¬çãªèšèªãšãã¡ã€ã«ã¿ã€ããã«ããŒããçµã¿èŸŒã¿ã«ãŒã« |
ã«ãŒã«ãã¡ã€ã«ã®åœ¢åŒ
第1ã3å±€ã¯åãJSON圢åŒãå ±æããŸãïŒ
{
"rules": [
{
"path": "force-api/**/*.java",
"rule": "All new methods must validate required parameters for null values",
"merge_system_rule": true
},
{
"path": "**/*mapper*.xml",
"rule": "Check SQL for injection risks, parameter errors, and missing closing tags"
}
]
}
pathã¯**ã«ããååž°ããããš{java,kt}ã®ãã¬ãŒã¹å±éããµããŒãããŸããmerge_system_ruleã¯ä»»æã§ããtrueã®å ŽåãäžèŽããçµã¿èŸŒã¿ã·ã¹ãã ã«ãŒã«ããã®ãŠãŒã¶ãŒã«ãŒã«ãšããŒãžãããŸãã- åå±€ã®äžã§ã¯ãã«ãŒã«ã¯å®£èšé ã«è©äŸ¡ãããŸã â æåã«ããããããã®ãæ¡çšãããŸãã
- ã«ãŒã«ãã¡ã€ã«ãååšããªãå Žåã¯ãäœãåºåããã¹ããããããŸãã
rule ãã£ãŒã«ãã¯ã€ã³ã©ã€ã³ã³ã³ãã³ããšãã¡ã€ã«ãã¹ã®äž¡æ¹ããµããŒãããŸãã ã·ã¹ãã ã¯æ¬¡ã®é åºã§èªåå€å¥ããŸãïŒ
- å€ã«æ¹è¡ãå«ãŸãã â ã€ã³ã©ã€ã³ã³ã³ãã³ãïŒè€æ°è¡ã«ãŒã«ããã¡ã€ã«ãã¹ãšèŠãªãããããšã¯ãããŸããïŒã
- å€ãåäžè¡ã§ãã¹ããŒã¹ãå«ãŸãã
.md/.txt/.markdownã§çµãã â ãã¡ã€ã«ãã¹ã- 絶察ãã¹ïŒ
/ã§å§ãŸãïŒã¯ãã®ãŸãŸäœ¿çšãããŸãã - çžå¯Ÿãã¹ã¯ãããžã§ã¯ãã«ãŒãã§è§£æ±ºãããŸãããã¹ãã©ããŒãµã«ïŒäŸ:
../../etc/passwd.mdïŒã¯ãããã¯ãããŸããèŠã€ãããªãå Žåã¯[WARN]ãåºåããã«ãŒã«ã¯ã¯ãªã¢ãããŸãïŒã€ã³ã©ã€ã³ãžã®ãã©ãŒã«ããã¯ãªãïŒã - ãã¡ã€ã«ã¯ããªããŒã·ã§ã³ãééããå¿ èŠããããŸãïŒãã¯ã€ããªã¹ãæ¡åŒµåã†512â¯KBãã·ã³ããªãã¯ãªã³ã¯è§£æ±ºåŸã®ã¿ãŒã²ããããã¯ã€ããªã¹ãæ¡åŒµåã§ããããšãããªããŒã·ã§ã³ã«å€±æããå Žåãã«ãŒã«ã¯ã¯ãªã¢ãããŸãã
- 絶察ãã¹ïŒ
- ããä»¥å€ â ã€ã³ã©ã€ã³ã³ã³ãã³ãã
{
"rules": [
{
"path": "**/*mapper*.xml",
"rule": "docs/sql-rules.md"
},
{
"path": "**/*.java",
"rule": "Always check for null safety and resource leaks"
},
{
"path": "**/*.go",
"rule": "shared/go-concurrency.md"
},
{
"path": "**/*.py",
"rule": "/Users/me/team-rules/python.md"
}
]
}
docs/sql-rules.mdâ çžå¯Ÿãã¹ã<project>/docs/sql-rules.mdããèªã¿èŸŒã¿ãAlways check for null safetyâŠâ ã€ã³ã©ã€ã³æååããã®ãŸãŸäœ¿çšãshared/go-concurrency.mdâ çžå¯Ÿãã¹ãåæ§ã«è§£æ±ºã/Users/me/team-rules/python.mdâ 絶察ãã¹ããã®ãŸãŸäœ¿çšã
絶察ãã¹ã¯ãããžã§ã¯ãå€ã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããŸãããããã¯æå³çãªèšèšã§ãã
rule.jsonã¯ã¡ã³ãããäœæããä¿¡é Œãããå ¥åã®ããã§ããå ±æã«ãŒã«ãå ±éãã¹ïŒäŸïŒ/opt/company-rules/ïŒã«çœ®ãããšã§ãåãããžã§ã¯ããžã®ã³ããŒãäžèŠã«ãªããŸãã
ãã¹ãã£ã«ã¿ãªã³ã°
ã«ãŒã«ãã¡ã€ã«ã§ã¯ include ãš exclude ãã£ãŒã«ãã䜿çšã§ããã©ã®ãã¡ã€ã«ãã¬ãã¥ãŒå¯Ÿè±¡ã«ããããå¶åŸ¡ã§ããŸãïŒ
{
"rules": [
{"path": "**/*.java", "rule": "nullå®å
šæ§ããã§ãã¯"}
],
"include": ["src/main/**/*.java", "lib/**/*.kt"],
"exclude": ["**/generated/**", "vendor/**"]
}
ãã£ã«ã¿å€å®ã®åªå 床ïŒé«ãé ïŒïŒ
| ã¹ããã | æ¡ä»¶ | çµæ |
|---|---|---|
| 1 | ãã¡ã€ã«ããã€ã㪠| é€å€ |
| 2 | ãã¹ããŠãŒã¶ãŒã®excludeãã¿ãŒã³ã«ããã |
é€å€ |
| 3 | ãã¡ã€ã«æ¡åŒµåããµããŒããªã¹ãã«ãªã | é€å€ |
| 4 | includeãèšå®ãããŠããããã¹ãããã |
ã¬ãã¥ãŒå¯Ÿè±¡ïŒã¹ããã5ãã¹ãããïŒ |
| 5 | ãã¹ãçµã¿èŸŒã¿ããã©ã«ãé€å€ãã¿ãŒã³ïŒãã¹ããã¡ã€ã«çïŒã«ããã | é€å€ |
| 6 | äžèšã®ãããã«ã該åœããªã | ã¬ãã¥ãŒå¯Ÿè±¡ |
åäœããžãã¯ïŒ
includeãšexcludeã¯ã¬ãã¥ãŒã«ãŒã«ãšåãåªå 床ãã§ãŒã³ïŒ--rule> ãããžã§ã¯ãèšå® > ã°ããŒãã«èšå®ïŒã«åŸããŸããinclude/excludeãèšå®ãããŠããæãé«ãåªå 床ã®å±€ãäžæ¬ã§é©çšãããå±€ãè·šãã ããŒãžã¯è¡ãããŸãããexcludeã¯åžžã«includeããåªå ãããŸã â äž¡æ¹ã«ããããããã¡ã€ã«ã¯é€å€ãããŸããincludeã¯çµã¿èŸŒã¿ããã©ã«ãé€å€ãã¿ãŒã³ããã€ãã¹ããããã®ãã®ã§ããïŒäŸïŒãã¹ããã¡ã€ã«ïŒãæä»çãªèš±å¯ãªã¹ãã§ã¯ãããŸãã âincludeãã¿ãŒã³ã«ãããããªããã¡ã€ã«ãéåžžéãããã©ã«ããã£ã«ã¿ãã§ãã¯ã«é²ã¿ãŸãã- ãã¿ãŒã³æ§æïŒ
**ååž°ãããã*åäžã»ã°ã¡ã³ããããã{a,b}ãã¬ãŒã¹å±éããµããŒãããããã³ã°ã¯å€§æåå°æåãåºå¥ããŸããã
çµã¿èŸŒã¿ããã©ã«ãé€å€ãã¿ãŒã³ïŒãã¹ããã¡ã€ã«çããã£ã«ã¿ â includeã§ãªãŒããŒã©ã€ãå¯èœïŒïŒ
**/*_test.go, **/*Test.java, **/*Tests.java, **/*_test.rs,
**/*.test.{js,jsx,ts,tsx}, **/*.spec.{js,jsx,ts,tsx}, **/__tests__/**,
**/src/test/java/**/*.java, **/src/test/**/*.kt,
**/test/**/*_test.py, **/tests/**/*_test.py, **/*_test.py,
**/*_spec.rb, **/spec/**/*_spec.rb, **/oh_modules/**
èšå®ãªãã¡ã¬ã³ã¹
èšå®ãã¡ã€ã«ïŒ~/.opencodereview/config.json
| ã㌠| å | äŸ |
|---|---|---|
provider |
string | anthropic | openai | dashscope | deepseek | z-ai |
providers.<name>.api_key |
string | ãããã€ããŒåºæã®APIã㌠|
providers.<name>.url |
string | ãããã€ããŒã®ããŒã¹URLãªãŒããŒã©ã€ã |
providers.<name>.protocol |
string | anthropic | openai |
providers.<name>.model |
string | ãããã€ããŒã®ã¢ãã«å |
providers.<name>.models |
array | 察話çéžæã«äœ¿ãä»»æã®ãããã€ããŒã¢ãã«äžèЧ |
providers.<name>.auth_header |
string | x-api-key | authorization |
providers.<name>.extra_body |
object | ãã¹ãŠã®ãªã¯ãšã¹ãããã£ã«ããŒãžãããJSONãªããžã§ã¯ã |
providers.<name>.timeout_sec |
integer | ãªã¯ãšã¹ãããšã®HTTPã¿ã€ã ã¢ãŠãïŒç§ïŒãããã©ã«ã 300 |
providers.<name>.extra_headers |
string | ã«ã³ãåºåãã® key=value HTTPããã㌠|
custom_providers.<name>.* |
â | ä»»æã®modelsãå«ãproviders.<name>.*ãšåããã£ãŒã«ã |
llm.url |
string | https://api.openai.com/v1/chat/completions |
llm.auth_token |
string | sk-xxxxxxx |
llm.auth_header |
string | Anthropicã®ã¿ïŒx-api-key | authorization |
llm.extra_body |
object | ãã¹ãŠã®ãªã¯ãšã¹ãããã£ã«ããŒãžãããJSONãªããžã§ã¯ã |
llm.timeout_sec |
integer | ãªã¯ãšã¹ãããšã®HTTPã¿ã€ã ã¢ãŠãïŒç§ïŒãããã©ã«ã 300 |
llm.extra_headers |
string | ã«ã³ãåºåãã® key=value HTTPããã㌠|
llm.model |
string | claude-opus-4-6 |
llm.use_anthropic |
boolean | true | false |
mcp_servers.<name>.command |
string | MCPãµãŒããŒãèµ·åããã³ãã³ã |
mcp_servers.<name>.args |
array | MCPãµãŒããŒã®ã³ãã³ãã©ã€ã³åŒæ° |
mcp_servers.<name>.env |
array | ç°å¢å€æ°ïŒKEY=VALUE圢åŒïŒ |
mcp_servers.<name>.tools |
array | èš±å¯ããããŒã«åïŒç©ºã®å Žåã¯ãã¹ãŠã®ããŒã«ïŒ |
mcp_servers.<name>.setup |
string | ãµãŒããŒèµ·ååã«å®è¡ããã»ããã¢ããã³ãã³ã |
language |
string | ä»»æã®èšèªåãäŸïŒEnglishãChineseïŒããã©ã«ãïŒEnglishïŒ |
telemetry.enabled |
boolean | true | false |
telemetry.exporter |
string | console | otlp |
telemetry.otlp_endpoint |
string | OTLPã³ã¬ã¯ã¿ãŒã®ã¢ãã¬ã¹ |
telemetry.content_logging |
boolean | ãã¬ã¡ããªãŒã«ããã³ãããå«ãã |
ç°å¢å€æ°ã¯èšå®ãã¡ã€ã«ããåªå ãããŸãã
MCPãµãŒããŒ
Open Code Reviewã¯Model Context Protocol (MCP)ãµãŒããŒããµããŒãããŠãããã¬ãã¥ãŒãšãŒãžã§ã³ããstdioãã©ã³ã¹ããŒããä»ããŠã³ãŒãã¬ãã¥ãŒäžã«å€éšããŒã«ã䜿çšã§ããŸãã
CLIããMCPãµãŒããŒãèšå®ããŸãïŒ
# MCPãµãŒããŒã远å
ocr config set mcp_servers.<name>.command <command>
ocr config set mcp_servers.<name>.args '["arg1","arg2"]'
ocr config set mcp_servers.<name>.env '["KEY=VALUE"]'
ocr config set mcp_servers.<name>.tools '["tool_name"]'
ocr config set mcp_servers.<name>.setup '<setup command>'
# MCPãµãŒããŒãåé€
ocr config unset mcp_servers.<name>
| ãã£ãŒã«ã | å¿ é | 説æ |
|---|---|---|
command |
ã¯ã | MCPãµãŒããŒãèµ·åããå®è¡ã³ãã³ã |
args |
ããã | ãµãŒããŒã«æž¡ãã³ãã³ãã©ã€ã³åŒæ° |
env |
ããã | ç°å¢å€æ°ïŒKEY=VALUE圢åŒïŒ |
tools |
ããã | èš±å¯ããããŒã«åã空ã®å ŽåããµãŒããŒã®ãã¹ãŠã®ããŒã«ãå©çšå¯èœ |
setup |
ããã | ãµãŒããŒèµ·ååã«å®è¡ããã·ã§ã«ã³ãã³ãïŒäŸïŒã€ã³ããã¯ã¹ã®æ§ç¯ïŒ |
泚æïŒ MCPããŒã«ã®ååãçµã¿èŸŒã¿ããŒã«ãšç«¶åããå Žåããã®ããŒã«ã¯èŠåä»ãã§ã¹ããããããŸãã
setupã³ãã³ãã®ã¿ã€ã ã¢ãŠãã¯5åã§ãã
äŸïŒCodeGraphã远å ããŠã³ãŒãæ§é åæã匷å
ocr config set mcp_servers.codegraph.command codegraph
ocr config set mcp_servers.codegraph.args '["serve","--mcp"]'
ocr config set mcp_servers.codegraph.tools '["codegraph_explore"]'
ocr config set mcp_servers.codegraph.setup 'codegraph init && codegraph index'
ç°å¢å€æ°
| 倿° | çšé |
|---|---|
OCR_LLM_URL |
LLM APIãšã³ããã€ã³ãURL |
OCR_LLM_TOKEN |
APIã㌠/ èªèšŒããŒã¯ã³ |
OCR_LLM_AUTH_HEADER |
AnthropicèªèšŒããããŒïŒx-api-keyãŸãã¯authorizationïŒ |
OCR_LLM_EXTRA_HEADERS |
ã«ã³ãåºåãã® key=value HTTPããã㌠|
OCR_LLM_MODEL |
ã¢ãã«å |
OCR_LLM_TIMEOUT |
ãªã¯ãšã¹ãããšã®HTTPã¿ã€ã ã¢ãŠãïŒç§ïŒãèšå®ãã¡ã€ã«ã® timeout_sec ãäžæžã |
OCR_USE_ANTHROPIC |
true = Anthropicãfalse = OpenAI |
ãã¬ã¡ããªãŒ
å¯èŠ³æž¬æ§ïŒã¹ãã³ãã¡ããªã¯ã¹ïŒã®ããã®OpenTelemetryçµ±åãããã©ã«ãã§ã¯ç¡å¹ã§ãã
ocr config set telemetry.enabled true
ocr config set telemetry.exporter otlp
ocr config set telemetry.otlp_endpoint localhost:4317
ãšã¯ã¹ããŒãããŒã¿ã«LLMã®ããã³ãããšã¬ã¹ãã³ã¹ãå«ããã«ã¯ãtelemetry.content_loggingãèšå®ããŠãã ããã
ãããã³ã«éžæïŒ ç°å¢å€æ° OTEL_EXPORTER_OTLP_PROTOCOL ã§ãšã¯ã¹ããŒããããã³ã«ãéžæã§ããŸãïŒ
| å€ | ãã©ã³ã¹ããŒã | 説æ |
|---|---|---|
grpcïŒããã©ã«ãïŒ |
gRPC | ããã©ã«ãããŒã 4317 |
http/protobuf |
HTTP | ããã©ã«ãããŒã 4318 |
Endpoint 圢åŒïŒ telemetry.otlp_endpoint 㯠host:port ãŸã㯠http://host:port 圢åŒã®ããŒã¹URLãæå®ããŸãããã¹ãå«ããå¿
èŠã¯ãããŸãããSDKã OTLP仿§ã«åŸãã·ã°ãã«ãã¹ïŒäŸïŒ/v1/tracesïŒãèªåçã«ä»å ããŸãã
ã³ã³ããªãã¥ãŒã·ã§ã³
ãã®ãããžã§ã¯ãã¯ãè²¢ç®ããŠãã ãããã¹ãŠã®æ¹ã ã®ãããã§æãç«ã£ãŠããŸããéçºç°å¢ã®ã»ããã¢ãããã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ããã«ãªã¯ãšã¹ãã®æåºæ¹æ³ã«ã€ããŠã¯CONTRIBUTING.mdãåç §ããŠãã ããã
ã©ã€ã»ã³ã¹
Apache-2.0 â Copyright 2026 Alibaba


