@rishiqing/cli 0.1.2 → 0.1.4
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
|
@@ -6,19 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
面向 Agent 和开发者的日事清 CLI,由 `rishiqing.openapi.json` 驱动命令注册。它不是简单包一层 HTTP 请求,而是把“发现命令、理解参数、预览请求、执行调用”整理成一套稳定的终端接口,方便人和 AI Agent 直接操作日事清。
|
|
8
8
|
|
|
9
|
-
[安装](#安装与快速开始) · [Agent 能力](#agent-能力) · [命令体系](#命令体系) · [进阶用法](#进阶用法) · [安全](#安全与约束)
|
|
10
|
-
|
|
11
|
-
## 功能
|
|
12
|
-
|
|
13
|
-
当前共提供 **54** 个命令,覆盖 5 个业务域:
|
|
14
|
-
|
|
15
|
-
| 类别 | 当前能力 |
|
|
16
|
-
| --- | --- |
|
|
17
|
-
| `workflow` | 流程应用、模板、步骤、表单、审核项、流程实例、运行中步骤流转 |
|
|
18
|
-
| `project` | 项目、模块、卡片、项目成员 |
|
|
19
|
-
| `task` | 创建、查询、更新、完成、删除任务,评论,执行人/负责人/参与人维护 |
|
|
20
|
-
| `datasheet` | 数据表列表、字段、记录的查询/新增/更新/删除 |
|
|
21
|
-
| `contacts` | 全员列表、按姓名解析 `userId` |
|
|
9
|
+
[安装](#安装与快速开始) · [Agent 能力](#agent-能力) · [命令体系](#命令体系) · [进阶用法](#进阶用法) · [安全](#安全与约束)
|
|
22
10
|
|
|
23
11
|
## 安装与快速开始
|
|
24
12
|
|
|
@@ -39,7 +27,7 @@
|
|
|
39
27
|
npm install -g @rishiqing/cli
|
|
40
28
|
```
|
|
41
29
|
|
|
42
|
-
|
|
30
|
+
#### 安装 CLI Skill
|
|
43
31
|
```bash
|
|
44
32
|
rsq-cli install
|
|
45
33
|
```
|
|
@@ -79,14 +67,6 @@ rsq-cli config init
|
|
|
79
67
|
rsq-cli config path
|
|
80
68
|
```
|
|
81
69
|
|
|
82
|
-
设置接口域名:
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
rsq-cli config baseurl
|
|
86
|
-
rsq-cli config baseurl www.rishiqing.com
|
|
87
|
-
rsq-cli config baseurl https://www.rishiqing.com
|
|
88
|
-
```
|
|
89
|
-
|
|
90
70
|
## Agent 能力
|
|
91
71
|
|
|
92
72
|
`rsq-cli` 既提供内建的 agent contract,也保留了仓库内可复用的 skill。
|
|
@@ -96,6 +76,7 @@ rsq-cli config baseurl https://www.rishiqing.com
|
|
|
96
76
|
| `describe` | 结构化输出全部命令、参数、请求体 schema、示例 |
|
|
97
77
|
| `search` | 按自然语言意图检索命令 |
|
|
98
78
|
| `describe-agent-contract` | 输出面向 Agent 的路由规则、领域关键词和全局约束 |
|
|
79
|
+
| `agent` | 面向 Agent 的包装命令;收到内联 `--body` 时会自动落盘并转成 `--body-file` 执行 |
|
|
99
80
|
| `skills/rishiqing` | 识别“日事清”领域请求并路由到对应模块 |
|
|
100
81
|
| `skills/rsq-workflow-createFlowApplication` | 根据流程场景自动创建流程应用,优先匹配模板,匹配不到回退到标准模式 |
|
|
101
82
|
|
|
@@ -118,7 +99,8 @@ rsq-cli task --help
|
|
|
118
99
|
例如:
|
|
119
100
|
|
|
120
101
|
```bash
|
|
121
|
-
|
|
102
|
+
echo '{"name":"新项目"}' > request.json
|
|
103
|
+
rsq-cli project create --body-file request.json --json
|
|
122
104
|
rsq-cli task get --task-id task_xxx --json
|
|
123
105
|
rsq-cli workflow list-templates --json
|
|
124
106
|
```
|
|
@@ -128,10 +110,10 @@ rsq-cli workflow list-templates --json
|
|
|
128
110
|
这类命令会在内部串联多个步骤,适合 Agent 直接调用:
|
|
129
111
|
|
|
130
112
|
```bash
|
|
131
|
-
rsq-cli contacts resolve-user --user-name 张三 --json
|
|
132
|
-
rsq-cli task set-executor-by-name --task-id task_xxx --user-name 张三 --json
|
|
133
|
-
rsq-cli project set-member-by-name --project-id proj_xxx --user-name 李四 --json
|
|
134
|
-
rsq-cli workflow create-audit-by-names \
|
|
113
|
+
rsq-cli agent contacts resolve-user --user-name 张三 --json
|
|
114
|
+
rsq-cli agent task set-executor-by-name --task-id task_xxx --user-name 张三 --json
|
|
115
|
+
rsq-cli agent project set-member-by-name --project-id proj_xxx --user-name 李四 --json
|
|
116
|
+
rsq-cli agent workflow create-audit-by-names \
|
|
135
117
|
--flow-application-id flow_xxx \
|
|
136
118
|
--step-info-id step_xxx \
|
|
137
119
|
--audit-info-name 部门审批 \
|
|
@@ -156,32 +138,3 @@ rsq-cli describe-agent-contract
|
|
|
156
138
|
本工具可被 AI Agent 调用执行真实的日事清写操作,因此请务必注意:
|
|
157
139
|
|
|
158
140
|
- `X-Rsq-Api-key` 具备真实权限,不应出现在日志、截图或共享终端中
|
|
159
|
-
- 生产环境与测试环境的 `baseUrl` 应严格区分
|
|
160
|
-
|
|
161
|
-
## 开发
|
|
162
|
-
|
|
163
|
-
### 安装依赖
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
npm install
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### 类型检查
|
|
170
|
-
|
|
171
|
-
```bash
|
|
172
|
-
npm run check
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### 构建
|
|
176
|
-
|
|
177
|
-
```bash
|
|
178
|
-
npm run build
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
### 本地调试
|
|
182
|
-
|
|
183
|
-
```bash
|
|
184
|
-
node dist/cli.js --help
|
|
185
|
-
node dist/cli.js search "create task" --json
|
|
186
|
-
node dist/cli.js describe --json
|
|
187
|
-
```
|
package/dist/cli.js
CHANGED
|
@@ -2,10 +2,54 @@
|
|
|
2
2
|
|
|
3
3
|
// src/cli.ts
|
|
4
4
|
import { Command, InvalidArgumentError, Option } from "commander";
|
|
5
|
-
import { readFile as readFile2 } from "fs/promises";
|
|
5
|
+
import { mkdtemp, readFile as readFile2, rm, writeFile as writeFile2 } from "fs/promises";
|
|
6
|
+
import os3 from "os";
|
|
7
|
+
import path4 from "path";
|
|
6
8
|
import readline from "readline/promises";
|
|
7
9
|
import { stdin, stdout } from "process";
|
|
8
10
|
|
|
11
|
+
// package.json
|
|
12
|
+
var package_default = {
|
|
13
|
+
name: "@rishiqing/cli",
|
|
14
|
+
version: "0.1.4",
|
|
15
|
+
description: "Agent-oriented CLI for Rishiqing APIs",
|
|
16
|
+
license: "MIT",
|
|
17
|
+
type: "module",
|
|
18
|
+
publishConfig: {
|
|
19
|
+
access: "public"
|
|
20
|
+
},
|
|
21
|
+
bin: {
|
|
22
|
+
"rsq-cli": "dist/cli.js"
|
|
23
|
+
},
|
|
24
|
+
files: [
|
|
25
|
+
"dist",
|
|
26
|
+
"generated",
|
|
27
|
+
"rishiqing.openapi.json",
|
|
28
|
+
"rsq-cli.config.json",
|
|
29
|
+
"skills"
|
|
30
|
+
],
|
|
31
|
+
scripts: {
|
|
32
|
+
build: "tsup",
|
|
33
|
+
dev: "node --enable-source-maps dist/cli.js",
|
|
34
|
+
check: "tsc --noEmit",
|
|
35
|
+
"generate:catalog": "node scripts/generate-command-catalog.mjs",
|
|
36
|
+
"release:check": "npm run check && npm run build",
|
|
37
|
+
prepublishOnly: "npm run release:check"
|
|
38
|
+
},
|
|
39
|
+
engines: {
|
|
40
|
+
node: ">=20"
|
|
41
|
+
},
|
|
42
|
+
dependencies: {
|
|
43
|
+
commander: "^14.0.0",
|
|
44
|
+
zod: "^4.1.5"
|
|
45
|
+
},
|
|
46
|
+
devDependencies: {
|
|
47
|
+
"@types/node": "^24.6.0",
|
|
48
|
+
tsup: "^8.5.0",
|
|
49
|
+
typescript: "^5.9.3"
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
9
53
|
// src/core/config.ts
|
|
10
54
|
import { existsSync } from "fs";
|
|
11
55
|
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
@@ -1112,7 +1156,9 @@ function getSkillContract() {
|
|
|
1112
1156
|
globalRules: [
|
|
1113
1157
|
"\u9047\u5230\u65E5\u4E8B\u6E05\u9886\u57DF\u77ED\u8BED\u65F6\uFF0C\u5148\u8BC6\u522B\u4E3A rsq-cli \u64CD\u4F5C\u610F\u56FE\uFF0C\u4E0D\u8981\u628A\u5B83\u5F53\u6210\u6CDB\u5316\u9879\u76EE\u7BA1\u7406\u8BF7\u6C42\u3002",
|
|
1114
1158
|
"\u4E0D\u786E\u5B9A\u5177\u4F53\u547D\u4EE4\u65F6\uFF0C\u5148\u8C03\u7528 rsq-cli search\uFF1B\u786E\u8BA4\u5019\u9009\u547D\u4EE4\u540E\u518D\u8C03\u7528 rsq-cli describe \u9605\u8BFB\u53C2\u6570\u548C requestBodySchema\u3002",
|
|
1159
|
+
"\u771F\u6B63\u6267\u884C API \u547D\u4EE4\u65F6\uFF0C\u4F18\u5148\u8D70 rsq-cli agent <module> <command> ...\uFF1Bdescribe/search \u7EE7\u7EED\u8D70\u539F\u5165\u53E3\u3002",
|
|
1115
1160
|
"\u6D89\u53CA\u521B\u5EFA\u3001\u66F4\u65B0\u3001\u7ED1\u5B9A\u3001\u5206\u914D\u7B49\u5199\u64CD\u4F5C\u65F6\uFF0C\u4F18\u5148\u4F7F\u7528 --dry-run --json \u9884\u89C8\u3002",
|
|
1161
|
+
"\u53EA\u8981\u547D\u4EE4\u5E26 request body\uFF0C\u4F18\u5148\u628A JSON \u5199\u5165\u6587\u4EF6\u5E76\u901A\u8FC7 --body-file \u4F20\u5165\uFF0C\u4E0D\u8981\u9ED8\u8BA4\u62FC\u5185\u8054 --body\u3002",
|
|
1116
1162
|
"\u6240\u6709 id \u5B57\u6BB5\u90FD\u5FC5\u987B\u4F20\u524D\u7F00+uuid\u98CE\u683C\u7684\u5B57\u7B26\u4E32\uFF0C\u4F8B\u5982 flowApp_019d6c0c2f03770b8b789ec313076e64\u3002",
|
|
1117
1163
|
"\u4E0D\u8981\u4F20\u6570\u5B57\u7C7B\u578B id\uFF0C\u4E5F\u4E0D\u8981\u4F20\u7EAF\u6570\u5B57\u5B57\u7B26\u4E32 id\u3002",
|
|
1118
1164
|
"\u8C03\u7528\u524D\u4F18\u5148\u9605\u8BFB\u53C2\u6570\u8BF4\u660E\u548C requestBodySchema \u4E2D\u7684\u5B57\u6BB5\u8BF4\u660E\uFF0C\u518D\u7EC4\u88C5\u53C2\u6570\u3002"
|
|
@@ -1150,14 +1196,21 @@ var createPlanTypes = /* @__PURE__ */ new Set([
|
|
|
1150
1196
|
"datasheet",
|
|
1151
1197
|
"deliverable"
|
|
1152
1198
|
]);
|
|
1199
|
+
var CLI_VERSION = package_default.version;
|
|
1153
1200
|
async function main() {
|
|
1201
|
+
if (process.argv.includes("-v")) {
|
|
1202
|
+
stdout.write(`${CLI_VERSION}
|
|
1203
|
+
`);
|
|
1204
|
+
return;
|
|
1205
|
+
}
|
|
1154
1206
|
const program = new Command();
|
|
1155
|
-
program.name("rsq-cli").description("Agent-oriented CLI for Rishiqing APIs").version(
|
|
1207
|
+
program.name("rsq-cli").description("Agent-oriented CLI for Rishiqing APIs").version(CLI_VERSION);
|
|
1156
1208
|
registerGlobalHelp(program);
|
|
1157
1209
|
registerConfig(program);
|
|
1158
1210
|
registerDescribe(program);
|
|
1159
1211
|
registerInstall(program);
|
|
1160
1212
|
registerSearch(program);
|
|
1213
|
+
registerAgent(program);
|
|
1161
1214
|
for (const moduleDefinition of getModuleDefinitions()) {
|
|
1162
1215
|
const moduleCommand = program.command(moduleDefinition.name).description(moduleDefinition.description);
|
|
1163
1216
|
for (const definition of getRegistry().filter((entry) => entry.module === moduleDefinition.name)) {
|
|
@@ -1343,7 +1396,32 @@ function registerSearch(program) {
|
|
|
1343
1396
|
printOutput(ranked, options);
|
|
1344
1397
|
});
|
|
1345
1398
|
}
|
|
1346
|
-
function
|
|
1399
|
+
function registerAgent(program) {
|
|
1400
|
+
const agent = program.command("agent").description("Agent-oriented wrappers that stabilize request body handling");
|
|
1401
|
+
for (const moduleDefinition of getModuleDefinitions()) {
|
|
1402
|
+
const moduleCommand = agent.command(moduleDefinition.name).description(moduleDefinition.description);
|
|
1403
|
+
for (const definition of getRegistry().filter((entry) => entry.module === moduleDefinition.name)) {
|
|
1404
|
+
if (definition.module === "contacts" && definition.name === "resolveUser") {
|
|
1405
|
+
registerResolveUserCommand(moduleCommand, definition);
|
|
1406
|
+
continue;
|
|
1407
|
+
}
|
|
1408
|
+
if (definition.module === "task" && ["setTaskExecutorByName", "setTaskResponsibleByName", "addTaskParticipantByName"].includes(definition.name)) {
|
|
1409
|
+
registerTaskUserByNameCommand(moduleCommand, definition);
|
|
1410
|
+
continue;
|
|
1411
|
+
}
|
|
1412
|
+
if (definition.module === "project" && definition.name === "setProjectMemberByName") {
|
|
1413
|
+
registerProjectUserByNameCommand(moduleCommand, definition);
|
|
1414
|
+
continue;
|
|
1415
|
+
}
|
|
1416
|
+
if (definition.module === "workflow" && ["createAuditInfoByNames", "updateAuditInfoByNames"].includes(definition.name)) {
|
|
1417
|
+
registerWorkflowAuditByNamesCommand(moduleCommand, definition);
|
|
1418
|
+
continue;
|
|
1419
|
+
}
|
|
1420
|
+
registerApiCommand(moduleCommand, definition, "agent-wrapper");
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
function registerApiCommand(parent, definition, mode = "direct") {
|
|
1347
1425
|
if (!definition.api) {
|
|
1348
1426
|
throw new Error(`Missing API mapping for command: ${definition.module} ${definition.name}`);
|
|
1349
1427
|
}
|
|
@@ -1362,9 +1440,15 @@ function registerApiCommand(parent, definition) {
|
|
|
1362
1440
|
command.addOption(new Option("--body-file <path>", "Read JSON request body from a file"));
|
|
1363
1441
|
}
|
|
1364
1442
|
command.action(async (options) => {
|
|
1365
|
-
|
|
1443
|
+
await executeApiCommand(definition, options, mode);
|
|
1444
|
+
});
|
|
1445
|
+
}
|
|
1446
|
+
async function executeApiCommand(definition, options, mode) {
|
|
1447
|
+
const resolvedOptions = await prepareBodyOptions(options, mode);
|
|
1448
|
+
try {
|
|
1449
|
+
const body = sanitizeRequestBody(definition, await readBody(resolvedOptions));
|
|
1366
1450
|
validateRequestBody(definition, body);
|
|
1367
|
-
const request = buildRequest(definition,
|
|
1451
|
+
const request = buildRequest(definition, resolvedOptions, body);
|
|
1368
1452
|
if (options.dryRun) {
|
|
1369
1453
|
const appConfig = await readAppConfig();
|
|
1370
1454
|
printOutput(
|
|
@@ -1374,7 +1458,11 @@ function registerApiCommand(parent, definition) {
|
|
|
1374
1458
|
api: definition.api,
|
|
1375
1459
|
baseUrl: appConfig.baseUrl,
|
|
1376
1460
|
url: new URL(request.path, ensureTrailingSlash2(appConfig.baseUrl)).toString(),
|
|
1377
|
-
request
|
|
1461
|
+
request,
|
|
1462
|
+
agentWrapper: mode === "agent-wrapper" ? {
|
|
1463
|
+
enabled: true,
|
|
1464
|
+
requestBodyTransport: resolvedOptions.bodyFile ? "body-file" : "none"
|
|
1465
|
+
} : void 0
|
|
1378
1466
|
},
|
|
1379
1467
|
{ json: true }
|
|
1380
1468
|
);
|
|
@@ -1384,7 +1472,9 @@ function registerApiCommand(parent, definition) {
|
|
|
1384
1472
|
if (!options.quiet) {
|
|
1385
1473
|
printOutput(result, options);
|
|
1386
1474
|
}
|
|
1387
|
-
}
|
|
1475
|
+
} finally {
|
|
1476
|
+
await cleanupPreparedBodyOptions(resolvedOptions);
|
|
1477
|
+
}
|
|
1388
1478
|
}
|
|
1389
1479
|
function registerResolveUserCommand(parent, definition) {
|
|
1390
1480
|
const command = parent.command(definition.name).description(definition.summary);
|
|
@@ -1674,19 +1764,19 @@ function validateCustomBodyRules(definition, body, issues) {
|
|
|
1674
1764
|
}
|
|
1675
1765
|
}
|
|
1676
1766
|
}
|
|
1677
|
-
function validateValueAgainstSchema(value, schema,
|
|
1767
|
+
function validateValueAgainstSchema(value, schema, path5, issues) {
|
|
1678
1768
|
if (value === void 0 || value === null) {
|
|
1679
1769
|
return;
|
|
1680
1770
|
}
|
|
1681
1771
|
if (schema.type === "object" && isRecord(value)) {
|
|
1682
1772
|
for (const requiredKey of schema.required ?? []) {
|
|
1683
1773
|
if (!(requiredKey in value)) {
|
|
1684
|
-
issues.push(`${
|
|
1774
|
+
issues.push(`${path5}.${requiredKey}: missing required field`);
|
|
1685
1775
|
}
|
|
1686
1776
|
}
|
|
1687
1777
|
for (const [propertyName, propertySchema] of Object.entries(schema.properties ?? {})) {
|
|
1688
1778
|
if (propertyName in value) {
|
|
1689
|
-
validateValueAgainstSchema(value[propertyName], propertySchema, `${
|
|
1779
|
+
validateValueAgainstSchema(value[propertyName], propertySchema, `${path5}.${propertyName}`, issues);
|
|
1690
1780
|
}
|
|
1691
1781
|
}
|
|
1692
1782
|
return;
|
|
@@ -1694,19 +1784,19 @@ function validateValueAgainstSchema(value, schema, path4, issues) {
|
|
|
1694
1784
|
if (schema.type === "array" && Array.isArray(value)) {
|
|
1695
1785
|
value.forEach((item, index) => {
|
|
1696
1786
|
if (schema.items) {
|
|
1697
|
-
validateValueAgainstSchema(item, schema.items, `${
|
|
1787
|
+
validateValueAgainstSchema(item, schema.items, `${path5}[${index}]`, issues);
|
|
1698
1788
|
}
|
|
1699
1789
|
});
|
|
1700
1790
|
return;
|
|
1701
1791
|
}
|
|
1702
1792
|
if (schema.type === "string" && typeof value === "string") {
|
|
1703
|
-
validateStringByDescription(value, schema.description,
|
|
1793
|
+
validateStringByDescription(value, schema.description, path5, issues);
|
|
1704
1794
|
}
|
|
1705
1795
|
}
|
|
1706
|
-
function validateIdLikeBodyValues(value,
|
|
1796
|
+
function validateIdLikeBodyValues(value, path5, issues) {
|
|
1707
1797
|
if (Array.isArray(value)) {
|
|
1708
1798
|
value.forEach((item, index) => {
|
|
1709
|
-
validateIdLikeBodyValues(item, `${
|
|
1799
|
+
validateIdLikeBodyValues(item, `${path5}[${index}]`, issues);
|
|
1710
1800
|
});
|
|
1711
1801
|
return;
|
|
1712
1802
|
}
|
|
@@ -1714,7 +1804,7 @@ function validateIdLikeBodyValues(value, path4, issues) {
|
|
|
1714
1804
|
return;
|
|
1715
1805
|
}
|
|
1716
1806
|
for (const [key, fieldValue] of Object.entries(value)) {
|
|
1717
|
-
const nextPath = `${
|
|
1807
|
+
const nextPath = `${path5}.${key}`;
|
|
1718
1808
|
if (looksLikeIdField2(key)) {
|
|
1719
1809
|
const issue = getIdLikeValidationIssue(fieldValue, nextPath);
|
|
1720
1810
|
if (issue) {
|
|
@@ -1763,7 +1853,7 @@ function getIdLikeValidationIssue(value, label) {
|
|
|
1763
1853
|
}
|
|
1764
1854
|
return void 0;
|
|
1765
1855
|
}
|
|
1766
|
-
function validateStringByDescription(value, description,
|
|
1856
|
+
function validateStringByDescription(value, description, path5, issues) {
|
|
1767
1857
|
if (!description) {
|
|
1768
1858
|
return;
|
|
1769
1859
|
}
|
|
@@ -1771,7 +1861,7 @@ function validateStringByDescription(value, description, path4, issues) {
|
|
|
1771
1861
|
const isDateOnly = /^\d{4}-\d{2}-\d{2}$/.test(value);
|
|
1772
1862
|
const isOffsetDateTime = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|[+-]\d{2}:\d{2})$/.test(value);
|
|
1773
1863
|
if (!isDateOnly && !isOffsetDateTime) {
|
|
1774
|
-
issues.push(`${
|
|
1864
|
+
issues.push(`${path5}: invalid format "${value}". Allowed formats: yyyy-MM-dd or yyyy-MM-dd'T'HH:mm:ssXXX`);
|
|
1775
1865
|
}
|
|
1776
1866
|
}
|
|
1777
1867
|
}
|
|
@@ -1787,6 +1877,26 @@ async function readBody(options) {
|
|
|
1787
1877
|
}
|
|
1788
1878
|
return void 0;
|
|
1789
1879
|
}
|
|
1880
|
+
async function prepareBodyOptions(options, mode) {
|
|
1881
|
+
if (mode !== "agent-wrapper" || !options.body) {
|
|
1882
|
+
return options;
|
|
1883
|
+
}
|
|
1884
|
+
const tempDir = await mkdtemp(path4.join(os3.tmpdir(), "rsq-cli-agent-"));
|
|
1885
|
+
const bodyFile = path4.join(tempDir, "request.json");
|
|
1886
|
+
await writeFile2(bodyFile, options.body, "utf8");
|
|
1887
|
+
return {
|
|
1888
|
+
...options,
|
|
1889
|
+
body: void 0,
|
|
1890
|
+
bodyFile,
|
|
1891
|
+
__tempDir: tempDir
|
|
1892
|
+
};
|
|
1893
|
+
}
|
|
1894
|
+
async function cleanupPreparedBodyOptions(options) {
|
|
1895
|
+
if (!options.__tempDir) {
|
|
1896
|
+
return;
|
|
1897
|
+
}
|
|
1898
|
+
await rm(options.__tempDir, { recursive: true, force: true });
|
|
1899
|
+
}
|
|
1790
1900
|
function optionName(parameterName) {
|
|
1791
1901
|
return `--${toKebabCase(parameterName)} <value>`;
|
|
1792
1902
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/core/config.ts","../src/core/install.ts","../src/core/http.ts","../src/core/output.ts","../src/core/openapi.ts","../src/registry/overrides.ts","../src/registry/index.ts","../src/registry/skill-contract.ts"],"sourcesContent":["import { Command, InvalidArgumentError, Option } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport readline from \"node:readline/promises\";\nimport { stdin, stdout } from \"node:process\";\nimport { getAppConfigPath, getConfigPath, initConfig, normalizeBaseUrl, readAppConfig, readConfig, setBaseUrl } from \"./core/config.js\";\nimport { installBundledSkills, listKnownInstallTargets } from \"./core/install.js\";\nimport { executeRequest } from \"./core/http.js\";\nimport { printOutput } from \"./core/output.js\";\nimport { getModuleDefinitions, getRegistry } from \"./registry/index.js\";\nimport { getSkillContract } from \"./registry/skill-contract.js\";\nimport type { CommandDefinition } from \"./registry/types.js\";\nimport type { RequestBodySchemaDefinition } from \"./core/openapi.js\";\n\nconst createPlanTypes = new Set([\n \"task\",\n \"statistic\",\n \"overview\",\n \"folder\",\n \"risk\",\n \"workflow\",\n \"datasheet\",\n \"deliverable\",\n]);\n\ntype GlobalOptions = {\n json?: boolean;\n raw?: boolean;\n table?: boolean;\n quiet?: boolean;\n dryRun?: boolean;\n};\n\ntype CommandOptions = GlobalOptions & Record<string, unknown> & {\n body?: string;\n bodyFile?: string;\n};\n\nasync function main(): Promise<void> {\n const program = new Command();\n program\n .name(\"rsq-cli\")\n .description(\"Agent-oriented CLI for Rishiqing APIs\")\n .version(\"0.1.0\");\n\n registerGlobalHelp(program);\n registerConfig(program);\n registerDescribe(program);\n registerInstall(program);\n registerSearch(program);\n\n for (const moduleDefinition of getModuleDefinitions()) {\n const moduleCommand = program.command(moduleDefinition.name).description(moduleDefinition.description);\n for (const definition of getRegistry().filter((entry) => entry.module === moduleDefinition.name)) {\n if (definition.module === \"contacts\" && definition.name === \"resolveUser\") {\n registerResolveUserCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"task\" &&\n [\"setTaskExecutorByName\", \"setTaskResponsibleByName\", \"addTaskParticipantByName\"].includes(definition.name)\n ) {\n registerTaskUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (definition.module === \"project\" && definition.name === \"setProjectMemberByName\") {\n registerProjectUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"workflow\" &&\n [\"createAuditInfoByNames\", \"updateAuditInfoByNames\"].includes(definition.name)\n ) {\n registerWorkflowAuditByNamesCommand(moduleCommand, definition);\n continue;\n }\n\n registerApiCommand(moduleCommand, definition);\n }\n }\n\n await program.parseAsync(process.argv);\n}\n\nfunction registerGlobalHelp(program: Command): void {\n program.showHelpAfterError(\"(run with --help for usage)\");\n}\n\nfunction registerConfig(program: Command): void {\n const config = program.command(\"config\").description(\"Manage local rsq-cli configuration\");\n\n config\n .command(\"init\")\n .description(\"Initialize local configuration\")\n .action(async () => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n try {\n const apiKey = (await rl.question(\"X-Rsq-Api-key: \")).trim();\n if (!apiKey) {\n throw new Error(\"X-Rsq-Api-key is required.\");\n }\n\n const saved = await initConfig(apiKey);\n const appConfig = await readAppConfig();\n printOutput(\n {\n message: \"Configuration saved.\",\n configPath: getConfigPath(),\n appConfigPath: getAppConfigPath(),\n activeProfile: saved.activeProfile,\n baseUrl: appConfig.baseUrl,\n },\n { json: true },\n );\n } finally {\n rl.close();\n }\n });\n\n config\n .command(\"get\")\n .description(\"Show current config without exposing the API key\")\n .option(\"--json\", \"Print JSON output\")\n .action(async (options: GlobalOptions) => {\n const current = await readConfig();\n const appConfig = await readAppConfig();\n if (!current) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const profile = current.profiles[current.activeProfile];\n printOutput(\n {\n configPath: getConfigPath(),\n appConfigPath: getAppConfigPath(),\n baseUrl: appConfig.baseUrl,\n activeProfile: current.activeProfile,\n profiles: {\n [current.activeProfile]: {\n apiKeyConfigured: Boolean(profile?.apiKey),\n },\n },\n },\n options,\n );\n });\n\n config\n .command(\"path\")\n .description(\"Show config file path\")\n .action(() => {\n stdout.write(`${getConfigPath()}\\n`);\n });\n\n config\n .command(\"app-path\")\n .description(\"Show bundled app config path\")\n .action(() => {\n stdout.write(`${getAppConfigPath()}\\n`);\n });\n\n config\n .command(\"baseurl\")\n .description(\"Set the API base URL domain used by rsq-cli\")\n .argument(\"[value]\", \"Base URL domain, for example www.rishiqing.com\")\n .option(\"--json\", \"Print JSON output\")\n .action(async (value: string | undefined, options: { json?: boolean }) => {\n const current = await readAppConfig();\n const nextValue = value ? normalizeBaseUrl(value) : await promptBaseUrl(current.baseUrl);\n const saved = await setBaseUrl(nextValue);\n\n printOutput(\n {\n message: \"baseUrl updated.\",\n configPath: getConfigPath(),\n baseUrl: saved.baseUrl,\n },\n options,\n );\n });\n}\n\nfunction registerDescribe(program: Command): void {\n program\n .command(\"describe\")\n .description(\"Describe commands in machine-readable form\")\n .argument(\"[module]\", \"Module name\")\n .argument(\"[command]\", \"Command name\")\n .addOption(new Option(\"--json\", \"Print JSON output\"))\n .action((moduleName: string | undefined, commandName: string | undefined, options: { json?: boolean }) => {\n const source = getRegistry();\n\n if (!moduleName) {\n printOutput(source, { json: true });\n return;\n }\n\n if (!commandName) {\n printOutput(source.filter((entry) => entry.module === moduleName), { json: true });\n return;\n }\n\n const command = source.find(\n (entry) =>\n entry.module === moduleName &&\n (entry.name === commandName || entry.aliases.includes(commandName)),\n );\n\n if (!command) {\n throw new Error(`Unknown command: ${moduleName} ${commandName}`);\n }\n\n printOutput(command, { json: true });\n });\n\n program\n .command(\"describe-agent-contract\")\n .description(\"Describe the built-in agent contract derived from the registry\")\n .action(() => {\n printOutput(getSkillContract(), { json: true });\n });\n}\n\nfunction registerInstall(program: Command): void {\n const knownTargets = listKnownInstallTargets();\n\n program\n .command(\"install\")\n .description(\"Install bundled skills into known agent skill directories\")\n .option(\n \"--target <name>\",\n `Install only to selected known targets. Repeat or use comma-separated values: ${knownTargets.map((target) => target.name).join(\", \")}`,\n collectStrings,\n [],\n )\n .option(\n \"--dir <path>\",\n \"Install to an additional custom skill directory. Repeat or use comma-separated values\",\n collectStrings,\n [],\n )\n .option(\"--list-targets\", \"Print known install targets and exit\")\n .option(\"--dry-run\", \"Show installation plan without copying files\")\n .option(\"--json\", \"Print JSON output\")\n .action(\n async (options: {\n target?: string[];\n dir?: string[];\n listTargets?: boolean;\n dryRun?: boolean;\n json?: boolean;\n }) => {\n if (options.listTargets) {\n printOutput(\n knownTargets.map((target) => ({\n name: target.name,\n label: target.label,\n dir: target.dir,\n description: target.description,\n })),\n options,\n );\n return;\n }\n\n const result = await installBundledSkills({\n targets: options.target,\n extraDirs: options.dir,\n dryRun: options.dryRun,\n });\n\n printOutput(\n {\n message: options.dryRun ? \"Dry run completed.\" : \"Bundled skills installed.\",\n sourceDir: result.sourceDir,\n skills: result.skills,\n installed: result.installed,\n },\n options,\n );\n },\n );\n}\n\nfunction registerSearch(program: Command): void {\n program\n .command(\"search\")\n .description(\"Search all registered commands by natural language intent\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--limit <count>\", \"Maximum results\", parsePositiveInteger, 10)\n .option(\"--json\", \"Print JSON output\")\n .action((query: string, options: { limit: number; json?: boolean }) => {\n const keywords = tokenize(query);\n const ranked = getRegistry()\n .map((command) => ({\n command,\n score: scoreCommand(command, query, keywords),\n }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => {\n if (right.score !== left.score) {\n return right.score - left.score;\n }\n\n return exposurePriority(right.command) - exposurePriority(left.command);\n })\n .slice(0, options.limit)\n .map(({ command, score }) => ({\n score,\n module: command.module,\n name: command.name,\n aliases: command.aliases,\n exposure: command.exposure,\n summary: command.summary,\n api: command.api,\n }));\n\n printOutput(ranked, options);\n });\n}\n\nfunction registerApiCommand(parent: Command, definition: CommandDefinition): void {\n if (!definition.api) {\n throw new Error(`Missing API mapping for command: ${definition.module} ${definition.name}`);\n }\n\n const command = parent.command(definition.name).description(definition.summary);\n\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n addSharedOutputOptions(command);\n\n for (const parameter of definition.parameters) {\n command.addOption(\n new Option(optionName(parameter.name), parameter.description ?? `${parameter.in} parameter: ${parameter.name}`).makeOptionMandatory(Boolean(parameter.required)),\n );\n }\n\n if (definition.hasRequestBody) {\n command.addOption(new Option(\"--body <json>\", \"Inline JSON request body\"));\n command.addOption(new Option(\"--body-file <path>\", \"Read JSON request body from a file\"));\n }\n\n command.action(async (options: CommandOptions) => {\n const body = sanitizeRequestBody(definition, await readBody(options));\n validateRequestBody(definition, body);\n const request = buildRequest(definition, options, body);\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n api: definition.api,\n baseUrl: appConfig.baseUrl,\n url: new URL(request.path, ensureTrailingSlash(appConfig.baseUrl)).toString(),\n request,\n },\n { json: true },\n );\n return;\n }\n\n const result = await executeRequest(request);\n if (!options.quiet) {\n printOutput(result, options);\n }\n });\n}\n\nfunction registerResolveUserCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n command.addOption(new Option(\"--user-name <value>\", \"需要解析的人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--table\", \"Print array responses in a basic table\"));\n\n command.action(async (options: { userName?: string; json?: boolean; table?: boolean }) => {\n const userName = asOptionalString(options.userName);\n if (!userName) {\n throw new Error(\"Missing required option: --user-name\");\n }\n\n printOutput(await resolveUserByName(userName), { json: true });\n });\n}\n\nfunction registerTaskUserByNameCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n command.addOption(new Option(\"--task-id <value>\", \"taskId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-name <value>\", \"人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n\n command.action(async (options: { taskId?: string; userName?: string; json?: boolean; dryRun?: boolean }) => {\n const taskId = asOptionalString(options.taskId);\n const userName = asOptionalString(options.userName);\n if (!taskId || !userName) {\n throw new Error(\"Missing required options: --task-id and --user-name\");\n }\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n {\n action: \"resolveUser\",\n command: `rsq-cli contacts resolveUser --user-name ${userName} --json`,\n },\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n taskId,\n userName,\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolved = await resolveUserByName(userName);\n const request = buildTaskUserByNameRequest(definition.name, taskId, resolved.userId);\n const result = await executeRequest(request);\n printOutput(\n {\n resolvedUser: resolved,\n result,\n },\n { json: true },\n );\n });\n}\n\nfunction registerProjectUserByNameCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) command.alias(alias);\n command.addOption(new Option(\"--project-id <value>\", \"projectId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-name <value>\", \"人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n command.action(async (options: { projectId?: string; userName?: string; dryRun?: boolean }) => {\n const projectId = asOptionalString(options.projectId);\n const userName = asOptionalString(options.userName);\n if (!projectId || !userName) throw new Error(\"Missing required options: --project-id and --user-name\");\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n { action: \"resolveUser\", command: `rsq-cli contacts resolveUser --user-name ${userName} --json` },\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n projectId,\n userName,\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolved = await resolveUserByName(userName);\n const result = await executeRequest({\n method: \"POST\",\n path: `/rsq/api/v1/projects/${encodeURIComponent(projectId)}/members`,\n body: { userMemberIds: [resolved.userId], deptMemberIds: [] },\n });\n printOutput({ resolvedUser: resolved, result }, { json: true });\n });\n}\n\nfunction registerWorkflowAuditByNamesCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) command.alias(alias);\n\n if (definition.name === \"createAuditInfoByNames\") {\n command.addOption(new Option(\"--flow-application-id <value>\", \"flowApplicationId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--step-info-id <value>\", \"stepInfoId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--audit-info-name <value>\", \"auditInfoName\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-names <value>\", \"审核人名称列表,逗号分隔\").makeOptionMandatory(true));\n command.addOption(new Option(\"--front-audit-info-id <value>\", \"frontAuditInfoId\"));\n } else {\n command.addOption(new Option(\"--audit-info-id <value>\", \"auditInfoId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--audit-info-name <value>\", \"auditInfoName\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-names <value>\", \"审核人名称列表,逗号分隔\").makeOptionMandatory(true));\n }\n\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n\n command.action(async (options: Record<string, unknown> & { dryRun?: boolean }) => {\n const userNamesValue = asOptionalString(options.userNames);\n const userNames = parseNameList(userNamesValue);\n if (userNames.length === 0) throw new Error(\"Missing required option: --user-names\");\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n ...userNames.map((name) => ({\n action: \"resolveUser\",\n command: `rsq-cli contacts resolveUser --user-name ${name} --json`,\n })),\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n options: {\n flowApplicationId: asOptionalString(options.flowApplicationId),\n stepInfoId: asOptionalString(options.stepInfoId),\n auditInfoId: asOptionalString(options.auditInfoId),\n auditInfoName: asOptionalString(options.auditInfoName),\n frontAuditInfoId: asOptionalString(options.frontAuditInfoId),\n userNames,\n },\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolvedUsers = [];\n for (const userName of userNames) {\n resolvedUsers.push(await resolveUserByName(userName));\n }\n const userIds = resolvedUsers.map((user) => user.userId);\n\n let request;\n if (definition.name === \"createAuditInfoByNames\") {\n const flowApplicationId = asOptionalString(options.flowApplicationId);\n const stepInfoId = asOptionalString(options.stepInfoId);\n const auditInfoName = asOptionalString(options.auditInfoName);\n if (!flowApplicationId || !stepInfoId || !auditInfoName) {\n throw new Error(\"Missing required options for createAuditInfoByNames\");\n }\n request = {\n method: \"POST\",\n path: \"/rsq/api/v1/workflow/audit-infos\",\n body: {\n flowApplicationId,\n stepInfoId,\n auditInfoName,\n frontAuditInfoId: asOptionalString(options.frontAuditInfoId),\n auditInfoUsers: userIds,\n },\n };\n } else {\n const auditInfoId = asOptionalString(options.auditInfoId);\n const auditInfoName = asOptionalString(options.auditInfoName);\n if (!auditInfoId || !auditInfoName) {\n throw new Error(\"Missing required options for updateAuditInfoByNames\");\n }\n request = {\n method: \"PUT\",\n path: `/rsq/api/v1/workflow/audit-infos/${encodeURIComponent(auditInfoId)}`,\n body: {\n auditInfoName,\n auditInfoUsers: userIds,\n },\n };\n }\n\n const result = await executeRequest(request);\n printOutput({ resolvedUsers, result }, { json: true });\n });\n}\n\nfunction addSharedOutputOptions(command: Command): void {\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--raw\", \"Print the raw response payload\"));\n command.addOption(new Option(\"--table\", \"Print array responses in a basic table\"));\n command.addOption(new Option(\"--quiet\", \"Suppress stdout output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n}\n\nfunction buildRequest(definition: CommandDefinition, options: CommandOptions, body: unknown) {\n let resolvedPath = definition.api.path;\n const query: Record<string, string | undefined> = {};\n\n for (const parameter of definition.parameters) {\n const value = asOptionalString(options[toOptionKey(parameter.name)]);\n validateIdLikeInput(parameter.name, value, `parameter ${parameter.name}`);\n if (parameter.in === \"path\") {\n if (!value) {\n throw new Error(`Missing required path parameter: ${parameter.name}`);\n }\n\n resolvedPath = resolvedPath.replace(`{${parameter.name}}`, encodeURIComponent(value));\n continue;\n }\n\n if (parameter.in === \"query\") {\n query[parameter.name] = value;\n }\n }\n\n return {\n method: definition.api.method,\n path: resolvedPath,\n query,\n body,\n };\n}\n\nfunction sanitizeRequestBody(definition: CommandDefinition, body: unknown): unknown {\n if (body === undefined) {\n return undefined;\n }\n\n if (definition.module === \"workflow\" && definition.name === \"createForm\") {\n return sanitizeWorkflowCreateFormBody(body);\n }\n\n return body;\n}\n\nfunction sanitizeWorkflowCreateFormBody(body: unknown): unknown {\n if (!isRecord(body)) {\n return body;\n }\n\n const sanitized: Record<string, unknown> = { ...body };\n delete sanitized.formId;\n\n if (Array.isArray(body.fields)) {\n sanitized.fields = body.fields.map((field) => {\n if (!isRecord(field)) {\n return field;\n }\n\n const sanitizedField: Record<string, unknown> = { ...field };\n delete sanitizedField.fieldId;\n return sanitizedField;\n });\n }\n\n return sanitized;\n}\n\nfunction validateRequestBody(definition: CommandDefinition, body: unknown): void {\n if (!definition.hasRequestBody || body === undefined || !definition.requestBodySchema) {\n return;\n }\n\n const issues: string[] = [];\n validateValueAgainstSchema(body, definition.requestBodySchema, \"$\", issues);\n validateIdLikeBodyValues(body, \"$\", issues);\n validateCustomBodyRules(definition, body, issues);\n if (issues.length > 0) {\n throw new Error(`Request body validation failed for ${definition.module} ${definition.name}:\\n${issues.join(\"\\n\")}`);\n }\n}\n\nfunction validateCustomBodyRules(definition: CommandDefinition, body: unknown, issues: string[]): void {\n if (!isRecord(body)) {\n return;\n }\n\n if (definition.module === \"project\" && definition.name === \"createPlan\") {\n const type = body.type;\n if (typeof type !== \"string\" || !createPlanTypes.has(type)) {\n issues.push(\n `$.type: invalid module type ${JSON.stringify(type)}. Allowed values: ${Array.from(createPlanTypes).join(\", \")}`,\n );\n }\n }\n}\n\nfunction validateValueAgainstSchema(\n value: unknown,\n schema: RequestBodySchemaDefinition,\n path: string,\n issues: string[],\n): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (schema.type === \"object\" && isRecord(value)) {\n for (const requiredKey of schema.required ?? []) {\n if (!(requiredKey in value)) {\n issues.push(`${path}.${requiredKey}: missing required field`);\n }\n }\n\n for (const [propertyName, propertySchema] of Object.entries(schema.properties ?? {})) {\n if (propertyName in value) {\n validateValueAgainstSchema(value[propertyName], propertySchema, `${path}.${propertyName}`, issues);\n }\n }\n return;\n }\n\n if (schema.type === \"array\" && Array.isArray(value)) {\n value.forEach((item, index) => {\n if (schema.items) {\n validateValueAgainstSchema(item, schema.items, `${path}[${index}]`, issues);\n }\n });\n return;\n }\n\n if (schema.type === \"string\" && typeof value === \"string\") {\n validateStringByDescription(value, schema.description, path, issues);\n }\n}\n\nfunction validateIdLikeBodyValues(value: unknown, path: string, issues: string[]): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n validateIdLikeBodyValues(item, `${path}[${index}]`, issues);\n });\n return;\n }\n\n if (!isRecord(value)) {\n return;\n }\n\n for (const [key, fieldValue] of Object.entries(value)) {\n const nextPath = `${path}.${key}`;\n if (looksLikeIdField(key)) {\n const issue = getIdLikeValidationIssue(fieldValue, nextPath);\n if (issue) {\n issues.push(issue);\n }\n }\n\n validateIdLikeBodyValues(fieldValue, nextPath, issues);\n }\n}\n\nfunction validateIdLikeInput(name: string, value: string | undefined, label: string): void {\n if (!looksLikeIdField(name) || value === undefined) {\n return;\n }\n\n const issue = getIdLikeValidationIssue(value, label);\n if (issue) {\n throw new Error(issue);\n }\n}\n\nfunction looksLikeIdField(name: string): boolean {\n return /ids?$/i.test(name);\n}\n\nfunction getIdLikeValidationIssue(value: unknown, label: string): string | undefined {\n if (typeof value === \"number\") {\n return `${label}: invalid id value ${value}. Id fields must use string ids, not numbers.`;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n if (/^\\d+$/.test(trimmed)) {\n return `${label}: invalid id value \"${value}\". Id fields must not be pure digits.`;\n }\n\n if (/^\\d+(,\\d+)+$/.test(trimmed)) {\n return `${label}: invalid id value \"${value}\". Id lists must not contain pure numeric ids.`;\n }\n\n return undefined;\n }\n\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n const nestedIssue = getIdLikeValidationIssue(value[index], `${label}[${index}]`);\n if (nestedIssue) {\n return nestedIssue;\n }\n }\n }\n\n return undefined;\n}\n\nfunction validateStringByDescription(\n value: string,\n description: string | undefined,\n path: string,\n issues: string[],\n): void {\n if (!description) {\n return;\n }\n\n if (description.includes(\"仅支持yyyy-MM-dd、yyyy-MM-dd'T'HH:mm:ssXXX两种格式\")) {\n const isDateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(value);\n const isOffsetDateTime = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$/.test(value);\n if (!isDateOnly && !isOffsetDateTime) {\n issues.push(`${path}: invalid format \"${value}\". Allowed formats: yyyy-MM-dd or yyyy-MM-dd'T'HH:mm:ssXXX`);\n }\n }\n}\n\nasync function readBody(options: CommandOptions): Promise<unknown> {\n if (options.body && options.bodyFile) {\n throw new Error(\"Use either --body or --body-file, not both.\");\n }\n\n if (options.body) {\n return JSON.parse(options.body);\n }\n\n if (options.bodyFile) {\n return JSON.parse(await readFile(options.bodyFile, \"utf8\"));\n }\n\n return undefined;\n}\n\nfunction optionName(parameterName: string): `--${string} <value>` {\n return `--${toKebabCase(parameterName)} <value>`;\n}\n\nfunction toOptionKey(parameterName: string): string {\n return toCamelCase(toKebabCase(parameterName));\n}\n\nfunction toKebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/_/g, \"-\")\n .toLowerCase();\n}\n\nfunction toCamelCase(value: string): string {\n return value.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction tokenize(input: string): string[] {\n const normalized = normalizeText(input);\n const tokens = normalized.split(/[\\s/_-]+/).filter(Boolean);\n const cjkRuns = normalized.match(/[\\p{Script=Han}]{2,}/gu) ?? [];\n\n for (const run of cjkRuns) {\n tokens.push(run);\n for (let index = 0; index < run.length - 1; index += 1) {\n tokens.push(run.slice(index, index + 2));\n }\n }\n\n return Array.from(new Set(tokens));\n}\n\nfunction scoreCommand(command: CommandDefinition, query: string, keywords: string[]): number {\n let score = 0;\n const haystack = normalizeText([\n command.name,\n ...command.aliases,\n command.summary,\n command.description,\n command.api?.path ?? \"\",\n ...command.keywords,\n ...command.parameters.map((parameter) => parameter.name),\n ...command.parameters.map((parameter) => parameter.description ?? \"\"),\n ].join(\" \"));\n const normalizedQuery = normalizeText(query);\n const matchedIntentKeywords = keywords.filter((keyword) => haystack.includes(keyword));\n\n if (normalizedQuery && haystack.includes(normalizedQuery)) {\n score += Math.max(8, normalizedQuery.length);\n }\n\n for (const keyword of matchedIntentKeywords) {\n score += keyword.length > 6 ? 6 : keyword.length > 3 ? 3 : 1;\n }\n\n score += scoreRsqIntentBoost(command, normalizedQuery, matchedIntentKeywords);\n\n for (const antiKeyword of command.antiKeywords ?? []) {\n const normalizedAntiKeyword = normalizeText(antiKeyword);\n if (!normalizedAntiKeyword) {\n continue;\n }\n\n if (normalizedQuery.includes(normalizedAntiKeyword) || haystack.includes(normalizedAntiKeyword)) {\n score -= normalizedAntiKeyword.length > 3 ? 4 : 2;\n }\n }\n\n return score;\n}\n\nconst rsqDomainKeywords = [\n \"日事清\",\n \"rsq\",\n \"rishiqing\",\n \"项目\",\n \"模块\",\n \"卡片\",\n \"任务\",\n \"流程\",\n \"流程应用\",\n \"流程实例\",\n \"步骤\",\n \"表单\",\n \"字段\",\n \"审核项\",\n \"审批\",\n \"多维表格\",\n \"数据表\",\n \"数据\",\n \"成员\",\n \"负责人\",\n \"执行人\",\n \"参与人\",\n].map(normalizeText);\n\nconst rsqModuleIntentKeywords: Record<string, string[]> = {\n project: [\"项目\", \"模块\", \"卡片\", \"项目成员\", \"项目下计划\", \"项目概览\"],\n task: [\"任务\", \"卡片\", \"执行人\", \"负责人\", \"参与人\", \"评论\", \"完成任务\"],\n workflow: [\"流程\", \"流程应用\", \"流程实例\", \"步骤\", \"表单\", \"字段\", \"审核项\", \"审批\"],\n datasheet: [\"多维表格\", \"数据表\", \"记录\", \"字段\", \"数据\"],\n contacts: [\"成员\", \"用户\", \"通讯录\", \"员工\", \"姓名解析\"],\n};\n\nconst actionIntentKeywords: Array<{ action: \"create\" | \"get\" | \"list\" | \"update\" | \"delete\" | \"complete\"; keywords: string[] }> = [\n { action: \"create\", keywords: [\"创建\", \"新建\", \"新增\", \"添加\", \"建一个\", \"建\"] },\n { action: \"get\", keywords: [\"查询\", \"查看\", \"获取\", \"详情\", \"查某个\", \"查一下\", \"查\"] },\n { action: \"list\", keywords: [\"列表\", \"全部\", \"批量获取\", \"有哪些\", \"列出\"] },\n { action: \"update\", keywords: [\"更新\", \"修改\", \"编辑\", \"设置\", \"调整\", \"更换\"] },\n { action: \"delete\", keywords: [\"删除\", \"移除\"] },\n { action: \"complete\", keywords: [\"完成\", \"提交\", \"通过\", \"拒绝\", \"关闭\"] },\n];\n\nfunction scoreRsqIntentBoost(command: CommandDefinition, normalizedQuery: string, matchedIntentKeywords: string[]): number {\n let score = 0;\n\n if (includesAny(normalizedQuery, rsqDomainKeywords)) {\n score += 2;\n }\n\n const moduleIntentKeywords = rsqModuleIntentKeywords[command.module] ?? [];\n const matchedModuleIntents = moduleIntentKeywords.filter((keyword) => normalizedQuery.includes(normalizeText(keyword)));\n\n if (matchedModuleIntents.length > 0) {\n score += 6 + matchedModuleIntents.length * 2;\n }\n\n if (command.module === \"workflow\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"表单字段\") || keyword.includes(\"字段值\"))) {\n score += 3;\n }\n\n if (command.module === \"task\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"负责人\") || keyword.includes(\"执行人\") || keyword.includes(\"参与人\"))) {\n score += 3;\n }\n\n if (command.module === \"project\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"模块\") || keyword.includes(\"卡片\"))) {\n score += 3;\n }\n\n if (command.module === \"datasheet\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"多维表格\") || keyword.includes(\"数据表\") || keyword === \"数据\")) {\n score += 3;\n }\n\n score += scoreActionIntentBoost(command, normalizedQuery);\n\n return score;\n}\n\nfunction scoreActionIntentBoost(command: CommandDefinition, normalizedQuery: string): number {\n const matchedActions = actionIntentKeywords\n .filter(({ keywords }) => keywords.some((keyword) => normalizedQuery.includes(normalizeText(keyword))))\n .map(({ action }) => action);\n\n if (matchedActions.length === 0) {\n return 0;\n }\n\n const commandName = command.name.toLowerCase();\n let score = 0;\n\n for (const action of matchedActions) {\n if (commandName.startsWith(action)) {\n score += 5;\n continue;\n }\n\n if (action === \"get\" && commandName.startsWith(\"list\")) {\n score += 2;\n continue;\n }\n\n if (action === \"list\" && commandName.startsWith(\"get\")) {\n score += 1;\n continue;\n }\n }\n\n return score;\n}\n\nfunction normalizeText(value: string): string {\n return value.toLowerCase().trim();\n}\n\nfunction includesAny(value: string, patterns: string[]): boolean {\n return patterns.some((pattern) => value.includes(pattern));\n}\n\nfunction exposurePriority(command: CommandDefinition): number {\n switch (command.exposure) {\n case \"public\":\n return 3;\n case \"composed\":\n return 2;\n case \"internal\":\n return 1;\n default:\n return 0;\n }\n}\n\nfunction parsePositiveInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"Expected a positive integer.\");\n }\n\n return parsed;\n}\n\nfunction collectStrings(value: string, previous: string[]): string[] {\n previous.push(value);\n return previous;\n}\n\nasync function promptBaseUrl(currentBaseUrl: string): Promise<string> {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n try {\n const answer = (await rl.question(`Base URL domain [${currentBaseUrl}]: `)).trim();\n return normalizeBaseUrl(answer || currentBaseUrl);\n } finally {\n rl.close();\n }\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction ensureTrailingSlash(input: string): string {\n return input.endsWith(\"/\") ? input : `${input}/`;\n}\n\nfunction extractUserRows(payload: unknown): Array<{ userId: string; userName: string }> {\n if (\n typeof payload !== \"object\" ||\n payload === null ||\n !(\"data\" in payload) ||\n !Array.isArray((payload as { data?: unknown }).data)\n ) {\n throw new Error(\"Unexpected contacts response shape.\");\n }\n\n return (payload as { data: unknown[] }).data\n .filter(\n (row): row is { userId: string; userName: string } =>\n typeof row === \"object\" &&\n row !== null &&\n typeof (row as { userId?: unknown }).userId === \"string\" &&\n typeof (row as { userName?: unknown }).userName === \"string\",\n )\n .map((row) => ({\n userId: row.userId,\n userName: row.userName,\n }));\n}\n\nasync function resolveUserByName(userName: string): Promise<{\n userName: string;\n userId: string;\n matchType: \"exact\" | \"fuzzy\";\n matchedUserName?: string;\n}> {\n const payload = await executeRequest({\n method: \"GET\",\n path: \"/rsq/api/v1/contacts/list-all-user\",\n });\n\n const users = extractUserRows(payload);\n const exactMatches = users.filter((user) => user.userName === userName);\n\n if (exactMatches.length === 1) {\n return {\n userName,\n userId: exactMatches[0].userId,\n matchType: \"exact\",\n };\n }\n\n if (exactMatches.length > 1) {\n throw new Error(\n `Ambiguous userName \"${userName}\". Matched users: ${exactMatches.map((user) => `${user.userName}(${user.userId})`).join(\", \")}`,\n );\n }\n\n const fuzzyMatches = users.filter((user) => user.userName.includes(userName));\n if (fuzzyMatches.length === 1) {\n return {\n userName,\n userId: fuzzyMatches[0].userId,\n matchType: \"fuzzy\",\n matchedUserName: fuzzyMatches[0].userName,\n };\n }\n\n if (fuzzyMatches.length > 1) {\n throw new Error(\n `No exact match for \"${userName}\". Fuzzy matches: ${fuzzyMatches.map((user) => `${user.userName}(${user.userId})`).join(\", \")}`,\n );\n }\n\n throw new Error(`No user matched userName \"${userName}\".`);\n}\n\nfunction buildTaskUserByNameRequest(commandName: string, taskId: string, userId: string) {\n if (commandName === \"setTaskExecutorByName\") {\n return {\n method: \"PUT\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/executor`,\n body: {\n executorUserIds: [userId],\n },\n } as const;\n }\n\n if (commandName === \"setTaskResponsibleByName\") {\n return {\n method: \"PUT\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/responsible`,\n body: {\n responsibleId: userId,\n },\n } as const;\n }\n\n if (commandName === \"addTaskParticipantByName\") {\n return {\n method: \"POST\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/participants`,\n body: {\n participantUserIds: [userId],\n },\n } as const;\n }\n\n throw new Error(`Unsupported composed task command: ${commandName}`);\n}\n\nfunction parseNameList(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { z } from \"zod\";\n\nconst profileSchema = z.object({\n apiKey: z.string().min(1),\n});\n\nconst configSchema = z.object({\n activeProfile: z.string().min(1),\n profiles: z.record(z.string(), profileSchema),\n baseUrl: z.string().min(1).optional(),\n});\n\nconst appConfigSchema = z.object({\n baseUrl: z.string().min(1),\n});\n\nexport type RsqConfig = z.infer<typeof configSchema>;\nexport type RsqProfile = z.infer<typeof profileSchema>;\nexport type RsqAppConfig = z.infer<typeof appConfigSchema>;\n\nconst APP_CONFIG_FILE = \"rsq-cli.config.json\";\n\nfunction getConfigDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME;\n if (xdg) {\n return path.join(xdg, \"rsq-cli\");\n }\n\n return path.join(os.homedir(), \".config\", \"rsq-cli\");\n}\n\nexport function getConfigPath(): string {\n return path.join(getConfigDir(), \"config.json\");\n}\n\nexport function getAppConfigPath(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../\", APP_CONFIG_FILE),\n path.resolve(moduleDir, \"../../\", APP_CONFIG_FILE),\n path.resolve(process.cwd(), APP_CONFIG_FILE),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Missing ${APP_CONFIG_FILE}. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n\nexport async function readAppConfig(): Promise<RsqAppConfig> {\n const bundledFile = await readFile(getAppConfigPath(), \"utf8\");\n const bundled = appConfigSchema.parse(JSON.parse(bundledFile));\n const userConfig = await readConfig();\n\n return {\n baseUrl: userConfig?.baseUrl ? normalizeBaseUrl(userConfig.baseUrl) : bundled.baseUrl,\n };\n}\n\nexport async function readConfig(): Promise<RsqConfig | null> {\n try {\n const file = await readFile(getConfigPath(), \"utf8\");\n return configSchema.parse(JSON.parse(file));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n\n throw error;\n }\n}\n\nexport async function writeConfig(config: RsqConfig): Promise<void> {\n await mkdir(getConfigDir(), { recursive: true });\n await writeFile(getConfigPath(), `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function initConfig(apiKey: string): Promise<RsqConfig> {\n const config: RsqConfig = {\n activeProfile: \"default\",\n profiles: {\n default: {\n apiKey,\n },\n },\n };\n\n await writeConfig(config);\n return config;\n}\n\nexport async function setBaseUrl(baseUrl: string): Promise<RsqConfig> {\n const current = await readConfig();\n if (!current) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const next: RsqConfig = {\n ...current,\n baseUrl: normalizeBaseUrl(baseUrl),\n };\n\n await writeConfig(next);\n return next;\n}\n\nexport function normalizeBaseUrl(input: string): string {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new Error(\"baseUrl is required.\");\n }\n\n const candidate = /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\n let parsed: URL;\n try {\n parsed = new URL(candidate);\n } catch {\n throw new Error(`Invalid baseUrl: ${input}`);\n }\n\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n throw new Error(\"baseUrl must use http or https.\");\n }\n\n if (!parsed.hostname) {\n throw new Error(\"baseUrl hostname is required.\");\n }\n\n if (parsed.pathname !== \"/\" || parsed.search || parsed.hash) {\n throw new Error(\"baseUrl must be a domain only, without path, query, or hash.\");\n }\n\n return parsed.origin;\n}\n\nexport async function requireActiveProfile(): Promise<RsqProfile> {\n const config = await readConfig();\n if (!config) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const profile = config.profiles[config.activeProfile];\n if (!profile) {\n throw new Error(`Active profile \"${config.activeProfile}\" is missing.`);\n }\n\n return profile;\n}\n","import { existsSync } from \"node:fs\";\nimport { cp, mkdir, readdir } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type KnownInstallTarget = {\n name: string;\n label: string;\n description: string;\n dir: string;\n};\n\nexport type InstallOptions = {\n targets?: string[];\n extraDirs?: string[];\n dryRun?: boolean;\n};\n\nexport type InstallDestination = {\n kind: \"known\" | \"custom\";\n name: string;\n label: string;\n dir: string;\n};\n\nexport type InstallResult = {\n sourceDir: string;\n skills: string[];\n installed: Array<InstallDestination & { created: boolean }>;\n};\n\nconst KNOWN_INSTALL_TARGETS: KnownInstallTarget[] = [\n {\n name: \"codex\",\n label: \"Codex\",\n description: \"Install built-in skills into the default Codex skills directory\",\n dir: path.join(os.homedir(), \".agents\", \"skills\"),\n },\n {\n name: \"claude-code\",\n label: \"Claude Code\",\n description: \"Install built-in skills into the default Claude Code skills directory\",\n dir: path.join(os.homedir(), \".claude\", \"skills\"),\n },\n {\n name: \"openclaw\",\n label: \"OpenClaw\",\n description: \"Install built-in skills into the default OpenClaw skills directory\",\n dir: path.join(os.homedir(), \".openclaw\", \"skills\"),\n },\n];\n\nexport function listKnownInstallTargets(): KnownInstallTarget[] {\n return KNOWN_INSTALL_TARGETS.map((target) => ({ ...target }));\n}\n\nexport function resolveBundledSkillsDir(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../\", \"skills\"),\n path.resolve(moduleDir, \"../../\", \"skills\"),\n path.resolve(process.cwd(), \"skills\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Missing bundled skills directory. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n\nexport async function installBundledSkills(options: InstallOptions = {}): Promise<InstallResult> {\n const sourceDir = resolveBundledSkillsDir();\n const skills = await listBundledSkills(sourceDir);\n if (skills.length === 0) {\n throw new Error(`No bundled skills found in ${sourceDir}`);\n }\n\n const destinations = resolveInstallDestinations(options);\n const installed: Array<InstallDestination & { created: boolean }> = [];\n\n for (const destination of destinations) {\n const created = !existsSync(destination.dir);\n if (!options.dryRun) {\n await mkdir(destination.dir, { recursive: true });\n }\n\n for (const skill of skills) {\n const from = path.join(sourceDir, skill);\n const to = path.join(destination.dir, skill);\n if (!options.dryRun) {\n await cp(from, to, { recursive: true, force: true });\n }\n }\n\n installed.push({ ...destination, created });\n }\n\n return {\n sourceDir,\n skills,\n installed,\n };\n}\n\nfunction resolveInstallDestinations(options: InstallOptions): InstallDestination[] {\n const requestedTargets = options.targets?.flatMap(splitCsvValues).filter(Boolean) ?? [];\n const extraDirs = options.extraDirs?.flatMap(splitCsvValues).filter(Boolean) ?? [];\n const destinations: InstallDestination[] = [];\n const seen = new Set<string>();\n\n const targets = requestedTargets.length > 0\n ? requestedTargets.map(resolveKnownTargetByName)\n : listKnownInstallTargets();\n\n for (const target of targets) {\n pushUniqueDestination(\n destinations,\n seen,\n {\n kind: \"known\",\n name: target.name,\n label: target.label,\n dir: path.resolve(target.dir),\n },\n );\n }\n\n for (const dir of extraDirs) {\n pushUniqueDestination(\n destinations,\n seen,\n {\n kind: \"custom\",\n name: \"custom\",\n label: \"Custom\",\n dir: path.resolve(expandHome(dir)),\n },\n );\n }\n\n return destinations;\n}\n\nfunction resolveKnownTargetByName(name: string): KnownInstallTarget {\n const normalized = name.trim().toLowerCase();\n const found = KNOWN_INSTALL_TARGETS.find((target) => target.name === normalized);\n if (!found) {\n throw new Error(`Unknown install target: ${name}. Supported targets: ${KNOWN_INSTALL_TARGETS.map((target) => target.name).join(\", \")}`);\n }\n\n return found;\n}\n\nfunction pushUniqueDestination(destinations: InstallDestination[], seen: Set<string>, destination: InstallDestination): void {\n const key = path.normalize(destination.dir);\n if (seen.has(key)) {\n return;\n }\n\n seen.add(key);\n destinations.push(destination);\n}\n\nfunction expandHome(input: string): string {\n if (input === \"~\") {\n return os.homedir();\n }\n\n if (input.startsWith(\"~/\")) {\n return path.join(os.homedir(), input.slice(2));\n }\n\n return input;\n}\n\nfunction splitCsvValues(value: string): string[] {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nasync function listBundledSkills(sourceDir: string): Promise<string[]> {\n const entries = await readdir(sourceDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort((left, right) => left.localeCompare(right));\n}\n","import { readAppConfig, requireActiveProfile } from \"./config.js\";\n\nexport type RequestShape = {\n method: string;\n path: string;\n query?: Record<string, string | undefined>;\n body?: unknown;\n};\n\nexport async function executeRequest(shape: RequestShape): Promise<unknown> {\n const profile = await requireActiveProfile();\n const appConfig = await readAppConfig();\n const url = new URL(shape.path, ensureTrailingSlash(appConfig.baseUrl));\n\n for (const [key, value] of Object.entries(shape.query ?? {})) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n\n const headers: Record<string, string> = {\n \"X-Rsq-Api-key\": profile.apiKey,\n };\n\n let body: string | undefined;\n if (shape.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(shape.body);\n }\n\n const response = await fetch(url, {\n method: shape.method,\n headers,\n body,\n });\n\n const text = await response.text();\n const payload = tryParseJson(text);\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status} ${response.statusText}: ${typeof payload === \"string\" ? payload : JSON.stringify(payload)}`,\n );\n }\n\n return payload;\n}\n\nfunction ensureTrailingSlash(input: string): string {\n return input.endsWith(\"/\") ? input : `${input}/`;\n}\n\nfunction tryParseJson(text: string): unknown {\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","type OutputMode = \"json\" | \"raw\" | \"table\" | \"text\";\n\nexport type OutputOptions = {\n json?: boolean;\n raw?: boolean;\n table?: boolean;\n quiet?: boolean;\n};\n\nexport function resolveOutputMode(options: OutputOptions): OutputMode {\n if (options.raw) {\n return \"raw\";\n }\n\n if (options.table) {\n return \"table\";\n }\n\n if (options.json) {\n return \"json\";\n }\n\n return \"text\";\n}\n\nexport function printOutput(payload: unknown, options: OutputOptions): void {\n const mode = resolveOutputMode(options);\n\n if (mode === \"json\" || mode === \"raw\") {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n\n if (mode === \"table\") {\n const rendered = renderTable(payload);\n process.stdout.write(`${rendered}\\n`);\n return;\n }\n\n if (typeof payload === \"string\") {\n process.stdout.write(`${payload}\\n`);\n return;\n }\n\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nfunction renderTable(payload: unknown): string {\n if (!Array.isArray(payload) || payload.length === 0) {\n return JSON.stringify(payload, null, 2);\n }\n\n if (payload.some((item) => typeof item !== \"object\" || item === null || Array.isArray(item))) {\n return JSON.stringify(payload, null, 2);\n }\n\n const rows = payload as Array<Record<string, unknown>>;\n const columns = Array.from(new Set(rows.flatMap((row) => Object.keys(row))));\n const widths = new Map<string, number>();\n\n for (const column of columns) {\n widths.set(\n column,\n Math.max(column.length, ...rows.map((row) => stringifyCell(row[column]).length)),\n );\n }\n\n const separator = columns.map((column) => \"-\".repeat(widths.get(column) ?? column.length)).join(\" \");\n const header = columns.map((column) => column.padEnd(widths.get(column) ?? column.length)).join(\" \");\n const lines = rows.map((row) =>\n columns.map((column) => stringifyCell(row[column]).padEnd(widths.get(column) ?? column.length)).join(\" \"),\n );\n\n return [header, separator, ...lines].join(\"\\n\");\n}\n\nfunction stringifyCell(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type ParameterDefinition = {\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n required: boolean;\n description?: string;\n schemaType?: string;\n};\n\nexport type OperationDefinition = {\n module: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n path: string;\n operationId: string;\n summary: string;\n description: string;\n parameters: ParameterDefinition[];\n hasRequestBody: boolean;\n requestBodySchema?: RequestBodySchemaDefinition;\n};\n\nexport type RequestBodySchemaDefinition = {\n type?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, RequestBodySchemaDefinition>;\n items?: RequestBodySchemaDefinition;\n};\n\ntype OpenApiDocument = {\n paths?: Record<string, Record<string, Record<string, unknown>>>;\n};\n\nconst operationIdOverrides: Record<string, string> = {\n \"GET /rsq/api/v1/workflow/process-infos/list/{flowApplicationId}\": \"listProcessInfosByFlowApplicationId\",\n \"GET /rsq/api/v1/projects\": \"listProjects\",\n};\n\nlet cachedOperations: OperationDefinition[] | null = null;\n\nexport function loadOperations(): OperationDefinition[] {\n if (cachedOperations) {\n return cachedOperations;\n }\n\n const documentPath = resolveOpenApiPath();\n const document = JSON.parse(readFileSync(documentPath, \"utf8\")) as OpenApiDocument;\n const operations: OperationDefinition[] = [];\n\n for (const [apiPath, item] of Object.entries(document.paths ?? {})) {\n for (const [method, rawOperation] of Object.entries(item)) {\n const normalizedMethod = method.toUpperCase();\n if (![\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(normalizedMethod)) {\n continue;\n }\n\n const operation = rawOperation as {\n operationId?: string;\n summary?: string;\n description?: string;\n tags?: string[];\n parameters?: Array<{\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n required?: boolean;\n description?: string;\n schema?: { type?: string };\n }>;\n requestBody?: {\n content?: {\n \"application/json\"?: {\n schema?: JsonSchemaLike;\n };\n };\n };\n };\n const operationId = resolveOperationId(apiPath, normalizedMethod, operation.operationId);\n const resolvedParameters = (operation.parameters ?? [])\n .filter((parameter) => parameter.name !== \"X-Rsq-Api-key\")\n .map((parameter) => ({\n name: parameter.name,\n in: parameter.in,\n required: Boolean(parameter.required),\n description: parameter.description,\n schemaType: parameter.schema?.type,\n }));\n\n operations.push({\n module: (operation.tags?.[0] ?? \"unknown\").toLowerCase(),\n method: normalizedMethod as OperationDefinition[\"method\"],\n path: apiPath,\n operationId,\n summary: operation.summary ?? \"\",\n description: operation.description ?? operation.summary ?? \"\",\n parameters: resolvedParameters,\n hasRequestBody: Boolean(operation.requestBody),\n requestBodySchema: extractRequestBodySchema(operation.requestBody),\n });\n }\n }\n\n cachedOperations = operations.sort((left, right) => left.operationId.localeCompare(right.operationId));\n return cachedOperations;\n}\n\ntype JsonSchemaLike = {\n type?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, JsonSchemaLike>;\n items?: JsonSchemaLike;\n};\n\nfunction extractRequestBodySchema(\n requestBody:\n | {\n content?: {\n \"application/json\"?: {\n schema?: JsonSchemaLike;\n };\n };\n }\n | undefined,\n): RequestBodySchemaDefinition | undefined {\n const schema = requestBody?.content?.[\"application/json\"]?.schema;\n if (!schema) {\n return undefined;\n }\n\n return normalizeJsonSchema(schema);\n}\n\nfunction normalizeJsonSchema(schema: JsonSchemaLike): RequestBodySchemaDefinition {\n return {\n type: schema.type,\n description: schema.description,\n required: schema.required,\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeJsonSchema(value)]),\n )\n : undefined,\n items: schema.items ? normalizeJsonSchema(schema.items) : undefined,\n };\n}\n\nfunction resolveOperationId(apiPath: string, method: string, operationId: string | undefined): string {\n const override = operationIdOverrides[`${method} ${apiPath}`];\n if (override) {\n return override;\n }\n\n return operationId ?? `${method}:${apiPath}`;\n}\n\nfunction resolveOpenApiPath(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../rishiqing.openapi.json\"),\n path.resolve(moduleDir, \"../../rishiqing.openapi.json\"),\n path.resolve(process.cwd(), \"rishiqing.openapi.json\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Unable to locate rishiqing.openapi.json. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n","import type { Exposure, RsqModule } from \"./types.js\";\n\ntype Override = {\n aliases?: string[];\n keywords?: string[];\n antiKeywords?: string[];\n description?: string;\n exposure?: Exposure;\n};\n\nexport const moduleOrder: RsqModule[] = [\"datasheet\", \"workflow\", \"contacts\", \"project\", \"task\"];\n\nexport const moduleDescriptions: Record<RsqModule, string> = {\n datasheet: \"Datasheet APIs\",\n workflow: \"Workflow APIs\",\n contacts: \"Contacts APIs\",\n project: \"Project APIs\",\n task: \"Task APIs\",\n};\n\nexport const operationOverrides: Record<string, Override> = {\n listTeamDatasheets: {\n aliases: [\"list-datasheets\"],\n keywords: [\"datasheet\", \"table\", \"list team datasheets\"],\n },\n getDatasheetFields: {\n aliases: [\"get-fields\"],\n keywords: [\"datasheet fields\", \"column definitions\"],\n },\n getDatasheetRecords: {\n aliases: [\"list-records\"],\n keywords: [\"datasheet records\", \"rows\", \"query rows\"],\n },\n createDatasheetRecords: {\n aliases: [\"create-records\"],\n keywords: [\"create datasheet record\", \"insert rows\"],\n },\n updateDatasheetRecords: {\n aliases: [\"update-records\"],\n keywords: [\"update datasheet record\", \"modify rows\"],\n },\n deleteDatasheetRecords: {\n aliases: [\"delete-records\"],\n keywords: [\"delete datasheet record\", \"remove rows\"],\n },\n listFlowApplicationTemplates: {\n aliases: [\"list-templates\"],\n keywords: [\"workflow templates\", \"flow templates\", \"流程模板\", \"审批模板\", \"模板列表\"],\n },\n listFlowApplications: {\n aliases: [\"list-apps\"],\n keywords: [\"list workflow applications\", \"list flow apps\", \"流程应用列表\", \"审批流程列表\"],\n },\n listProcessInfosByFlowApplicationId: {\n aliases: [\"list-processes\"],\n keywords: [\"获取已发起的流程列表\", \"流程实例列表\", \"已发起流程列表\", \"运行中的流程列表\", \"list process infos\"],\n },\n createFlowApplication: {\n aliases: [\"create-app\"],\n keywords: [\"create workflow application\", \"new flow app\", \"创建流程应用\", \"新建流程应用\", \"新建审批流程\"],\n },\n createStepInfo: {\n aliases: [\"create-step\"],\n keywords: [\"创建步骤配置\", \"新增步骤\", \"新建步骤\", \"流程步骤\", \"审批步骤\", \"step config\"],\n },\n updateStepInfo: {\n aliases: [\"update-step\"],\n keywords: [\"更新步骤配置\", \"修改步骤配置\", \"编辑步骤\", \"修改步骤名称\", \"step config\"],\n },\n createForm: {\n aliases: [\"create-form\"],\n keywords: [\"创建表单配置\", \"新增表单\", \"新建表单\", \"表单结构\", \"表单字段定义\", \"workflow form\"],\n },\n updateForm: {\n aliases: [\"update-form\"],\n keywords: [\"更新表单配置\", \"修改表单配置\", \"编辑表单\", \"修改表单字段定义\", \"workflow form\"],\n },\n createAuditInfo: {\n aliases: [\"create-audit\"],\n keywords: [\"创建审核项配置\", \"新增审核项\", \"新建审核节点\", \"添加审核人配置\", \"audit config\"],\n },\n updateAuditInfo: {\n aliases: [\"update-audit\"],\n keywords: [\"更新审核项配置\", \"修改审核项配置\", \"编辑审核节点\", \"修改审核人配置\", \"audit config\"],\n },\n updateProcessInfoStep: {\n aliases: [\"update-running-step\", \"set-running-step-executor\"],\n keywords: [\n \"修改运行中的步骤属性\",\n \"修改进行中步骤的执行人\",\n \"修改步骤执行人\",\n \"调整步骤执行人\",\n \"设置步骤执行人\",\n \"运行中步骤执行人\",\n \"步骤执行人\",\n \"步骤限定时间\",\n \"deadTime\",\n \"userIds\",\n ],\n antiKeywords: [\"字段值\", \"表单字段\", \"fieldValue\", \"fieldId\"],\n },\n updateProcessInfoAudit: {\n aliases: [\"update-running-audit\", \"set-running-audit-users\"],\n keywords: [\"修改运行中的审核项属性\", \"修改审核人\", \"调整审核人\", \"运行中审核人\", \"audit user\"],\n antiKeywords: [\"执行人\", \"字段值\", \"表单字段\", \"步骤状态\"],\n description: \"调整运行中审核项的审核人。这个接口用于审核项,不用于步骤状态流转。\",\n exposure: \"internal\",\n },\n updateProcessInfoStepField: {\n aliases: [\"update-step-field-value\", \"set-step-field-value\"],\n keywords: [\n \"修改步骤表单中的字段值\",\n \"修改字段值\",\n \"设置字段值\",\n \"填写字段\",\n \"更新表单字段值\",\n \"步骤字段值\",\n \"表单字段值\",\n \"fieldValue\",\n ],\n antiKeywords: [\"执行人\", \"审核人\", \"负责人\", \"参与人\", \"成员\", \"deadTime\", \"限定时间\"],\n exposure: \"internal\",\n },\n getProcessInfoStep: {\n aliases: [\"get-running-step\"],\n keywords: [\"查询运行中步骤\", \"查看步骤详情\", \"查看进行中步骤\", \"running step detail\"],\n },\n listStepInfosByFlowApplicationId: {\n aliases: [\"list-steps\"],\n keywords: [\"查询步骤列表\", \"流程步骤列表\", \"审批步骤列表\", \"list workflow steps\"],\n },\n startProcessInfosBatch: {\n aliases: [\"start-process-batch\"],\n keywords: [\"批量发起流程\", \"批量启动流程实例\", \"批量提交流程\", \"start workflow process batch\"],\n },\n getProcessInfo: {\n aliases: [\"get-process\"],\n keywords: [\"process info\", \"workflow instance\", \"流程实例\", \"审批实例\", \"查看流程实例\"],\n },\n listAllUsers: {\n aliases: [\"list-users\"],\n keywords: [\"contacts\", \"users\", \"employees\"],\n },\n createProject: {\n aliases: [\"create\"],\n keywords: [\"create project\", \"new project\", \"创建项目\", \"新建项目\"],\n },\n listProjects: {\n aliases: [\"list\"],\n keywords: [\"获取项目列表\", \"项目列表\", \"全部项目\", \"查询项目列表\", \"list projects\"],\n },\n getProjectById: {\n aliases: [\"get\"],\n keywords: [\"project detail\", \"get project\", \"项目详情\", \"查看项目\"],\n },\n listPlansByProjectIds: {\n aliases: [\"list-plans\"],\n keywords: [\"plans\", \"project plans\", \"模块列表\", \"项目模块\", \"查询模块\"],\n },\n createPlan: {\n aliases: [\"create-plan\"],\n keywords: [\"创建模块\", \"新增模块\", \"新建模块\", \"项目模块\", \"project plan\", \"task\", \"statistic\", \"overview\", \"folder\", \"risk\", \"workflow\", \"datasheet\", \"deliverable\"],\n description:\n \"创建项目下的模块。type 仅支持这些值:task、statistic、overview、folder、risk、workflow、datasheet、deliverable。\",\n },\n updatePlan: {\n aliases: [\"update-plan\"],\n keywords: [\"修改模块\", \"更新模块\", \"编辑模块\", \"project plan\"],\n },\n createCard: {\n aliases: [\"create-card\"],\n keywords: [\"创建卡片\", \"新增卡片\", \"新建卡片\", \"模块卡片\", \"project card\"],\n },\n updateCard: {\n aliases: [\"update-card\"],\n keywords: [\"修改卡片\", \"更新卡片\", \"编辑卡片\", \"project card\"],\n },\n updateProject: {\n aliases: [\"update-project\"],\n keywords: [\"修改项目\", \"更新项目\", \"编辑项目\", \"project info\"],\n },\n createTask: {\n aliases: [\"create\"],\n keywords: [\"create task\", \"new task\", \"创建任务\", \"新建任务\"],\n },\n getTaskById: {\n aliases: [\"get\"],\n keywords: [\"task detail\", \"get task\", \"任务详情\", \"查看任务\"],\n },\n updateTask: {\n aliases: [\"update\"],\n keywords: [\"update task\", \"edit task\", \"修改任务\", \"编辑任务\", \"更新任务信息\"],\n },\n deleteTask: {\n aliases: [\"delete\"],\n keywords: [\"delete task\", \"remove task\", \"删除任务\", \"移除任务\"],\n },\n getTaskComments: {\n aliases: [\"comments\"],\n keywords: [\"task comments\", \"list task comments\", \"任务评论\", \"评论列表\", \"查看评论\"],\n antiKeywords: [\"发表评论\", \"提交评论\", \"回复任务\"],\n },\n createTaskComment: {\n aliases: [\"comment\"],\n keywords: [\"create task comment\", \"add task comment\", \"发表评论\", \"提交评论\", \"回复任务\"],\n antiKeywords: [\"评论列表\", \"查看评论\"],\n },\n completeTask: {\n aliases: [\"complete\"],\n keywords: [\"完成任务\", \"打钩任务\", \"标记完成\", \"close task\"],\n antiKeywords: [\"创建任务\", \"修改任务\", \"发表评论\", \"评论列表\"],\n },\n updateProjectMember: {\n aliases: [\"update-project-member\"],\n keywords: [\"修改项目成员\", \"设置项目成员\", \"添加项目成员\", \"项目成员\", \"project member\"],\n antiKeywords: [\"创建项目\", \"项目信息\", \"项目模块\", \"卡片\"],\n exposure: \"internal\",\n },\n updateProcessInfoStepStatus: {\n aliases: [\"update-running-step-status\"],\n keywords: [\n \"流转流程步骤状态\",\n \"提交步骤\",\n \"完成步骤\",\n \"通过步骤\",\n \"拒绝步骤\",\n \"跳过步骤\",\n \"步骤状态\",\n \"审批通过\",\n \"审批拒绝\",\n ],\n antiKeywords: [\"执行人\", \"审核项id\", \"auditInfoId\", \"processInfoAuditId\", \"审核人\", \"字段值\", \"表单字段\"],\n description:\n \"对运行中的步骤执行状态动作。无论 action 是什么,path 参数 processInfoStepId 始终传步骤 id,不要传审核项 id。\",\n exposure: \"internal\",\n },\n updateTaskExecutor: {\n aliases: [\"update-executor\"],\n keywords: [\"修改任务执行人\", \"设置执行人\", \"调整执行人\", \"task executor\"],\n antiKeywords: [\"负责人\", \"参与人\", \"评论\"],\n exposure: \"composed\",\n },\n updateTaskResponsible: {\n aliases: [\"update-responsible\"],\n keywords: [\"修改任务负责人\", \"设置负责人\", \"调整负责人\", \"task responsible\"],\n antiKeywords: [\"执行人\", \"参与人\", \"评论\"],\n exposure: \"composed\",\n },\n addTaskParticipant: {\n aliases: [\"add-participant\"],\n keywords: [\"添加任务参与人\", \"增加参与人\", \"设置参与人\", \"task participant\"],\n antiKeywords: [\"执行人\", \"负责人\", \"评论\"],\n exposure: \"composed\",\n },\n};\n","import { loadOperations } from \"../core/openapi.js\";\nimport { moduleDescriptions, moduleOrder, operationOverrides } from \"./overrides.js\";\nimport type { CommandDefinition, Exposure, RsqModule } from \"./types.js\";\nimport type { ParameterDefinition, RequestBodySchemaDefinition } from \"../core/openapi.js\";\n\nlet cachedRegistry: CommandDefinition[] | null = null;\n\nexport function getRegistry(): CommandDefinition[] {\n if (cachedRegistry) {\n return cachedRegistry;\n }\n\n const openApiCommands: CommandDefinition[] = loadOperations()\n .filter((operation): operation is typeof operation & { module: RsqModule } => moduleOrder.includes(operation.module as RsqModule))\n .map((operation) => {\n const override = operationOverrides[operation.operationId] ?? {};\n const exposure = override.exposure ?? defaultExposure(operation.operationId);\n return {\n module: operation.module as RsqModule,\n name: operation.operationId,\n aliases: override.aliases ?? [],\n summary: operation.summary || operation.operationId,\n description: override.description ?? operation.description ?? operation.summary ?? operation.operationId,\n api: {\n method: operation.method,\n path: operation.path,\n },\n parameters: operation.parameters.map(annotateParameterDescription),\n hasRequestBody: operation.hasRequestBody,\n requestBodySchema: annotateRequestBodySchema(operation.requestBodySchema),\n keywords: dedupe([\n operation.operationId,\n operation.summary,\n operation.path,\n ...pathKeywords(operation.path),\n ...(override.keywords ?? []),\n ]),\n antiKeywords: dedupe(override.antiKeywords ?? []),\n examples: buildExamples(operation.module as RsqModule, operation.operationId, override.aliases ?? []),\n exposure,\n idempotent: operation.method === \"GET\",\n outputMode: \"json\",\n } satisfies CommandDefinition;\n });\n\n cachedRegistry = [...openApiCommands, ...buildCustomCommands()];\n\n return cachedRegistry;\n}\n\nexport function getPublicRegistry(): CommandDefinition[] {\n return getRegistry().filter((command) => command.exposure === \"public\");\n}\n\nexport function getModuleDefinitions() {\n return moduleOrder.map((module) => ({\n name: module,\n description: moduleDescriptions[module],\n }));\n}\n\nexport function findCommand(moduleName: string, commandName: string): CommandDefinition | undefined {\n const normalized = commandName.toLowerCase();\n return getRegistry().find(\n (command) =>\n command.module === moduleName &&\n (command.name.toLowerCase() === normalized || command.aliases.some((alias) => alias.toLowerCase() === normalized)),\n );\n}\n\nfunction buildExamples(module: RsqModule, name: string, aliases: string[]): string[] {\n const examples = [`rsq-cli ${module} ${name} --json`];\n if (aliases[0]) {\n examples.push(`rsq-cli ${module} ${aliases[0]} --json`);\n }\n return examples;\n}\n\nfunction annotateParameterDescription(parameter: ParameterDefinition): ParameterDefinition {\n if (!looksLikeIdField(parameter.name)) {\n return parameter;\n }\n\n return {\n ...parameter,\n description: appendIdRule(parameter.description),\n };\n}\n\nfunction annotateRequestBodySchema(\n schema: RequestBodySchemaDefinition | undefined,\n): RequestBodySchemaDefinition | undefined {\n if (!schema) {\n return undefined;\n }\n\n return {\n ...schema,\n description: schema.description,\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n {\n ...annotateRequestBodySchema(value),\n description: looksLikeIdField(key) ? appendIdRule(value.description) : value.description,\n },\n ]),\n )\n : undefined,\n items: schema.items ? annotateRequestBodySchema(schema.items) : undefined,\n };\n}\n\nfunction appendIdRule(description: string | undefined): string {\n const rule = \"必须传前缀+uuid风格的字符串 id,不要传数字类型 id,也不要传纯数字字符串。\";\n if (!description) {\n return rule;\n }\n\n return description.includes(rule) ? description : `${description} | ${rule}`;\n}\n\nfunction looksLikeIdField(name: string): boolean {\n return /ids?$/i.test(name);\n}\n\nfunction defaultExposure(operationId: string): Exposure {\n if (operationId.startsWith(\"list\") || operationId.startsWith(\"get\") || operationId.startsWith(\"create\") || operationId.startsWith(\"update\") || operationId.startsWith(\"delete\")) {\n return \"public\";\n }\n\n return \"composed\";\n}\n\nfunction pathKeywords(apiPath: string): string[] {\n return apiPath\n .split(\"/\")\n .filter(Boolean)\n .flatMap((segment) => [segment, segment.replace(/[{}]/g, \"\"), segment.replace(/-/g, \" \")]);\n}\n\nfunction dedupe(values: Array<string | undefined>): string[] {\n return Array.from(new Set(values.filter((value): value is string => Boolean(value))));\n}\n\nfunction buildCustomCommands(): CommandDefinition[] {\n return [\n {\n module: \"contacts\",\n name: \"resolveUser\",\n aliases: [\"resolve-user\"],\n summary: \"根据用户名称解析 userId\",\n description: \"先查询全部用户,再按 userName 匹配,返回唯一命中的 userId。\",\n api: {\n method: \"GET\",\n path: \"/rsq/api/v1/contacts/list-all-user\",\n },\n parameters: [\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"需要解析的人员名称\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\n \"resolve user\",\n \"userName to userId\",\n \"根据姓名找 userId\",\n \"resolve-user\",\n \"contacts\",\n ],\n antiKeywords: [\"列表\", \"全部用户\"],\n examples: [\n \"rsq-cli contacts resolveUser --user-name 张三 --json\",\n \"rsq-cli contacts resolve-user --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: true,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"setTaskExecutorByName\",\n aliases: [\"set-executor-by-name\"],\n summary: \"根据人员名称设置任务执行人\",\n description: \"先按 userName 解析 userId,再更新任务执行人。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/tasks/{taskId}/executor\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"执行人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task executor by name\", \"set executor by name\", \"根据姓名设置执行人\"],\n antiKeywords: [\"负责人\", \"参与人\", \"评论\"],\n examples: [\n \"rsq-cli task setTaskExecutorByName --task-id task_demo --user-name 张三 --json\",\n \"rsq-cli task set-executor-by-name --task-id task_demo --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"setTaskResponsibleByName\",\n aliases: [\"set-responsible-by-name\"],\n summary: \"根据人员名称设置任务负责人\",\n description: \"先按 userName 解析 userId,再更新任务负责人。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/tasks/{taskId}/responsible\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"负责人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task responsible by name\", \"set responsible by name\", \"根据姓名设置负责人\"],\n antiKeywords: [\"执行人\", \"参与人\", \"评论\"],\n examples: [\n \"rsq-cli task setTaskResponsibleByName --task-id task_demo --user-name 李四 --json\",\n \"rsq-cli task set-responsible-by-name --task-id task_demo --user-name 李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"addTaskParticipantByName\",\n aliases: [\"add-participant-by-name\"],\n summary: \"根据人员名称添加任务参与人\",\n description: \"先按 userName 解析 userId,再添加任务参与人。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/tasks/{taskId}/participants\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"参与人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task participant by name\", \"add participant by name\", \"根据姓名添加参与人\"],\n antiKeywords: [\"执行人\", \"负责人\", \"评论\"],\n examples: [\n \"rsq-cli task addTaskParticipantByName --task-id task_demo --user-name 王五 --json\",\n \"rsq-cli task add-participant-by-name --task-id task_demo --user-name 王五 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"project\",\n name: \"setProjectMemberByName\",\n aliases: [\"set-member-by-name\"],\n summary: \"根据人员名称设置项目成员\",\n description: \"先按 userName 解析 userId,再更新项目成员。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/projects/{projectId}/members\",\n },\n parameters: [\n {\n name: \"projectId\",\n in: \"path\",\n required: true,\n description: \"projectId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"项目成员姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"project member by name\", \"set project member by name\", \"根据姓名设置项目成员\"],\n examples: [\n \"rsq-cli project setProjectMemberByName --project-id proj_demo --user-name 张三 --json\",\n \"rsq-cli project set-member-by-name --project-id proj_demo --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"workflow\",\n name: \"createAuditInfoByNames\",\n aliases: [\"create-audit-by-names\"],\n summary: \"根据人员名称创建审核项配置\",\n description: \"先按 userName 解析 userId,再创建审核项配置。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/workflow/audit-infos\",\n },\n parameters: [\n { name: \"flowApplicationId\", in: \"query\", required: true, description: \"流程应用id\", schemaType: \"string\" },\n { name: \"stepInfoId\", in: \"query\", required: true, description: \"步骤配置id\", schemaType: \"string\" },\n { name: \"auditInfoName\", in: \"query\", required: true, description: \"审核项名称\", schemaType: \"string\" },\n { name: \"userNames\", in: \"query\", required: true, description: \"审核人名称列表,逗号分隔\", schemaType: \"string\" },\n { name: \"frontAuditInfoId\", in: \"query\", required: false, description: \"前一个审核项id\", schemaType: \"string\" },\n ],\n hasRequestBody: false,\n keywords: [\"create audit by names\", \"workflow audit users by name\", \"根据姓名创建审核项\"],\n examples: [\n \"rsq-cli workflow createAuditInfoByNames --flow-application-id flow_demo --step-info-id step_demo --audit-info-name 部门审批 --user-names 张三,李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"workflow\",\n name: \"updateAuditInfoByNames\",\n aliases: [\"update-audit-by-names\"],\n summary: \"根据人员名称更新审核项配置\",\n description: \"先按 userName 解析 userId,再更新审核项配置。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/workflow/audit-infos/{auditInfoId}\",\n },\n parameters: [\n { name: \"auditInfoId\", in: \"path\", required: true, description: \"审核项配置id\", schemaType: \"string\" },\n { name: \"auditInfoName\", in: \"query\", required: true, description: \"审核项名称\", schemaType: \"string\" },\n { name: \"userNames\", in: \"query\", required: true, description: \"审核人名称列表,逗号分隔\", schemaType: \"string\" },\n ],\n hasRequestBody: false,\n keywords: [\"update audit by names\", \"workflow audit users by name\", \"根据姓名更新审核项\"],\n examples: [\n \"rsq-cli workflow updateAuditInfoByNames --audit-info-id audit_demo --audit-info-name 部门审批 --user-names 张三,李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n ];\n}\n","import { getRegistry } from \"./index.js\";\n\nexport function getSkillContract() {\n return {\n skill: {\n name: \"rishiqing\",\n summary: \"识别日事清领域自然语言请求,并路由到 rsq-cli 的对应模块与命令。\",\n },\n trigger: {\n domain: \"rishiqing\",\n when: [\n \"当用户在对话中提到日事清、rsq、rishiqing 时,默认这是日事清操作请求。\",\n \"当用户提到项目、模块、卡片、任务、流程、多维表格、数据、流程应用、流程实例、步骤、表单、字段、审核项、审批、成员、负责人、执行人、参与人等领域词时,也优先按日事清请求处理。\",\n ],\n keywords: [\n \"日事清\",\n \"rsq\",\n \"rishiqing\",\n \"项目\",\n \"模块\",\n \"卡片\",\n \"任务\",\n \"流程\",\n \"流程应用\",\n \"流程实例\",\n \"步骤\",\n \"表单\",\n \"字段\",\n \"审核项\",\n \"审批\",\n \"多维表格\",\n \"数据\",\n \"成员\",\n \"负责人\",\n \"执行人\",\n \"参与人\",\n ],\n },\n routing: {\n moduleHints: [\n {\n module: \"project\",\n intents: [\"项目\", \"模块\", \"项目成员\", \"项目概览\", \"项目下计划\"],\n },\n {\n module: \"task\",\n intents: [\"任务\", \"卡片\", \"执行人\", \"负责人\", \"参与人\", \"任务状态\"],\n },\n {\n module: \"workflow\",\n intents: [\"流程应用\", \"流程实例\", \"步骤\", \"表单\", \"字段\", \"审核项\", \"审批流\"],\n },\n {\n module: \"datasheet\",\n intents: [\"多维表格\", \"数据表\", \"记录\", \"字段\", \"数据\"],\n },\n {\n module: \"contacts\",\n intents: [\"按姓名解析用户\", \"查成员\", \"查用户\"],\n },\n ],\n },\n globalRules: [\n \"遇到日事清领域短语时,先识别为 rsq-cli 操作意图,不要把它当成泛化项目管理请求。\",\n \"不确定具体命令时,先调用 rsq-cli search;确认候选命令后再调用 rsq-cli describe 阅读参数和 requestBodySchema。\",\n \"涉及创建、更新、绑定、分配等写操作时,优先使用 --dry-run --json 预览。\",\n \"所有 id 字段都必须传前缀+uuid风格的字符串,例如 flowApp_019d6c0c2f03770b8b789ec313076e64。\",\n \"不要传数字类型 id,也不要传纯数字字符串 id。\",\n \"调用前优先阅读参数说明和 requestBodySchema 中的字段说明,再组装参数。\",\n ],\n tools: getRegistry().map((command) => ({\n tool: `${command.module}.${command.aliases[0] ?? command.name}`,\n canonical: `${command.module}.${command.name}`,\n summary: command.summary,\n exposure: command.exposure,\n keywords: command.keywords,\n examples: command.examples,\n input: {\n parameters: command.parameters.map((parameter) => ({\n name: parameter.name,\n location: parameter.in,\n required: parameter.required,\n type: parameter.schemaType ?? \"string\",\n description: parameter.description,\n })),\n acceptsBody: command.hasRequestBody,\n requestBodySchema: command.requestBodySchema,\n },\n })),\n };\n}\n"],"mappings":"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","names":["readFile","existsSync","mkdir","os","path","fileURLToPath","existsSync","path","fileURLToPath","ensureTrailingSlash","path","looksLikeIdField","readFile"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../package.json","../src/core/config.ts","../src/core/install.ts","../src/core/http.ts","../src/core/output.ts","../src/core/openapi.ts","../src/registry/overrides.ts","../src/registry/index.ts","../src/registry/skill-contract.ts"],"sourcesContent":["import { Command, InvalidArgumentError, Option } from \"commander\";\nimport { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport readline from \"node:readline/promises\";\nimport { stdin, stdout } from \"node:process\";\nimport packageJson from \"../package.json\";\nimport { getAppConfigPath, getConfigPath, initConfig, normalizeBaseUrl, readAppConfig, readConfig, setBaseUrl } from \"./core/config.js\";\nimport { installBundledSkills, listKnownInstallTargets } from \"./core/install.js\";\nimport { executeRequest } from \"./core/http.js\";\nimport { printOutput } from \"./core/output.js\";\nimport { getModuleDefinitions, getRegistry } from \"./registry/index.js\";\nimport { getSkillContract } from \"./registry/skill-contract.js\";\nimport type { CommandDefinition } from \"./registry/types.js\";\nimport type { RequestBodySchemaDefinition } from \"./core/openapi.js\";\n\nconst createPlanTypes = new Set([\n \"task\",\n \"statistic\",\n \"overview\",\n \"folder\",\n \"risk\",\n \"workflow\",\n \"datasheet\",\n \"deliverable\",\n]);\n\ntype GlobalOptions = {\n json?: boolean;\n raw?: boolean;\n table?: boolean;\n quiet?: boolean;\n dryRun?: boolean;\n};\n\ntype CommandOptions = GlobalOptions & Record<string, unknown> & {\n body?: string;\n bodyFile?: string;\n};\n\ntype ApiCommandMode = \"direct\" | \"agent-wrapper\";\n\nconst CLI_VERSION = packageJson.version;\n\nasync function main(): Promise<void> {\n if (process.argv.includes(\"-v\")) {\n stdout.write(`${CLI_VERSION}\\n`);\n return;\n }\n\n const program = new Command();\n program\n .name(\"rsq-cli\")\n .description(\"Agent-oriented CLI for Rishiqing APIs\")\n .version(CLI_VERSION);\n\n registerGlobalHelp(program);\n registerConfig(program);\n registerDescribe(program);\n registerInstall(program);\n registerSearch(program);\n registerAgent(program);\n\n for (const moduleDefinition of getModuleDefinitions()) {\n const moduleCommand = program.command(moduleDefinition.name).description(moduleDefinition.description);\n for (const definition of getRegistry().filter((entry) => entry.module === moduleDefinition.name)) {\n if (definition.module === \"contacts\" && definition.name === \"resolveUser\") {\n registerResolveUserCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"task\" &&\n [\"setTaskExecutorByName\", \"setTaskResponsibleByName\", \"addTaskParticipantByName\"].includes(definition.name)\n ) {\n registerTaskUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (definition.module === \"project\" && definition.name === \"setProjectMemberByName\") {\n registerProjectUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"workflow\" &&\n [\"createAuditInfoByNames\", \"updateAuditInfoByNames\"].includes(definition.name)\n ) {\n registerWorkflowAuditByNamesCommand(moduleCommand, definition);\n continue;\n }\n\n registerApiCommand(moduleCommand, definition);\n }\n }\n\n await program.parseAsync(process.argv);\n}\n\nfunction registerGlobalHelp(program: Command): void {\n program.showHelpAfterError(\"(run with --help for usage)\");\n}\n\nfunction registerConfig(program: Command): void {\n const config = program.command(\"config\").description(\"Manage local rsq-cli configuration\");\n\n config\n .command(\"init\")\n .description(\"Initialize local configuration\")\n .action(async () => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n try {\n const apiKey = (await rl.question(\"X-Rsq-Api-key: \")).trim();\n if (!apiKey) {\n throw new Error(\"X-Rsq-Api-key is required.\");\n }\n\n const saved = await initConfig(apiKey);\n const appConfig = await readAppConfig();\n printOutput(\n {\n message: \"Configuration saved.\",\n configPath: getConfigPath(),\n appConfigPath: getAppConfigPath(),\n activeProfile: saved.activeProfile,\n baseUrl: appConfig.baseUrl,\n },\n { json: true },\n );\n } finally {\n rl.close();\n }\n });\n\n config\n .command(\"get\")\n .description(\"Show current config without exposing the API key\")\n .option(\"--json\", \"Print JSON output\")\n .action(async (options: GlobalOptions) => {\n const current = await readConfig();\n const appConfig = await readAppConfig();\n if (!current) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const profile = current.profiles[current.activeProfile];\n printOutput(\n {\n configPath: getConfigPath(),\n appConfigPath: getAppConfigPath(),\n baseUrl: appConfig.baseUrl,\n activeProfile: current.activeProfile,\n profiles: {\n [current.activeProfile]: {\n apiKeyConfigured: Boolean(profile?.apiKey),\n },\n },\n },\n options,\n );\n });\n\n config\n .command(\"path\")\n .description(\"Show config file path\")\n .action(() => {\n stdout.write(`${getConfigPath()}\\n`);\n });\n\n config\n .command(\"app-path\")\n .description(\"Show bundled app config path\")\n .action(() => {\n stdout.write(`${getAppConfigPath()}\\n`);\n });\n\n config\n .command(\"baseurl\")\n .description(\"Set the API base URL domain used by rsq-cli\")\n .argument(\"[value]\", \"Base URL domain, for example www.rishiqing.com\")\n .option(\"--json\", \"Print JSON output\")\n .action(async (value: string | undefined, options: { json?: boolean }) => {\n const current = await readAppConfig();\n const nextValue = value ? normalizeBaseUrl(value) : await promptBaseUrl(current.baseUrl);\n const saved = await setBaseUrl(nextValue);\n\n printOutput(\n {\n message: \"baseUrl updated.\",\n configPath: getConfigPath(),\n baseUrl: saved.baseUrl,\n },\n options,\n );\n });\n}\n\nfunction registerDescribe(program: Command): void {\n program\n .command(\"describe\")\n .description(\"Describe commands in machine-readable form\")\n .argument(\"[module]\", \"Module name\")\n .argument(\"[command]\", \"Command name\")\n .addOption(new Option(\"--json\", \"Print JSON output\"))\n .action((moduleName: string | undefined, commandName: string | undefined, options: { json?: boolean }) => {\n const source = getRegistry();\n\n if (!moduleName) {\n printOutput(source, { json: true });\n return;\n }\n\n if (!commandName) {\n printOutput(source.filter((entry) => entry.module === moduleName), { json: true });\n return;\n }\n\n const command = source.find(\n (entry) =>\n entry.module === moduleName &&\n (entry.name === commandName || entry.aliases.includes(commandName)),\n );\n\n if (!command) {\n throw new Error(`Unknown command: ${moduleName} ${commandName}`);\n }\n\n printOutput(command, { json: true });\n });\n\n program\n .command(\"describe-agent-contract\")\n .description(\"Describe the built-in agent contract derived from the registry\")\n .action(() => {\n printOutput(getSkillContract(), { json: true });\n });\n}\n\nfunction registerInstall(program: Command): void {\n const knownTargets = listKnownInstallTargets();\n\n program\n .command(\"install\")\n .description(\"Install bundled skills into known agent skill directories\")\n .option(\n \"--target <name>\",\n `Install only to selected known targets. Repeat or use comma-separated values: ${knownTargets.map((target) => target.name).join(\", \")}`,\n collectStrings,\n [],\n )\n .option(\n \"--dir <path>\",\n \"Install to an additional custom skill directory. Repeat or use comma-separated values\",\n collectStrings,\n [],\n )\n .option(\"--list-targets\", \"Print known install targets and exit\")\n .option(\"--dry-run\", \"Show installation plan without copying files\")\n .option(\"--json\", \"Print JSON output\")\n .action(\n async (options: {\n target?: string[];\n dir?: string[];\n listTargets?: boolean;\n dryRun?: boolean;\n json?: boolean;\n }) => {\n if (options.listTargets) {\n printOutput(\n knownTargets.map((target) => ({\n name: target.name,\n label: target.label,\n dir: target.dir,\n description: target.description,\n })),\n options,\n );\n return;\n }\n\n const result = await installBundledSkills({\n targets: options.target,\n extraDirs: options.dir,\n dryRun: options.dryRun,\n });\n\n printOutput(\n {\n message: options.dryRun ? \"Dry run completed.\" : \"Bundled skills installed.\",\n sourceDir: result.sourceDir,\n skills: result.skills,\n installed: result.installed,\n },\n options,\n );\n },\n );\n}\n\nfunction registerSearch(program: Command): void {\n program\n .command(\"search\")\n .description(\"Search all registered commands by natural language intent\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--limit <count>\", \"Maximum results\", parsePositiveInteger, 10)\n .option(\"--json\", \"Print JSON output\")\n .action((query: string, options: { limit: number; json?: boolean }) => {\n const keywords = tokenize(query);\n const ranked = getRegistry()\n .map((command) => ({\n command,\n score: scoreCommand(command, query, keywords),\n }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => {\n if (right.score !== left.score) {\n return right.score - left.score;\n }\n\n return exposurePriority(right.command) - exposurePriority(left.command);\n })\n .slice(0, options.limit)\n .map(({ command, score }) => ({\n score,\n module: command.module,\n name: command.name,\n aliases: command.aliases,\n exposure: command.exposure,\n summary: command.summary,\n api: command.api,\n }));\n\n printOutput(ranked, options);\n });\n}\n\nfunction registerAgent(program: Command): void {\n const agent = program.command(\"agent\").description(\"Agent-oriented wrappers that stabilize request body handling\");\n\n for (const moduleDefinition of getModuleDefinitions()) {\n const moduleCommand = agent.command(moduleDefinition.name).description(moduleDefinition.description);\n for (const definition of getRegistry().filter((entry) => entry.module === moduleDefinition.name)) {\n if (definition.module === \"contacts\" && definition.name === \"resolveUser\") {\n registerResolveUserCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"task\" &&\n [\"setTaskExecutorByName\", \"setTaskResponsibleByName\", \"addTaskParticipantByName\"].includes(definition.name)\n ) {\n registerTaskUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (definition.module === \"project\" && definition.name === \"setProjectMemberByName\") {\n registerProjectUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"workflow\" &&\n [\"createAuditInfoByNames\", \"updateAuditInfoByNames\"].includes(definition.name)\n ) {\n registerWorkflowAuditByNamesCommand(moduleCommand, definition);\n continue;\n }\n\n registerApiCommand(moduleCommand, definition, \"agent-wrapper\");\n }\n }\n}\n\nfunction registerApiCommand(parent: Command, definition: CommandDefinition, mode: ApiCommandMode = \"direct\"): void {\n if (!definition.api) {\n throw new Error(`Missing API mapping for command: ${definition.module} ${definition.name}`);\n }\n\n const command = parent.command(definition.name).description(definition.summary);\n\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n addSharedOutputOptions(command);\n\n for (const parameter of definition.parameters) {\n command.addOption(\n new Option(optionName(parameter.name), parameter.description ?? `${parameter.in} parameter: ${parameter.name}`).makeOptionMandatory(Boolean(parameter.required)),\n );\n }\n\n if (definition.hasRequestBody) {\n command.addOption(new Option(\"--body <json>\", \"Inline JSON request body\"));\n command.addOption(new Option(\"--body-file <path>\", \"Read JSON request body from a file\"));\n }\n\n command.action(async (options: CommandOptions) => {\n await executeApiCommand(definition, options, mode);\n });\n}\n\nasync function executeApiCommand(\n definition: CommandDefinition,\n options: CommandOptions,\n mode: ApiCommandMode,\n): Promise<void> {\n const resolvedOptions = await prepareBodyOptions(options, mode);\n\n try {\n const body = sanitizeRequestBody(definition, await readBody(resolvedOptions));\n validateRequestBody(definition, body);\n const request = buildRequest(definition, resolvedOptions, body);\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n api: definition.api,\n baseUrl: appConfig.baseUrl,\n url: new URL(request.path, ensureTrailingSlash(appConfig.baseUrl)).toString(),\n request,\n agentWrapper:\n mode === \"agent-wrapper\"\n ? {\n enabled: true,\n requestBodyTransport: resolvedOptions.bodyFile ? \"body-file\" : \"none\",\n }\n : undefined,\n },\n { json: true },\n );\n return;\n }\n\n const result = await executeRequest(request);\n if (!options.quiet) {\n printOutput(result, options);\n }\n } finally {\n await cleanupPreparedBodyOptions(resolvedOptions);\n }\n}\n\nfunction registerResolveUserCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n command.addOption(new Option(\"--user-name <value>\", \"需要解析的人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--table\", \"Print array responses in a basic table\"));\n\n command.action(async (options: { userName?: string; json?: boolean; table?: boolean }) => {\n const userName = asOptionalString(options.userName);\n if (!userName) {\n throw new Error(\"Missing required option: --user-name\");\n }\n\n printOutput(await resolveUserByName(userName), { json: true });\n });\n}\n\nfunction registerTaskUserByNameCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n command.addOption(new Option(\"--task-id <value>\", \"taskId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-name <value>\", \"人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n\n command.action(async (options: { taskId?: string; userName?: string; json?: boolean; dryRun?: boolean }) => {\n const taskId = asOptionalString(options.taskId);\n const userName = asOptionalString(options.userName);\n if (!taskId || !userName) {\n throw new Error(\"Missing required options: --task-id and --user-name\");\n }\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n {\n action: \"resolveUser\",\n command: `rsq-cli contacts resolveUser --user-name ${userName} --json`,\n },\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n taskId,\n userName,\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolved = await resolveUserByName(userName);\n const request = buildTaskUserByNameRequest(definition.name, taskId, resolved.userId);\n const result = await executeRequest(request);\n printOutput(\n {\n resolvedUser: resolved,\n result,\n },\n { json: true },\n );\n });\n}\n\nfunction registerProjectUserByNameCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) command.alias(alias);\n command.addOption(new Option(\"--project-id <value>\", \"projectId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-name <value>\", \"人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n command.action(async (options: { projectId?: string; userName?: string; dryRun?: boolean }) => {\n const projectId = asOptionalString(options.projectId);\n const userName = asOptionalString(options.userName);\n if (!projectId || !userName) throw new Error(\"Missing required options: --project-id and --user-name\");\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n { action: \"resolveUser\", command: `rsq-cli contacts resolveUser --user-name ${userName} --json` },\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n projectId,\n userName,\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolved = await resolveUserByName(userName);\n const result = await executeRequest({\n method: \"POST\",\n path: `/rsq/api/v1/projects/${encodeURIComponent(projectId)}/members`,\n body: { userMemberIds: [resolved.userId], deptMemberIds: [] },\n });\n printOutput({ resolvedUser: resolved, result }, { json: true });\n });\n}\n\nfunction registerWorkflowAuditByNamesCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) command.alias(alias);\n\n if (definition.name === \"createAuditInfoByNames\") {\n command.addOption(new Option(\"--flow-application-id <value>\", \"flowApplicationId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--step-info-id <value>\", \"stepInfoId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--audit-info-name <value>\", \"auditInfoName\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-names <value>\", \"审核人名称列表,逗号分隔\").makeOptionMandatory(true));\n command.addOption(new Option(\"--front-audit-info-id <value>\", \"frontAuditInfoId\"));\n } else {\n command.addOption(new Option(\"--audit-info-id <value>\", \"auditInfoId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--audit-info-name <value>\", \"auditInfoName\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-names <value>\", \"审核人名称列表,逗号分隔\").makeOptionMandatory(true));\n }\n\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n\n command.action(async (options: Record<string, unknown> & { dryRun?: boolean }) => {\n const userNamesValue = asOptionalString(options.userNames);\n const userNames = parseNameList(userNamesValue);\n if (userNames.length === 0) throw new Error(\"Missing required option: --user-names\");\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n ...userNames.map((name) => ({\n action: \"resolveUser\",\n command: `rsq-cli contacts resolveUser --user-name ${name} --json`,\n })),\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n options: {\n flowApplicationId: asOptionalString(options.flowApplicationId),\n stepInfoId: asOptionalString(options.stepInfoId),\n auditInfoId: asOptionalString(options.auditInfoId),\n auditInfoName: asOptionalString(options.auditInfoName),\n frontAuditInfoId: asOptionalString(options.frontAuditInfoId),\n userNames,\n },\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolvedUsers = [];\n for (const userName of userNames) {\n resolvedUsers.push(await resolveUserByName(userName));\n }\n const userIds = resolvedUsers.map((user) => user.userId);\n\n let request;\n if (definition.name === \"createAuditInfoByNames\") {\n const flowApplicationId = asOptionalString(options.flowApplicationId);\n const stepInfoId = asOptionalString(options.stepInfoId);\n const auditInfoName = asOptionalString(options.auditInfoName);\n if (!flowApplicationId || !stepInfoId || !auditInfoName) {\n throw new Error(\"Missing required options for createAuditInfoByNames\");\n }\n request = {\n method: \"POST\",\n path: \"/rsq/api/v1/workflow/audit-infos\",\n body: {\n flowApplicationId,\n stepInfoId,\n auditInfoName,\n frontAuditInfoId: asOptionalString(options.frontAuditInfoId),\n auditInfoUsers: userIds,\n },\n };\n } else {\n const auditInfoId = asOptionalString(options.auditInfoId);\n const auditInfoName = asOptionalString(options.auditInfoName);\n if (!auditInfoId || !auditInfoName) {\n throw new Error(\"Missing required options for updateAuditInfoByNames\");\n }\n request = {\n method: \"PUT\",\n path: `/rsq/api/v1/workflow/audit-infos/${encodeURIComponent(auditInfoId)}`,\n body: {\n auditInfoName,\n auditInfoUsers: userIds,\n },\n };\n }\n\n const result = await executeRequest(request);\n printOutput({ resolvedUsers, result }, { json: true });\n });\n}\n\nfunction addSharedOutputOptions(command: Command): void {\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--raw\", \"Print the raw response payload\"));\n command.addOption(new Option(\"--table\", \"Print array responses in a basic table\"));\n command.addOption(new Option(\"--quiet\", \"Suppress stdout output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n}\n\nfunction buildRequest(definition: CommandDefinition, options: CommandOptions, body: unknown) {\n let resolvedPath = definition.api.path;\n const query: Record<string, string | undefined> = {};\n\n for (const parameter of definition.parameters) {\n const value = asOptionalString(options[toOptionKey(parameter.name)]);\n validateIdLikeInput(parameter.name, value, `parameter ${parameter.name}`);\n if (parameter.in === \"path\") {\n if (!value) {\n throw new Error(`Missing required path parameter: ${parameter.name}`);\n }\n\n resolvedPath = resolvedPath.replace(`{${parameter.name}}`, encodeURIComponent(value));\n continue;\n }\n\n if (parameter.in === \"query\") {\n query[parameter.name] = value;\n }\n }\n\n return {\n method: definition.api.method,\n path: resolvedPath,\n query,\n body,\n };\n}\n\nfunction sanitizeRequestBody(definition: CommandDefinition, body: unknown): unknown {\n if (body === undefined) {\n return undefined;\n }\n\n if (definition.module === \"workflow\" && definition.name === \"createForm\") {\n return sanitizeWorkflowCreateFormBody(body);\n }\n\n return body;\n}\n\nfunction sanitizeWorkflowCreateFormBody(body: unknown): unknown {\n if (!isRecord(body)) {\n return body;\n }\n\n const sanitized: Record<string, unknown> = { ...body };\n delete sanitized.formId;\n\n if (Array.isArray(body.fields)) {\n sanitized.fields = body.fields.map((field) => {\n if (!isRecord(field)) {\n return field;\n }\n\n const sanitizedField: Record<string, unknown> = { ...field };\n delete sanitizedField.fieldId;\n return sanitizedField;\n });\n }\n\n return sanitized;\n}\n\nfunction validateRequestBody(definition: CommandDefinition, body: unknown): void {\n if (!definition.hasRequestBody || body === undefined || !definition.requestBodySchema) {\n return;\n }\n\n const issues: string[] = [];\n validateValueAgainstSchema(body, definition.requestBodySchema, \"$\", issues);\n validateIdLikeBodyValues(body, \"$\", issues);\n validateCustomBodyRules(definition, body, issues);\n if (issues.length > 0) {\n throw new Error(`Request body validation failed for ${definition.module} ${definition.name}:\\n${issues.join(\"\\n\")}`);\n }\n}\n\nfunction validateCustomBodyRules(definition: CommandDefinition, body: unknown, issues: string[]): void {\n if (!isRecord(body)) {\n return;\n }\n\n if (definition.module === \"project\" && definition.name === \"createPlan\") {\n const type = body.type;\n if (typeof type !== \"string\" || !createPlanTypes.has(type)) {\n issues.push(\n `$.type: invalid module type ${JSON.stringify(type)}. Allowed values: ${Array.from(createPlanTypes).join(\", \")}`,\n );\n }\n }\n}\n\nfunction validateValueAgainstSchema(\n value: unknown,\n schema: RequestBodySchemaDefinition,\n path: string,\n issues: string[],\n): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (schema.type === \"object\" && isRecord(value)) {\n for (const requiredKey of schema.required ?? []) {\n if (!(requiredKey in value)) {\n issues.push(`${path}.${requiredKey}: missing required field`);\n }\n }\n\n for (const [propertyName, propertySchema] of Object.entries(schema.properties ?? {})) {\n if (propertyName in value) {\n validateValueAgainstSchema(value[propertyName], propertySchema, `${path}.${propertyName}`, issues);\n }\n }\n return;\n }\n\n if (schema.type === \"array\" && Array.isArray(value)) {\n value.forEach((item, index) => {\n if (schema.items) {\n validateValueAgainstSchema(item, schema.items, `${path}[${index}]`, issues);\n }\n });\n return;\n }\n\n if (schema.type === \"string\" && typeof value === \"string\") {\n validateStringByDescription(value, schema.description, path, issues);\n }\n}\n\nfunction validateIdLikeBodyValues(value: unknown, path: string, issues: string[]): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n validateIdLikeBodyValues(item, `${path}[${index}]`, issues);\n });\n return;\n }\n\n if (!isRecord(value)) {\n return;\n }\n\n for (const [key, fieldValue] of Object.entries(value)) {\n const nextPath = `${path}.${key}`;\n if (looksLikeIdField(key)) {\n const issue = getIdLikeValidationIssue(fieldValue, nextPath);\n if (issue) {\n issues.push(issue);\n }\n }\n\n validateIdLikeBodyValues(fieldValue, nextPath, issues);\n }\n}\n\nfunction validateIdLikeInput(name: string, value: string | undefined, label: string): void {\n if (!looksLikeIdField(name) || value === undefined) {\n return;\n }\n\n const issue = getIdLikeValidationIssue(value, label);\n if (issue) {\n throw new Error(issue);\n }\n}\n\nfunction looksLikeIdField(name: string): boolean {\n return /ids?$/i.test(name);\n}\n\nfunction getIdLikeValidationIssue(value: unknown, label: string): string | undefined {\n if (typeof value === \"number\") {\n return `${label}: invalid id value ${value}. Id fields must use string ids, not numbers.`;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n if (/^\\d+$/.test(trimmed)) {\n return `${label}: invalid id value \"${value}\". Id fields must not be pure digits.`;\n }\n\n if (/^\\d+(,\\d+)+$/.test(trimmed)) {\n return `${label}: invalid id value \"${value}\". Id lists must not contain pure numeric ids.`;\n }\n\n return undefined;\n }\n\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n const nestedIssue = getIdLikeValidationIssue(value[index], `${label}[${index}]`);\n if (nestedIssue) {\n return nestedIssue;\n }\n }\n }\n\n return undefined;\n}\n\nfunction validateStringByDescription(\n value: string,\n description: string | undefined,\n path: string,\n issues: string[],\n): void {\n if (!description) {\n return;\n }\n\n if (description.includes(\"仅支持yyyy-MM-dd、yyyy-MM-dd'T'HH:mm:ssXXX两种格式\")) {\n const isDateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(value);\n const isOffsetDateTime = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$/.test(value);\n if (!isDateOnly && !isOffsetDateTime) {\n issues.push(`${path}: invalid format \"${value}\". Allowed formats: yyyy-MM-dd or yyyy-MM-dd'T'HH:mm:ssXXX`);\n }\n }\n}\n\nasync function readBody(options: CommandOptions): Promise<unknown> {\n if (options.body && options.bodyFile) {\n throw new Error(\"Use either --body or --body-file, not both.\");\n }\n\n if (options.body) {\n return JSON.parse(options.body);\n }\n\n if (options.bodyFile) {\n return JSON.parse(await readFile(options.bodyFile, \"utf8\"));\n }\n\n return undefined;\n}\n\nasync function prepareBodyOptions(options: CommandOptions, mode: ApiCommandMode): Promise<CommandOptions & { __tempDir?: string }> {\n if (mode !== \"agent-wrapper\" || !options.body) {\n return options;\n }\n\n const tempDir = await mkdtemp(path.join(os.tmpdir(), \"rsq-cli-agent-\"));\n const bodyFile = path.join(tempDir, \"request.json\");\n await writeFile(bodyFile, options.body, \"utf8\");\n\n return {\n ...options,\n body: undefined,\n bodyFile,\n __tempDir: tempDir,\n };\n}\n\nasync function cleanupPreparedBodyOptions(options: CommandOptions & { __tempDir?: string }): Promise<void> {\n if (!options.__tempDir) {\n return;\n }\n\n await rm(options.__tempDir, { recursive: true, force: true });\n}\n\nfunction optionName(parameterName: string): `--${string} <value>` {\n return `--${toKebabCase(parameterName)} <value>`;\n}\n\nfunction toOptionKey(parameterName: string): string {\n return toCamelCase(toKebabCase(parameterName));\n}\n\nfunction toKebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/_/g, \"-\")\n .toLowerCase();\n}\n\nfunction toCamelCase(value: string): string {\n return value.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction tokenize(input: string): string[] {\n const normalized = normalizeText(input);\n const tokens = normalized.split(/[\\s/_-]+/).filter(Boolean);\n const cjkRuns = normalized.match(/[\\p{Script=Han}]{2,}/gu) ?? [];\n\n for (const run of cjkRuns) {\n tokens.push(run);\n for (let index = 0; index < run.length - 1; index += 1) {\n tokens.push(run.slice(index, index + 2));\n }\n }\n\n return Array.from(new Set(tokens));\n}\n\nfunction scoreCommand(command: CommandDefinition, query: string, keywords: string[]): number {\n let score = 0;\n const haystack = normalizeText([\n command.name,\n ...command.aliases,\n command.summary,\n command.description,\n command.api?.path ?? \"\",\n ...command.keywords,\n ...command.parameters.map((parameter) => parameter.name),\n ...command.parameters.map((parameter) => parameter.description ?? \"\"),\n ].join(\" \"));\n const normalizedQuery = normalizeText(query);\n const matchedIntentKeywords = keywords.filter((keyword) => haystack.includes(keyword));\n\n if (normalizedQuery && haystack.includes(normalizedQuery)) {\n score += Math.max(8, normalizedQuery.length);\n }\n\n for (const keyword of matchedIntentKeywords) {\n score += keyword.length > 6 ? 6 : keyword.length > 3 ? 3 : 1;\n }\n\n score += scoreRsqIntentBoost(command, normalizedQuery, matchedIntentKeywords);\n\n for (const antiKeyword of command.antiKeywords ?? []) {\n const normalizedAntiKeyword = normalizeText(antiKeyword);\n if (!normalizedAntiKeyword) {\n continue;\n }\n\n if (normalizedQuery.includes(normalizedAntiKeyword) || haystack.includes(normalizedAntiKeyword)) {\n score -= normalizedAntiKeyword.length > 3 ? 4 : 2;\n }\n }\n\n return score;\n}\n\nconst rsqDomainKeywords = [\n \"日事清\",\n \"rsq\",\n \"rishiqing\",\n \"项目\",\n \"模块\",\n \"卡片\",\n \"任务\",\n \"流程\",\n \"流程应用\",\n \"流程实例\",\n \"步骤\",\n \"表单\",\n \"字段\",\n \"审核项\",\n \"审批\",\n \"多维表格\",\n \"数据表\",\n \"数据\",\n \"成员\",\n \"负责人\",\n \"执行人\",\n \"参与人\",\n].map(normalizeText);\n\nconst rsqModuleIntentKeywords: Record<string, string[]> = {\n project: [\"项目\", \"模块\", \"卡片\", \"项目成员\", \"项目下计划\", \"项目概览\"],\n task: [\"任务\", \"卡片\", \"执行人\", \"负责人\", \"参与人\", \"评论\", \"完成任务\"],\n workflow: [\"流程\", \"流程应用\", \"流程实例\", \"步骤\", \"表单\", \"字段\", \"审核项\", \"审批\"],\n datasheet: [\"多维表格\", \"数据表\", \"记录\", \"字段\", \"数据\"],\n contacts: [\"成员\", \"用户\", \"通讯录\", \"员工\", \"姓名解析\"],\n};\n\nconst actionIntentKeywords: Array<{ action: \"create\" | \"get\" | \"list\" | \"update\" | \"delete\" | \"complete\"; keywords: string[] }> = [\n { action: \"create\", keywords: [\"创建\", \"新建\", \"新增\", \"添加\", \"建一个\", \"建\"] },\n { action: \"get\", keywords: [\"查询\", \"查看\", \"获取\", \"详情\", \"查某个\", \"查一下\", \"查\"] },\n { action: \"list\", keywords: [\"列表\", \"全部\", \"批量获取\", \"有哪些\", \"列出\"] },\n { action: \"update\", keywords: [\"更新\", \"修改\", \"编辑\", \"设置\", \"调整\", \"更换\"] },\n { action: \"delete\", keywords: [\"删除\", \"移除\"] },\n { action: \"complete\", keywords: [\"完成\", \"提交\", \"通过\", \"拒绝\", \"关闭\"] },\n];\n\nfunction scoreRsqIntentBoost(command: CommandDefinition, normalizedQuery: string, matchedIntentKeywords: string[]): number {\n let score = 0;\n\n if (includesAny(normalizedQuery, rsqDomainKeywords)) {\n score += 2;\n }\n\n const moduleIntentKeywords = rsqModuleIntentKeywords[command.module] ?? [];\n const matchedModuleIntents = moduleIntentKeywords.filter((keyword) => normalizedQuery.includes(normalizeText(keyword)));\n\n if (matchedModuleIntents.length > 0) {\n score += 6 + matchedModuleIntents.length * 2;\n }\n\n if (command.module === \"workflow\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"表单字段\") || keyword.includes(\"字段值\"))) {\n score += 3;\n }\n\n if (command.module === \"task\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"负责人\") || keyword.includes(\"执行人\") || keyword.includes(\"参与人\"))) {\n score += 3;\n }\n\n if (command.module === \"project\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"模块\") || keyword.includes(\"卡片\"))) {\n score += 3;\n }\n\n if (command.module === \"datasheet\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"多维表格\") || keyword.includes(\"数据表\") || keyword === \"数据\")) {\n score += 3;\n }\n\n score += scoreActionIntentBoost(command, normalizedQuery);\n\n return score;\n}\n\nfunction scoreActionIntentBoost(command: CommandDefinition, normalizedQuery: string): number {\n const matchedActions = actionIntentKeywords\n .filter(({ keywords }) => keywords.some((keyword) => normalizedQuery.includes(normalizeText(keyword))))\n .map(({ action }) => action);\n\n if (matchedActions.length === 0) {\n return 0;\n }\n\n const commandName = command.name.toLowerCase();\n let score = 0;\n\n for (const action of matchedActions) {\n if (commandName.startsWith(action)) {\n score += 5;\n continue;\n }\n\n if (action === \"get\" && commandName.startsWith(\"list\")) {\n score += 2;\n continue;\n }\n\n if (action === \"list\" && commandName.startsWith(\"get\")) {\n score += 1;\n continue;\n }\n }\n\n return score;\n}\n\nfunction normalizeText(value: string): string {\n return value.toLowerCase().trim();\n}\n\nfunction includesAny(value: string, patterns: string[]): boolean {\n return patterns.some((pattern) => value.includes(pattern));\n}\n\nfunction exposurePriority(command: CommandDefinition): number {\n switch (command.exposure) {\n case \"public\":\n return 3;\n case \"composed\":\n return 2;\n case \"internal\":\n return 1;\n default:\n return 0;\n }\n}\n\nfunction parsePositiveInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"Expected a positive integer.\");\n }\n\n return parsed;\n}\n\nfunction collectStrings(value: string, previous: string[]): string[] {\n previous.push(value);\n return previous;\n}\n\nasync function promptBaseUrl(currentBaseUrl: string): Promise<string> {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n try {\n const answer = (await rl.question(`Base URL domain [${currentBaseUrl}]: `)).trim();\n return normalizeBaseUrl(answer || currentBaseUrl);\n } finally {\n rl.close();\n }\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction ensureTrailingSlash(input: string): string {\n return input.endsWith(\"/\") ? input : `${input}/`;\n}\n\nfunction extractUserRows(payload: unknown): Array<{ userId: string; userName: string }> {\n if (\n typeof payload !== \"object\" ||\n payload === null ||\n !(\"data\" in payload) ||\n !Array.isArray((payload as { data?: unknown }).data)\n ) {\n throw new Error(\"Unexpected contacts response shape.\");\n }\n\n return (payload as { data: unknown[] }).data\n .filter(\n (row): row is { userId: string; userName: string } =>\n typeof row === \"object\" &&\n row !== null &&\n typeof (row as { userId?: unknown }).userId === \"string\" &&\n typeof (row as { userName?: unknown }).userName === \"string\",\n )\n .map((row) => ({\n userId: row.userId,\n userName: row.userName,\n }));\n}\n\nasync function resolveUserByName(userName: string): Promise<{\n userName: string;\n userId: string;\n matchType: \"exact\" | \"fuzzy\";\n matchedUserName?: string;\n}> {\n const payload = await executeRequest({\n method: \"GET\",\n path: \"/rsq/api/v1/contacts/list-all-user\",\n });\n\n const users = extractUserRows(payload);\n const exactMatches = users.filter((user) => user.userName === userName);\n\n if (exactMatches.length === 1) {\n return {\n userName,\n userId: exactMatches[0].userId,\n matchType: \"exact\",\n };\n }\n\n if (exactMatches.length > 1) {\n throw new Error(\n `Ambiguous userName \"${userName}\". Matched users: ${exactMatches.map((user) => `${user.userName}(${user.userId})`).join(\", \")}`,\n );\n }\n\n const fuzzyMatches = users.filter((user) => user.userName.includes(userName));\n if (fuzzyMatches.length === 1) {\n return {\n userName,\n userId: fuzzyMatches[0].userId,\n matchType: \"fuzzy\",\n matchedUserName: fuzzyMatches[0].userName,\n };\n }\n\n if (fuzzyMatches.length > 1) {\n throw new Error(\n `No exact match for \"${userName}\". Fuzzy matches: ${fuzzyMatches.map((user) => `${user.userName}(${user.userId})`).join(\", \")}`,\n );\n }\n\n throw new Error(`No user matched userName \"${userName}\".`);\n}\n\nfunction buildTaskUserByNameRequest(commandName: string, taskId: string, userId: string) {\n if (commandName === \"setTaskExecutorByName\") {\n return {\n method: \"PUT\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/executor`,\n body: {\n executorUserIds: [userId],\n },\n } as const;\n }\n\n if (commandName === \"setTaskResponsibleByName\") {\n return {\n method: \"PUT\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/responsible`,\n body: {\n responsibleId: userId,\n },\n } as const;\n }\n\n if (commandName === \"addTaskParticipantByName\") {\n return {\n method: \"POST\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/participants`,\n body: {\n participantUserIds: [userId],\n },\n } as const;\n }\n\n throw new Error(`Unsupported composed task command: ${commandName}`);\n}\n\nfunction parseNameList(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","{\n \"name\": \"@rishiqing/cli\",\n \"version\": \"0.1.4\",\n \"description\": \"Agent-oriented CLI for Rishiqing APIs\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"bin\": {\n \"rsq-cli\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"generated\",\n \"rishiqing.openapi.json\",\n \"rsq-cli.config.json\",\n \"skills\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"node --enable-source-maps dist/cli.js\",\n \"check\": \"tsc --noEmit\",\n \"generate:catalog\": \"node scripts/generate-command-catalog.mjs\",\n \"release:check\": \"npm run check && npm run build\",\n \"prepublishOnly\": \"npm run release:check\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"dependencies\": {\n \"commander\": \"^14.0.0\",\n \"zod\": \"^4.1.5\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.6.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\"\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { z } from \"zod\";\n\nconst profileSchema = z.object({\n apiKey: z.string().min(1),\n});\n\nconst configSchema = z.object({\n activeProfile: z.string().min(1),\n profiles: z.record(z.string(), profileSchema),\n baseUrl: z.string().min(1).optional(),\n});\n\nconst appConfigSchema = z.object({\n baseUrl: z.string().min(1),\n});\n\nexport type RsqConfig = z.infer<typeof configSchema>;\nexport type RsqProfile = z.infer<typeof profileSchema>;\nexport type RsqAppConfig = z.infer<typeof appConfigSchema>;\n\nconst APP_CONFIG_FILE = \"rsq-cli.config.json\";\n\nfunction getConfigDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME;\n if (xdg) {\n return path.join(xdg, \"rsq-cli\");\n }\n\n return path.join(os.homedir(), \".config\", \"rsq-cli\");\n}\n\nexport function getConfigPath(): string {\n return path.join(getConfigDir(), \"config.json\");\n}\n\nexport function getAppConfigPath(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../\", APP_CONFIG_FILE),\n path.resolve(moduleDir, \"../../\", APP_CONFIG_FILE),\n path.resolve(process.cwd(), APP_CONFIG_FILE),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Missing ${APP_CONFIG_FILE}. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n\nexport async function readAppConfig(): Promise<RsqAppConfig> {\n const bundledFile = await readFile(getAppConfigPath(), \"utf8\");\n const bundled = appConfigSchema.parse(JSON.parse(bundledFile));\n const userConfig = await readConfig();\n\n return {\n baseUrl: userConfig?.baseUrl ? normalizeBaseUrl(userConfig.baseUrl) : bundled.baseUrl,\n };\n}\n\nexport async function readConfig(): Promise<RsqConfig | null> {\n try {\n const file = await readFile(getConfigPath(), \"utf8\");\n return configSchema.parse(JSON.parse(file));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n\n throw error;\n }\n}\n\nexport async function writeConfig(config: RsqConfig): Promise<void> {\n await mkdir(getConfigDir(), { recursive: true });\n await writeFile(getConfigPath(), `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function initConfig(apiKey: string): Promise<RsqConfig> {\n const config: RsqConfig = {\n activeProfile: \"default\",\n profiles: {\n default: {\n apiKey,\n },\n },\n };\n\n await writeConfig(config);\n return config;\n}\n\nexport async function setBaseUrl(baseUrl: string): Promise<RsqConfig> {\n const current = await readConfig();\n if (!current) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const next: RsqConfig = {\n ...current,\n baseUrl: normalizeBaseUrl(baseUrl),\n };\n\n await writeConfig(next);\n return next;\n}\n\nexport function normalizeBaseUrl(input: string): string {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new Error(\"baseUrl is required.\");\n }\n\n const candidate = /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\n let parsed: URL;\n try {\n parsed = new URL(candidate);\n } catch {\n throw new Error(`Invalid baseUrl: ${input}`);\n }\n\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n throw new Error(\"baseUrl must use http or https.\");\n }\n\n if (!parsed.hostname) {\n throw new Error(\"baseUrl hostname is required.\");\n }\n\n if (parsed.pathname !== \"/\" || parsed.search || parsed.hash) {\n throw new Error(\"baseUrl must be a domain only, without path, query, or hash.\");\n }\n\n return parsed.origin;\n}\n\nexport async function requireActiveProfile(): Promise<RsqProfile> {\n const config = await readConfig();\n if (!config) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const profile = config.profiles[config.activeProfile];\n if (!profile) {\n throw new Error(`Active profile \"${config.activeProfile}\" is missing.`);\n }\n\n return profile;\n}\n","import { existsSync } from \"node:fs\";\nimport { cp, mkdir, readdir } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type KnownInstallTarget = {\n name: string;\n label: string;\n description: string;\n dir: string;\n};\n\nexport type InstallOptions = {\n targets?: string[];\n extraDirs?: string[];\n dryRun?: boolean;\n};\n\nexport type InstallDestination = {\n kind: \"known\" | \"custom\";\n name: string;\n label: string;\n dir: string;\n};\n\nexport type InstallResult = {\n sourceDir: string;\n skills: string[];\n installed: Array<InstallDestination & { created: boolean }>;\n};\n\nconst KNOWN_INSTALL_TARGETS: KnownInstallTarget[] = [\n {\n name: \"codex\",\n label: \"Codex\",\n description: \"Install built-in skills into the default Codex skills directory\",\n dir: path.join(os.homedir(), \".agents\", \"skills\"),\n },\n {\n name: \"claude-code\",\n label: \"Claude Code\",\n description: \"Install built-in skills into the default Claude Code skills directory\",\n dir: path.join(os.homedir(), \".claude\", \"skills\"),\n },\n {\n name: \"openclaw\",\n label: \"OpenClaw\",\n description: \"Install built-in skills into the default OpenClaw skills directory\",\n dir: path.join(os.homedir(), \".openclaw\", \"skills\"),\n },\n];\n\nexport function listKnownInstallTargets(): KnownInstallTarget[] {\n return KNOWN_INSTALL_TARGETS.map((target) => ({ ...target }));\n}\n\nexport function resolveBundledSkillsDir(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../\", \"skills\"),\n path.resolve(moduleDir, \"../../\", \"skills\"),\n path.resolve(process.cwd(), \"skills\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Missing bundled skills directory. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n\nexport async function installBundledSkills(options: InstallOptions = {}): Promise<InstallResult> {\n const sourceDir = resolveBundledSkillsDir();\n const skills = await listBundledSkills(sourceDir);\n if (skills.length === 0) {\n throw new Error(`No bundled skills found in ${sourceDir}`);\n }\n\n const destinations = resolveInstallDestinations(options);\n const installed: Array<InstallDestination & { created: boolean }> = [];\n\n for (const destination of destinations) {\n const created = !existsSync(destination.dir);\n if (!options.dryRun) {\n await mkdir(destination.dir, { recursive: true });\n }\n\n for (const skill of skills) {\n const from = path.join(sourceDir, skill);\n const to = path.join(destination.dir, skill);\n if (!options.dryRun) {\n await cp(from, to, { recursive: true, force: true });\n }\n }\n\n installed.push({ ...destination, created });\n }\n\n return {\n sourceDir,\n skills,\n installed,\n };\n}\n\nfunction resolveInstallDestinations(options: InstallOptions): InstallDestination[] {\n const requestedTargets = options.targets?.flatMap(splitCsvValues).filter(Boolean) ?? [];\n const extraDirs = options.extraDirs?.flatMap(splitCsvValues).filter(Boolean) ?? [];\n const destinations: InstallDestination[] = [];\n const seen = new Set<string>();\n\n const targets = requestedTargets.length > 0\n ? requestedTargets.map(resolveKnownTargetByName)\n : listKnownInstallTargets();\n\n for (const target of targets) {\n pushUniqueDestination(\n destinations,\n seen,\n {\n kind: \"known\",\n name: target.name,\n label: target.label,\n dir: path.resolve(target.dir),\n },\n );\n }\n\n for (const dir of extraDirs) {\n pushUniqueDestination(\n destinations,\n seen,\n {\n kind: \"custom\",\n name: \"custom\",\n label: \"Custom\",\n dir: path.resolve(expandHome(dir)),\n },\n );\n }\n\n return destinations;\n}\n\nfunction resolveKnownTargetByName(name: string): KnownInstallTarget {\n const normalized = name.trim().toLowerCase();\n const found = KNOWN_INSTALL_TARGETS.find((target) => target.name === normalized);\n if (!found) {\n throw new Error(`Unknown install target: ${name}. Supported targets: ${KNOWN_INSTALL_TARGETS.map((target) => target.name).join(\", \")}`);\n }\n\n return found;\n}\n\nfunction pushUniqueDestination(destinations: InstallDestination[], seen: Set<string>, destination: InstallDestination): void {\n const key = path.normalize(destination.dir);\n if (seen.has(key)) {\n return;\n }\n\n seen.add(key);\n destinations.push(destination);\n}\n\nfunction expandHome(input: string): string {\n if (input === \"~\") {\n return os.homedir();\n }\n\n if (input.startsWith(\"~/\")) {\n return path.join(os.homedir(), input.slice(2));\n }\n\n return input;\n}\n\nfunction splitCsvValues(value: string): string[] {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nasync function listBundledSkills(sourceDir: string): Promise<string[]> {\n const entries = await readdir(sourceDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort((left, right) => left.localeCompare(right));\n}\n","import { readAppConfig, requireActiveProfile } from \"./config.js\";\n\nexport type RequestShape = {\n method: string;\n path: string;\n query?: Record<string, string | undefined>;\n body?: unknown;\n};\n\nexport async function executeRequest(shape: RequestShape): Promise<unknown> {\n const profile = await requireActiveProfile();\n const appConfig = await readAppConfig();\n const url = new URL(shape.path, ensureTrailingSlash(appConfig.baseUrl));\n\n for (const [key, value] of Object.entries(shape.query ?? {})) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n\n const headers: Record<string, string> = {\n \"X-Rsq-Api-key\": profile.apiKey,\n };\n\n let body: string | undefined;\n if (shape.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(shape.body);\n }\n\n const response = await fetch(url, {\n method: shape.method,\n headers,\n body,\n });\n\n const text = await response.text();\n const payload = tryParseJson(text);\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status} ${response.statusText}: ${typeof payload === \"string\" ? payload : JSON.stringify(payload)}`,\n );\n }\n\n return payload;\n}\n\nfunction ensureTrailingSlash(input: string): string {\n return input.endsWith(\"/\") ? input : `${input}/`;\n}\n\nfunction tryParseJson(text: string): unknown {\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","type OutputMode = \"json\" | \"raw\" | \"table\" | \"text\";\n\nexport type OutputOptions = {\n json?: boolean;\n raw?: boolean;\n table?: boolean;\n quiet?: boolean;\n};\n\nexport function resolveOutputMode(options: OutputOptions): OutputMode {\n if (options.raw) {\n return \"raw\";\n }\n\n if (options.table) {\n return \"table\";\n }\n\n if (options.json) {\n return \"json\";\n }\n\n return \"text\";\n}\n\nexport function printOutput(payload: unknown, options: OutputOptions): void {\n const mode = resolveOutputMode(options);\n\n if (mode === \"json\" || mode === \"raw\") {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n\n if (mode === \"table\") {\n const rendered = renderTable(payload);\n process.stdout.write(`${rendered}\\n`);\n return;\n }\n\n if (typeof payload === \"string\") {\n process.stdout.write(`${payload}\\n`);\n return;\n }\n\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nfunction renderTable(payload: unknown): string {\n if (!Array.isArray(payload) || payload.length === 0) {\n return JSON.stringify(payload, null, 2);\n }\n\n if (payload.some((item) => typeof item !== \"object\" || item === null || Array.isArray(item))) {\n return JSON.stringify(payload, null, 2);\n }\n\n const rows = payload as Array<Record<string, unknown>>;\n const columns = Array.from(new Set(rows.flatMap((row) => Object.keys(row))));\n const widths = new Map<string, number>();\n\n for (const column of columns) {\n widths.set(\n column,\n Math.max(column.length, ...rows.map((row) => stringifyCell(row[column]).length)),\n );\n }\n\n const separator = columns.map((column) => \"-\".repeat(widths.get(column) ?? column.length)).join(\" \");\n const header = columns.map((column) => column.padEnd(widths.get(column) ?? column.length)).join(\" \");\n const lines = rows.map((row) =>\n columns.map((column) => stringifyCell(row[column]).padEnd(widths.get(column) ?? column.length)).join(\" \"),\n );\n\n return [header, separator, ...lines].join(\"\\n\");\n}\n\nfunction stringifyCell(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type ParameterDefinition = {\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n required: boolean;\n description?: string;\n schemaType?: string;\n};\n\nexport type OperationDefinition = {\n module: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n path: string;\n operationId: string;\n summary: string;\n description: string;\n parameters: ParameterDefinition[];\n hasRequestBody: boolean;\n requestBodySchema?: RequestBodySchemaDefinition;\n};\n\nexport type RequestBodySchemaDefinition = {\n type?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, RequestBodySchemaDefinition>;\n items?: RequestBodySchemaDefinition;\n};\n\ntype OpenApiDocument = {\n paths?: Record<string, Record<string, Record<string, unknown>>>;\n};\n\nconst operationIdOverrides: Record<string, string> = {\n \"GET /rsq/api/v1/workflow/process-infos/list/{flowApplicationId}\": \"listProcessInfosByFlowApplicationId\",\n \"GET /rsq/api/v1/projects\": \"listProjects\",\n};\n\nlet cachedOperations: OperationDefinition[] | null = null;\n\nexport function loadOperations(): OperationDefinition[] {\n if (cachedOperations) {\n return cachedOperations;\n }\n\n const documentPath = resolveOpenApiPath();\n const document = JSON.parse(readFileSync(documentPath, \"utf8\")) as OpenApiDocument;\n const operations: OperationDefinition[] = [];\n\n for (const [apiPath, item] of Object.entries(document.paths ?? {})) {\n for (const [method, rawOperation] of Object.entries(item)) {\n const normalizedMethod = method.toUpperCase();\n if (![\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(normalizedMethod)) {\n continue;\n }\n\n const operation = rawOperation as {\n operationId?: string;\n summary?: string;\n description?: string;\n tags?: string[];\n parameters?: Array<{\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n required?: boolean;\n description?: string;\n schema?: { type?: string };\n }>;\n requestBody?: {\n content?: {\n \"application/json\"?: {\n schema?: JsonSchemaLike;\n };\n };\n };\n };\n const operationId = resolveOperationId(apiPath, normalizedMethod, operation.operationId);\n const resolvedParameters = (operation.parameters ?? [])\n .filter((parameter) => parameter.name !== \"X-Rsq-Api-key\")\n .map((parameter) => ({\n name: parameter.name,\n in: parameter.in,\n required: Boolean(parameter.required),\n description: parameter.description,\n schemaType: parameter.schema?.type,\n }));\n\n operations.push({\n module: (operation.tags?.[0] ?? \"unknown\").toLowerCase(),\n method: normalizedMethod as OperationDefinition[\"method\"],\n path: apiPath,\n operationId,\n summary: operation.summary ?? \"\",\n description: operation.description ?? operation.summary ?? \"\",\n parameters: resolvedParameters,\n hasRequestBody: Boolean(operation.requestBody),\n requestBodySchema: extractRequestBodySchema(operation.requestBody),\n });\n }\n }\n\n cachedOperations = operations.sort((left, right) => left.operationId.localeCompare(right.operationId));\n return cachedOperations;\n}\n\ntype JsonSchemaLike = {\n type?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, JsonSchemaLike>;\n items?: JsonSchemaLike;\n};\n\nfunction extractRequestBodySchema(\n requestBody:\n | {\n content?: {\n \"application/json\"?: {\n schema?: JsonSchemaLike;\n };\n };\n }\n | undefined,\n): RequestBodySchemaDefinition | undefined {\n const schema = requestBody?.content?.[\"application/json\"]?.schema;\n if (!schema) {\n return undefined;\n }\n\n return normalizeJsonSchema(schema);\n}\n\nfunction normalizeJsonSchema(schema: JsonSchemaLike): RequestBodySchemaDefinition {\n return {\n type: schema.type,\n description: schema.description,\n required: schema.required,\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeJsonSchema(value)]),\n )\n : undefined,\n items: schema.items ? normalizeJsonSchema(schema.items) : undefined,\n };\n}\n\nfunction resolveOperationId(apiPath: string, method: string, operationId: string | undefined): string {\n const override = operationIdOverrides[`${method} ${apiPath}`];\n if (override) {\n return override;\n }\n\n return operationId ?? `${method}:${apiPath}`;\n}\n\nfunction resolveOpenApiPath(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../rishiqing.openapi.json\"),\n path.resolve(moduleDir, \"../../rishiqing.openapi.json\"),\n path.resolve(process.cwd(), \"rishiqing.openapi.json\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Unable to locate rishiqing.openapi.json. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n","import type { Exposure, RsqModule } from \"./types.js\";\n\ntype Override = {\n aliases?: string[];\n keywords?: string[];\n antiKeywords?: string[];\n description?: string;\n exposure?: Exposure;\n};\n\nexport const moduleOrder: RsqModule[] = [\"datasheet\", \"workflow\", \"contacts\", \"project\", \"task\"];\n\nexport const moduleDescriptions: Record<RsqModule, string> = {\n datasheet: \"Datasheet APIs\",\n workflow: \"Workflow APIs\",\n contacts: \"Contacts APIs\",\n project: \"Project APIs\",\n task: \"Task APIs\",\n};\n\nexport const operationOverrides: Record<string, Override> = {\n listTeamDatasheets: {\n aliases: [\"list-datasheets\"],\n keywords: [\"datasheet\", \"table\", \"list team datasheets\"],\n },\n getDatasheetFields: {\n aliases: [\"get-fields\"],\n keywords: [\"datasheet fields\", \"column definitions\"],\n },\n getDatasheetRecords: {\n aliases: [\"list-records\"],\n keywords: [\"datasheet records\", \"rows\", \"query rows\"],\n },\n createDatasheetRecords: {\n aliases: [\"create-records\"],\n keywords: [\"create datasheet record\", \"insert rows\"],\n },\n updateDatasheetRecords: {\n aliases: [\"update-records\"],\n keywords: [\"update datasheet record\", \"modify rows\"],\n },\n deleteDatasheetRecords: {\n aliases: [\"delete-records\"],\n keywords: [\"delete datasheet record\", \"remove rows\"],\n },\n listFlowApplicationTemplates: {\n aliases: [\"list-templates\"],\n keywords: [\"workflow templates\", \"flow templates\", \"流程模板\", \"审批模板\", \"模板列表\"],\n },\n listFlowApplications: {\n aliases: [\"list-apps\"],\n keywords: [\"list workflow applications\", \"list flow apps\", \"流程应用列表\", \"审批流程列表\"],\n },\n listProcessInfosByFlowApplicationId: {\n aliases: [\"list-processes\"],\n keywords: [\"获取已发起的流程列表\", \"流程实例列表\", \"已发起流程列表\", \"运行中的流程列表\", \"list process infos\"],\n },\n createFlowApplication: {\n aliases: [\"create-app\"],\n keywords: [\"create workflow application\", \"new flow app\", \"创建流程应用\", \"新建流程应用\", \"新建审批流程\"],\n },\n createStepInfo: {\n aliases: [\"create-step\"],\n keywords: [\"创建步骤配置\", \"新增步骤\", \"新建步骤\", \"流程步骤\", \"审批步骤\", \"step config\"],\n },\n updateStepInfo: {\n aliases: [\"update-step\"],\n keywords: [\"更新步骤配置\", \"修改步骤配置\", \"编辑步骤\", \"修改步骤名称\", \"step config\"],\n },\n createForm: {\n aliases: [\"create-form\"],\n keywords: [\"创建表单配置\", \"新增表单\", \"新建表单\", \"表单结构\", \"表单字段定义\", \"workflow form\"],\n },\n updateForm: {\n aliases: [\"update-form\"],\n keywords: [\"更新表单配置\", \"修改表单配置\", \"编辑表单\", \"修改表单字段定义\", \"workflow form\"],\n },\n createAuditInfo: {\n aliases: [\"create-audit\"],\n keywords: [\"创建审核项配置\", \"新增审核项\", \"新建审核节点\", \"添加审核人配置\", \"audit config\"],\n },\n updateAuditInfo: {\n aliases: [\"update-audit\"],\n keywords: [\"更新审核项配置\", \"修改审核项配置\", \"编辑审核节点\", \"修改审核人配置\", \"audit config\"],\n },\n updateProcessInfoStep: {\n aliases: [\"update-running-step\", \"set-running-step-executor\"],\n keywords: [\n \"修改运行中的步骤属性\",\n \"修改进行中步骤的执行人\",\n \"修改步骤执行人\",\n \"调整步骤执行人\",\n \"设置步骤执行人\",\n \"运行中步骤执行人\",\n \"步骤执行人\",\n \"步骤限定时间\",\n \"deadTime\",\n \"userIds\",\n ],\n antiKeywords: [\"字段值\", \"表单字段\", \"fieldValue\", \"fieldId\"],\n },\n updateProcessInfoAudit: {\n aliases: [\"update-running-audit\", \"set-running-audit-users\"],\n keywords: [\"修改运行中的审核项属性\", \"修改审核人\", \"调整审核人\", \"运行中审核人\", \"audit user\"],\n antiKeywords: [\"执行人\", \"字段值\", \"表单字段\", \"步骤状态\"],\n description: \"调整运行中审核项的审核人。这个接口用于审核项,不用于步骤状态流转。\",\n exposure: \"internal\",\n },\n updateProcessInfoStepField: {\n aliases: [\"update-step-field-value\", \"set-step-field-value\"],\n keywords: [\n \"修改步骤表单中的字段值\",\n \"修改字段值\",\n \"设置字段值\",\n \"填写字段\",\n \"更新表单字段值\",\n \"步骤字段值\",\n \"表单字段值\",\n \"fieldValue\",\n ],\n antiKeywords: [\"执行人\", \"审核人\", \"负责人\", \"参与人\", \"成员\", \"deadTime\", \"限定时间\"],\n exposure: \"internal\",\n },\n getProcessInfoStep: {\n aliases: [\"get-running-step\"],\n keywords: [\"查询运行中步骤\", \"查看步骤详情\", \"查看进行中步骤\", \"running step detail\"],\n },\n listStepInfosByFlowApplicationId: {\n aliases: [\"list-steps\"],\n keywords: [\"查询步骤列表\", \"流程步骤列表\", \"审批步骤列表\", \"list workflow steps\"],\n },\n startProcessInfosBatch: {\n aliases: [\"start-process-batch\"],\n keywords: [\"批量发起流程\", \"批量启动流程实例\", \"批量提交流程\", \"start workflow process batch\"],\n },\n getProcessInfo: {\n aliases: [\"get-process\"],\n keywords: [\"process info\", \"workflow instance\", \"流程实例\", \"审批实例\", \"查看流程实例\"],\n },\n listAllUsers: {\n aliases: [\"list-users\"],\n keywords: [\"contacts\", \"users\", \"employees\"],\n },\n createProject: {\n aliases: [\"create\"],\n keywords: [\"create project\", \"new project\", \"创建项目\", \"新建项目\"],\n },\n listProjects: {\n aliases: [\"list\"],\n keywords: [\"获取项目列表\", \"项目列表\", \"全部项目\", \"查询项目列表\", \"list projects\"],\n },\n getProjectById: {\n aliases: [\"get\"],\n keywords: [\"project detail\", \"get project\", \"项目详情\", \"查看项目\"],\n },\n listPlansByProjectIds: {\n aliases: [\"list-plans\"],\n keywords: [\"plans\", \"project plans\", \"模块列表\", \"项目模块\", \"查询模块\"],\n },\n createPlan: {\n aliases: [\"create-plan\"],\n keywords: [\"创建模块\", \"新增模块\", \"新建模块\", \"项目模块\", \"project plan\", \"task\", \"statistic\", \"overview\", \"folder\", \"risk\", \"workflow\", \"datasheet\", \"deliverable\"],\n description:\n \"创建项目下的模块。type 仅支持这些值:task、statistic、overview、folder、risk、workflow、datasheet、deliverable。\",\n },\n updatePlan: {\n aliases: [\"update-plan\"],\n keywords: [\"修改模块\", \"更新模块\", \"编辑模块\", \"project plan\"],\n },\n createCard: {\n aliases: [\"create-card\"],\n keywords: [\"创建卡片\", \"新增卡片\", \"新建卡片\", \"模块卡片\", \"project card\"],\n },\n updateCard: {\n aliases: [\"update-card\"],\n keywords: [\"修改卡片\", \"更新卡片\", \"编辑卡片\", \"project card\"],\n },\n updateProject: {\n aliases: [\"update-project\"],\n keywords: [\"修改项目\", \"更新项目\", \"编辑项目\", \"project info\"],\n },\n createTask: {\n aliases: [\"create\"],\n keywords: [\"create task\", \"new task\", \"创建任务\", \"新建任务\"],\n },\n getTaskById: {\n aliases: [\"get\"],\n keywords: [\"task detail\", \"get task\", \"任务详情\", \"查看任务\"],\n },\n updateTask: {\n aliases: [\"update\"],\n keywords: [\"update task\", \"edit task\", \"修改任务\", \"编辑任务\", \"更新任务信息\"],\n },\n deleteTask: {\n aliases: [\"delete\"],\n keywords: [\"delete task\", \"remove task\", \"删除任务\", \"移除任务\"],\n },\n getTaskComments: {\n aliases: [\"comments\"],\n keywords: [\"task comments\", \"list task comments\", \"任务评论\", \"评论列表\", \"查看评论\"],\n antiKeywords: [\"发表评论\", \"提交评论\", \"回复任务\"],\n },\n createTaskComment: {\n aliases: [\"comment\"],\n keywords: [\"create task comment\", \"add task comment\", \"发表评论\", \"提交评论\", \"回复任务\"],\n antiKeywords: [\"评论列表\", \"查看评论\"],\n },\n completeTask: {\n aliases: [\"complete\"],\n keywords: [\"完成任务\", \"打钩任务\", \"标记完成\", \"close task\"],\n antiKeywords: [\"创建任务\", \"修改任务\", \"发表评论\", \"评论列表\"],\n },\n updateProjectMember: {\n aliases: [\"update-project-member\"],\n keywords: [\"修改项目成员\", \"设置项目成员\", \"添加项目成员\", \"项目成员\", \"project member\"],\n antiKeywords: [\"创建项目\", \"项目信息\", \"项目模块\", \"卡片\"],\n exposure: \"internal\",\n },\n updateProcessInfoStepStatus: {\n aliases: [\"update-running-step-status\"],\n keywords: [\n \"流转流程步骤状态\",\n \"提交步骤\",\n \"完成步骤\",\n \"通过步骤\",\n \"拒绝步骤\",\n \"跳过步骤\",\n \"步骤状态\",\n \"审批通过\",\n \"审批拒绝\",\n ],\n antiKeywords: [\"执行人\", \"审核项id\", \"auditInfoId\", \"processInfoAuditId\", \"审核人\", \"字段值\", \"表单字段\"],\n description:\n \"对运行中的步骤执行状态动作。无论 action 是什么,path 参数 processInfoStepId 始终传步骤 id,不要传审核项 id。\",\n exposure: \"internal\",\n },\n updateTaskExecutor: {\n aliases: [\"update-executor\"],\n keywords: [\"修改任务执行人\", \"设置执行人\", \"调整执行人\", \"task executor\"],\n antiKeywords: [\"负责人\", \"参与人\", \"评论\"],\n exposure: \"composed\",\n },\n updateTaskResponsible: {\n aliases: [\"update-responsible\"],\n keywords: [\"修改任务负责人\", \"设置负责人\", \"调整负责人\", \"task responsible\"],\n antiKeywords: [\"执行人\", \"参与人\", \"评论\"],\n exposure: \"composed\",\n },\n addTaskParticipant: {\n aliases: [\"add-participant\"],\n keywords: [\"添加任务参与人\", \"增加参与人\", \"设置参与人\", \"task participant\"],\n antiKeywords: [\"执行人\", \"负责人\", \"评论\"],\n exposure: \"composed\",\n },\n};\n","import { loadOperations } from \"../core/openapi.js\";\nimport { moduleDescriptions, moduleOrder, operationOverrides } from \"./overrides.js\";\nimport type { CommandDefinition, Exposure, RsqModule } from \"./types.js\";\nimport type { ParameterDefinition, RequestBodySchemaDefinition } from \"../core/openapi.js\";\n\nlet cachedRegistry: CommandDefinition[] | null = null;\n\nexport function getRegistry(): CommandDefinition[] {\n if (cachedRegistry) {\n return cachedRegistry;\n }\n\n const openApiCommands: CommandDefinition[] = loadOperations()\n .filter((operation): operation is typeof operation & { module: RsqModule } => moduleOrder.includes(operation.module as RsqModule))\n .map((operation) => {\n const override = operationOverrides[operation.operationId] ?? {};\n const exposure = override.exposure ?? defaultExposure(operation.operationId);\n return {\n module: operation.module as RsqModule,\n name: operation.operationId,\n aliases: override.aliases ?? [],\n summary: operation.summary || operation.operationId,\n description: override.description ?? operation.description ?? operation.summary ?? operation.operationId,\n api: {\n method: operation.method,\n path: operation.path,\n },\n parameters: operation.parameters.map(annotateParameterDescription),\n hasRequestBody: operation.hasRequestBody,\n requestBodySchema: annotateRequestBodySchema(operation.requestBodySchema),\n keywords: dedupe([\n operation.operationId,\n operation.summary,\n operation.path,\n ...pathKeywords(operation.path),\n ...(override.keywords ?? []),\n ]),\n antiKeywords: dedupe(override.antiKeywords ?? []),\n examples: buildExamples(operation.module as RsqModule, operation.operationId, override.aliases ?? []),\n exposure,\n idempotent: operation.method === \"GET\",\n outputMode: \"json\",\n } satisfies CommandDefinition;\n });\n\n cachedRegistry = [...openApiCommands, ...buildCustomCommands()];\n\n return cachedRegistry;\n}\n\nexport function getPublicRegistry(): CommandDefinition[] {\n return getRegistry().filter((command) => command.exposure === \"public\");\n}\n\nexport function getModuleDefinitions() {\n return moduleOrder.map((module) => ({\n name: module,\n description: moduleDescriptions[module],\n }));\n}\n\nexport function findCommand(moduleName: string, commandName: string): CommandDefinition | undefined {\n const normalized = commandName.toLowerCase();\n return getRegistry().find(\n (command) =>\n command.module === moduleName &&\n (command.name.toLowerCase() === normalized || command.aliases.some((alias) => alias.toLowerCase() === normalized)),\n );\n}\n\nfunction buildExamples(module: RsqModule, name: string, aliases: string[]): string[] {\n const examples = [`rsq-cli ${module} ${name} --json`];\n if (aliases[0]) {\n examples.push(`rsq-cli ${module} ${aliases[0]} --json`);\n }\n return examples;\n}\n\nfunction annotateParameterDescription(parameter: ParameterDefinition): ParameterDefinition {\n if (!looksLikeIdField(parameter.name)) {\n return parameter;\n }\n\n return {\n ...parameter,\n description: appendIdRule(parameter.description),\n };\n}\n\nfunction annotateRequestBodySchema(\n schema: RequestBodySchemaDefinition | undefined,\n): RequestBodySchemaDefinition | undefined {\n if (!schema) {\n return undefined;\n }\n\n return {\n ...schema,\n description: schema.description,\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n {\n ...annotateRequestBodySchema(value),\n description: looksLikeIdField(key) ? appendIdRule(value.description) : value.description,\n },\n ]),\n )\n : undefined,\n items: schema.items ? annotateRequestBodySchema(schema.items) : undefined,\n };\n}\n\nfunction appendIdRule(description: string | undefined): string {\n const rule = \"必须传前缀+uuid风格的字符串 id,不要传数字类型 id,也不要传纯数字字符串。\";\n if (!description) {\n return rule;\n }\n\n return description.includes(rule) ? description : `${description} | ${rule}`;\n}\n\nfunction looksLikeIdField(name: string): boolean {\n return /ids?$/i.test(name);\n}\n\nfunction defaultExposure(operationId: string): Exposure {\n if (operationId.startsWith(\"list\") || operationId.startsWith(\"get\") || operationId.startsWith(\"create\") || operationId.startsWith(\"update\") || operationId.startsWith(\"delete\")) {\n return \"public\";\n }\n\n return \"composed\";\n}\n\nfunction pathKeywords(apiPath: string): string[] {\n return apiPath\n .split(\"/\")\n .filter(Boolean)\n .flatMap((segment) => [segment, segment.replace(/[{}]/g, \"\"), segment.replace(/-/g, \" \")]);\n}\n\nfunction dedupe(values: Array<string | undefined>): string[] {\n return Array.from(new Set(values.filter((value): value is string => Boolean(value))));\n}\n\nfunction buildCustomCommands(): CommandDefinition[] {\n return [\n {\n module: \"contacts\",\n name: \"resolveUser\",\n aliases: [\"resolve-user\"],\n summary: \"根据用户名称解析 userId\",\n description: \"先查询全部用户,再按 userName 匹配,返回唯一命中的 userId。\",\n api: {\n method: \"GET\",\n path: \"/rsq/api/v1/contacts/list-all-user\",\n },\n parameters: [\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"需要解析的人员名称\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\n \"resolve user\",\n \"userName to userId\",\n \"根据姓名找 userId\",\n \"resolve-user\",\n \"contacts\",\n ],\n antiKeywords: [\"列表\", \"全部用户\"],\n examples: [\n \"rsq-cli contacts resolveUser --user-name 张三 --json\",\n \"rsq-cli contacts resolve-user --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: true,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"setTaskExecutorByName\",\n aliases: [\"set-executor-by-name\"],\n summary: \"根据人员名称设置任务执行人\",\n description: \"先按 userName 解析 userId,再更新任务执行人。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/tasks/{taskId}/executor\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"执行人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task executor by name\", \"set executor by name\", \"根据姓名设置执行人\"],\n antiKeywords: [\"负责人\", \"参与人\", \"评论\"],\n examples: [\n \"rsq-cli task setTaskExecutorByName --task-id task_demo --user-name 张三 --json\",\n \"rsq-cli task set-executor-by-name --task-id task_demo --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"setTaskResponsibleByName\",\n aliases: [\"set-responsible-by-name\"],\n summary: \"根据人员名称设置任务负责人\",\n description: \"先按 userName 解析 userId,再更新任务负责人。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/tasks/{taskId}/responsible\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"负责人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task responsible by name\", \"set responsible by name\", \"根据姓名设置负责人\"],\n antiKeywords: [\"执行人\", \"参与人\", \"评论\"],\n examples: [\n \"rsq-cli task setTaskResponsibleByName --task-id task_demo --user-name 李四 --json\",\n \"rsq-cli task set-responsible-by-name --task-id task_demo --user-name 李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"addTaskParticipantByName\",\n aliases: [\"add-participant-by-name\"],\n summary: \"根据人员名称添加任务参与人\",\n description: \"先按 userName 解析 userId,再添加任务参与人。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/tasks/{taskId}/participants\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"参与人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task participant by name\", \"add participant by name\", \"根据姓名添加参与人\"],\n antiKeywords: [\"执行人\", \"负责人\", \"评论\"],\n examples: [\n \"rsq-cli task addTaskParticipantByName --task-id task_demo --user-name 王五 --json\",\n \"rsq-cli task add-participant-by-name --task-id task_demo --user-name 王五 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"project\",\n name: \"setProjectMemberByName\",\n aliases: [\"set-member-by-name\"],\n summary: \"根据人员名称设置项目成员\",\n description: \"先按 userName 解析 userId,再更新项目成员。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/projects/{projectId}/members\",\n },\n parameters: [\n {\n name: \"projectId\",\n in: \"path\",\n required: true,\n description: \"projectId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"项目成员姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"project member by name\", \"set project member by name\", \"根据姓名设置项目成员\"],\n examples: [\n \"rsq-cli project setProjectMemberByName --project-id proj_demo --user-name 张三 --json\",\n \"rsq-cli project set-member-by-name --project-id proj_demo --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"workflow\",\n name: \"createAuditInfoByNames\",\n aliases: [\"create-audit-by-names\"],\n summary: \"根据人员名称创建审核项配置\",\n description: \"先按 userName 解析 userId,再创建审核项配置。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/workflow/audit-infos\",\n },\n parameters: [\n { name: \"flowApplicationId\", in: \"query\", required: true, description: \"流程应用id\", schemaType: \"string\" },\n { name: \"stepInfoId\", in: \"query\", required: true, description: \"步骤配置id\", schemaType: \"string\" },\n { name: \"auditInfoName\", in: \"query\", required: true, description: \"审核项名称\", schemaType: \"string\" },\n { name: \"userNames\", in: \"query\", required: true, description: \"审核人名称列表,逗号分隔\", schemaType: \"string\" },\n { name: \"frontAuditInfoId\", in: \"query\", required: false, description: \"前一个审核项id\", schemaType: \"string\" },\n ],\n hasRequestBody: false,\n keywords: [\"create audit by names\", \"workflow audit users by name\", \"根据姓名创建审核项\"],\n examples: [\n \"rsq-cli workflow createAuditInfoByNames --flow-application-id flow_demo --step-info-id step_demo --audit-info-name 部门审批 --user-names 张三,李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"workflow\",\n name: \"updateAuditInfoByNames\",\n aliases: [\"update-audit-by-names\"],\n summary: \"根据人员名称更新审核项配置\",\n description: \"先按 userName 解析 userId,再更新审核项配置。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/workflow/audit-infos/{auditInfoId}\",\n },\n parameters: [\n { name: \"auditInfoId\", in: \"path\", required: true, description: \"审核项配置id\", schemaType: \"string\" },\n { name: \"auditInfoName\", in: \"query\", required: true, description: \"审核项名称\", schemaType: \"string\" },\n { name: \"userNames\", in: \"query\", required: true, description: \"审核人名称列表,逗号分隔\", schemaType: \"string\" },\n ],\n hasRequestBody: false,\n keywords: [\"update audit by names\", \"workflow audit users by name\", \"根据姓名更新审核项\"],\n examples: [\n \"rsq-cli workflow updateAuditInfoByNames --audit-info-id audit_demo --audit-info-name 部门审批 --user-names 张三,李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n ];\n}\n","import { getRegistry } from \"./index.js\";\n\nexport function getSkillContract() {\n return {\n skill: {\n name: \"rishiqing\",\n summary: \"识别日事清领域自然语言请求,并路由到 rsq-cli 的对应模块与命令。\",\n },\n trigger: {\n domain: \"rishiqing\",\n when: [\n \"当用户在对话中提到日事清、rsq、rishiqing 时,默认这是日事清操作请求。\",\n \"当用户提到项目、模块、卡片、任务、流程、多维表格、数据、流程应用、流程实例、步骤、表单、字段、审核项、审批、成员、负责人、执行人、参与人等领域词时,也优先按日事清请求处理。\",\n ],\n keywords: [\n \"日事清\",\n \"rsq\",\n \"rishiqing\",\n \"项目\",\n \"模块\",\n \"卡片\",\n \"任务\",\n \"流程\",\n \"流程应用\",\n \"流程实例\",\n \"步骤\",\n \"表单\",\n \"字段\",\n \"审核项\",\n \"审批\",\n \"多维表格\",\n \"数据\",\n \"成员\",\n \"负责人\",\n \"执行人\",\n \"参与人\",\n ],\n },\n routing: {\n moduleHints: [\n {\n module: \"project\",\n intents: [\"项目\", \"模块\", \"项目成员\", \"项目概览\", \"项目下计划\"],\n },\n {\n module: \"task\",\n intents: [\"任务\", \"卡片\", \"执行人\", \"负责人\", \"参与人\", \"任务状态\"],\n },\n {\n module: \"workflow\",\n intents: [\"流程应用\", \"流程实例\", \"步骤\", \"表单\", \"字段\", \"审核项\", \"审批流\"],\n },\n {\n module: \"datasheet\",\n intents: [\"多维表格\", \"数据表\", \"记录\", \"字段\", \"数据\"],\n },\n {\n module: \"contacts\",\n intents: [\"按姓名解析用户\", \"查成员\", \"查用户\"],\n },\n ],\n },\n globalRules: [\n \"遇到日事清领域短语时,先识别为 rsq-cli 操作意图,不要把它当成泛化项目管理请求。\",\n \"不确定具体命令时,先调用 rsq-cli search;确认候选命令后再调用 rsq-cli describe 阅读参数和 requestBodySchema。\",\n \"真正执行 API 命令时,优先走 rsq-cli agent <module> <command> ...;describe/search 继续走原入口。\",\n \"涉及创建、更新、绑定、分配等写操作时,优先使用 --dry-run --json 预览。\",\n \"只要命令带 request body,优先把 JSON 写入文件并通过 --body-file 传入,不要默认拼内联 --body。\",\n \"所有 id 字段都必须传前缀+uuid风格的字符串,例如 flowApp_019d6c0c2f03770b8b789ec313076e64。\",\n \"不要传数字类型 id,也不要传纯数字字符串 id。\",\n \"调用前优先阅读参数说明和 requestBodySchema 中的字段说明,再组装参数。\",\n ],\n tools: getRegistry().map((command) => ({\n tool: `${command.module}.${command.aliases[0] ?? command.name}`,\n canonical: `${command.module}.${command.name}`,\n summary: command.summary,\n exposure: command.exposure,\n keywords: command.keywords,\n examples: command.examples,\n input: {\n parameters: command.parameters.map((parameter) => ({\n name: parameter.name,\n location: parameter.in,\n required: parameter.required,\n type: parameter.schemaType ?? \"string\",\n description: parameter.description,\n })),\n acceptsBody: command.hasRequestBody,\n requestBodySchema: command.requestBodySchema,\n },\n })),\n };\n}\n"],"mappings":"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","names":["readFile","writeFile","os","path","existsSync","mkdir","os","path","fileURLToPath","existsSync","path","fileURLToPath","ensureTrailingSlash","path","looksLikeIdField","readFile","os","writeFile"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rishiqing
|
|
3
|
-
description: 当用户在 agent 对话中提到日事清、rsq、rishiqing,或提到项目、模块、卡片、任务、流程、多维表格、数据、流程应用、流程实例、步骤、表单、字段、审核项、审批、成员、负责人、执行人、参与人等日事清领域词汇时使用。此 skill 用于把这些自然语言快速识别为“要用 rsq-cli 操作日事清”,并优先通过 rsq-cli 的 describe、search
|
|
3
|
+
description: 当用户在 agent 对话中提到日事清、rsq、rishiqing,或提到项目、模块、卡片、任务、流程、多维表格、数据、流程应用、流程实例、步骤、表单、字段、审核项、审批、成员、负责人、执行人、参与人等日事清领域词汇时使用。此 skill 用于把这些自然语言快速识别为“要用 rsq-cli 操作日事清”,并优先通过 rsq-cli 的 describe、search 与 agent 包装命令完成查询、创建、更新和编排。
|
|
4
4
|
metadata:
|
|
5
5
|
requires:
|
|
6
6
|
bins: ["rsq-cli"]
|
|
@@ -51,7 +51,8 @@ rsq-cli describe <module> <command> --json
|
|
|
51
51
|
|
|
52
52
|
- 不确定命令名时,先 `search`
|
|
53
53
|
- 确认到候选命令后,再 `describe` 看参数和 `requestBodySchema`
|
|
54
|
-
-
|
|
54
|
+
- 真正执行时优先走 `rsq-cli agent <module> <command> ...`
|
|
55
|
+
- 需要姓名转用户 id 时,先 `rsq-cli agent contacts resolveUser --user-name <姓名> --json`
|
|
55
56
|
|
|
56
57
|
### 3. 写操作先预览
|
|
57
58
|
|
|
@@ -61,13 +62,22 @@ rsq-cli describe <module> <command> --json
|
|
|
61
62
|
--dry-run --json
|
|
62
63
|
```
|
|
63
64
|
|
|
65
|
+
如果命令带 request body,优先使用 `--body-file <path>`,不要默认拼内联 `--body '<json>'`。
|
|
66
|
+
|
|
67
|
+
原因:
|
|
68
|
+
|
|
69
|
+
- 更稳定,避免不同 shell / Agent 运行环境下的引号和转义问题
|
|
70
|
+
- 更适合较长 JSON 或多层对象
|
|
71
|
+
|
|
64
72
|
确认参数结构正确后再正式执行。
|
|
65
73
|
|
|
66
74
|
## 固定约束
|
|
67
75
|
|
|
68
76
|
- 所有 `...Id` / `...Ids` 一律按字符串 id 传递
|
|
69
77
|
- 不要传数字 id,也不要传纯数字字符串
|
|
70
|
-
- 组装
|
|
78
|
+
- 组装 request body 前先读 `requestBodySchema`
|
|
79
|
+
- 有 request body 时优先写入临时 JSON 文件并通过 `--body-file` 传入
|
|
80
|
+
- Agent 执行命令时优先使用 `rsq-cli agent <module> <command> ...`
|
|
71
81
|
- 用户给的是中文业务词时,先做语义映射,不要要求用户先说出精确命令名
|
|
72
82
|
- 若用户同时提到“流程 + 项目”,优先确认是否是在某个项目下创建 workflow 模块
|
|
73
83
|
|
|
@@ -33,7 +33,7 @@ metadata:
|
|
|
33
33
|
示例:
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
|
-
rsq-cli project createPlan --project-id <projectId> --body
|
|
36
|
+
rsq-cli agent project createPlan --project-id <projectId> --body-file <request.json> --json
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
记录返回的:
|
|
@@ -46,7 +46,7 @@ rsq-cli project createPlan --project-id <projectId> --body '{"name":"<流程名
|
|
|
46
46
|
### 1. 先查模板
|
|
47
47
|
|
|
48
48
|
```bash
|
|
49
|
-
rsq-cli workflow listFlowApplicationTemplates --json
|
|
49
|
+
rsq-cli agent workflow listFlowApplicationTemplates --json
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
读取返回的:
|
|
@@ -80,7 +80,7 @@ rsq-cli workflow listFlowApplicationTemplates --json
|
|
|
80
80
|
如果用户没有指定项目,调用独立流程应用创建接口:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
rsq-cli workflow createFlowApplication --body
|
|
83
|
+
rsq-cli agent workflow createFlowApplication --body-file <request.json> --json
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
记录返回的:
|
|
@@ -90,7 +90,7 @@ rsq-cli workflow createFlowApplication --body '{"flowApplicationTemplateId":"<te
|
|
|
90
90
|
如果用户指定了项目,则不要先调用 `createFlowApplication`,而是调用项目模块创建接口:
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
rsq-cli project createPlan --project-id <projectId> --body
|
|
93
|
+
rsq-cli agent project createPlan --project-id <projectId> --body-file <request.json> --json
|
|
94
94
|
```
|
|
95
95
|
|
|
96
96
|
然后记录:
|
|
@@ -159,7 +159,7 @@ rsq-cli project createPlan --project-id <projectId> --body '{"name":"<name>","ty
|
|
|
159
159
|
如果用户给了具体人员姓名,先解析成 `userId`:
|
|
160
160
|
|
|
161
161
|
```bash
|
|
162
|
-
rsq-cli contacts resolveUser --user-name 张三 --json
|
|
162
|
+
rsq-cli agent contacts resolveUser --user-name 张三 --json
|
|
163
163
|
```
|
|
164
164
|
|
|
165
165
|
再把 `userId` 填入 `auditInfoUsers`。
|
|
@@ -176,7 +176,9 @@ rsq-cli contacts resolveUser --user-name 张三 --json
|
|
|
176
176
|
- 项目分支后续一律使用 `data.plan.flowApplicationId`,不要再额外创建一个独立流程应用
|
|
177
177
|
- 优先使用现成模板,只有匹配不到时才走“标准模式”
|
|
178
178
|
- “标准模式”下必须继续补步骤、表单、审核项
|
|
179
|
+
- Agent 执行时优先走 `rsq-cli agent ...`
|
|
179
180
|
- 写操作优先用 `--dry-run --json` 预览
|
|
181
|
+
- 只要命令带 request body,优先用 `--body-file`,不要默认用内联 `--body`
|
|
180
182
|
- 不要伪造 `userId`
|
|
181
183
|
- 如果模板匹配存在多个候选且无法判断唯一最佳项,先向用户确认
|
|
182
184
|
- 如果用户只给了一个短名称,也要尽量结合常见业务场景做合理推断
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
如果用户指定了项目,先创建模块:
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
rsq-cli project createPlan --project-id <projectId> --body
|
|
8
|
+
rsq-cli agent project createPlan --project-id <projectId> --body-file <request.json> --json
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
记录:
|
|
@@ -20,7 +20,7 @@ rsq-cli project createPlan --project-id <projectId> --body '{"name":"<流程名
|
|
|
20
20
|
## 1. 模板匹配
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
rsq-cli workflow listFlowApplicationTemplates --json
|
|
23
|
+
rsq-cli agent workflow listFlowApplicationTemplates --json
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
目标:
|
|
@@ -31,7 +31,7 @@ rsq-cli workflow listFlowApplicationTemplates --json
|
|
|
31
31
|
## 2. 创建流程应用
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
rsq-cli workflow createFlowApplication --body
|
|
34
|
+
rsq-cli agent workflow createFlowApplication --body-file <request.json> --json
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
记录:
|
|
@@ -43,7 +43,7 @@ rsq-cli workflow createFlowApplication --body '{"flowApplicationTemplateId":"<te
|
|
|
43
43
|
## 3. 如果使用标准模式,先获取现有步骤锚点
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
rsq-cli workflow listStepInfosByFlowApplicationId --flowapplication-id <flowApplicationId> --json
|
|
46
|
+
rsq-cli agent workflow listStepInfosByFlowApplicationId --flowapplication-id <flowApplicationId> --json
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
用途:
|
|
@@ -54,7 +54,7 @@ rsq-cli workflow listStepInfosByFlowApplicationId --flowapplication-id <flowAppl
|
|
|
54
54
|
## 4. 创建步骤
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
|
-
rsq-cli workflow createStepInfo --body
|
|
57
|
+
rsq-cli agent workflow createStepInfo --body-file <request.json> --json
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
记录:
|
|
@@ -76,13 +76,13 @@ rsq-cli workflow createStepInfo --body '{"flowApplicationId":"<flowApplicationId
|
|
|
76
76
|
创建表单后,调用:
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
rsq-cli workflow updateStepInfo --step-info-id <stepInfoId> --body
|
|
79
|
+
rsq-cli agent workflow updateStepInfo --step-info-id <stepInfoId> --body-file <request.json> --json
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
## 7. 创建审核项
|
|
83
83
|
|
|
84
84
|
```bash
|
|
85
|
-
rsq-cli workflow createAuditInfo --body
|
|
85
|
+
rsq-cli agent workflow createAuditInfo --body-file <request.json> --json
|
|
86
86
|
```
|
|
87
87
|
|
|
88
88
|
如果没有明确人员:
|