惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Engineering at Meta
Engineering at Meta
D
DataBreaches.Net
月光博客
月光博客
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
U
Unit 42
腾讯CDC
爱范儿
爱范儿
J
Java Code Geeks
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
B
Blog
Stack Overflow Blog
Stack Overflow Blog
GbyAI
GbyAI
T
The Blog of Author Tim Ferriss
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
test: add slack onboarding channel smoke (#77575) · openc...
kevinslin · 2026-05-05 · via Recent Commits to openclaw:main
Original file line numberDiff line numberDiff line change

@@ -640,7 +640,7 @@ The live-model Docker runners also bind-mount only the needed CLI auth homes (or

640640

- Observability smoke: `pnpm qa:otel:smoke` is a private QA source-checkout lane. It is intentionally not part of package Docker release lanes because the npm tarball omits QA Lab.

641641

- Open WebUI live smoke: `pnpm test:docker:openwebui` (script: `scripts/e2e/openwebui-docker.sh`)

642642

- Onboarding wizard (TTY, full scaffolding): `pnpm test:docker:onboard` (script: `scripts/e2e/onboard-docker.sh`)

643-

- Npm tarball onboarding/channel/agent smoke: `pnpm test:docker:npm-onboard-channel-agent` installs the packed OpenClaw tarball globally in Docker, configures OpenAI via env-ref onboarding plus Telegram by default, runs doctor, and runs one mocked OpenAI agent turn. Reuse a prebuilt tarball with `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, skip the host rebuild with `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`, or switch channel with `OPENCLAW_NPM_ONBOARD_CHANNEL=discord`.

643+

- Npm tarball onboarding/channel/agent smoke: `pnpm test:docker:npm-onboard-channel-agent` installs the packed OpenClaw tarball globally in Docker, configures OpenAI via env-ref onboarding plus Telegram by default, runs doctor, and runs one mocked OpenAI agent turn. Reuse a prebuilt tarball with `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, skip the host rebuild with `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`, or switch channel with `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` or `OPENCLAW_NPM_ONBOARD_CHANNEL=slack`.

644644

- Update channel switch smoke: `pnpm test:docker:update-channel-switch` installs the packed OpenClaw tarball globally in Docker, switches from package `stable` to git `dev`, verifies the persisted channel and plugin post-update work, then switches back to package `stable` and checks update status.

645645

- Upgrade survivor smoke: `pnpm test:docker:upgrade-survivor` installs the packed OpenClaw tarball over a dirty old-user fixture with agents, channel config, plugin allowlists, stale plugin dependency state, and existing workspace/session files. It runs package update plus non-interactive doctor without live provider or channel keys, then starts a loopback Gateway and checks config/state preservation plus startup/status budgets.

646646

- Published upgrade survivor smoke: `pnpm test:docker:published-upgrade-survivor` installs `openclaw@latest` by default, seeds realistic existing-user files, configures that baseline with a baked command recipe, validates the resulting config, updates that published install to the candidate tarball, runs non-interactive doctor, writes `.artifacts/upgrade-survivor/summary.json`, then starts a loopback Gateway and checks configured intents, state preservation, startup, `/healthz`, `/readyz`, and RPC status budgets. Override one baseline with `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC`, ask the aggregate scheduler to expand exact baselines with `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS` such as `all-since-2026.4.23`, and expand issue-shaped fixtures with `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` such as `reported-issues`; the reported-issues set includes `configured-plugin-installs` for automatic external OpenClaw plugin install repair. Package Acceptance exposes those as `published_upgrade_survivor_baseline`, `published_upgrade_survivor_baselines`, and `published_upgrade_survivor_scenarios`; Full Release Validation uses the default latest baseline in the blocking path and expands to all-since/reported-issues only for `run_release_soak=true` or `release_profile=full`.

Original file line numberDiff line numberDiff line change

@@ -1553,6 +1553,7 @@

15531553

"test:docker:mcp-channels": "bash scripts/e2e/mcp-channels-docker.sh",

15541554

"test:docker:npm-onboard-channel-agent": "bash scripts/e2e/npm-onboard-channel-agent-docker.sh",

15551555

"test:docker:npm-onboard-discord-channel-agent": "OPENCLAW_NPM_ONBOARD_CHANNEL=discord bash scripts/e2e/npm-onboard-channel-agent-docker.sh",

1556+

"test:docker:npm-onboard-slack-channel-agent": "OPENCLAW_NPM_ONBOARD_CHANNEL=slack bash scripts/e2e/npm-onboard-channel-agent-docker.sh",

15561557

"test:docker:npm-telegram-live": "bash scripts/e2e/npm-telegram-live-docker.sh",

15571558

"test:docker:onboard": "bash scripts/e2e/onboard-docker.sh",

15581559

"test:docker:openai-image-auth": "bash scripts/e2e/openai-image-auth-docker.sh",

Original file line numberDiff line numberDiff line change

@@ -83,15 +83,21 @@ function configureMockModel() {

8383
8484

function assertChannelConfig() {

8585

const channel = process.argv[3];

86-

const token = process.argv[4];

86+

const expectedTokens = process.argv.slice(4);

87+

if (expectedTokens.length === 0) {

88+

throw new Error("assert-channel-config requires at least one expected token");

89+

}

8790

const configPath = path.join(process.env.HOME, ".openclaw", "openclaw.json");

8891

const cfg = readJson(configPath);

8992

const entry = cfg.channels?.[channel];

9093

if (!entry || entry.enabled === false) {

9194

throw new Error(`${channel} was not enabled`);

9295

}

93-

if (!JSON.stringify(entry).includes(token)) {

94-

throw new Error(`${channel} token was not persisted`);

96+

const serializedEntry = JSON.stringify(entry);

97+

for (const token of expectedTokens) {

98+

if (!serializedEntry.includes(token)) {

99+

throw new Error(`${channel} token was not persisted`);

100+

}

95101

}

96102

}

97103
Original file line numberDiff line numberDiff line change

@@ -14,9 +14,9 @@ PACKAGE_TGZ="${OPENCLAW_CURRENT_PACKAGE_TGZ:-}"

1414

CHANNEL="${OPENCLAW_NPM_ONBOARD_CHANNEL:-telegram}"

1515
1616

case "$CHANNEL" in

17-

telegram | discord) ;;

17+

telegram | discord | slack) ;;

1818

*)

19-

echo "OPENCLAW_NPM_ONBOARD_CHANNEL must be telegram or discord, got: $CHANNEL" >&2

19+

echo "OPENCLAW_NPM_ONBOARD_CHANNEL must be telegram, discord, or slack, got: $CHANNEL" >&2

2020

exit 1

2121

;;

2222

esac

@@ -69,10 +69,21 @@ case "$CHANNEL" in

6969

telegram)

