@aswless_854771076/ai_short_studio_cli 0.1.0-beta.0 → 0.1.0

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
@@ -1,42 +1,53 @@
1
- # @vvicat/ai_short_studio_cli
1
+ # AI Short Studio CLI
2
2
 
3
3
  VVICAT 新链路无限画布的官方命令行客户端。要求 Node.js 22 或更高版本。
4
4
 
5
5
  ```bash
6
6
  npm install --global @vvicat/ai_short_studio_cli
7
- vvicat auth login --google
8
- vvicat project list --json
9
- vvicat canvas node types --json
7
+ ai-short-studio auth login --google \
8
+ --base-url https://vvicat.example.com \
9
+ --supabase-url https://your-project.supabase.co \
10
+ --supabase-publishable-key your-publishable-key
11
+ ai-short-studio project list --json
12
+ ai-short-studio canvas node types --json
10
13
  ```
11
14
 
12
15
  邮箱登录从 stdin 读取密码:
13
16
 
14
17
  ```bash
15
- vvicat auth login --email user@example.com --password-stdin
18
+ ai-short-studio auth login --email user@example.com --password-stdin
16
19
  ```
17
20
 
18
- CLI 只把 refresh token 保存到系统钥匙串,access token 仅驻留内存并在到期前自动刷新。服务地址和非敏感 profile 写入系统配置目录;可使用 `--profile`、`--base-url` 或 `VVICAT_BASE_URL` 切换环境。
21
+ CLI 只把 refresh token 保存到系统钥匙串,access token 仅驻留内存并在到期前自动刷新。首次登录通过参数或 `VVICAT_SUPABASE_URL`、`VVICAT_SUPABASE_PUBLISHABLE_KEY` 提供 Supabase 公共配置。服务地址和非敏感 profile 写入系统配置目录;可使用 `--profile`、`--base-url` 或 `VVICAT_BASE_URL` 切换环境。
19
22
 
20
23
  ## 命令范围
21
24
 
22
- - `vvicat project`:无限画布项目增删改查。
23
- - `vvicat canvas get|apply`:读取或批量更新画布。
24
- - `vvicat canvas node`:节点类型/schema 查询、节点读写、执行。
25
- - `vvicat canvas edge`:连线读写。
26
- - `vvicat canvas asset`:资产列表、上传、版本选择和下载。
27
- - `vvicat task`:异步任务读取、等待和取消。
28
- - `vvicat config`:模型、provider、默认模型、能力默认值和并发配置。
25
+ - `ai-short-studio project`:无限画布项目增删改查。
26
+ - `ai-short-studio canvas get|apply`:读取或批量更新画布。
27
+ - `ai-short-studio canvas node`:节点类型/schema 查询、节点读写、执行。
28
+ - `ai-short-studio canvas edge`:连线读写。
29
+ - `ai-short-studio canvas asset`:资产列表、上传、版本选择和下载。
30
+ - `ai-short-studio task`:异步任务读取、等待和取消。
31
+ - `ai-short-studio config`:模型、provider、默认模型、能力默认值和并发配置。
29
32
 
30
- 运行 `vvicat <topic> --help` 查看精确参数。所有结构化响应保持 JSON;API 错误也返回稳定的 `error.code`、`status`、`retryable` 和 `details`。
33
+ ```bash
34
+ ai-short-studio canvas edge add --project <projectId> --from <sourceNodeId>:<sourceHandle> --to <targetNodeId>:<targetHandle> --json
35
+ ai-short-studio canvas edge delete <edgeId> --project <projectId> --yes --json
36
+ ai-short-studio canvas asset select-version <assetId> --project <projectId> --version <versionId> --json
37
+ ```
38
+
39
+ CLI 直接使用现有 `/api/projects`、`/api/canvas/node-types`、项目画布与资产路由,不要求服务端额外提供版本化包装接口。
40
+
41
+ 运行 `ai-short-studio <topic> --help` 查看精确参数。可执行命令使用完整产品名 `ai-short-studio`,同时避免与其他 CLI 冲突。所有结构化响应保持 JSON;API 错误也返回稳定的 `error.code`、`status`、`retryable` 和 `details`。
31
42
 
