@teamclaws/teamclaw 2026.4.2-3 → 2026.4.2-4
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.
- package/README.md +10 -1
- package/cli.mjs +5 -5
- package/openclaw.plugin.json +2 -2
- package/package.json +1 -1
- package/skills/teamclaw/references/api-quick-ref.md +1 -1
- package/skills/teamclaw-setup/references/install-modes.md +10 -4
- package/skills/teamclaw-setup/references/validation-checklist.md +3 -1
- package/src/config.ts +1 -1
- package/src/controller/worker-provisioning.ts +1 -1
package/README.md
CHANGED
|
@@ -71,6 +71,15 @@ For maintainers, TeamClaw now uses two release paths:
|
|
|
71
71
|
1. **npm package** — published by GitHub Actions via `.github/workflows/teamclaw-plugin-npm-release.yml`
|
|
72
72
|
2. **ClawHub code plugin + bundled skills** — published manually from the CLI
|
|
73
73
|
|
|
74
|
+
The npm publish workflow runs automatically when:
|
|
75
|
+
|
|
76
|
+
- a tag matching `v*` is pushed
|
|
77
|
+
- or relevant package files change on `main` (`src/**`, `.github/workflows/teamclaw-plugin-npm-release.yml`, `scripts/sync-teamclaw-plugin-manifest.mjs`, `scripts/teamclaw-package-check.mjs`, `scripts/teamclaw-npm-publish.sh`)
|
|
78
|
+
|
|
79
|
+
It also supports `workflow_dispatch` for a specific commit SHA on `main`.
|
|
80
|
+
|
|
81
|
+
Before the first real npm publish, GitHub must already be configured for npm trusted publishing with the `npm-release` environment and this workflow file.
|
|
82
|
+
|
|
74
83
|
Before either release path, sync and validate the generated plugin manifest:
|
|
75
84
|
|
|
76
85
|
```bash
|
|
@@ -101,7 +110,7 @@ For a first-time setup, the safest path is:
|
|
|
101
110
|
2. Validate the workflow with a small smoke-test task
|
|
102
111
|
3. Expand to external workers, Docker, or Kubernetes after the basics are working
|
|
103
112
|
|
|
104
|
-
When on-demand provisioning is enabled, TeamClaw now treats controller startup as a readiness phase, not just a process-up check. During that warm-up, `/api/v1/health` returns a non-OK status until the controller has verified writable runtime paths and successfully brought the configured startup worker roles online.
|
|
113
|
+
When on-demand provisioning is enabled, TeamClaw now treats controller startup as a readiness phase, not just a process-up check. During that warm-up, `/api/v1/health` returns a non-OK status until the controller has verified writable runtime paths and successfully brought the configured startup worker roles online. If `workerProvisioningRoles` is empty, startup readiness defaults to waiting for a warm `developer` worker.
|
|
105
114
|
|
|
106
115
|
## Documentation
|
|
107
116
|
|
package/cli.mjs
CHANGED
|
@@ -64,7 +64,7 @@ const INSTALL_MODE_OPTIONS = [
|
|
|
64
64
|
{
|
|
65
65
|
value: "controller-manual",
|
|
66
66
|
label: "Local controller + default on-demand workers",
|
|
67
|
-
hint: "Lean same-host setup;
|
|
67
|
+
hint: "Lean same-host setup; writes workerProvisioningRoles=[] and workerProvisioningMaxPerRole=1.",
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
value: "controller-docker",
|
|
@@ -1363,7 +1363,7 @@ async function collectInstallChoices(configPath, config, prompter, options) {
|
|
|
1363
1363
|
|
|
1364
1364
|
const provisioningRoles = await promptOptionalRoleList(
|
|
1365
1365
|
prompter,
|
|
1366
|
-
"Preferred on-demand roles (comma-separated, leave empty
|
|
1366
|
+
"Preferred on-demand roles (comma-separated, leave empty to keep workerProvisioningRoles empty and let startup readiness default to a warm developer worker)",
|
|
1367
1367
|
resolveDefaultProvisioningRoles(existingTeamClaw),
|
|
1368
1368
|
);
|
|
1369
1369
|
const maxPerRole = await prompter.number({
|
|
@@ -1371,7 +1371,7 @@ async function collectInstallChoices(configPath, config, prompter, options) {
|
|
|
1371
1371
|
defaultValue:
|
|
1372
1372
|
typeof existingTeamClaw.workerProvisioningMaxPerRole === "number" && existingTeamClaw.workerProvisioningMaxPerRole >= 1
|
|
1373
1373
|
? existingTeamClaw.workerProvisioningMaxPerRole
|
|
1374
|
-
:
|
|
1374
|
+
: 10,
|
|
1375
1375
|
min: 1,
|
|
1376
1376
|
max: 50,
|
|
1377
1377
|
});
|
|
@@ -1677,7 +1677,7 @@ function applyInstallerChoices(config, choices, configPath) {
|
|
|
1677
1677
|
teamclawConfig.workerProvisioningDisabled = true;
|
|
1678
1678
|
teamclawConfig.workerProvisioningControllerUrl = "";
|
|
1679
1679
|
teamclawConfig.workerProvisioningRoles = [];
|
|
1680
|
-
teamclawConfig.workerProvisioningMaxPerRole =
|
|
1680
|
+
teamclawConfig.workerProvisioningMaxPerRole = 10;
|
|
1681
1681
|
teamclawConfig.workerProvisioningImage = "";
|
|
1682
1682
|
teamclawConfig.workerProvisioningPassEnv = [];
|
|
1683
1683
|
teamclawConfig.workerProvisioningExtraEnv = {};
|
|
@@ -1697,7 +1697,7 @@ function applyInstallerChoices(config, choices, configPath) {
|
|
|
1697
1697
|
teamclawConfig.workerProvisioningDisabled = false;
|
|
1698
1698
|
teamclawConfig.workerProvisioningControllerUrl = "";
|
|
1699
1699
|
teamclawConfig.workerProvisioningRoles = [];
|
|
1700
|
-
teamclawConfig.workerProvisioningMaxPerRole =
|
|
1700
|
+
teamclawConfig.workerProvisioningMaxPerRole = 10;
|
|
1701
1701
|
teamclawConfig.workerProvisioningImage = "";
|
|
1702
1702
|
teamclawConfig.workerProvisioningPassEnv = [];
|
|
1703
1703
|
teamclawConfig.workerProvisioningExtraEnv = {};
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "teamclaw",
|
|
3
3
|
"name": "TeamClaw",
|
|
4
4
|
"description": "Virtual team collaboration - multiple OpenClaw instances form a virtual software company with role-based task routing.",
|
|
5
|
-
"version": "2026.4.2-
|
|
5
|
+
"version": "2026.4.2-4",
|
|
6
6
|
"skills": [
|
|
7
7
|
"./skills"
|
|
8
8
|
],
|
|
@@ -260,7 +260,7 @@
|
|
|
260
260
|
"workerProvisioningRoles": {
|
|
261
261
|
"type": "array",
|
|
262
262
|
"default": [],
|
|
263
|
-
"description": "Preferred on-demand roles; task-required roles can still launch automatically. Empty means
|
|
263
|
+
"description": "Preferred on-demand roles; task-required roles can still launch automatically. Empty means no preferred startup role list, so startup readiness falls back to a warm developer worker",
|
|
264
264
|
"items": {
|
|
265
265
|
"type": "string",
|
|
266
266
|
"enum": [
|
package/package.json
CHANGED
|
@@ -10,7 +10,7 @@ Default: `http://127.0.0.1:9527`
|
|
|
10
10
|
|
|
11
11
|
| Method | Path | Description |
|
|
12
12
|
|--------|------|-------------|
|
|
13
|
-
| GET | `/api/v1/health` | Health check
|
|
13
|
+
| GET | `/api/v1/health` | Health/readiness check; may report a non-OK startup readiness state until required warm workers are online |
|
|
14
14
|
| GET | `/api/v1/team/status` | Full team snapshot (workers, tasks, runs, clarifications) |
|
|
15
15
|
| GET | `/api/v1/roles` | List all available roles |
|
|
16
16
|
|
|
@@ -48,7 +48,7 @@ Minimal TeamClaw plugin block:
|
|
|
48
48
|
"workerProvisioningType": "process",
|
|
49
49
|
"workerProvisioningRoles": [],
|
|
50
50
|
"workerProvisioningMinPerRole": 0,
|
|
51
|
-
"workerProvisioningMaxPerRole":
|
|
51
|
+
"workerProvisioningMaxPerRole": 10,
|
|
52
52
|
"workerProvisioningIdleTtlMs": 120000,
|
|
53
53
|
"workerProvisioningStartupTimeoutMs": 120000
|
|
54
54
|
}
|
|
@@ -56,6 +56,12 @@ Minimal TeamClaw plugin block:
|
|
|
56
56
|
|
|
57
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
58
|
|
|
59
|
+
If the user is specifically choosing install modes through the guided installer, remember the resulting config differs by mode:
|
|
60
|
+
|
|
61
|
+
- `controller-manual` writes `workerProvisioningType: "process"` and `workerProvisioningRoles: []`, so startup readiness falls back to a warm `developer` worker
|
|
62
|
+
- `controller-process` writes `workerProvisioningType: "process"` and uses the chosen roles/max-per-role
|
|
63
|
+
- `worker` disables provisioning on that node
|
|
64
|
+
|
|
59
65
|
## 4. Worker-only topology
|
|
60
66
|
|
|
61
67
|
Use this only when a controller already exists elsewhere:
|
|
@@ -83,7 +89,7 @@ Use this when the controller should launch same-machine workers only as needed:
|
|
|
83
89
|
"teamName": "my-team",
|
|
84
90
|
"workerProvisioningType": "process",
|
|
85
91
|
"workerProvisioningMinPerRole": 0,
|
|
86
|
-
"workerProvisioningMaxPerRole":
|
|
92
|
+
"workerProvisioningMaxPerRole": 10,
|
|
87
93
|
"workerProvisioningIdleTtlMs": 120000,
|
|
88
94
|
"workerProvisioningStartupTimeoutMs": 120000
|
|
89
95
|
}
|
|
@@ -103,7 +109,7 @@ Use this when the user already has Docker and wants containerized workers:
|
|
|
103
109
|
"workerProvisioningImage": "ghcr.io/topcheer/teamclaw-openclaw:latest",
|
|
104
110
|
"workerProvisioningWorkspaceRoot": "/workspace-root",
|
|
105
111
|
"workerProvisioningDockerWorkspaceVolume": "teamclaw-workspaces",
|
|
106
|
-
"workerProvisioningMaxPerRole":
|
|
112
|
+
"workerProvisioningMaxPerRole": 10
|
|
107
113
|
}
|
|
108
114
|
```
|
|
109
115
|
|
|
@@ -126,7 +132,7 @@ Use this only when the user already runs the controller in or behind a reachable
|
|
|
126
132
|
"workerProvisioningImage": "ghcr.io/topcheer/teamclaw-openclaw:latest",
|
|
127
133
|
"workerProvisioningWorkspaceRoot": "/workspace-root",
|
|
128
134
|
"workerProvisioningKubernetesWorkspacePersistentVolumeClaim": "teamclaw-workspace",
|
|
129
|
-
"workerProvisioningMaxPerRole":
|
|
135
|
+
"workerProvisioningMaxPerRole": 10
|
|
130
136
|
}
|
|
131
137
|
```
|
|
132
138
|
|
|
@@ -14,6 +14,8 @@ Expected shape:
|
|
|
14
14
|
{"status":"ok","mode":"controller", ...}
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
If on-demand provisioning is enabled, `/api/v1/health` can temporarily return a non-OK readiness state during warm-up. When `workerProvisioningRoles` is empty, readiness defaults to waiting for a warm `developer` worker.
|
|
18
|
+
|
|
17
19
|
Also point them to:
|
|
18
20
|
|
|
19
21
|
```text
|
|
@@ -67,7 +69,7 @@ If OpenClaw times out first, users often think TeamClaw is broken when the real
|
|
|
67
69
|
|
|
68
70
|
Treat the install as successful only when:
|
|
69
71
|
|
|
70
|
-
1. controller health is `ok`
|
|
72
|
+
1. controller health is `ok` after startup readiness finishes
|
|
71
73
|
2. expected workers appear in the UI or status view
|
|
72
74
|
3. the smoke-test task completes
|
|
73
75
|
4. files appear in the workspace
|
package/src/config.ts
CHANGED
|
@@ -100,7 +100,7 @@ function buildConfigSchema() {
|
|
|
100
100
|
workerProvisioningRoles: {
|
|
101
101
|
type: "array" as const,
|
|
102
102
|
default: [],
|
|
103
|
-
description: "Preferred on-demand roles; task-required roles can still launch automatically. Empty means
|
|
103
|
+
description: "Preferred on-demand roles; task-required roles can still launch automatically. Empty means no preferred startup role list, so startup readiness falls back to a warm developer worker",
|
|
104
104
|
items: {
|
|
105
105
|
type: "string" as const,
|
|
106
106
|
enum: ROLE_IDS,
|
|
@@ -1416,7 +1416,7 @@ function buildProvisionedWorkerConfig(
|
|
|
1416
1416
|
teamclawConfig.workerProvisioningControllerUrl = "";
|
|
1417
1417
|
teamclawConfig.workerProvisioningRoles = [];
|
|
1418
1418
|
teamclawConfig.workerProvisioningMinPerRole = 0;
|
|
1419
|
-
teamclawConfig.workerProvisioningMaxPerRole =
|
|
1419
|
+
teamclawConfig.workerProvisioningMaxPerRole = 10;
|
|
1420
1420
|
teamclawConfig.workerProvisioningIdleTtlMs = controllerConfig.workerProvisioningIdleTtlMs;
|
|
1421
1421
|
teamclawConfig.workerProvisioningStartupTimeoutMs = controllerConfig.workerProvisioningStartupTimeoutMs;
|
|
1422
1422
|
teamclawConfig.workerProvisioningImage = "";
|