@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 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; TeamClaw launches local worker processes on demand with controller-decided defaults.",
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 for controller-decided defaults)",
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
- : 2,
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 = 1;
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 = 1;
1700
+ teamclawConfig.workerProvisioningMaxPerRole = 10;
1701
1701
  teamclawConfig.workerProvisioningImage = "";
1702
1702
  teamclawConfig.workerProvisioningPassEnv = [];
1703
1703
  teamclawConfig.workerProvisioningExtraEnv = {};
@@ -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-3",
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 controller-decided defaults across all roles",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamclaws/teamclaw",
3
- "version": "2026.4.2-3",
3
+ "version": "2026.4.2-4",
4
4
  "description": "OpenClaw virtual software team orchestration plugin",
5
5
  "private": false,
6
6
  "keywords": [
@@ -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 `{"status":"ok"}` |
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": 2,
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": 2,
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": 3
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": 2
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 controller-decided defaults across all roles",
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 = 1;
1419
+ teamclawConfig.workerProvisioningMaxPerRole = 10;
1420
1420
  teamclawConfig.workerProvisioningIdleTtlMs = controllerConfig.workerProvisioningIdleTtlMs;
1421
1421
  teamclawConfig.workerProvisioningStartupTimeoutMs = controllerConfig.workerProvisioningStartupTimeoutMs;
1422
1422
  teamclawConfig.workerProvisioningImage = "";