32
43
  退出码:`0` 成功,`3` 未认证,`4` 不存在,`5` 禁止或冲突,`6` 参数错误,`7` 其他错误。
33
44
 
34
45
  配套 Agent Skill 位于 `skills/using-vvicat-cli`,随 npm 包发布。
35
46
 
36
47
  ```bash
37
- vvicat skill install --target codex
38
- vvicat skill status --target codex
39
- vvicat skill update --target codex
48
+ ai-short-studio skill install --target codex
49
+ ai-short-studio skill status --target codex
50
+ ai-short-studio skill update --target codex
40
51
  ```
41
52
 
42
53
  也可使用 `--target agents` 或 `--directory <path>`。CLI 会记录版本和 SHA-256;已安装 Skill 被用户修改后,更新默认停止,只有显式 `--force` 才覆盖。
@@ -54,3 +65,27 @@ npm run release
54
65
  ```
55
66
 
56
67
  Token 只从环境变量读取,不要放入参数、Git 或日志。
68
+
69
+ Docker 自动发布使用 `.env` 中的 `NPM_PUBLISH_PACKAGE_NAME` 选择目标;当前默认个人包为 `@aswless_854771076/ai_short_studio_cli`,获得组织权限后可改为 `@vvicat/ai_short_studio_cli`。`latest` 不会自动升级已安装的全局 CLI,手动更新使用:
70
+
71
+ ```bash
72
+ npm install --global @aswless_854771076/ai_short_studio_cli@latest
73
+ ```
74
+
75
+ ### 云效 Flow
76
+
77
+ 选择云效托管构建集群和 Node.js 22,将 npm Granular Access Token 保存为加密变量 `NPM_ACCESS_TOKEN`。正式发布流水线建议仅由 `cli-v*` Tag 触发:
78
+
79
+ ```bash
80
+ export NODE_AUTH_TOKEN="$NPM_ACCESS_TOKEN"
81
+ cd packages/ai_short_studio_cli
82
+ npm run release:ci
83
+ ```
84
+
85
+ 个人账号 beta 测试使用:
86
+
87
+ ```bash
88
+ npm run release:ci:test -- --version 0.1.1-beta.0
89
+ ```
90
+
91
+ `release:ci` 会依次运行测试和类型检查、发布 npm、等待 registry 可见,再从 npm 安装该精确版本并验证 CLI 与配套 Skill。无需配置自有 Runner;只有访问内网或需要固定出口 IP 时才使用自有构建集群。
@@ -92,7 +92,7 @@ export class SessionManager {
92
92
  async refresh() {
93
93
  const refreshToken = await this.credentials.get(this.profile);
94
94
  if (!refreshToken)
95
- throw new Error('尚未登录,请先运行 vvicat auth login');
95
+ throw new Error('尚未登录,请先运行 ai-short-studio auth login');
96
96
  this.current = await this.provider.refresh(refreshToken);
97
97
  await this.credentials.set(this.profile, this.current.refreshToken);
98
98
  return this.current.accessToken;
@@ -5,6 +5,8 @@ export default class AuthLogin extends BaseCommand {
5
5
  email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
6
  google: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
7
  'password-stdin': import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ 'supabase-publishable-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ 'supabase-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
10
  'base-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
11
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
12
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
@@ -9,6 +9,8 @@ export default class AuthLogin extends BaseCommand {
9
9
  email: Flags.string({ description: '登录邮箱' }),
10
10
  google: Flags.boolean({ description: '通过浏览器使用 Google 登录', default: false }),
11
11
  'password-stdin': Flags.boolean({ description: '从标准输入读取密码', default: false }),
12
+ 'supabase-publishable-key': Flags.string({ description: 'Supabase publishable key', env: 'VVICAT_SUPABASE_PUBLISHABLE_KEY' }),
13
+ 'supabase-url': Flags.string({ description: 'Supabase URL', env: 'VVICAT_SUPABASE_URL' }),
12
14
  };
13
15
  async run() {
14
16
  const { flags } = await this.parse(AuthLogin);
@@ -0,0 +1 @@
1
+ export { default } from './select.js';
@@ -0,0 +1 @@
1
+ export { default } from './select.js';
@@ -0,0 +1 @@
1
+ export { default } from './connect.js';
@@ -0,0 +1 @@
1
+ export { default } from './connect.js';
@@ -0,0 +1 @@
1
+ export { default } from './disconnect.js';
@@ -0,0 +1 @@
1
+ export { default } from './disconnect.js';
@@ -42,7 +42,7 @@ export class VvicatApi {
42
42
  return this.client.request(`/api/projects/${projectId}/canvas`, { method: 'PATCH', body: input });
43
43
  }
44
44
  async nodeTypes() {
45
- const payload = await this.client.request('/api/v1/canvas/node-types');
45
+ const payload = await this.client.request('/api/canvas/node-types');
46
46
  return payload.data;
47
47
  }
48
48
  async addNode(projectId, input) {
package/dist/runtime.d.ts CHANGED
@@ -5,6 +5,8 @@ interface RuntimeFlags {
5
5
  'base-url'?: string;
6
6
  locale?: string;
7
7
  profile?: string;
8
+ 'supabase-publishable-key'?: string;
9
+ 'supabase-url'?: string;
8
10
  }
9
11
  export declare function createRuntime(flags: RuntimeFlags): Promise<{
10
12
  profile: CliProfile;
package/dist/runtime.js CHANGED
@@ -8,11 +8,11 @@ export async function createRuntime(flags) {
8
8
  const baseUrl = (flags['base-url'] || process.env.VVICAT_BASE_URL || selected?.baseUrl || '').replace(/\/+$/, '');
9
9
  if (!baseUrl)
10
10
  throw new Error('缺少服务地址,请传入 --base-url 或设置 VVICAT_BASE_URL');
11
- const profile = await ensureAuthConfig({
11
+ const profile = ensureAuthConfig({
12
12
  ...selected,
13
13
  name: flags.profile || selected?.name || 'default',
14
14
  baseUrl,
15
- });
15
+ }, flags);
16
16
  await profiles.save(profile);
17
17
  const session = new SessionManager({
18
18
  profile: profile.name,
@@ -25,21 +25,22 @@ export async function createRuntime(flags) {
25
25
  client: new ApiClient({ baseUrl, session, locale: flags.locale }),
26
26
  };
27
27
  }
28
- async function ensureAuthConfig(profile) {
29
- if (profile.supabaseUrl && profile.supabasePublishableKey)
30
- return profile;
31
- const response = await fetch(`${profile.baseUrl}/api/v1/bootstrap`, {
32
- headers: { accept: 'application/json' },
33
- });
34
- if (!response.ok)
35
- throw new Error(`无法读取 CLI 引导配置:HTTP ${response.status}`);
36
- const payload = await response.json();
37
- if (payload.data?.auth?.provider !== 'supabase' || !payload.data.auth.url || !payload.data.auth.publishableKey) {
38
- throw new Error('CLI 引导配置缺少 Supabase 参数');
28
+ function ensureAuthConfig(profile, flags) {
29
+ const supabaseUrl = flags['supabase-url']
30
+ || process.env.VVICAT_SUPABASE_URL
31
+ || process.env.NEXT_PUBLIC_SUPABASE_URL
32
+ || profile.supabaseUrl;
33
+ const supabasePublishableKey = flags['supabase-publishable-key']
34
+ || process.env.VVICAT_SUPABASE_PUBLISHABLE_KEY
35
+ || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
36
+ || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
37
+ || profile.supabasePublishableKey;
38
+ if (!supabaseUrl || !supabasePublishableKey) {
39
+ throw new Error('缺少 Supabase 公共配置;登录时传入 --supabase-url 和 --supabase-publishable-key,或设置对应的 VVICAT_ 环境变量');
39
40
  }
40
41
  return {
41
42
  ...profile,
42
- supabaseUrl: payload.data.auth.url,
43
- supabasePublishableKey: payload.data.auth.publishableKey,
43
+ supabaseUrl,
44
+ supabasePublishableKey,
44
45
  };
45
46
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aswless_854771076/ai_short_studio_cli",
3
- "version": "0.1.0-beta.0",
3
+ "version": "0.1.0",
4
4
  "description": "VVICAT 无限画布项目命令行工具",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "type": "module",
18
18
  "bin": {
19
- "vvicat": "bin/run.js"
19
+ "ai-short-studio": "bin/run.js"
20
20
  },
21
21
  "files": [
22
22
  "bin",
@@ -32,6 +32,8 @@
32
32
  "prepack": "npm run build",
33
33
  "release:dry-run": "node scripts/publish.mjs --dry-run",
34
34
  "release:test": "node scripts/publish.mjs --name @aswless_854771076/ai_short_studio_cli --tag beta",
35
+ "release:ci:test": "npm test && npm run typecheck && node scripts/publish.mjs --name @aswless_854771076/ai_short_studio_cli --tag beta --verify",
36
+ "release:ci": "npm test && npm run typecheck && node scripts/publish.mjs --tag latest --verify",
35
37
  "release": "node scripts/publish.mjs --tag latest",
36
38
  "test": "vitest run",
37
39
  "typecheck": "tsc -p tsconfig.json --noEmit"
@@ -47,7 +49,7 @@
47
49
  "vitest": "^2.1.9"
48
50
  },
49
51
  "oclif": {
50
- "bin": "vvicat",
52
+ "bin": "ai-short-studio",
51
53
  "dirname": "vvicat",
52
54
  "commands": "./dist/commands",
53
55
  "topicSeparator": " "
@@ -1,26 +1,35 @@
1
1
  ---
2
2
  name: using-vvicat-cli
3
- description: Use when an agent needs to inspect or operate VVICAT infinite-canvas projects, nodes, edges, assets, tasks, or model configuration through the vvicat CLI.
3
+ description: Use when an agent needs to inspect or operate VVICAT infinite-canvas projects, nodes, edges, assets, tasks, or model configuration through the ai-short-studio CLI.
4
4
  ---
5
5
 
6
6
  # 使用 VVICAT CLI
7
7
 
8
8
  ## 核心原则
9
9
 
10
- 把 `vvicat` 当作机器可读的远程控制接口。先读取服务端节点目录和实时画布,再构造写操作;不要猜测节点类型、端口或数据结构。
10
+ 把 `ai-short-studio` 当作机器可读的远程控制接口。认证后首先拉取服务端节点目录,先了解当前有哪些功能节点,再检查模型和项目配置。任何必要配置不完整或信息不确定时,先询问用户,不猜测、不执行写操作。
11
+
12
+ ## 初始化检查
13
+
14
+ 认证成功后、创建项目或修改任何资源前,按顺序执行:
15
+
16
+ 1. 运行 `ai-short-studio canvas node types --json`,检查节点列表及各节点的 `inputSchema`、`outputSchema`、`configSchema` 和 `defaultConfig`,据此确定可用功能与必填项。
17
+ 2. 运行 `ai-short-studio config get --json`,检查本次会用到的 `providers`、`models`、`defaultModels` 和 `capabilityDefaults`,包括 provider 的 `hasApiKey` 是否为真。需要新配置模型时,首选公司的 [StarRouter](https://starrouter.io/);需开通账号时联系邱茂。
18
+ 3. 运行 `ai-short-studio project list --json`。已有项目再运行 `ai-short-studio project get <projectId> --json` 和 `ai-short-studio canvas get --project <projectId> --json`,检查项目类型、目标项目、画布现状及节点必需输入;新项目则确认名称、用途和节点所需业务参数。
19
+ 4. 上述配置缺失、相互矛盾、无法判定是否适用,或用户意图存在任何不确定时,合并列出缺口并询问用户;得到答复前停在只读检查。
11
20
 
12
21
  ## 工作流
13
22
 
14
- 1. 运行 `vvicat auth status --json`。未登录时优先运行 `vvicat auth login --google`;非交互环境才通过 stdin 传密码。
15
- 若 Skill 来自 CLI 安装,先运行 `vvicat skill status --json`;`current` 为 false 时提示用户运行 `vvicat skill update`。
16
- 2. 运行 `vvicat project list --json`,确认目标是 `INFINITE_CANVAS`。创建测试项目时使用唯一前缀,并记录项目 ID。
17
- 3. 操作节点前运行 `vvicat canvas node types --json`。严格按返回的 `inputSchema`、`outputSchema`、`configSchema` 和 `defaultConfig` 构造数据。
18
- 4. 写入前运行 `vvicat canvas get --project <id> --json` 获取当前结构;优先使用专用 node/edge 命令,批量变更才用 `canvas apply`。
19
- 5. 执行节点后读取返回的任务 ID,并用 `vvicat task wait <taskId> --json` 等待终态。不要使用固定时长 sleep。
23
+ 1. 运行 `ai-short-studio auth status --json`。首次登录通过参数或 `VVICAT_BASE_URL`、`VVICAT_SUPABASE_URL`、`VVICAT_SUPABASE_PUBLISHABLE_KEY` 提供服务和 Supabase 公共配置,再运行 `ai-short-studio auth login --google`;非交互环境才通过 stdin 传密码。
24
+ 若 Skill 来自 CLI 安装,先运行 `ai-short-studio skill status --json`;`current` 为 false 时提示用户运行 `ai-short-studio skill update`。
25
+ 2. 完成上述初始化检查。确认目标项目是 `INFINITE_CANVAS`;创建测试项目时使用唯一前缀,并记录项目 ID。
26
+ 3. 严格按节点目录返回的 schema 和默认配置构造数据。
27
+ 4. 写入前运行 `ai-short-studio canvas get --project <id> --json` 获取当前结构;优先使用专用 node/edge 命令,批量变更才用 `canvas apply`。
28
+ 5. 执行节点后读取返回的任务 ID,并用 `ai-short-studio task wait <taskId> --json` 等待终态。不要使用固定时长 sleep。
20
29
  6. 下载前读取资产及所选版本,再使用 `canvas asset download` 写入明确目录。
21
- 7. 对临时项目始终在结束路径中执行 `vvicat project delete <id> --yes`,包括命令失败时。
30
+ 7. 对临时项目始终在结束路径中执行 `ai-short-studio project delete <id> --yes`,包括命令失败时。
22
31
 
23
- 详细命令按需读取 [references/commands.md](references/commands.md),或运行 `vvicat <topic> --help`。
32
+ 详细命令按需读取 [references/commands.md](references/commands.md),或运行 `ai-short-studio <topic> --help`。
24
33
 
25
34
  ## 安全边界
26
35
 
@@ -33,10 +42,10 @@ description: Use when an agent needs to inspect or operate VVICAT infinite-canva
33
42
  ## 示例
34
43
 
35
44
  ```bash