7070

CHANNEL_TOKEN="123456:openclaw-npm-onboard-token"

7171

DEP_SENTINEL="grammy"

72+

CHANNEL_ADD_ARGS=(--token "$CHANNEL_TOKEN")

73+

CHANNEL_CONFIG_TOKENS=("$CHANNEL_TOKEN")

7274

;;

7375

discord)

7476

CHANNEL_TOKEN="openclaw-npm-onboard-discord-token"

7577

DEP_SENTINEL="discord-api-types"

78+

CHANNEL_ADD_ARGS=(--token "$CHANNEL_TOKEN")

79+

CHANNEL_CONFIG_TOKENS=("$CHANNEL_TOKEN")

80+

;;

81+

slack)

82+

SLACK_BOT_TOKEN="xoxb-openclaw-npm-onboard-slack-token"

83+

SLACK_APP_TOKEN="xapp-openclaw-npm-onboard-slack-token"

84+

DEP_SENTINEL="@slack/bolt"

85+

CHANNEL_ADD_ARGS=(--bot-token "$SLACK_BOT_TOKEN" --app-token "$SLACK_APP_TOKEN")

86+

CHANNEL_CONFIG_TOKENS=("$SLACK_BOT_TOKEN" "$SLACK_APP_TOKEN")

7687

;;

7788

*)

7889

echo "unsupported channel: $CHANNEL" >&2

@@ -138,8 +149,8 @@ node scripts/e2e/lib/npm-onboard-channel-agent/assertions.mjs configure-mock-mod

138149

openclaw_e2e_assert_dep_absent "$DEP_SENTINEL" "$HOME/.openclaw"

