Skip to content
Closed
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
14 changes: 11 additions & 3 deletions AGENTS-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,26 @@ BitFun 是一个由 Rust workspace 与 React 前端组成的项目。
| 模块 | 路径 | Agent 文档 |
|---|---|---|
| Core(产品逻辑) | `src/crates/core` | [AGENTS.md](src/crates/core/AGENTS.md) |
| 已拆出的 core 支撑 crate | `src/crates/{core-types,agent-stream,runtime-ports,runtime-services,terminal,tool-runtime}` | (使用 core 指南) |
| Core 共享 DTO | `src/crates/core-types` | [AGENTS.md](src/crates/core-types/AGENTS.md) |
| 事件契约 | `src/crates/events` | [AGENTS.md](src/crates/events/AGENTS.md) |
| Agent stream 归一化 | `src/crates/agent-stream` | [AGENTS.md](src/crates/agent-stream/AGENTS.md) |
| Runtime ports | `src/crates/runtime-ports` | [AGENTS.md](src/crates/runtime-ports/AGENTS.md) |
| Runtime services | `src/crates/runtime-services` | [AGENTS.md](src/crates/runtime-services/AGENTS.md) |
| Terminal 基础设施 | `src/crates/terminal` | [AGENTS.md](src/crates/terminal/AGENTS.md) |
| 底层 tool runtime | `src/crates/tool-runtime` | [AGENTS.md](src/crates/tool-runtime/AGENTS.md) |
| Agent runtime owner crate | `src/crates/agent-runtime` | [AGENTS.md](src/crates/agent-runtime/AGENTS.md) |
| Harness workflow contracts | `src/crates/harness` | [AGENTS.md](src/crates/harness/AGENTS.md) |
| Service core owner crate | `src/crates/services-core` | [AGENTS.md](src/crates/services-core/AGENTS.md) |
| Service integrations owner crate | `src/crates/services-integrations` | [AGENTS.md](src/crates/services-integrations/AGENTS.md) |
| Agent tool contracts | `src/crates/agent-tools` | [AGENTS.md](src/crates/agent-tools/AGENTS.md) |
| Tool pack provider plan | `src/crates/tool-packs` | [AGENTS.md](src/crates/tool-packs/AGENTS.md) |
| 产品领域 crate | `src/crates/product-domains` | [AGENTS.md](src/crates/product-domains/AGENTS.md) |
| Transport 适配层 | `src/crates/transport` | (使用 core 指南) |
| API layer | `src/crates/api-layer` | (使用 core 指南) |
| 产品能力包 | `src/crates/product-capabilities` | [AGENTS.md](src/crates/product-capabilities/AGENTS.md) |
| Transport 适配层 | `src/crates/transport` | [AGENTS.md](src/crates/transport/AGENTS.md) |
| API layer | `src/crates/api-layer` | [AGENTS.md](src/crates/api-layer/AGENTS.md) |
| ACP 集成 | `src/crates/acp` | [AGENTS.md](src/crates/acp/AGENTS.md) |
| AI adapters | `src/crates/ai-adapters` | [AGENTS.md](src/crates/ai-adapters/AGENTS.md) |
| 嵌入式 WebDriver | `src/crates/webdriver` | [AGENTS.md](src/crates/webdriver/AGENTS.md) |
| 桌面应用 | `src/apps/desktop` | [AGENTS.md](src/apps/desktop/AGENTS.md) |
| Server | `src/apps/server` | (使用 core 指南) |
| CLI | `src/apps/cli` | (使用 core 指南) |
Expand Down
14 changes: 11 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,26 @@ Repository rule: **keep product logic platform-agnostic, then expose it through
| Module | Path | Agent doc |
|---|---|---|
| Core (product logic) | `src/crates/core` | [AGENTS.md](src/crates/core/AGENTS.md) |
| Extracted core support | `src/crates/{core-types,agent-stream,runtime-ports,runtime-services,terminal,tool-runtime}` | (use core guide) |
| Core shared DTOs | `src/crates/core-types` | [AGENTS.md](src/crates/core-types/AGENTS.md) |
| Event contracts | `src/crates/events` | [AGENTS.md](src/crates/events/AGENTS.md) |
| Agent stream normalization | `src/crates/agent-stream` | [AGENTS.md](src/crates/agent-stream/AGENTS.md) |
| Runtime ports | `src/crates/runtime-ports` | [AGENTS.md](src/crates/runtime-ports/AGENTS.md) |
| Runtime services | `src/crates/runtime-services` | [AGENTS.md](src/crates/runtime-services/AGENTS.md) |
| Terminal infrastructure | `src/crates/terminal` | [AGENTS.md](src/crates/terminal/AGENTS.md) |
| Low-level tool runtime | `src/crates/tool-runtime` | [AGENTS.md](src/crates/tool-runtime/AGENTS.md) |
| Agent runtime owner crate | `src/crates/agent-runtime` | [AGENTS.md](src/crates/agent-runtime/AGENTS.md) |
| Harness workflow contracts | `src/crates/harness` | [AGENTS.md](src/crates/harness/AGENTS.md) |
| Service core owner crate | `src/crates/services-core` | [AGENTS.md](src/crates/services-core/AGENTS.md) |
| Service integrations owner crate | `src/crates/services-integrations` | [AGENTS.md](src/crates/services-integrations/AGENTS.md) |
| Agent tool contracts | `src/crates/agent-tools` | [AGENTS.md](src/crates/agent-tools/AGENTS.md) |
| Tool pack provider plan | `src/crates/tool-packs` | [AGENTS.md](src/crates/tool-packs/AGENTS.md) |
| Product domains | `src/crates/product-domains` | [AGENTS.md](src/crates/product-domains/AGENTS.md) |
| Transport adapters | `src/crates/transport` | (use core guide) |
| API layer | `src/crates/api-layer` | (use core guide) |
| Product capabilities | `src/crates/product-capabilities` | [AGENTS.md](src/crates/product-capabilities/AGENTS.md) |
| Transport adapters | `src/crates/transport` | [AGENTS.md](src/crates/transport/AGENTS.md) |
| API layer | `src/crates/api-layer` | [AGENTS.md](src/crates/api-layer/AGENTS.md) |
| ACP integration | `src/crates/acp` | [AGENTS.md](src/crates/acp/AGENTS.md) |
| AI adapters | `src/crates/ai-adapters` | [AGENTS.md](src/crates/ai-adapters/AGENTS.md) |
| Embedded WebDriver | `src/crates/webdriver` | [AGENTS.md](src/crates/webdriver/AGENTS.md) |
| Desktop app | `src/apps/desktop` | [AGENTS.md](src/apps/desktop/AGENTS.md) |
| Server | `src/apps/server` | (use core guide) |
| CLI | `src/apps/cli` | (use core guide) |
Expand Down
126 changes: 34 additions & 92 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,81 +54,27 @@ pnpm run e2e:test

