diff --git a/docs/agents/branch-merge-review.md b/docs/agents/branch-merge-review.md
index de1ba35..de20765 100644
--- a/docs/agents/branch-merge-review.md
+++ b/docs/agents/branch-merge-review.md
@@ -58,7 +58,7 @@ git diff --name-only ...
- [README.md](README.md) + [README_CN.md](README_CN.md)(中英文都要,常漏 `_CN`)
- (SKILL.md 已迁出本仓库,由 `npx add skills` 机制独立维护,不在本仓库 review 范围)
- [ ] **`bl --help`** 文案完整:`description` / `examples` / `apiDocs` 都填了
-- [ ] **demo / quickstart**:用户可调用的新命令至少有一个示例(参考 [packages/cli/scene/](packages/cli/scene/) 的组织方式)
+- [ ] **demo / quickstart**:用户可调用的新命令至少有一个示例
- [ ] **行为变化的老命令**:在 commit message / CHANGELOG 注明用户感知的差异
- [ ] **错误信息 / 提示文案**:面向用户的字符串通顺、双语(项目主体是中文场景)
diff --git a/packages/cli/tests/e2e/pipeline.e2e.test.ts b/packages/cli/tests/e2e/pipeline.e2e.test.ts
index ff49caf..d2141d5 100644
--- a/packages/cli/tests/e2e/pipeline.e2e.test.ts
+++ b/packages/cli/tests/e2e/pipeline.e2e.test.ts
@@ -2,39 +2,41 @@ import { afterAll, beforeAll, describe, expect, test } from "vite-plus/test";
import { mkdtemp, rm, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
-import { cliPackageRoot, parseStdoutJson, runCli } from "./helpers.ts";
-
-const DEMO_WORKFLOWS = [
- "chat-basic.json",
- "chained-text.json",
- "chained-text.yaml",
- "image-generate.json",
- "image-gen/image-gen-workflow.json",
- "image-to-video.json",
- "image2video/lego/lego-build-sequence.json",
- "image2video/nine-grid-storyboard.json",
- "image2video/virtual-tryon/virtual-tryon-workflow.json",
- "logic-nodes.json",
- "commerce/amazon-listing/amazon-listing-workflow.json",
- "commerce/audio-meeting-summary/workflow.json",
- "commerce/cool-background/cool-background-workflow.json",
- "commerce/dress-on-model/dress-on-model-workflow.json",
- "commerce/flatlay/flatlay-workflow.json",
- "commerce/poster-i18n/poster-i18n-workflow.json",
- "commerce/scatter-flatlay/scatter-flatlay-workflow.json",
- "commerce/six-view-product/six-view-workflow.json",
- "commerce/valentine-marketing/valentine-marketing-workflow.json",
-];
+import { parseStdoutJson, runCli } from "./helpers.ts";
describe("e2e: pipeline", () => {
let tempDir: string;
+ let chatBasicPath: string;
let invalidPipelinePath: string;
- const sceneRoot = join(cliPackageRoot, "scene");
- const scenePipelinePath = join(sceneRoot, "chat-basic.json");
-
beforeAll(async () => {
tempDir = await mkdtemp(join(tmpdir(), "bailian-cli-pipeline-"));
+ chatBasicPath = join(tempDir, "chat-basic.json");
+ await writeFile(
+ chatBasicPath,
+ JSON.stringify({
+ version: "workflow/v1",
+ inputs: {
+ type: "object",
+ properties: {
+ message: { type: "string", default: "Hello from the demo pipeline." },
+ },
+ additionalProperties: false,
+ },
+ steps: [
+ {
+ id: "chat",
+ type: "text/chat",
+ input: {
+ message: { $input: "/message" },
+ system: "You are a concise assistant for pipeline demos.",
+ temperature: 0.2,
+ },
+ },
+ ],
+ }),
+ );
+
invalidPipelinePath = join(tempDir, "invalid-dependency-pipeline.json");
await writeFile(
invalidPipelinePath,
@@ -83,11 +85,11 @@ describe("e2e: pipeline", () => {
expect(stderr).toMatch(/pipeline validate|workflow\.json|output json/i);
});
- test("pipeline validate --output json 校验 scene workflow", async () => {
+ test("pipeline validate --output json 校验合法 workflow", async () => {
const { stdout, stderr, exitCode } = await runCli([
"pipeline",
"validate",
- scenePipelinePath,
+ chatBasicPath,
"--output",
"json",
]);
@@ -98,28 +100,13 @@ describe("e2e: pipeline", () => {
});
test("pipeline validate 使用 config 输出格式", async () => {
- const { stdout, stderr, exitCode } = await runCli(["pipeline", "validate", scenePipelinePath], {
+ const { stdout, stderr, exitCode } = await runCli(["pipeline", "validate", chatBasicPath], {
DASHSCOPE_OUTPUT: "text",
});
expect(exitCode, stderr).toBe(0);
expect(stdout).toBe("Pipeline definition is valid.\n");
});
- test("pipeline validate --output json 校验迁移后的全部 scene workflows", async () => {
- for (const workflow of DEMO_WORKFLOWS) {
- const { stdout, stderr, exitCode } = await runCli([
- "pipeline",
- "validate",
- join(sceneRoot, workflow),
- "--output",
- "json",
- ]);
- expect(exitCode, `${workflow}\n${stderr}`).toBe(0);
- const data = parseStdoutJson<{ valid?: boolean; issues?: string[] }>(stdout);
- expect(data, workflow).toEqual({ valid: true, issues: [] });
- }
- });
-
test("pipeline validate 拒绝非法依赖 workflow", async () => {
const { stdout, stderr, exitCode } = await runCli([
"pipeline",
@@ -145,7 +132,7 @@ describe("e2e: pipeline", () => {
const { stdout, stderr, exitCode } = await runCli([
"pipeline",
"run",
- scenePipelinePath,
+ chatBasicPath,
"--input",
'{"message":"hello"}',
"--dry-run",
@@ -179,7 +166,7 @@ describe("e2e: pipeline", () => {
[
"pipeline",
"run",
- scenePipelinePath,
+ chatBasicPath,
"--input",
'{"message":"hello"}',
"--dry-run",
@@ -196,7 +183,7 @@ describe("e2e: pipeline", () => {
const { stderr, exitCode } = await runCli([
"pipeline",
"run",
- scenePipelinePath,
+ chatBasicPath,
"--input",
'{"message":"hello"}',
"--dry-run",
@@ -212,7 +199,7 @@ describe("e2e: pipeline", () => {
const { stdout, stderr, exitCode } = await runCli([
"pipeline",
"run",
- scenePipelinePath,
+ chatBasicPath,
"--input",
'{"message":"hello"}',
"--dry-run",
@@ -240,7 +227,7 @@ describe("e2e: pipeline", () => {
const { stdout, stderr, exitCode } = await runCli([
"pipeline",
"run",
- scenePipelinePath,
+ chatBasicPath,
"--dry-run",
"--events",
"bogus",