Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 171 additions & 0 deletions CONTRIBUTING.ar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
# المساهمة في OpenCode

نحن نريد أن نجعل من السهل عليكم المساهمة في OpenCode. إليك أكثر أنواع التغييرات شيوعًا التي يتم دمجها:

- إصلاحات الأخطاء (Bug fixes)
- إضافة مزودي خدمات لغوية (LSPs) / منسقات (Formatters) إضافية
- تحسينات على أداء النماذج اللغوية الكبيرة (LLM)
- دعم مزودين جدد
- إصلاحات لمشاكل بيئية محددة
- إضافة سلوك قياسي مفقود
- تحسينات التوثيق

ومع ذلك، أي تغييرات على واجهة المستخدم (UI) أو ميزات المنتج الأساسية يجب أن تمر بمراجعة تصميم مع الفريق الأساسي قبل التنفيذ.

إذا كنت غير متأكد مما إذا كان سيتم قبول طلب السحب (PR) الخاص بك، فلا تتردد في سؤال أحد المشرفين أو البحث عن المشكلات (issues) التي تحمل أيًا من التسميات التالية:

- [`help wanted`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3Ahelp-wanted)
- [`good first issue`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)
- [`bug`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug)
- [`perf`](https://github.com/anomalyco/opencode/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22perf%22)

> [!NOTE]
> طلبات السحب التي تتجاهل هذه الضوابط ستم إغلاقها على الأرجح.

هل تريد تولي مشكلة؟ اترك تعليقًا وقد يقوم أحد المشرفين بتعيينها لك ما لم يكن شيئًا نعمل عليه بالفعل.

## تطوير OpenCode

- المتطلبات: Bun 1.3+
- قم بتثبيت التبعيات وتشغيل خادم التطوير من جذر المستودع:

```bash
bun install
bun dev
```

### التشغيل مقابل دليل مختلف

بشكل افتراضي، يقوم `bun dev` بتشغيل OpenCode في دليل `packages/opencode`. لتشغيله مقابل دليل أو مستودع مختلف:

```bash
bun dev <directory>
```

لتشغيل OpenCode في جذر مستودع opencode نفسه:

```bash
bun dev .
```

### بناء "localcode"

لتجميع ملف تنفيذي مستقل:

```bash
./packages/opencode/script/build.ts --single
```

ثم قم بتشغيله باستخدام:

```bash
./packages/opencode/dist/opencode-<platform>/bin/opencode
```

استبدل `<platform>` بمنصتك (على سبيل المثال، `darwin-arm64`، `linux-x64`).

- الأجزاء الأساسية:
- `packages/opencode`: منطق العمل الأساسي وخادم OpenCode.
- `packages/opencode/src/cli/cmd/tui/`: كود واجهة المستخدم النصية (TUI)، مكتوب بـ SolidJS و [opentui](https://github.com/sst/opentui)
- `packages/app`: مكونات واجهة مستخدم الويب المشتركة، مكتوبة بـ SolidJS
- `packages/desktop`: تطبيق سطح المكتب الأصلي، مبني بـ Tauri (يغلف `packages/app`)
- `packages/plugin`: المصدر لـ `@opencode-ai/plugin`

### تشغيل تطبيق الويب

لاختبار تغييرات واجهة المستخدم أثناء التطوير، قم بتشغيل تطبيق الويب:

```bash
bun run --cwd packages/app dev
```

يبدأ هذا خادم تطوير محلي على http://localhost:5173 (أو منفذ مشابه يظهر في الإخراج). يمكن اختبار معظم تغييرات واجهة المستخدم هنا.

### تشغيل تطبيق سطح المكتب

تطبيق سطح المكتب هو تطبيق Tauri أصلي يغلف واجهة مستخدم الويب.

لتشغيل تطبيق سطح المكتب الأصلي:

```bash
bun run --cwd packages/desktop tauri dev
```

يبدأ هذا خادم تطوير الويب على http://localhost:1420 ويفتح النافذة الأصلية.

إذا كنت تريد فقط خادم تطوير الويب (بدون الغلاف الأصلي):

```bash
bun run --cwd packages/desktop dev
```

لإنشاء `dist/` للإنتاج وبناء حزمة التطبيق الأصلي:

```bash
bun run --cwd packages/desktop tauri build
```

يقوم هذا بتشغيل `bun run --cwd packages/desktop build` تلقائيًا عبر `beforeBuildCommand` الخاص بـ Tauri.

> [!NOTE]
> يتطلب تشغيل تطبيق سطح المكتب تبعيات Tauri إضافية (سلسلة أدوات Rust، مكتبات خاصة بالمنصة). انظر [متطلبات Tauri](https://v2.tauri.app/start/prerequisites/) لتعليمات الإعداد.

> [!NOTE]
> إذا قمت بإجراء تغييرات على API أو SDK (على سبيل المثال `packages/opencode/src/server/server.ts`)، قم بتشغيل `./script/generate.ts` لإعادة إنشاء SDK والملفات ذات الصلة.

برجاء محاولة اتباع [دليل الأسلوب](./STYLE_GUIDE.md).

### إعداد مصحح الأخطاء (Debugger)

تصحيح الأخطاء في Bun لا يزال في بداياته. نأمل أن يساعدك هذا الدليل في الإعداد وتجنب بعض نقاط الألم.

الطريقة الأكثر موثوقية لتصحيح أخطاء OpenCode هي تشغيله يدويًا في محطة طرفية عبر `bun run --inspect=<url> dev ...` وإرفاق مصحح الأخطاء الخاص بك عبر هذا الرابط. الطرق الأخرى قد تؤدي إلى تعيين نقاط التوقف بشكل غير صحيح، على الأقل في VSCode.

تنبيهات:

- إذا كنت ترغب في تشغيل OpenCode TUI وتشغيل نقاط التوقف في كود الخادم، فقد تحتاج إلى تشغيل `bun dev spawn` بدلاً من `bun dev` المعتاد. وذلك لأن `bun dev` يقوم بتشغيل الخادم في خيط عامل (worker thread) وقد لا تعمل نقاط التوقف هناك.
- إذا لم يعمل `spawn` معك، يمكنك تصحيح الخادم بشكل منفصل:
- تصحيح الخادم: `bun run --inspect=ws://localhost:6499/ ./src/index.ts serve --port 4096`،
ثم أرفق TUI بـ `opencode attach http://localhost:4096`
- تصحيح TUI: `bun run --inspect=ws://localhost:6499/ --conditions=browser ./src/index.ts`

نصائح وحيل أخرى:

- قد ترغب في استخدام `--inspect-wait` أو `--inspect-brk` بدلاً من `--inspect`، اعتمادًا على سير عملك
- تحديد `--inspect=ws://localhost:6499/` في كل استدعاء يمكن أن يكون متعبًا، قد ترغب في `export BUN_OPTIONS=--inspect=ws://localhost:6499/` بدلاً من ذلك

#### إعداد VSCode

إذا كنت تستخدم VSCode، يمكنك استخدام تكوينات المثال لدينا [.vscode/settings.example.json](.vscode/settings.example.json) و [.vscode/launch.example.json](.vscode/launch.example.json).

بعض طرق التصحيح التي يمكن أن تكون بها مشاكل:

- تكوينات التصحيح مع `"request": "launch"` يمكن أن يكون لها نقاط توقف معينة بشكل غير صحيح وبالتالي غير قابلة للاستخدام
- تظهر نفس المشكلة عند تشغيل OpenCode في `JavaScript Debug Terminal` في VSCode

ومع ذلك، قد ترغب في تجربة هذه الطرق، فقد تعمل معك.

## توقعات طلب السحب (Pull Request)

- حاول الحفاظ على طلبات السحب صغيرة ومركزة.
- اربط المشكلة (المشاكل) ذات الصلة في الوصف
- اشرح المشكلة ولماذا يقوم تغييرك بإصلاحها
- تجنب وجود أوصاف PR مطولة تم إنشاؤها بواسطة LLM
- قبل إضافة وظائف أو ميزات جديدة، تأكد من أن مثل هذا السلوك لا يوجد بالفعل في مكان آخر في قاعدة التعليمات البرمجية.

### تفضيلات الأسلوب

هذه ليست مفروضة بصرامة، بل هي مجرد إرشادات عامة:

- **الدوال (Functions):** احتفظ بالمنطق داخل دالة واحدة ما لم يضف تقسيمها فوائد واضحة لإعادة الاستخدام أو التركيب.
- **تفكيك البنية (Destructuring):** لا تقم بتفكيك غير ضروري للمتغيرات.
- **تدفق التحكم:** تجنب عبارات `else`.
- **مُعالجة الأخطاء:** فضل `.catch(...)` بدلاً من `try`/`catch` عندما يكون ذلك ممكنًا.
- **الأنواع (Types):** ابحث عن أنواع دقيقة وتجنب `any`.
- **المتغيرات:** التزم بالأنماط غير القابلة للتغيير وتجنب `let`.
- **التسمية:** اختر معرفات موجزة من كلمة واحدة عندما تظل وصفية.
- **واجهات برمجة التطبيقات وقت التشغيل:** استخدم مساعدي Bun مثل `Bun.file()` عندما تناسب حالة الاستخدام.

## طلبات الميزات (Feature Requests)

للحصول على وظائف جديدة تمامًا، ابدأ بمحادثة تصميم. افتح مشكلة تصف المشكلة، ونهجك المقترح (اختياري)، ولماذا تنتمي إلى OpenCode. سيساعد الفريق الأساسي في تحديد ما إذا كان يجب المضي قدمًا؛ يرجى انتظار تلك الموافقة بدلاً من فتح PR للميزة مباشرة.
171 changes: 171 additions & 0 deletions CONTRIBUTING.zh-CN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
# 贡献给 OpenCode

我们希望让大家能够轻松地为 OpenCode 做贡献。以下是最常见的会被合并的更改类型:

- Bug 修复
- 增加额外的 LSP / Formatter
- 提升 LLM 性能
- 支持新的提供商 (Provider)
- 针对特定环境问题的修复
- 缺失的标准行为
- 文档改进

但是,任何 UI 或核心产品功能的更改,在实施前必须经过核心团队的设计审查。

如果您不确定您的 PR 是否会被接受,请随时咨询维护者,或查看带有以下相关标签的 issue:

- [`help wanted`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3Ahelp-wanted)
- [`good first issue`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)
- [`bug`](https://github.com/anomalyco/opencode/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug)
- [`perf`](https://github.com/anomalyco/opencode/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22perf%22)

> [!NOTE]
> 忽略这些限制的 PR 很可能会被关闭。

想认领一个 issue 吗?请留言,除非我们已经着手处理,否则维护者可能会将其分配给您。

## 开发 OpenCode

- 需求: Bun 1.3+
- 从代码库根目录安装依赖并启动开发服务器:

```bash
bun install
bun dev
```

### 在不同目录下运行

默认情况下,`bun dev` 会在 `packages/opencode` 目录下运行 OpenCode。若要在不同目录或仓库下运行:

```bash
bun dev <directory>
```

要在 opencode 仓库本身的根目录下运行 OpenCode:

```bash
bun dev .
```

### 构建 "localcode"

要编译独立的可执行文件:

```bash
./packages/opencode/script/build.ts --single
```

然后通过以下命令运行:

```bash
./packages/opencode/dist/opencode-<platform>/bin/opencode
```

将 `<platform>` 替换为您的平台(例如 `darwin-arm64`, `linux-x64`)。

- 核心组件:
- `packages/opencode`: OpenCode 核心业务逻辑与服务器。
- `packages/opencode/src/cli/cmd/tui/`: TUI 代码,使用 SolidJS 和 [opentui](https://github.com/sst/opentui) 编写。
- `packages/app`: 共享的 Web UI 组件,使用 SolidJS 编写。
- `packages/desktop`: 原生桌面应用,使用 Tauri 构建(封装了 `packages/app`)。
- `packages/plugin`: `@opencode-ai/plugin` 的源代码。

### 运行 Web 应用

要在开发过程中测试 UI 更改,请运行 Web 应用:

```bash
bun run --cwd packages/app dev
```

这将在 http://localhost:5173 (或输出中显示的其他端口)启动本地开发服务器。大多数 UI 更改都可以在此处进行测试。

### 运行桌面应用

桌面应用是一个封装了 Web UI 的原生 Tauri 应用。

要运行原生桌面应用:

```bash
bun run --cwd packages/desktop tauri dev
```

这将在 http://localhost:1420 启动 Web 开发服务器并打开原生窗口。

如果您只需要 Web 开发服务器(不需要原生 shell):

```bash
bun run --cwd packages/desktop dev
```

要创建生产环境的 `dist/` 并构建原生应用包:

```bash
bun run --cwd packages/desktop tauri build
```

这将通过 Tauri 的 `beforeBuildCommand` 自动运行 `bun run --cwd packages/desktop build`。

> [!NOTE]
> 运行桌面应用需要额外的 Tauri 依赖项(Rust 工具链、特定平台的库)。请参阅 [Tauri 先决条件](https://v2.tauri.app/start/prerequisites/) 了解设置说明。

> [!NOTE]
> 如果您更改了 API 或 SDK(例如 `packages/opencode/src/server/server.ts`),请运行 `./script/generate.ts` 以重新生成 SDK 和相关文件。

请尝试遵循 [风格指南](./STYLE_GUIDE.md)。

### 设置调试器 (Debugger)

Bun 的调试功能目前还比较粗糙。希望本指南能帮助您完成设置并避免一些痛点。

调试 OpenCode 最可靠的方法是通过 `bun run --inspect=<url> dev ...` 手动在终端运行,然后通过该 URL 附加您的调试器。其他方法可能会导致断点映射错误,至少在 VSCode 中是这样(因人而异)。

注意事项:

- 如果您想运行 OpenCode TUI 并在服务器代码中触发断点,您可能需要运行 `bun dev spawn` 而不是通常的 `bun dev`。这是因为 `bun dev` 在工作线程中运行服务器,断点可能无法在那里工作。
- 如果 `spawn` 对您不起作用,您可以单独调试服务器:
- 调试服务器:`bun run --inspect=ws://localhost:6499/ ./src/index.ts serve --port 4096`,
然后使用 `opencode attach http://localhost:4096` 附加 TUI。
- 调试 TUI:`bun run --inspect=ws://localhost:6499/ --conditions=browser ./src/index.ts`

其他技巧:

- 根据您的工作流程,您可能想要使用 `--inspect-wait` 或 `--inspect-brk` 代替 `--inspect`。
- 每次调用都指定 `--inspect=ws://localhost:6499/` 可能很繁琐,您可以使用 `export BUN_OPTIONS=--inspect=ws://localhost:6499/` 代替。

#### VSCode 设置

如果您使用 VSCode,可以使用我们的配置示例 [.vscode/settings.example.json](.vscode/settings.example.json) 和 [.vscode/launch.example.json](.vscode/launch.example.json)。

一些可能有问题的调试方法:

- `"request": "launch"` 的调试配置可能会导致断点映射错误而无法使用。
- 在 VSCode `JavaScript Debug Terminal` 中运行 OpenCode 时也会出现同样的问题。

话虽如此,您不妨尝试这些方法,它们可能对您有用。

## Pull Request 期望

- 尽量保持 PR 小而专注。
- 在描述中链接相关的 issue。
- 解释问题以及您的更改为何能修复它。
- 避免使用冗长的 LLM 生成的 PR 描述。
- 在添加新函数或功能之前,请确保该行为代码库中尚未存在。

### 风格偏好

这些不是强制执行的,只是一般准则:

- **函数**:保持逻辑在一个函数内,除非拆分能通过复用或组合带来明显的好处。
- **解构**:不要进行不必要的变量解构。
- **控制流**:避免 `else` 语句。
- **错误处理**:尽可能使用 `.catch(...)` 而不是 `try`/`catch`。
- **类型**:追求精确的类型,避免 `any`。
- **变量**:坚持不可变模式,避免 `let`。
- **命名**:当能保持描述性时,选择简洁的单词标识符。
- **运行时 API**:当适合用例时,使用 Bun 辅助函数,如 `Bun.file()`。

## 功能请求

对于全新的功能,请从设计讨论开始。开启一个 issue 描述问题、您建议的方法(可选)以及为什么它属于 OpenCode。核心团队将帮助决定是否应该推进;请等待批准,不要直接开启功能 PR。
Loading