@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
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: teamclaw-setup
3
+ description: Install, configure, validate, or troubleshoot the TeamClaw OpenClaw plugin for virtual software-team workflows. Use when users want TeamClaw setup help, controller or worker config snippets, on-demand process/docker/kubernetes workers, external worker registration, or safe first-run validation steps.
4
+ version: 1.0.0
5
+ metadata:
6
+ openclaw:
7
+ author: TeamClaws
8
+ homepage: https://github.com/topcheer/teamclaw
9
+ links:
10
+ homepage: https://github.com/topcheer/teamclaw
11
+ repository: https://github.com/topcheer/teamclaw
12
+ documentation: https://github.com/topcheer/teamclaw/blob/main/INSTALL.md
13
+ changelog: https://github.com/topcheer/teamclaw/releases
14
+ ---
15
+
16
+ # TeamClaw Setup
17
+
18
+ Guide users to the smallest working TeamClaw installation first, then expand.
19
+
20
+ ## Default workflow
21
+
22
+ 1. Prefer the guided installer first:
23
+
24
+ ```bash
25
+ npx -y @teamclaws/teamclaw install
26
+ ```
27
+
28
+ The guided installer already applies `--dangerously-force-unsafe-install` for TeamClaw and defaults to an independent `teamclaw` agent/workspace.
29
+
30
+ Advanced compatibility only:
31
+
32
+ ```bash
33
+ npx -y @teamclaws/teamclaw install --agent-mode main
34
+ ```
35
+
36
+ Use that only when the user explicitly wants the legacy shared-`main` layout.
37
+
38
+ 2. Use manual plugin install only when the user wants direct control:
39
+
40
+ ```bash
41
+ openclaw plugins install --dangerously-force-unsafe-install @teamclaws/teamclaw
42
+ ```
43
+
44
+ If the user explicitly wants the ClawHub package path, use:
45
+
46
+ ```bash
47
+ openclaw plugins install --dangerously-force-unsafe-install clawhub:@teamclaws/teamclaw
48
+ ```
49
+
50
+ 3. Recommend `controller + process provisioning` for the first successful run unless the user explicitly needs external workers, Docker, or Kubernetes immediately.
51
+
52
+ 4. Read `references/install-modes.md` before generating config. Pick the smallest matching topology and reuse the provided snippets.
53
+
54
+ 5. Read `references/validation-checklist.md` before finishing. Always give the user:
55
+ - one health-check command
56
+ - one UI URL
57
+ - one tiny smoke-test requirement
58
+ - one or two likely failure checks for the chosen topology
59
+
60
+ ## Installation guidance
61
+
62
+ - Start with a single host and `process` provisioning.
63
+ - Keep TeamClaw `taskTimeoutMs` large for real model runs.
64
+ - Keep OpenClaw `agents.defaults.timeoutSeconds` at least as large as the TeamClaw task window in seconds.
65
+ - For `docker` or `kubernetes`, require a reachable `workerProvisioningControllerUrl`.
66
+ - For `docker`, mention the published runtime image:
67
+
68
+ ```text
69
+ ghcr.io/topcheer/teamclaw-openclaw:latest
70
+ ```
71
+
72
+ ## What to produce
73
+
74
+ When helping a user, produce:
75
+
76
+ 1. the exact install command
77
+ 2. the minimal config snippet for the chosen topology
78
+ 3. the startup command
79
+ 4. the validation commands and first smoke-test task
80
+
81
+ Do not push users into distributed, Docker, or Kubernetes first unless they asked for it or already have the surrounding infrastructure ready.
@@ -0,0 +1,136 @@
1
+ # TeamClaw install modes
2
+
3
+ ## 1. Guided install
4
+
5
+ Use this when the user already has OpenClaw working and wants the shortest path:
6
+
7
+ ```bash
8
+ npx -y @teamclaws/teamclaw install
9
+ ```
10
+
11
+ The guided installer already applies `--dangerously-force-unsafe-install` for TeamClaw.
12
+
13
+ What it helps with:
14
+
15
+ - installs or updates the TeamClaw plugin
16
+ - locates `openclaw.json`
17
+ - lets the user choose a topology
18
+ - reuses existing OpenClaw model definitions
19
+ - prompts for workspace placement
20
+
21
+ ## 2. Manual plugin install
22
+
23
+ Use this when the user wants direct control over plugin installation:
24
+
25
+ ```bash
26
+ openclaw plugins install --dangerously-force-unsafe-install @teamclaws/teamclaw
27
+ ```
28
+
29
+ If the user explicitly wants the ClawHub source:
30
+
31
+ ```bash
32
+ openclaw plugins install --dangerously-force-unsafe-install clawhub:@teamclaws/teamclaw
33
+ ```
34
+
35
+ ## 3. Recommended first topology: controller + process provisioning
36
+
37
+ Minimal TeamClaw plugin block:
38
+
39
+ ```json
40
+ {
41
+ "mode": "controller",
42
+ "processModel": "multi",
43
+ "port": 9527,
44
+ "teamName": "my-team",
45
+ "taskTimeoutMs": 1800000,
46
+ "gitEnabled": true,
47
+ "gitDefaultBranch": "main",
48
+ "workerProvisioningType": "process",
49
+ "workerProvisioningRoles": [],
50
+ "workerProvisioningMinPerRole": 0,
51
+ "workerProvisioningMaxPerRole": 2,
52
+ "workerProvisioningIdleTtlMs": 120000,
53
+ "workerProvisioningStartupTimeoutMs": 120000
54
+ }
55
+ ```
56
+
57
+ Use this first because it avoids multi-machine networking while still exercising the real controller, provisioned workers, UI, messages, clarifications, and git-backed workspace flow.
58
+
59
+ ## 4. Worker-only topology
60
+
61
+ Use this only when a controller already exists elsewhere:
62
+
63
+ ```json
64
+ {
65
+ "mode": "worker",
66
+ "port": 9528,
67
+ "role": "developer",
68
+ "controllerUrl": "http://controller-host:9527",
69
+ "taskTimeoutMs": 1800000,
70
+ "gitEnabled": true,
71
+ "gitDefaultBranch": "main"
72
+ }
73
+ ```
74
+
75
+ ## 5. On-demand process workers
76
+
77
+ Use this when the controller should launch same-machine workers only as needed:
78
+
79
+ ```json
80
+ {
81
+ "mode": "controller",
82
+ "port": 9527,
83
+ "teamName": "my-team",
84
+ "workerProvisioningType": "process",
85
+ "workerProvisioningMinPerRole": 0,
86
+ "workerProvisioningMaxPerRole": 2,
87
+ "workerProvisioningIdleTtlMs": 120000,
88
+ "workerProvisioningStartupTimeoutMs": 120000
89
+ }
90
+ ```
91
+
92
+ ## 6. On-demand Docker workers
93
+
94
+ Use this when the user already has Docker and wants containerized workers:
95
+
96
+ ```json
97
+ {
98
+ "mode": "controller",
99
+ "port": 9527,
100
+ "teamName": "my-team",
101
+ "workerProvisioningType": "docker",
102
+ "workerProvisioningControllerUrl": "http://host.docker.internal:9527",
103
+ "workerProvisioningImage": "ghcr.io/topcheer/teamclaw-openclaw:latest",
104
+ "workerProvisioningWorkspaceRoot": "/workspace-root",
105
+ "workerProvisioningDockerWorkspaceVolume": "teamclaw-workspaces",
106
+ "workerProvisioningMaxPerRole": 3
107
+ }
108
+ ```
109
+
110
+ Important notes:
111
+
112
+ - `workerProvisioningControllerUrl` must be reachable from the worker container.
113
+ - If persistent workspaces matter, keep `workerProvisioningDockerWorkspaceVolume`.
114
+
115
+ ## 7. On-demand Kubernetes workers
116
+
117
+ Use this only when the user already runs the controller in or behind a reachable cluster address:
118
+
119
+ ```json
120
+ {
121
+ "mode": "controller",
122
+ "port": 9527,
123
+ "teamName": "my-team",
124
+ "workerProvisioningType": "kubernetes",
125
+ "workerProvisioningControllerUrl": "http://teamclaw-controller.default.svc.cluster.local:9527",
126
+ "workerProvisioningImage": "ghcr.io/topcheer/teamclaw-openclaw:latest",
127
+ "workerProvisioningWorkspaceRoot": "/workspace-root",
128
+ "workerProvisioningKubernetesWorkspacePersistentVolumeClaim": "teamclaw-workspace",
129
+ "workerProvisioningMaxPerRole": 2
130
+ }
131
+ ```
132
+
133
+ Important notes:
134
+
135
+ - `kubectl` must be available where the controller runs.
136
+ - The controller URL must be reachable from pods.
@@ -0,0 +1,73 @@
1
+ # TeamClaw validation checklist
2
+
3
+ ## Startup checks
4
+
5
+ After startup, always give the user:
6
+
7
+ ```bash
8
+ curl http://127.0.0.1:9527/api/v1/health
9
+ ```
10
+
11
+ Expected shape:
12
+
13
+ ```json
14
+ {"status":"ok","mode":"controller", ...}
15
+ ```
16
+
17
+ Also point them to:
18
+
19
+ ```text
20
+ http://127.0.0.1:9527/ui
21
+ ```
22
+
23
+ ## First smoke-test task
24
+
25
+ Recommend a tiny requirement before any large SDLC workflow:
26
+
27
+ ```text
28
+ Create a minimal static site in the workspace with README.md, index.html, and style.css.
29
+ ```
30
+
31
+ This checks controller intake, task routing, worker execution, workspace writes, and UI visibility with minimal risk.
32
+
33
+ ## Timeout guidance
34
+
35
+ For real model runs:
36
+
37
+ - TeamClaw: `taskTimeoutMs = 1800000`
38
+ - OpenClaw: `agents.defaults.timeoutSeconds >= 2400`
39
+
40
+ If OpenClaw times out first, users often think TeamClaw is broken when the real issue is the inner agent deadline.
41
+
42
+ ## Common failure checks
43
+
44
+ ### process provisioning
45
+
46
+ - confirm the chosen model already works in plain OpenClaw
47
+ - confirm `agents.defaults.workspace` points to a writable path
48
+
49
+ ### distributed worker
50
+
51
+ - confirm `controllerUrl` is reachable from the worker machine
52
+ - confirm the worker role matches the intended role
53
+
54
+ ### Docker
55
+
56
+ - confirm `workerProvisioningControllerUrl` is reachable from containers
57
+ - confirm the controller can access Docker
58
+ - confirm the runtime image is `ghcr.io/topcheer/teamclaw-openclaw:latest`
59
+
60
+ ### Kubernetes
61
+
62
+ - confirm pods can reach `workerProvisioningControllerUrl`
63
+ - confirm the controller environment has `kubectl`
64
+ - confirm any workspace PVC actually exists
65
+
66
+ ## Done criteria
67
+
68
+ Treat the install as successful only when:
69
+
70
+ 1. controller health is `ok`
71
+ 2. expected workers appear in the UI or status view
72
+ 3. the smoke-test task completes
73
+ 4. files appear in the workspace
package/src/config.ts CHANGED
@@ -31,7 +31,7 @@ function buildConfigSchema() {
31
31
  },