### Desktop debugging tools

When working on desktop UI/UX, the `devtools` Cargo feature provides additional debugging capabilities. It is automatically enabled in `dev` builds and `release-fast` profile builds, but never in `release` builds for end users.

| Shortcut | Action |
|---|---|
| `Cmd/Ctrl + Shift + I` | Toggle element inspector — hover to highlight elements, click to capture metadata |
| `Cmd/Ctrl + Shift + J` | Open native webview DevTools window |

The element inspector injects a lightweight script into the main webview. When you click an element, it captures:
- Tag, id, class, CSS selector path
- Computed styles and CSS variables
- Box model (margin, padding, border)
- Color values (text, background, border)
- Element attributes

Captured data is logged as structured JSON under the `bitfun::devtools` target.
Desktop dev builds enable the `devtools` Cargo feature. Use
`Cmd/Ctrl + Shift + I` for the element inspector and `Cmd/Ctrl + Shift + J` for
native webview DevTools. These tools are disabled in end-user `release` builds.

## Code Standards and Architecture Constraints

### Logging

- English only, avoid verbose logs
- Frontend: `createLogger('ModuleName')`
- Backend: `log::{info, debug, warn, error}` macros

### Internationalization

- Locale metadata lives in `src/shared/i18n/contract/locales.json`; run
`pnpm run i18n:generate` after editing it.
- Put stable cross-surface labels in `src/shared/i18n/resources/shared`; keep
workflow copy in the owning surface.
- Web UI route or feature copy should use `useI18n(namespace)`. Do not import
Web UI locale catalogs into mobile-web, installer, backend, or static pages.
- Static self-contained pages may use generated page-scoped shared-term files
instead of copying stable labels.
- User-visible dates, times, and numbers should use shared i18n formatting
helpers instead of direct `Intl.*` or `toLocale*` calls.
- `pnpm run i18n:audit` enforces key/placeholder parity, direct static key
existence, dynamic key source proofs, literal fallback and locale-format
no-growth baselines, shared-term/l10n governance baselines, non-blocking
same-text locale inventory, and the no-hardcoded-CJK source budget.