36
- vvicat canvas node types --json
37
- vvicat project create --name "agent-draft-20260722" --json
38
- vvicat canvas node add text --project "$PROJECT_ID" --config ./node.json --json
39
- vvicat canvas node list --project "$PROJECT_ID" --json
45
+ ai-short-studio canvas node types --json
46
+ ai-short-studio project create --name "agent-draft-20260722" --json
47
+ ai-short-studio canvas node add text --project "$PROJECT_ID" --config ./node.json --json
48
+ ai-short-studio canvas node list --project "$PROJECT_ID" --json
40
49
  ```
41
50
 
42
51
  从 JSON 输出中取得真实 ID;示例中的环境变量仅表示调用方已安全解析并保存结果。
@@ -44,6 +53,7 @@ vvicat canvas node list --project "$PROJECT_ID" --json
44
53
  ## 常见错误
45
54
 
46
55
  - 节点类型写死:先读 `canvas node types`,服务端目录才是事实来源。
56
+ - 配置不全仍继续:先做初始化检查;模型、项目或用户意图有缺口时先询问。
47
57
  - 只检查任务创建响应:必须 `task wait` 并检查终态和错误字段。
48
58
  - 下载列表中的任意 URL:先确认资产的 selected version,再下载。
49
59
  - 测试创建资源但未清理:用调用方的 `finally`/trap 删除唯一前缀项目。
@@ -5,10 +5,10 @@
5
5
  ## Skill 管理
6
6
 
7
7
  ```bash
