@rishiqing/cli 0.1.5 → 0.1.6

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
@@ -17,6 +17,14 @@
17
17
  - Node.js `>= 20`
18
18
  - 一个可用的 `X-Rsq-Api-key`(日事清->设置->开发者配置)
19
19
 
20
+ ### 极速开始
21
+
22
+ ```bash
23
+ npm install -g @rishiqing/cli
24
+ rsq-cli install
25
+ rsq-cli config init
26
+ ```
27
+
20
28
  ### 快速开始
21
29
 
22
30
  #### 安装
@@ -47,12 +55,6 @@ rsq-cli install --dir ~/.my-agent/skills
47
55
  rsq-cli install --dry-run --json
48
56
  ```
49
57
 
50
- 安装完成后确认命令可用:
51
-
52
- ```bash
53
- rsq-cli --help
54
- ```
55
-
56
58
  #### 配置
57
59
 
58
60
  先初始化用户级 API Key 配置:
@@ -67,6 +69,12 @@ rsq-cli config init
67
69
  rsq-cli config path
68
70
  ```
69
71
 
72
+ 查看常用命令:
73
+
74
+ ```bash
75
+ rsq-cli --help
76
+ ```
77
+
70
78
  ## Agent 能力
71
79
 
72
80
  `rsq-cli` 既提供内建的 agent contract,也保留了仓库内可复用的 skill。
package/dist/cli.js CHANGED
@@ -11,7 +11,7 @@ import { stdin, stdout } from "process";
11
11
  // package.json
12
12
  var package_default = {
13
13
  name: "@rishiqing/cli",
14
- version: "0.1.5",
14
+ version: "0.1.6",
15
15
  description: "Agent-oriented CLI for Rishiqing APIs",
16
16
  license: "MIT",
17
17
  type: "module",
@@ -1092,6 +1092,62 @@ function buildCustomCommands() {
1092
1092
  ];
1093
1093
  }
1094
1094
 