### Platform-agnostic core

Do not use platform-specific dependencies in `core`:

- ❌ `tauri::AppHandle`
- ✅ `bitfun_events::EventEmitter`

For `bitfun-core` decomposition or build-speed refactors, follow
[`docs/architecture/core-decomposition.md`](docs/architecture/core-decomposition.md)
and do not change product feature sets or release scripts as a side effect.

For Deep Review / Code Review Team changes, keep
[`docs/architecture/deep-review.md`](docs/architecture/deep-review.md),
`src/crates/core/src/agentic/deep_review/CONTRIBUTING.md`, and
`src/web-ui/src/flow_chat/deep-review/CONTRIBUTING.md` aligned with the
implementation.

### Tauri command conventions

- Command names use `snake_case`
- Keep Rust and TypeScript naming aligned
- Always use structured request format:

```rust
#[tauri::command]
pub async fn your_command(
state: State<'_, AppState>,
request: YourRequest,
) -> Result<YourResponse, String>
```

```ts
await api.invoke("your_command", { request: { /* ... */ } });
```
Use [`AGENTS.md`](AGENTS.md) as the canonical source for architecture-sensitive
rules, module boundaries, and the verification matrix. In contributor-facing
terms:

- Logs are English-only and should stay useful, not noisy.
- User-visible copy should use the project i18n flow; do not share Web UI
locale catalogs with smaller surfaces.
- Shared core must stay platform-agnostic. Desktop/Tauri details belong in app
adapters and flow back through transport/API layers.
- Tauri commands use `snake_case` command names and structured `request`
payloads.
- Core decomposition, feature-boundary, dependency-boundary, and build-speed
work must follow `docs/architecture/core-decomposition.md`.
- Deep Review / Code Review Team changes must keep the core and Web UI guidance
aligned with the implementation.

## Key Contribution Focus Areas

Expand Down Expand Up @@ -185,29 +131,25 @@ Keep PRs small and focused. Avoid bundling unrelated changes.

## Testing and Verification

Run relevant tests for your change. You do not need to run every row below; choose the smallest set that matches the files and behavior you touched:

CI covers full builds and broad test suites. Local prechecks should stay focused
unless the change directly touches build, packaging, or a path not covered by CI.
Run the smallest checks that match the changed files and behavior. CI covers
full builds and broad test suites; local prechecks should stay focused unless
the change affects build, packaging, release behavior, or a path CI cannot
protect.

For `/usage` UI copy changes, keep `en-US`, `zh-CN`, and `zh-TW` locale strings in sync.
Common local checks:

| Change type | Recommended verification |
| Change type | Typical verification |
| --- | --- |
| Repository metadata, PR/issue templates, or GitHub workflows | `pnpm run check:repo-hygiene && pnpm run check:github-config && git diff --check` |
| Locale resource-only changes | `pnpm run i18n:audit` |
| Locale contract or shared terms | `pnpm run i18n:generate && pnpm run i18n:contract:test && pnpm run i18n:audit` |
| Web UI state, adapters, or runtime code | `pnpm run type-check:web`, plus the nearest focused test when behavior changed |
| Web UI i18n runtime or namespace-loading changes | `pnpm run i18n:contract:test && pnpm run type-check:web && pnpm --dir src/web-ui run test:run src/infrastructure/i18n/core/I18nService.test.ts` |
| Mobile web UI, pairing, reconnect, disconnect, or chat-flow changes | `pnpm --dir src/mobile-web run type-check` |
| Installer frontend or i18n runtime without packaging changes | `pnpm --dir BitFun-Installer run type-check` |
| Rust core, transport, API layer, services, or shared runtime logic | `cargo check --workspace`, plus the nearest focused `cargo test` when behavior changed |
| Desktop integration, Tauri APIs, or desktop-only behavior | `cargo check -p bitfun-desktop`, plus focused desktop tests when behavior changed |
| E2E-covered behavior | Run the closest focused E2E/smoke check; rely on CI for broad build/test coverage unless build behavior changed |

