@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
- # 安装 CLI Skill(推荐)
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
- rsq-cli project create --body '{"name":"新项目"}' --json
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("0.1.0");
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 registerApiCommand(parent, definition) {
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
- const body = sanitizeRequestBody(definition, await readBody(options));
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, options, body);
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, path4, issues) {
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(`${path4}.${requiredKey}: missing required field`);
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, `${path4}.${propertyName}`, issues);
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, `${path4}[${index}]`, issues);
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, path4, issues);
1793
+ validateStringByDescription(value, schema.description, path5, issues);
1704
1794
  }
1705
1795
  }
1706
- function validateIdLikeBodyValues(value, path4, issues) {
1796
+ function validateIdLikeBodyValues(value, path5, issues) {
1707
1797
  if (Array.isArray(value)) {
1708
1798
  value.forEach((item, index) => {
1709
- validateIdLikeBodyValues(item, `${path4}[${index}]`, issues);
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 = `${path4}.${key}`;
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, path4, issues) {
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(`${path4}: invalid format "${value}". Allowed formats: yyyy-MM-dd or yyyy-MM-dd'T'HH:mm:ssXXX`);
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/cli",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Agent-oriented CLI for Rishiqing APIs",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rishiqing
3
- description: 当用户在 agent 对话中提到日事清、rsq、rishiqing,或提到项目、模块、卡片、任务、流程、多维表格、数据、流程应用、流程实例、步骤、表单、字段、审核项、审批、成员、负责人、执行人、参与人等日事清领域词汇时使用。此 skill 用于把这些自然语言快速识别为“要用 rsq-cli 操作日事清”,并优先通过 rsq-cli 的 describe、search、project、task、workflow、datasheet、contacts 等命令完成查询、创建、更新和编排。
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
- - 需要姓名转用户 id 时,先 `rsq-cli contacts resolveUser --user-name <姓名> --json`
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
- - 组装 `--body` 前先读 `requestBodySchema`
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 '{"name":"<流程名称>","type":"workflow"}' --json
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 '{"flowApplicationTemplateId":"<templateId>","flowApplicationName":"<name>"}' --json
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 '{"name":"<name>","type":"workflow"}' --json
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 '{"name":"<流程名称>","type":"workflow"}' --json
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 '{"flowApplicationTemplateId":"<templateId>","flowApplicationName":"<name>"}' --json
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 '{"flowApplicationId":"<flowApplicationId>","stepInfoName":"部门负责人审批","frontStepInfoId":"<anchorStepInfoId>"}' --json
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 '{"flowApplicationId":"<flowApplicationId>","stepInfoName":"部门负责人审批","formId":"<formId>"}' --json
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 '{"flowApplicationId":"<flowApplicationId>","stepInfoId":"<stepInfoId>","auditInfoName":"部门负责人审批","frontAuditInfoId":"","auditInfoUsers":["<userId>"]}' --json
85
+ rsq-cli agent workflow createAuditInfo --body-file <request.json> --json
86
86
  ```
87
87
 
88
88
  如果没有明确人员: