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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .agents/skills/codex-cli-reference/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Use this when you need to:
- `--sandbox, -s <mode>`: set command sandbox (`read-only`, `workspace-write`, `danger-full-access`).
- `--ask-for-approval, -a <policy>`: control approval behavior (`untrusted`, `on-failure`, `on-request`, `never`).
- `--full-auto`: shorthand for lower-friction automation (`on-request` + `workspace-write`).
- `--dangerously-bypass-approvals-and-sandbox`: current explicit unattended `exec` flag; prefer it over the hidden legacy `--yolo` alias when Ode already provides the external isolation boundary.
- `-c, --config key=value`: one-off config override for the invocation.

## Common examples
Expand Down
3 changes: 3 additions & 0 deletions .agents/skills/goose-cli-skill/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ description: Reference guide for integrating and operating Goose CLI in Ode, foc
Use this when adding or debugging Ode's `goose` provider, especially command construction, session resume behavior, and stream-event parsing for live status.

## Recommended invocation pattern
- Preferred Ode integration: `goose acp`, using ACP over stdio.
- Non-interactive run: `goose run --output-format stream-json --name <sessionName> -t <prompt>`
- Resume existing run session: `goose run --output-format stream-json --name <sessionName> --resume -t <prompt>`
- Open Goose web UI session: `goose web --open`
Expand All @@ -31,6 +32,8 @@ Use this when adding or debugging Ode's `goose` provider, especially command con
- Use `stream-json` output so live status can consume incremental events.
- Session IDs can be represented by a stable session name in Ode (`--name`) and resumed with `--resume`.
- Goose stores sessions in local storage (SQLite-backed in recent versions), so CLI and Desktop/Web can share context.
- Prefer ACP for native session IDs, cancellation, attachments, and structured updates. Use `goose run --output-format stream-json` only as the compatibility fallback.
- Route ACP `session/request_permission` back to the originating user and wait for an explicit option; cancellation must resolve a pending permission as cancelled.

## Sources
- https://block.github.io/goose/docs/guides/sessions/session-management
Expand Down
8 changes: 5 additions & 3 deletions .agents/skills/kilo-cli-skill/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ description: Reference guide for integrating and operating Kilo CLI in Ode, focu
Use this when implementing or debugging the `kilo` provider in Ode, especially CLI command construction, session behavior, and JSON output handling.

## Recommended invocation pattern for Ode
- Base command: `kilo run --auto --format json --session <id> "<prompt>"`
- Preferred structured transport: `kilo acp` from the target working directory.
- Compatibility fallback: `kilo run --format json --session <id> "<prompt>"`
- Add `--agent <agent>` when a plan/build agent is requested.
- Add `--model <provider/model>` when a model override is configured.
- Run with `cwd` set to the target workspace path.

## Key CLI references
- Start TUI: `kilo` (or `kilo [project]`)
- Non-interactive: `kilo run [message..]` with `--auto` and `--format json`
- Non-interactive: `kilo run [message..]` with `--format json`; `--auto` grants all permissions and should not be added on an unsandboxed developer machine.
- Server mode: `kilo serve`, attach with `kilo attach <url>`
- Auth: `kilo auth`, provider setup via `/connect` in the TUI
- Models: `kilo models [provider]`
Expand All @@ -37,7 +38,8 @@ Use this when implementing or debugging the `kilo` provider in Ode, especially C
## Integration notes for Ode
- Kilo does not require channel-level model selection in Ode config.
- Emit `session.status` and `message.part.updated` events for live status.
- Prefer CLI mode unless event fidelity requires server attach.
- Prefer ACP for session lifecycle, content blocks, and structured tool/plan/message updates. Keep `kilo run --format json` as the compatibility fallback when ACP setup fails.
- ACP `session/request_permission` must be surfaced to the originating user and answered explicitly; never select an allow option automatically.

## Source
- https://kilo.ai/docs/code-with-ai/platforms/cli
5 changes: 4 additions & 1 deletion .agents/skills/kimi-cli-skill/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@ Use this when adding or debugging the `kimi` provider in Ode, especially command
Ask clarifying questions if you need model/auth-specific setup beyond CLI invocation.

## Recommended invocation pattern
- Preferred Ode integration: `kimi acp`, using ACP `session/new`, `session/load`, `session/prompt`, `session/update`, and `session/cancel` over stdio.
- New session: `kimi --output-format stream-json -p <prompt>` from the target working directory.
- Resume session: `kimi --output-format stream-json --session <session_...> -p <prompt>`.
- Kimi Code 0.13.x does not support the older `--print` or `--work-dir` flags.
- Kimi Code 0.31.x continues to use prompt mode and does not support the older `--print` or `--work-dir` flags.
- The CLI stores sessions in `~/.kimi-code/session_index.jsonl`; new session IDs use the `session_...` shape.