For mobile-web pairing, reconnect, disconnect, or chat-flow changes, include manual verification steps and screenshots or a short recording when the UI changes.

If you cannot run tests, explain why in the PR and provide manual verification steps.
| Repository metadata or GitHub config | `pnpm run check:repo-hygiene && pnpm run check:github-config && git diff --check` |
| Frontend runtime or UI | `pnpm run type-check:web`, plus the nearest focused test when behavior changed |
| Mobile web | `pnpm --dir src/mobile-web run type-check` |
| Rust shared runtime or services | `cargo check --workspace`, plus a focused `cargo test` when behavior changed |
| Desktop/Tauri integration | `cargo check -p bitfun-desktop` |
| i18n resources or contract | use the matching i18n row in `AGENTS.md` |

For UI changes, include screenshots or a short recording when helpful. If you
cannot run a relevant check, explain why in the PR and provide a lower-risk
manual verification path.

## Security and Compliance

Expand Down
99 changes: 22 additions & 77 deletions CONTRIBUTING_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,67 +54,20 @@ pnpm run e2e:test

### 桌面端调试工具

开发桌面端 UI/UX 时,`devtools` Cargo feature 提供额外的调试能力。它在 `dev` 构建和 `release-fast` profile 构建中自动启用,但在面向最终用户的 `release` 构建中永不启用。

| 快捷键 | 功能 |
|---|---|
| `Cmd/Ctrl + Shift + I` | 切换元素检查器 — 悬停高亮元素,点击采集元数据 |
| `Cmd/Ctrl + Shift + J` | 打开原生 webview DevTools 窗口 |

元素检查器向主 webview 注入一个轻量脚本。点击元素后会采集:
- 标签、id、class、CSS 选择器路径
- Computed styles 和 CSS 变量
- Box model(margin、padding、border)
- 颜色值(文本、背景、边框)
- 元素属性

采集的数据以结构化 JSON 形式输出到 `bitfun::devtools` 日志目标下。
桌面端 dev 构建会启用 `devtools` Cargo feature。`Cmd/Ctrl + Shift + I` 打开元素检查器,
`Cmd/Ctrl + Shift + J` 打开原生 webview DevTools;面向最终用户的 `release` 构建不会启用这些工具。

## 代码规范与架构约束

### 日志规范

- 仅使用英文日志,避免冗长输出
- 前端:`createLogger('ModuleName')`
- 后端:`log::{info, debug, warn, error}` 宏

### 国际化

- Locale 元数据统一维护在 `src/shared/i18n/contract/locales.json`;修改后运行
`pnpm run i18n:generate`。
- 跨形态稳定标签放在 `src/shared/i18n/resources/shared`;流程文案留在所属形态资源中。
- Web UI 路由或功能文案使用 `useI18n(namespace)`。不要把 Web UI locale 资源导入 mobile-web、installer、backend 或静态页面。
- `pnpm run i18n:audit` 会检查 key / 占位符一致性、直接静态 key 是否存在,以及
source 中不再新增硬编码 CJK 文案。

### 平台无关核心

`core` 中禁止引入平台相关依赖:
架构敏感规则、模块边界和验证矩阵以 [`AGENTS.md`](AGENTS.md) 为准。面向贡献者只需把握:

- ❌ `tauri::AppHandle`
- ✅ `bitfun_events::EventEmitter`

进行 `bitfun-core` 拆解或构建提速重构时,请遵循
[`docs/architecture/core-decomposition.md`](docs/architecture/core-decomposition.md),
不要把产品 feature set 或 release 脚本变更作为顺手改动。

### Tauri 命令规范

- 命令名使用 `snake_case`
- Rust 与 TypeScript 命名保持一致
- 必须使用结构化请求格式:

```rust
#[tauri::command]
pub async fn your_command(
state: State<'_, AppState>,
request: YourRequest,
) -> Result<YourResponse, String>
```

