@teamclaws/teamclaw 2026.3.26-2 → 2026.4.2-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +52 -8
  2. package/cli.mjs +538 -224
  3. package/index.ts +76 -27
  4. package/openclaw.plugin.json +53 -28
  5. package/package.json +5 -2
  6. package/skills/teamclaw/SKILL.md +213 -0
  7. package/skills/teamclaw/references/api-quick-ref.md +117 -0
  8. package/skills/teamclaw-setup/SKILL.md +81 -0
  9. package/skills/teamclaw-setup/references/install-modes.md +136 -0
  10. package/skills/teamclaw-setup/references/validation-checklist.md +73 -0
  11. package/src/config.ts +44 -16
  12. package/src/controller/controller-capacity.ts +2 -2
  13. package/src/controller/controller-service.ts +193 -47
  14. package/src/controller/controller-tools.ts +102 -2
  15. package/src/controller/delivery-report.ts +563 -0
  16. package/src/controller/http-server.ts +1907 -172
  17. package/src/controller/kickoff-orchestrator.ts +292 -0
  18. package/src/controller/managed-gateway-process.ts +330 -0
  19. package/src/controller/orchestration-manifest.ts +69 -1
  20. package/src/controller/preview-manager.ts +676 -0
  21. package/src/controller/prompt-injector.ts +116 -67
  22. package/src/controller/role-inference.ts +41 -0
  23. package/src/controller/websocket.ts +3 -1
  24. package/src/controller/worker-provisioning.ts +429 -74
  25. package/src/discovery.ts +1 -1
  26. package/src/git-collaboration.ts +198 -47
  27. package/src/identity.ts +12 -2
  28. package/src/interaction-contracts.ts +179 -3
  29. package/src/networking.ts +99 -0
  30. package/src/openclaw-workspace.ts +478 -11
  31. package/src/prompt-policy.ts +381 -0
  32. package/src/roles.ts +37 -36
  33. package/src/state.ts +40 -1
  34. package/src/task-executor.ts +282 -78
  35. package/src/types.ts +150 -7
  36. package/src/ui/app.js +1403 -175
  37. package/src/ui/assets/teamclaw-app-icon.png +0 -0
  38. package/src/ui/index.html +122 -40
  39. package/src/ui/style.css +829 -143
  40. package/src/worker/http-handler.ts +40 -4
  41. package/src/worker/prompt-injector.ts +9 -38
  42. package/src/worker/skill-installer.ts +2 -2
  43. package/src/worker/tools.ts +31 -5
  44. package/src/worker/worker-service.ts +49 -8
  45. package/src/workspace-browser.ts +20 -7
  46. package/src/controller/local-worker-manager.ts +0 -533
package/src/ui/index.html CHANGED
@@ -4,13 +4,20 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>TeamClaw - Virtual Team Dashboard</title>
7
+ <link rel="icon" href="/ui/assets/teamclaw-app-icon.png" type="image/png">
8
+ <link rel="apple-touch-icon" href="/ui/assets/teamclaw-app-icon.png">
7
9
  <link rel="stylesheet" href="/ui/style.css">
8
10
  </head>
9
11
  <body>
10
12
  <header class="header">
11
- <h1 class="header-title">TeamClaw</h1>
13
+ <div class="header-brand">
14
+ <img class="header-logo" src="/ui/assets/teamclaw-app-icon.png" alt="TeamClaw logo">
15
+ <h1 class="header-title">TeamClaw</h1>
16
+ </div>
12
17
  <div class="header-status">
13
18
  <span id="connection-status" class="status-dot disconnected"></span>
19
+ <button id="language-toggle" class="header-mini-btn" type="button">中文</button>
20
+ <button id="worker-install-toggle" class="header-mini-btn" type="button" hidden>Add worker</button>
14
21
  <span id="team-name">Team</span>
15
22
  </div>
16
23
  </header>