8
- vvicat skill path --json
9
- vvicat skill install --target codex --json
10
- vvicat skill status --target codex --json
11
- vvicat skill update --target codex --json
8
+ ai-short-studio skill path --json
9
+ ai-short-studio skill install --target codex --json
10
+ ai-short-studio skill status --target codex --json
11
+ ai-short-studio skill update --target codex --json
12
12
  ```
13
13
 
14
14
  `--target agents` 安装到 `~/.agents/skills`,`--directory` 可指定其他目录。更新不会覆盖用户修改,除非显式传入 `--force`。
@@ -16,10 +16,10 @@ vvicat skill update --target codex --json
16
16
  ## 认证
17
17
 
18
18
  ```bash
19
- vvicat auth login --google
20
- vvicat auth login --email user@example.com --password-stdin
21
- vvicat auth status --json
22
- vvicat auth logout
19
+ ai-short-studio auth login --google --base-url <url> --supabase-url <url> --supabase-publishable-key <key>
20
+ ai-short-studio auth login --email user@example.com --password-stdin --base-url <url> --supabase-url <url> --supabase-publishable-key <key>
21
+ ai-short-studio auth status --json
22
+ ai-short-studio auth logout
23
23
  ```
24
24
 
25
25
  Google 登录会打开浏览器并通过本机环回地址完成 PKCE 回调。
@@ -27,11 +27,11 @@ Google 登录会打开浏览器并通过本机环回地址完成 PKCE 回调。
27
27
  ## 项目
28
28
 
29
29
  ```bash
