From 5053e6dca806a2aa2175fa63641770b18a70739a Mon Sep 17 00:00:00 2001 From: kite Date: Mon, 25 May 2026 23:07:36 +0800 Subject: [PATCH] refactor(config): rename config directory from .open-code-review to .opencodereview Unify the config folder name to `.opencodereview` across all runtime paths, tests, docs, and i18n strings. Also make defaultConfigPath() return an error instead of silently falling back to a current-directory file when $HOME is unresolvable. --- NPM-README.md | 2 +- README.md | 8 ++-- README.zh-CN.md | 8 ++-- bin/ocr.js | 2 +- cmd/opencodereview/config_cmd.go | 27 +++++++------ cmd/opencodereview/llm_cmd.go | 9 ++++- cmd/opencodereview/review_cmd.go | 9 ++++- internal/config/rules/system_rules.go | 16 ++++---- internal/config/rules/system_rules_test.go | 16 ++++---- internal/llm/resolver.go | 14 +++---- internal/session/persist.go | 46 +++++++++++----------- internal/telemetry/config.go | 6 +-- internal/viewer/store.go | 4 +- pages/src/i18n/en.ts | 4 +- pages/src/i18n/zh.ts | 4 +- scripts/update.js | 2 +- 16 files changed, 95 insertions(+), 82 deletions(-) diff --git a/NPM-README.md b/NPM-README.md index 92b27fc..f4f2331 100644 --- a/NPM-README.md +++ b/NPM-README.md @@ -29,7 +29,7 @@ ocr config set llm.url https://api.anthropic.com/v1/messages \ && ocr config set language Chinese ``` -Config is stored in `~/.open-code-review/config.json`. +Config is stored in `~/.opencodereview/config.json`. Or via environment variables: diff --git a/README.md b/README.md index e6ef98f..fa5c932 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ export OCR_LLM_MODEL=claude-opus-4-6 export OCR_USE_ANTHROPIC=true ``` -Config is stored in `~/.open-code-review/config.json`. +Config is stored in `~/.opencodereview/config.json`. The tool also falls back to Claude Code environment variables (`ANTHROPIC_BASE_URL`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_MODEL`) and parses `~/.zshrc` / `~/.bashrc` for those exports. @@ -150,8 +150,8 @@ OCR resolves review rules using a four-layer priority chain. Each layer uses fir | Priority | Source | Path | Description | |----------|--------|------|-------------| | 1 (highest) | `--rule` flag | User-specified path | CLI explicit override | -| 2 | Project config | `/.open-code-review/rule.json` | Per-project rules, can be committed to git | -| 3 | Global config | `~/.open-code-review/rule.json` | User-wide personal preferences | +| 2 | Project config | `/.opencodereview/rule.json` | Per-project rules, can be committed to git | +| 3 | Global config | `~/.opencodereview/rule.json` | User-wide personal preferences | | 4 (lowest) | System default | Embedded `system_rules.json` | Built-in rules covering common languages and file types | ### Rule File Format @@ -193,7 +193,7 @@ The review agent follows a **three-phase workflow**: ## Configuration Reference -Config file: `~/.open-code-review/config.json` +Config file: `~/.opencodereview/config.json` | Key | Type | Example | |-----|------|---------| diff --git a/README.zh-CN.md b/README.zh-CN.md index 87b3de7..cceaa69 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -73,7 +73,7 @@ export OCR_LLM_MODEL=claude-opus-4-6 export OCR_USE_ANTHROPIC=true ``` -配置存储于 `~/.open-code-review/config.json`。 +配置存储于 `~/.opencodereview/config.json`。 工具也会回退使用 Claude Code 环境变量(`ANTHROPIC_BASE_URL`、`ANTHROPIC_AUTH_TOKEN`、`ANTHROPIC_MODEL`),并解析 `~/.zshrc` / `~/.bashrc` 中的相关导出。 @@ -150,8 +150,8 @@ OCR 通过四层优先级链解析评审规则。每层采用首次匹配原则 | 优先级 | 来源 | 路径 | 描述 | |--------|------|------|------| | 1(最高) | `--rule` 参数 | 用户指定路径 | CLI 显式覆盖 | -| 2 | 项目配置 | `/.open-code-review/rule.json` | 项目级规则,可提交到 git | -| 3 | 全局配置 | `~/.open-code-review/rule.json` | 用户级个人偏好 | +| 2 | 项目配置 | `/.opencodereview/rule.json` | 项目级规则,可提交到 git | +| 3 | 全局配置 | `~/.opencodereview/rule.json` | 用户级个人偏好 | | 4(最低) | 系统默认 | 内嵌 `system_rules.json` | 覆盖常见语言和文件类型的内置规则 | ### 规则文件格式 @@ -193,7 +193,7 @@ OCR 通过四层优先级链解析评审规则。每层采用首次匹配原则 ## 配置参考 -配置文件:`~/.open-code-review/config.json` +配置文件:`~/.opencodereview/config.json` | 键 | 类型 | 示例 | |----|------|------| diff --git a/bin/ocr.js b/bin/ocr.js index 807fc16..3aa4a18 100755 --- a/bin/ocr.js +++ b/bin/ocr.js @@ -9,7 +9,7 @@ const os = require("os"); const binaryPath = path.join(__dirname, "opencodereview"); if (!process.env.OCR_NO_UPDATE) { - const stateDir = path.join(os.homedir(), ".open-code-review"); + const stateDir = path.join(os.homedir(), ".opencodereview"); const tsFile = path.join(stateDir, "last-update-check"); const cooldownMs = (parseInt(process.env.OCR_UPDATE_INTERVAL, 10) || 60) * 60 * 1000; diff --git a/cmd/opencodereview/config_cmd.go b/cmd/opencodereview/config_cmd.go index 2aa064f..14bd4ac 100644 --- a/cmd/opencodereview/config_cmd.go +++ b/cmd/opencodereview/config_cmd.go @@ -8,13 +8,13 @@ import ( "strconv" ) -// Default config file location: ~/.open-code-review/config.json -func defaultConfigPath() string { +// Default config file location: ~/.opencodereview/config.json +func defaultConfigPath() (string, error) { home, err := os.UserHomeDir() if err != nil { - return "open-code-review.json" + return "", fmt.Errorf("cannot determine home directory: %w", err) } - return filepath.Join(home, ".open-code-review", "config.json") + return filepath.Join(home, ".opencodereview", "config.json"), nil } func runConfig(args []string) error { @@ -37,7 +37,10 @@ func runConfig(args []string) error { } func runConfigSet(key, value string) error { - configPath := defaultConfigPath() + configPath, err := defaultConfigPath() + if err != nil { + return err + } cfg, err := loadOrCreateConfig(configPath) if err != nil { @@ -66,11 +69,11 @@ func runConfigSet(key, value string) error { return nil } -// Config represents the user-level configuration file (~/.open-code-review/config.json). +// Config represents the user-level configuration file (~/.opencodereview/config.json). type Config struct { - Llm LlmConfig `json:"llm,omitempty"` - Language string `json:"language,omitempty"` // Output language, defaults to Chinese when empty - Telemetry *TelemetryConfig `json:"telemetry,omitempty"` // Telemetry/observability settings + Llm LlmConfig `json:"llm,omitempty"` + Language string `json:"language,omitempty"` // Output language, defaults to Chinese when empty + Telemetry *TelemetryConfig `json:"telemetry,omitempty"` // Telemetry/observability settings } type LlmConfig struct { @@ -83,9 +86,9 @@ type LlmConfig struct { // TelemetryConfig holds telemetry-specific settings. type TelemetryConfig struct { - Enabled bool `json:"enabled,omitempty"` // Master switch for telemetry - Exporter string `json:"exporter,omitempty"` // "console" or "otlp" - OTLPEndpoint string `json:"otlp_endpoint,omitempty"` // OTLP collector address + Enabled bool `json:"enabled,omitempty"` // Master switch for telemetry + Exporter string `json:"exporter,omitempty"` // "console" or "otlp" + OTLPEndpoint string `json:"otlp_endpoint,omitempty"` // OTLP collector address ContentLog bool `json:"content_logging,omitempty"` // Include prompt/response content } diff --git a/cmd/opencodereview/llm_cmd.go b/cmd/opencodereview/llm_cmd.go index d33d610..84088c9 100644 --- a/cmd/opencodereview/llm_cmd.go +++ b/cmd/opencodereview/llm_cmd.go @@ -25,12 +25,17 @@ func runLLM(args []string) error { } func runLLMTest() error { - appCfg, err := LoadAppConfig(defaultConfigPath()) + cfgPath, err := defaultConfigPath() + if err != nil { + return err + } + + appCfg, err := LoadAppConfig(cfgPath) if err != nil { return fmt.Errorf("load config: %w", err) } - ep, err := llm.ResolveEndpoint(defaultConfigPath()) + ep, err := llm.ResolveEndpoint(cfgPath) if err != nil { return fmt.Errorf("resolve LLM endpoint: %w", err) } diff --git a/cmd/opencodereview/review_cmd.go b/cmd/opencodereview/review_cmd.go index d29d2d8..f9f2875 100644 --- a/cmd/opencodereview/review_cmd.go +++ b/cmd/opencodereview/review_cmd.go @@ -57,7 +57,12 @@ func runReview(args []string) error { planToolDefs := agent.BuildToolDefs(toolEntries, true) mainToolDefs := agent.BuildToolDefs(toolEntries, false) - appCfg, err := LoadAppConfig(defaultConfigPath()) + cfgPath, err := defaultConfigPath() + if err != nil { + return err + } + + appCfg, err := LoadAppConfig(cfgPath) if err != nil { return fmt.Errorf("load app config: %w", err) } @@ -65,7 +70,7 @@ func runReview(args []string) error { tpl.ApplyLanguage(appCfg.Language) } - ep, err := llm.ResolveEndpoint(defaultConfigPath()) + ep, err := llm.ResolveEndpoint(cfgPath) if err != nil { return fmt.Errorf("resolve LLM endpoint: %w", err) } diff --git a/internal/config/rules/system_rules.go b/internal/config/rules/system_rules.go index 914cea5..6145e02 100644 --- a/internal/config/rules/system_rules.go +++ b/internal/config/rules/system_rules.go @@ -134,13 +134,13 @@ func expandBraces(s string) []string { return results } -// ProjectRuleEntry is a single entry in .open-code-review/rule.json. +// ProjectRuleEntry is a single entry in .opencodereview/rule.json. type ProjectRuleEntry struct { Path string `json:"path"` Rule string `json:"rule"` } -// ProjectRule holds rules loaded from /.open-code-review/rule.json. +// ProjectRule holds rules loaded from /.opencodereview/rule.json. type ProjectRule struct { Rules []ProjectRuleEntry `json:"rules"` Include []string `json:"include,omitempty"` @@ -194,15 +194,15 @@ func (f *FileFilter) IsUserIncluded(path string) bool { // composedResolver implements Resolver with layered priority. type composedResolver struct { custom *ProjectRule // highest: --rule flag - project *ProjectRule // high: .open-code-review/rule.json - global *ProjectRule // low: ~/.open-code-review/rule.json + project *ProjectRule // high: .opencodereview/rule.json + global *ProjectRule // low: ~/.opencodereview/rule.json system *SystemRule // lowest: embedded default } // NewResolver builds a Resolver with the following priority: // 1. Custom rule file specified via --rule flag (first match wins) -// 2. Project-local .open-code-review/rule.json (first match wins) -// 3. Global ~/.open-code-review/rule.json (first match wins) +// 2. Project-local .opencodereview/rule.json (first match wins) +// 3. Global ~/.opencodereview/rule.json (first match wins) // 4. Embedded system default rules // // It also returns a FileFilter with the merged include/exclude patterns from all layers. @@ -267,7 +267,7 @@ func loadGlobalRule() (*ProjectRule, error) { if err != nil { return nil, nil } - path := filepath.Join(home, ".open-code-review", "rule.json") + path := filepath.Join(home, ".opencodereview", "rule.json") data, err := os.ReadFile(path) if err != nil { if os.IsNotExist(err) { @@ -295,7 +295,7 @@ func loadRuleFile(path string) (*ProjectRule, error) { } func loadProjectRule(repoDir string) (*ProjectRule, error) { - path := filepath.Join(repoDir, ".open-code-review", "rule.json") + path := filepath.Join(repoDir, ".opencodereview", "rule.json") data, err := os.ReadFile(path) if err != nil { if os.IsNotExist(err) { diff --git a/internal/config/rules/system_rules_test.go b/internal/config/rules/system_rules_test.go index 572f1e0..ba690e1 100644 --- a/internal/config/rules/system_rules_test.go +++ b/internal/config/rules/system_rules_test.go @@ -201,7 +201,7 @@ func TestNewResolver_ProjectFileMissing(t *testing.T) { func TestNewResolver_ProjectRuleHighestPriority(t *testing.T) { dir := t.TempDir() - ocrDir := filepath.Join(dir, ".open-code-review") + ocrDir := filepath.Join(dir, ".opencodereview") if err := os.MkdirAll(ocrDir, 0o755); err != nil { t.Fatalf("mkdir: %v", err) } @@ -234,7 +234,7 @@ func TestNewResolver_ProjectRuleHighestPriority(t *testing.T) { func TestNewResolver_ProjectRuleFallsBackToSystem(t *testing.T) { dir := t.TempDir() - ocrDir := filepath.Join(dir, ".open-code-review") + ocrDir := filepath.Join(dir, ".opencodereview") if err := os.MkdirAll(ocrDir, 0o755); err != nil { t.Fatalf("mkdir: %v", err) } @@ -289,7 +289,7 @@ func TestNewResolver_CustomOverridesProject(t *testing.T) { // Setup project rule with narrower pattern repoDir := t.TempDir() - ocrDir := filepath.Join(repoDir, ".open-code-review") + ocrDir := filepath.Join(repoDir, ".opencodereview") if err := os.MkdirAll(ocrDir, 0o755); err != nil { t.Fatalf("mkdir: %v", err) } @@ -324,7 +324,7 @@ func TestNewResolver_CustomOverridesProject(t *testing.T) { func TestNewResolver_ProjectFileMalformed(t *testing.T) { dir := t.TempDir() - ocrDir := filepath.Join(dir, ".open-code-review") + ocrDir := filepath.Join(dir, ".opencodereview") if err := os.MkdirAll(ocrDir, 0o755); err != nil { t.Fatalf("mkdir: %v", err) } @@ -410,7 +410,7 @@ func TestFileFilter_CaseInsensitive(t *testing.T) { func TestNewResolver_FileFilterMerged(t *testing.T) { repoDir := t.TempDir() - ocrDir := filepath.Join(repoDir, ".open-code-review") + ocrDir := filepath.Join(repoDir, ".opencodereview") if err := os.MkdirAll(ocrDir, 0o755); err != nil { t.Fatalf("mkdir: %v", err) } @@ -449,7 +449,7 @@ func TestNewResolver_FileFilterNilWhenEmpty(t *testing.T) { func TestNewResolver_FileFilterPriorityOverride(t *testing.T) { repoDir := t.TempDir() - ocrDir := filepath.Join(repoDir, ".open-code-review") + ocrDir := filepath.Join(repoDir, ".opencodereview") if err := os.MkdirAll(ocrDir, 0o755); err != nil { t.Fatalf("mkdir: %v", err) } @@ -492,7 +492,7 @@ func TestNewResolver_FileFilterPriorityOverride(t *testing.T) { func TestNewResolver_FileFilterFallsToProject(t *testing.T) { repoDir := t.TempDir() - ocrDir := filepath.Join(repoDir, ".open-code-review") + ocrDir := filepath.Join(repoDir, ".opencodereview") if err := os.MkdirAll(ocrDir, 0o755); err != nil { t.Fatalf("mkdir: %v", err) } @@ -523,7 +523,7 @@ func TestNewResolver_FileFilterFallsToProject(t *testing.T) { func TestNewResolver_BraceExpansionInProjectRule(t *testing.T) { dir := t.TempDir() - ocrDir := filepath.Join(dir, ".open-code-review") + ocrDir := filepath.Join(dir, ".opencodereview") if err := os.MkdirAll(ocrDir, 0o755); err != nil { t.Fatalf("mkdir: %v", err) } diff --git a/internal/llm/resolver.go b/internal/llm/resolver.go index e6c3b75..fa85af4 100644 --- a/internal/llm/resolver.go +++ b/internal/llm/resolver.go @@ -21,17 +21,17 @@ type ResolvedEndpoint struct { // Environment variable names for OCR-specific configuration. const ( - envOCRLLMURL = "OCR_LLM_URL" - envOCRLLMToken = "OCR_LLM_TOKEN" - envOCRLLMModel = "OCR_LLM_MODEL" + envOCRLLMURL = "OCR_LLM_URL" + envOCRLLMToken = "OCR_LLM_TOKEN" + envOCRLLMModel = "OCR_LLM_MODEL" envOCRUseAnthropic = "OCR_USE_ANTHROPIC" ) // Environment variable names from Claude Code configuration. const ( - envCCBaseURL = "ANTHROPIC_BASE_URL" - envCCToken = "ANTHROPIC_AUTH_TOKEN" - envCCModel = "ANTHROPIC_MODEL" + envCCBaseURL = "ANTHROPIC_BASE_URL" + envCCToken = "ANTHROPIC_AUTH_TOKEN" + envCCModel = "ANTHROPIC_MODEL" ) // ResolveEndpoint reads from 4 strategy sources in priority order. @@ -59,7 +59,7 @@ func ResolveEndpoint(configPath string) (ResolvedEndpoint, error) { } } - return ResolvedEndpoint{}, fmt.Errorf("no valid LLM endpoint configured; one of OCR_LLM_URL/OCR_LLM_TOKEN/OCR_LLM_MODEL, ~/.open-code-review/config.json, or ANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN/ANTHROPIC_MODEL must be set") + return ResolvedEndpoint{}, fmt.Errorf("no valid LLM endpoint configured; one of OCR_LLM_URL/OCR_LLM_TOKEN/OCR_LLM_MODEL, ~/.opencodereview/config.json, or ANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN/ANTHROPIC_MODEL must be set") } // tryOCREnv reads OCR-specific environment variables. diff --git a/internal/session/persist.go b/internal/session/persist.go index 28e4895..08099e6 100644 --- a/internal/session/persist.go +++ b/internal/session/persist.go @@ -14,7 +14,7 @@ import ( ) // jsonlWriter streams session records to a JSONL file under -// $HOME/.open-code-review/sessions//.jsonl. +// $HOME/.opencodereview/sessions//.jsonl. // It is safe for concurrent use by multiple goroutines. type jsonlWriter struct { mu sync.Mutex @@ -65,7 +65,7 @@ func (jw *jsonlWriter) open() error { return fmt.Errorf("resolve home dir: %w", err) } - sessionDir := filepath.Join(home, ".open-code-review", "sessions", encodeRepoPath(jw.repoDir)) + sessionDir := filepath.Join(home, ".opencodereview", "sessions", encodeRepoPath(jw.repoDir)) if err := os.MkdirAll(sessionDir, 0755); err != nil { return fmt.Errorf("create session dir: %w", err) } @@ -141,16 +141,16 @@ func (jw *jsonlWriter) WriteLLMResponse(filePath string, taskType TaskType, cont jw.mu.Lock() defer jw.mu.Unlock() rec := map[string]any{ - "uuid": uuid, - "parentUuid": jw.lastUUID, - "type": "llm_response", - "sessionId": jw.sessionID, - "timestamp": time.Now().UTC().Format(time.RFC3339), - "filePath": filePath, - "taskType": string(taskType), - "model": model, - "content": content, - "tool_calls": toolCalls, + "uuid": uuid, + "parentUuid": jw.lastUUID, + "type": "llm_response", + "sessionId": jw.sessionID, + "timestamp": time.Now().UTC().Format(time.RFC3339), + "filePath": filePath, + "taskType": string(taskType), + "model": model, + "content": content, + "tool_calls": toolCalls, "duration_ms": duration.Milliseconds(), "usage": map[string]int{ "prompt_tokens": promptTokens, @@ -169,17 +169,17 @@ func (jw *jsonlWriter) WriteToolCall(filePath string, taskType TaskType, toolNam jw.mu.Lock() defer jw.mu.Unlock() rec := map[string]any{ - "uuid": uuid, - "parentUuid": jw.lastUUID, - "type": "tool_call", - "sessionId": jw.sessionID, - "timestamp": time.Now().UTC().Format(time.RFC3339), - "filePath": filePath, - "taskType": string(taskType), - "tool_name": toolName, - "arguments": arguments, - "result": result, - "ok": ok, + "uuid": uuid, + "parentUuid": jw.lastUUID, + "type": "tool_call", + "sessionId": jw.sessionID, + "timestamp": time.Now().UTC().Format(time.RFC3339), + "filePath": filePath, + "taskType": string(taskType), + "tool_name": toolName, + "arguments": arguments, + "result": result, + "ok": ok, "duration_ms": duration.Milliseconds(), } jw.writeRecordLocked(rec) diff --git a/internal/telemetry/config.go b/internal/telemetry/config.go index b539ebb..83fc52d 100644 --- a/internal/telemetry/config.go +++ b/internal/telemetry/config.go @@ -58,7 +58,7 @@ func resolveEnv(cfg *Config) { } } -// telemetrySection matches the telemetry key in ~/.open-code-review/config.json. +// telemetrySection matches the telemetry key in ~/.opencodereview/config.json. type telemetrySection struct { Enabled *bool `json:"enabled,omitempty"` Exporter *string `json:"exporter,omitempty"` @@ -121,11 +121,11 @@ func ResolveConfig(configPath string) Config { return cfg } -// HomeConfigPath returns the default path to ~/.open-code-review/config.json. +// HomeConfigPath returns the default path to ~/.opencodereview/config.json. func HomeConfigPath() string { home, err := os.UserHomeDir() if err != nil { return "" } - return filepath.Join(home, ".open-code-review", "config.json") + return filepath.Join(home, ".opencodereview", "config.json") } diff --git a/internal/viewer/store.go b/internal/viewer/store.go index 254a9ee..ba2ec69 100644 --- a/internal/viewer/store.go +++ b/internal/viewer/store.go @@ -1,6 +1,6 @@ // Package viewer provides a read-only WebUI for browsing session records // produced by open-code-review runs. It scans JSONL files under -// $HOME/.open-code-review/sessions/, parses them, and exposes structured data. +// $HOME/.opencodereview/sessions/, parses them, and exposes structured data. package viewer import ( @@ -20,7 +20,7 @@ func SessionsRoot() (string, error) { if err != nil { return "", fmt.Errorf("resolve home dir: %w", err) } - return filepath.Join(home, ".open-code-review", "sessions"), nil + return filepath.Join(home, ".opencodereview", "sessions"), nil } // RepoInfo represents a discovered repository from the sessions directory. diff --git a/pages/src/i18n/en.ts b/pages/src/i18n/en.ts index b64b8da..69d4a8a 100644 --- a/pages/src/i18n/en.ts +++ b/pages/src/i18n/en.ts @@ -70,7 +70,7 @@ export const en: TranslationKeys = { 'quickstart.step1Label1': 'Install', 'quickstart.step1Label2': 'Verify Installation', 'quickstart.step2Title': 'Configure', - 'quickstart.step2Desc': 'Configure your LLM info. Supports Anthropic and OpenAI-compatible protocols. Config file at ~/.open-code-review/config.json.', + 'quickstart.step2Desc': 'Configure your LLM info. Supports Anthropic and OpenAI-compatible protocols. Config file at ~/.opencodereview/config.json.', 'quickstart.step2Label1': 'Configure LLM', 'quickstart.step2Label2': 'Configure Language (default English)', 'quickstart.step2Label3': 'Verify Configuration', @@ -104,7 +104,7 @@ export const en: TranslationKeys = { 'docs.installVerifyLabel': 'Verify Installation', 'docs.configTitle': 'Configuration & Verification', - 'docs.configDesc': 'Manage CLI configuration settings, stored in ~/.open-code-review/config.json.', + 'docs.configDesc': 'Manage CLI configuration settings, stored in ~/.opencodereview/config.json.', 'docs.configCommand': 'Command', 'docs.configExample': 'Example', 'docs.configKeys': 'Supported Config Keys', diff --git a/pages/src/i18n/zh.ts b/pages/src/i18n/zh.ts index ee0490c..f686986 100644 --- a/pages/src/i18n/zh.ts +++ b/pages/src/i18n/zh.ts @@ -70,7 +70,7 @@ export const zh: TranslationKeys = { 'quickstart.step1Label1': '安装', 'quickstart.step1Label2': '验证安装', 'quickstart.step2Title': '配置', - 'quickstart.step2Desc': '配置您的 LLM 信息,支持 Anthropic 和 OpenAI 兼容协议。配置文件位于 ~/.open-code-review/config.json。', + 'quickstart.step2Desc': '配置您的 LLM 信息,支持 Anthropic 和 OpenAI 兼容协议。配置文件位于 ~/.opencodereview/config.json。', 'quickstart.step2Label1': '配置 LLM', 'quickstart.step2Label2': '配置语言(默认英文)', 'quickstart.step2Label3': '验证配置', @@ -104,7 +104,7 @@ export const zh: TranslationKeys = { 'docs.installVerifyLabel': '验证安装', 'docs.configTitle': '配置与验证', - 'docs.configDesc': '管理 CLI 的配置设置,存储在 ~/.open-code-review/config.json。', + 'docs.configDesc': '管理 CLI 的配置设置,存储在 ~/.opencodereview/config.json。', 'docs.configCommand': '命令', 'docs.configExample': '示例', 'docs.configKeys': '支持的配置 Key', diff --git a/scripts/update.js b/scripts/update.js index 8d329fd..558047e 100644 --- a/scripts/update.js +++ b/scripts/update.js @@ -20,7 +20,7 @@ const { const packageRoot = path.join(__dirname, ".."); const binDir = path.join(packageRoot, "bin"); const binaryPath = path.join(binDir, "opencodereview"); -const stateDir = path.join(os.homedir(), ".open-code-review"); +const stateDir = path.join(os.homedir(), ".opencodereview"); const tsFile = path.join(stateDir, "last-update-check"); const lockFile = path.join(stateDir, "update.lock");