@@ -18,27 +25,78 @@
18
25
  <main class="main">
19
26
  <aside class="sidebar">
20
27
  <div class="sidebar-section">
21
- <h2 class="sidebar-heading">Workers</h2>
28
+ <h2 class="sidebar-heading" data-i18n="sidebar.workers">Workers</h2>
22
29
  <div id="workers-list" class="workers-list">
23
- <div class="empty-state">No workers connected</div>
30
+ <div class="empty-state" data-i18n="empty.noWorkers">No workers connected</div>
24
31
  </div>
25
32
  </div>
26
33
  <div class="sidebar-section">
27
- <h2 class="sidebar-heading">Roles</h2>
34
+ <h2 class="sidebar-heading" data-i18n="sidebar.roles">Roles</h2>
28
35
  <div id="roles-list" class="roles-list"></div>
29
36
  </div>
30
37
  </aside>
31
38
 
32
39
  <div class="content">
40
+ <div id="runtime-alert" class="runtime-alert hidden"></div>
41
+ <section id="external-worker-install" class="worker-install-card hidden"></section>
33
42
  <div class="tabs">
34
- <button class="tab active" data-tab="tasks">Tasks</button>
35
- <button class="tab" data-tab="workspace">Workspace</button>
36
- <button class="tab" data-tab="clarifications">Clarifications <span id="clarifications-tab-count" class="tab-badge">0</span></button>
37
- <button class="tab" data-tab="messages">Messages</button>
38
- <button class="tab" data-tab="create-task">Manual Task</button>
43
+ <button class="tab" data-tab="planning">
44
+ <span class="tab-label" data-i18n="tab.planning">Planning</span>
45
+ <span id="planning-tab-count" class="tab-badge">0</span>
46
+ <span id="planning-tab-signal" class="tab-signal"></span>
47
+ </button>
48
+ <button class="tab active" data-tab="tasks">
49
+ <span class="tab-label" data-i18n="tab.tasks">Tasks</span>
50
+ <span id="tasks-tab-count" class="tab-badge">0</span>
51
+ <span id="tasks-tab-signal" class="tab-signal"></span>
52
+ </button>
53
+ <button class="tab" data-tab="workspace"><span class="tab-label" data-i18n="tab.workspace">Workspace</span></button>
54
+ <button class="tab" data-tab="clarifications">
55
+ <span class="tab-label" data-i18n="tab.clarifications">Clarifications</span>
56
+ <span id="clarifications-tab-count" class="tab-badge">0</span>
57
+ <span id="clarifications-tab-signal" class="tab-signal"></span>
58
+ </button>
59
+ <button class="tab" data-tab="messages"><span class="tab-label" data-i18n="tab.messages">Messages</span></button>
60
+ <button class="tab" data-tab="create-task" data-i18n="tab.manualTask">Manual Task</button>
39
61
  </div>
40
62
 
41
63
  <div class="tab-content">
64
+ <!-- Planning Tab -->
65
+ <div id="tab-planning" class="tab-panel">
66
+ <div class="planning-container">
67
+ <aside class="planning-sessions">
68
+ <div class="planning-sessions-header">Sessions</div>
69
+ <div id="planning-session-list" class="planning-session-list">
70
+ <div class="empty-state">No planning sessions yet</div>
71
+ </div>
72
+ </aside>
73
+ <div class="planning-main">
74
+ <div id="planning-empty" class="planning-empty-state">
75
+ <div class="planning-empty-icon">🤝</div>
76
+ <h3 data-i18n="planning.title">Team Planning</h3>
77
+ <p data-i18n="planning.description">Submit a requirement via the command bar below. Complex projects (3+ roles) will trigger a team kickoff meeting where each role assesses the requirement collaboratively.</p>
78
+ </div>
79
+ <div id="planning-split" class="planning-split" style="display:none">
80
+ <section class="planning-pane planning-pane-left">
81
+ <div class="planning-pane-header">
82
+ <span class="planning-pane-icon">📝</span>
83
+ <span class="planning-pane-title">Requirement</span>
84
+ </div>
85
+ <div id="planning-requirement" class="planning-pane-body markdown-body"></div>
86
+ </section>
87
+ <div class="planning-divider"></div>
88
+ <section class="planning-pane planning-pane-right">
89
+ <div class="planning-pane-header">
90
+ <span class="planning-pane-icon">🤝</span>
91
+ <span class="planning-pane-title">Team Kickoff Meeting</span>
92
+ </div>
93
+ <div id="planning-kickoff" class="planning-pane-body"></div>
94
+ </section>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+
42
100
  <!-- Tasks Tab -->