```ts
await api.invoke("your_command", { request: { /* ... */ } });
```
- 日志只使用英文,并保持必要、可读。
- 用户可见文案走项目 i18n 流程;不要把 Web UI locale catalog 共享给较小产品形态。
- shared core 必须保持平台无关;Desktop/Tauri 细节属于 app adapter,并通过 transport / API layer 回流。
- Tauri command 使用 `snake_case` 命令名和结构化 `request` 参数。
- core 拆解、feature 边界、依赖边界和构建提速重构必须遵循
`docs/architecture/core-decomposition.md`。
- Deep Review / 代码审核团队改动需要保持 core 与 Web UI 指南和实现一致。

## 重点关注的贡献方向

Expand Down Expand Up @@ -171,29 +124,21 @@ UI 改动请附前后对比截图或短录屏,方便快速评审。

## 测试与验证

按改动范围运行相关测试;不需要跑完下方所有命令,只选择与本次改动文件和行为匹配的最小集合:

完整构建和大范围测试由 CI 保护。本地预检应保持聚焦;只有改动直接触及构建、打包,
或 CI 不覆盖对应路径时才运行更重命令。
按改动文件和行为选择最小检查。完整构建和大范围测试由 CI 保护;只有改动影响构建、打包、发布行为,
或 CI 无法覆盖对应路径时,才在本地运行更重命令。

修改 `/usage` UI 文案时,请同步 `en-US`、`zh-CN`、`zh-TW` 多语言文本。
常见本地检查:

| 改动类型 | 推荐验证 |
| 改动类型 | 常用验证 |
| --- | --- |
| 仓库元信息、PR/Issue 模板或 GitHub workflow | `pnpm run check:repo-hygiene && pnpm run check:github-config && git diff --check` |
| 仅 locale 资源改动 | `pnpm run i18n:audit` |
| Locale contract 或 shared terms | `pnpm run i18n:generate && pnpm run i18n:contract:test && pnpm run i18n:audit` |
| Web UI 状态、适配层或运行时代码 | `pnpm run type-check:web`;行为变化时再加最近的 focused test |
| Web UI i18n runtime 或 namespace loading 改动 | `pnpm run i18n:contract:test && pnpm run type-check:web && pnpm --dir src/web-ui run test:run src/infrastructure/i18n/core/I18nService.test.ts` |
| Mobile web UI、配对、重连、断开或聊天流程 | `pnpm --dir src/mobile-web run type-check` |
| 不涉及打包的安装器前端或 i18n runtime | `pnpm --dir BitFun-Installer run type-check` |
| Rust core、transport、API layer、services 或共享运行时逻辑 | `cargo check --workspace`;行为变化时再加最近的 focused `cargo test` |
| 桌面端集成、Tauri API 或桌面端专属行为 | `cargo check -p bitfun-desktop`;行为变化时再加 focused desktop tests |
| E2E 覆盖的行为 | 运行最近的 focused E2E/smoke check;除非影响构建,否则 broad build/test 交给 CI |

Mobile web 配对、重连、断开或聊天流程改动,需要在 PR 中补充手动验证步骤;涉及 UI 变化时,请附截图或短录屏。

如暂时无法运行测试,请在 PR 描述中说明原因,并提供手动验证步骤。
| 仓库元信息或 GitHub 配置 | `pnpm run check:repo-hygiene && pnpm run check:github-config && git diff --check` |
| 前端运行时或 UI | `pnpm run type-check:web`;行为变化时再加最近的 focused test |
| Mobile web | `pnpm --dir src/mobile-web run type-check` |
| Rust 共享 runtime 或 services | `cargo check --workspace`;行为变化时再加 focused `cargo test` |
| Desktop/Tauri 集成 | `cargo check -p bitfun-desktop` |
| i18n 资源或契约 | 使用 `AGENTS.md` 中匹配的 i18n 验证行 |

UI 改动在有帮助时附截图或短录屏。无法运行相关检查时,在 PR 中说明原因,并提供风险更低的手动验证路径。

## 安全与合规

Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ members = [
"src/crates/agent-stream",
"src/crates/agent-runtime",
"src/crates/harness",
"src/crates/product-capabilities",
"src/crates/runtime-ports",
"src/crates/runtime-services",
"src/crates/services-core",
Expand Down
Loading
Loading