-`bundled-runtime-smoke.ps1` materializes the local runtime payload, forces bundled-runtime mode, and validates that Electron can launch and use the managed runtime end to end
-`bundled-runtime-smoke.ps1` materializes the local runtime payload, forces bundled-runtime mode, and validates that Electron can launch and use the managed runtime end to end
-`workspace-entry-smoke.ps1` materializes the bundled runtime payload, prepares an isolated active project fixture, and validates the workspace-entry execution path end to end as a formal regression smoke; `pnpm smoke:workspace-entry`
-`workspace-entry-smoke.ps1` materializes the bundled runtime payload, prepares an isolated active project fixture, and validates the workspace-entry execution path end to end as a formal regression smoke; `pnpm smoke:workspace-entry`
-`cloud-bundle-smoke.ps1` generates real same-project bundle variants, serves them through the smoke cloud API, and validates the full `cloud zip -> bundle sync -> active project -> workspace-entry` chain for payload `sync`, cached `init`, and same-`projectId` replacement with refreshed README/shared-entry materialization; `pnpm smoke:cloud-bundle`
-`cloud-bundle-smoke.ps1` generates real same-project bundle variants, serves them through the smoke cloud API, and validates the full `cloud zip -> bundle sync -> active project -> workspace-entry` chain for payload `sync`, cached `init`, and same-`projectId` replacement with refreshed README/shared-entry materialization; `pnpm smoke:cloud-bundle`
-`xhs-expert-cloud-bundle-smoke.ps1` packages `workspace/xhs` as a zip-backed employee-config bundle, preserves two extra fixture experts so the experts rail exceeds two items, switches to the XHS expert, and sends `发一个美食推荐类的帖子` through the experts view; `pnpm smoke:xhs-expert-cloud-bundle`
-`xhs-expert-cloud-bundle-smoke.ps1` packages `workspace/xhs` as a zip-backed employee-config bundle, injects the fixed `volces` image provider into the managed runtime config for XHS generation, preserves two extra fixture experts so the experts rail exceeds two items, switches to the XHS expert, and sends `发一个美食推荐类的帖子` through the experts view; `pnpm smoke:xhs-expert-cloud-bundle`
-`xhs-expert-manual-launch.ps1` packages `workspace/xhs` into a local zip bundle, boots the packaged desktop app against the built-in mock `/openclaw-employee-config`, preserves two extra fixture experts so the experts rail exceeds two items, and leaves the app open for manual experts-page testing; close any already running `QianjiangClaw.exe` instance first, then run `powershell -ExecutionPolicy Bypass -File build/scripts/xhs-expert-manual-launch.ps1`
-`douyin-expert-cloud-bundle-smoke.ps1` packages `workspace/douyin` as a zip-backed employee-config bundle, preserves two extra fixture experts so the experts rail exceeds two items, switches to the Douyin expert, and sends `帮我做一个关于防晒喷雾的抖音视频文案` through the experts view; `pnpm smoke:douyin-expert-cloud-bundle`
-`local-project-package-smoke.ps1` copies the current local `workspace/xhs` and `workspace/douyin` sources with `bundlePackaging.excludePaths` applied, runs package-level workspace-entry smoke checks from the copied package roots, verifies the XHS path/publish behavior, verifies injected XHS image-provider resolution plus topic extraction cleanup, and verifies the Douyin multi-turn intake flow; `pnpm smoke:local-project-package`
-`xhs-expert-manual-launch.ps1` packages `workspace/xhs` into a local zip bundle, boots the packaged desktop app against the built-in mock `/openclaw-employee-config`, injects the fixed `volces` image provider plus `XHS_IMAGE_PROVIDER/XHS_IMAGE_MODEL`, preserves two extra fixture experts so the experts rail exceeds two items, and leaves the app open for manual experts-page testing; close any already running `QianjiangClaw.exe` instance first, then run `powershell -ExecutionPolicy Bypass -File build/scripts/xhs-expert-manual-launch.ps1`
-`douyin-expert-manual-launch.ps1` packages `workspace/douyin` into a local zip bundle with `bundlePackaging.excludePaths` applied, boots the packaged desktop app against the built-in mock `/openclaw-employee-config`, preserves two extra fixture experts so the experts rail exceeds two items, and leaves the app open for manual experts-page testing; close any already running `QianjiangClaw.exe` instance first, then run `powershell -ExecutionPolicy Bypass -File build/scripts/douyin-expert-manual-launch.ps1`
-`douyin-expert-live-run.ps1` packages `workspace/douyin` into a zip-backed expert bundle, sends an experts-page prompt with a test image attachment, and validates that Douyin writes fresh preview artifacts such as `_latest_workflow_summary.json`, `video_request.json`, `storyboard.json`, and `omnihuman_prompt.txt` inside the synced project; `powershell -ExecutionPolicy Bypass -File build/scripts/douyin-expert-live-run.ps1`
- Remote project zip delivery and workspace-entry packaging rules are documented in `docs/remote-project-bundle-spec.zh-CN.md`
- Remote project zip delivery and workspace-entry packaging rules are documented in `docs/remote-project-bundle-spec.zh-CN.md`
-`default-chat-smoke.ps1` compiles the targeted `default-chat-context-smoke.ts` service-level smoke with the local desktop TypeScript toolchain and verifies `chat-fallback` routing, project context injection into the prepared prompt, post-execution snapshot refresh/rebind, and reuse of the refreshed snapshot on the next request; `pnpm smoke:default-chat`
-`default-chat-smoke.ps1` compiles the targeted `default-chat-context-smoke.ts` service-level smoke with the local desktop TypeScript toolchain and verifies `chat-fallback` routing, project context injection into the prepared prompt, post-execution snapshot refresh/rebind, and reuse of the refreshed snapshot on the next request; `pnpm smoke:default-chat`
-`installer-smoke.ps1` validates the packaged Python runtime by importing the preinstalled table/document/web dependencies from `resources/vendor/openclaw-runtime/python/python.exe`
-`installer-smoke.ps1` validates the packaged Python runtime by importing the preinstalled table/document/web dependencies from `resources/vendor/openclaw-runtime/python/python.exe`
if (!manifestRecord || typeof manifestRecord !== 'object') {
throw new Error('Bundle manifest does not contain douyin.');
}
if (String(manifestRecord.sourceUrl || '') !== expectedBundleSourceUrl) {
throw new Error('Unexpected bundle sourceUrl: ' + String(manifestRecord.sourceUrl || ''));
}
if (String(manifestRecord.configVersion || '') !== expectedBundleConfigVersion) {
throw new Error('Unexpected bundle configVersion: ' + String(manifestRecord.configVersion || ''));
}
if (String(manifestRecord.fileName || '') !== expectedBundleFileName) {
throw new Error('Unexpected bundle fileName: ' + String(manifestRecord.fileName || ''));
}
if (String(manifestRecord.sourceSkillId || '') !== expectedBundleSkillId) {
throw new Error('Unexpected bundle sourceSkillId: ' + String(manifestRecord.sourceSkillId || ''));
}
if (String(finalState.viewMode || '') !== 'experts') {
throw new Error('Smoke did not remain on experts view.');
}
if (String(sendResult.smokeViewMode || '') !== 'experts') {
throw new Error('Smoke request was not issued from experts mode.');
}
if (String(sendResult.smokeProjectId || '') !== 'douyin') {
throw new Error('Smoke request did not target the douyin expert.');
}
if (String(sendResult.prompt || '') !== expectedPrompt) {
throw new Error('Smoke prompt mismatch.');
}
if (String(workspaceSummary.currentProjectId || '') !== 'douyin') {
throw new Error('Final active project was not douyin: ' + String(workspaceSummary.currentProjectId || ''));
}
if (expertProjectIds.length !== expectedExpertIds.length || expertProjectIds.some((value, index) => value !== expectedExpertIds[index])) {
throw new Error('Expert list did not expose all expected projects. actual=' + JSON.stringify(expertProjectIds) + ' expected=' + JSON.stringify(expectedExpertIds));
}
if (nonHomeProjects.length < 3) {
throw new Error('Workspace summary did not expose at least three non-home projects.');
}
if (!String(sendResult.sessionId || '').startsWith('project:douyin:')) {
throw new Error('Expert smoke session did not bind to douyin: ' + String(sendResult.sessionId || ''));
if (String(streamSmoke.phase || '') !== 'completed' && !workspaceLaunchAccepted) {
throw new Error('Live run stream did not complete: ' + String(streamSmoke.phase || ''));
}
if (String(sendResult.selectedSkillId || streamSmoke.selectedSkillId || '')) {
throw new Error('Live run unexpectedly selected a skill instead of workspace-entry: ' + String(sendResult.selectedSkillId || streamSmoke.selectedSkillId || ''));
}
if (statusLabels.some((label) => label.includes('Routing to skill'))) {
throw new Error('Live run still routed through a skill: ' + JSON.stringify(statusLabels));
}
if (!workspaceLaunchAccepted) {
throw new Error('Live run did not expose a workspace-entry launch status: ' + JSON.stringify(statusLabels));
}
if (!assistantContent.includes(String(expectedStage || ''))) {
throw new Error('Assistant content did not report expected stage: ' + String(expectedStage || ''));
}
for (const requiredHint of ['video_request.json', 'storyboard.md', '_latest_workflow_summary.json']) {
if (!assistantContent.includes(requiredHint)) {
throw new Error('Assistant content did not expose required artifact hint: ' + requiredHint);
if (!reportedWorkspaceLabel && !(expectRemoteBundle === 'true' && reportedSkillRouteLabel)) {
if (!reportedWorkspaceLabel && !(expectRemoteBundle === 'true' && reportedSkillRouteLabel)) {
throw new Error('Workspace-entry smoke did not report a workspace or routed-skill status label. history=' + JSON.stringify(statusLabels) + ' latest=' + latestStatusLabel);
throw new Error('Workspace-entry smoke did not report a workspace or routed-skill status label. history=' + JSON.stringify(statusLabels) + ' latest=' + latestStatusLabel);
}
}
if (!assistantContent.includes('desktop project-isolated workspace')) {
if (!workspaceLaunchAccepted && !assistantContent.includes('desktop project-isolated workspace')) {
throw new Error('Workspace-entry smoke did not echo the injected isolated workspace context.');
throw new Error('Workspace-entry smoke did not echo the injected isolated workspace context.');
Assert-Condition ([bool]$diagnostic.ok)'XHS provider diagnostic smoke did not resolve the injected image provider.'
Assert-Condition ([string]$diagnostic.provider -eq $xhsImageProviderConfig.providerName)'XHS provider diagnostic smoke did not pick the configured provider.'
Assert-Condition ([string]$diagnostic.model -eq $xhsImageProviderConfig.modelId)'XHS provider diagnostic smoke did not pick the configured model.'
Assert-Condition ([string]$diagnostic.api_url -eq 'https://ark.cn-beijing.volces.com/api/v3/images/generations')'XHS provider diagnostic smoke produced an unexpected image API URL.'
Assert-Condition ([string]$textProviderResult.provider -eq $xhsTextProviderConfig.providerName)'XHS text-provider smoke did not prefer the configured local text provider over openclaw-cloud.'
Assert-Condition ([string]$textProviderResult.text_model -eq $xhsTextProviderConfig.modelId)'XHS text-provider smoke did not pick qwen3.5-plus as text model.'
Assert-Condition ([string]$envProviderResult.text_base_url -eq [string]$xhsTextProviderConfig.providers.qwen.baseUrl)'XHS env-provider smoke did not wire QWEN_BASE_URL.'
Assert-Condition ([string]$envProviderResult.text_model -eq $xhsTextProviderConfig.modelId)'XHS env-provider smoke did not wire QWEN_MODEL.'
Assert-Condition ([string]$envProviderResult.image_provider -eq $xhsImageProviderConfig.providerName)'XHS env-provider smoke did not prefer the direct image env provider.'
Assert-Condition ([string]$envProviderResult.image_base_url -eq [string]$xhsImageProviderConfig.providers.volces.baseUrl)'XHS env-provider smoke did not wire XHS_IMAGE_BASE_URL.'
Assert-Condition ([string]$envProviderResult.image_model -eq $xhsImageProviderConfig.modelId)'XHS env-provider smoke did not wire XHS_IMAGE_MODEL.'
Assert-Condition ([bool]$noteExportResult.markdown_exists)'XHS note export smoke did not create the markdown note.'
Assert-Condition ([bool]$noteExportResult.text_exists)'XHS note export smoke did not create the text note.'
Assert-Condition ([bool]$noteExportResult.markdown_has_title)'XHS note export smoke did not render markdown content.'
Assert-Condition ([bool]$noteExportResult.text_has_draft)'XHS note export smoke did not render text content.'
Assert-Condition ([string]$noteExportResult.latest_has_markdown_path -eq [string]$noteExportResult.markdown_path)'XHS note export smoke did not persist markdown path to latest note.'
Assert-Condition ([string]$noteExportResult.latest_has_text_path -eq [string]$noteExportResult.text_path)'XHS note export smoke did not persist text path to latest note.'
Assert-Condition ($runScriptText.Contains($xhsAnalysisFallbackLog))'XHS local package smoke did not preserve the readable pure-text analysis fallback log.'
Assert-Condition ($fullPromptContent.Contains($completedPrefix))'Douyin fully specified preview smoke did not execute immediately.'
Assert-Condition (-not $fullPromptContent.Contains($askVideoType))'Douyin fully specified preview smoke still asked for video type.'
Assert-Condition ($fullPromptContent.Contains($projectDirLabel))'Douyin fully specified preview smoke did not surface the project directory.'
Assert-Condition ($fullPromptContent.Contains($videoRequestLabel))'Douyin fully specified preview smoke did not surface the video request file.'
Assert-Condition ($fullPromptContent.Contains($storyboardMarkdownLabel))'Douyin fully specified preview smoke did not surface the storyboard markdown file.'