30
- vvicat project list --json
31
- vvicat project get <projectId> --json
32
- vvicat project create --name <name> [--description <text>] --json
33
- vvicat project update <projectId> [--name <name>] [--description <text>] --json
34
- vvicat project delete <projectId> --yes --json
30
+ ai-short-studio project list --json
31
+ ai-short-studio project get <projectId> --json
32
+ ai-short-studio project create --name <name> [--description <text>] --json
33
+ ai-short-studio project update <projectId> [--name <name>] [--description <text>] --json
34
+ ai-short-studio project delete <projectId> --yes --json
35
35
  ```
36
36
 
37
37
  创建操作固定写入 `INFINITE_CANVAS`;列表也只返回该类型。
@@ -39,15 +39,15 @@ vvicat project delete <projectId> --yes --json
39
39
  ## 画布和节点
40
40
 
41
41
  ```bash
42
- vvicat canvas get --project <projectId> --json
43
- vvicat canvas apply --project <projectId> --file <patch.json> --json
44
- vvicat canvas node types --json
45
- vvicat canvas node list --project <projectId> --json
46
- vvicat canvas node get <nodeId> --project <projectId> --json
47
- vvicat canvas node add <kind> --project <projectId> [--x N] [--y N] [--title <text>] [--config <config.json>] --json
48
- vvicat canvas node update <nodeId> --project <projectId> --config <config.json> --json
49
- vvicat canvas node delete <nodeId> --project <projectId> --yes --json
50
- vvicat canvas node run <nodeId> --project <projectId> --json
42
+ ai-short-studio canvas get --project <projectId> --json
43
+ ai-short-studio canvas apply --project <projectId> --file <patch.json> --json
44
+ ai-short-studio canvas node types --json
45
+ ai-short-studio canvas node list --project <projectId> --json
46
+ ai-short-studio canvas node get <nodeId> --project <projectId> --json
47
+ ai-short-studio canvas node add <kind> --project <projectId> [--x N] [--y N] [--title <text>] [--config <config.json>] --json
48
+ ai-short-studio canvas node update <nodeId> --project <projectId> --config <config.json> --json
49
+ ai-short-studio canvas node delete <nodeId> --project <projectId> --yes --json
50
+ ai-short-studio canvas node run <nodeId> --project <projectId> --json
51
51
  ```
52
52
 
53
53
  `canvas apply` 的 JSON 可以通过 `--file` 读取;省略文件时从 stdin 读取。提交批量变更时携带最近读取到的 `canvasId` 与 `expectedVersion`。
@@ -55,9 +55,9 @@ vvicat canvas node run <nodeId> --project <projectId> --json
55
55
  ## 连线
56
56
 
57
57
  ```bash
