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",