1095
+ // src/workflow/field-enum.ts
1096
+ var workflowFieldTypeDefinitions = [
1097
+ { type: 1 /* Content */, key: "Content", valueText: "Content", chineseName: "\u6587\u672C\u6846", aliases: ["\u6587\u672C\u6846", "\u6587\u672C", "\u5355\u884C\u6587\u672C", "content", "text"] },
1098
+ { type: 2 /* Number */, key: "Number", valueText: "Number", chineseName: "\u6570\u5B57", aliases: ["\u6570\u5B57", "\u6570\u503C", "number", "numeric"] },
1099
+ { type: 3 /* Selector */, key: "Selector", valueText: "Selector", chineseName: "\u9009\u9879", aliases: ["\u9009\u9879", "\u5355\u9009", "selector", "option"] },
1100
+ { type: 4 /* Menu */, key: "Menu", valueText: "Menu", chineseName: "\u4E0B\u62C9\u83DC\u5355", aliases: ["\u4E0B\u62C9\u83DC\u5355", "\u4E0B\u62C9", "\u83DC\u5355", "menu", "dropdown"] },
1101
+ { type: 5 /* Date */, key: "Date", valueText: "Date", chineseName: "\u65E5\u671F", aliases: ["\u65E5\u671F", "\u65F6\u95F4", "date", "datetime"] },
1102
+ { type: 6 /* File */, key: "File", valueText: "File", chineseName: "\u9644\u4EF6", aliases: ["\u9644\u4EF6", "\u6587\u4EF6", "\u4E0A\u4F20\u9644\u4EF6", "file", "attachment"] },
1103
+ { type: 7 /* Line */, key: "Line", valueText: "Line", chineseName: "\u5206\u5272\u7EBF", aliases: ["\u5206\u5272\u7EBF", "\u5206\u9694\u7EBF", "line", "divider"] },
1104
+ { type: 8 /* WorkHour */, key: "WorkHour", valueText: "WorkHour", chineseName: "\u5DE5\u65F6", aliases: ["\u5DE5\u65F6", "workhour", "work hour"] },
1105
+ { type: 9 /* Grade */, key: "Grade", valueText: "Grade", chineseName: "\u7B49\u7EA7", aliases: ["\u7B49\u7EA7", "\u8BC4\u5206\u7B49\u7EA7", "grade", "level"] },
1106
+ { type: 10 /* FromProject */, key: "FromProject", valueText: "FromProject", chineseName: "\u6240\u5C5E\u8BA1\u5212", aliases: ["\u6240\u5C5E\u8BA1\u5212", "fromproject", "from project"] },
1107
+ { type: 11 /* Confirm */, key: "Confirm", valueText: "Confirm", chineseName: "\u786E\u8BA4\u4EBA", aliases: ["\u786E\u8BA4\u4EBA", "\u786E\u8BA4\u6210\u5458", "confirm"] },
1108
+ { type: 12 /* PerfScore */, key: "PerfScore", valueText: "PerfScore", chineseName: "\u7EE9\u6548\u5206", aliases: ["\u7EE9\u6548\u5206", "perfscore", "performance score"] },
1109
+ { type: 13 /* Cost */, key: "Cost", valueText: "Cost", chineseName: "\u6210\u672C", aliases: ["\u6210\u672C", "cost"] },
1110
+ { type: 14 /* Income */, key: "Income", valueText: "Income", chineseName: "\u6536\u5165", aliases: ["\u6536\u5165", "income"] },
1111
+ { type: 15 /* RichText */, key: "RichText", valueText: "RichText", chineseName: "\u5BCC\u6587\u672C", aliases: ["\u5BCC\u6587\u672C", "richtext", "rich text", "html"] },
1112
+ { type: 16 /* Count */, key: "Count", valueText: "Count", chineseName: "\u8BA1\u6570", aliases: ["\u8BA1\u6570", "count"] },
1113
+ { type: 17 /* Phone */, key: "Phone", valueText: "Phone", chineseName: "\u624B\u673A", aliases: ["\u624B\u673A", "\u624B\u673A\u53F7", "\u7535\u8BDD", "phone", "mobile"] },
1114
+ { type: 18 /* Email */, key: "Email", valueText: "Email", chineseName: "\u90AE\u7BB1", aliases: ["\u90AE\u7BB1", "\u90AE\u4EF6", "email", "mail"] },
1115
+ { type: 19 /* Address */, key: "Address", valueText: "Address", chineseName: "\u5730\u5740", aliases: ["\u5730\u5740", "address"] },
1116
+ { type: 20 /* Table */, key: "Table", valueText: "Table", chineseName: "\u8868\u683C", aliases: ["\u8868\u683C", "table"] },
1117
+ { type: 21 /* Check */, key: "Check", valueText: "Check", chineseName: "\u68C0\u67E5\u9879", aliases: ["\u68C0\u67E5\u9879", "\u6838\u5BF9\u9879", "check", "checklist"] },
1118
+ { type: 22 /* Member */, key: "Member", valueText: "Member", chineseName: "\u6210\u5458", aliases: ["\u6210\u5458", "\u4EBA\u5458", "member", "user"] },
1119
+ { type: 23 /* Task */, key: "Task", valueText: "Task", chineseName: "\u4EFB\u52A1", aliases: ["\u4EFB\u52A1", "task"] },
1120
+ { type: 24 /* Formula */, key: "Formula", valueText: "Formula", chineseName: "\u516C\u5F0F", aliases: ["\u516C\u5F0F", "\u8BA1\u7B97\u516C\u5F0F", "formula"] },
1121
+ { type: 27 /* StartProcess */, key: "StartProcess", valueText: "StartProcess", chineseName: "\u53D1\u8D77\u6D41\u7A0B\u3001\u5173\u8054\u6D41\u7A0B", aliases: ["\u53D1\u8D77\u6D41\u7A0B", "\u5173\u8054\u6D41\u7A0B", "\u6D41\u7A0B\u5173\u8054", "startprocess", "start process"] },
1122
+ { type: 28 /* Explanation */, key: "Explanation", valueText: "Explanation", chineseName: "\u6D41\u7A0B\u8BF4\u660E\u7EC4\u4EF6", aliases: ["\u6D41\u7A0B\u8BF4\u660E\u7EC4\u4EF6", "\u6D41\u7A0B\u8BF4\u660E", "\u8BF4\u660E\u7EC4\u4EF6", "explanation"] },
1123
+ { type: 29 /* Quote */, key: "Quote", valueText: "Quote", chineseName: "\u5F15\u7528", aliases: ["\u5F15\u7528", "quote"] },
1124
+ { type: 30 /* PublicArea */, key: "PublicArea", valueText: "PublicArea", chineseName: "\u516C\u5171\u533A", aliases: ["\u516C\u5171\u533A", "publicarea", "public area"] },
1125
+ { type: 32 /* DataQuery */, key: "DataQuery", valueText: "DataQuery", chineseName: "\u6570\u636E\u67E5\u8BE2", aliases: ["\u6570\u636E\u67E5\u8BE2", "dataquery", "data query"] },
1126
+ { type: 33 /* DataResult */, key: "DataResult", valueText: "DataResult", chineseName: "\u6570\u636E\u7ED3\u679C", aliases: ["\u6570\u636E\u7ED3\u679C", "dataresult", "data result"] },
1127
+ { type: 34 /* QueryQuote */, key: "QueryQuote", valueText: "QueryQuote", chineseName: "\u67E5\u8BE2\u5F15\u7528", aliases: ["\u67E5\u8BE2\u5F15\u7528", "queryquote", "query quote"] },
1128
+ { type: 35 /* DatasheetLink */, key: "DatasheetLink", valueText: "DatasheetLink", chineseName: "\u6570\u636E\u5173\u8054", aliases: ["\u6570\u636E\u5173\u8054", "\u8868\u5173\u8054", "datasheetlink", "datasheet link"] },
1129
+ { type: 36 /* Dept */, key: "Dept", valueText: "Dept", chineseName: "\u90E8\u95E8", aliases: ["\u90E8\u95E8", "dept", "department"] },
1130
+ { type: 37 /* UseRole */, key: "UseRole", valueText: "UseRole", chineseName: "\u4F7F\u7528\u89D2\u8272", aliases: ["\u4F7F\u7528\u89D2\u8272", "\u89D2\u8272", "userole", "use role"] },
1131
+ { type: 38 /* Location */, key: "Location", valueText: "Location", chineseName: "\u5B9A\u4F4D", aliases: ["\u5B9A\u4F4D", "\u4F4D\u7F6E", "location"] },
1132
+ { type: 39 /* ProcessInfoCreator */, key: "ProcessInfoCreator", valueText: "ProcessInfoCreator", chineseName: "\u53D1\u8D77\u4EBA", aliases: ["\u53D1\u8D77\u4EBA", "\u521B\u5EFA\u4EBA", "processinfocreator", "creator"] },
1133
+ { type: 40 /* AlterationContent */, key: "AlterationContent", valueText: "AlterationContent", chineseName: "\u53D8\u66F4\u5185\u5BB9", aliases: ["\u53D8\u66F4\u5185\u5BB9", "alterationcontent", "alteration content"] },
1134
+ { type: 41 /* AlterationReason */, key: "AlterationReason", valueText: "AlterationReason", chineseName: "\u53D8\u66F4\u539F\u56E0", aliases: ["\u53D8\u66F4\u539F\u56E0", "alterationreason", "alteration reason"] },
1135
+ { type: 42 /* AlterationTask */, key: "AlterationTask", valueText: "AlterationTask", chineseName: "\u53D8\u66F4\u4EFB\u52A1", aliases: ["\u53D8\u66F4\u4EFB\u52A1", "alterationtask", "alteration task"] },
1136
+ { type: 43 /* AlterationBelongProject */, key: "AlterationBelongProject", valueText: "AlterationBelongProject", chineseName: "\u53D8\u66F4\u6240\u5C5E\u9879\u76EE", aliases: ["\u53D8\u66F4\u6240\u5C5E\u9879\u76EE", "alterationbelongproject", "alteration belong project"] }
1137
+ ];
1138
+ var workflowFieldTypeLookup = /* @__PURE__ */ new Map();
1139
+ for (const definition of workflowFieldTypeDefinitions) {
1140
+ for (const candidate of [definition.key, definition.valueText, definition.chineseName, ...definition.aliases]) {
1141
+ workflowFieldTypeLookup.set(normalizeFieldTypeKey(candidate), definition);
1142
+ }
1143
+ }
1144
+ function listWorkflowFieldTypes() {
1145
+ return workflowFieldTypeDefinitions;
1146
+ }
1147
+ function normalizeFieldTypeKey(value) {
1148
+ return value.toLowerCase().replace(/[\s_\-::,,、/()()]+/g, "");
1149
+ }
1150
+
1095
1151
  // src/registry/skill-contract.ts
