Team Projects 📋
Multi-agent project management for OpenClaw. Run agent teams that plan, assign, execute, and track work together. Includes a Control UI plugin tab for visual project tracking and a right-edge Team Chat drawer for live agent activity.
Overview
This skill enables a coordinator agent to manage projects across multiple specialist agents:
CODEBLOCK0
Each agent works independently with their own tools and workspace. The coordinator tracks progress, manages dependencies, and advances the project.
UI Components
1. Projects Tab (sidebar)
A full project dashboard registered as a plugin tab in the Control sidebar under the "Control" group. Shows project cards, task boards with phase sections, team overview, and progress stats.
2. Team Chat Drawer (right edge)
A slide-out panel accessible from a vertical "Team" tab fixed to the right edge of the screen. Shows:
- - Live agent activity feed (sub-agent sessions, messages)
- Project progress bar
- Task overview (collapsible)
- Quick message input to send commands
Installation
Step 1: Config Prerequisites
Add to openclaw.json:
CODEBLOCK1
Add subagents.allowAgents to the coordinator agent's list entry (NOT on agents.defaults):
CODEBLOCK2
⚠️ Critical: allowAgents must be on the agent's own entry in agents.list. Setting it on agents.defaults.subagents does NOT work. The code reads resolveAgentConfig(cfg, requesterAgentId)?.subagents?.allowAgents which resolves the per-agent config, not defaults.
Step 2: Gateway Plugin Installation (for Projects tab)
The Projects tab requires installing a gateway plugin. This involves 4 registration points in the OpenClaw source:
2a. Plugin SDK entry
Create src/plugin-sdk/team-projects.ts:
CODEBLOCK3
2b. Plugin extension
Create extensions/team-projects/openclaw.plugin.json:
CODEBLOCK4
Create extensions/team-projects/index.ts — see gateway-plugin/index.ts.
2c. Register in build pipeline (4 files)
tsdown.config.ts — Add "team-projects" to the pluginSdkEntrypoints array.
src/plugins/loader.ts — Add to the pluginSdkScopedAliasEntries array:
CODEBLOCK5
scripts/write-plugin-sdk-entry-dts.ts — Add "team-projects" to the entrypoints array.
package.json — Add to the exports map:
CODEBLOCK6
2d. Enable in config
CODEBLOCK7
Step 3: UI View Installation
3a. Team Projects view
Copy gateway-plugin/team-projects-view.ts to ui/src/ui/views/team-projects.ts.
3b. Team Chat Drawer
Copy gateway-plugin/team-chat-drawer.ts to ui/src/ui/views/team-chat-drawer.ts.
⚠️ Critical: No Shadow DOM — The OpenClaw app uses createRenderRoot() { return this; }, so Lit css tagged templates are NOT applied. All styles must be embedded as inline <style> tags in the rendered HTML. The team-chat-drawer uses an inline <style> block inside renderTeamChatEdgeTab() so styles are present even when the drawer is closed.
3c. Wire into app-render.ts
See gateway-plugin/app-render-patch.ts for the integration points:
- 1. Import
renderTeamChatDrawer and renderTeamChatEdgeTab from INLINECODE31 - Before
</main>, add INLINECODE33 - After
</main>, add the edge tab and drawer renders - Add the
renderPluginTabContent() function
3d. Wire into app-gateway.ts
See gateway-plugin/app-gateway-patch.ts for the integration points:
- 1. Import
uiPluginRegistry from INLINECODE38 - Import
renderTeamProjects from INLINECODE40 - In
onHello, after applySnapshot(), call INLINECODE43 - Add the
registerTeamProjectsPlugin() function
3e. Add view state fields
In ui/src/ui/app-view-state.ts, add to AppViewState:
CODEBLOCK8
In ui/src/ui/app-settings.ts, add teamChatOpen?: boolean to SettingsHost type, and add defensive cleanup in applyTabSelection():
CODEBLOCK9
Step 4: Build & Restart
CODEBLOCK10
Hard-refresh the browser (Ctrl+Shift+R) to load the new UI assets.
Usage
Creating a Project
Tell the coordinator agent what you want to build. It will:
- 1. Create the project with appropriate phases
- Break down work into tasks
- Assign tasks to agents based on capabilities
- Dispatch ready tasks
Example prompt:
"Create a team project to redesign our company website. @researcher should analyze competitors, @writer should draft copy, and @coder should build it in React. Priority: launch in 2 weeks."
The Coordinator's Workflow
The coordinator uses CLI tools to manage the project board:
CODEBLOCK11
Dispatching Tasks
The orchestrator identifies ready tasks (dependencies met, not yet dispatched):
CODEBLOCK12
Then dispatch via OpenClaw's native sessions_spawn:
CODEBLOCK13
Agent Communication
Agents can communicate using @-mentions:
- - @agentId — Direct message to an agent (routed via
sessions_send) - @all / @team — Broadcast to all project agents
- #taskid — Reference a task
- TASKCOMPLETE: #taskid — Signal task completion
- TASKBLOCKED: #task_id — Signal a blocker
Tracking Progress
CODEBLOCK14
Updating Tasks
CODEBLOCK15
Data Model
Project
CODEBLOCK16
Storage
- - Projects: INLINECODE53
- Chat logs: INLINECODE54
- Orchestrator state: INLINECODE55
Architecture
How It Works
CODEBLOCK17
Key Design Decisions
- 1. Push-based completion — No polling. OpenClaw's
subagent-announce system delivers completion events automatically. - Dependency gates — The orchestrator only dispatches tasks whose
dependsOn are all done. - Tool isolation — Each agent gets only the tools they need. A researcher can't exec arbitrary code; a coder can't send messages to external channels.
- File-based persistence — Simple JSON storage. No database required. Works on any OpenClaw instance.
- CLI-first — All operations available via CLI. The UI is optional.
- Agent-native — Uses OpenClaw's existing
sessions_spawn, sessions_send, and agents_list tools. No custom transport. - Plugin architecture — Projects tab registered via OpenClaw's
uiPluginRegistry (client-side). Team Chat drawer uses inline <style> tags for CSS (no Shadow DOM). - Client-side plugin registration — Since the gateway plugin view registration pipeline isn't fully wired end-to-end, the Projects tab is registered client-side in
app-gateway.ts during onHello. This is reliable and avoids depending on gateway-side plugin infrastructure.
Plugin Registration Points (4 required for gateway plugin)
When adding a new gateway plugin to OpenClaw, you must register it in 4 places:
| File | What to add |
|---|
| INLINECODE66 | SDK type entry (exports OpenClawPluginApi etc.) |
| INLINECODE68 → INLINECODE69 |
Jiti alias so runtime can resolve
openclaw/plugin-sdk/<id> |
|
tsdown.config.ts →
pluginSdkEntrypoints | Build entry so
dist/plugin-sdk/<id>.js gets generated |
|
scripts/write-plugin-sdk-entry-dts.ts | DTS entry generator |
|
package.json → exports →
./plugin-sdk/<id> | Package subpath export |
Missing any one of these causes Cannot find module errors at runtime.
CSS Gotcha: No Shadow DOM
OpenClaw's OpenClawApp uses createRenderRoot() { return this; } — it renders directly to the DOM without Shadow DOM. This means:
- - Lit
css tagged templates (used with static styles) are never applied - All styles must be embedded as
<style> tags in the HTML returned by render functions - The
teamChatDrawerStyles export was originally dead code until fixed to use inline styles
Coordinator Prompt Template
The coordinator agent should include templates/coordinator-prompt.md in its system prompt (or SOUL.md). This gives it the commands and workflow for managing projects.
Worker agents should include templates/worker-prompt.md for task completion protocols.
Known Issues & Gotchas
allowAgents must be per-agent
Setting
agents.defaults.subagents.allowAgents: ["*"] does NOT work. The code at
agents-list-tool.ts:49 reads:
const allowAgents = resolveAgentConfig(cfg, requesterAgentId)?.subagents?.allowAgents ?? [];
This resolves the per-agent config entry, not defaults. You must add it to the agent's entry in
agents.list.
dependsOn normalization
The CLI passes
--dependsOn task_abc as a string, not an array. The project store and orchestrator both normalize with
Array.isArray() checks. If you create tasks programmatically, always pass an array.
UI requires hard refresh
After rebuilding the UI (
pnpm ui:build) and restarting the gateway, browsers may cache the old JS bundle. Always hard-refresh (Ctrl+Shift+R) after UI changes.
Icon availability
The icon used for the Projects tab must exist in
ui/src/ui/icons.ts. Available icons include:
fileText,
folder,
barChart,
zap,
brain,
settings,
plug, etc. Custom icon names like
clipboard-list won't work — use
fileText instead.
Limitations
- - No real-time UI sync — The UI reads from JSON files; updates appear on refresh, not live push.
- No native gateway RPC — The project board is managed via CLI tools, not gateway RPC methods (yet).
- Single coordinator — One agent coordinates per project (though you could have different coordinators for different projects).
- No cost tracking — Task cost/token tracking depends on OpenClaw's session usage system.
- Client-side plugin registration — The gateway-side plugin view registration pipeline (
registerView → hello snapshot → loadFromGateway) is scaffolded but not fully wired. Plugin tabs are registered client-side instead.
Future Enhancements
- - [ ] Gateway RPC plugin for live UI updates via WebSocket
- [ ] Kanban drag-and-drop in the sidebar
- [ ] Gantt chart / timeline view
- [ ] Automated task creation from GitHub issues
- [ ] Cost/token budget per task
- [ ] Agent capability auto-detection from tools config
- [ ] Cron-based project health checks
- [ ] Gateway-side plugin view registration (when pipeline is complete)
Files
CODEBLOCK19
团队项目 📋
面向OpenClaw的多智能体项目管理。运行智能体团队,共同规划、分配、执行和跟踪工作。包含一个控制UI插件标签页用于可视化项目跟踪,以及一个右侧团队聊天抽屉用于实时智能体活动。
概述
该技能使协调智能体能够跨多个专业智能体管理项目:
用户 → 协调智能体 (Koda) → 通过 sessions_spawn 分配任务
├── @研究员 → 网络研究、数据分析
├── @程序员 → 编写代码、构建功能
├── @写手 → 文案、文档、内容
└── ... 任何已配置的智能体
每个智能体使用自己的工具和工作空间独立工作。协调智能体跟踪进度、管理依赖关系并推进项目。
UI组件
1. 项目标签页(侧边栏)
一个完整的项目仪表板,作为插件标签页注册在控制侧边栏的控制组下。显示项目卡片、带阶段分区的任务面板、团队概览和进度统计。
2. 团队聊天抽屉(右侧边缘)
一个可滑出的面板,通过固定在屏幕右侧边缘的垂直团队标签页访问。显示:
- - 实时智能体活动流(子智能体会话、消息)
- 项目进度条
- 任务概览(可折叠)
- 快速消息输入以发送命令
安装
步骤1:配置前提条件
添加到 openclaw.json:
json
{
tools: {
agentToAgent: {
enabled: true,
allow: [*]
}
}
}
将 subagents.allowAgents 添加到协调智能体的列表条目中(不是 agents.defaults 上):
json
{
agents: {
list: [
{
id: main,
default: true,
name: Koda,
subagents: {
allowAgents: [*]
}
}
]
}
}
⚠️ 关键: allowAgents 必须位于 agents.list 中智能体自身的条目上。将其设置在 agents.defaults.subagents 上不起作用。代码读取 resolveAgentConfig(cfg, requesterAgentId)?.subagents?.allowAgents,它解析的是每个智能体的配置,而不是默认配置。
步骤2:网关插件安装(用于项目标签页)
项目标签页需要安装一个网关插件。这涉及OpenClaw源代码中的4个注册点:
2a. 插件SDK入口
创建 src/plugin-sdk/team-projects.ts:
typescript
export { emptyPluginConfigSchema } from ../plugins/config-schema.js;
export type {
OpenClawPluginApi,
PluginViewRegistration,
} from ../plugins/types.js;
2b. 插件扩展
创建 extensions/team-projects/openclaw.plugin.json:
json
{
id: team-projects,
configSchema: {
type: object,
additionalProperties: false,
properties: {}
}
}
创建 extensions/team-projects/index.ts — 参见 gateway-plugin/index.ts。
2c. 在构建管道中注册(4个文件)
tsdown.config.ts — 将 team-projects 添加到 pluginSdkEntrypoints 数组中。
src/plugins/loader.ts — 添加到 pluginSdkScopedAliasEntries 数组中:
typescript
{
subpath: team-projects,
srcFile: team-projects.ts,
distFile: team-projects.js,
},
scripts/write-plugin-sdk-entry-dts.ts — 将 team-projects 添加到入口点数组中。
package.json — 添加到导出映射中:
json
./plugin-sdk/team-projects: {
types: ./dist/plugin-sdk/team-projects.d.ts,
default: ./dist/plugin-sdk/team-projects.js
},
2d. 在配置中启用
json
{
plugins: {
allow: [telegram, discord, team-projects],
entries: {
team-projects: {
enabled: true
}
}
}
}
步骤3:UI视图安装
3a. 团队项目视图
将 gateway-plugin/team-projects-view.ts 复制到 ui/src/ui/views/team-projects.ts。
3b. 团队聊天抽屉
将 gateway-plugin/team-chat-drawer.ts 复制到 ui/src/ui/views/team-chat-drawer.ts。
⚠️ 关键:无Shadow DOM — OpenClaw应用使用 createRenderRoot() { return this; },因此Lit的 css 标记模板不会被应用。所有样式必须作为内联