## Integration notes for Ode
- Prefer ACP for structured session lifecycle, plan/tool/message updates, and image/resource prompt blocks. Fall back to the JSONL prompt mode only when ACP initialization or session setup fails.
- ACP `session/request_permission` is bidirectional and must pause for the originating user; do not silently select `allow_once` or `allow_always`.
- Treat prompt mode as the automation surface; add `--auto`/`--yolo` only when the target CLI version requires it for tool approval.
- Parse stdout as JSONL message stream (`assistant` and optional `tool` messages).
- Keep provider model input hidden in UI unless explicitly needed.
Expand Down
39 changes: 0 additions & 39 deletions .agents/skills/kiro-cli-skill/SKILL.md

This file was deleted.

4 changes: 4 additions & 0 deletions .agents/skills/opencode-developer-researcher/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ description: Research OpenCode server and SDK documentation for debugging or int
- Review OpenCode server docs for connection, configuration, and debugging guidance.
- Read SDK docs for integration patterns, APIs, and workflow updates.
- Summarize relevant findings with links and practical troubleshooting steps.
- For Ode attachment input, map local images/resources/files to OpenCode SDK `FilePart` values with a `file://` URL, MIME type, and filename; keep text as `TextPart`.
- Consume `/global/event` as a mixed transport: ordinary events expose `payload.type` and `payload.properties`, while synchronized child-session updates can arrive as `payload.type = "sync"` with the real event nested in `payload.syncEvent.type` and `payload.syncEvent.data`.
- Treat sessions created with `parentID` as part of the root run. Task/subagent tool metadata can identify the child `sessionId`; normalize those events to the root run while preserving the source child session and title for status rendering.
- Use `/session/status` together with meaningful-event timestamps for idle detection. Do not infer completion from an empty status map alone, and do not time out while a question or permission interaction is pending.

## When to use me
Use this when you need to diagnose issues communicating with OpenCode servers or implement SDK features.
Expand Down
7 changes: 6 additions & 1 deletion .agents/skills/qwen-code-skill/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,18 @@ description: Reference guide for integrating and operating Qwen Code CLI in Ode,
Use this when adding or debugging Ode's `qwen` provider, especially command construction, parsing streamed JSON events, and live status compatibility.

## Recommended invocation pattern
- Base command: `qwen --output-format stream-json --include-partial-messages --yolo -p <prompt>`
- Base command: `qwen --output-format stream-json --include-partial-messages --approval-mode auto --max-wall-time 10m --max-tool-calls 100 -p <prompt>`
- Resume existing context: append `--resume <sessionId>` (or `--continue` for latest project session)
- Text-only one-shot output: omit `--output-format` and use default text mode

## Integration notes for Ode
- The locally validated Qwen Code 0.21.3 command surface does not expose an ACP entry point, so Ode must keep using `stream-json` for this version instead of advertising ACP support.
- Qwen headless supports `text`, `json`, and `stream-json`; use `stream-json` for live status updates.
- `--include-partial-messages` emits incremental events (for example `content_block_delta`) that map well to status rendering.
- Qwen Code 0.21.x still accepts `--include-partial-messages` and `--approval-mode` even when a bare `qwen --help` omits them from its abbreviated option list.
- Prefer `--approval-mode auto` for local headless automation: current Qwen uses a fail-closed classifier for risky operations while allowing low-risk work to proceed. Do not use `yolo` on an unsandboxed developer machine.
- Bound headless runs with `--max-wall-time` and `--max-tool-calls`; Qwen 0.21.x emits distinct structured budget failures.
- Use `--approval-mode plan` for read-only planning.
- Session history is project-scoped under `~/.qwen/projects/<sanitized-cwd>/chats`; restoring a session recovers history and tool context.
- Keep channel model selection disabled for Qwen in Ode UI; provider logic does not require per-channel model overrides.