43
101
  <div id="tab-tasks" class="tab-panel active">
44
102
  <div class="task-filters">
@@ -51,7 +109,7 @@
51
109
  <button class="filter-btn" data-filter="failed">Failed</button>
52
110
  </div>
53
111
  <div id="tasks-board" class="tasks-board">
54
- <div class="empty-state">No tasks yet</div>
112
+ <div class="empty-state" data-i18n="empty.noTasks">No tasks yet</div>
55
113
  </div>
56
114
  </div>
57
115
 
@@ -64,7 +122,7 @@
64
122
  <div class="workspace-panel-kicker">Workspace</div>
65
123
  <h3>Files</h3>
66
124
  </div>
67
- <button id="workspace-tree-refresh" class="btn btn-small" type="button">Refresh</button>
125
+ <button id="workspace-tree-refresh" class="btn btn-small" type="button" data-i18n="action.refresh">Refresh</button>
68
126
  </div>
69
127
  <div id="workspace-tree" class="workspace-tree">
70
128
  <div class="empty-state">Workspace tree loading…</div>
@@ -74,18 +132,18 @@
74
132
  <section class="workspace-viewer-panel">
75
133
  <div class="workspace-panel-header">
76
134
  <div>
77
- <div class="workspace-panel-kicker">Preview</div>
78
- <h3 id="workspace-file-name">Select a file</h3>
135
+ <div class="workspace-panel-kicker" data-i18n="workspace.preview">Preview</div>
136
+ <h3 id="workspace-file-name" data-i18n="workspace.selectFile">Select a file</h3>
79
137
  <div id="workspace-file-meta" class="workspace-file-meta"></div>
80
138
  </div>
81
139
  <div class="workspace-viewer-actions">
82
- <a id="workspace-open-raw" class="btn btn-small workspace-open-raw hidden" href="#" target="_blank" rel="noreferrer">Open Raw</a>
140
+ <a id="workspace-open-raw" class="btn btn-small workspace-open-raw hidden" href="#" target="_blank" rel="noreferrer" data-i18n="workspace.openRaw">Open Raw</a>
83
141
  </div>
84
142
  </div>
85
143
 
86
144
  <div class="workspace-view-tabs">
87
- <button id="workspace-view-source" class="workspace-view-tab active" type="button" data-workspace-view="source">Source</button>
88
- <button id="workspace-view-preview" class="workspace-view-tab" type="button" data-workspace-view="preview">Preview</button>
145
+ <button id="workspace-view-source" class="workspace-view-tab active" type="button" data-workspace-view="source" data-i18n="workspace.source">Source</button>
146
+ <button id="workspace-view-preview" class="workspace-view-tab" type="button" data-workspace-view="preview" data-i18n="workspace.preview">Preview</button>
89
147
  </div>
90
148
 
91
149
  <div class="workspace-view-body">
@@ -99,44 +157,44 @@
99
157
  <!-- Clarifications Tab -->
100
158
  <div id="tab-clarifications" class="tab-panel">
101
159
  <div id="clarifications-list" class="clarifications-list">
102
- <div class="empty-state">No clarification requests</div>
160
+ <div class="empty-state" data-i18n="empty.noClarifications">No clarification requests</div>
103
161
  </div>
