diff --git a/apps/docs/content/docs/agents-create.ja.mdx b/apps/docs/content/docs/agents-create.ja.mdx index bf56dcb7048..a2e4a60b024 100644 --- a/apps/docs/content/docs/agents-create.ja.mdx +++ b/apps/docs/content/docs/agents-create.ja.mdx @@ -21,7 +21,7 @@ multica agent create ## AI コーディングツールを選ぶ -各ランタイムは特定の AI コーディングツールを基盤としています。Multica はそのうち 12 個をサポートします。最も一般的な選択肢は次のとおりです。 +各ランタイムは特定の AI コーディングツールを基盤としています。Multica はそのうち 14 個をサポートします。最も一般的な選択肢は次のとおりです。 | ツール | 適している場合 | |---|---| @@ -29,9 +29,9 @@ multica agent create | **Codex** | OpenAI 製で、主流の代替手段です | | **Cursor** | Cursor エディターのエコシステムを使うユーザー | | **Copilot** | GitHub アカウントの権限を活用するチーム | -| **Gemini** | Google エコシステムのユーザー | +| **CodeBuddy** | Tencent の Claude Code 互換 CLI を使うチーム | -残りの 7 個(Antigravity、Hermes、Kimi、Kiro CLI、OpenCode、Pi、OpenClaw)と、各ツールの完全な機能比較表(セッション再開、MCP、スキル注入パス、モデル選択)は、[AI コーディングツール比較](/providers)で扱います。 +残りの 9 個(Antigravity、Hermes、Kimi、Kiro CLI、OpenCode、Pi、OpenClaw、Qoder、Trae CLI)と、各ツールの完全な機能比較表(セッション再開、MCP、スキル注入パス、モデル選択)は、[AI コーディングツール比較](/providers)で扱います。 ## システム指示を書く @@ -123,5 +123,5 @@ claude --model --max-turns 100 --append-system-prompt "always respond in ## 次のステップ - [スキル](/skills) — エージェントにナレッジパックをアタッチする -- [AI コーディングツール比較](/providers) — 12 個のツール全体の機能比較表 +- [AI コーディングツール比較](/providers) — 14 個のツール全体の機能比較表 - [エージェントへのイシューの割り当て](/assigning-issues) — 新しく作ったエージェントを作業に投入する diff --git a/apps/docs/content/docs/agents-create.ko.mdx b/apps/docs/content/docs/agents-create.ko.mdx index 7762a93d57d..ecafce37fda 100644 --- a/apps/docs/content/docs/agents-create.ko.mdx +++ b/apps/docs/content/docs/agents-create.ko.mdx @@ -21,7 +21,7 @@ multica agent create ## AI 코딩 도구 선택 -각 런타임은 특정 AI 코딩 도구를 기반으로 합니다. Multica는 그중 12개를 지원합니다. 가장 일반적인 선택지는 다음과 같습니다. +각 런타임은 특정 AI 코딩 도구를 기반으로 합니다. Multica는 그중 14개를 지원합니다. 가장 일반적인 선택지는 다음과 같습니다. | 도구 | 적합한 경우 | |---|---| @@ -29,9 +29,9 @@ multica agent create | **Codex** | OpenAI 제품으로, 주류 대안입니다 | | **Cursor** | Cursor 에디터 생태계 사용자 | | **Copilot** | GitHub 계정 권한을 활용하는 팀 | -| **Gemini** | Google 생태계 사용자 | +| **CodeBuddy** | Tencent의 Claude Code 호환 CLI를 사용하는 팀 | -나머지 7개(Antigravity, Hermes, Kimi, Kiro CLI, OpenCode, Pi, OpenClaw)와 각 도구의 전체 기능 비교표(세션 재개, MCP, 스킬 주입 경로, 모델 선택)는 [AI 코딩 도구 비교](/providers)에서 다룹니다. +나머지 9개(Antigravity, Hermes, Kimi, Kiro CLI, OpenCode, Pi, OpenClaw, Qoder, Trae CLI)와 각 도구의 전체 기능 비교표(세션 재개, MCP, 스킬 주입 경로, 모델 선택)는 [AI 코딩 도구 비교](/providers)에서 다룹니다. ## 시스템 지침 작성 @@ -123,5 +123,5 @@ claude --model --max-turns 100 --append-system-prompt "always respond in ## 다음 단계 - [스킬](/skills) — 에이전트에 지식 팩 연결하기 -- [AI 코딩 도구 비교](/providers) — 12개 도구 전체의 기능 비교표 +- [AI 코딩 도구 비교](/providers) — 14개 도구 전체의 기능 비교표 - [에이전트에게 이슈 할당하기](/assigning-issues) — 새로 만든 에이전트를 작업에 투입하기 diff --git a/apps/docs/content/docs/agents-create.mdx b/apps/docs/content/docs/agents-create.mdx index 0e878738607..8ba73445a05 100644 --- a/apps/docs/content/docs/agents-create.mdx +++ b/apps/docs/content/docs/agents-create.mdx @@ -29,9 +29,9 @@ Each runtime is backed by a specific AI coding tool. Multica supports 14 of them | **Codex** | OpenAI, the mainstream alternative | | **Cursor** | Users in the Cursor editor ecosystem | | **Copilot** | Teams leveraging their GitHub account entitlements | -| **Gemini** | Users in the Google ecosystem | +| **CodeBuddy** | Teams using Tencent's Claude Code-compatible CLI | -The other seven (Antigravity, Hermes, Kimi, Kiro CLI, OpenCode, Pi, OpenClaw), along with each tool's full capability matrix (session resume, MCP, skill injection path, model selection), are covered in [AI coding tools comparison](/providers). +The other nine (Antigravity, Hermes, Kimi, Kiro CLI, OpenCode, Pi, OpenClaw, Qoder, Trae CLI), along with each tool's full capability matrix (session resume, MCP, skill injection path, model selection), are covered in [AI coding tools comparison](/providers). ## Writing system instructions diff --git a/apps/docs/content/docs/agents-create.zh.mdx b/apps/docs/content/docs/agents-create.zh.mdx index 857397971fa..ce850396530 100644 --- a/apps/docs/content/docs/agents-create.zh.mdx +++ b/apps/docs/content/docs/agents-create.zh.mdx @@ -21,7 +21,7 @@ multica agent create ## 选一款 AI 编程工具 -运行时背后是一款具体的 AI 编程工具。Multica 支持 12 款,最常用的几款: +运行时背后是一款具体的 AI 编程工具。Multica 支持 14 款,最常用的几款: | 工具 | 适合 | |---|---| @@ -29,9 +29,9 @@ multica agent create | **Codex** | OpenAI,主流替代 | | **Cursor** | Cursor 编辑器生态用户 | | **Copilot** | 用 GitHub 账号权益的团队 | -| **Gemini** | Google 生态用户 | +| **CodeBuddy** | 使用 Tencent Claude Code 兼容 CLI 的团队 | -另外 7 款(Antigravity、Hermes、Kimi、Kiro CLI、OpenCode、Pi、OpenClaw)以及每款工具的完整能力差别(会话恢复、MCP、skill 注入路径、模型选择)见 [AI 编程工具对照](/providers)。 +另外 9 款(Antigravity、Hermes、Kimi、Kiro CLI、OpenCode、Pi、OpenClaw、Qoder、Trae CLI)以及每款工具的完整能力差别(会话恢复、MCP、skill 注入路径、模型选择)见 [AI 编程工具对照](/providers)。 ## 写系统指令 @@ -123,5 +123,5 @@ claude --model --max-turns 100 --append-system-prompt "always respond in ## 下一步 - [Skills](/skills) —— 给智能体挂专业知识包 -- [AI 编程工具对照](/providers) —— 12 款工具的完整能力差别 +- [AI 编程工具对照](/providers) —— 14 款工具的完整能力差别 - [把 issue 分配给智能体](/assigning-issues) —— 创建完之后怎么用起来 diff --git a/apps/docs/content/docs/cli/installation.zh.mdx b/apps/docs/content/docs/cli/installation.zh.mdx index 81ae5bbada8..eeaf0f6a87b 100644 --- a/apps/docs/content/docs/cli/installation.zh.mdx +++ b/apps/docs/content/docs/cli/installation.zh.mdx @@ -78,18 +78,24 @@ multica daemon status Confirm: 1. Status is `running` -2. At least one agent is listed (e.g. `claude`, `codex`, `gemini`, `opencode`, `openclaw`, `hermes`, `kiro`, or `pi`) +2. At least one agent is listed (e.g. `claude`, `codex`, `codebuddy`, `opencode`, `openclaw`, `hermes`, `kiro-cli`, `qodercli`, or `traecli`) 3. At least one workspace is being watched If the agents list is empty, install at least one supported AI agent CLI: - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) (`claude`) +- Antigravity (`agy`) +- CodeBuddy (`codebuddy`) - [Codex](https://github.com/openai/codex) (`codex`) -- [Gemini CLI](https://github.com/google-gemini/gemini-cli) (`gemini`) +- Copilot (`copilot`) +- Cursor Agent (`cursor-agent`) - OpenCode (`opencode`) - OpenClaw (`openclaw`) - Hermes (`hermes`) - Kimi (`kimi`) - Kiro CLI (`kiro-cli`) +- Pi (`pi`) +- Qoder (`qodercli`) +- Trae CLI (`traecli`) Then restart the daemon: diff --git a/apps/docs/content/docs/cli/reference.zh.mdx b/apps/docs/content/docs/cli/reference.zh.mdx index 7bc069ba6ab..542581975e9 100644 --- a/apps/docs/content/docs/cli/reference.zh.mdx +++ b/apps/docs/content/docs/cli/reference.zh.mdx @@ -87,15 +87,19 @@ The daemon auto-detects these AI CLIs on your PATH: | CLI | Command | Description | |-----|---------|-------------| | [Claude Code](https://docs.anthropic.com/en/docs/claude-code) | `claude` | Anthropic's coding agent | +| Antigravity | `agy` | Google's coding agent | +| CodeBuddy | `codebuddy` | Tencent's Claude Code-compatible coding agent | | [Codex](https://github.com/openai/codex) | `codex` | OpenAI's coding agent | -| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `gemini` | Google's coding agent | +| Copilot | `copilot` | GitHub's coding agent | +| Cursor Agent | `cursor-agent` | Cursor coding agent | | OpenCode | `opencode` | Open-source coding agent | | OpenClaw | `openclaw` | Open-source coding agent | | Hermes | `hermes` | Nous Research coding agent | | Kimi | `kimi` | Moonshot coding agent | | Kiro CLI | `kiro-cli` | Kiro ACP coding agent | | Pi | `pi` | Inflection coding agent | -| Cursor Agent | `cursor-agent` | Cursor coding agent | +| Qoder | `qodercli` | Alibaba coding agent | +| Trae CLI | `traecli` | ByteDance coding agent | You need at least one installed. The daemon registers each detected CLI as an available runtime. @@ -130,6 +134,10 @@ Agent-specific overrides: | `MULTICA_CLAUDE_MODEL` | Override the Claude model used | | `MULTICA_CODEX_PATH` | Custom path to the `codex` binary | | `MULTICA_CODEX_MODEL` | Override the Codex model used | +| `MULTICA_CODEBUDDY_PATH` | Custom path to the `codebuddy` binary | +| `MULTICA_CODEBUDDY_MODEL` | Override the CodeBuddy model used | +| `MULTICA_ANTIGRAVITY_PATH` | Custom path to the `agy` binary | +| `MULTICA_ANTIGRAVITY_MODEL` | Override the Antigravity model used | | `MULTICA_OPENCODE_PATH` | Custom path to the `opencode` binary | | `MULTICA_OPENCODE_MODEL` | Override the OpenCode model used | | `MULTICA_OPENCLAW_PATH` | Custom path to the `openclaw` binary | @@ -146,6 +154,10 @@ Agent-specific overrides: | `MULTICA_KIMI_MODEL` | Override the Kimi model used | | `MULTICA_KIRO_PATH` | Custom path to the `kiro-cli` binary | | `MULTICA_KIRO_MODEL` | Override the Kiro model used | +| `MULTICA_QODER_PATH` | Custom path to the `qodercli` binary | +| `MULTICA_QODER_MODEL` | Override the Qoder model used | +| `MULTICA_TRAECLI_PATH` | Custom path to the `traecli` binary | +| `MULTICA_TRAECLI_MODEL` | Override the Trae CLI model used | ### Self-Hosted Server diff --git a/apps/docs/content/docs/cloud-quickstart.ja.mdx b/apps/docs/content/docs/cloud-quickstart.ja.mdx index b81869b21d8..39f1ce668de 100644 --- a/apps/docs/content/docs/cloud-quickstart.ja.mdx +++ b/apps/docs/content/docs/cloud-quickstart.ja.mdx @@ -7,7 +7,7 @@ import { Callout } from "fumadocs-ui/components/callout"; このページは Multica Cloud を最初から最後まで案内します — **サインアップ → [CLI](/cli) のインストール → [デーモン](/daemon-runtimes)の起動 → [エージェント](/agents)の作成 → 最初の[タスク](/tasks)の割り当て**。約 5 分かかります。 -前提条件は 1 つだけです: ローカルに [AI コーディングツール](/providers)([Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi) のいずれか)を少なくとも 1 つ、すでにインストールしておくこと。デーモンは起動時にこれらを自動検出し、1 つもなければ起動を拒否します。 +前提条件は 1 つだけです: ローカルに [AI コーディングツール](/providers)([Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)、[Qoder](/providers#qoder)、[Trae CLI](/providers#trae) のいずれか)を少なくとも 1 つ、すでにインストールしておくこと。デーモンは起動時にこれらを自動検出し、1 つもなければ起動を拒否します。 ## 1. アカウントを作成する @@ -114,6 +114,6 @@ Web UI は**リアルタイムで**(WebSocket を通じて)更新されま - [デーモンとランタイム](/daemon-runtimes) — デーモンがどう動作するかとランタイムの意味 - [タスク](/tasks) — タスクのライフサイクルとリトライルール -- [AI コーディングツール比較](/providers) — 12 個のツール間の機能差 +- [AI コーディングツール比較](/providers) — 14 個のツール間の機能差 - [デスクトップアプリ](/desktop-app) — デーモンを自分で実行したくない場合 - [セルフホストクイックスタート](/self-host-quickstart) — 自前のバックエンドを実行する diff --git a/apps/docs/content/docs/cloud-quickstart.ko.mdx b/apps/docs/content/docs/cloud-quickstart.ko.mdx index cf2f9741bc1..ae5f169fb53 100644 --- a/apps/docs/content/docs/cloud-quickstart.ko.mdx +++ b/apps/docs/content/docs/cloud-quickstart.ko.mdx @@ -7,7 +7,7 @@ import { Callout } from "fumadocs-ui/components/callout"; 이 페이지는 Multica Cloud를 처음부터 끝까지 안내합니다 — **가입 → [CLI](/cli) 설치 → [데몬](/daemon-runtimes) 시작 → [에이전트](/agents) 생성 → 첫 [작업](/tasks) 할당**. 약 5분이 걸립니다. -전제 조건은 하나뿐입니다: 로컬에 [AI 코딩 도구](/providers)([Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi) 중 하나)를 이미 최소 하나는 설치해 두어야 합니다. 데몬은 시작할 때 이들을 자동으로 감지하며, 하나도 없으면 시작을 거부합니다. +전제 조건은 하나뿐입니다: 로컬에 [AI 코딩 도구](/providers)([Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi), [Qoder](/providers#qoder), [Trae CLI](/providers#trae) 중 하나)를 이미 최소 하나는 설치해 두어야 합니다. 데몬은 시작할 때 이들을 자동으로 감지하며, 하나도 없으면 시작을 거부합니다. ## 1. 계정 만들기 @@ -114,6 +114,6 @@ multica issue assign MUL-1 --to my-agent-name - [데몬과 런타임](/daemon-runtimes) — 데몬이 어떻게 동작하는지와 런타임의 의미 - [작업](/tasks) — 작업 생명주기와 재시도 규칙 -- [AI 코딩 도구 비교](/providers) — 12개 도구 간의 기능 차이 +- [AI 코딩 도구 비교](/providers) — 14개 도구 간의 기능 차이 - [데스크톱 앱](/desktop-app) — 데몬을 직접 실행하고 싶지 않은 경우 - [자체 호스팅 빠른 시작](/self-host-quickstart) — 자체 백엔드 실행하기 diff --git a/apps/docs/content/docs/cloud-quickstart.mdx b/apps/docs/content/docs/cloud-quickstart.mdx index a32d38a9631..c9411dee69c 100644 --- a/apps/docs/content/docs/cloud-quickstart.mdx +++ b/apps/docs/content/docs/cloud-quickstart.mdx @@ -7,7 +7,7 @@ import { Callout } from "fumadocs-ui/components/callout"; This page walks you end-to-end through Multica Cloud — **sign up → install the [CLI](/cli) → start the [daemon](/daemon-runtimes) → create an [agent](/agents) → assign your first [task](/tasks)**. Takes about 5 minutes. -One prerequisite: you already have at least one [AI coding tool](/providers) installed locally ([Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), or [Pi](/providers#pi)). The daemon auto-detects them on startup and refuses to start if none are present. +One prerequisite: you already have at least one [AI coding tool](/providers) installed locally ([Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi), [Qoder](/providers#qoder), or [Trae CLI](/providers#trae)). The daemon auto-detects them on startup and refuses to start if none are present. ## 1. Create an account diff --git a/apps/docs/content/docs/cloud-quickstart.zh.mdx b/apps/docs/content/docs/cloud-quickstart.zh.mdx index 5a9bac68ab1..55eaa3675dc 100644 --- a/apps/docs/content/docs/cloud-quickstart.zh.mdx +++ b/apps/docs/content/docs/cloud-quickstart.zh.mdx @@ -7,7 +7,7 @@ import { Callout } from "fumadocs-ui/components/callout"; 这一页带你走一遍 Multica Cloud 的端到端流程——**注册 → 装 [命令行工具](/cli) → 启动 [守护进程](/daemon-runtimes) → 创建 [智能体](/agents) → 分配第一个 [任务](/tasks)**,约 5 分钟完成。 -前置只有一个:你本地已经装了至少一款 [AI 编程工具](/providers)([Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi))中的一款。守护进程启动时会自动探测它们,没装任何一个的话守护进程会直接拒绝启动。 +前置只有一个:你本地已经装了至少一款 [AI 编程工具](/providers)([Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)、[Qoder](/providers#qoder) 或 [Trae CLI](/providers#trae))中的一款。守护进程启动时会自动探测它们,没装任何一个的话守护进程会直接拒绝启动。 ## 1. 注册账号 @@ -114,6 +114,6 @@ Web 界面会**实时**(通过 WebSocket)显示进度——不需要刷新 - [守护进程与运行时](/daemon-runtimes) —— 守护进程怎么运作、运行时概念 - [执行任务](/tasks) —— 任务生命周期、重试规则 -- [AI 编程工具对照](/providers) —— 12 款工具的能力差异 +- [AI 编程工具对照](/providers) —— 14 款工具的能力差异 - [桌面应用](/desktop-app) —— 不想自己跑守护进程的话 - [Self-Host 快速上手](/self-host-quickstart) —— 在自己服务器上跑一套 diff --git a/apps/docs/content/docs/daemon-runtimes.ja.mdx b/apps/docs/content/docs/daemon-runtimes.ja.mdx index a0010b37069..2c2b7493122 100644 --- a/apps/docs/content/docs/daemon-runtimes.ja.mdx +++ b/apps/docs/content/docs/daemon-runtimes.ja.mdx @@ -21,7 +21,7 @@ multica daemon start 起動時にデーモンは 4 つのことを行います。 1. ログイン時に保存された認証情報を読み込みます -2. `PATH` にインストールされた AI コーディングツールを検出します(内蔵 12 種: [Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)) +2. `PATH` にインストールされた AI コーディングツールを検出します(内蔵 14 種: [Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)、[Qoder](/providers#qoder)、[Trae CLI](/providers#trae)) 3. 検出した各ツールに対するランタイムとともに、自身をサーバーに登録します 4. **3 秒ごと**に取得すべきタスクがないかポーリングし、**15 秒ごとにハートビートを送信**し続けます @@ -131,4 +131,4 @@ Multica は 2 つの層で同時実行数の制限を適用します。 ## 次へ - [タスク](/tasks) — デーモンがタスクを取得した後の全ライフサイクル -- [プロバイダー対照表](/providers) — 12 種の AI コーディングツールの機能の違い +- [プロバイダー対照表](/providers) — 14 種の AI コーディングツールの機能の違い diff --git a/apps/docs/content/docs/daemon-runtimes.ko.mdx b/apps/docs/content/docs/daemon-runtimes.ko.mdx index bf0b6a00d9c..7796edcbc3c 100644 --- a/apps/docs/content/docs/daemon-runtimes.ko.mdx +++ b/apps/docs/content/docs/daemon-runtimes.ko.mdx @@ -21,7 +21,7 @@ multica daemon start 시작 시 데몬은 네 가지 일을 합니다. 1. 로그인할 때 저장된 인증 정보를 읽습니다 -2. `PATH`에 설치된 AI 코딩 도구를 감지합니다(내장 12종: [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi)) +2. `PATH`에 설치된 AI 코딩 도구를 감지합니다(내장 14종: [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi), [Qoder](/providers#qoder), [Trae CLI](/providers#trae)) 3. 감지된 각 도구에 대한 런타임과 함께 자신을 서버에 등록합니다 4. **3초마다** 가져올 작업이 있는지 폴링하고, **15초마다 하트비트를 전송**합니다 diff --git a/apps/docs/content/docs/daemon-runtimes.zh.mdx b/apps/docs/content/docs/daemon-runtimes.zh.mdx index 1848a6e36dd..51cab0a75c5 100644 --- a/apps/docs/content/docs/daemon-runtimes.zh.mdx +++ b/apps/docs/content/docs/daemon-runtimes.zh.mdx @@ -21,7 +21,7 @@ multica daemon start 启动后它会做四件事: 1. 读取你登录时保存的凭证 -2. 探测本机 `PATH` 上已安装的 AI 编程工具(内置支持 12 款:[Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)) +2. 探测本机 `PATH` 上已安装的 AI 编程工具(内置支持 14 款:[Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)、[Qoder](/providers#qoder)、[Trae CLI](/providers#trae)) 3. 向服务器注册自己,以及每款检测到的工具对应的运行时 4. 持续**每 3 秒轮询一次**是否有任务要领,**每 15 秒发一次心跳** @@ -131,4 +131,4 @@ Multica 对并发有两层限额: ## 下一步 - [执行任务](/tasks) —— 守护进程领到任务后,它的完整生命周期 -- [Providers Matrix](/providers) —— 12 款 AI 编程工具的能力差异对照 +- [Providers Matrix](/providers) —— 14 款 AI 编程工具的能力差异对照 diff --git a/apps/docs/content/docs/getting-started/cloud-quickstart.zh.mdx b/apps/docs/content/docs/getting-started/cloud-quickstart.zh.mdx index a4cca9f5a5e..784fe1808f3 100644 --- a/apps/docs/content/docs/getting-started/cloud-quickstart.zh.mdx +++ b/apps/docs/content/docs/getting-started/cloud-quickstart.zh.mdx @@ -11,7 +11,7 @@ Go to [multica.ai](https://multica.ai) and create an account. ## 2. Install the CLI and start the daemon -Give this instruction to your AI agent (Claude Code, Codex, Gemini CLI, OpenClaw, OpenCode, etc.): +Give this instruction to your AI agent (Claude Code, Codex, Qoder, OpenClaw, OpenCode, etc.): ``` Fetch https://github.com/multica-ai/multica/blob/main/CLI_INSTALL.md and follow the instructions to install Multica CLI, log in, and start the daemon on this machine. @@ -45,7 +45,7 @@ Then configure, authenticate, and start the daemon: multica setup ``` -The daemon auto-detects available agent CLIs (`claude`, `codex`, `gemini`, `openclaw`, `opencode`, `hermes`, `pi`) on your PATH. When an agent is assigned a task, the daemon creates an isolated environment, runs the agent, and reports results back. +The daemon auto-detects supported agent CLIs (`agy`, `claude`, `codebuddy`, `codex`, `copilot`, `cursor-agent`, `hermes`, `kimi`, `kiro-cli`, `opencode`, `openclaw`, `pi`, `qodercli`, `traecli`) on your PATH. When an agent is assigned a task, the daemon creates an isolated environment, runs the agent, and reports results back. ## 3. Verify your runtime @@ -55,7 +55,7 @@ Open your workspace in the Multica web app. Navigate to **Settings → Runtimes* ## 4. Create an agent -Go to **Settings → Agents** and click **New Agent**. Pick the runtime you just connected and choose a provider (Claude Code, Codex, Gemini CLI, OpenClaw, OpenCode, or Hermes). Give your agent a name — this is how it will appear on the board, in comments, and in assignments. +Go to **Settings → Agents** and click **New Agent**. Pick the runtime you just connected and choose a provider (Antigravity, Claude Code, CodeBuddy, Codex, Copilot, Cursor, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi, Qoder, or Trae CLI). Give your agent a name — this is how it will appear on the board, in comments, and in assignments. ## 5. Assign your first task diff --git a/apps/docs/content/docs/getting-started/self-hosting.zh.mdx b/apps/docs/content/docs/getting-started/self-hosting.zh.mdx index 8088f629ade..380767f7451 100644 --- a/apps/docs/content/docs/getting-started/self-hosting.zh.mdx +++ b/apps/docs/content/docs/getting-started/self-hosting.zh.mdx @@ -92,11 +92,19 @@ brew install multica-ai/tap/multica You also need at least one AI agent CLI: - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) (`claude` on PATH) +- Antigravity (`agy` on PATH) +- CodeBuddy (`codebuddy` on PATH) - [Codex](https://github.com/openai/codex) (`codex` on PATH) -- [Gemini CLI](https://github.com/google-gemini/gemini-cli) (`gemini` on PATH) +- Copilot (`copilot` on PATH) +- Cursor Agent (`cursor-agent` on PATH) - OpenCode (`opencode` on PATH) - OpenClaw (`openclaw` on PATH) - Hermes (`hermes` on PATH) +- Kimi (`kimi` on PATH) +- Kiro CLI (`kiro-cli` on PATH) +- Pi (`pi` on PATH) +- Qoder (`qodercli` on PATH) +- Trae CLI (`traecli` on PATH) ### b) One-command setup @@ -310,14 +318,20 @@ Agent-specific overrides: | `MULTICA_CLAUDE_MODEL` | Override the Claude model used | | `MULTICA_CODEX_PATH` | Custom path to the `codex` binary | | `MULTICA_CODEX_MODEL` | Override the Codex model used | +| `MULTICA_CODEBUDDY_PATH` | Custom path to the `codebuddy` binary | +| `MULTICA_CODEBUDDY_MODEL` | Override the CodeBuddy model used | +| `MULTICA_ANTIGRAVITY_PATH` | Custom path to the `agy` binary | +| `MULTICA_ANTIGRAVITY_MODEL` | Override the Antigravity model used | | `MULTICA_OPENCODE_PATH` | Custom path to the `opencode` binary | | `MULTICA_OPENCODE_MODEL` | Override the OpenCode model used | | `MULTICA_OPENCLAW_PATH` | Custom path to the `openclaw` binary | | `MULTICA_OPENCLAW_MODEL` | Override the OpenClaw model used | | `MULTICA_HERMES_PATH` | Custom path to the `hermes` binary | | `MULTICA_HERMES_MODEL` | Override the Hermes model used | -| `MULTICA_GEMINI_PATH` | Custom path to the `gemini` binary | -| `MULTICA_GEMINI_MODEL` | Override the Gemini model used | +| `MULTICA_QODER_PATH` | Custom path to the `qodercli` binary | +| `MULTICA_QODER_MODEL` | Override the Qoder model used | +| `MULTICA_TRAECLI_PATH` | Custom path to the `traecli` binary | +| `MULTICA_TRAECLI_MODEL` | Override the Trae CLI model used | ## Database Setup diff --git a/apps/docs/content/docs/guides/agents.zh.mdx b/apps/docs/content/docs/guides/agents.zh.mdx index b489d644508..ab2f0aba27e 100644 --- a/apps/docs/content/docs/guides/agents.zh.mdx +++ b/apps/docs/content/docs/guides/agents.zh.mdx @@ -15,7 +15,7 @@ When an agent is assigned a task in Multica: 1. The daemon detects the task assignment 2. It creates an isolated workspace directory -3. It spawns the appropriate agent CLI (Claude Code, Codex, Gemini CLI, OpenClaw, OpenCode, or Hermes) +3. It spawns the appropriate agent CLI (Antigravity, Claude Code, CodeBuddy, Codex, Copilot, Cursor, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi, Qoder, or Trae CLI) 4. The agent executes autonomously, streaming progress back to Multica 5. Results are reported — success, failure, or blockers @@ -29,10 +29,18 @@ Real-time progress is streamed via WebSocket so you can follow along in the Mult |----------|-------------|-------------| | Claude Code | `claude` | Anthropic's coding agent | | Codex | `codex` | OpenAI's coding agent | -| Gemini CLI | `gemini` | Google's coding agent | +| Antigravity | `agy` | Google's coding agent | +| CodeBuddy | `codebuddy` | Tencent's Claude Code-compatible coding agent | +| Copilot | `copilot` | GitHub's coding agent | +| Cursor | `cursor-agent` | Anysphere's coding agent | | OpenClaw | `openclaw` | Open-source coding agent | | OpenCode | `opencode` | Open-source coding agent | | Hermes | `hermes` | Nous Research coding agent | +| Kimi | `kimi` | Moonshot coding agent | +| Kiro CLI | `kiro-cli` | Amazon coding agent | +| Pi | `pi` | Inflection AI coding agent | +| Qoder | `qodercli` | Alibaba coding agent | +| Trae CLI | `traecli` | ByteDance coding agent | The daemon auto-detects which CLIs are available on your PATH and registers them as available runtimes. diff --git a/apps/docs/content/docs/guides/quickstart.zh.mdx b/apps/docs/content/docs/guides/quickstart.zh.mdx index 8fdfaf49ac6..cbf1298db7d 100644 --- a/apps/docs/content/docs/guides/quickstart.zh.mdx +++ b/apps/docs/content/docs/guides/quickstart.zh.mdx @@ -11,7 +11,7 @@ Once you have the CLI installed (or signed up for [Multica Cloud](https://multic multica setup # Configure, authenticate, and start the daemon ``` -This configures the CLI, opens your browser for login, discovers your workspaces, and starts the agent daemon in the background. It auto-detects agent CLIs (`claude`, `codex`, `gemini`, `openclaw`, `opencode`, `hermes`, `pi`) available on your PATH. +This configures the CLI, opens your browser for login, discovers your workspaces, and starts the agent daemon in the background. It auto-detects supported agent CLIs (`agy`, `claude`, `codebuddy`, `codex`, `copilot`, `cursor-agent`, `hermes`, `kimi`, `kiro-cli`, `opencode`, `openclaw`, `pi`, `qodercli`, `traecli`) available on your PATH. ## 2. Verify your runtime @@ -21,7 +21,7 @@ Open your workspace in the Multica web app. Navigate to **Settings → Runtimes* ## 3. Create an agent -Go to **Settings → Agents** and click **New Agent**. Pick the runtime you just connected and choose a provider (Claude Code, Codex, Gemini CLI, OpenClaw, OpenCode, or Hermes). Give your agent a name — this is how it will appear on the board, in comments, and in assignments. +Go to **Settings → Agents** and click **New Agent**. Pick the runtime you just connected and choose a provider (Antigravity, Claude Code, CodeBuddy, Codex, Copilot, Cursor, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi, Qoder, or Trae CLI). Give your agent a name — this is how it will appear on the board, in comments, and in assignments. ## 4. Assign your first task diff --git a/apps/docs/content/docs/how-multica-works.ja.mdx b/apps/docs/content/docs/how-multica-works.ja.mdx index 6f29d22ef60..f82877c4e98 100644 --- a/apps/docs/content/docs/how-multica-works.ja.mdx +++ b/apps/docs/content/docs/how-multica-works.ja.mdx @@ -13,7 +13,7 @@ Multica は**分散型**プラットフォームです。あなたが目にす - **Multica サーバー** — あなたが目にするワークスペース、イシュー一覧、コメントスレッドは、すべてここのデータベースに保存されます。また、あなたと同僚の間でリアルタイム更新をプッシュする WebSocket ハブでもあります。エージェントのタスクは**実行しません**。 - **デーモン** — Multica CLI の一部であり、あなた自身のマシンで実行されます。起動時にローカルにインストールされた AI コーディングツールを検出し、サーバーに登録したうえで、3 秒ごとにタスクをポーリングし、15 秒ごとにハートビートを送信し始めます。 -- **AI コーディングツール** — 次の 12 種類のうちの 1 つ(または複数を並列で): [Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)。デーモンがタスクを取得した後は、これらのツールを使って実際の作業を行います。 +- **AI コーディングツール** — 次の 14 種類のうちの 1 つ(または複数を並列で): [Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)、[Qoder](/providers#qoder)、[Trae CLI](/providers#trae)。デーモンがタスクを取得した後は、これらのツールを使って実際の作業を行います。 ツールチェーンがローカルに留まるため、**あなたの API キー、コードディレクトリ、認可されたツール**は、あなたのマシン上でのみ使用されます。Multica サーバーはそのいずれも目にすることはありません。これはセルフホストでも Cloud でも同じように適用されます。 diff --git a/apps/docs/content/docs/how-multica-works.ko.mdx b/apps/docs/content/docs/how-multica-works.ko.mdx index 2084f6d07ed..c7f1573bf06 100644 --- a/apps/docs/content/docs/how-multica-works.ko.mdx +++ b/apps/docs/content/docs/how-multica-works.ko.mdx @@ -13,7 +13,7 @@ Multica는 **분산형** 플랫폼입니다. 여러분이 보는 웹 인터페 - **Multica 서버** — 여러분이 보는 워크스페이스, 이슈 목록, 댓글 스레드는 모두 이곳의 데이터베이스에 저장됩니다. 또한 여러분과 동료 사이의 실시간 업데이트를 푸시하는 WebSocket 허브이기도 합니다. 에이전트 작업은 **실행하지 않습니다.** - **데몬** — Multica CLI의 일부로, 여러분 자신의 기기에서 실행됩니다. 시작 시 로컬에 설치된 AI 코딩 도구를 감지하고, 서버에 등록한 다음, 3초마다 작업을 폴링하고 15초마다 하트비트를 전송하기 시작합니다. -- **AI 코딩 도구** — 다음 열두 가지 중 하나(또는 여러 개를 병렬로): [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi). 데몬이 작업을 가져온 뒤에는 이러한 도구를 사용해 실제 작업을 수행합니다. +- **AI 코딩 도구** — 다음 14가지 중 하나(또는 여러 개를 병렬로): [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi), [Qoder](/providers#qoder), [Trae CLI](/providers#trae). 데몬이 작업을 가져온 뒤에는 이러한 도구를 사용해 실제 작업을 수행합니다. 도구 체인이 로컬에 유지되므로 **여러분의 API 키, 코드 디렉터리, 인증된 도구**는 오직 여러분의 기기에서만 사용됩니다. Multica 서버는 그중 어떤 것도 보지 못합니다. 이는 자체 호스팅을 하든 Cloud를 사용하든 동일하게 적용됩니다. diff --git a/apps/docs/content/docs/how-multica-works.mdx b/apps/docs/content/docs/how-multica-works.mdx index 8d6ff9335cc..7bdfcbac490 100644 --- a/apps/docs/content/docs/how-multica-works.mdx +++ b/apps/docs/content/docs/how-multica-works.mdx @@ -13,7 +13,7 @@ Multica is a **distributed** platform. The web interface you see is just the fro - **Multica server** — the workspaces, issue lists, and comment threads you see all live in its database. It's also a WebSocket hub that pushes real-time updates between you and your teammates. It does **not** execute any agent tasks. - **Daemon** — part of the Multica CLI, running on your own machine. On start it detects which AI coding tools are installed locally, registers with the server, and begins polling for tasks every 3 seconds and sending heartbeats every 15 seconds. -- **AI coding tools** — one of the twelve (or several in parallel): [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi). Once the daemon has picked up a task, it uses these tools to actually do the work. +- **AI coding tools** — one of the fourteen (or several in parallel): [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi), [Qoder](/providers#qoder), [Trae CLI](/providers#trae). Once the daemon has picked up a task, it uses these tools to actually do the work. Because the toolchain stays local, **your API keys, code directories, and authorized tools** are only ever used on your machine — the Multica server never sees any of them. This holds whether you self-host or use Cloud. diff --git a/apps/docs/content/docs/how-multica-works.zh.mdx b/apps/docs/content/docs/how-multica-works.zh.mdx index e78c4bfe130..77fbf3cc33c 100644 --- a/apps/docs/content/docs/how-multica-works.zh.mdx +++ b/apps/docs/content/docs/how-multica-works.zh.mdx @@ -13,7 +13,7 @@ Multica 是一个**分布式**平台。你看到的 Web 界面只是前台—— - **Multica 服务器**——你看到的工作区、issue 列表、评论线都存在它的数据库里。它同时是 WebSocket hub,把你和同事之间的实时更新推送过去。它**不**执行任何智能体任务。 - **守护进程**(daemon)——Multica CLI 的一部分,跑在你自己的机器上。启动后它探测本地装了哪些 AI 编程工具,注册到 server,开始每 3 秒领一次任务、每 15 秒发一次心跳。 -- **AI 编程工具**——[Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi) 12 款之一(或多款并存)。守护进程领到任务后,用这些工具真正去写代码。 +- **AI 编程工具**——[Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)、[Qoder](/providers#qoder)、[Trae CLI](/providers#trae) 14 款之一(或多款并存)。守护进程领到任务后,用这些工具真正去写代码。 工具链在本地的结果:**你的 API 密钥、代码目录、已授权的工具**都只在本地使用;Multica 服务器一个都看不到。自部署还是用 Cloud 都不改变这一点。 diff --git a/apps/docs/content/docs/index.ja.mdx b/apps/docs/content/docs/index.ja.mdx index 2b63ca56b31..397007ca51a 100644 --- a/apps/docs/content/docs/index.ja.mdx +++ b/apps/docs/content/docs/index.ja.mdx @@ -13,7 +13,7 @@ Multica は、人間と AI [エージェント](/agents)が同じ[ワークス エージェントは Multica のサーバー上でタスクを実行**しません**。現在 Multica は 1 つのランタイムモデルをサポートしています。 -- **ローカル[デーモン](/daemon-runtimes)** — 自分のマシンで `multica daemon` を実行すると、デーモンがローカルにインストールされた [AI コーディングツール](/providers)を駆動します。現在 12 種類が標準で組み込まれています: [Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)。API キー、ツールチェーン、コードディレクトリはすべて自分のマシンに留まります。 +- **ローカル[デーモン](/daemon-runtimes)** — 自分のマシンで `multica daemon` を実行すると、デーモンがローカルにインストールされた [AI コーディングツール](/providers)を駆動します。現在 14 種類が標準で組み込まれています: [Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)、[Qoder](/providers#qoder)、[Trae CLI](/providers#trae)。API キー、ツールチェーン、コードディレクトリはすべて自分のマシンに留まります。 **クラウドランタイムが近日提供予定です。** 現在はウェイトリストのみで運用されています。提供が開始されればローカルデーモンは不要になり、エージェントのタスクは Multica Cloud 上で直接実行されます。[ダウンロード](https://multica.ai/download)ページで登録すると通知を受け取れます。 diff --git a/apps/docs/content/docs/index.ko.mdx b/apps/docs/content/docs/index.ko.mdx index 9354a271542..10ca027e34c 100644 --- a/apps/docs/content/docs/index.ko.mdx +++ b/apps/docs/content/docs/index.ko.mdx @@ -13,7 +13,7 @@ Multica는 인간과 AI [에이전트](/agents)가 같은 [워크스페이스](/ 에이전트는 Multica 서버에서 작업을 실행하지 **않습니다**. 현재 Multica는 하나의 런타임 모델을 지원합니다: -- **로컬 [데몬](/daemon-runtimes)** — 자신의 기기에서 `multica daemon`을 실행하면, 데몬이 로컬에 설치된 [AI 코딩 도구](/providers)를 구동합니다. 현재 열두 가지가 기본 내장되어 있습니다: [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi). API 키, 툴체인, 코드 디렉터리는 모두 자신의 기기에 머뭅니다. +- **로컬 [데몬](/daemon-runtimes)** — 자신의 기기에서 `multica daemon`을 실행하면, 데몬이 로컬에 설치된 [AI 코딩 도구](/providers)를 구동합니다. 현재 14가지가 기본 내장되어 있습니다: [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi), [Qoder](/providers#qoder), [Trae CLI](/providers#trae). API 키, 툴체인, 코드 디렉터리는 모두 자신의 기기에 머뭅니다. **클라우드 런타임이 곧 제공됩니다.** 현재는 대기 명단으로만 운영됩니다. 출시되면 로컬 데몬이 필요 없어지며 — 에이전트 작업이 Multica Cloud에서 직접 실행됩니다. [다운로드](https://multica.ai/download) 페이지에서 등록하면 알림을 받을 수 있습니다. diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx index 94e7a05fca0..806133d4d7a 100644 --- a/apps/docs/content/docs/index.mdx +++ b/apps/docs/content/docs/index.mdx @@ -13,7 +13,7 @@ This page explains where agents run and the ways you can start using Multica. Agents do **not** execute tasks on Multica's servers. Multica currently supports one runtime model: -- **Local [daemon](/daemon-runtimes)** — you run `multica daemon` on your own machine, and it drives the [AI coding tools](/providers) installed locally. Twelve are built in today: [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi). Your API keys, toolchain, and code directories stay on your machine. +- **Local [daemon](/daemon-runtimes)** — you run `multica daemon` on your own machine, and it drives the [AI coding tools](/providers) installed locally. Fourteen are built in today: [Antigravity](/providers#antigravity), [Claude Code](/providers#claude-code), [CodeBuddy](/providers#codebuddy), [Codex](/providers#codex), [Cursor](/providers#cursor), [Copilot](/providers#copilot), [Hermes](/providers#hermes), [Kimi](/providers#kimi), [Kiro CLI](/providers#kiro-cli), [OpenCode](/providers#opencode), [OpenClaw](/providers#openclaw), [Pi](/providers#pi), [Qoder](/providers#qoder), [Trae CLI](/providers#trae). Your API keys, toolchain, and code directories stay on your machine. **Cloud runtimes are coming**, currently waitlist-only. Once live, you won't need a local daemon — agent tasks will execute on Multica Cloud directly. Sign up on the [Downloads](https://multica.ai/download) page to get notified. diff --git a/apps/docs/content/docs/index.zh.mdx b/apps/docs/content/docs/index.zh.mdx index 789d4100819..6ec7ccada6d 100644 --- a/apps/docs/content/docs/index.zh.mdx +++ b/apps/docs/content/docs/index.zh.mdx @@ -15,7 +15,7 @@ Multica 是一个任务协作平台,让人类和 AI [智能体](/agents) 在 智能体执行任务**不**发生在 Multica 服务器上。目前 Multica 支持一种运行方式: -- **本地 [守护进程](/daemon-runtimes)** — 你在自己的机器上运行 `multica daemon`,由它调用本地安装的 [AI 编程工具](/providers)。目前内置 12 款:[Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)。你的 API 密钥、工具链、代码目录都保留在本地。 +- **本地 [守护进程](/daemon-runtimes)** — 你在自己的机器上运行 `multica daemon`,由它调用本地安装的 [AI 编程工具](/providers)。目前内置 14 款:[Antigravity](/providers#antigravity)、[Claude Code](/providers#claude-code)、[CodeBuddy](/providers#codebuddy)、[Codex](/providers#codex)、[Cursor](/providers#cursor)、[Copilot](/providers#copilot)、[Hermes](/providers#hermes)、[Kimi](/providers#kimi)、[Kiro CLI](/providers#kiro-cli)、[OpenCode](/providers#opencode)、[OpenClaw](/providers#openclaw)、[Pi](/providers#pi)、[Qoder](/providers#qoder)、[Trae CLI](/providers#trae)。你的 API 密钥、工具链、代码目录都保留在本地。 **云端运行时即将开放**,目前处于等待名单阶段。上线后,你无需在本地运行守护进程,即可在 Multica Cloud 上直接执行智能体任务。在 [下载页面](https://multica.ai/download) 登记邮箱以获取通知。 diff --git a/apps/docs/content/docs/install-agent-runtime.ja.mdx b/apps/docs/content/docs/install-agent-runtime.ja.mdx index 1e509cd2aad..ae6de7a534c 100644 --- a/apps/docs/content/docs/install-agent-runtime.ja.mdx +++ b/apps/docs/content/docs/install-agent-runtime.ja.mdx @@ -1,11 +1,11 @@ --- title: エージェントランタイムをインストールする -description: Multica はあなたのマシンにインストールされている AI コーディングツールを駆動します。このページでは、デーモンがそれらを検出できるように、サポートされている 13 種のツールをそれぞれインストールする方法を説明します。 +description: Multica はあなたのマシンにインストールされている AI コーディングツールを駆動します。このページでは、デーモンがそれらを検出できるように、サポートされている 14 種のツールをそれぞれインストールする方法を説明します。 --- import { Callout } from "fumadocs-ui/components/callout"; -Multica における**ランタイム**とは、あなたのマシンのデーモンと、デーモンが `PATH` で見つけた AI コーディングツール 1 つが組になったものです。オンボーディングの「ランタイムを接続」ステップで **No supported tools detected** と表示される場合、それはデーモンが `PATH` をスキャンしたものの、駆動方法を知っている 13 種のツールのいずれも見つけられなかったことを意味します。以下のツールのいずれか(または複数)をインストールしてから、そのステップに戻って再スキャンしてください — 数秒以内にランタイムが表示されます。 +Multica における**ランタイム**とは、あなたのマシンのデーモンと、デーモンが `PATH` で見つけた AI コーディングツール 1 つが組になったものです。オンボーディングの「ランタイムを接続」ステップで **No supported tools detected** と表示される場合、それはデーモンが `PATH` をスキャンしたものの、駆動方法を知っている 14 種のツールのいずれも見つけられなかったことを意味します。以下のツールのいずれか(または複数)をインストールしてから、そのステップに戻って再スキャンしてください — 数秒以内にランタイムが表示されます。 このページは次のドキュメントのインストール側の補完ドキュメントです。 @@ -31,9 +31,9 @@ multica daemon restart または、デスクトップアプリではアプリを再起動するだけで構いません。デーモンは起動するたびに `PATH` を再スキャンします。 -## サポートされている 13 種のツール +## サポートされている 14 種のツール -おおよそ利用者の多い順に並べています。すでに認証情報を持っているものを選んで使ってください — 13 種すべてをインストールする必要はありません。 +おおよそ利用者の多い順に並べています。すでに認証情報を持っているものを選んで使ってください — 14 種すべてをインストールする必要はありません。 ### Claude Code (Anthropic) @@ -157,6 +157,16 @@ stdio 上で ACP プロトコルを使用するエージェント型のコーデ | インストール | 公式 CLI ドキュメント [qoder.com/cli](https://qoder.com/cli) を参照してください。 | | 認証 | ベンダーのドキュメントに従います。 | +### Trae CLI (ByteDance) + +ByteDance 公式の TRAE CLI(`traecli`、Trae IDE と組み合わせて使う製品で、**オープンソースの `bytedance/trae-agent` ではありません**)です。ACP ネイティブのため、Multica は stdio 上で `traecli acp serve --yolo` を通じて駆動し、Hermes、Kimi、Kiro CLI、Qoder とトランスポートを共有します。セッション再開は ACP `session/load`、MCP 構成は ACP `mcpServers`、モデル選択は動的探索で動作し、スキルは `.traecli/skills/` にコピーされます。 + +| | | +|---|---| +| デーモンが探す名前 | `traecli` | +| インストール | 公式 CLI ドキュメント [docs.trae.cn/cli](https://docs.trae.cn/cli) を参照してください。 | +| 認証 | `traecli` を一度対話的に実行してブラウザベースの企業ログインを完了してください。Trae IDE へのログインと CLI へのログインは別です。 | + ### Antigravity (Google) Google の Antigravity CLI(`agy`)です。Google の Antigravity サービスと組になり、Gemini ベースのモデルを実行します。セッション再開は `--conversation ` を通じて動作し、デーモンが CLI のログファイルからこれをキャプチャします。モデル選択は Antigravity CLI 自体の内部で管理されます — Multica はこのプロバイダーに対してエージェントごとのモデルピッカーを無効にします。スキルは `.agents/skills/` に書き込まれます(CLI が Gemini CLI のワークスペーススキルレイアウトを継承します — [Antigravity ドキュメント](https://antigravity.google/docs/gcli-migration)を参照)。 diff --git a/apps/docs/content/docs/install-agent-runtime.ko.mdx b/apps/docs/content/docs/install-agent-runtime.ko.mdx index 4bd4556b75d..38078719e04 100644 --- a/apps/docs/content/docs/install-agent-runtime.ko.mdx +++ b/apps/docs/content/docs/install-agent-runtime.ko.mdx @@ -1,11 +1,11 @@ --- title: 에이전트 런타임 설치하기 -description: Multica는 사용자 기기에 설치된 AI 코딩 도구를 구동합니다. 이 페이지에서는 데몬이 도구를 감지할 수 있도록 지원되는 13종의 도구를 각각 설치하는 방법을 설명합니다. +description: Multica는 사용자 기기에 설치된 AI 코딩 도구를 구동합니다. 이 페이지에서는 데몬이 도구를 감지할 수 있도록 지원되는 14종의 도구를 각각 설치하는 방법을 설명합니다. --- import { Callout } from "fumadocs-ui/components/callout"; -Multica에서 **런타임**이란 사용자 기기의 데몬과, 데몬이 `PATH`에서 찾아낸 AI 코딩 도구 하나가 짝을 이룬 것입니다. 온보딩의 "런타임 연결" 단계에서 **지원되는 도구를 감지하지 못했습니다**라고 표시된다면, 데몬이 `PATH`를 스캔했지만 구동 방법을 아는 13종의 도구 중 어느 것도 찾지 못했다는 뜻입니다. 아래 도구 중 하나(또는 여러 개)를 설치한 다음 해당 단계로 돌아와 다시 스캔하세요. 몇 초 안에 런타임이 나타납니다. +Multica에서 **런타임**이란 사용자 기기의 데몬과, 데몬이 `PATH`에서 찾아낸 AI 코딩 도구 하나가 짝을 이룬 것입니다. 온보딩의 "런타임 연결" 단계에서 **지원되는 도구를 감지하지 못했습니다**라고 표시된다면, 데몬이 `PATH`를 스캔했지만 구동 방법을 아는 14종의 도구 중 어느 것도 찾지 못했다는 뜻입니다. 아래 도구 중 하나(또는 여러 개)를 설치한 다음 해당 단계로 돌아와 다시 스캔하세요. 몇 초 안에 런타임이 나타납니다. 이 페이지는 다음 문서의 설치 측면 동반 문서입니다. @@ -31,9 +31,9 @@ multica daemon restart 또는 데스크톱 앱에서는 앱을 다시 실행하기만 하면 됩니다. 데몬은 시작될 때마다 `PATH`를 다시 스캔합니다. -## 지원되는 13종의 도구 +## 지원되는 14종의 도구 -대략 많이 쓰이는 순서대로 나열했습니다. 이미 자격 증명을 갖고 있는 것을 골라 사용하세요. 13종을 모두 설치할 필요는 없습니다. +대략 많이 쓰이는 순서대로 나열했습니다. 이미 자격 증명을 갖고 있는 것을 골라 사용하세요. 14종을 모두 설치할 필요는 없습니다. ### Claude Code (Anthropic) @@ -157,6 +157,16 @@ stdio 위에서 ACP 프로토콜을 사용하는 에이전트형 코딩 CLI입 | 설치 | 공식 CLI 문서 [qoder.com/cli](https://qoder.com/cli)를 참고하세요. | | 인증 | 공급사 문서에 따릅니다. | +### Trae CLI (ByteDance) + +ByteDance의 공식 TRAE CLI(`traecli`, Trae IDE와 함께 쓰는 제품이며 **오픈소스 `bytedance/trae-agent`가 아닙니다**)입니다. ACP 네이티브라서 Multica는 `traecli acp serve --yolo`로 stdio 위에서 구동하며 Hermes, Kimi, Kiro CLI, Qoder와 전송 계층을 공유합니다. 세션 재개는 ACP `session/load`로 동작하고, MCP 구성은 ACP `mcpServers`로 전달되며, 모델 선택은 동적으로 탐색되고, 스킬은 `.traecli/skills/`로 복사됩니다. + +| | | +|---|---| +| 데몬이 찾는 이름 | `traecli` | +| 설치 | 공식 CLI 문서 [docs.trae.cn/cli](https://docs.trae.cn/cli)를 참고하세요. | +| 인증 | `traecli`를 한 번 대화형으로 실행해 브라우저 기반 기업 로그인을 완료하세요. Trae IDE 로그인과 CLI 로그인은 별개입니다. | + ### Antigravity (Google) Google의 Antigravity CLI(`agy`)입니다. Google의 Antigravity 서비스와 짝을 이루며 Gemini 기반 모델을 실행합니다. 세션 재개는 `--conversation `를 통해 작동하며, 데몬이 CLI 로그 파일에서 이를 캡처합니다. 모델 선택은 Antigravity CLI 자체 내부에서 관리됩니다 — Multica는 이 제공자에 대해 에이전트별 모델 선택기를 비활성화합니다. 스킬은 `.agents/skills/`에 기록됩니다(CLI가 Gemini CLI의 워크스페이스 스킬 레이아웃을 상속함 — [Antigravity 문서](https://antigravity.google/docs/gcli-migration) 참고). diff --git a/apps/docs/content/docs/install-agent-runtime.zh.mdx b/apps/docs/content/docs/install-agent-runtime.zh.mdx index 8847d12388b..3984805a800 100644 --- a/apps/docs/content/docs/install-agent-runtime.zh.mdx +++ b/apps/docs/content/docs/install-agent-runtime.zh.mdx @@ -1,11 +1,11 @@ --- title: 安装一个 Agent 运行时 -description: Multica 驱动本机上已安装的 AI 编程工具。这一页讲清楚怎么安装目前支持的 13 款工具,让守护进程能扫到。 +description: Multica 驱动本机上已安装的 AI 编程工具。这一页讲清楚怎么安装目前支持的 14 款工具,让守护进程能扫到。 --- import { Callout } from "fumadocs-ui/components/callout"; -在 Multica 里,一个**运行时**(runtime)就是你机器上的守护进程,配上守护进程在 `PATH` 里扫到的某一款 AI 编程工具。如果 onboarding 的 "连接运行时" 这一步显示 **未检测到支持的工具**,说明守护进程扫了 `PATH`,但 13 款它认得的工具一个都没找到。装下面任意一款(或几款),回到这一步重新扫描,几秒内运行时就会出现。 +在 Multica 里,一个**运行时**(runtime)就是你机器上的守护进程,配上守护进程在 `PATH` 里扫到的某一款 AI 编程工具。如果 onboarding 的 "连接运行时" 这一步显示 **未检测到支持的工具**,说明守护进程扫了 `PATH`,但 14 款它认得的工具一个都没找到。装下面任意一款(或几款),回到这一步重新扫描,几秒内运行时就会出现。 这一页是装机的入口,和它配套的是: @@ -31,9 +31,9 @@ multica daemon restart 桌面端的话,重启 app 即可。守护进程只在启动时扫一次 `PATH`。 -## 13 款支持的工具 +## 14 款支持的工具 -大致按常见程度排序。挑你已经有账号 / API key 的那几款就行 —— 不需要 13 个全装。 +大致按常见程度排序。挑你已经有账号 / API key 的那几款就行 —— 不需要 14 个全装。 ### Claude Code(Anthropic) @@ -157,6 +157,16 @@ ACP 协议 agent(和 Kimi 共享传输层)。会话续接可用,MCP 配置 | 安装 | 看官方 CLI 文档 [qoder.com/cli](https://qoder.com/cli)。 | | 认证 | 按厂商文档。 | +### Trae CLI(ByteDance) + +ByteDance 官方 TRAE CLI(`traecli`,搭配 Trae IDE,**不是**开源的 `bytedance/trae-agent`)。它是 ACP 原生工具,Multica 通过 `traecli acp serve --yolo` 在 stdio 上驱动它,和 Hermes、Kimi、Kiro CLI、Qoder 共享传输层。会话续接通过 ACP `session/load` 工作,MCP 配置通过 ACP `mcpServers` 传入,模型为动态发现,skill 复制到 `.traecli/skills/`。 + +| | | +|---|---| +| 守护进程扫描 | `traecli` | +| 安装 | 看官方 CLI 文档 [docs.trae.cn/cli](https://docs.trae.cn/cli)。 | +| 认证 | 交互式跑一次 `traecli` 完成浏览器企业登录。Trae IDE 登录和 CLI 登录是分开的。 | + ### Antigravity(Google) Google 的 Antigravity CLI(`agy`)。搭配 Google Antigravity 服务,默认走 Gemini 系列模型。Multica 使用 `agy -p` 启动它,这是适合 daemon 后台任务的一次性非交互模式;当前 Antigravity CLI 在这个模式下仍可执行工具,而 `agy -i` 需要连接 TTY,不适合 daemon 驱动。会话续接通过 `--conversation ` 工作——守护进程从 CLI 的日志文件里抓取 conversation UUID。模型选择保存在 Antigravity CLI 自己的设置里——Multica 里这款工具的「模型」选择项被禁用。Skill 文件写入 `.agents/skills/`(CLI 沿用 Gemini CLI 的 workspace 布局——见 [Antigravity 文档](https://antigravity.google/docs/gcli-migration))。 diff --git a/apps/docs/content/docs/providers.ja.mdx b/apps/docs/content/docs/providers.ja.mdx index 5aa08ebff21..e55ff221687 100644 --- a/apps/docs/content/docs/providers.ja.mdx +++ b/apps/docs/content/docs/providers.ja.mdx @@ -1,11 +1,11 @@ --- title: AI コーディングツール対応表 -description: Multica は 13 個の AI コーディングツールをサポートしています。すべて同じインターフェースを実装していますが、機能の詳細は大きく異なります。 +description: Multica は 14 個の AI コーディングツールをサポートしています。すべて同じインターフェースを実装していますが、機能の詳細は大きく異なります。 --- import { Callout } from "fumadocs-ui/components/callout"; -Multica は **13 個の AI コーディングツール**を標準でサポートしています。これらはすべて同じインターフェース(キューへの投入、ディスパッチ、実行、結果の返却)を実装しているため、同じ Multica ボードからどれでも動かすことができます。**しかし機能の詳細は大きく異なります**: セッション再開が実際に動作するか、MCP をサポートするか、スキルファイルがどこに置かれるか、モデルをどう選択するか。このページがその完全な対応表です。 +Multica は **14 個の AI コーディングツール**を標準でサポートしています。これらはすべて同じインターフェース(キューへの投入、ディスパッチ、実行、結果の返却)を実装しているため、同じ Multica ボードからどれでも動かすことができます。**しかし機能の詳細は大きく異なります**: セッション再開が実際に動作するか、MCP をサポートするか、スキルファイルがどこに置かれるか、モデルをどう選択するか。このページがその完全な対応表です。 エージェントを作成するときにツールを選ぶ際のガイダンスは、[エージェントの作成と構成](/agents-create)を参照してください。 @@ -26,6 +26,7 @@ Multica は **13 個の AI コーディングツール**を標準でサポート | **OpenClaw** | オープンソース | ✅ | ✅ | `.agent_context/skills/`(フォールバック) | エージェントにバインドされ、タスクごとに切り替え不可 | | **Pi** | Inflection AI | ✅(セッションがファイルパス) | ❌ | `.pi/skills/` | 動的探索 | | **Qoder** | Alibaba | ✅ | ✅ | `.qoder/skills/` | 動的探索 | +| **Trae CLI** | ByteDance | ✅(ACP `session/load`) | ✅ | `.traecli/skills/` | 動的探索 | ## 各ツールの用途 @@ -89,15 +90,19 @@ Inflection AI が提供し、ミニマルです。**セッション再開の方 Alibaba が提供します。エージェント型のコーディング CLI です。stdio 上で ACP プロトコルを使用します(Hermes、Kimi、Kiro CLI とトランスポートを共有します)。セッション再開は ACP `session/resume` を通じて動作し、MCP 構成は ACP `mcpServers` として渡され、モデル選択は動的に探索され、スキルはネイティブ探索のために `.qoder/skills/` にコピーされます。 +### Trae + +ByteDance 公式の TRAE CLI(`traecli`、Trae IDE と組み合わせて使う製品で、オープンソースの `bytedance/trae-agent` ではありません)です。ACP ネイティブのため、Multica は `traecli acp serve --yolo` で stdio 経由で駆動します。Kiro や Qoder と同じトランスポートです。セッション再開は ACP `session/load` で動作し、MCP 構成は ACP `mcpServers` として渡され、モデルは動的に探索されて `session/set_model` でタスクごとに切り替えられます。スキルは `.traecli/skills/` にコピーされます。 + ## セッション再開: 実際にサポートするツール セッション再開のメカニズムは[タスク](/tasks#can-a-task-continue-from-the-previous-context)で扱います。**サポートされているすべてのツールがセッションを再開できます** — 再開 id を渡すと、タスクは以前のコンテキストから続行します。唯一の例外は Pi で、再開 id が文字列 ID ではなくディスク上のセッションファイルへのパスです(上記の [Pi](#pi) を参照)。 ## MCP 構成: ツールごとの対応 -**13 個のツールのうち、`mcp_config` を実際に消費するのは 10 個です: Claude Code、CodeBuddy、Codex、Cursor、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Qoder**。残りの 3 個はこのフィールドを受け取りますが、**無視します** — エラーも警告もなく、構成はただ効果を発揮しません。 +**14 個のツールのうち、`mcp_config` を実際に消費するのは 11 個です: Claude Code、CodeBuddy、Codex、Cursor、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Qoder、Trae CLI**。残りの 3 個はこのフィールドを受け取りますが、**無視します** — エラーも警告もなく、構成はただ効果を発揮しません。 -接続方式はツールごとに異なります: Claude Code と CodeBuddy は `--mcp-config` と `--strict-mcp-config` で受け取り、Codex は daemon 管理の `mcp_servers` ブロックをタスクごとの `$CODEX_HOME/config.toml` に書き込み、Cursor は `.cursor/mcp.json` とタスクごとの `CURSOR_DATA_DIR` 配下のプロジェクト approval を書き込みます。Hermes、Kimi、Kiro CLI、Qoder は ACP `mcpServers` で受け取ります。OpenCode は `OPENCODE_CONFIG_CONTENT` 環境変数でインライン構成を受け取り、OpenClaw は Multica のタスクごとの config wrapper 経由で `mcp.servers` を受け取ります。OpenCode の経路はプロジェクトの `opencode.json` を書き換えません。 +接続方式はツールごとに異なります: Claude Code と CodeBuddy は `--mcp-config` と `--strict-mcp-config` で受け取り、Codex は daemon 管理の `mcp_servers` ブロックをタスクごとの `$CODEX_HOME/config.toml` に書き込み、Cursor は `.cursor/mcp.json` とタスクごとの `CURSOR_DATA_DIR` 配下のプロジェクト approval を書き込みます。Hermes、Kimi、Kiro CLI、Qoder、Trae CLI は ACP `mcpServers` で受け取ります。OpenCode は `OPENCODE_CONFIG_CONTENT` 環境変数でインライン構成を受け取り、OpenClaw は Multica のタスクごとの config wrapper 経由で `mcp.servers` を受け取ります。OpenCode の経路はプロジェクトの `opencode.json` を書き換えません。 エージェント構成で `mcp_config` を設定しても、MCP 列に ✅ がないツールを選んだ場合、MCP サーバーはそのエージェントに**何の効果**も及ぼしません。MCP 連携はツールごとに実装されています。 @@ -119,6 +124,7 @@ Alibaba が提供します。エージェント型のコーディング CLI で | OpenCode | `.opencode/skills/` | ✅ ネイティブ | | Pi | `.pi/skills/` | ✅ ネイティブ | | Qoder | `.qoder/skills/` | ✅ ネイティブ | +| Trae CLI | `.traecli/skills/` | ✅ ネイティブ | | Antigravity | `.agents/skills/` | ✅ ネイティブ(Gemini CLI のワークスペースレイアウトを継承 — [Antigravity ドキュメント](https://antigravity.google/docs/gcli-migration)を参照) | | Hermes | `.agent_context/skills/` | ⚠️ 汎用フォールバック | | OpenClaw | `.agent_context/skills/` | ⚠️ 汎用フォールバック | @@ -134,4 +140,4 @@ Alibaba が提供します。エージェント型のコーディング CLI で - [エージェントの作成と構成](/agents-create) — エージェントに使うツールを選ぶ - [タスク](/tasks) — タスクのライフサイクルとセッション再開のメカニズム - [デーモンとランタイム](/daemon-runtimes) — ツールが実行される場所と Multica への接続方法 -- [エージェントランタイムのインストール](/install-agent-runtime) — サポートされる 13 個のツールそれぞれのインストールと認証 +- [エージェントランタイムのインストール](/install-agent-runtime) — サポートされる 14 個のツールそれぞれのインストールと認証 diff --git a/apps/docs/content/docs/providers.ko.mdx b/apps/docs/content/docs/providers.ko.mdx index 453d798e8ad..70058ee8d21 100644 --- a/apps/docs/content/docs/providers.ko.mdx +++ b/apps/docs/content/docs/providers.ko.mdx @@ -1,11 +1,11 @@ --- title: AI 코딩 도구 대조표 -description: Multica는 13개의 AI 코딩 도구를 지원합니다. 모두 동일한 인터페이스를 구현하지만, 기능 세부사항은 크게 다릅니다. +description: Multica는 14개의 AI 코딩 도구를 지원합니다. 모두 동일한 인터페이스를 구현하지만, 기능 세부사항은 크게 다릅니다. --- import { Callout } from "fumadocs-ui/components/callout"; -Multica는 **13개의 AI 코딩 도구**를 기본 지원합니다. 이들은 모두 동일한 인터페이스(대기열 적재, 디스패치, 실행, 결과 반환)를 구현하므로, 같은 Multica 보드에서 어느 것이든 구동할 수 있습니다. **하지만 기능 세부사항은 크게 다릅니다**: 세션 재개가 실제로 동작하는지, MCP를 지원하는지, 스킬 파일이 어디에 위치하는지, 모델을 어떻게 선택하는지. 이 페이지가 전체 대조표입니다. +Multica는 **14개의 AI 코딩 도구**를 기본 지원합니다. 이들은 모두 동일한 인터페이스(대기열 적재, 디스패치, 실행, 결과 반환)를 구현하므로, 같은 Multica 보드에서 어느 것이든 구동할 수 있습니다. **하지만 기능 세부사항은 크게 다릅니다**: 세션 재개가 실제로 동작하는지, MCP를 지원하는지, 스킬 파일이 어디에 위치하는지, 모델을 어떻게 선택하는지. 이 페이지가 전체 대조표입니다. 에이전트를 생성할 때 도구를 고르는 방법은 [에이전트 생성 및 구성](/agents-create)을 참고하세요. @@ -26,6 +26,7 @@ Multica는 **13개의 AI 코딩 도구**를 기본 지원합니다. 이들은 | **OpenClaw** | 오픈소스 | ✅ | ✅ | `.agent_context/skills/` (fallback) | 에이전트에 바인딩되어 작업마다 전환 불가 | | **Pi** | Inflection AI | ✅ (세션이 파일 경로) | ❌ | `.pi/skills/` | 동적 탐색 | | **Qoder** | Alibaba | ✅ | ✅ | `.qoder/skills/` | 동적 탐색 | +| **Trae CLI** | ByteDance | ✅ (ACP `session/load`) | ✅ | `.traecli/skills/` | 동적 탐색 | ## 각 도구의 용도 @@ -89,15 +90,19 @@ Inflection AI에서 제공하며, 미니멀합니다. **세션 재개 방식이 Alibaba에서 제공합니다. 에이전트형 코딩 CLI입니다. stdio 위에서 ACP 프로토콜을 사용합니다(Hermes, Kimi, Kiro CLI와 전송 계층을 공유합니다). 세션 재개는 ACP `session/resume`를 통해 동작하고, MCP 구성은 ACP `mcpServers`로 전달되며, 모델 선택은 동적으로 탐색되고, 스킬은 네이티브 탐색을 위해 `.qoder/skills/`로 복사됩니다. +### Trae + +ByteDance의 공식 TRAE CLI(`traecli`, Trae IDE와 함께 쓰는 제품이며 오픈소스 `bytedance/trae-agent`가 아닙니다)입니다. ACP 네이티브라서 Multica는 `traecli acp serve --yolo`로 stdio 위에서 구동하며, Kiro 및 Qoder와 같은 전송 계층을 사용합니다. 세션 재개는 ACP `session/load`로 동작하고, MCP 구성은 ACP `mcpServers`로 전달되며, 모델은 동적으로 탐색되어 작업별로 `session/set_model`로 전환됩니다. 스킬은 `.traecli/skills/`로 복사됩니다. + ## 세션 재개: 실제로 지원하는 도구 세션 재개 메커니즘은 [작업](/tasks#can-a-task-continue-from-the-previous-context)에서 다룹니다. **지원되는 모든 도구가 세션을 재개합니다** — 재개 id를 전달하면 작업이 이전 컨텍스트에서 이어집니다. 유일한 예외는 Pi로, 재개 id가 문자열 ID가 아니라 디스크상의 세션 파일 경로입니다(위의 [Pi](#pi) 참고). ## MCP 구성: 도구별 지원 -**13개 도구 중 `mcp_config`를 실제로 소비하는 것은 10개입니다: Claude Code, CodeBuddy, Codex, Cursor, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Qoder**. 나머지 3개는 이 필드를 받아들이지만 **무시합니다** — 오류도, 경고도 없으며, 구성이 그저 효과를 내지 못합니다. +**14개 도구 중 `mcp_config`를 실제로 소비하는 것은 11개입니다: Claude Code, CodeBuddy, Codex, Cursor, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Qoder, Trae CLI**. 나머지 3개는 이 필드를 받아들이지만 **무시합니다** — 오류도, 경고도 없으며, 구성이 그저 효과를 내지 못합니다. -각 도구의 연결 방식은 다릅니다: Claude Code와 CodeBuddy는 `--mcp-config`와 `--strict-mcp-config`로 받고, Codex는 데몬이 관리하는 `mcp_servers` 블록을 작업별 `$CODEX_HOME/config.toml`에 기록하며, Cursor는 `.cursor/mcp.json`과 작업별 `CURSOR_DATA_DIR` 아래의 프로젝트 approval을 기록합니다. Hermes/Kimi/Kiro CLI/Qoder는 ACP `mcpServers`로 받습니다. OpenCode는 `OPENCODE_CONFIG_CONTENT` 환경 변수로 인라인 구성을 받고, OpenClaw는 Multica의 작업별 config wrapper를 통해 `mcp.servers`를 받습니다. OpenCode 경로는 프로젝트의 `opencode.json`을 다시 쓰지 않습니다. +각 도구의 연결 방식은 다릅니다: Claude Code와 CodeBuddy는 `--mcp-config`와 `--strict-mcp-config`로 받고, Codex는 데몬이 관리하는 `mcp_servers` 블록을 작업별 `$CODEX_HOME/config.toml`에 기록하며, Cursor는 `.cursor/mcp.json`과 작업별 `CURSOR_DATA_DIR` 아래의 프로젝트 approval을 기록합니다. Hermes/Kimi/Kiro CLI/Qoder/Trae CLI는 ACP `mcpServers`로 받습니다. OpenCode는 `OPENCODE_CONFIG_CONTENT` 환경 변수로 인라인 구성을 받고, OpenClaw는 Multica의 작업별 config wrapper를 통해 `mcp.servers`를 받습니다. OpenCode 경로는 프로젝트의 `opencode.json`을 다시 쓰지 않습니다. 에이전트 구성에서 `mcp_config`를 설정했더라도 MCP 열에 ✅가 없는 도구를 선택하면, MCP 서버가 해당 에이전트에 **아무런 효과**도 미치지 않습니다. MCP 연동은 도구별로 구현됩니다. @@ -119,6 +124,7 @@ Alibaba에서 제공합니다. 에이전트형 코딩 CLI입니다. stdio 위에 | OpenCode | `.opencode/skills/` | ✅ 기본 | | Pi | `.pi/skills/` | ✅ 기본 | | Qoder | `.qoder/skills/` | ✅ 기본 | +| Trae CLI | `.traecli/skills/` | ✅ 기본 | | Antigravity | `.agents/skills/` | ✅ 기본 (Gemini CLI의 워크스페이스 레이아웃을 따름 — [Antigravity 문서](https://antigravity.google/docs/gcli-migration) 참고) | | Hermes | `.agent_context/skills/` | ⚠️ 범용 fallback | | OpenClaw | `.agent_context/skills/` | ⚠️ 범용 fallback | @@ -134,4 +140,4 @@ fallback 경로를 쓰는 도구가 실제로 이 디렉터리를 읽는지는 - [에이전트 생성 및 구성](/agents-create) — 에이전트에 사용할 도구를 선택하세요 - [작업](/tasks) — 작업 생명주기와 세션 재개 메커니즘 - [데몬과 런타임](/daemon-runtimes) — 도구가 실행되는 곳과 Multica에 연결되는 방식 -- [에이전트 런타임 설치](/install-agent-runtime) — 지원되는 13개 도구 각각의 설치 및 인증 +- [에이전트 런타임 설치](/install-agent-runtime) — 지원되는 14개 도구 각각의 설치 및 인증 diff --git a/apps/docs/content/docs/providers.zh.mdx b/apps/docs/content/docs/providers.zh.mdx index 7cdb1c91911..d2359a57add 100644 --- a/apps/docs/content/docs/providers.zh.mdx +++ b/apps/docs/content/docs/providers.zh.mdx @@ -1,11 +1,11 @@ --- title: AI 编程工具对照 -description: Multica 支持 13 款 AI 编程工具;它们实现同一套接口,但能力细节差异很大。 +description: Multica 支持 14 款 AI 编程工具;它们实现同一套接口,但能力细节差异很大。 --- import { Callout } from "fumadocs-ui/components/callout"; -Multica 内置支持 **13 款 AI 编程工具**。它们都实现了同一套接口——排队、派发、执行、结果回传,所以你可以从 Multica 的同一个看板上指挥任意一款。**但它们在能力细节上差异很大**:会话恢复是否真用、是否支持 MCP、skill 文件该放在哪里、模型怎么选。这一页是完整对照。 +Multica 内置支持 **14 款 AI 编程工具**。它们都实现了同一套接口——排队、派发、执行、结果回传,所以你可以从 Multica 的同一个看板上指挥任意一款。**但它们在能力细节上差异很大**:会话恢复是否真用、是否支持 MCP、skill 文件该放在哪里、模型怎么选。这一页是完整对照。 创建智能体时挑选工具的指引见 [创建和配置智能体](/agents-create)。 @@ -26,6 +26,7 @@ Multica 内置支持 **13 款 AI 编程工具**。它们都实现了同一套接 | **OpenClaw** | 开源项目 | ✅ | ✅ | `.agent_context/skills/` (fallback)| 绑定在智能体上,不能在任务里切换 | | **Pi** | Inflection AI | ✅(session 为文件路径)| ❌ | `.pi/skills/` | 动态发现 | | **Qoder** | Alibaba | ✅ | ✅ | `.qoder/skills/` | 动态发现 | +| **Trae CLI** | ByteDance | ✅(ACP `session/load`)| ✅ | `.traecli/skills/` | 动态发现 | ## 每款工具的定位 @@ -89,15 +90,19 @@ Inflection AI 出品,极简主义。**会话恢复机制特殊**——session Alibaba 出品。一款 agentic 编程 CLI。使用 ACP 协议(和 Hermes、Kimi、Kiro CLI 共享传输层)。会话恢复通过 ACP `session/resume` 工作,MCP 配置通过 ACP `mcpServers` 传入,模型为动态发现,skill 复制到 `.qoder/skills/` 做原生发现。 +### Trae + +ByteDance 官方 TRAE CLI(`traecli`,搭配 Trae IDE,**不是**开源的 `bytedance/trae-agent`)。它是 ACP 原生工具,Multica 通过 `traecli acp serve --yolo` 在 stdio 上驱动它,传输层和 Kiro、Qoder 相同。会话恢复通过 ACP `session/load` 工作,MCP 配置通过 ACP `mcpServers` 传入,模型为动态发现并可通过 `session/set_model` 在任务中切换,skill 复制到 `.traecli/skills/`。 + ## 会话恢复:谁真的支持 会话恢复的机制在 [执行任务](/tasks#任务能接着上次的上下文继续吗) 里讲过。**所有支持的工具都能恢复会话**——传 resume id,任务就会从上次的上下文接着继续。唯一的特例是 Pi:它的 resume id 是磁盘上的会话文件路径,而不是字符串 ID(见上文 [Pi](#pi))。 ## MCP 配置:按工具不同 -**13 款工具里有 10 款实际消费 `mcp_config`:Claude Code、CodeBuddy、Codex、Cursor、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Qoder**。其他 3 款会接收这个字段但**忽略**——不报错、不警告,只是配置不生效。 +**14 款工具里有 11 款实际消费 `mcp_config`:Claude Code、CodeBuddy、Codex、Cursor、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Qoder、Trae CLI**。其他 3 款会接收这个字段但**忽略**——不报错、不警告,只是配置不生效。 -各工具的接入方式不同:Claude Code 和 CodeBuddy 通过 `--mcp-config` 加 `--strict-mcp-config` 接收;Codex 会把 daemon 管理的 `mcp_servers` block 写入单次任务的 `$CODEX_HOME/config.toml`;Cursor 会写入 `.cursor/mcp.json`,并把项目 approval 写到单次任务的 `CURSOR_DATA_DIR`;Hermes、Kimi、Kiro CLI、Qoder 通过 ACP `mcpServers` 接收;OpenCode 通过 `OPENCODE_CONFIG_CONTENT` 环境变量内联接收;OpenClaw 通过 Multica 的单次任务配置 wrapper 接收 `mcp.servers`。OpenCode 这条路径**不会**改写项目里的 `opencode.json`。 +各工具的接入方式不同:Claude Code 和 CodeBuddy 通过 `--mcp-config` 加 `--strict-mcp-config` 接收;Codex 会把 daemon 管理的 `mcp_servers` block 写入单次任务的 `$CODEX_HOME/config.toml`;Cursor 会写入 `.cursor/mcp.json`,并把项目 approval 写到单次任务的 `CURSOR_DATA_DIR`;Hermes、Kimi、Kiro CLI、Qoder、Trae CLI 通过 ACP `mcpServers` 接收;OpenCode 通过 `OPENCODE_CONFIG_CONTENT` 环境变量内联接收;OpenClaw 通过 Multica 的单次任务配置 wrapper 接收 `mcp.servers`。OpenCode 这条路径**不会**改写项目里的 `opencode.json`。 如果你在智能体配置里设置了 `mcp_config`,但选了矩阵 MCP 列没有标 ✅ 的工具,你的 MCP server 对这个智能体**没有效果**。MCP 集成是按工具实现的。 @@ -119,6 +124,7 @@ Alibaba 出品。一款 agentic 编程 CLI。使用 ACP 协议(和 Hermes、Ki | OpenCode | `.opencode/skills/` | ✅ 原生 | | Pi | `.pi/skills/` | ✅ 原生 | | Qoder | `.qoder/skills/` | ✅ 原生 | +| Trae CLI | `.traecli/skills/` | ✅ 原生 | | Antigravity | `.agents/skills/` | ✅ 原生(沿用 Gemini CLI 的 workspace 布局——见 [Antigravity 文档](https://antigravity.google/docs/gcli-migration))| | Hermes | `.agent_context/skills/` | ⚠️ 通用 fallback | | OpenClaw | `.agent_context/skills/` | ⚠️ 通用 fallback | diff --git a/apps/docs/content/docs/skills.ja.mdx b/apps/docs/content/docs/skills.ja.mdx index decc464fe22..d2025abac4c 100644 --- a/apps/docs/content/docs/skills.ja.mdx +++ b/apps/docs/content/docs/skills.ja.mdx @@ -70,4 +70,4 @@ GitHub や ClawHub からインポートしたスキルには、スクリプト - [デーモンとランタイム](/daemon-runtimes) — エージェントが実際に実行される場所、そしてオンラインとオフラインの見分け方 - [タスクの実行](/tasks) — 1 回の「エージェント作業セッション」の全ライフサイクル -- [AI コーディングツール比較](/providers) — 12 ツール全体の比較(各ツールのスキル注入パスを含む) +- [AI コーディングツール比較](/providers) — 14 ツール全体の比較(各ツールのスキル注入パスを含む) diff --git a/apps/docs/content/docs/skills.ko.mdx b/apps/docs/content/docs/skills.ko.mdx index c94aa798032..f6c9f2b0bb1 100644 --- a/apps/docs/content/docs/skills.ko.mdx +++ b/apps/docs/content/docs/skills.ko.mdx @@ -70,4 +70,4 @@ GitHub나 ClawHub에서 가져온 스킬에는 스크립트와 실행 가능한 - [데몬과 런타임](/daemon-runtimes) — 에이전트가 실제로 실행되는 곳, 그리고 온라인과 오프라인을 구분하는 방법 - [작업 실행하기](/tasks) — 한 번의 "에이전트 작업 세션"의 전체 수명 주기 -- [AI 코딩 도구 비교](/providers) — 12개 도구 전체 비교(각 도구의 스킬 주입 경로 포함) +- [AI 코딩 도구 비교](/providers) — 14개 도구 전체 비교(각 도구의 스킬 주입 경로 포함) diff --git a/apps/docs/content/docs/skills.zh.mdx b/apps/docs/content/docs/skills.zh.mdx index 9f7626f87ad..722cd2cf3dc 100644 --- a/apps/docs/content/docs/skills.zh.mdx +++ b/apps/docs/content/docs/skills.zh.mdx @@ -70,4 +70,4 @@ Skill 导入后需要**挂载到具体的智能体**才会生效。一个智能 - [守护进程与运行时](/daemon-runtimes) —— 智能体到底跑在哪、怎么判断在线 / 离线 - [执行任务](/tasks) —— 一次"智能体工作"的完整生命周期 -- [AI 编程工具对照](/providers) —— 12 款工具的完整对比(含每款的 Skill 注入路径) +- [AI 编程工具对照](/providers) —— 14 款工具的完整对比(含每款的 Skill 注入路径) diff --git a/apps/docs/content/docs/tasks.ja.mdx b/apps/docs/content/docs/tasks.ja.mdx index 89af56f20a3..7c68a8c532a 100644 --- a/apps/docs/content/docs/tasks.ja.mdx +++ b/apps/docs/content/docs/tasks.ja.mdx @@ -112,5 +112,5 @@ Multica はタスク中にセッション ID を**2 回**固定します: 開始 ## 次へ -- [プロバイダー対応表](/providers) — 12 個の AI コーディングツール間の機能差(正確なセッション再開の状態を含む) +- [プロバイダー対応表](/providers) — 14 個の AI コーディングツール間の機能差(正確なセッション再開の状態を含む) - [エージェントへのイシューの割り当て](/assigning-issues) / [コメントでのエージェントの @-メンション](/mentioning-agents) / [チャット](/chat) / [オートパイロット](/autopilots) — タスクをトリガーする 4 つの方法 diff --git a/apps/docs/content/docs/tasks.ko.mdx b/apps/docs/content/docs/tasks.ko.mdx index a83fb5b1288..c2bfe9c06fc 100644 --- a/apps/docs/content/docs/tasks.ko.mdx +++ b/apps/docs/content/docs/tasks.ko.mdx @@ -112,5 +112,5 @@ Multica는 작업 중에 세션 ID를 **두 번** 고정합니다: 시작 시 ## 다음 -- [제공자 매트릭스](/providers) — 12개 AI 코딩 도구 간의 기능 차이(정확한 세션 재개 상태 포함) +- [제공자 매트릭스](/providers) — 14개 AI 코딩 도구 간의 기능 차이(정확한 세션 재개 상태 포함) - [에이전트에게 이슈 할당하기](/assigning-issues) / [댓글에서 에이전트 @-멘션하기](/mentioning-agents) / [채팅](/chat) / [오토파일럿](/autopilots) — 작업을 트리거하는 네 가지 방법 diff --git a/apps/docs/content/docs/tasks.zh.mdx b/apps/docs/content/docs/tasks.zh.mdx index 2d40de6a720..0e2ecf1ee47 100644 --- a/apps/docs/content/docs/tasks.zh.mdx +++ b/apps/docs/content/docs/tasks.zh.mdx @@ -114,5 +114,5 @@ Multica 在任务过程中**两次**保存会话 ID——任务一开始(AI ## 下一步 -- [Providers Matrix](/providers) —— 12 款 AI 编程工具的能力差异对照(包括会话恢复的精确状态) +- [Providers Matrix](/providers) —— 14 款 AI 编程工具的能力差异对照(包括会话恢复的精确状态) - [分配 issue 给智能体](/assigning-issues) / [在评论里 @智能体](/mentioning-agents) / [聊天](/chat) / [Autopilots](/autopilots) —— 触发执行任务的四种方式 diff --git a/apps/web/features/landing/i18n/en.ts b/apps/web/features/landing/i18n/en.ts index d4cf6bb63f7..5d8d13dfedc 100644 --- a/apps/web/features/landing/i18n/en.ts +++ b/apps/web/features/landing/i18n/en.ts @@ -101,7 +101,7 @@ export function createEnDict(allowSignup: boolean): LandingDict { label: "RUNTIMES", title: "One dashboard for all your compute", description: - "Local daemons and cloud runtimes, managed from a single panel. Real-time monitoring of online/offline status, usage charts, and activity heatmaps. Auto-detects 12 supported coding tools on your machine.", + "Local daemons and cloud runtimes, managed from a single panel. Real-time monitoring of online/offline status, usage charts, and activity heatmaps. Auto-detects 14 supported coding tools on your machine.", cards: [ { title: "Unified runtime panel", @@ -116,7 +116,7 @@ export function createEnDict(allowSignup: boolean): LandingDict { { title: "Auto-detection on first run", description: - "Multica scans for 12 supported coding tools \u2014 Antigravity, Claude Code, Codex, Cursor, Copilot, Gemini, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, and Pi \u2014 and registers a runtime for each one it finds.", + "Multica scans for 14 supported coding tools \u2014 Antigravity, Claude Code, CodeBuddy, Codex, Cursor, Copilot, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi, Qoder, and Trae CLI \u2014 and registers a runtime for each one it finds.", }, ], }, @@ -136,7 +136,7 @@ export function createEnDict(allowSignup: boolean): LandingDict { { title: "Install the CLI & connect your machine", description: - "Run multica setup \u2014 it walks you through OAuth, starts the daemon, and scans for the 12 supported coding tools (Antigravity, Claude Code, Codex, Cursor, Copilot, Gemini, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi). Whichever ones you already have installed get registered as runtimes automatically.", + "Run multica setup \u2014 it walks you through OAuth, starts the daemon, and scans for the 14 supported coding tools (Antigravity, Claude Code, CodeBuddy, Codex, Cursor, Copilot, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi, Qoder, Trae CLI). Whichever ones you already have installed get registered as runtimes automatically.", }, { title: "Create your first agent", @@ -192,7 +192,7 @@ export function createEnDict(allowSignup: boolean): LandingDict { { question: "What coding agents does Multica support?", answer: - "Multica supports 12 coding tools out of the box: Antigravity, Claude Code, Codex, Cursor, Copilot, Gemini, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, and Pi. The daemon auto-detects whichever CLIs you already have installed and registers a runtime for each one. Since it's open source, you can also add your own backends.", + "Multica supports 14 coding tools out of the box: Antigravity, Claude Code, CodeBuddy, Codex, Cursor, Copilot, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi, Qoder, and Trae CLI. The daemon auto-detects whichever CLIs you already have installed and registers a runtime for each one. Since it's open source, you can also add your own backends.", }, { question: "Do I need to self-host, or is there a cloud version?", diff --git a/apps/web/features/landing/i18n/ja.ts b/apps/web/features/landing/i18n/ja.ts index 1be6d9570fc..a2397251f20 100644 --- a/apps/web/features/landing/i18n/ja.ts +++ b/apps/web/features/landing/i18n/ja.ts @@ -118,7 +118,7 @@ export function createJaDict(allowSignup: boolean): LandingDict { { title: "初回起動時に自動検出", description: - "Multica は Antigravity、Claude Code、Codex、Cursor、Copilot、Gemini、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Pi という12種類の対応ツールをスキャンし、見つかったものをそれぞれランタイムとして登録します。", + "Multica は Antigravity、Claude Code、CodeBuddy、Codex、Cursor、Copilot、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Pi、Qoder、Trae CLI という14種類の対応ツールをスキャンし、見つかったものをそれぞれランタイムとして登録します。", }, ], }, @@ -139,7 +139,7 @@ export function createJaDict(allowSignup: boolean): LandingDict { { title: "CLI をインストールしてマシンを接続", description: - "multica setup を実行すると、OAuth の手順を案内し、デーモンを起動し、12種類の対応コーディングツール(Antigravity、Claude Code、Codex、Cursor、Copilot、Gemini、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Pi)をスキャンします。すでにインストール済みのものは、自動的にランタイムとして登録されます。", + "multica setup を実行すると、OAuth の手順を案内し、デーモンを起動し、14種類の対応コーディングツール(Antigravity、Claude Code、CodeBuddy、Codex、Cursor、Copilot、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Pi、Qoder、Trae CLI)をスキャンします。すでにインストール済みのものは、自動的にランタイムとして登録されます。", }, { title: "最初のエージェントを作成", @@ -193,7 +193,7 @@ export function createJaDict(allowSignup: boolean): LandingDict { { question: "Multica はどのコーディングエージェントに対応していますか?", answer: - "Multica は、Antigravity、Claude Code、Codex、Cursor、Copilot、Gemini、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Pi の12種類のコーディングツールに標準対応しています。デーモンが、すでにインストール済みの CLI を自動検出し、それぞれをランタイムとして登録します。オープンソースなので、独自のバックエンドを追加することもできます。", + "Multica は、Antigravity、Claude Code、CodeBuddy、Codex、Cursor、Copilot、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Pi、Qoder、Trae CLI の14種類のコーディングツールに標準対応しています。デーモンが、すでにインストール済みの CLI を自動検出し、それぞれをランタイムとして登録します。オープンソースなので、独自のバックエンドを追加することもできます。", }, { question: "セルフホストが必須ですか、それともクラウド版もありますか?", diff --git a/apps/web/features/landing/i18n/ko.ts b/apps/web/features/landing/i18n/ko.ts index 7fd1b7391dc..e408a0e7a6d 100644 --- a/apps/web/features/landing/i18n/ko.ts +++ b/apps/web/features/landing/i18n/ko.ts @@ -118,7 +118,7 @@ export function createKoDict(allowSignup: boolean): LandingDict { { title: "처음 실행할 때 자동 등록", description: - "Multica는 Claude Code, Codex, Cursor, Copilot, Gemini, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi 등 지원 도구를 스캔해 이미 설치된 것을 런타임으로 자동 등록합니다.", + "Multica는 Antigravity, Claude Code, CodeBuddy, Codex, Cursor, Copilot, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi, Qoder, Trae CLI 등 14개 지원 도구를 스캔해 이미 설치된 것을 런타임으로 자동 등록합니다.", }, ], }, @@ -193,7 +193,7 @@ export function createKoDict(allowSignup: boolean): LandingDict { { question: "Multica는 어떤 코딩 에이전트를 지원하나요?", answer: - "Multica는 Claude Code, Codex, Cursor, Copilot, Gemini, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi 등 11개 코딩 도구를 기본 지원합니다. 데몬이 이미 설치된 CLI를 자동으로 찾아 각각 런타임으로 등록합니다. 오픈소스이므로 직접 백엔드를 추가할 수도 있습니다.", + "Multica는 Antigravity, Claude Code, CodeBuddy, Codex, Cursor, Copilot, Hermes, Kimi, Kiro CLI, OpenCode, OpenClaw, Pi, Qoder, Trae CLI 등 14개 코딩 도구를 기본 지원합니다. 데몬이 이미 설치된 CLI를 자동으로 찾아 각각 런타임으로 등록합니다. 오픈소스이므로 직접 백엔드를 추가할 수도 있습니다.", }, { question: "셀프 호스팅만 가능한가요, 클라우드 버전도 있나요?", diff --git a/apps/web/features/landing/i18n/zh.ts b/apps/web/features/landing/i18n/zh.ts index ab15827deba..4d129dda3f0 100644 --- a/apps/web/features/landing/i18n/zh.ts +++ b/apps/web/features/landing/i18n/zh.ts @@ -101,7 +101,7 @@ export function createZhDict(allowSignup: boolean): LandingDict { label: "\u8fd0\u884c\u65f6", title: "\u4e00\u4e2a\u63a7\u5236\u53f0\u7ba1\u7406\u6240\u6709\u7b97\u529b", description: - "\u672c\u5730\u5b88\u62a4\u8fdb\u7a0b\u548c\u4e91\u7aef\u8fd0\u884c\u65f6\uff0c\u5728\u540c\u4e00\u4e2a\u9762\u677f\u4e2d\u7ba1\u7406\u3002\u5b9e\u65f6\u76d1\u63a7\u5728\u7ebf/\u79bb\u7ebf\u72b6\u6001\u3001\u4f7f\u7528\u91cf\u56fe\u8868\u548c\u6d3b\u52a8\u70ed\u529b\u56fe\u3002\u81ea\u52a8\u68c0\u6d4b\u672c\u673a\u5df2\u5b89\u88c5\u7684 12 \u6b3e\u652f\u6301\u7684 AI \u7f16\u7a0b\u5de5\u5177\u3002", + "\u672c\u5730\u5b88\u62a4\u8fdb\u7a0b\u548c\u4e91\u7aef\u8fd0\u884c\u65f6\uff0c\u5728\u540c\u4e00\u4e2a\u9762\u677f\u4e2d\u7ba1\u7406\u3002\u5b9e\u65f6\u76d1\u63a7\u5728\u7ebf/\u79bb\u7ebf\u72b6\u6001\u3001\u4f7f\u7528\u91cf\u56fe\u8868\u548c\u6d3b\u52a8\u70ed\u529b\u56fe\u3002\u81ea\u52a8\u68c0\u6d4b\u672c\u673a\u5df2\u5b89\u88c5\u7684 14 \u6b3e\u652f\u6301\u7684 AI \u7f16\u7a0b\u5de5\u5177\u3002", cards: [ { title: "\u7edf\u4e00\u8fd0\u884c\u65f6\u9762\u677f", @@ -116,7 +116,7 @@ export function createZhDict(allowSignup: boolean): LandingDict { { title: "\u9996\u6b21\u542f\u52a8\u81ea\u52a8\u6ce8\u518c", description: - "Multica \u626b\u63cf\u672c\u673a\u7684 12 \u6b3e\u652f\u6301\u7684 AI \u7f16\u7a0b\u5de5\u5177\u2014\u2014Antigravity\u3001Claude Code\u3001Codex\u3001Cursor\u3001Copilot\u3001Gemini\u3001Hermes\u3001Kimi\u3001Kiro CLI\u3001OpenCode\u3001OpenClaw\u3001Pi\u2014\u2014\u5e76\u4e3a\u6bcf\u6b3e\u5df2\u5b89\u88c5\u7684\u5de5\u5177\u6ce8\u518c\u4e00\u4e2a\u8fd0\u884c\u65f6\u3002", + "Multica \u626b\u63cf\u672c\u673a\u7684 14 \u6b3e\u652f\u6301\u7684 AI \u7f16\u7a0b\u5de5\u5177\u2014\u2014Antigravity\u3001Claude Code\u3001CodeBuddy\u3001Codex\u3001Cursor\u3001Copilot\u3001Hermes\u3001Kimi\u3001Kiro CLI\u3001OpenCode\u3001OpenClaw\u3001Pi\u3001Qoder\u3001Trae CLI\u2014\u2014\u5e76\u4e3a\u6bcf\u6b3e\u5df2\u5b89\u88c5\u7684\u5de5\u5177\u6ce8\u518c\u4e00\u4e2a\u8fd0\u884c\u65f6\u3002", }, ], }, @@ -136,7 +136,7 @@ export function createZhDict(allowSignup: boolean): LandingDict { { title: "\u5b89\u88c5 CLI \u5e76\u8fde\u63a5\u4f60\u7684\u673a\u5668", description: - "运行 multica setup——它会引导你完成 OAuth 登录、启动守护进程、并扫描 12 款支持的 AI 编程工具(Antigravity、Claude Code、Codex、Cursor、Copilot、Gemini、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Pi)。本机已安装的工具会被自动注册成运行时。", + "运行 multica setup——它会引导你完成 OAuth 登录、启动守护进程、并扫描 14 款支持的 AI 编程工具(Antigravity、Claude Code、CodeBuddy、Codex、Cursor、Copilot、Hermes、Kimi、Kiro CLI、OpenCode、OpenClaw、Pi、Qoder、Trae CLI)。本机已安装的工具会被自动注册成运行时。", }, { title: "\u521b\u5efa\u4f60\u7684\u7b2c\u4e00\u4e2a 智能体", @@ -192,7 +192,7 @@ export function createZhDict(allowSignup: boolean): LandingDict { { question: "Multica \u652f\u6301\u54ea\u4e9b\u7f16\u7801 智能体\uff1f", answer: - "Multica \u5f00\u7bb1\u5373\u7528\u652f\u6301 12 \u6b3e AI \u7f16\u7a0b\u5de5\u5177\uff1aAntigravity\u3001Claude Code\u3001Codex\u3001Cursor\u3001Copilot\u3001Gemini\u3001Hermes\u3001Kimi\u3001Kiro CLI\u3001OpenCode\u3001OpenClaw\u3001Pi\u3002\u5b88\u62a4\u8fdb\u7a0b\u4f1a\u81ea\u52a8\u68c0\u6d4b\u672c\u673a\u5df2\u5b89\u88c5\u7684 CLI \u5e76\u4e3a\u6bcf\u6b3e\u6ce8\u518c\u4e00\u4e2a\u8fd0\u884c\u65f6\u3002\u56e0\u4e3a\u5f00\u6e90\uff0c\u4f60\u4e5f\u53ef\u4ee5\u81ea\u5df1\u6dfb\u52a0\u540e\u7aef\u3002", + "Multica \u5f00\u7bb1\u5373\u7528\u652f\u6301 14 \u6b3e AI \u7f16\u7a0b\u5de5\u5177\uff1aAntigravity\u3001Claude Code\u3001CodeBuddy\u3001Codex\u3001Cursor\u3001Copilot\u3001Hermes\u3001Kimi\u3001Kiro CLI\u3001OpenCode\u3001OpenClaw\u3001Pi\u3001Qoder\u3001Trae CLI\u3002\u5b88\u62a4\u8fdb\u7a0b\u4f1a\u81ea\u52a8\u68c0\u6d4b\u672c\u673a\u5df2\u5b89\u88c5\u7684 CLI \u5e76\u4e3a\u6bcf\u6b3e\u6ce8\u518c\u4e00\u4e2a\u8fd0\u884c\u65f6\u3002\u56e0\u4e3a\u5f00\u6e90\uff0c\u4f60\u4e5f\u53ef\u4ee5\u81ea\u5df1\u6dfb\u52a0\u540e\u7aef\u3002", }, { question: "\u9700\u8981\u81ea\u6258\u7ba1\u5417\uff0c\u8fd8\u662f\u6709\u4e91\u7248\u672c\uff1f", diff --git a/packages/core/types/agent.ts b/packages/core/types/agent.ts index 58937541741..f7499249584 100644 --- a/packages/core/types/agent.ts +++ b/packages/core/types/agent.ts @@ -110,6 +110,7 @@ export const RUNTIME_PROFILE_PROTOCOL_FAMILIES = [ "kiro", "antigravity", "qoder", + "traecli", ] as const; export type RuntimeProtocolFamily = diff --git a/packages/ui/markdown/file-cards.ts b/packages/ui/markdown/file-cards.ts index 35debcc8168..3be14a5b1b8 100644 --- a/packages/ui/markdown/file-cards.ts +++ b/packages/ui/markdown/file-cards.ts @@ -47,9 +47,14 @@ export function isAllowedFileCardHref(href: string): boolean { ) } -/** New syntax: !file[name](url) — unambiguous, no hostname matching needed. */ +/** + * New syntax: !file[name](url) — unambiguous, no hostname matching needed. + * Backslash is excluded from the label char class so "\x" runs can only be + * consumed by \\. — overlapping alternatives backtrack in 2^n ways (ReDoS, + * GitHub #4881). This runs on every comment/description render. + */ const NEW_FILE_CARD_RE = new RegExp( - `^!file\\[((?:\\\\.|[^\\]])*)\\]\\((${FILE_CARD_URL_PATTERN.source})\\)$`, + `^!file\\[((?:\\\\.|[^\\]\\\\])*)\\]\\((${FILE_CARD_URL_PATTERN.source})\\)$`, ) /** Legacy syntax: [name](cdnUrl) on its own line — matched by CDN hostname. */ diff --git a/packages/views/chat/components/chat-input.tsx b/packages/views/chat/components/chat-input.tsx index 43c9f77863a..332b50e34b1 100644 --- a/packages/views/chat/components/chat-input.tsx +++ b/packages/views/chat/components/chat-input.tsx @@ -398,6 +398,7 @@ export function ChatInput({ {uploadEnabled && ( editorRef.current?.uploadFile(file)} /> )} diff --git a/packages/views/editor/extensions/file-card-markdown.test.ts b/packages/views/editor/extensions/file-card-markdown.test.ts index 348b6250be6..17a20c93313 100644 --- a/packages/views/editor/extensions/file-card-markdown.test.ts +++ b/packages/views/editor/extensions/file-card-markdown.test.ts @@ -61,6 +61,20 @@ describe("file-card tokenizer", () => { expect(token).toBeDefined(); expect(token!.attributes.filename).toBe("readme.md"); }); + + it("rejects an unterminated file card with escape-pair runs in linear time", () => { + // Each "\a" pair is ambiguous under (?:\\.|[^\]]) — the pre-fix regex + // enumerates 2^28 backtrack paths (~10s) before failing. The disjoint + // char class must fail fast instead. + const src = `!file[${"\\a".repeat(28)}](/uploads/x`; + + const t0 = performance.now(); + const token = tokenize(src); + const elapsed = performance.now() - t0; + + expect(token).toBeUndefined(); + expect(elapsed).toBeLessThan(100); + }); }); // --------------------------------------------------------------------------- @@ -81,4 +95,17 @@ describe("preprocessFileCards", () => { expect(result).toContain('data-type="fileCard"'); expect(result).toContain('data-filename="readme.md"'); }); + + it("rejects an unterminated file card with escape-pair runs in linear time", () => { + // This path runs on every read-only comment/description render, so a + // backtracking label regex here is reachable without opening the editor. + const input = `!file[${"\\a".repeat(28)}](/uploads/x`; + + const t0 = performance.now(); + const result = preprocessFileCards(input, "cdn.example.com"); + const elapsed = performance.now() - t0; + + expect(result).toBe(input); + expect(elapsed).toBeLessThan(100); + }); }); diff --git a/packages/views/editor/extensions/file-card.tsx b/packages/views/editor/extensions/file-card.tsx index acdf7b398e3..9e554f81b77 100644 --- a/packages/views/editor/extensions/file-card.tsx +++ b/packages/views/editor/extensions/file-card.tsx @@ -21,8 +21,11 @@ import { FILE_CARD_URL_PATTERN } from "@multica/ui/markdown"; import { escapeMarkdownLabel } from "../utils/escape-markdown-label"; import { Attachment } from "../attachment"; +// Backslash is excluded from the label char class so "\x" runs can only be +// consumed by \\. — overlapping alternatives backtrack in 2^n ways (ReDoS, +// GitHub #4881). const FILE_CARD_MARKDOWN_RE = new RegExp( - `^!file\\[((?:\\\\.|[^\\]])*)\\]\\((${FILE_CARD_URL_PATTERN.source})\\)`, + `^!file\\[((?:\\\\.|[^\\]\\\\])*)\\]\\((${FILE_CARD_URL_PATTERN.source})\\)`, ); diff --git a/packages/views/editor/extensions/mention-extension.test.ts b/packages/views/editor/extensions/mention-extension.test.ts index 864655e5a95..478d0942405 100644 --- a/packages/views/editor/extensions/mention-extension.test.ts +++ b/packages/views/editor/extensions/mention-extension.test.ts @@ -14,6 +14,9 @@ const renderMarkdown = BaseMentionExtension.config.renderMarkdown as ( node: { attrs: Record }, ) => string; +const JAVA_STACKTRACE_SOURCE_MARKER = + " at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) \\~\\[spring-webmvc-5.3.39.jar!/:5.3.39\\]\n"; + function tokenize(src: string) { const start = startFn(src); if (start === -1) return undefined; @@ -42,6 +45,23 @@ describe("mention tokenizer", () => { expect(token!.attributes.type).toBe("agent"); }); + it.each(["A\\", "ends\\", "a\\]b", "f(x)", "back\\slash"])( + "round-trips a label containing backslash/parens: %j", + (label) => { + // The linear tokenizer treats "\" as an escape lead, so renderMarkdown + // must escape "\" too — otherwise a trailing "\" swallows the closing "]" + // and the mention fails to parse back (regression guard for the + // de-ambiguation fix). + const md = renderMarkdown({ + attrs: { id: "aaa-bbb", label, type: "member" }, + }); + const token = tokenize(md); + expect(token).toBeDefined(); + expect(token!.attributes.label).toBe(label); + expect(token!.attributes.id).toBe("aaa-bbb"); + }, + ); + it("does not match an ordinary Markdown link before a mention", () => { const src = "Check [docs](https://example.com) - [@User](mention://agent/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa)"; @@ -89,4 +109,43 @@ describe("mention tokenizer", () => { expect(token!.attributes.type).toBe("issue"); expect(token!.attributes.id).toBe("aaa-bbb"); }); + + it("does not start at escaped Java stacktrace source markers before a real mention", () => { + const prefix = JAVA_STACKTRACE_SOURCE_MARKER.repeat(3); + const src = `${prefix}[@Alice](mention://member/aaa-bbb)`; + + const start = startFn(src); + expect(start).toBe(prefix.length); + + const token = tokenizeFn(src.slice(start)); + expect(token).toBeDefined(); + expect(token!.attributes.label).toBe("Alice"); + expect(token!.attributes.type).toBe("member"); + expect(token!.attributes.id).toBe("aaa-bbb"); + }); + + it("keeps escaped Java stacktrace source marker detection fast when no mention exists", () => { + const src = JAVA_STACKTRACE_SOURCE_MARKER.repeat(11); + + const t0 = performance.now(); + const start = startFn(src); + const elapsed = performance.now() - t0; + + expect(start).toBe(-1); + expect(elapsed).toBeLessThan(50); + }); + + it("rejects an unterminated mention with escape-pair runs in linear time", () => { + // Each "\a" pair is ambiguous under (?:\\.|[^\]]) — the pre-fix regex + // enumerates 2^28 backtrack paths (~10s) before failing. The disjoint + // char class must fail fast instead. + const src = `[@${"\\a".repeat(28)}](mention://member/abc`; + + const t0 = performance.now(); + const token = tokenizeFn(src); + const elapsed = performance.now() - t0; + + expect(token).toBeUndefined(); + expect(elapsed).toBeLessThan(100); + }); }); diff --git a/packages/views/editor/extensions/mention-extension.ts b/packages/views/editor/extensions/mention-extension.ts index f285ab03440..40f7519aec1 100644 --- a/packages/views/editor/extensions/mention-extension.ts +++ b/packages/views/editor/extensions/mention-extension.ts @@ -2,6 +2,44 @@ import Mention from "@tiptap/extension-mention"; import { mergeAttributes } from "@tiptap/core"; import { ReactNodeViewRenderer } from "@tiptap/react"; import { MentionView } from "./mention-view"; +import { escapeMarkdownLabel } from "../utils/escape-markdown-label"; + +const MENTION_LINK_MARKER = "](mention://"; + +function isEscaped(text: string, index: number): boolean { + let slashCount = 0; + for (let i = index - 1; i >= 0 && text[i] === "\\"; i--) { + slashCount++; + } + return slashCount % 2 === 1; +} + +function findUnescapedMentionMarker(src: string, from = 0): number { + let marker = src.indexOf(MENTION_LINK_MARKER, from); + + while (marker !== -1) { + if (!isEscaped(src, marker)) return marker; + marker = src.indexOf(MENTION_LINK_MARKER, marker + MENTION_LINK_MARKER.length); + } + + return -1; +} + +function findMentionStart(src: string): number { + let marker = findUnescapedMentionMarker(src); + + while (marker !== -1) { + for (let i = marker - 1; i >= 0; i--) { + const char = src[i]; + if (char === "\n" || char === "\r") break; + if (char === "[" && !isEscaped(src, i)) return i; + } + + marker = findUnescapedMentionMarker(src, marker + MENTION_LINK_MARKER.length); + } + + return -1; +} export const BaseMentionExtension = Mention.extend({ addNodeView() { @@ -39,21 +77,24 @@ export const BaseMentionExtension = Mention.extend({ name: "mention", level: "inline" as const, start(src: string) { - // Accept escaped brackets (\\[ \\]) and non-] chars in the label. - // This prevents matching ordinary Markdown links like [docs](url) - // that appear before a mention on the same line. - return src.search(/\[@?(?:\\.|[^\]])+\]\(mention:\/\//); + // Anchor on Multica's mention href first. Scanning forward from every + // "[" backtracks badly on escaped stacktrace markers like \~\[...\]. + return findMentionStart(src); }, tokenize(src: string) { - // Label accepts escaped chars (\\[ \\]) or any non-] character. - // This prevents the label from crossing a ]( Markdown link boundary - // while still supporting bracket-containing names like "David\[TF\]". + // Label accepts escaped chars (\\[ \\]) or any non-] non-backslash + // character. Excluding backslash from the char class keeps the two + // alternatives disjoint — otherwise "\x" runs backtrack in 2^n ways + // (ReDoS, GitHub #4881) — while still supporting bracket-containing + // names like "David\[TF\]". const match = src.match( - /^\[@?((?:\\.|[^\]])+)\]\(mention:\/\/(\w+)\/([^)]+)\)/, + /^\[@?((?:\\.|[^\]\\])+)\]\(mention:\/\/(\w+)\/([^)]+)\)/, ); if (!match) return undefined; - // Unescape backslash-escaped brackets that renderMarkdown may produce. - const rawLabel = match[1]?.replace(/\\\[/g, "[").replace(/\\\]/g, "]"); + // Reverse escapeMarkdownLabel: unescape \[ \] \\ \( \) that + // renderMarkdown produced. Must mirror the escaped set exactly, or a + // label containing "\" fails to round-trip through the linear tokenizer. + const rawLabel = match[1]?.replace(/\\([[\]\\()])/g, "$1"); return { type: "mention", raw: match[0], @@ -67,9 +108,11 @@ export const BaseMentionExtension = Mention.extend({ renderMarkdown: (node: any) => { const { id, label, type = "member" } = node.attrs || {}; const prefix = type === "issue" || type === "project" ? "" : "@"; - // Escape square brackets in the label so the markdown link syntax - // is not broken when the name contains [ or ] (e.g. "David[TF]"). - const safeLabel = (label ?? id).replace(/\[/g, "\\[").replace(/\]/g, "\\]"); + // Escape [ ] \ ( ) in the label so the markdown link syntax is not broken + // and the label survives the linear tokenizer (which now treats "\" as an + // escape lead, not an ordinary char). Must stay in sync with the unescape + // in tokenize() above. Shared with file-card/slash via escapeMarkdownLabel. + const safeLabel = escapeMarkdownLabel(label ?? id); return `[${prefix}${safeLabel}](mention://${type}/${id})`; }, }); diff --git a/packages/views/editor/extensions/slash-command-extension.test.ts b/packages/views/editor/extensions/slash-command-extension.test.ts index e54660ada5f..a83c5b5d006 100644 --- a/packages/views/editor/extensions/slash-command-extension.test.ts +++ b/packages/views/editor/extensions/slash-command-extension.test.ts @@ -79,6 +79,16 @@ describe("slash command tokenizer", () => { expect(tokenize(md)?.attributes.label).toBe("deploy[prod]"); }); + it.each(["A\\", "ends\\", "a\\]b", "f(x)", "back\\slash"])( + "round-trips a label containing backslash/parens: %j", + (label) => { + // renderMarkdown must escape "\" so a trailing "\" does not swallow the + // closing "]" under the linear tokenizer (regression guard). + const md = renderMarkdown({ attrs: { id: "skill-1", label } }); + expect(tokenize(md)?.attributes.label).toBe(label); + }, + ); + it("does not match ordinary markdown links", () => { expect(tokenize("[docs](https://example.com)")).toBeUndefined(); }); @@ -86,4 +96,29 @@ describe("slash command tokenizer", () => { it("does not match slash action links", () => { expect(tokenize("[/deploy](slash://action/deploy)")).toBeUndefined(); }); + + it("rejects an unterminated slash link with escape-pair runs in linear time", () => { + // Each "\a" pair is ambiguous under (?:\\.|[^\]]) — the pre-fix regex + // enumerates 2^28 backtrack paths (~10s) before failing. The disjoint + // char class must fail fast instead. + const src = `[/${"\\a".repeat(28)}](slash://skill/abc`; + + const t0 = performance.now(); + const token = tokenizeFn(src); + const elapsed = performance.now() - t0; + + expect(token).toBeUndefined(); + expect(elapsed).toBeLessThan(100); + }); + + it("returns -1 fast from start() when escape-pair runs precede no slash link", () => { + const src = `[/${"\\a".repeat(28)}] plain text, no slash link`; + + const t0 = performance.now(); + const start = startFn(src); + const elapsed = performance.now() - t0; + + expect(start).toBe(-1); + expect(elapsed).toBeLessThan(100); + }); }); diff --git a/packages/views/editor/extensions/slash-command-extension.ts b/packages/views/editor/extensions/slash-command-extension.ts index eb6147a6ece..b232d1892af 100644 --- a/packages/views/editor/extensions/slash-command-extension.ts +++ b/packages/views/editor/extensions/slash-command-extension.ts @@ -3,6 +3,7 @@ import { mergeAttributes } from "@tiptap/core"; import { ReactNodeViewRenderer } from "@tiptap/react"; import { SlashCommandView } from "./slash-command-view"; import { formatSlashCommandLabel } from "./slash-command-utils"; +import { escapeMarkdownLabel } from "../utils/escape-markdown-label"; export const SlashCommandExtension = Mention.extend({ name: "slashCommand", @@ -35,14 +36,20 @@ export const SlashCommandExtension = Mention.extend({ name: "slashCommand", level: "inline" as const, start(src: string) { - return src.search(/\[\/(?:\\.|[^\]])+\]\(slash:\/\/skill\//); + // Backslash is excluded from the char class so "\x" runs can only be + // consumed by \\. — overlapping alternatives backtrack in 2^n ways + // (ReDoS, GitHub #4881). + return src.search(/\[\/(?:\\.|[^\]\\])+\]\(slash:\/\/skill\//); }, tokenize(src: string) { const match = src.match( - /^\[\/((?:\\.|[^\]])+)\]\(slash:\/\/skill\/([^)]+)\)/, + /^\[\/((?:\\.|[^\]\\])+)\]\(slash:\/\/skill\/([^)]+)\)/, ); if (!match) return undefined; - const rawLabel = match[1]?.replace(/\\\[/g, "[").replace(/\\\]/g, "]"); + // Reverse escapeMarkdownLabel: unescape \[ \] \\ \( \). Must mirror the + // escaped set exactly, or a label containing "\" fails to round-trip + // through the linear tokenizer. + const rawLabel = match[1]?.replace(/\\([[\]\\()])/g, "$1"); return { type: "slashCommand", raw: match[0], @@ -57,9 +64,9 @@ export const SlashCommandExtension = Mention.extend({ renderMarkdown: (node: any) => { const { id, label } = node.attrs || {}; - const safeLabel = formatSlashCommandLabel(label) - .replace(/\[/g, "\\[") - .replace(/\]/g, "\\]"); + // Escape [ ] \ ( ) so the label survives the linear tokenizer; must stay in + // sync with the unescape in tokenize() above. + const safeLabel = escapeMarkdownLabel(formatSlashCommandLabel(label)); return `[/${safeLabel}](slash://skill/${id})`; }, }); diff --git a/packages/views/issues/actions/__tests__/issue-actions-menu.test.tsx b/packages/views/issues/actions/__tests__/issue-actions-menu.test.tsx index b30a905754e..684386cf766 100644 --- a/packages/views/issues/actions/__tests__/issue-actions-menu.test.tsx +++ b/packages/views/issues/actions/__tests__/issue-actions-menu.test.tsx @@ -163,9 +163,9 @@ describe("IssueActionsDropdown", () => { expect(screen.getByText("Assignee")).toBeInTheDocument(); expect(screen.getByText("Due date")).toBeInTheDocument(); expect(screen.getByText("Copy link")).toBeInTheDocument(); - expect(screen.getByText("More")).toBeInTheDocument(); + expect(screen.getByText("Relations")).toBeInTheDocument(); expect(screen.getByText("Delete issue")).toBeInTheDocument(); - // Relationship actions are hidden inside the "More" submenu by default. + // Relationship actions are hidden inside the "Relations" submenu by default. expect(screen.queryByText("Create sub-issue")).not.toBeInTheDocument(); expect(screen.queryByText("Set parent issue...")).not.toBeInTheDocument(); expect(screen.queryByText("Add sub-issue...")).not.toBeInTheDocument(); @@ -194,7 +194,7 @@ describe("IssueActionsDropdown", () => { expect(await screen.findByText("Test User")).toBeInTheDocument(); }); - it("shows 'Remove parent issue' in the More submenu only when the issue has a parent", async () => { + it("shows 'Remove parent issue' in the Relations submenu only when the issue has a parent", async () => { const childIssue = { ...mockIssue, parent_issue_id: "parent-1" } as Issue; render( wrap( @@ -206,7 +206,7 @@ describe("IssueActionsDropdown", () => { ); fireEvent.click(screen.getByTestId("trigger")); - fireEvent.click(await screen.findByText("More")); + fireEvent.click(await screen.findByText("Relations")); expect(await screen.findByText("Remove parent issue")).toBeInTheDocument(); }); @@ -222,7 +222,7 @@ describe("IssueActionsDropdown", () => { ); fireEvent.click(screen.getByTestId("trigger")); - fireEvent.click(await screen.findByText("More")); + fireEvent.click(await screen.findByText("Relations")); // The sibling "Set parent issue..." proves the submenu opened. expect(await screen.findByText("Set parent issue...")).toBeInTheDocument(); diff --git a/packages/views/issues/actions/issue-actions-menu-items.tsx b/packages/views/issues/actions/issue-actions-menu-items.tsx index 1e6012cdd56..fe7a5396b66 100644 --- a/packages/views/issues/actions/issue-actions-menu-items.tsx +++ b/packages/views/issues/actions/issue-actions-menu-items.tsx @@ -10,7 +10,7 @@ import { CalendarClock, FolderOpen, Link2, - MoreHorizontal, + Network, Pin, PinOff, Plus, @@ -270,12 +270,14 @@ export function IssueActionsMenuItems({ - {/* Relationship actions live under "More" — they're lower-frequency and - will grow (blocks, duplicates, related) as we add more relation types. */} + {/* Relationship actions live under "Relations" — a semantically explicit + label (unlike the old "More") so the first level tells you what the + submenu does. Holds parent/sub-issue links today, and will grow + (blocks, duplicates, related) as we add more relation types. */} - - {t(($) => $.actions.more)} + + {t(($) => $.actions.relations)} diff --git a/packages/views/issues/components/issue-detail.tsx b/packages/views/issues/components/issue-detail.tsx index 20bd8403055..880db5af32f 100644 --- a/packages/views/issues/components/issue-detail.tsx +++ b/packages/views/issues/components/issue-detail.tsx @@ -1985,6 +1985,7 @@ export function IssueDetail({ issueId, onDelete, onDone, defaultSidebarOpen = tr /> descEditorRef.current?.uploadFile(file)} /> diff --git a/packages/views/locales/en/issues.json b/packages/views/locales/en/issues.json index 0bef2071db1..3a441d989b5 100644 --- a/packages/views/locales/en/issues.json +++ b/packages/views/locales/en/issues.json @@ -432,7 +432,7 @@ "unpin_from_sidebar": "Unpin from sidebar", "copy_link": "Copy link", "copy_workdir_path": "Copy local workdir path", - "more": "More", + "relations": "Relations", "create_sub_issue": "Create sub-issue", "set_parent_issue": "Set parent issue...", "remove_parent_issue": "Remove parent issue", diff --git a/packages/views/locales/ja/issues.json b/packages/views/locales/ja/issues.json index 5d6f53a8d5d..30fcaa7dd37 100644 --- a/packages/views/locales/ja/issues.json +++ b/packages/views/locales/ja/issues.json @@ -412,7 +412,7 @@ "unpin_from_sidebar": "サイドバーのピン留めを解除", "copy_link": "リンクをコピー", "copy_workdir_path": "ローカルの作業ディレクトリのパスをコピー", - "more": "その他", + "relations": "関係", "create_sub_issue": "サブイシューを作成", "set_parent_issue": "親イシューを設定...", "remove_parent_issue": "親イシューを解除", diff --git a/packages/views/locales/ko/issues.json b/packages/views/locales/ko/issues.json index 3e38df83bb9..2ccb37d831e 100644 --- a/packages/views/locales/ko/issues.json +++ b/packages/views/locales/ko/issues.json @@ -412,7 +412,7 @@ "unpin_from_sidebar": "사이드바 고정 해제", "copy_link": "링크 복사", "copy_workdir_path": "로컬 작업 디렉터리 경로 복사", - "more": "더 보기", + "relations": "관계", "create_sub_issue": "하위 이슈 만들기", "set_parent_issue": "상위 이슈 설정...", "remove_parent_issue": "상위 이슈 제거", diff --git a/packages/views/locales/zh-Hans/issues.json b/packages/views/locales/zh-Hans/issues.json index b1b853afc0d..afde482ab7d 100644 --- a/packages/views/locales/zh-Hans/issues.json +++ b/packages/views/locales/zh-Hans/issues.json @@ -412,7 +412,7 @@ "unpin_from_sidebar": "从侧边栏取消固定", "copy_link": "复制链接", "copy_workdir_path": "复制本地 workdir 路径", - "more": "更多", + "relations": "关系", "create_sub_issue": "创建子 issue", "set_parent_issue": "设置父 issue...", "remove_parent_issue": "移除父 issue", diff --git a/packages/views/modals/create-issue.tsx b/packages/views/modals/create-issue.tsx index a3e20aba8f4..772806f8915 100644 --- a/packages/views/modals/create-issue.tsx +++ b/packages/views/modals/create-issue.tsx @@ -864,6 +864,7 @@ export function ManualCreatePanel({
descEditorRef.current?.uploadFile(file)} />
diff --git a/packages/views/modals/feedback.tsx b/packages/views/modals/feedback.tsx index 028cf3954f8..7850e416790 100644 --- a/packages/views/modals/feedback.tsx +++ b/packages/views/modals/feedback.tsx @@ -164,6 +164,7 @@ export function FeedbackModal({
editorRef.current?.uploadFile(file)} />