Multi-agent project management with task boards, @-mention routing, WBS, and orchestrated team collaboration. Includes a Control UI plugin tab with project d...
---
name: team-projects
description: "Multi-agent project management with task boards, @-mention routing, WBS, and orchestrated team collaboration. Includes a Control UI plugin tab with project dashboard and a right-edge Team Chat drawer for live activity. Enables a coordinator agent to plan projects, break down work into phases and tasks, assign to specialist agents, dispatch via sessions_spawn, and track progress to completion. Use when: (1) managing work across multiple OpenClaw agents, (2) creating project plans with work breakdown structures, (3) assigning and tracking tasks across agents, (4) coordinating multi-agent workflows with dependencies, (5) running team-based projects with progress tracking."
metadata:
{
"openclaw": {
"emoji": "๐",
"requires": {
"config": {
"tools.agentToAgent.enabled": true,
"agents.list": "at least 2 agents configured"
}
}
}
}
---
# 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:
```
User โ Coordinator (Koda) โ dispatches tasks via sessions_spawn
โโโ @researcher โ web research, data analysis
โโโ @coder โ writing code, building features
โโโ @writer โ copy, documentation, content
โโโ ... any configured agent
```
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`:
```json
{
"tools": {
"agentToAgent": {
"enabled": true,
"allow": ["*"]
}
}
}
```
Add `subagents.allowAgents` to the **coordinator agent's list entry** (NOT on `agents.defaults`):
```json
{
"agents": {
"list": [
{
"id": "main",
"default": true,
"name": "Koda",
"subagents": {
"allowAgents": ["*"]
}
}
]
}
}
```
> โ ๏ธ **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`:
```typescript
export { emptyPluginConfigSchema } from "../plugins/config-schema.js";
export type {
OpenClawPluginApi,
PluginViewRegistration,
} from "../plugins/types.js";
```
#### 2b. Plugin extension
Create `extensions/team-projects/openclaw.plugin.json`:
```json
{
"id": "team-projects",
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {}
}
}
```
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:
```typescript
{
subpath: "team-projects",
srcFile: "team-projects.ts",
distFile: "team-projects.js",
},
```
**`scripts/write-plugin-sdk-entry-dts.ts`** โ Add `"team-projects"` to the entrypoints array.
**`package.json`** โ Add to the exports map:
```json
"./plugin-sdk/team-projects": {
"types": "./dist/plugin-sdk/team-projects.d.ts",
"default": "./dist/plugin-sdk/team-projects.js"
},
```
#### 2d. Enable in config
```json
{
"plugins": {
"allow": ["telegram", "discord", "team-projects"],
"entries": {
"team-projects": {
"enabled": true
}
}
}
}
```
### 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 `./views/team-chat-drawer.ts`
2. Before `</main>`, add `${renderPluginTabContent(state)}`
3. After `</main>`, add the edge tab and drawer renders
4. 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 `./plugins/registry.ts`
2. Import `renderTeamProjects` from `./views/team-projects.ts`
3. In `onHello`, after `applySnapshot()`, call `registerTeamProjectsPlugin()`
4. Add the `registerTeamProjectsPlugin()` function
#### 3e. Add view state fields
In `ui/src/ui/app-view-state.ts`, add to `AppViewState`:
```typescript
teamChatOpen: boolean;
teamChatProject: unknown;
teamChatSessions: unknown[];
teamChatActivity: unknown[];
teamChatLoading: boolean;
teamChatInput: string;
teamChatTasksCollapsed: boolean;
```
In `ui/src/ui/app-settings.ts`, add `teamChatOpen?: boolean` to `SettingsHost` type, and add defensive cleanup in `applyTabSelection()`:
```typescript
} else if (host.teamChatOpen) {
host.teamChatOpen = false;
}
```
### Step 4: Build & Restart
```bash
cd ~/openclaw
pnpm build # Backend (gateway + plugin SDK)
pnpm ui:build # Control UI
openclaw gateway restart
```
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
2. Break down work into tasks
3. Assign tasks to agents based on capabilities
4. 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:
```bash
# Create a project
node {{SKILL_DIR}}/scripts/project-store.js create-project \
--name "Website Redesign" \
--description "Full redesign of company website" \
--coordinator main \
--agents "researcher,writer,coder"
# Add phases (ordered)
node {{SKILL_DIR}}/scripts/project-store.js add-phase \
--project PROJECT_ID --name "Research" --description "Competitive analysis"
# Add tasks with assignments and dependencies
node {{SKILL_DIR}}/scripts/project-store.js add-task \
--project PROJECT_ID --phase PHASE_ID \
--title "Analyze top 5 competitors" \
--description "Research competitor websites..." \
--assignee researcher --priority high
node {{SKILL_DIR}}/scripts/project-store.js add-task \
--project PROJECT_ID --phase PHASE_ID \
--title "Write homepage hero copy" \
--assignee writer --priority high \
--dependsOn "task_abc123"
```
### Dispatching Tasks
The orchestrator identifies ready tasks (dependencies met, not yet dispatched):
```bash
# See what's ready to dispatch
node {{SKILL_DIR}}/scripts/orchestrator.js plan PROJECT_ID
```
Then dispatch via OpenClaw's native `sessions_spawn`:
```
sessions_spawn(
agentId: "researcher",
task: "Research the top 5 competitors in the AI SaaS space...",
label: "task_abc123"
)
```
### Agent Communication
Agents can communicate using @-mentions:
- **@agentId** โ Direct message to an agent (routed via `sessions_send`)
- **@all** / **@team** โ Broadcast to all project agents
- **#task_id** โ Reference a task
- **TASK_COMPLETE: #task_id** โ Signal task completion
- **TASK_BLOCKED: #task_id** โ Signal a blocker
### Tracking Progress
```bash
# View project stats
node {{SKILL_DIR}}/scripts/project-store.js stats --id PROJECT_ID
# View work breakdown structure
node {{SKILL_DIR}}/scripts/project-store.js wbs --id PROJECT_ID
# Check and advance completed phases
node {{SKILL_DIR}}/scripts/orchestrator.js advance PROJECT_ID
```
### Updating Tasks
```bash
# Mark task in progress
node {{SKILL_DIR}}/scripts/project-store.js update-task \
--project PROJECT_ID --id TASK_ID --status in_progress
# Mark task done
node {{SKILL_DIR}}/scripts/project-store.js update-task \
--project PROJECT_ID --id TASK_ID --status done
# Add a comment
node {{SKILL_DIR}}/scripts/project-store.js add-comment \
--project PROJECT_ID --task TASK_ID \
--author main --text "Looks good, merging now"
```
## Data Model
### Project
```
project
โโโ id, name, slug, description
โโโ status: planning | active | paused | completed | archived
โโโ coordinator: agentId
โโโ agents: [agentId, ...]
โโโ phases[]
โโโ id, name, description, order
โโโ status: pending | active | completed
โโโ tasks[]
โโโ id, title, description
โโโ assignee: agentId
โโโ priority: critical | high | medium | low
โโโ status: todo | in_progress | blocked | review | done
โโโ dependsOn: [taskId, ...]
โโโ sessionKey: (set when dispatched)
โโโ artifacts: [paths/URLs]
โโโ comments[]
```
### Storage
- **Projects:** `~/.openclaw/workspace/team-projects/projects.json`
- **Chat logs:** `~/.openclaw/workspace/team-projects/chat_PROJECT_ID.jsonl`
- **Orchestrator state:** `~/.openclaw/workspace/team-projects/orchestrator-state.json`
## Architecture
### How It Works
```
โโโโโโโโโโโโโโโ sessions_spawn โโโโโโโโโโโโโโโโ
โ Coordinator โ โโโโโโโโโโโโโโโโโโโโโโโ โ Worker Agent โ
โ (Koda) โ โ (researcher) โ
โ โ โโโ push completion โโโโ โ โ
โ project- โ โโโโโโโโโโโโโโโโ
โ store.js โ sessions_spawn โโโโโโโโโโโโโโโโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโ โ Worker Agent โ
โ orchestr- โ โ (coder) โ
โ ator.js โ โโโ push completion โโโโ โ โ
โ โ โโโโโโโโโโโโโโโโ
โ UI plugin โ sessions_send โโโโโโโโโโโโโโโโ
โ tab โ โโโโโโโโโโโโโโโโโโโโโโโ โ Worker Agent โ
โโโโโโโโโโโโโโโ (inter-agent msg) โ (writer) โ
โโโโโโโโโโโโโโโโ
```
### Key Design Decisions
1. **Push-based completion** โ No polling. OpenClaw's `subagent-announce` system delivers completion events automatically.
2. **Dependency gates** โ The orchestrator only dispatches tasks whose `dependsOn` are all `done`.
3. **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.
4. **File-based persistence** โ Simple JSON storage. No database required. Works on any OpenClaw instance.
5. **CLI-first** โ All operations available via CLI. The UI is optional.
6. **Agent-native** โ Uses OpenClaw's existing `sessions_spawn`, `sessions_send`, and `agents_list` tools. No custom transport.
7. **Plugin architecture** โ Projects tab registered via OpenClaw's `uiPluginRegistry` (client-side). Team Chat drawer uses inline `<style>` tags for CSS (no Shadow DOM).
8. **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 |
|------|-------------|
| `src/plugin-sdk/<id>.ts` | SDK type entry (exports `OpenClawPluginApi` etc.) |
| `src/plugins/loader.ts` โ `pluginSdkScopedAliasEntries` | 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:
```typescript
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
```
team-projects/
โโโ SKILL.md # This file
โโโ scripts/
โ โโโ project-store.js # CRUD for projects, phases, tasks, comments
โ โโโ orchestrator.js # Dispatch planning, dependency gates, phase advancement
โ โโโ task-router.js # @-mention parsing and dispatch planning
โ โโโ gateway-handlers.js # HTTP API adapter (optional)
โโโ ui/
โ โโโ project-sidebar.js # Sidebar panel component (standalone)
โ โโโ team-chat.js # Multi-agent chat component (standalone)
โโโ gateway-plugin/
โ โโโ index.ts # Gateway plugin source (extensions/team-projects/)
โ โโโ openclaw.plugin.json # Plugin manifest
โ โโโ plugin-sdk-entry.ts # SDK type entry (src/plugin-sdk/team-projects.ts)
โ โโโ team-projects-view.ts # UI view renderer (ui/src/ui/views/team-projects.ts)
โ โโโ team-chat-drawer.ts # Team Chat drawer + edge tab (ui/src/ui/views/team-chat-drawer.ts)
โ โโโ app-render-patch.ts # Patch for app-render.ts (plugin tab catch-all + drawer)
โ โโโ app-gateway-patch.ts # Patch for app-gateway.ts (renderer registration)
โ โโโ BUILD_REGISTRATION.md # Build pipeline registration checklist
โโโ templates/
โ โโโ coordinator-prompt.md # System prompt for coordinator agent
โ โโโ worker-prompt.md # System prompt fragment for worker agents
โโโ references/
โโโ example-config.json # Example openclaw.json for team setup
โโโ walkthrough.md # Step-by-step usage guide
```
don't have the plugin yet? install it then click "run inline in claude" again.