104
162
  </div>
105
163
 
106
164
  <!-- Messages Tab -->
107
165
  <div id="tab-messages" class="tab-panel">
108
166
  <div class="panel-note">
109
- Controller activity is persisted here so you can follow requirement intake, orchestration, and follow-up runs from the web UI.
167
+ <span data-i18n="messages.panelNote">Controller activity is persisted here so you can follow requirement intake, orchestration, and follow-up runs from the web UI.</span>
110
168
  </div>
111
169
  <div id="controller-runs" class="controller-runs">
112
- <div class="empty-state">No controller activity yet</div>
170
+ <div class="empty-state" data-i18n="empty.noControllerActivity">No controller activity yet</div>
113
171
  </div>
114
172
  <div id="messages-feed" class="messages-feed">
115
- <div class="empty-state">No messages yet</div>
173
+ <div class="empty-state" data-i18n="empty.noMessages">No messages yet</div>
116
174
  </div>
117
175
  </div>
118
176
 
119
177
  <!-- Create Task Tab -->
120
178
  <div id="tab-create-task" class="tab-panel">
121
179
  <div class="panel-note">
122
- Raw human requirements should go to the controller conversation first. Use this form only for explicit manual task injection or testing.
180
+ <span data-i18n="manualTask.note">Raw human requirements should go to the controller conversation first. Use this form only for explicit manual task injection or testing.</span>
123
181
  </div>
124
182
  <form id="create-task-form" class="create-task-form">
125
183
  <div class="form-group">
126
- <label for="task-title">Title</label>
127
- <input type="text" id="task-title" placeholder="Task title..." required>
184
+ <label for="task-title" data-i18n="manualTask.title">Title</label>
185
+ <input type="text" id="task-title" placeholder="Task title..." data-i18n-placeholder="manualTask.titlePlaceholder" required>
128
186
  </div>
129
187
  <div class="form-group">
130
- <label for="task-desc">Description</label>
131
- <textarea id="task-desc" placeholder="Execution-ready task description..." rows="4" required></textarea>
188
+ <label for="task-desc" data-i18n="manualTask.description">Description</label>
189
+ <textarea id="task-desc" placeholder="Execution-ready task description..." data-i18n-placeholder="manualTask.descriptionPlaceholder" rows="4" required></textarea>
132
190
  </div>
133
191
  <div class="form-group">
134
- <label for="task-recommended-skills">Recommended Skills</label>
135
- <input type="text" id="task-recommended-skills" placeholder="Comma-separated skill slugs, e.g. find-skills, ui-ux-pro-max">
192
+ <label for="task-recommended-skills" data-i18n="manualTask.skills">Recommended Skills</label>
193
+ <input type="text" id="task-recommended-skills" placeholder="Comma-separated skill slugs, e.g. find-skills, ui-ux-pro-max" data-i18n-placeholder="manualTask.skillsPlaceholder">
136
194
  </div>
137
195
  <div class="form-row">
138
196
  <div class="form-group">
139
- <label for="task-priority">Priority</label>
197
+ <label for="task-priority" data-i18n="manualTask.priority">Priority</label>
140
198
  <select id="task-priority">
141
199
  <option value="low">Low</option>
142
200
  <option value="medium" selected>Medium</option>
@@ -145,9 +203,9 @@
145
203
  </select>
146
204
  </div>
147
205
  <div class="form-group">
148
- <label for="task-role">Assigned Role</label>
206
+ <label for="task-role" data-i18n="manualTask.assignedRole">Assigned Role</label>
149
207
  <select id="task-role">
150
- <option value="">Auto-assign</option>
208
+ <option value="" data-i18n="manualTask.autoAssign">Auto-assign</option>
151
209
  <option value="pm">Product Manager</option>
152
210
  <option value="architect">Software Architect</option>
153
211
  <option value="developer">Developer</option>