32
32
  teamName: {
33
33
  type: "string" as const,
34
- default: "default",
34
+ default: "TeamClaw",
35
35
  description: "Team name for mDNS identification",
36
36
  },
37
37
  heartbeatIntervalMs: {
@@ -42,7 +42,7 @@ function buildConfigSchema() {
42
42
  taskTimeoutMs: {
43
43
  type: "number" as const,
44
44
  default: 1800000,
45
- description: "Maximum time in milliseconds to wait for a role task to finish",
45
+ description: "Inactivity threshold in milliseconds before TeamClaw probes a stalled role task instead of failing it",
46
46
  },
47
47
  gitEnabled: {
48
48
  type: "boolean" as const,
@@ -69,14 +69,17 @@ function buildConfigSchema() {
69
69
  default: "teamclaw@local",
70
70
  description: "Git author email used for TeamClaw-managed workspace commits",
71
71
  },
72
- localRoles: {
73
- type: "array" as const,
74
- default: [],
75
- description: "Controller-local roles executed in this same OpenClaw instance",
76
- items: {
77
- type: "string" as const,
78
- enum: ROLE_IDS,
79
- },
72
+ agentIsolationMode: {
73
+ type: "string" as const,
74
+ enum: ["independent", "main"],
75
+ default: "independent",
76
+ description: "Runtime isolation mode: dedicated TeamClaw agent/workspace, or legacy main-agent shared mode",
77
+ },
78
+ processModel: {
79
+ type: "string" as const,
80
+ enum: ["multi"],
81
+ default: "multi",
82
+ description: "Worker execution model: TeamClaw runs workers as separate gateway processes",
80
83
  },
81
84
  workerProvisioningType: {
82
85
  type: "string" as const,
@@ -84,6 +87,11 @@ function buildConfigSchema() {
84
87
  default: "none",
85
88
  description: "Controller-only on-demand worker launch backend",
86
89
  },
90
+ workerProvisioningDisabled: {
91
+ type: "boolean" as const,
92
+ default: false,
93
+ description: "Explicitly disable controller-managed on-demand workers even when TeamClaw would normally default to same-host process provisioning",
94
+ },
87
95
  workerProvisioningControllerUrl: {
88
96
  type: "string" as const,
89
97
  default: "",
@@ -105,7 +113,7 @@ function buildConfigSchema() {
105
113
  },
106
114
  workerProvisioningMaxPerRole: {
107
115
  type: "number" as const,
108
- default: 1,
116
+ default: 3,
109
117
  description: "Maximum on-demand workers to launch per role",
110
118
  },
111
119
  workerProvisioningIdleTtlMs: {
@@ -177,6 +185,14 @@ function buildConfigSchema() {
177
185
  default: "",
178
186
  description: "Optional service account name for launched worker pods",
179
187
  },
188
+ workerProvisioningKubernetesImagePullSecrets: {
189
+ type: "array" as const,
190
+ default: [],
191
+ description: "Optional image pull secret names added to launched worker pods",
192
+ items: {
193
+ type: "string" as const,
194
+ },
195
+ },
180
196
  workerProvisioningKubernetesWorkspacePersistentVolumeClaim: {
181
197
  type: "string" as const,
182
198
  default: "",
@@ -208,8 +224,8 @@ function buildConfigSchema() {
208
224
  teamName: { label: "Team Name", help: "Team identifier for mDNS" },
209
225
  heartbeatIntervalMs: { label: "Heartbeat Interval", help: "In milliseconds, minimum 1000" },
210
226
  taskTimeoutMs: {
211
- label: "Task Timeout",
212
- help: "Maximum time to wait for a role task to finish before marking it failed (in milliseconds)",
227
+ label: "Task Stall Threshold",
228
+ help: "In milliseconds, how long TeamClaw waits without visible progress before probing the task instead of failing it",
213
229
  },
214
230
  gitEnabled: {
215
231
  label: "Git Collaboration",
@@ -231,14 +247,22 @@ function buildConfigSchema() {
231
247
  label: "Git Author Email",
232
248
  help: "Author email for TeamClaw-managed workspace commits",
233
249
  },
234
- localRoles: {
235
- label: "Local Roles",
236
- help: "Controller mode only: run these roles as local virtual workers inside the same OpenClaw instance",
250
+ agentIsolationMode: {
251
+ label: "Agent Isolation Mode",
252
+ help: "Use a dedicated TeamClaw agent/workspace by default, or the legacy shared main-agent mode",
253
+ },
254
+ processModel: {
255
+ label: "Process Model",
256
+ help: "TeamClaw runs workers as separate gateway processes",
237
257
  },
238
258
  workerProvisioningType: {
239
259
  label: "On-demand Worker Provider",
240
260
  help: "Launch missing workers on demand using process, Docker, or Kubernetes",
241
261
  },
262
+ workerProvisioningDisabled: {
263
+ label: "Disable On-demand Workers",
264
+ help: "Force TeamClaw to keep worker provisioning off even for same-host local controllers",
265
+ },
242
266
  workerProvisioningControllerUrl: {
243
267
  label: "Provisioned Worker Controller URL",
244
268
  help: "URL that launched workers use to call back into the controller",
@@ -303,6 +327,10 @@ function buildConfigSchema() {
303
327
  label: "Kubernetes Service Account",
304
328
  help: "Optional service account for launched worker pods",
305
329
  },
330
+ workerProvisioningKubernetesImagePullSecrets: {
331
+ label: "Kubernetes Image Pull Secrets",
332
+ help: "Optional secret names added to launched worker pods so they can pull private images",
333
+ },
306
334
  workerProvisioningKubernetesWorkspacePersistentVolumeClaim: {
307
335
  label: "Kubernetes Workspace PVC",
308
336
  help: "Optional PVC mounted as the persistent workspace root for launched worker pods",
@@ -1,13 +1,13 @@
1
1
  import type { PluginConfig, TeamState } from "../types.js";
2
2
 
3
3
  export function hasOnDemandWorkerProvisioning(
4
- config: Pick<PluginConfig, "workerProvisioningType">,
4
+ config: Pick<PluginConfig, "workerProvisioningType" | "processModel">,
5
5
  ): boolean {
6
6
  return config.workerProvisioningType !== "none";
7
7
  }
8
8
 
9
9
  export function shouldBlockControllerWithoutWorkers(
10
- config: Pick<PluginConfig, "workerProvisioningType">,
10
+ config: Pick<PluginConfig, "workerProvisioningType" | "processModel">,
11
11
  state: TeamState | null,
12
12
  ): boolean {
13
13
  return !!state && Object.keys(state.workers).length === 0 && !hasOnDemandWorkerProvisioning(config);