@rishiqing/cli 0.1.5 → 0.1.7

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.7",
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}`,
@@ -1446,7 +1510,7 @@ function registerApiCommand(parent, definition, mode = "direct") {
1446
1510
  async function executeApiCommand(definition, options, mode) {
1447
1511
  const resolvedOptions = await prepareBodyOptions(options, mode);
1448
1512
  try {
1449
- const body = sanitizeRequestBody(definition, await readBody(resolvedOptions));
1513
+ const body = sanitizeRequestBody(definition, resolvedOptions, await readBody(resolvedOptions));
1450
1514
  validateRequestBody(definition, body);
1451
1515
  const request = buildRequest(definition, resolvedOptions, body);
1452
1516
  if (options.dryRun) {
@@ -1711,10 +1775,25 @@ function buildRequest(definition, options, body) {
1711
1775
  body
1712
1776
  };
1713
1777
  }
1714
- function sanitizeRequestBody(definition, body) {
1778
+ function sanitizeRequestBody(definition, options, body) {
1715
1779
  if (body === void 0) {
1716
1780
  return void 0;
1717
1781
  }
1782
+ if (definition.requestBodySchema?.type === "object" && isRecord(body)) {
1783
+ const mergedBody = { ...body };
1784
+ for (const parameter of definition.parameters) {
1785
+ if (parameter.in !== "path") {
1786
+ continue;
1787
+ }
1788
+ const schemaProperty = definition.requestBodySchema.properties?.[parameter.name];
1789
+ const optionValue = asOptionalString(options[toOptionKey(parameter.name)]);
1790
+ if (!schemaProperty || !optionValue || mergedBody[parameter.name] !== void 0) {
1791
+ continue;
1792
+ }
1793
+ mergedBody[parameter.name] = optionValue;
1794
+ }
1795
+ return mergedBody;
1796
+ }
1718
1797
  return body;
1719
1798
  }
1720
1799
  function validateRequestBody(definition, body) {