1096
1152
  function getSkillContract() {
1097
1153
  return {
@@ -1159,10 +1215,18 @@ function getSkillContract() {
1159
1215
  "\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",
1160
1216
  "\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
1217
  "\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",
1218
+ "\u521B\u5EFA workflow \u8868\u5355\u5B57\u6BB5\u524D\uFF0C\u5148\u6309 workflowFieldTypes \u91CC\u7684\u679A\u4E3E\u5B9A\u4E49\u8BC6\u522B fieldType\uFF0C\u4E0D\u8981\u51ED\u7ECF\u9A8C\u731C\u6D4B\u3002",
1162
1219
  "\u6240\u6709 id \u5B57\u6BB5\u90FD\u5FC5\u987B\u4F20\u524D\u7F00+uuid\u98CE\u683C\u7684\u5B57\u7B26\u4E32\uFF0C\u4F8B\u5982 flowApp_019d6c0c2f03770b8b789ec313076e64\u3002",
1163
1220
  "\u4E0D\u8981\u4F20\u6570\u5B57\u7C7B\u578B id\uFF0C\u4E5F\u4E0D\u8981\u4F20\u7EAF\u6570\u5B57\u5B57\u7B26\u4E32 id\u3002",
1164
1221
  "\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"
1165
1222
  ],
1223
+ workflowFieldTypes: listWorkflowFieldTypes().map((definition) => ({
1224
+ type: definition.type,
1225
+ key: definition.key,
1226
+ valueText: definition.valueText,
1227
+ chineseName: definition.chineseName,
1228
+ aliases: definition.aliases
1229
+ })),
1166
1230
  tools: getRegistry().map((command) => ({
1167
1231
  tool: `${command.module}.${command.aliases[0] ?? command.name}`,
1168
1232
  canonical: `${command.module}.${command.name}`,
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
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 return body;\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.5\",\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"]}
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/workflow/field-enum.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 return body;\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.6\",\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","export enum WorkflowFieldType {\n Content = 1,\n Number = 2,\n Selector = 3,\n Menu = 4,\n Date = 5,\n File = 6,\n Line = 7,\n WorkHour = 8,\n Grade = 9,\n FromProject = 10,\n Confirm = 11,\n PerfScore = 12,\n Cost = 13,\n Income = 14,\n RichText = 15,\n Count = 16,\n Phone = 17,\n Email = 18,\n Address = 19,\n Table = 20,\n Check = 21,\n Member = 22,\n Task = 23,\n Formula = 24,\n StartProcess = 27,\n Explanation = 28,\n Quote = 29,\n PublicArea = 30,\n DataQuery = 32,\n DataResult = 33,\n QueryQuote = 34,\n DatasheetLink = 35,\n Dept = 36,\n UseRole = 37,\n Location = 38,\n ProcessInfoCreator = 39,\n AlterationContent = 40,\n AlterationReason = 41,\n AlterationTask = 42,\n AlterationBelongProject = 43,\n}\n\nexport type WorkflowFieldTypeDefinition = {\n type: WorkflowFieldType;\n key: keyof typeof WorkflowFieldType;\n valueText: string;\n chineseName: string;\n aliases: string[];\n};\n\nexport const workflowFieldTypeDefinitions: WorkflowFieldTypeDefinition[] = [\n { type: WorkflowFieldType.Content, key: \"Content\", valueText: \"Content\", chineseName: \"文本框\", aliases: [\"文本框\", \"文本\", \"单行文本\", \"content\", \"text\"] },\n { type: WorkflowFieldType.Number, key: \"Number\", valueText: \"Number\", chineseName: \"数字\", aliases: [\"数字\", \"数值\", \"number\", \"numeric\"] },\n { type: WorkflowFieldType.Selector, key: \"Selector\", valueText: \"Selector\", chineseName: \"选项\", aliases: [\"选项\", \"单选\", \"selector\", \"option\"] },\n { type: WorkflowFieldType.Menu, key: \"Menu\", valueText: \"Menu\", chineseName: \"下拉菜单\", aliases: [\"下拉菜单\", \"下拉\", \"菜单\", \"menu\", \"dropdown\"] },\n { type: WorkflowFieldType.Date, key: \"Date\", valueText: \"Date\", chineseName: \"日期\", aliases: [\"日期\", \"时间\", \"date\", \"datetime\"] },\n { type: WorkflowFieldType.File, key: \"File\", valueText: \"File\", chineseName: \"附件\", aliases: [\"附件\", \"文件\", \"上传附件\", \"file\", \"attachment\"] },\n { type: WorkflowFieldType.Line, key: \"Line\", valueText: \"Line\", chineseName: \"分割线\", aliases: [\"分割线\", \"分隔线\", \"line\", \"divider\"] },\n { type: WorkflowFieldType.WorkHour, key: \"WorkHour\", valueText: \"WorkHour\", chineseName: \"工时\", aliases: [\"工时\", \"workhour\", \"work hour\"] },\n { type: WorkflowFieldType.Grade, key: \"Grade\", valueText: \"Grade\", chineseName: \"等级\", aliases: [\"等级\", \"评分等级\", \"grade\", \"level\"] },\n { type: WorkflowFieldType.FromProject, key: \"FromProject\", valueText: \"FromProject\", chineseName: \"所属计划\", aliases: [\"所属计划\", \"fromproject\", \"from project\"] },\n { type: WorkflowFieldType.Confirm, key: \"Confirm\", valueText: \"Confirm\", chineseName: \"确认人\", aliases: [\"确认人\", \"确认成员\", \"confirm\"] },\n { type: WorkflowFieldType.PerfScore, key: \"PerfScore\", valueText: \"PerfScore\", chineseName: \"绩效分\", aliases: [\"绩效分\", \"perfscore\", \"performance score\"] },\n { type: WorkflowFieldType.Cost, key: \"Cost\", valueText: \"Cost\", chineseName: \"成本\", aliases: [\"成本\", \"cost\"] },\n { type: WorkflowFieldType.Income, key: \"Income\", valueText: \"Income\", chineseName: \"收入\", aliases: [\"收入\", \"income\"] },\n { type: WorkflowFieldType.RichText, key: \"RichText\", valueText: \"RichText\", chineseName: \"富文本\", aliases: [\"富文本\", \"richtext\", \"rich text\", \"html\"] },\n { type: WorkflowFieldType.Count, key: \"Count\", valueText: \"Count\", chineseName: \"计数\", aliases: [\"计数\", \"count\"] },\n { type: WorkflowFieldType.Phone, key: \"Phone\", valueText: \"Phone\", chineseName: \"手机\", aliases: [\"手机\", \"手机号\", \"电话\", \"phone\", \"mobile\"] },\n { type: WorkflowFieldType.Email, key: \"Email\", valueText: \"Email\", chineseName: \"邮箱\", aliases: [\"邮箱\", \"邮件\", \"email\", \"mail\"] },\n { type: WorkflowFieldType.Address, key: \"Address\", valueText: \"Address\", chineseName: \"地址\", aliases: [\"地址\", \"address\"] },\n { type: WorkflowFieldType.Table, key: \"Table\", valueText: \"Table\", chineseName: \"表格\", aliases: [\"表格\", \"table\"] },\n { type: WorkflowFieldType.Check, key: \"Check\", valueText: \"Check\", chineseName: \"检查项\", aliases: [\"检查项\", \"核对项\", \"check\", \"checklist\"] },\n { type: WorkflowFieldType.Member, key: \"Member\", valueText: \"Member\", chineseName: \"成员\", aliases: [\"成员\", \"人员\", \"member\", \"user\"] },\n { type: WorkflowFieldType.Task, key: \"Task\", valueText: \"Task\", chineseName: \"任务\", aliases: [\"任务\", \"task\"] },\n { type: WorkflowFieldType.Formula, key: \"Formula\", valueText: \"Formula\", chineseName: \"公式\", aliases: [\"公式\", \"计算公式\", \"formula\"] },\n { type: WorkflowFieldType.StartProcess, key: \"StartProcess\", valueText: \"StartProcess\", chineseName: \"发起流程、关联流程\", aliases: [\"发起流程\", \"关联流程\", \"流程关联\", \"startprocess\", \"start process\"] },\n { type: WorkflowFieldType.Explanation, key: \"Explanation\", valueText: \"Explanation\", chineseName: \"流程说明组件\", aliases: [\"流程说明组件\", \"流程说明\", \"说明组件\", \"explanation\"] },\n { type: WorkflowFieldType.Quote, key: \"Quote\", valueText: \"Quote\", chineseName: \"引用\", aliases: [\"引用\", \"quote\"] },\n { type: WorkflowFieldType.PublicArea, key: \"PublicArea\", valueText: \"PublicArea\", chineseName: \"公共区\", aliases: [\"公共区\", \"publicarea\", \"public area\"] },\n { type: WorkflowFieldType.DataQuery, key: \"DataQuery\", valueText: \"DataQuery\", chineseName: \"数据查询\", aliases: [\"数据查询\", \"dataquery\", \"data query\"] },\n { type: WorkflowFieldType.DataResult, key: \"DataResult\", valueText: \"DataResult\", chineseName: \"数据结果\", aliases: [\"数据结果\", \"dataresult\", \"data result\"] },\n { type: WorkflowFieldType.QueryQuote, key: \"QueryQuote\", valueText: \"QueryQuote\", chineseName: \"查询引用\", aliases: [\"查询引用\", \"queryquote\", \"query quote\"] },\n { type: WorkflowFieldType.DatasheetLink, key: \"DatasheetLink\", valueText: \"DatasheetLink\", chineseName: \"数据关联\", aliases: [\"数据关联\", \"表关联\", \"datasheetlink\", \"datasheet link\"] },\n { type: WorkflowFieldType.Dept, key: \"Dept\", valueText: \"Dept\", chineseName: \"部门\", aliases: [\"部门\", \"dept\", \"department\"] },\n { type: WorkflowFieldType.UseRole, key: \"UseRole\", valueText: \"UseRole\", chineseName: \"使用角色\", aliases: [\"使用角色\", \"角色\", \"userole\", \"use role\"] },\n { type: WorkflowFieldType.Location, key: \"Location\", valueText: \"Location\", chineseName: \"定位\", aliases: [\"定位\", \"位置\", \"location\"] },\n { type: WorkflowFieldType.ProcessInfoCreator, key: \"ProcessInfoCreator\", valueText: \"ProcessInfoCreator\", chineseName: \"发起人\", aliases: [\"发起人\", \"创建人\", \"processinfocreator\", \"creator\"] },\n { type: WorkflowFieldType.AlterationContent, key: \"AlterationContent\", valueText: \"AlterationContent\", chineseName: \"变更内容\", aliases: [\"变更内容\", \"alterationcontent\", \"alteration content\"] },\n { type: WorkflowFieldType.AlterationReason, key: \"AlterationReason\", valueText: \"AlterationReason\", chineseName: \"变更原因\", aliases: [\"变更原因\", \"alterationreason\", \"alteration reason\"] },\n { type: WorkflowFieldType.AlterationTask, key: \"AlterationTask\", valueText: \"AlterationTask\", chineseName: \"变更任务\", aliases: [\"变更任务\", \"alterationtask\", \"alteration task\"] },\n { type: WorkflowFieldType.AlterationBelongProject, key: \"AlterationBelongProject\", valueText: \"AlterationBelongProject\", chineseName: \"变更所属项目\", aliases: [\"变更所属项目\", \"alterationbelongproject\", \"alteration belong project\"] },\n];\n\nconst workflowFieldTypeLookup = new Map<string, WorkflowFieldTypeDefinition>();\n\nfor (const definition of workflowFieldTypeDefinitions) {\n for (const candidate of [definition.key, definition.valueText, definition.chineseName, ...definition.aliases]) {\n workflowFieldTypeLookup.set(normalizeFieldTypeKey(candidate), definition);\n }\n}\n\nexport function resolveWorkflowFieldType(input: string): WorkflowFieldTypeDefinition | undefined {\n const normalizedInput = normalizeFieldTypeKey(input);\n if (!normalizedInput) {\n return undefined;\n }\n\n const exact = workflowFieldTypeLookup.get(normalizedInput);\n if (exact) {\n return exact;\n }\n\n return workflowFieldTypeDefinitions.find((definition) =>\n [definition.key, definition.valueText, definition.chineseName, ...definition.aliases]\n .map(normalizeFieldTypeKey)\n .some((candidate) => candidate.length > 0 && normalizedInput.includes(candidate)),\n );\n}\n\nexport function listWorkflowFieldTypes(): WorkflowFieldTypeDefinition[] {\n return workflowFieldTypeDefinitions;\n}\n\nfunction normalizeFieldTypeKey(value: string): string {\n return value.toLowerCase().replace(/[\\s_\\-::,,、/()()]+/g, \"\");\n}\n","import { listWorkflowFieldTypes } from \"../workflow/field-enum.js\";\nimport { 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 \"创建 workflow 表单字段前,先按 workflowFieldTypes 里的枚举定义识别 fieldType,不要凭经验猜测。\",\n \"所有 id 字段都必须传前缀+uuid风格的字符串,例如 flowApp_019d6c0c2f03770b8b789ec313076e64。\",\n \"不要传数字类型 id,也不要传纯数字字符串 id。\",\n \"调用前优先阅读参数说明和 requestBodySchema 中的字段说明,再组装参数。\",\n ],\n workflowFieldTypes: listWorkflowFieldTypes().map((definition) => ({\n type: definition.type,\n key: definition.key,\n valueText: definition.valueText,\n chineseName: definition.chineseName,\n aliases: definition.aliases,\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.5",
3
+ "version": "0.1.6",
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: rsq-workflow-createFlowApplication
3
- description: 当用户要求“创建流程应用”“新建审批流程”“按场景搭一个流程”这类需求时使用。先匹配流程模板创建 flow application;若匹配不到模板,则回退到“标准模式”,并继续补齐步骤、表单、审核项,生成完整可用的流程应用。
3
+ description: 当用户要求“创建流程应用”“新建审批流程”“按场景搭一个流程”这类需求时使用。默认直接用“标准模式”创建;只有用户明确要求匹配模板时才查模板,匹配不到再回退到“标准模式”,并继续补齐步骤、表单、审核项,生成完整可用的流程应用。
4
4
  metadata:
5
5
  requires:
6
6
  bins: ["rsq-cli"]
@@ -43,7 +43,17 @@ rsq-cli agent project createPlan --project-id <projectId> --body-file <request.j
43
43
 
44
44
  如果用户没有说明是在某个项目下创建,则沿用下面的独立流程应用创建方式。
45
45
 
46
- ### 1. 先查模板
46
+ ### 1. 默认直接走“标准模式”
47
+
48
+ 如果用户没有明确表达“按模板匹配”“看看有没有现成模板”“优先套用模板”这类意图:
49
+
50
+ - 不要先查模板
51
+ - 直接选择 `flowApplicationTemplateName == "标准模式"`
52
+ - 用它的 `flowApplicationTemplateId` 创建流程应用
53
+
54
+ 如果当前环境里找不到“标准模式”,停止并报告缺少兜底模板,不要自行猜测。
55
+
56
+ ### 2. 用户明确要求匹配模板时,再查模板
47
57
 
48
58
  ```bash
49
59
  rsq-cli agent workflow listFlowApplicationTemplates --json
@@ -54,7 +64,7 @@ rsq-cli agent workflow listFlowApplicationTemplates --json
54
64
  - `data[].flowApplicationTemplateId`
55
65
  - `data[].flowApplicationTemplateName`
56
66
 
57
- ### 2. 优先按名称匹配模板
67
+ ### 3. 优先按名称匹配模板
58
68
 
59
69
  按以下优先级匹配:
60
70
 
@@ -65,9 +75,9 @@ rsq-cli agent workflow listFlowApplicationTemplates --json
65
75
 
66
76
  如果只命中一个明显匹配模板,直接使用它的 `flowApplicationTemplateId`。
67
77
 
68
- ### 3. 匹配不到时回退到“标准模式”
78
+ ### 4. 匹配不到时回退到“标准模式”
69
79
 
70
- 如果没有明显模板匹配结果,固定选择:
80
+ 如果用户明确要求匹配模板,但没有明显模板匹配结果,固定选择:
71
81
 
72
82
  - `flowApplicationTemplateName == "标准模式"`
73
83
 
@@ -75,7 +85,7 @@ rsq-cli agent workflow listFlowApplicationTemplates --json
75
85
 
76
86
  如果模板列表里找不到“标准模式”,停止并报告缺少兜底模板,不要自行猜测。
77
87
 
78
- ### 4. 创建流程应用或项目下的 workflow 模块
88
+ ### 5. 创建流程应用或项目下的 workflow 模块
79
89
 
80
90
  如果用户没有指定项目,调用独立流程应用创建接口:
81
91
 
@@ -97,36 +107,41 @@ rsq-cli agent project createPlan --project-id <projectId> --body-file <request.j
97
107
 
98
108
  - `data.plan.flowApplicationId`
99
109
 
100
- ### 5. 非标准模式直接结束
110
+ ### 6. 非标准模式直接结束
101
111
 
102
112
  如果最终使用的是“匹配到的现成模板”,流程应用创建成功后通常直接结束。
103
113
 
104
114
  只有当用户明确要求继续自定义步骤、表单或审核项时,才继续往下改。
105
115
 
106
- ### 6. 标准模式需要继续补全流程
116
+ ### 7. 标准模式需要继续补全流程
107
117
 
108
118
  如果最终使用的是“标准模式”,继续执行:
109
119
 
110
120
  1. 根据用户给的流程名称理解业务场景
111
121
  2. 设计合理的步骤
112
- 3. 为每个步骤创建表单
113
- 4. 为每个步骤创建审核项
114
- 5. 必要时把表单绑定回步骤
122
+ 3. 先读取流程应用默认生成的步骤列表
123
+ 4. 如果已经有一个默认创建的“未命名步骤”,且用户明确描述了要创建哪些步骤,则优先把这个“未命名步骤”更新为用户需要的第一个步骤,而不是再额外新建一个重复的首步骤
124
+ 5. 从第二个业务步骤开始继续往后创建步骤
125
+ 6. 为每个步骤创建表单
126
+ 7. 为每个步骤创建审核项
127
+ 8. 必要时把表单绑定回步骤
115
128
 
116
129
  不要只创建一个空流程应用就结束。
117
130
 
118
131
  ## 标准模式下的编排顺序
119
132
 
120
133
  详细 API 顺序见 [references/api-sequence.md](references/api-sequence.md)。
134
+ 字段类型识别见 [references/field-types.md](references/field-types.md)。
121
135
 
122
136
  最低要求是:
123
137
 
124
138
  1. 确认当前已经拿到了正确的 `flowApplicationId`
125
- 2. 查询当前流程步骤,找出可作为 `frontStepInfoId` 的锚点
126
- 3. 逐个创建步骤
127
- 4. 为每个步骤创建表单
128
- 5. 用 `updateStepInfo` 绑定 `formId`
129
- 6. 为每个步骤创建审核项
139
+ 2. 查询当前流程步骤,识别系统默认创建的“未命名步骤”
140
+ 3. 如果用户明确给出了步骤列表,先用 `updateStepInfo` 把这个“未命名步骤”改成第一个业务步骤,并绑定它的表单
141
+ 4. 从第二个业务步骤开始逐个创建步骤,`frontStepInfoId` 接在上一个已落地步骤后面
142
+ 5. 为每个步骤创建表单
143
+ 6. 用 `updateStepInfo` 绑定 `formId`
144
+ 7. 为每个步骤创建审核项
130
145
 
131
146
  ## 业务理解规则
132
147
 
@@ -151,6 +166,8 @@ rsq-cli agent project createPlan --project-id <projectId> --body-file <request.j
151
166
  - 表单名称与步骤语义一致
152
167
  - 字段数量足够支撑步骤动作
153
168
  - 字段名称可读、业务上合理
169
+ - 创建字段前先按 [references/field-types.md](references/field-types.md) 映射 `fieldType`
170
+ - 字段名无法唯一推出类型时,必须依赖用户显式指定的类型,不要自行脑补
154
171
 
155
172
  ## 审核项设计规则
156
173
 
@@ -174,8 +191,10 @@ rsq-cli agent contacts resolveUser --user-name 张三 --json
174
191
 
175
192
  - 如果用户明确指定了项目,必须先走 `project createPlan` 且 `type` 固定传 `"workflow"`
176
193
  - 项目分支后续一律使用 `data.plan.flowApplicationId`,不要再额外创建一个独立流程应用
177
- - 优先使用现成模板,只有匹配不到时才走“标准模式”
194
+ - 如果用户没有明确要求匹配模板,默认不要查模板,直接使用“标准模式”
195
+ - 只有用户明确要求匹配模板时,才去查模板;匹配不到再回退到“标准模式”
178
196
  - “标准模式”下必须继续补步骤、表单、审核项
197
+ - 流程应用创建后如果系统默认生成了一个“未命名步骤”,且用户明确给了步骤定义,必须优先复用它作为第一个业务步骤,不要再额外创建一个重复的首步骤
179
198
  - Agent 执行时优先走 `rsq-cli agent ...`
180
199
  - 写操作优先用 `--dry-run --json` 预览
181
200
  - 只要命令带 request body,优先用 `--body-file`,不要默认用内联 `--body`
@@ -17,7 +17,17 @@ rsq-cli agent project createPlan --project-id <projectId> --body-file <request.j
17
17
 
18
18
  如果用户没有指定项目,再进入独立流程应用分支。
19
19
 
20
- ## 1. 模板匹配
20
+ ## 1. 默认直接使用“标准模式”
21
+
22
+ 如果用户没有明确要求“匹配模板”:
23
+
24
+ - 不查模板列表
25
+ - 直接使用 `"标准模式"` 对应的 `flowApplicationTemplateId`
26
+ - 然后进入创建流程应用步骤
27
+
28
+ 只有在当前环境里尚未缓存“标准模式”模板 id,或者用户明确要求匹配模板时,才需要查询模板列表。
29
+
30
+ ## 2. 用户明确要求匹配模板时,再做模板匹配
21
31
 
22
32
  ```bash
23
33
  rsq-cli agent workflow listFlowApplicationTemplates --json
@@ -28,7 +38,9 @@ rsq-cli agent workflow listFlowApplicationTemplates --json
28
38
  - 找到最匹配模板
29
39
  - 或兜底找到 `"标准模式"`
30
40
 
31
- ## 2. 创建流程应用
41
+ 如果用户没有明确要求匹配模板,就跳过这一节。
42
+
43
+ ## 3. 创建流程应用
32
44
 
33
45
  ```bash
34
46
  rsq-cli agent workflow createFlowApplication --body-file <request.json> --json
@@ -40,7 +52,7 @@ rsq-cli agent workflow createFlowApplication --body-file <request.json> --json
40
52
 
41
53
  如果用户已指定项目,则跳过这一步,不要重复创建独立流程应用。
42
54
 
43
- ## 3. 如果使用标准模式,先获取现有步骤锚点
55
+ ## 4. 如果使用标准模式,先获取现有步骤并识别默认步骤
44
56
 
45
57
  ```bash
46
58
  rsq-cli agent workflow listStepInfosByFlowApplicationId --flowapplication-id <flowApplicationId> --json
@@ -48,10 +60,25 @@ rsq-cli agent workflow listStepInfosByFlowApplicationId --flowapplication-id <fl
48
60
 
49
61
  用途:
50
62
 
51
- - 找一个已有步骤作为第一条自定义步骤的 `frontStepInfoId`
63
+ - 识别系统默认创建的“未命名步骤”
64
+ - 如果用户明确给了步骤列表,优先复用这个“未命名步骤”作为第一个业务步骤
65
+ - 只有从第二个业务步骤开始,才继续调用 `createStepInfo`
52
66
  - 后续每新建一个步骤,就把新步骤的 `stepInfoId` 当作下一个步骤的 `frontStepInfoId`
53
67
 
54
- ## 4. 创建步骤
68
+ ## 5. 先更新默认步骤为第一个业务步骤
69
+
70
+ ```bash
71
+ rsq-cli agent workflow updateStepInfo --step-info-id <defaultUnnamedStepInfoId> --body-file <request.json> --json
72
+ ```
73
+
74
+ - 适用条件:
75
+
76
+ - 当前流程里确实存在默认“未命名步骤”
77
+ - 用户明确描述了第一个业务步骤是什么
78
+
79
+ - 先为这个第一个业务步骤创建表单,再调用 `updateStepInfo` 同时写入 `stepInfoName` 和 `formId`
80
+
81
+ ## 6. 从第二个业务步骤开始创建后续步骤
55
82
 
56
83
  ```bash
57
84
  rsq-cli agent workflow createStepInfo --body-file <request.json> --json
@@ -61,7 +88,7 @@ rsq-cli agent workflow createStepInfo --body-file <request.json> --json
61
88
 
62
89
  - `stepInfoId`
63
90
 
64
- ## 5. 创建表单
91
+ ## 7. 创建表单
65
92
 
66
93
  `createForm` 只需要传真实业务字段:
67
94
 
@@ -71,7 +98,7 @@ rsq-cli agent workflow createStepInfo --body-file <request.json> --json
71
98
 
72
99
  不要传 `formId` 或 `fieldId`。`createForm` 的请求体里只保留业务字段。
73
100
 
74
- ## 6. 把表单绑定到步骤
101
+ ## 8. 把表单绑定到步骤
75
102
 
76
103
  创建表单后,调用:
77
104
 
@@ -79,7 +106,9 @@ rsq-cli agent workflow createStepInfo --body-file <request.json> --json
79
106
  rsq-cli agent workflow updateStepInfo --step-info-id <stepInfoId> --body-file <request.json> --json
80
107
  ```
81
108
 
82
- ## 7. 创建审核项
109
+ 对第一个业务步骤,如果复用了默认“未命名步骤”,这里的 `stepInfoId` 就是那个默认步骤的 id。
110
+
111
+ ## 9. 创建审核项
83
112
 
84
113
  ```bash
85
114
  rsq-cli agent workflow createAuditInfo --body-file <request.json> --json
@@ -92,7 +121,15 @@ rsq-cli agent workflow createAuditInfo --body-file <request.json> --json
92
121
 
93
122
  ## 建议顺序
94
123
 
95
- 对每个步骤执行:
124
+ 如果默认走“标准模式”,并且存在默认“未命名步骤”且用户明确给了步骤列表:
125
+
126
+ 1. `listStepInfosByFlowApplicationId`
127
+ 2. 第一个业务步骤先 `createForm`
128
+ 3. 对默认步骤执行 `updateStepInfo`,写入首步骤名称和 `formId`
129
+ 4. 对首步骤执行 `createAuditInfo`
130
+ 5. 从第二个业务步骤开始执行后续创建
131
+
132
+ 对后续新建步骤执行:
96
133
 
97
134
  1. `createStepInfo`
98
135
  2. `createForm`
@@ -0,0 +1,28 @@
1
+ # Workflow Field Types
2
+
3
+ 创建流程表单字段时,`fieldType` 必须以 `FieldEnum.java` 转换后的 TS 枚举为准,不要凭经验猜测。
4
+
5
+ 高频字段:
6
+
7
+ - `1`: 文本框
8
+ - `2`: 数字
9
+ - `5`: 日期
10
+ - `6`: 附件
11
+ - `15`: 富文本
12
+ - `17`: 手机
13
+ - `18`: 邮箱
14
+ - `19`: 地址
15
+ - `22`: 成员
16
+ - `36`: 部门
17
+
18
+ 本次已确认的误判修正:
19
+
20
+ - `附件` 不是文本框,必须用 `6`
21
+ - `富文本` 不是普通文本框,必须用 `15`
22
+
23
+ 识别规则:
24
+
25
+ - 用户直接说字段类型,例如“附件字段”“富文本字段”,优先按枚举中文名精确匹配。
26
+ - 用户给出英文类型词,例如 `RichText`、`File`,按枚举 `valueText` 匹配。
27
+ - 用户给的是带业务名的字段,例如“采购明细附件”,应从字段描述中识别出“附件”并映射到 `6`。
28
+ - 若字段名本身无法唯一推出类型,例如“备注”“说明”“供应商对比”,必须结合用户上文指定的类型判断,不能自行猜测。