@lovrabet/lovrabet-cli 2.1.23 → 2.2.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 +13 -10
- package/lib/cli.js +1 -1
- package/lib/commands/api-doc/index.js +1 -1
- package/lib/commands/app/cache.js +1 -1
- package/lib/commands/app/definitions.js +1 -1
- package/lib/commands/app/eligibility.js +1 -1
- package/lib/commands/app/mock-loader.js +1 -1
- package/lib/commands/app/remote-source.js +1 -1
- package/lib/commands/app/shared.js +1 -1
- package/lib/commands/app-config/get.js +1 -1
- package/lib/commands/app-config/index.js +1 -1
- package/lib/commands/artifact/index.js +1 -1
- package/lib/commands/auth/device.js +1 -1
- package/lib/commands/auth/index.js +1 -1
- package/lib/commands/auth/prompt.js +1 -1
- package/lib/commands/bff/detail.js +1 -1
- package/lib/commands/bff/exec.js +1 -1
- package/lib/commands/bff/index.js +1 -1
- package/lib/commands/cli-skill/index.js +1 -1
- package/lib/commands/common/config-policy.js +1 -1
- package/lib/commands/common/constraints.js +1 -1
- package/lib/commands/common/flags.js +1 -1
- package/lib/commands/common/local-file.js +1 -1
- package/lib/commands/config/definitions.js +1 -1
- package/lib/commands/config/shared.js +1 -1
- package/lib/commands/data/index.js +1 -1
- package/lib/commands/dataset/detail.js +1 -1
- package/lib/commands/dataset/index.js +1 -1
- package/lib/commands/dataset/list.js +1 -1
- package/lib/commands/dataset/sdk-doc.js +1 -1
- package/lib/commands/doctor.js +1 -1
- package/lib/commands/file/index.js +1 -1
- package/lib/commands/init.js +1 -1
- package/lib/commands/kb/index.js +1 -1
- package/lib/commands/logs/index.js +1 -1
- package/lib/commands/ocr/index.js +1 -1
- package/lib/commands/personal-bff/index.js +1 -1
- package/lib/commands/registry.js +1 -1
- package/lib/commands/schedule/index.js +1 -1
- package/lib/commands/schema.js +1 -1
- package/lib/commands/service/dynamic.js +1 -1
- package/lib/commands/service/function-name-adapter.js +1 -1
- package/lib/commands/service/index.js +1 -1
- package/lib/commands/service/registry.js +1 -1
- package/lib/commands/skill/commands/create.js +1 -1
- package/lib/commands/skill/commands/diagram.js +1 -1
- package/lib/commands/skill/commands/install.js +1 -1
- package/lib/commands/skill/commands/list.js +1 -1
- package/lib/commands/skill/commands/push.js +1 -1
- package/lib/commands/skill/commands/validate.js +1 -1
- package/lib/commands/skill/diagram.js +1 -1
- package/lib/commands/skill/flags.js +1 -1
- package/lib/commands/skill/index.js +1 -1
- package/lib/commands/skill/manifest-helpers.js +1 -1
- package/lib/commands/skill/push-execute.js +1 -1
- package/lib/commands/skill/push-flow-helpers.js +1 -1
- package/lib/commands/skill/push-retarget.js +1 -1
- package/lib/commands/skill/scopes.js +1 -1
- package/lib/commands/skill/summary.js +1 -1
- package/lib/commands/skill/templates.js +1 -1
- package/lib/commands/skill/validate.js +1 -1
- package/lib/commands/sql/detail.js +1 -1
- package/lib/commands/sql/exec.js +1 -1
- package/lib/commands/sql/index.js +1 -1
- package/lib/commands/update.d.ts +2 -2
- package/lib/commands/update.js +1 -1
- package/lib/commands/workspace/index.js +1 -1
- package/lib/config/schema.js +1 -1
- package/lib/constant/app.js +1 -1
- package/lib/constant/auth-mode.js +1 -1
- package/lib/constant/cli.js +1 -1
- package/lib/constant/defaults.js +1 -1
- package/lib/constant/distribution.js +1 -1
- package/lib/constant/domain.js +1 -1
- package/lib/constant/env.js +1 -1
- package/lib/constant/output.js +1 -1
- package/lib/constant/product.js +1 -1
- package/lib/constant/risk.js +1 -1
- package/lib/constant/url.js +1 -1
- package/lib/context.js +1 -1
- package/lib/core/api-client.js +1 -1
- package/lib/core/db-resolver.js +1 -1
- package/lib/core/sdk-client.js +1 -1
- package/lib/errors.js +1 -1
- package/lib/framework/build-all-flags.js +1 -1
- package/lib/framework/dryrun.js +1 -1
- package/lib/framework/flags.js +1 -1
- package/lib/framework/help.js +1 -1
- package/lib/framework/index.js +1 -1
- package/lib/framework/output.js +1 -1
- package/lib/framework/preparse.js +1 -1
- package/lib/framework/rate-limit.js +1 -1
- package/lib/framework/raw-flags.js +1 -1
- package/lib/framework/response.js +1 -1
- package/lib/framework/runner-confirmation.js +1 -1
- package/lib/framework/runner-error.js +1 -1
- package/lib/framework/runner.js +1 -1
- package/lib/framework/schema-export.js +1 -1
- package/lib/framework/service-order.js +1 -1
- package/lib/framework/types.js +1 -1
- package/lib/generated/build-info.d.ts +4 -4
- package/lib/generated/build-info.js +1 -1
- package/lib/help.js +1 -1
- package/lib/postinstall.d.ts +2 -0
- package/lib/postinstall.js +1 -0
- package/lib/runtime/confirmation.js +1 -1
- package/lib/runtime/event.js +1 -1
- package/lib/runtime/index.js +1 -1
- package/lib/runtime/queue.js +1 -1
- package/lib/runtime/resolve.js +1 -1
- package/lib/skills/builtin-skill.d.ts +37 -0
- package/lib/skills/builtin-skill.js +1 -0
- package/lib/skills/npx-skills-add.d.ts +3 -1
- package/lib/skills/npx-skills-add.js +1 -1
- package/lib/skills/runtime-skill-sync/constants.js +1 -1
- package/lib/skills/runtime-skill-sync/fs-utils.js +1 -1
- package/lib/skills/runtime-skill-sync/hashing.js +1 -1
- package/lib/skills/runtime-skill-sync/install-target.js +1 -1
- package/lib/skills/runtime-skill-sync/links.js +1 -1
- package/lib/skills/runtime-skill-sync/list-local.js +1 -1
- package/lib/skills/runtime-skill-sync/local-files.js +1 -1
- package/lib/skills/runtime-skill-sync/materialize.js +1 -1
- package/lib/skills/runtime-skill-sync/metadata.js +1 -1
- package/lib/skills/runtime-skill-sync/paths.js +1 -1
- package/lib/skills/runtime-skill-sync/push.js +1 -1
- package/lib/skills/runtime-skill-sync/scopes.js +1 -1
- package/lib/skills/runtime-skill-sync/zip-codec.js +1 -1
- package/lib/skills/runtime-skill-sync/zip-package.js +1 -1
- package/lib/skills/runtime-skill-sync.js +1 -1
- package/lib/skills/skill-presence.js +1 -1
- package/lib/utils/apply-jq-filter.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/lossless-json.js +1 -1
- package/lib/utils/params.js +1 -1
- package/lib/utils/platform.js +1 -1
- package/lib/utils/update-notice.js +1 -1
- package/lib/utils/version.js +1 -1
- package/lib/utils/write-cli-side-channel.js +1 -1
- package/package.json +14 -3
- package/scripts/postinstall.mjs +24 -0
- package/skills/lovrabet/SKILL.md +702 -0
- package/skills/lovrabet/guides/app-resolution.md +165 -0
- package/skills/lovrabet/guides/dataset-and-data-workflow.md +170 -0
- package/skills/lovrabet/guides/sql-and-bff-workflow.md +132 -0
- package/skills/lovrabet/guides/troubleshooting.md +91 -0
- package/skills/lovrabet/references/dataset-discovery-workflow.md +160 -0
- package/skills/lovrabet/references/instant-api-workflow.md +259 -0
- package/skills/lovrabet/references/lovrabet-app-config.md +51 -0
- package/skills/lovrabet/references/lovrabet-app.md +113 -0
- package/skills/lovrabet/references/lovrabet-auth.md +136 -0
- package/skills/lovrabet/references/lovrabet-bff-workflow.md +139 -0
- package/skills/lovrabet/references/lovrabet-config-commands.md +104 -0
- package/skills/lovrabet/references/lovrabet-config.md +124 -0
- package/skills/lovrabet/references/lovrabet-doctor.md +26 -0
- package/skills/lovrabet/references/lovrabet-file-workflow.md +62 -0
- package/skills/lovrabet/references/lovrabet-kb-workflow.md +78 -0
- package/skills/lovrabet/references/lovrabet-logs.md +19 -0
- package/skills/lovrabet/references/lovrabet-ocr-workflow.md +83 -0
- package/skills/lovrabet/references/lovrabet-output-format-jq.md +40 -0
- package/skills/lovrabet/references/lovrabet-personal-bff-workflow.md +108 -0
- package/skills/lovrabet/references/lovrabet-schedule-workflow.md +175 -0
- package/skills/lovrabet/references/lovrabet-service-tree.md +279 -0
- package/skills/lovrabet/references/lovrabet-skill-authoring.md +128 -0
- package/skills/lovrabet/references/lovrabet-skill-install.md +34 -0
- package/skills/lovrabet/references/lovrabet-skill-sync.md +146 -0
- package/skills/lovrabet/references/lovrabet-sql-workflow.md +111 -0
- package/skills/lovrabet/references/lovrabet-update.md +34 -0
- package/skills/lovrabet/references/lovrabet-workspace.md +82 -0
- package/skills/lovrabet.manifest.json +38 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# OCR 识别工作流
|
|
2
|
+
|
|
3
|
+
`ocr` 命令用于对远程 URL 或本地文件执行 OCR 识别。适用场景包括发票识别、证照识别、表格图片识别、合同或附件内容提取,以及把识别结果整理后写入业务数据。
|
|
4
|
+
|
|
5
|
+
## 命令概览
|
|
6
|
+
|
|
7
|
+
| 目标 | 命令 | 风险 |
|
|
8
|
+
|------|------|------|
|
|
9
|
+
| 识别远程 URL | `lovrabet ocr recognize --scene <scene> --image-url <url>` | read |
|
|
10
|
+
| 识别本地文件 | `lovrabet ocr recognize --scene <scene> --image-file <local-path>` | read |
|
|
11
|
+
|
|
12
|
+
需要机器可读输出时统一加 `--format compress`;需要截取字段时再叠加 `--jq`。
|
|
13
|
+
|
|
14
|
+
OCR 识别不创建、更新或删除业务数据,因此 `ocr recognize` 的风险等级为 `read`。服务端仍可能记录审计、调用第三方服务并产生积分消耗;这些服务运行副作用不改变 CLI 风险分类。需要把识别结果写入数据集时,后续 `data create` 或 `data update` 仍按 write 规则执行。
|
|
15
|
+
|
|
16
|
+
`ocr recognize` 支持 dry-run 预览。正式识别前先用 `--dry-run` 确认目标应用、输入方式和服务端调用链路;dry-run 不上传文件、不调用 OCR。
|
|
17
|
+
|
|
18
|
+
## 识别场景
|
|
19
|
+
|
|
20
|
+
支持的 `--scene`:
|
|
21
|
+
|
|
22
|
+
| scene | 适用 |
|
|
23
|
+
|-------|------|
|
|
24
|
+
| `invoice` | 发票、票据 |
|
|
25
|
+
| `general` | 通用图片或文档文本 |
|
|
26
|
+
| `form` | 表格图片 |
|
|
27
|
+
| `idCard` | 证照、身份类图片 |
|
|
28
|
+
|
|
29
|
+
## 输入方式
|
|
30
|
+
|
|
31
|
+
识别远程 URL:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
lovrabet ocr recognize --scene invoice --image-url <url> --dry-run --format compress
|
|
35
|
+
lovrabet ocr recognize --scene invoice --image-url <url> --format compress
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
识别本地文件:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
lovrabet ocr recognize --scene invoice --image-file ./invoice.png --dry-run --format compress
|
|
42
|
+
lovrabet ocr recognize --scene invoice --image-file ./invoice.png --format compress
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
本地文件识别会复用文件上传能力,自动串联:
|
|
46
|
+
|
|
47
|
+
1. `file upload --file <local-path>`
|
|
48
|
+
2. `file query-url --filepath <filePath>`
|
|
49
|
+
3. `ocr recognize --image-url <temporary-url>`
|
|
50
|
+
|
|
51
|
+
文件上传和临时 URL 的细节见 [文件上传工作流](lovrabet-file-workflow.md)。
|
|
52
|
+
|
|
53
|
+
OCR 本地文件链路只需要短效 URL 作为中间输入,不要为 OCR 追加 `file query-url --long-term`。3 年长期 URL 仅用于富文本、Markdown、HTML 等必须把静态 URL 写入长期业务内容的场景。
|
|
54
|
+
|
|
55
|
+
当前 OCR 输入必须二选一:`--image-file` 或 `--image-url`。`filePath` 需要先通过 `file query-url` 换成可访问 URL 后,才能作为 OCR URL 输入。
|
|
56
|
+
|
|
57
|
+
## 结果处理
|
|
58
|
+
|
|
59
|
+
OCR 返回以运行态识别结果为准,常见字段包括 `type`、`text`、`lines`、`requestId`,本地文件识别还会补充 `sourceFile.fileName` 和 `sourceFile.filePath`。
|
|
60
|
+
|
|
61
|
+
处理建议:
|
|
62
|
+
|
|
63
|
+
1. 向用户总结识别结论时,优先提取关键业务字段,不粘贴大段原文。
|
|
64
|
+
2. 需要写入数据集时,先 `dataset detail --code <datasetCode>` 确认字段。
|
|
65
|
+
3. 使用 `data create` 或 `data update` 前先 dry-run。
|
|
66
|
+
4. 发票、证照、合同等敏感材料不要写入日志、配置文件或 Skill 文档示例。
|
|
67
|
+
|
|
68
|
+
示例:识别发票并准备写入数据集。
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
lovrabet ocr recognize --scene invoice --image-file ./invoice.png --format compress
|
|
72
|
+
lovrabet dataset detail --code <datasetCode> --format compress
|
|
73
|
+
lovrabet data create --code <datasetCode> --params '{"invoiceNo":"<识别后的发票号>","amount":100}' --dry-run
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 常见错误
|
|
77
|
+
|
|
78
|
+
| 现象 | 处理 |
|
|
79
|
+
|------|------|
|
|
80
|
+
| 本地文件不存在 | 检查 `--image-file` 路径,使用真实本地文件 |
|
|
81
|
+
| 文件超过 50 MB | 拆分或压缩文件;本地文件识别会先走当前运行态上传接口 |
|
|
82
|
+
| URL 过期或不可访问 | 重新执行 `file query-url` 获取新的临时 URL |
|
|
83
|
+
| OCR 场景不匹配 | 换用 `general`、`form`、`invoice` 或 `idCard` |
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# 输出格式与全局 `--jq`
|
|
2
|
+
|
|
3
|
+
运行态 `lovrabet` 的声明式命令统一支持**结构化输出**、**compress 默认偏好**和**全局 `--jq`**。
|
|
4
|
+
|
|
5
|
+
## `--format`
|
|
6
|
+
|
|
7
|
+
| 值 | 说明 |
|
|
8
|
+
|----|------|
|
|
9
|
+
| `json` | 缩进 JSON,信封 `{ ok, command, risk, data?, ... }` |
|
|
10
|
+
| `compress` | 与 `json` 同一信封,**单行**紧凑,适合 Agent / 管道 |
|
|
11
|
+
| `pretty` | 人类可读(非 JSON 信封的展示型输出,依命令而定) |
|
|
12
|
+
|
|
13
|
+
解析顺序:**CLI `--format`** > 配置文件 `format` > 默认(产品默认多为 **compress**,以当前 CLI 版本 `--help` 为准)。
|
|
14
|
+
|
|
15
|
+
## 结构化输出契约
|
|
16
|
+
|
|
17
|
+
- `json` / `compress` 只输出机器可读信封,不携带运行时升级提示等交互式 notice。
|
|
18
|
+
- 升级提示只在交互式 `pretty` 输出中写入 stderr,不污染 stdout。
|
|
19
|
+
- 自动化脚本不要依赖 `_notice.update`;需要主动升级时显式执行 `lovrabet update`。
|
|
20
|
+
|
|
21
|
+
## 全局 `--jq '<expr>'`
|
|
22
|
+
|
|
23
|
+
- **作用**:在**最终要打印的整段 JSON 字符串**上执行 **jq** 表达式(与手动 `… \| jq '<expr>'` 一致)。
|
|
24
|
+
- **适用**:仅当本次输出走 **`--format json` 或 `compress`** 时;若当前为 `pretty` 且你传了 `--jq`,管线会将格式**升格为 json** 再跑 jq。
|
|
25
|
+
- **信封**:表达式作用在**完整信封**上,取业务数据多用 **`.data…`**(例如 `.data.items`、`.data.datasets[]`)。
|
|
26
|
+
- **二进制**:按 **`JQ_PATH` → CLI 内置 sidecar jq → `PATH` 上的 jq** 的顺序解析。若显式设置了 **`JQ_PATH`**,它必须指向一个真实可执行文件;否则命令会直接报错,不会静默回退。
|
|
27
|
+
|
|
28
|
+
## 示例
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 列表只取必要字段(compress + jq)
|
|
32
|
+
lovrabet dataset list --format compress --jq '.data.datasets[] | {code, name}'
|
|
33
|
+
|
|
34
|
+
# 数据集详情:投影 data 段(json)
|
|
35
|
+
lovrabet dataset detail --code <数据集编码> --format json --jq '.data | {fields, operations: [.operations[].name]}'
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 不适用 `--jq` 的命令
|
|
39
|
+
|
|
40
|
+
声明式命令里若 **`hasFormat: false`**(例如 `lovrabet doctor`),输出由命令自控,**不参与**上述 `--format` / `--jq` 管线,传 `--jq` 无意义。
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# personal BFF 工作流
|
|
2
|
+
|
|
3
|
+
`personal-bff` 用于当前用户在当前应用下维护个人 ENDPOINT 脚本。第一阶段支持 `list`、`detail`、`create`、`update`、`exec`;不提供删除命令。
|
|
4
|
+
|
|
5
|
+
## 什么时候用
|
|
6
|
+
|
|
7
|
+
- 需要把多步只读查询包装成稳定函数
|
|
8
|
+
- 需要先验证一个轻量业务接口的返回形状,再交给下游调用
|
|
9
|
+
|
|
10
|
+
若已有平台正式 BFF,优先复用 `bff detail/exec`。personal BFF 更适合个人工作流、验证和 Agent 生成的轻量端点。
|
|
11
|
+
|
|
12
|
+
## BFF 内访问 Dataset
|
|
13
|
+
|
|
14
|
+
脚本通过 `` context.client.models[`dataset_${datasetCode}`] `` 获取 Dataset accessor。当前支持 `create`、`batchCreate`、`update`、`delete`、`getOne`、`findOne`、`getList`、`filter` 和 `aggregate`。
|
|
15
|
+
|
|
16
|
+
能由 Dataset Instant API 表达时,优先直接调用对应方法。只有 Instant API 无法表达需求,且已有契约可信的 Custom SQL 时,才使用 `context.client.sql.execute({ sqlCode, params })`。能力选择应在编码前完成;不得先执行 `aggregate`,再因权限、参数或运行错误静默回退 Custom SQL。
|
|
17
|
+
|
|
18
|
+
同一数据集批量新增时,向 `batchCreate` 直接传非空对象数组;`batchCreate` 返回新记录 ID 数组,顺序与输入一致。不要把 `lovrabet data batchCreate` 兼容的 `{"items":[...]}` 包装传给 BFF Dataset accessor。批量更新仍调用 `update({ id, ...fields })`,其中 `id` 可以是单值或数组;不存在 `batchUpdate()`,也不要把多条更新记录数组直接传给 `update`。批量数量不得超过运行时上限(默认 1000 条)。示例字段必须替换为已确认的真实数据集字段:
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
const createdIds = await model.batchCreate([
|
|
22
|
+
{ order_id: params.orderId, sku_code: "A" },
|
|
23
|
+
{ order_id: params.orderId, sku_code: "B" },
|
|
24
|
+
]);
|
|
25
|
+
|
|
26
|
+
await model.update({
|
|
27
|
+
id: [1, 2, 3],
|
|
28
|
+
status: "DONE",
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
调用 `aggregate` 时仅支持单个 `DB_TABLE` 数据集;`METADATA` 数据集不支持 `aggregate` 或 Custom SQL。`aggregate[].column`、`select`、`where`、`having` 和 `groupBy` 必须使用真实数据集字段;`aggregate[].alias` 只定义输出字段名,只有 `orderBy` 可以引用聚合输出别名。JOIN、跨表统计、数据库特有函数,或需要按聚合结果过滤且无法用真实字段表达时,在编码阶段显式选择已有且契约可信的 Custom SQL,不要动态拼接 SQL。
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
export default async function statsByCity(params, context) {
|
|
36
|
+
const datasetCode = "sales_order";
|
|
37
|
+
const model = context.client.models[`dataset_${datasetCode}`];
|
|
38
|
+
|
|
39
|
+
const aggregateResult = await model.aggregate({
|
|
40
|
+
aggregate: [{ column: "amount", type: "SUM", alias: "total_amount" }],
|
|
41
|
+
where: { status: { $eq: "active" } },
|
|
42
|
+
groupBy: ["city"]
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return aggregateResult.tableData;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`aggregate` 返回 `{ tableData, paging, tableColumns? }`;业务记录从 `aggregateResult.tableData` 读取,不要按 Custom SQL 的数组返回值处理。
|
|
50
|
+
|
|
51
|
+
## 查看
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
lovrabet personal-bff list --format compress
|
|
55
|
+
lovrabet personal-bff detail --id <id> --format compress
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
更新前先 `personal-bff detail`,确认函数名、脚本内容、描述和版本。
|
|
59
|
+
|
|
60
|
+
## 创建
|
|
61
|
+
|
|
62
|
+
脚本来自本地 UTF-8 JavaScript 或 TypeScript 文件。`--name` 必须是合法 JavaScript identifier。
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
lovrabet personal-bff create --name loadOrders --file ./load-orders.js --dry-run
|
|
66
|
+
lovrabet personal-bff create --name loadOrders --file ./load-orders.js
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
可选:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
lovrabet personal-bff create \
|
|
73
|
+
--name loadOrders \
|
|
74
|
+
--description "Load active orders for dashboard" \
|
|
75
|
+
--source-session-id <sessionId> \
|
|
76
|
+
--file ./load-orders.js \
|
|
77
|
+
--dry-run
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 更新
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
lovrabet personal-bff detail --id <id> --format compress
|
|
84
|
+
lovrabet personal-bff update --id <id> --file ./load-orders-v2.js --dry-run
|
|
85
|
+
lovrabet personal-bff update --id <id> --name loadActiveOrders --description "v2" --file ./load-orders-v2.js
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`update` 至少要提供 `--name`、`--description`、`--file` 或 `--source-session-id` 之一。
|
|
89
|
+
|
|
90
|
+
## 执行
|
|
91
|
+
|
|
92
|
+
`exec` 会运行用户脚本,执行前必须确认目标脚本 ID、输入参数和已知副作用:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
lovrabet personal-bff exec --id <id> --params '{"status":"active"}' --format compress
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
不传 `--params` 时默认 `{}`。传入值必须是 JSON 对象。
|
|
99
|
+
|
|
100
|
+
## 与下游调用配合
|
|
101
|
+
|
|
102
|
+
接入下游调用前先执行 personal BFF,并保存返回形状摘要:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
lovrabet personal-bff exec --id <id> --params '{"status":"active"}' --format compress
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
确认字段、空态和错误形状后,再按下游调用方的契约完成接入。
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# 创建和管理定时任务
|
|
2
|
+
|
|
3
|
+
使用 `lovrabet schedule` 校验、创建、查看、立即运行和删除当前应用的定时任务。
|
|
4
|
+
|
|
5
|
+
## 准备定时任务
|
|
6
|
+
|
|
7
|
+
开始前确认:
|
|
8
|
+
|
|
9
|
+
- 当前 AccessKey 对目标应用有权限。
|
|
10
|
+
- `--app`、`--appcode` 或当前工作目录指向正确应用。
|
|
11
|
+
- 时间统一使用 UTC。
|
|
12
|
+
- prompt 是完整、可重复执行的任务说明,不依赖当前对话中的临时上下文。
|
|
13
|
+
- prompt 不包含 AccessKey、密码或其他明文凭证。
|
|
14
|
+
|
|
15
|
+
定时任务分为:
|
|
16
|
+
|
|
17
|
+
- `CRON`:按五段 UTC cron 表达式重复执行。
|
|
18
|
+
- `ONCE`:在一个 UTC 时间执行一次。
|
|
19
|
+
|
|
20
|
+
五段 cron 的顺序是:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
minute hour day-of-month month day-of-week
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
支持数字、`*`、范围、列表和 step。不要使用秒字段、月份英文名或星期英文名。
|
|
27
|
+
|
|
28
|
+
## 校验周期任务
|
|
29
|
+
|
|
30
|
+
先校验输入,不创建计划:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
lovrabet schedule validate \
|
|
34
|
+
--kind CRON \
|
|
35
|
+
--cron '0 9 * * 1-5' \
|
|
36
|
+
--title '工作日销售日报' \
|
|
37
|
+
--prompt '汇总昨日销售数据并生成报告' \
|
|
38
|
+
--channel auto
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
检查返回的 `kind`、`timezone`、`cron`、`title`、`prompt` 和 `channel`。
|
|
42
|
+
|
|
43
|
+
## 校验单次任务
|
|
44
|
+
|
|
45
|
+
`--scheduled-at` 使用 canonical UTC ISO datetime,至少晚于当前时间 60 秒,最多晚于当前时间 365 天:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
lovrabet schedule validate \
|
|
49
|
+
--kind ONCE \
|
|
50
|
+
--scheduled-at '2026-08-01T01:30:00.000Z' \
|
|
51
|
+
--title '发布前检查' \
|
|
52
|
+
--prompt '检查当前应用的发布资料' \
|
|
53
|
+
--channel premium
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
不要同时传 `--cron` 和 `--scheduled-at`。
|
|
57
|
+
|
|
58
|
+
## 创建定时任务
|
|
59
|
+
|
|
60
|
+
先预览:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
lovrabet schedule create \
|
|
64
|
+
--kind CRON \
|
|
65
|
+
--cron '0 9 * * 1-5' \
|
|
66
|
+
--title '工作日销售日报' \
|
|
67
|
+
--prompt '汇总昨日销售数据并生成报告' \
|
|
68
|
+
--channel auto \
|
|
69
|
+
--dry-run
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
把以下信息交给用户确认:
|
|
73
|
+
|
|
74
|
+
- 应用
|
|
75
|
+
- UTC 时间或 cron
|
|
76
|
+
- 是否重复执行
|
|
77
|
+
- 标题
|
|
78
|
+
- 完整 prompt
|
|
79
|
+
- channel
|
|
80
|
+
|
|
81
|
+
用户明确确认后执行:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
lovrabet schedule create \
|
|
85
|
+
--kind CRON \
|
|
86
|
+
--cron '0 9 * * 1-5' \
|
|
87
|
+
--title '工作日销售日报' \
|
|
88
|
+
--prompt '汇总昨日销售数据并生成报告' \
|
|
89
|
+
--channel auto \
|
|
90
|
+
--yes
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
只有返回 `scheduleId` 才表示计划创建成功。保存该值,用于详情、立即运行和删除。
|
|
94
|
+
|
|
95
|
+
## 查看定时任务
|
|
96
|
+
|
|
97
|
+
查看第一页:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
lovrabet schedule list --limit 20
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
返回 `nextCursor` 时,把它原样传给下一次查询:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
lovrabet schedule list --limit 20 --cursor '<NEXT_CURSOR>'
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
不要解析、修改或拼接 cursor。
|
|
110
|
+
|
|
111
|
+
查看详情:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
lovrabet schedule detail --schedule-id <SCHEDULE_ID>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
list 和 detail 不返回完整 prompt。不要根据详情猜测或恢复创建时的 prompt。
|
|
118
|
+
|
|
119
|
+
当前没有 update、pause 或 resume 命令。需要修改时,先确认删除旧计划,再创建新计划。
|
|
120
|
+
|
|
121
|
+
## 立即运行一次
|
|
122
|
+
|
|
123
|
+
先查看详情并预览:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
lovrabet schedule detail --schedule-id <SCHEDULE_ID>
|
|
127
|
+
lovrabet schedule run --schedule-id <SCHEDULE_ID> --dry-run
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
用户明确确认后执行:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
lovrabet schedule run --schedule-id <SCHEDULE_ID> --yes
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
返回 `taskId` 和 `status=QUEUED` 只表示 Task 已接收,不表示已经完成。保留 `taskId`;
|
|
137
|
+
无法从当前 CLI 核对终态时,明确说明“已进入队列,执行结果尚未验证”,不要声称任务成功。
|
|
138
|
+
|
|
139
|
+
## 删除定时任务
|
|
140
|
+
|
|
141
|
+
先查看目标并预览:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
lovrabet schedule detail --schedule-id <SCHEDULE_ID>
|
|
145
|
+
lovrabet schedule delete --schedule-id <SCHEDULE_ID> --dry-run
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
用户明确确认后执行:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
lovrabet schedule delete --schedule-id <SCHEDULE_ID> --yes
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
删除只停止未来触发,不会取消已经创建的 Task。不要把“计划已删除”表述为“正在执行的
|
|
155
|
+
Task 已取消”。
|
|
156
|
+
|
|
157
|
+
## 处理失败
|
|
158
|
+
|
|
159
|
+
| `errorCode` | 处理 |
|
|
160
|
+
| --- | --- |
|
|
161
|
+
| `UNAUTHORIZED` | 重新确认 AccessKey |
|
|
162
|
+
| `ACCESS_KEY_SCOPE_MISMATCH` | 停止操作,确认目标应用权限 |
|
|
163
|
+
| `SCHEDULE_NOT_FOUND` | 刷新列表;ONCE 计划可能已经执行并消失 |
|
|
164
|
+
| `SCHEDULE_CONFLICT` | 重新读取列表和详情后再判断 |
|
|
165
|
+
| `SCHEDULE_INPUT_INVALID` | 修正 UTC 时间、cron 或字段组合 |
|
|
166
|
+
| `ACCESS_KEY_AUTH_UNAVAILABLE` | 保留输入,稍后重试 |
|
|
167
|
+
| `SCHEDULE_CONTROL_UNAVAILABLE` | 不伪造成功结果,稍后重试 |
|
|
168
|
+
|
|
169
|
+
## 检查完成结果
|
|
170
|
+
|
|
171
|
+
- create 返回真实 `scheduleId`。
|
|
172
|
+
- list 或 detail 能查到新计划。
|
|
173
|
+
- run 返回 `taskId` 时只报告已进入队列。
|
|
174
|
+
- delete 后列表不再包含该计划。
|
|
175
|
+
- 没有把删除计划误写成取消既有 Task。
|