Expand Down
11 changes: 7 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ ODE is a project that connects many AI coding agents with IM message apps. When
- Config: `packages/config/` (Zod env/config validation, local `ode.json`, channel settings)
- Core orchestration: `packages/core/` (daemon, kernel, runtime, tasks, cron, Web/API server)
- IM adapters: `packages/ims/` (`slack`, `discord`, `lark`, shared inbound/delivery/runtime helpers)
- Agent adapters: `packages/agents/` (`opencode`, `claude`, `codex`, `kimi`, `kiro`, `kilo`, `qwen`, `goose`, `gemini`, `pi`, `openhands`, `codebuddy`, `crush`)
- Agent adapters: `packages/agents/` (`opencode`, `claude`, `codex`, `kimi`, `kilo`, `qwen`, `goose`, `pi`, `openhands`, `codebuddy`, `crush`)
- Shared utilities: `packages/shared/` and `packages/utils/`
- Web UI: `packages/web-ui/` (settings, sessions, local config views)
- Live status harness: `packages/live-status-harness/`
Expand All @@ -20,6 +20,7 @@ ODE is a project that connects many AI coding agents with IM message apps. When
- Sessions live under `~/.config/ode/sessions/`.
- Channel details include agent provider, model when supported, working directory, base branch, and system message.
- Bot replies and status updates should stay in the originating IM thread.
- Runtime status and final replies use ordinary Markdown text messages on Slack, Discord, and Lark; do not reintroduce Slack AI Card/streaming message formatting.
- Status updates include phases, tool progress, elapsed time, and are preserved as an operation record.
- Slack workspaces default to AI card status messages; use the workspace Status Messages setting to switch a Slack workspace back to legacy message updates.
- SDK/CLI event loops handle permission or question flows where supported; OpenCode and Claude question replies are wired through the adapter.
Expand All @@ -29,9 +30,11 @@ ODE is a project that connects many AI coding agents with IM message apps. When

## Supported Integrations
- IM apps: Slack, Discord, Lark/Feishu.
- Agent providers: `opencode`, `claude`/`claudecode`, `codex`, `kimi`, `kiro`, `kilo`, `qwen`, `goose`, `gemini`, `pi`, `openhands`, `codebuddy`, `crush`.
- Agent providers: `opencode`, `claude`/`claudecode`, `codex`, `kimi`, `kilo`, `qwen`, `goose`, `pi`, `openhands`, `codebuddy`, `crush`.
- Model selection is provider-specific. OpenCode, Codex, Kilo, Pi, OpenHands, CodeBuddy, and Crush expose configured model lists in the Web UI.
- Coding agent credentials/configuration belong to each agent's own CLI/config files; Ode should call the CLI and should not become the secret/config owner for those tools.
- Structured transports are preferred where locally supported: OpenCode SDK, Claude Agent SDK streaming input, Codex App Server, and ACP for Kimi/Kilo/Goose. Keep a CLI fallback when protocol startup is unavailable.
- Inbound images/files are downloaded by the IM adapter into Ode's private attachment store and passed as `AgentInputPart`; never pass expiring IM URLs or IM authorization headers to agent providers.

## Commands
- Install deps: `bun run setup`
Expand Down Expand Up @@ -98,14 +101,14 @@ ODE is a project that connects many AI coding agents with IM message apps. When
- Prefer `Bun.file` over `node:fs` for new file IO where practical, while respecting existing local style.

## Skills
- Available repo skills include `agent-browser`, `slack-developer-researcher`, `opencode-developer-researcher`, `codex-cli-reference`, `qwen-code-skill`, `goose-cli-skill`, `kimi-cli-skill`, `kiro-cli-skill`, and `kilo-cli-skill`.
- Available repo skills include `agent-browser`, `slack-developer-researcher`, `opencode-developer-researcher`, `codex-cli-reference`, `qwen-code-skill`, `goose-cli-skill`, `kimi-cli-skill`, and `kilo-cli-skill`.
- Use `agent-browser` for browser automation tasks.
- Use the matching CLI skill when changing or debugging an agent provider integration.
- If you discover new Slack/OpenCode/CLI-agent updates during development, update the matching skill doc under `.agents/skills/` (mirrored via `.claude/skills/` when present).