@@ -161,13 +219,27 @@
161
219
  </select>
162
220
  </div>
163
221
  </div>
164
- <button type="submit" class="btn btn-primary">Create Manual Task</button>
222
+ <button type="submit" class="btn btn-primary" data-i18n="manualTask.create">Create Manual Task</button>
165
223
  </form>
166
224
  </div>
167
225
  </div>
168
226
  </div>
169
227
  </main>
170
228
 
229
+ <div id="clarification-prompt-modal" class="clarification-prompt-modal" aria-hidden="true">
230
+ <div class="clarification-prompt-backdrop" data-clarification-prompt-close></div>
231
+ <section class="clarification-prompt-panel" role="dialog" aria-modal="true" aria-labelledby="clarification-prompt-title">
232
+ <header class="clarification-prompt-header">
233
+ <div>
234
+ <div class="clarification-prompt-kicker">Clarification needed</div>
235
+ <h2 id="clarification-prompt-title">Human input required</h2>
236
+ </div>
237
+ <button id="clarification-prompt-close" class="btn btn-small" type="button">Dismiss</button>
238
+ </header>
239
+ <div id="clarification-prompt-body" class="clarification-prompt-body"></div>
240
+ </section>
241
+ </div>
242
+
171
243
  <div id="task-detail-modal" class="task-detail-modal" aria-hidden="true">
172
244
  <div class="task-detail-backdrop" data-task-detail-close></div>
173
245
  <section class="task-detail-panel" role="dialog" aria-modal="true" aria-labelledby="task-detail-title">
@@ -184,23 +256,33 @@
184
256
  </header>
185
257
 
186
258
  <div class="task-detail-toolbar">
187
- <label class="task-detail-follow">
188
- <input id="task-detail-follow-toggle" type="checkbox" checked>
189
- <span>Follow live output</span>
190
- </label>
191
259
  <span id="task-detail-live-badge" class="task-detail-live-badge">Idle</span>
192
260
  </div>
193
261
 
194
262
  <div class="task-detail-tabs">
195
- <button class="task-detail-tab active" type="button" data-task-detail-tab="overview">Overview</button>
196
- <button class="task-detail-tab" type="button" data-task-detail-tab="timeline">Timeline</button>
197
- <button class="task-detail-tab" type="button" data-task-detail-tab="output">Output</button>
263
+ <button class="task-detail-tab active" type="button" data-task-detail-tab="details">
264
+ <span>Task details</span>
265
+ <span class="task-detail-tab-count" data-task-detail-tab-count="details"></span>
266
+ </button>
267
+ <button class="task-detail-tab" type="button" data-task-detail-tab="timeline">
268
+ <span>Timeline</span>
269
+ <span class="task-detail-tab-count" data-task-detail-tab-count="timeline"></span>
270
+ </button>
271
+ <button class="task-detail-tab" type="button" data-task-detail-tab="clarifications">
272
+ <span>Clarifications</span>
273
+ <span class="task-detail-tab-count" data-task-detail-tab-count="clarifications"></span>
274
+ </button>
275
+ <button class="task-detail-tab" type="button" data-task-detail-tab="messages">
276
+ <span>Messages</span>
277
+ <span class="task-detail-tab-count" data-task-detail-tab-count="messages"></span>
278
+ </button>
198
279
  </div>
199
280
 
200
281
  <div class="task-detail-body">
201
- <div id="task-detail-overview" class="task-detail-panel-content active"></div>
282
+ <div id="task-detail-details" class="task-detail-panel-content active"></div>
202
283
  <div id="task-detail-timeline" class="task-detail-panel-content"></div>
203
- <div id="task-detail-output" class="task-detail-panel-content"></div>
284
+ <div id="task-detail-clarifications" class="task-detail-panel-content"></div>
285
+ <div id="task-detail-messages" class="task-detail-panel-content"></div>
204
286
  </div>
205
287
  </section>
206
288
  </div>