58
- vvicat canvas edge list --project <projectId> --json
59
- vvicat canvas edge connect --project <projectId> --source-node <id> --source-handle <name> --target-node <id> --target-handle <name> --json
60
- vvicat canvas edge disconnect <edgeId> --project <projectId> --yes --json
58
+ ai-short-studio canvas edge list --project <projectId> --json
59
+ ai-short-studio canvas edge add --project <projectId> --from <sourceNodeId>:<sourceHandle> --to <targetNodeId>:<targetHandle> --json
60
+ ai-short-studio canvas edge delete <edgeId> --project <projectId> --yes --json
61
61
  ```
62
62
 
63
63
  handle 名称来自节点类型目录中的输入输出 schema,不要自行推断。
@@ -65,26 +65,26 @@ handle 名称来自节点类型目录中的输入输出 schema,不要自行推
65
65
  ## 资产与下载
66
66
 
67
67
  ```bash
68
- vvicat canvas asset list --project <projectId> --json
69
- vvicat canvas asset get <assetId> --project <projectId> --json
70
- vvicat canvas asset upload <file> --project <projectId> --json
71
- vvicat canvas asset select <assetId> <versionId> --project <projectId> --json
72
- vvicat canvas asset download <assetId> --project <projectId> --output <directory>
68
+ ai-short-studio canvas asset list --project <projectId> --json
69
+ ai-short-studio canvas asset get <assetId> --project <projectId> --json
70
+ ai-short-studio canvas asset upload <file> --project <projectId> --json
71
+ ai-short-studio canvas asset select-version <assetId> --version <versionId> --project <projectId> --json
72
+ ai-short-studio canvas asset download <assetId> --project <projectId> --output <directory>
73
73
  ```
74
74
 
75
75
  ## 异步任务
76
76
 
77
77
  ```bash
78
- vvicat task get <taskId> --json
79
- vvicat task wait <taskId> [--interval 1000] --json
80
- vvicat task cancel <taskId> --yes --json
78
+ ai-short-studio task get <taskId> --json
79
+ ai-short-studio task wait <taskId> [--interval 1000] --json
80
+ ai-short-studio task cancel <taskId> --yes --json
81
81
  ```
82
82
 
83
83
  ## 模型配置
84
84
 
85
85
  ```bash
86
- vvicat config get --json
87
- vvicat config set --file <config.json> --json
86
+ ai-short-studio config get --json
87
+ ai-short-studio config set --file <config.json> --json
88
88
  ```
89
89
 
90
90
  `config set` 接受 `models`、`providers`、`defaultModels`、`capabilityDefaults`、`workflowConcurrency` 的部分对象。provider 的 `apiKey` 缺省时保留现有密钥,空字符串表示清除;敏感配置文件不要提交到版本库。