## Agent Live Status Workflow
- Use `packages/live-status-harness/fixed-prompt.md` as the baseline stream-capture prompt.
- Capture stream events with `bun run live-status:capture --provider <opencode|claudecode|codex|kimi|kiro|kilo|qwen|goose|gemini|pi|openhands|codebuddy|crush>`.
- Capture stream events with `bun run live-status:capture --provider <opencode|claudecode|codex|kimi|kilo|qwen|goose|pi|openhands|codebuddy|crush>`.
- Store raw ordered events in Redis under the harness keyspace (`harness:live_status:*`).
- Render status outputs from captured events with `bun run live-status:render --run-id <runId>`.
- Generate combined reports with `bun run live-status:report`.
Expand Down
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@ Ode is a agent tool that bridges your coding agents (OpenCode, Claude Code, Code
* 🖇️ **Map coding sessions 1 - 1 to chat threads**, and use worktree to get isolated, parallel coding is so easy.
* 👬 Anyone in the channel can join coding without any extra setup, **pay one account for all team members**.
* 📝 **Message live message updates**, you don't wait for response without any information, you can monitor from real-time text updates.
* 📎 **Image and file input**, attach screenshots, documents, or source files in Slack, Discord, or Lark and Ode forwards structured content to the coding agent.
* 🐙 **Per user git config**, who start the thread becomes corresponding git commit author. (Run @bot /setting)

Ode prefers each agent's structured integration surface: Codex App Server, Claude Agent SDK streaming input, OpenCode SDK, and ACP for Kimi, Kilo, and Goose. Other agents continue to use their supported streaming CLI format. Agent credentials remain owned by the local CLI; Ode does not store API keys.

## Compare with OpenClaw

* OpenClaw is greate, but Ode utilize **thread based** messaging to organize things better, making it easy to port sessions in coding agents directly to chat apps. Just work on one thing in one thread.
Expand Down Expand Up @@ -56,11 +59,9 @@ Settings UI can be accessible via http://127.0.0.1:9293 or use `/setting` comman
| CodeBuddy | <img src="https://img.shields.io/badge/CodeBuddy-111111?style=for-the-badge&logo=codebuddy&logoColor=white" alt="CodeBuddy logo" /> | [codebuddy.ai/docs/cli](https://www.codebuddy.ai/docs/cli/overview) |
| Codex | <img src="https://img.shields.io/badge/Codex-111111?style=for-the-badge&logo=openai&logoColor=white" alt="Codex logo" /> | [github.com/openai/codex](https://github.com/openai/codex) |
| Crush | <img src="https://img.shields.io/badge/Crush-111111?style=for-the-badge&logo=charm&logoColor=white" alt="Crush logo" /> | [github.com/charmbracelet/crush](https://github.com/charmbracelet/crush) |
| Gemini CLI | <img src="https://img.shields.io/badge/Gemini_CLI-111111?style=for-the-badge&logo=google&logoColor=white" alt="Gemini CLI logo" /> | [github.com/google-gemini/gemini-cli](https://github.com/google-gemini/gemini-cli) |
| Goose CLI | <img src="https://img.shields.io/badge/Goose_CLI-111111?style=for-the-badge&logo=go&logoColor=white" alt="Goose CLI logo" /> | [block.github.io/goose](https://block.github.io/goose/) |
| Kimi Code | <img src="https://img.shields.io/badge/Kimi_Code-111111?style=for-the-badge&logo=moonrepo&logoColor=white" alt="Kimi Code logo" /> | [moonshotai.github.io/kimi-cli](https://moonshotai.github.io/kimi-cli/) |
| Kilo Code | <img src="https://img.shields.io/badge/Kilo_Code-111111?style=for-the-badge&logo=codeium&logoColor=white" alt="Kilo Code logo" /> | [kilo.ai/docs/code-with-ai/platforms/cli](https://kilo.ai/docs/code-with-ai/platforms/cli) |
| Kiro CLI | <img src="https://img.shields.io/badge/Kiro_CLI-111111?style=for-the-badge&logo=amazonec2&logoColor=white" alt="Kiro CLI logo" /> | [kiro.dev/docs/cli/reference](https://kiro.dev/docs/cli/reference/cli-commands/) |
| OpenCode | <img src="https://img.shields.io/badge/OpenCode-111111?style=for-the-badge&logo=opencollective&logoColor=white" alt="OpenCode logo" /> | [opencode.ai](https://opencode.ai/) |
| OpenHands | <img src="https://img.shields.io/badge/OpenHands-111111?style=for-the-badge&logo=openai&logoColor=white" alt="OpenHands logo" /> | [docs.openhands.dev](https://docs.openhands.dev/) |
| Pi | <img src="https://img.shields.io/badge/Pi-111111?style=for-the-badge&logo=pi&logoColor=white" alt="Pi logo" /> | [github.com/earendil-works/pi](https://github.com/earendil-works/pi) |
Expand All @@ -78,8 +79,8 @@ Settings UI can be accessible via http://127.0.0.1:9293 or use `/setting` comman

1. Invite the bot to a channel.
2. Run `@bot /setting`, select channel setting, choose your coding cli (opencode also can choose model) and working directory.
3. @ your bot with the prompt you want.
3. The bot will process your message with the coding agent.
3. @ your bot with the prompt you want, optionally with image or file attachments.
4. The bot will process your message with the coding agent.

## Worktrees

Expand Down
Loading
Loading