139150
140151

echo "Configuring $CHANNEL..."

141-

openclaw channels add --channel "$CHANNEL" --token "$CHANNEL_TOKEN" >/tmp/openclaw-channel-add.log 2>&1

142-

node scripts/e2e/lib/npm-onboard-channel-agent/assertions.mjs assert-channel-config "$CHANNEL" "$CHANNEL_TOKEN"

152+

openclaw channels add --channel "$CHANNEL" "${CHANNEL_ADD_ARGS[@]}" >/tmp/openclaw-channel-add.log 2>&1

153+

node scripts/e2e/lib/npm-onboard-channel-agent/assertions.mjs assert-channel-config "$CHANNEL" "${CHANNEL_CONFIG_TOKENS[@]}"

143154
144155

echo "Checking status surfaces for $CHANNEL..."

145156

openclaw channels status --json >/tmp/openclaw-channels-status.json 2>/tmp/openclaw-channels-status.err

Original file line numberDiff line numberDiff line change

@@ -181,6 +181,11 @@ export const mainLanes = [

181181

"OPENCLAW_NPM_ONBOARD_CHANNEL=discord OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent",

182182

{ resources: ["service"], stateScenario: "empty", weight: 3 },

183183

),

184+

npmLane(

185+

"npm-onboard-slack-channel-agent",

186+

"OPENCLAW_NPM_ONBOARD_CHANNEL=slack OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent",

187+

{ resources: ["service"], stateScenario: "empty", weight: 3 },

188+

),

184189

serviceLane("gateway-network", "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:gateway-network"),

185190

serviceLane(

186191

"agents-delete-shared-workspace",

@@ -499,6 +504,11 @@ const releasePathPackageUpdateCoreLanes = [

499504

"OPENCLAW_NPM_ONBOARD_CHANNEL=discord OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent",

500505

{ resources: ["service"], stateScenario: "empty", weight: 3 },

501506

),

507+

npmLane(

508+

"npm-onboard-slack-channel-agent",

509+

"OPENCLAW_NPM_ONBOARD_CHANNEL=slack OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent",

510+

{ resources: ["service"], stateScenario: "empty", weight: 3 },

511+

),

502512

npmLane("doctor-switch", "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:doctor-switch", {

503513

stateScenario: "empty",

504514

weight: 3,

Original file line numberDiff line numberDiff line change

@@ -33,6 +33,10 @@ const pluginPrereleaseDockerLanes = Object.freeze([

3333

"status-diagnostics",

3434

],

3535

},

36+

{

37+

lane: "npm-onboard-slack-channel-agent",

38+

surfaces: ["package-artifact", "gateway-bootstrap", "status-diagnostics"],

39+

},

3640

{

3741

lane: "doctor-switch",

3842

surfaces: ["package-artifact", "doctor-fix"],

Original file line numberDiff line numberDiff line change

@@ -151,6 +151,7 @@ describe("scripts/lib/docker-e2e-plan", () => {

151151

expect(packageUpdateCore.lanes.map((lane) => lane.name)).toEqual([

152152

"npm-onboard-channel-agent",

153153

"npm-onboard-discord-channel-agent",

154+

"npm-onboard-slack-channel-agent",

154155

"doctor-switch",

155156

"update-channel-switch",

156157

"upgrade-survivor",

@@ -166,6 +167,10 @@ describe("scripts/lib/docker-e2e-plan", () => {

166167

name: "npm-onboard-discord-channel-agent",

167168

stateScenario: "empty",

168169

}),

170+

expect.objectContaining({

171+

name: "npm-onboard-slack-channel-agent",

172+

stateScenario: "empty",

173+

}),

169174

expect.objectContaining({

170175

name: "doctor-switch",

171176

stateScenario: "empty",

Original file line numberDiff line numberDiff line change

@@ -37,6 +37,7 @@ describe("scripts/lib/plugin-prerelease-test-plan.mjs", () => {

3737

expect(plan.dockerLanes).toEqual([

3838

"npm-onboard-channel-agent",

3939

"npm-onboard-discord-channel-agent",

40+

"npm-onboard-slack-channel-agent",

4041

"doctor-switch",

4142

"update-channel-switch",

4243

"plugins-offline",