@rishiqing/cli 0.1.0 → 0.1.2
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 +25 -2
- package/dist/cli.js +266 -21
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -39,9 +39,24 @@
|
|
|
39
39
|
npm install -g @rishiqing/cli
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
# 安装 CLI
|
|
42
|
+
# 安装 CLI Skill(推荐)
|
|
43
43
|
```bash
|
|
44
|
-
|
|
44
|
+
rsq-cli install
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`rsq-cli install` 会将项目内置的 skill 安装到已知智能体目录,目前默认包含:
|
|
48
|
+
|
|
49
|
+
- `Codex`: `~/.agents/skills`
|
|
50
|
+
- `Claude Code`: `~/.claude/skills`
|
|
51
|
+
- `OpenClaw`: `~/.openclaw/skills`
|
|
52
|
+
|
|
53
|
+
也可以只安装到指定目标,或者追加自定义目录:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
rsq-cli install --target codex
|
|
57
|
+
rsq-cli install --target codex,claude-code
|
|
58
|
+
rsq-cli install --dir ~/.my-agent/skills
|
|
59
|
+
rsq-cli install --dry-run --json
|
|
45
60
|
```
|
|
46
61
|
|
|
47
62
|
安装完成后确认命令可用:
|
|
@@ -64,6 +79,14 @@ rsq-cli config init
|
|
|
64
79
|
rsq-cli config path
|
|
65
80
|
```
|
|
66
81
|
|
|
82
|
+
设置接口域名:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
rsq-cli config baseurl
|
|
86
|
+
rsq-cli config baseurl www.rishiqing.com
|
|
87
|
+
rsq-cli config baseurl https://www.rishiqing.com
|
|
88
|
+
```
|
|
89
|
+
|
|
67
90
|
## Agent 能力
|
|
68
91
|
|
|
69
92
|
`rsq-cli` 既提供内建的 agent contract,也保留了仓库内可复用的 skill。
|
package/dist/cli.js
CHANGED
|
@@ -18,7 +18,8 @@ var profileSchema = z.object({
|
|
|
18
18
|
});
|
|
19
19
|
var configSchema = z.object({
|
|
20
20
|
activeProfile: z.string().min(1),
|
|
21
|
-
profiles: z.record(z.string(), profileSchema)
|
|
21
|
+
profiles: z.record(z.string(), profileSchema),
|
|
22
|
+
baseUrl: z.string().min(1).optional()
|
|
22
23
|
});
|
|
23
24
|
var appConfigSchema = z.object({
|
|
24
25
|
baseUrl: z.string().min(1)
|
|
@@ -48,8 +49,12 @@ function getAppConfigPath() {
|
|
|
48
49
|
return found;
|
|
49
50
|
}
|
|
50
51
|
async function readAppConfig() {
|
|
51
|
-
const
|
|
52
|
-
|
|
52
|
+
const bundledFile = await readFile(getAppConfigPath(), "utf8");
|
|
53
|
+
const bundled = appConfigSchema.parse(JSON.parse(bundledFile));
|
|
54
|
+
const userConfig = await readConfig();
|
|
55
|
+
return {
|
|
56
|
+
baseUrl: userConfig?.baseUrl ? normalizeBaseUrl(userConfig.baseUrl) : bundled.baseUrl
|
|
57
|
+
};
|
|
53
58
|
}
|
|
54
59
|
async function readConfig() {
|
|
55
60
|
try {
|
|
@@ -79,6 +84,41 @@ async function initConfig(apiKey) {
|
|
|
79
84
|
await writeConfig(config);
|
|
80
85
|
return config;
|
|
81
86
|
}
|
|
87
|
+
async function setBaseUrl(baseUrl) {
|
|
88
|
+
const current = await readConfig();
|
|
89
|
+
if (!current) {
|
|
90
|
+
throw new Error("Missing config. Run `rsq-cli config init` first.");
|
|
91
|
+
}
|
|
92
|
+
const next = {
|
|
93
|
+
...current,
|
|
94
|
+
baseUrl: normalizeBaseUrl(baseUrl)
|
|
95
|
+
};
|
|
96
|
+
await writeConfig(next);
|
|
97
|
+
return next;
|
|
98
|
+
}
|
|
99
|
+
function normalizeBaseUrl(input) {
|
|
100
|
+
const trimmed = input.trim();
|
|
101
|
+
if (!trimmed) {
|
|
102
|
+
throw new Error("baseUrl is required.");
|
|
103
|
+
}
|
|
104
|
+
const candidate = /^https?:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
|
|
105
|
+
let parsed;
|
|
106
|
+
try {
|
|
107
|
+
parsed = new URL(candidate);
|
|
108
|
+
} catch {
|
|
109
|
+
throw new Error(`Invalid baseUrl: ${input}`);
|
|
110
|
+
}
|
|
111
|
+
if (!["http:", "https:"].includes(parsed.protocol)) {
|
|
112
|
+
throw new Error("baseUrl must use http or https.");
|
|
113
|
+
}
|
|
114
|
+
if (!parsed.hostname) {
|
|
115
|
+
throw new Error("baseUrl hostname is required.");
|
|
116
|
+
}
|
|
117
|
+
if (parsed.pathname !== "/" || parsed.search || parsed.hash) {
|
|
118
|
+
throw new Error("baseUrl must be a domain only, without path, query, or hash.");
|
|
119
|
+
}
|
|
120
|
+
return parsed.origin;
|
|
121
|
+
}
|
|
82
122
|
async function requireActiveProfile() {
|
|
83
123
|
const config = await readConfig();
|
|
84
124
|
if (!config) {
|
|
@@ -91,6 +131,141 @@ async function requireActiveProfile() {
|
|
|
91
131
|
return profile;
|
|
92
132
|
}
|
|
93
133
|
|
|
134
|
+
// src/core/install.ts
|
|
135
|
+
import { existsSync as existsSync2 } from "fs";
|
|
136
|
+
import { cp, mkdir as mkdir2, readdir } from "fs/promises";
|
|
137
|
+
import os2 from "os";
|
|
138
|
+
import path2 from "path";
|
|
139
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
140
|
+
var KNOWN_INSTALL_TARGETS = [
|
|
141
|
+
{
|
|
142
|
+
name: "codex",
|
|
143
|
+
label: "Codex",
|
|
144
|
+
description: "Install built-in skills into the default Codex skills directory",
|
|
145
|
+
dir: path2.join(os2.homedir(), ".agents", "skills")
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: "claude-code",
|
|
149
|
+
label: "Claude Code",
|
|
150
|
+
description: "Install built-in skills into the default Claude Code skills directory",
|
|
151
|
+
dir: path2.join(os2.homedir(), ".claude", "skills")
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: "openclaw",
|
|
155
|
+
label: "OpenClaw",
|
|
156
|
+
description: "Install built-in skills into the default OpenClaw skills directory",
|
|
157
|
+
dir: path2.join(os2.homedir(), ".openclaw", "skills")
|
|
158
|
+
}
|
|
159
|
+
];
|
|
160
|
+
function listKnownInstallTargets() {
|
|
161
|
+
return KNOWN_INSTALL_TARGETS.map((target) => ({ ...target }));
|
|
162
|
+
}
|
|
163
|
+
function resolveBundledSkillsDir() {
|
|
164
|
+
const moduleDir = path2.dirname(fileURLToPath2(import.meta.url));
|
|
165
|
+
const candidates = [
|
|
166
|
+
path2.resolve(moduleDir, "../", "skills"),
|
|
167
|
+
path2.resolve(moduleDir, "../../", "skills"),
|
|
168
|
+
path2.resolve(process.cwd(), "skills")
|
|
169
|
+
];
|
|
170
|
+
const found = candidates.find((candidate) => existsSync2(candidate));
|
|
171
|
+
if (!found) {
|
|
172
|
+
throw new Error(`Missing bundled skills directory. Checked: ${candidates.join(", ")}`);
|
|
173
|
+
}
|
|
174
|
+
return found;
|
|
175
|
+
}
|
|
176
|
+
async function installBundledSkills(options = {}) {
|
|
177
|
+
const sourceDir = resolveBundledSkillsDir();
|
|
178
|
+
const skills = await listBundledSkills(sourceDir);
|
|
179
|
+
if (skills.length === 0) {
|
|
180
|
+
throw new Error(`No bundled skills found in ${sourceDir}`);
|
|
181
|
+
}
|
|
182
|
+
const destinations = resolveInstallDestinations(options);
|
|
183
|
+
const installed = [];
|
|
184
|
+
for (const destination of destinations) {
|
|
185
|
+
const created = !existsSync2(destination.dir);
|
|
186
|
+
if (!options.dryRun) {
|
|
187
|
+
await mkdir2(destination.dir, { recursive: true });
|
|
188
|
+
}
|
|
189
|
+
for (const skill of skills) {
|
|
190
|
+
const from = path2.join(sourceDir, skill);
|
|
191
|
+
const to = path2.join(destination.dir, skill);
|
|
192
|
+
if (!options.dryRun) {
|
|
193
|
+
await cp(from, to, { recursive: true, force: true });
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
installed.push({ ...destination, created });
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
sourceDir,
|
|
200
|
+
skills,
|
|
201
|
+
installed
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function resolveInstallDestinations(options) {
|
|
205
|
+
const requestedTargets = options.targets?.flatMap(splitCsvValues).filter(Boolean) ?? [];
|
|
206
|
+
const extraDirs = options.extraDirs?.flatMap(splitCsvValues).filter(Boolean) ?? [];
|
|
207
|
+
const destinations = [];
|
|
208
|
+
const seen = /* @__PURE__ */ new Set();
|
|
209
|
+
const targets = requestedTargets.length > 0 ? requestedTargets.map(resolveKnownTargetByName) : listKnownInstallTargets();
|
|
210
|
+
for (const target of targets) {
|
|
211
|
+
pushUniqueDestination(
|
|
212
|
+
destinations,
|
|
213
|
+
seen,
|
|
214
|
+
{
|
|
215
|
+
kind: "known",
|
|
216
|
+
name: target.name,
|
|
217
|
+
label: target.label,
|
|
218
|
+
dir: path2.resolve(target.dir)
|
|
219
|
+
}
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
for (const dir of extraDirs) {
|
|
223
|
+
pushUniqueDestination(
|
|
224
|
+
destinations,
|
|
225
|
+
seen,
|
|
226
|
+
{
|
|
227
|
+
kind: "custom",
|
|
228
|
+
name: "custom",
|
|
229
|
+
label: "Custom",
|
|
230
|
+
dir: path2.resolve(expandHome(dir))
|
|
231
|
+
}
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
return destinations;
|
|
235
|
+
}
|
|
236
|
+
function resolveKnownTargetByName(name) {
|
|
237
|
+
const normalized = name.trim().toLowerCase();
|
|
238
|
+
const found = KNOWN_INSTALL_TARGETS.find((target) => target.name === normalized);
|
|
239
|
+
if (!found) {
|
|
240
|
+
throw new Error(`Unknown install target: ${name}. Supported targets: ${KNOWN_INSTALL_TARGETS.map((target) => target.name).join(", ")}`);
|
|
241
|
+
}
|
|
242
|
+
return found;
|
|
243
|
+
}
|
|
244
|
+
function pushUniqueDestination(destinations, seen, destination) {
|
|
245
|
+
const key = path2.normalize(destination.dir);
|
|
246
|
+
if (seen.has(key)) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
seen.add(key);
|
|
250
|
+
destinations.push(destination);
|
|
251
|
+
}
|
|
252
|
+
function expandHome(input) {
|
|
253
|
+
if (input === "~") {
|
|
254
|
+
return os2.homedir();
|
|
255
|
+
}
|
|
256
|
+
if (input.startsWith("~/")) {
|
|
257
|
+
return path2.join(os2.homedir(), input.slice(2));
|
|
258
|
+
}
|
|
259
|
+
return input;
|
|
260
|
+
}
|
|
261
|
+
function splitCsvValues(value) {
|
|
262
|
+
return value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
263
|
+
}
|
|
264
|
+
async function listBundledSkills(sourceDir) {
|
|
265
|
+
const entries = await readdir(sourceDir, { withFileTypes: true });
|
|
266
|
+
return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort((left, right) => left.localeCompare(right));
|
|
267
|
+
}
|
|
268
|
+
|
|
94
269
|
// src/core/http.ts
|
|
95
270
|
async function executeRequest(shape) {
|
|
96
271
|
const profile = await requireActiveProfile();
|
|
@@ -205,9 +380,9 @@ function stringifyCell(value) {
|
|
|
205
380
|
}
|
|
206
381
|
|
|
207
382
|
// src/core/openapi.ts
|
|
208
|
-
import { existsSync as
|
|
209
|
-
import
|
|
210
|
-
import { fileURLToPath as
|
|
383
|
+
import { existsSync as existsSync3, readFileSync } from "fs";
|
|
384
|
+
import path3 from "path";
|
|
385
|
+
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
211
386
|
var operationIdOverrides = {
|
|
212
387
|
"GET /rsq/api/v1/workflow/process-infos/list/{flowApplicationId}": "listProcessInfosByFlowApplicationId",
|
|
213
388
|
"GET /rsq/api/v1/projects": "listProjects"
|
|
@@ -277,13 +452,13 @@ function resolveOperationId(apiPath, method, operationId) {
|
|
|
277
452
|
return operationId ?? `${method}:${apiPath}`;
|
|
278
453
|
}
|
|
279
454
|
function resolveOpenApiPath() {
|
|
280
|
-
const moduleDir =
|
|
455
|
+
const moduleDir = path3.dirname(fileURLToPath3(import.meta.url));
|
|
281
456
|
const candidates = [
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
457
|
+
path3.resolve(moduleDir, "../rishiqing.openapi.json"),
|
|
458
|
+
path3.resolve(moduleDir, "../../rishiqing.openapi.json"),
|
|
459
|
+
path3.resolve(process.cwd(), "rishiqing.openapi.json")
|
|
285
460
|
];
|
|
286
|
-
const found = candidates.find((candidate) =>
|
|
461
|
+
const found = candidates.find((candidate) => existsSync3(candidate));
|
|
287
462
|
if (!found) {
|
|
288
463
|
throw new Error(`Unable to locate rishiqing.openapi.json. Checked: ${candidates.join(", ")}`);
|
|
289
464
|
}
|
|
@@ -981,6 +1156,7 @@ async function main() {
|
|
|
981
1156
|
registerGlobalHelp(program);
|
|
982
1157
|
registerConfig(program);
|
|
983
1158
|
registerDescribe(program);
|
|
1159
|
+
registerInstall(program);
|
|
984
1160
|
registerSearch(program);
|
|
985
1161
|
for (const moduleDefinition of getModuleDefinitions()) {
|
|
986
1162
|
const moduleCommand = program.command(moduleDefinition.name).description(moduleDefinition.description);
|
|
@@ -1064,6 +1240,19 @@ function registerConfig(program) {
|
|
|
1064
1240
|
stdout.write(`${getAppConfigPath()}
|
|
1065
1241
|
`);
|
|
1066
1242
|
});
|
|
1243
|
+
config.command("baseurl").description("Set the API base URL domain used by rsq-cli").argument("[value]", "Base URL domain, for example www.rishiqing.com").option("--json", "Print JSON output").action(async (value, options) => {
|
|
1244
|
+
const current = await readAppConfig();
|
|
1245
|
+
const nextValue = value ? normalizeBaseUrl(value) : await promptBaseUrl(current.baseUrl);
|
|
1246
|
+
const saved = await setBaseUrl(nextValue);
|
|
1247
|
+
printOutput(
|
|
1248
|
+
{
|
|
1249
|
+
message: "baseUrl updated.",
|
|
1250
|
+
configPath: getConfigPath(),
|
|
1251
|
+
baseUrl: saved.baseUrl
|
|
1252
|
+
},
|
|
1253
|
+
options
|
|
1254
|
+
);
|
|
1255
|
+
});
|
|
1067
1256
|
}
|
|
1068
1257
|
function registerDescribe(program) {
|
|
1069
1258
|
program.command("describe").description("Describe commands in machine-readable form").argument("[module]", "Module name").argument("[command]", "Command name").addOption(new Option("--json", "Print JSON output")).action((moduleName, commandName, options) => {
|
|
@@ -1088,6 +1277,49 @@ function registerDescribe(program) {
|
|
|
1088
1277
|
printOutput(getSkillContract(), { json: true });
|
|
1089
1278
|
});
|
|
1090
1279
|
}
|
|
1280
|
+
function registerInstall(program) {
|
|
1281
|
+
const knownTargets = listKnownInstallTargets();
|
|
1282
|
+
program.command("install").description("Install bundled skills into known agent skill directories").option(
|
|
1283
|
+
"--target <name>",
|
|
1284
|
+
`Install only to selected known targets. Repeat or use comma-separated values: ${knownTargets.map((target) => target.name).join(", ")}`,
|
|
1285
|
+
collectStrings,
|
|
1286
|
+
[]
|
|
1287
|
+
).option(
|
|
1288
|
+
"--dir <path>",
|
|
1289
|
+
"Install to an additional custom skill directory. Repeat or use comma-separated values",
|
|
1290
|
+
collectStrings,
|
|
1291
|
+
[]
|
|
1292
|
+
).option("--list-targets", "Print known install targets and exit").option("--dry-run", "Show installation plan without copying files").option("--json", "Print JSON output").action(
|
|
1293
|
+
async (options) => {
|
|
1294
|
+
if (options.listTargets) {
|
|
1295
|
+
printOutput(
|
|
1296
|
+
knownTargets.map((target) => ({
|
|
1297
|
+
name: target.name,
|
|
1298
|
+
label: target.label,
|
|
1299
|
+
dir: target.dir,
|
|
1300
|
+
description: target.description
|
|
1301
|
+
})),
|
|
1302
|
+
options
|
|
1303
|
+
);
|
|
1304
|
+
return;
|
|
1305
|
+
}
|
|
1306
|
+
const result = await installBundledSkills({
|
|
1307
|
+
targets: options.target,
|
|
1308
|
+
extraDirs: options.dir,
|
|
1309
|
+
dryRun: options.dryRun
|
|
1310
|
+
});
|
|
1311
|
+
printOutput(
|
|
1312
|
+
{
|
|
1313
|
+
message: options.dryRun ? "Dry run completed." : "Bundled skills installed.",
|
|
1314
|
+
sourceDir: result.sourceDir,
|
|
1315
|
+
skills: result.skills,
|
|
1316
|
+
installed: result.installed
|
|
1317
|
+
},
|
|
1318
|
+
options
|
|
1319
|
+
);
|
|
1320
|
+
}
|
|
1321
|
+
);
|
|
1322
|
+
}
|
|
1091
1323
|
function registerSearch(program) {
|
|
1092
1324
|
program.command("search").description("Search all registered commands by natural language intent").argument("<query>", "Search query").option("--limit <count>", "Maximum results", parsePositiveInteger, 10).option("--json", "Print JSON output").action((query, options) => {
|
|
1093
1325
|
const keywords = tokenize(query);
|
|
@@ -1442,19 +1674,19 @@ function validateCustomBodyRules(definition, body, issues) {
|
|
|
1442
1674
|
}
|
|
1443
1675
|
}
|
|
1444
1676
|
}
|
|
1445
|
-
function validateValueAgainstSchema(value, schema,
|
|
1677
|
+
function validateValueAgainstSchema(value, schema, path4, issues) {
|
|
1446
1678
|
if (value === void 0 || value === null) {
|
|
1447
1679
|
return;
|
|
1448
1680
|
}
|
|
1449
1681
|
if (schema.type === "object" && isRecord(value)) {
|
|
1450
1682
|
for (const requiredKey of schema.required ?? []) {
|
|
1451
1683
|
if (!(requiredKey in value)) {
|
|
1452
|
-
issues.push(`${
|
|
1684
|
+
issues.push(`${path4}.${requiredKey}: missing required field`);
|
|
1453
1685
|
}
|
|
1454
1686
|
}
|
|
1455
1687
|
for (const [propertyName, propertySchema] of Object.entries(schema.properties ?? {})) {
|
|
1456
1688
|
if (propertyName in value) {
|
|
1457
|
-
validateValueAgainstSchema(value[propertyName], propertySchema, `${
|
|
1689
|
+
validateValueAgainstSchema(value[propertyName], propertySchema, `${path4}.${propertyName}`, issues);
|
|
1458
1690
|
}
|
|
1459
1691
|
}
|
|
1460
1692
|
return;
|
|
@@ -1462,19 +1694,19 @@ function validateValueAgainstSchema(value, schema, path3, issues) {
|
|
|
1462
1694
|
if (schema.type === "array" && Array.isArray(value)) {
|
|
1463
1695
|
value.forEach((item, index) => {
|
|
1464
1696
|
if (schema.items) {
|
|
1465
|
-
validateValueAgainstSchema(item, schema.items, `${
|
|
1697
|
+
validateValueAgainstSchema(item, schema.items, `${path4}[${index}]`, issues);
|
|
1466
1698
|
}
|
|
1467
1699
|
});
|
|
1468
1700
|
return;
|
|
1469
1701
|
}
|
|
1470
1702
|
if (schema.type === "string" && typeof value === "string") {
|
|
1471
|
-
validateStringByDescription(value, schema.description,
|
|
1703
|
+
validateStringByDescription(value, schema.description, path4, issues);
|
|
1472
1704
|
}
|
|
1473
1705
|
}
|
|
1474
|
-
function validateIdLikeBodyValues(value,
|
|
1706
|
+
function validateIdLikeBodyValues(value, path4, issues) {
|
|
1475
1707
|
if (Array.isArray(value)) {
|
|
1476
1708
|
value.forEach((item, index) => {
|
|
1477
|
-
validateIdLikeBodyValues(item, `${
|
|
1709
|
+
validateIdLikeBodyValues(item, `${path4}[${index}]`, issues);
|
|
1478
1710
|
});
|
|
1479
1711
|
return;
|
|
1480
1712
|
}
|
|
@@ -1482,7 +1714,7 @@ function validateIdLikeBodyValues(value, path3, issues) {
|
|
|
1482
1714
|
return;
|
|
1483
1715
|
}
|
|
1484
1716
|
for (const [key, fieldValue] of Object.entries(value)) {
|
|
1485
|
-
const nextPath = `${
|
|
1717
|
+
const nextPath = `${path4}.${key}`;
|
|
1486
1718
|
if (looksLikeIdField2(key)) {
|
|
1487
1719
|
const issue = getIdLikeValidationIssue(fieldValue, nextPath);
|
|
1488
1720
|
if (issue) {
|
|
@@ -1531,7 +1763,7 @@ function getIdLikeValidationIssue(value, label) {
|
|
|
1531
1763
|
}
|
|
1532
1764
|
return void 0;
|
|
1533
1765
|
}
|
|
1534
|
-
function validateStringByDescription(value, description,
|
|
1766
|
+
function validateStringByDescription(value, description, path4, issues) {
|
|
1535
1767
|
if (!description) {
|
|
1536
1768
|
return;
|
|
1537
1769
|
}
|
|
@@ -1539,7 +1771,7 @@ function validateStringByDescription(value, description, path3, issues) {
|
|
|
1539
1771
|
const isDateOnly = /^\d{4}-\d{2}-\d{2}$/.test(value);
|
|
1540
1772
|
const isOffsetDateTime = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|[+-]\d{2}:\d{2})$/.test(value);
|
|
1541
1773
|
if (!isDateOnly && !isOffsetDateTime) {
|
|
1542
|
-
issues.push(`${
|
|
1774
|
+
issues.push(`${path4}: invalid format "${value}". Allowed formats: yyyy-MM-dd or yyyy-MM-dd'T'HH:mm:ssXXX`);
|
|
1543
1775
|
}
|
|
1544
1776
|
}
|
|
1545
1777
|
}
|
|
@@ -1723,6 +1955,19 @@ function parsePositiveInteger(value) {
|
|
|
1723
1955
|
}
|
|
1724
1956
|
return parsed;
|
|
1725
1957
|
}
|
|
1958
|
+
function collectStrings(value, previous) {
|
|
1959
|
+
previous.push(value);
|
|
1960
|
+
return previous;
|
|
1961
|
+
}
|
|
1962
|
+
async function promptBaseUrl(currentBaseUrl) {
|
|
1963
|
+
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
1964
|
+
try {
|
|
1965
|
+
const answer = (await rl.question(`Base URL domain [${currentBaseUrl}]: `)).trim();
|
|
1966
|
+
return normalizeBaseUrl(answer || currentBaseUrl);
|
|
1967
|
+
} finally {
|
|
1968
|
+
rl.close();
|
|
1969
|
+
}
|
|
1970
|
+
}
|
|
1726
1971
|
function asOptionalString(value) {
|
|
1727
1972
|
if (typeof value === "string" && value.length > 0) {
|
|
1728
1973
|
return value;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/core/config.ts","../src/core/http.ts","../src/core/output.ts","../src/core/openapi.ts","../src/registry/overrides.ts","../src/registry/index.ts","../src/registry/skill-contract.ts"],"sourcesContent":["import { Command, InvalidArgumentError, Option } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport readline from \"node:readline/promises\";\nimport { stdin, stdout } from \"node:process\";\nimport { getAppConfigPath, getConfigPath, initConfig, readAppConfig, readConfig } from \"./core/config.js\";\nimport { executeRequest } from \"./core/http.js\";\nimport { printOutput } from \"./core/output.js\";\nimport { getModuleDefinitions, getRegistry } from \"./registry/index.js\";\nimport { getSkillContract } from \"./registry/skill-contract.js\";\nimport type { CommandDefinition } from \"./registry/types.js\";\nimport type { RequestBodySchemaDefinition } from \"./core/openapi.js\";\n\nconst createPlanTypes = new Set([\n \"task\",\n \"statistic\",\n \"overview\",\n \"folder\",\n \"risk\",\n \"workflow\",\n \"datasheet\",\n \"deliverable\",\n]);\n\ntype GlobalOptions = {\n json?: boolean;\n raw?: boolean;\n table?: boolean;\n quiet?: boolean;\n dryRun?: boolean;\n};\n\ntype CommandOptions = GlobalOptions & Record<string, unknown> & {\n body?: string;\n bodyFile?: string;\n};\n\nasync function main(): Promise<void> {\n const program = new Command();\n program\n .name(\"rsq-cli\")\n .description(\"Agent-oriented CLI for Rishiqing APIs\")\n .version(\"0.1.0\");\n\n registerGlobalHelp(program);\n registerConfig(program);\n registerDescribe(program);\n registerSearch(program);\n\n for (const moduleDefinition of getModuleDefinitions()) {\n const moduleCommand = program.command(moduleDefinition.name).description(moduleDefinition.description);\n for (const definition of getRegistry().filter((entry) => entry.module === moduleDefinition.name)) {\n if (definition.module === \"contacts\" && definition.name === \"resolveUser\") {\n registerResolveUserCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"task\" &&\n [\"setTaskExecutorByName\", \"setTaskResponsibleByName\", \"addTaskParticipantByName\"].includes(definition.name)\n ) {\n registerTaskUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (definition.module === \"project\" && definition.name === \"setProjectMemberByName\") {\n registerProjectUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"workflow\" &&\n [\"createAuditInfoByNames\", \"updateAuditInfoByNames\"].includes(definition.name)\n ) {\n registerWorkflowAuditByNamesCommand(moduleCommand, definition);\n continue;\n }\n\n registerApiCommand(moduleCommand, definition);\n }\n }\n\n await program.parseAsync(process.argv);\n}\n\nfunction registerGlobalHelp(program: Command): void {\n program.showHelpAfterError(\"(run with --help for usage)\");\n}\n\nfunction registerConfig(program: Command): void {\n const config = program.command(\"config\").description(\"Manage local rsq-cli configuration\");\n\n config\n .command(\"init\")\n .description(\"Initialize local configuration\")\n .action(async () => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n try {\n const apiKey = (await rl.question(\"X-Rsq-Api-key: \")).trim();\n if (!apiKey) {\n throw new Error(\"X-Rsq-Api-key is required.\");\n }\n\n const saved = await initConfig(apiKey);\n const appConfig = await readAppConfig();\n printOutput(\n {\n message: \"Configuration saved.\",\n configPath: getConfigPath(),\n appConfigPath: getAppConfigPath(),\n activeProfile: saved.activeProfile,\n baseUrl: appConfig.baseUrl,\n },\n { json: true },\n );\n } finally {\n rl.close();\n }\n });\n\n config\n .command(\"get\")\n .description(\"Show current config without exposing the API key\")\n .option(\"--json\", \"Print JSON output\")\n .action(async (options: GlobalOptions) => {\n const current = await readConfig();\n const appConfig = await readAppConfig();\n if (!current) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const profile = current.profiles[current.activeProfile];\n printOutput(\n {\n configPath: getConfigPath(),\n appConfigPath: getAppConfigPath(),\n baseUrl: appConfig.baseUrl,\n activeProfile: current.activeProfile,\n profiles: {\n [current.activeProfile]: {\n apiKeyConfigured: Boolean(profile?.apiKey),\n },\n },\n },\n options,\n );\n });\n\n config\n .command(\"path\")\n .description(\"Show config file path\")\n .action(() => {\n stdout.write(`${getConfigPath()}\\n`);\n });\n\n config\n .command(\"app-path\")\n .description(\"Show bundled app config path\")\n .action(() => {\n stdout.write(`${getAppConfigPath()}\\n`);\n });\n}\n\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 registerSearch(program: Command): void {\n program\n .command(\"search\")\n .description(\"Search all registered commands by natural language intent\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--limit <count>\", \"Maximum results\", parsePositiveInteger, 10)\n .option(\"--json\", \"Print JSON output\")\n .action((query: string, options: { limit: number; json?: boolean }) => {\n const keywords = tokenize(query);\n const ranked = getRegistry()\n .map((command) => ({\n command,\n score: scoreCommand(command, query, keywords),\n }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => {\n if (right.score !== left.score) {\n return right.score - left.score;\n }\n\n return exposurePriority(right.command) - exposurePriority(left.command);\n })\n .slice(0, options.limit)\n .map(({ command, score }) => ({\n score,\n module: command.module,\n name: command.name,\n aliases: command.aliases,\n exposure: command.exposure,\n summary: command.summary,\n api: command.api,\n }));\n\n printOutput(ranked, options);\n });\n}\n\nfunction registerApiCommand(parent: Command, definition: CommandDefinition): void {\n if (!definition.api) {\n throw new Error(`Missing API mapping for command: ${definition.module} ${definition.name}`);\n }\n\n const command = parent.command(definition.name).description(definition.summary);\n\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n addSharedOutputOptions(command);\n\n for (const parameter of definition.parameters) {\n command.addOption(\n new Option(optionName(parameter.name), parameter.description ?? `${parameter.in} parameter: ${parameter.name}`).makeOptionMandatory(Boolean(parameter.required)),\n );\n }\n\n if (definition.hasRequestBody) {\n command.addOption(new Option(\"--body <json>\", \"Inline JSON request body\"));\n command.addOption(new Option(\"--body-file <path>\", \"Read JSON request body from a file\"));\n }\n\n command.action(async (options: CommandOptions) => {\n const body = sanitizeRequestBody(definition, await readBody(options));\n validateRequestBody(definition, body);\n const request = buildRequest(definition, options, body);\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n api: definition.api,\n baseUrl: appConfig.baseUrl,\n url: new URL(request.path, ensureTrailingSlash(appConfig.baseUrl)).toString(),\n request,\n },\n { json: true },\n );\n return;\n }\n\n const result = await executeRequest(request);\n if (!options.quiet) {\n printOutput(result, options);\n }\n });\n}\n\nfunction registerResolveUserCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n command.addOption(new Option(\"--user-name <value>\", \"需要解析的人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--table\", \"Print array responses in a basic table\"));\n\n command.action(async (options: { userName?: string; json?: boolean; table?: boolean }) => {\n const userName = asOptionalString(options.userName);\n if (!userName) {\n throw new Error(\"Missing required option: --user-name\");\n }\n\n printOutput(await resolveUserByName(userName), { json: true });\n });\n}\n\nfunction registerTaskUserByNameCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n command.addOption(new Option(\"--task-id <value>\", \"taskId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-name <value>\", \"人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n\n command.action(async (options: { taskId?: string; userName?: string; json?: boolean; dryRun?: boolean }) => {\n const taskId = asOptionalString(options.taskId);\n const userName = asOptionalString(options.userName);\n if (!taskId || !userName) {\n throw new Error(\"Missing required options: --task-id and --user-name\");\n }\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n {\n action: \"resolveUser\",\n command: `rsq-cli contacts resolveUser --user-name ${userName} --json`,\n },\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n taskId,\n userName,\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolved = await resolveUserByName(userName);\n const request = buildTaskUserByNameRequest(definition.name, taskId, resolved.userId);\n const result = await executeRequest(request);\n printOutput(\n {\n resolvedUser: resolved,\n result,\n },\n { json: true },\n );\n });\n}\n\nfunction registerProjectUserByNameCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) command.alias(alias);\n command.addOption(new Option(\"--project-id <value>\", \"projectId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-name <value>\", \"人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n command.action(async (options: { projectId?: string; userName?: string; dryRun?: boolean }) => {\n const projectId = asOptionalString(options.projectId);\n const userName = asOptionalString(options.userName);\n if (!projectId || !userName) throw new Error(\"Missing required options: --project-id and --user-name\");\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n { action: \"resolveUser\", command: `rsq-cli contacts resolveUser --user-name ${userName} --json` },\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n projectId,\n userName,\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolved = await resolveUserByName(userName);\n const result = await executeRequest({\n method: \"POST\",\n path: `/rsq/api/v1/projects/${encodeURIComponent(projectId)}/members`,\n body: { userMemberIds: [resolved.userId], deptMemberIds: [] },\n });\n printOutput({ resolvedUser: resolved, result }, { json: true });\n });\n}\n\nfunction registerWorkflowAuditByNamesCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) command.alias(alias);\n\n if (definition.name === \"createAuditInfoByNames\") {\n command.addOption(new Option(\"--flow-application-id <value>\", \"flowApplicationId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--step-info-id <value>\", \"stepInfoId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--audit-info-name <value>\", \"auditInfoName\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-names <value>\", \"审核人名称列表,逗号分隔\").makeOptionMandatory(true));\n command.addOption(new Option(\"--front-audit-info-id <value>\", \"frontAuditInfoId\"));\n } else {\n command.addOption(new Option(\"--audit-info-id <value>\", \"auditInfoId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--audit-info-name <value>\", \"auditInfoName\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-names <value>\", \"审核人名称列表,逗号分隔\").makeOptionMandatory(true));\n }\n\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n\n command.action(async (options: Record<string, unknown> & { dryRun?: boolean }) => {\n const userNamesValue = asOptionalString(options.userNames);\n const userNames = parseNameList(userNamesValue);\n if (userNames.length === 0) throw new Error(\"Missing required option: --user-names\");\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n ...userNames.map((name) => ({\n action: \"resolveUser\",\n command: `rsq-cli contacts resolveUser --user-name ${name} --json`,\n })),\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n options: {\n flowApplicationId: asOptionalString(options.flowApplicationId),\n stepInfoId: asOptionalString(options.stepInfoId),\n auditInfoId: asOptionalString(options.auditInfoId),\n auditInfoName: asOptionalString(options.auditInfoName),\n frontAuditInfoId: asOptionalString(options.frontAuditInfoId),\n userNames,\n },\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolvedUsers = [];\n for (const userName of userNames) {\n resolvedUsers.push(await resolveUserByName(userName));\n }\n const userIds = resolvedUsers.map((user) => user.userId);\n\n let request;\n if (definition.name === \"createAuditInfoByNames\") {\n const flowApplicationId = asOptionalString(options.flowApplicationId);\n const stepInfoId = asOptionalString(options.stepInfoId);\n const auditInfoName = asOptionalString(options.auditInfoName);\n if (!flowApplicationId || !stepInfoId || !auditInfoName) {\n throw new Error(\"Missing required options for createAuditInfoByNames\");\n }\n request = {\n method: \"POST\",\n path: \"/rsq/api/v1/workflow/audit-infos\",\n body: {\n flowApplicationId,\n stepInfoId,\n auditInfoName,\n frontAuditInfoId: asOptionalString(options.frontAuditInfoId),\n auditInfoUsers: userIds,\n },\n };\n } else {\n const auditInfoId = asOptionalString(options.auditInfoId);\n const auditInfoName = asOptionalString(options.auditInfoName);\n if (!auditInfoId || !auditInfoName) {\n throw new Error(\"Missing required options for updateAuditInfoByNames\");\n }\n request = {\n method: \"PUT\",\n path: `/rsq/api/v1/workflow/audit-infos/${encodeURIComponent(auditInfoId)}`,\n body: {\n auditInfoName,\n auditInfoUsers: userIds,\n },\n };\n }\n\n const result = await executeRequest(request);\n printOutput({ resolvedUsers, result }, { json: true });\n });\n}\n\nfunction addSharedOutputOptions(command: Command): void {\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--raw\", \"Print the raw response payload\"));\n command.addOption(new Option(\"--table\", \"Print array responses in a basic table\"));\n command.addOption(new Option(\"--quiet\", \"Suppress stdout output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n}\n\nfunction buildRequest(definition: CommandDefinition, options: CommandOptions, body: unknown) {\n let resolvedPath = definition.api.path;\n const query: Record<string, string | undefined> = {};\n\n for (const parameter of definition.parameters) {\n const value = asOptionalString(options[toOptionKey(parameter.name)]);\n validateIdLikeInput(parameter.name, value, `parameter ${parameter.name}`);\n if (parameter.in === \"path\") {\n if (!value) {\n throw new Error(`Missing required path parameter: ${parameter.name}`);\n }\n\n resolvedPath = resolvedPath.replace(`{${parameter.name}}`, encodeURIComponent(value));\n continue;\n }\n\n if (parameter.in === \"query\") {\n query[parameter.name] = value;\n }\n }\n\n return {\n method: definition.api.method,\n path: resolvedPath,\n query,\n body,\n };\n}\n\nfunction sanitizeRequestBody(definition: CommandDefinition, body: unknown): unknown {\n if (body === undefined) {\n return undefined;\n }\n\n if (definition.module === \"workflow\" && definition.name === \"createForm\") {\n return sanitizeWorkflowCreateFormBody(body);\n }\n\n return body;\n}\n\nfunction sanitizeWorkflowCreateFormBody(body: unknown): unknown {\n if (!isRecord(body)) {\n return body;\n }\n\n const sanitized: Record<string, unknown> = { ...body };\n delete sanitized.formId;\n\n if (Array.isArray(body.fields)) {\n sanitized.fields = body.fields.map((field) => {\n if (!isRecord(field)) {\n return field;\n }\n\n const sanitizedField: Record<string, unknown> = { ...field };\n delete sanitizedField.fieldId;\n return sanitizedField;\n });\n }\n\n return sanitized;\n}\n\nfunction validateRequestBody(definition: CommandDefinition, body: unknown): void {\n if (!definition.hasRequestBody || body === undefined || !definition.requestBodySchema) {\n return;\n }\n\n const issues: string[] = [];\n validateValueAgainstSchema(body, definition.requestBodySchema, \"$\", issues);\n validateIdLikeBodyValues(body, \"$\", issues);\n validateCustomBodyRules(definition, body, issues);\n if (issues.length > 0) {\n throw new Error(`Request body validation failed for ${definition.module} ${definition.name}:\\n${issues.join(\"\\n\")}`);\n }\n}\n\nfunction validateCustomBodyRules(definition: CommandDefinition, body: unknown, issues: string[]): void {\n if (!isRecord(body)) {\n return;\n }\n\n if (definition.module === \"project\" && definition.name === \"createPlan\") {\n const type = body.type;\n if (typeof type !== \"string\" || !createPlanTypes.has(type)) {\n issues.push(\n `$.type: invalid module type ${JSON.stringify(type)}. Allowed values: ${Array.from(createPlanTypes).join(\", \")}`,\n );\n }\n }\n}\n\nfunction validateValueAgainstSchema(\n value: unknown,\n schema: RequestBodySchemaDefinition,\n path: string,\n issues: string[],\n): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (schema.type === \"object\" && isRecord(value)) {\n for (const requiredKey of schema.required ?? []) {\n if (!(requiredKey in value)) {\n issues.push(`${path}.${requiredKey}: missing required field`);\n }\n }\n\n for (const [propertyName, propertySchema] of Object.entries(schema.properties ?? {})) {\n if (propertyName in value) {\n validateValueAgainstSchema(value[propertyName], propertySchema, `${path}.${propertyName}`, issues);\n }\n }\n return;\n }\n\n if (schema.type === \"array\" && Array.isArray(value)) {\n value.forEach((item, index) => {\n if (schema.items) {\n validateValueAgainstSchema(item, schema.items, `${path}[${index}]`, issues);\n }\n });\n return;\n }\n\n if (schema.type === \"string\" && typeof value === \"string\") {\n validateStringByDescription(value, schema.description, path, issues);\n }\n}\n\nfunction validateIdLikeBodyValues(value: unknown, path: string, issues: string[]): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n validateIdLikeBodyValues(item, `${path}[${index}]`, issues);\n });\n return;\n }\n\n if (!isRecord(value)) {\n return;\n }\n\n for (const [key, fieldValue] of Object.entries(value)) {\n const nextPath = `${path}.${key}`;\n if (looksLikeIdField(key)) {\n const issue = getIdLikeValidationIssue(fieldValue, nextPath);\n if (issue) {\n issues.push(issue);\n }\n }\n\n validateIdLikeBodyValues(fieldValue, nextPath, issues);\n }\n}\n\nfunction validateIdLikeInput(name: string, value: string | undefined, label: string): void {\n if (!looksLikeIdField(name) || value === undefined) {\n return;\n }\n\n const issue = getIdLikeValidationIssue(value, label);\n if (issue) {\n throw new Error(issue);\n }\n}\n\nfunction looksLikeIdField(name: string): boolean {\n return /ids?$/i.test(name);\n}\n\nfunction getIdLikeValidationIssue(value: unknown, label: string): string | undefined {\n if (typeof value === \"number\") {\n return `${label}: invalid id value ${value}. Id fields must use string ids, not numbers.`;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n if (/^\\d+$/.test(trimmed)) {\n return `${label}: invalid id value \"${value}\". Id fields must not be pure digits.`;\n }\n\n if (/^\\d+(,\\d+)+$/.test(trimmed)) {\n return `${label}: invalid id value \"${value}\". Id lists must not contain pure numeric ids.`;\n }\n\n return undefined;\n }\n\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n const nestedIssue = getIdLikeValidationIssue(value[index], `${label}[${index}]`);\n if (nestedIssue) {\n return nestedIssue;\n }\n }\n }\n\n return undefined;\n}\n\nfunction validateStringByDescription(\n value: string,\n description: string | undefined,\n path: string,\n issues: string[],\n): void {\n if (!description) {\n return;\n }\n\n if (description.includes(\"仅支持yyyy-MM-dd、yyyy-MM-dd'T'HH:mm:ssXXX两种格式\")) {\n const isDateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(value);\n const isOffsetDateTime = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$/.test(value);\n if (!isDateOnly && !isOffsetDateTime) {\n issues.push(`${path}: invalid format \"${value}\". Allowed formats: yyyy-MM-dd or yyyy-MM-dd'T'HH:mm:ssXXX`);\n }\n }\n}\n\nasync function readBody(options: CommandOptions): Promise<unknown> {\n if (options.body && options.bodyFile) {\n throw new Error(\"Use either --body or --body-file, not both.\");\n }\n\n if (options.body) {\n return JSON.parse(options.body);\n }\n\n if (options.bodyFile) {\n return JSON.parse(await readFile(options.bodyFile, \"utf8\"));\n }\n\n return undefined;\n}\n\nfunction optionName(parameterName: string): `--${string} <value>` {\n return `--${toKebabCase(parameterName)} <value>`;\n}\n\nfunction toOptionKey(parameterName: string): string {\n return toCamelCase(toKebabCase(parameterName));\n}\n\nfunction toKebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/_/g, \"-\")\n .toLowerCase();\n}\n\nfunction toCamelCase(value: string): string {\n return value.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction tokenize(input: string): string[] {\n const normalized = normalizeText(input);\n const tokens = normalized.split(/[\\s/_-]+/).filter(Boolean);\n const cjkRuns = normalized.match(/[\\p{Script=Han}]{2,}/gu) ?? [];\n\n for (const run of cjkRuns) {\n tokens.push(run);\n for (let index = 0; index < run.length - 1; index += 1) {\n tokens.push(run.slice(index, index + 2));\n }\n }\n\n return Array.from(new Set(tokens));\n}\n\nfunction scoreCommand(command: CommandDefinition, query: string, keywords: string[]): number {\n let score = 0;\n const haystack = normalizeText([\n command.name,\n ...command.aliases,\n command.summary,\n command.description,\n command.api?.path ?? \"\",\n ...command.keywords,\n ...command.parameters.map((parameter) => parameter.name),\n ...command.parameters.map((parameter) => parameter.description ?? \"\"),\n ].join(\" \"));\n const normalizedQuery = normalizeText(query);\n const matchedIntentKeywords = keywords.filter((keyword) => haystack.includes(keyword));\n\n if (normalizedQuery && haystack.includes(normalizedQuery)) {\n score += Math.max(8, normalizedQuery.length);\n }\n\n for (const keyword of matchedIntentKeywords) {\n score += keyword.length > 6 ? 6 : keyword.length > 3 ? 3 : 1;\n }\n\n score += scoreRsqIntentBoost(command, normalizedQuery, matchedIntentKeywords);\n\n for (const antiKeyword of command.antiKeywords ?? []) {\n const normalizedAntiKeyword = normalizeText(antiKeyword);\n if (!normalizedAntiKeyword) {\n continue;\n }\n\n if (normalizedQuery.includes(normalizedAntiKeyword) || haystack.includes(normalizedAntiKeyword)) {\n score -= normalizedAntiKeyword.length > 3 ? 4 : 2;\n }\n }\n\n return score;\n}\n\nconst rsqDomainKeywords = [\n \"日事清\",\n \"rsq\",\n \"rishiqing\",\n \"项目\",\n \"模块\",\n \"卡片\",\n \"任务\",\n \"流程\",\n \"流程应用\",\n \"流程实例\",\n \"步骤\",\n \"表单\",\n \"字段\",\n \"审核项\",\n \"审批\",\n \"多维表格\",\n \"数据表\",\n \"数据\",\n \"成员\",\n \"负责人\",\n \"执行人\",\n \"参与人\",\n].map(normalizeText);\n\nconst rsqModuleIntentKeywords: Record<string, string[]> = {\n project: [\"项目\", \"模块\", \"卡片\", \"项目成员\", \"项目下计划\", \"项目概览\"],\n task: [\"任务\", \"卡片\", \"执行人\", \"负责人\", \"参与人\", \"评论\", \"完成任务\"],\n workflow: [\"流程\", \"流程应用\", \"流程实例\", \"步骤\", \"表单\", \"字段\", \"审核项\", \"审批\"],\n datasheet: [\"多维表格\", \"数据表\", \"记录\", \"字段\", \"数据\"],\n contacts: [\"成员\", \"用户\", \"通讯录\", \"员工\", \"姓名解析\"],\n};\n\nconst actionIntentKeywords: Array<{ action: \"create\" | \"get\" | \"list\" | \"update\" | \"delete\" | \"complete\"; keywords: string[] }> = [\n { action: \"create\", keywords: [\"创建\", \"新建\", \"新增\", \"添加\", \"建一个\", \"建\"] },\n { action: \"get\", keywords: [\"查询\", \"查看\", \"获取\", \"详情\", \"查某个\", \"查一下\", \"查\"] },\n { action: \"list\", keywords: [\"列表\", \"全部\", \"批量获取\", \"有哪些\", \"列出\"] },\n { action: \"update\", keywords: [\"更新\", \"修改\", \"编辑\", \"设置\", \"调整\", \"更换\"] },\n { action: \"delete\", keywords: [\"删除\", \"移除\"] },\n { action: \"complete\", keywords: [\"完成\", \"提交\", \"通过\", \"拒绝\", \"关闭\"] },\n];\n\nfunction scoreRsqIntentBoost(command: CommandDefinition, normalizedQuery: string, matchedIntentKeywords: string[]): number {\n let score = 0;\n\n if (includesAny(normalizedQuery, rsqDomainKeywords)) {\n score += 2;\n }\n\n const moduleIntentKeywords = rsqModuleIntentKeywords[command.module] ?? [];\n const matchedModuleIntents = moduleIntentKeywords.filter((keyword) => normalizedQuery.includes(normalizeText(keyword)));\n\n if (matchedModuleIntents.length > 0) {\n score += 6 + matchedModuleIntents.length * 2;\n }\n\n if (command.module === \"workflow\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"表单字段\") || keyword.includes(\"字段值\"))) {\n score += 3;\n }\n\n if (command.module === \"task\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"负责人\") || keyword.includes(\"执行人\") || keyword.includes(\"参与人\"))) {\n score += 3;\n }\n\n if (command.module === \"project\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"模块\") || keyword.includes(\"卡片\"))) {\n score += 3;\n }\n\n if (command.module === \"datasheet\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"多维表格\") || keyword.includes(\"数据表\") || keyword === \"数据\")) {\n score += 3;\n }\n\n score += scoreActionIntentBoost(command, normalizedQuery);\n\n return score;\n}\n\nfunction scoreActionIntentBoost(command: CommandDefinition, normalizedQuery: string): number {\n const matchedActions = actionIntentKeywords\n .filter(({ keywords }) => keywords.some((keyword) => normalizedQuery.includes(normalizeText(keyword))))\n .map(({ action }) => action);\n\n if (matchedActions.length === 0) {\n return 0;\n }\n\n const commandName = command.name.toLowerCase();\n let score = 0;\n\n for (const action of matchedActions) {\n if (commandName.startsWith(action)) {\n score += 5;\n continue;\n }\n\n if (action === \"get\" && commandName.startsWith(\"list\")) {\n score += 2;\n continue;\n }\n\n if (action === \"list\" && commandName.startsWith(\"get\")) {\n score += 1;\n continue;\n }\n }\n\n return score;\n}\n\nfunction normalizeText(value: string): string {\n return value.toLowerCase().trim();\n}\n\nfunction includesAny(value: string, patterns: string[]): boolean {\n return patterns.some((pattern) => value.includes(pattern));\n}\n\nfunction exposurePriority(command: CommandDefinition): number {\n switch (command.exposure) {\n case \"public\":\n return 3;\n case \"composed\":\n return 2;\n case \"internal\":\n return 1;\n default:\n return 0;\n }\n}\n\nfunction parsePositiveInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"Expected a positive integer.\");\n }\n\n return parsed;\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction ensureTrailingSlash(input: string): string {\n return input.endsWith(\"/\") ? input : `${input}/`;\n}\n\nfunction extractUserRows(payload: unknown): Array<{ userId: string; userName: string }> {\n if (\n typeof payload !== \"object\" ||\n payload === null ||\n !(\"data\" in payload) ||\n !Array.isArray((payload as { data?: unknown }).data)\n ) {\n throw new Error(\"Unexpected contacts response shape.\");\n }\n\n return (payload as { data: unknown[] }).data\n .filter(\n (row): row is { userId: string; userName: string } =>\n typeof row === \"object\" &&\n row !== null &&\n typeof (row as { userId?: unknown }).userId === \"string\" &&\n typeof (row as { userName?: unknown }).userName === \"string\",\n )\n .map((row) => ({\n userId: row.userId,\n userName: row.userName,\n }));\n}\n\nasync function resolveUserByName(userName: string): Promise<{\n userName: string;\n userId: string;\n matchType: \"exact\" | \"fuzzy\";\n matchedUserName?: string;\n}> {\n const payload = await executeRequest({\n method: \"GET\",\n path: \"/rsq/api/v1/contacts/list-all-user\",\n });\n\n const users = extractUserRows(payload);\n const exactMatches = users.filter((user) => user.userName === userName);\n\n if (exactMatches.length === 1) {\n return {\n userName,\n userId: exactMatches[0].userId,\n matchType: \"exact\",\n };\n }\n\n if (exactMatches.length > 1) {\n throw new Error(\n `Ambiguous userName \"${userName}\". Matched users: ${exactMatches.map((user) => `${user.userName}(${user.userId})`).join(\", \")}`,\n );\n }\n\n const fuzzyMatches = users.filter((user) => user.userName.includes(userName));\n if (fuzzyMatches.length === 1) {\n return {\n userName,\n userId: fuzzyMatches[0].userId,\n matchType: \"fuzzy\",\n matchedUserName: fuzzyMatches[0].userName,\n };\n }\n\n if (fuzzyMatches.length > 1) {\n throw new Error(\n `No exact match for \"${userName}\". Fuzzy matches: ${fuzzyMatches.map((user) => `${user.userName}(${user.userId})`).join(\", \")}`,\n );\n }\n\n throw new Error(`No user matched userName \"${userName}\".`);\n}\n\nfunction buildTaskUserByNameRequest(commandName: string, taskId: string, userId: string) {\n if (commandName === \"setTaskExecutorByName\") {\n return {\n method: \"PUT\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/executor`,\n body: {\n executorUserIds: [userId],\n },\n } as const;\n }\n\n if (commandName === \"setTaskResponsibleByName\") {\n return {\n method: \"PUT\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/responsible`,\n body: {\n responsibleId: userId,\n },\n } as const;\n }\n\n if (commandName === \"addTaskParticipantByName\") {\n return {\n method: \"POST\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/participants`,\n body: {\n participantUserIds: [userId],\n },\n } as const;\n }\n\n throw new Error(`Unsupported composed task command: ${commandName}`);\n}\n\nfunction parseNameList(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { z } from \"zod\";\n\nconst profileSchema = z.object({\n apiKey: z.string().min(1),\n});\n\nconst configSchema = z.object({\n activeProfile: z.string().min(1),\n profiles: z.record(z.string(), profileSchema),\n});\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 file = await readFile(getAppConfigPath(), \"utf8\");\n return appConfigSchema.parse(JSON.parse(file));\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 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 { readAppConfig, requireActiveProfile } from \"./config.js\";\n\nexport type RequestShape = {\n method: string;\n path: string;\n query?: Record<string, string | undefined>;\n body?: unknown;\n};\n\nexport async function executeRequest(shape: RequestShape): Promise<unknown> {\n const profile = await requireActiveProfile();\n const appConfig = await readAppConfig();\n const url = new URL(shape.path, ensureTrailingSlash(appConfig.baseUrl));\n\n for (const [key, value] of Object.entries(shape.query ?? {})) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n\n const headers: Record<string, string> = {\n \"X-Rsq-Api-key\": profile.apiKey,\n };\n\n let body: string | undefined;\n if (shape.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(shape.body);\n }\n\n const response = await fetch(url, {\n method: shape.method,\n headers,\n body,\n });\n\n const text = await response.text();\n const payload = tryParseJson(text);\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status} ${response.statusText}: ${typeof payload === \"string\" ? payload : JSON.stringify(payload)}`,\n );\n }\n\n return payload;\n}\n\nfunction ensureTrailingSlash(input: string): string {\n return input.endsWith(\"/\") ? input : `${input}/`;\n}\n\nfunction tryParseJson(text: string): unknown {\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","type OutputMode = \"json\" | \"raw\" | \"table\" | \"text\";\n\nexport type OutputOptions = {\n json?: boolean;\n raw?: boolean;\n table?: boolean;\n quiet?: boolean;\n};\n\nexport function resolveOutputMode(options: OutputOptions): OutputMode {\n if (options.raw) {\n return \"raw\";\n }\n\n if (options.table) {\n return \"table\";\n }\n\n if (options.json) {\n return \"json\";\n }\n\n return \"text\";\n}\n\nexport function printOutput(payload: unknown, options: OutputOptions): void {\n const mode = resolveOutputMode(options);\n\n if (mode === \"json\" || mode === \"raw\") {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n\n if (mode === \"table\") {\n const rendered = renderTable(payload);\n process.stdout.write(`${rendered}\\n`);\n return;\n }\n\n if (typeof payload === \"string\") {\n process.stdout.write(`${payload}\\n`);\n return;\n }\n\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nfunction renderTable(payload: unknown): string {\n if (!Array.isArray(payload) || payload.length === 0) {\n return JSON.stringify(payload, null, 2);\n }\n\n if (payload.some((item) => typeof item !== \"object\" || item === null || Array.isArray(item))) {\n return JSON.stringify(payload, null, 2);\n }\n\n const rows = payload as Array<Record<string, unknown>>;\n const columns = Array.from(new Set(rows.flatMap((row) => Object.keys(row))));\n const widths = new Map<string, number>();\n\n for (const column of columns) {\n widths.set(\n column,\n Math.max(column.length, ...rows.map((row) => stringifyCell(row[column]).length)),\n );\n }\n\n const separator = columns.map((column) => \"-\".repeat(widths.get(column) ?? column.length)).join(\" \");\n const header = columns.map((column) => column.padEnd(widths.get(column) ?? column.length)).join(\" \");\n const lines = rows.map((row) =>\n columns.map((column) => stringifyCell(row[column]).padEnd(widths.get(column) ?? column.length)).join(\" \"),\n );\n\n return [header, separator, ...lines].join(\"\\n\");\n}\n\nfunction stringifyCell(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type ParameterDefinition = {\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n required: boolean;\n description?: string;\n schemaType?: string;\n};\n\nexport type OperationDefinition = {\n module: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n path: string;\n operationId: string;\n summary: string;\n description: string;\n parameters: ParameterDefinition[];\n hasRequestBody: boolean;\n requestBodySchema?: RequestBodySchemaDefinition;\n};\n\nexport type RequestBodySchemaDefinition = {\n type?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, RequestBodySchemaDefinition>;\n items?: RequestBodySchemaDefinition;\n};\n\ntype OpenApiDocument = {\n paths?: Record<string, Record<string, Record<string, unknown>>>;\n};\n\nconst operationIdOverrides: Record<string, string> = {\n \"GET /rsq/api/v1/workflow/process-infos/list/{flowApplicationId}\": \"listProcessInfosByFlowApplicationId\",\n \"GET /rsq/api/v1/projects\": \"listProjects\",\n};\n\nlet cachedOperations: OperationDefinition[] | null = null;\n\nexport function loadOperations(): OperationDefinition[] {\n if (cachedOperations) {\n return cachedOperations;\n }\n\n const documentPath = resolveOpenApiPath();\n const document = JSON.parse(readFileSync(documentPath, \"utf8\")) as OpenApiDocument;\n const operations: OperationDefinition[] = [];\n\n for (const [apiPath, item] of Object.entries(document.paths ?? {})) {\n for (const [method, rawOperation] of Object.entries(item)) {\n const normalizedMethod = method.toUpperCase();\n if (![\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(normalizedMethod)) {\n continue;\n }\n\n const operation = rawOperation as {\n operationId?: string;\n summary?: string;\n description?: string;\n tags?: string[];\n parameters?: Array<{\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n required?: boolean;\n description?: string;\n schema?: { type?: string };\n }>;\n requestBody?: {\n content?: {\n \"application/json\"?: {\n schema?: JsonSchemaLike;\n };\n };\n };\n };\n const operationId = resolveOperationId(apiPath, normalizedMethod, operation.operationId);\n const resolvedParameters = (operation.parameters ?? [])\n .filter((parameter) => parameter.name !== \"X-Rsq-Api-key\")\n .map((parameter) => ({\n name: parameter.name,\n in: parameter.in,\n required: Boolean(parameter.required),\n description: parameter.description,\n schemaType: parameter.schema?.type,\n }));\n\n operations.push({\n module: (operation.tags?.[0] ?? \"unknown\").toLowerCase(),\n method: normalizedMethod as OperationDefinition[\"method\"],\n path: apiPath,\n operationId,\n summary: operation.summary ?? \"\",\n description: operation.description ?? operation.summary ?? \"\",\n parameters: resolvedParameters,\n hasRequestBody: Boolean(operation.requestBody),\n requestBodySchema: extractRequestBodySchema(operation.requestBody),\n });\n }\n }\n\n cachedOperations = operations.sort((left, right) => left.operationId.localeCompare(right.operationId));\n return cachedOperations;\n}\n\ntype JsonSchemaLike = {\n type?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, JsonSchemaLike>;\n items?: JsonSchemaLike;\n};\n\nfunction extractRequestBodySchema(\n requestBody:\n | {\n content?: {\n \"application/json\"?: {\n schema?: JsonSchemaLike;\n };\n };\n }\n | undefined,\n): RequestBodySchemaDefinition | undefined {\n const schema = requestBody?.content?.[\"application/json\"]?.schema;\n if (!schema) {\n return undefined;\n }\n\n return normalizeJsonSchema(schema);\n}\n\nfunction normalizeJsonSchema(schema: JsonSchemaLike): RequestBodySchemaDefinition {\n return {\n type: schema.type,\n description: schema.description,\n required: schema.required,\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeJsonSchema(value)]),\n )\n : undefined,\n items: schema.items ? normalizeJsonSchema(schema.items) : undefined,\n };\n}\n\nfunction resolveOperationId(apiPath: string, method: string, operationId: string | undefined): string {\n const override = operationIdOverrides[`${method} ${apiPath}`];\n if (override) {\n return override;\n }\n\n return operationId ?? `${method}:${apiPath}`;\n}\n\nfunction resolveOpenApiPath(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../rishiqing.openapi.json\"),\n path.resolve(moduleDir, \"../../rishiqing.openapi.json\"),\n path.resolve(process.cwd(), \"rishiqing.openapi.json\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Unable to locate rishiqing.openapi.json. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n","import type { Exposure, RsqModule } from \"./types.js\";\n\ntype Override = {\n aliases?: string[];\n keywords?: string[];\n antiKeywords?: string[];\n description?: string;\n exposure?: Exposure;\n};\n\nexport const moduleOrder: RsqModule[] = [\"datasheet\", \"workflow\", \"contacts\", \"project\", \"task\"];\n\nexport const moduleDescriptions: Record<RsqModule, string> = {\n datasheet: \"Datasheet APIs\",\n workflow: \"Workflow APIs\",\n contacts: \"Contacts APIs\",\n project: \"Project APIs\",\n task: \"Task APIs\",\n};\n\nexport const operationOverrides: Record<string, Override> = {\n listTeamDatasheets: {\n aliases: [\"list-datasheets\"],\n keywords: [\"datasheet\", \"table\", \"list team datasheets\"],\n },\n getDatasheetFields: {\n aliases: [\"get-fields\"],\n keywords: [\"datasheet fields\", \"column definitions\"],\n },\n getDatasheetRecords: {\n aliases: [\"list-records\"],\n keywords: [\"datasheet records\", \"rows\", \"query rows\"],\n },\n createDatasheetRecords: {\n aliases: [\"create-records\"],\n keywords: [\"create datasheet record\", \"insert rows\"],\n },\n updateDatasheetRecords: {\n aliases: [\"update-records\"],\n keywords: [\"update datasheet record\", \"modify rows\"],\n },\n deleteDatasheetRecords: {\n aliases: [\"delete-records\"],\n keywords: [\"delete datasheet record\", \"remove rows\"],\n },\n listFlowApplicationTemplates: {\n aliases: [\"list-templates\"],\n keywords: [\"workflow templates\", \"flow templates\", \"流程模板\", \"审批模板\", \"模板列表\"],\n },\n listFlowApplications: {\n aliases: [\"list-apps\"],\n keywords: [\"list workflow applications\", \"list flow apps\", \"流程应用列表\", \"审批流程列表\"],\n },\n listProcessInfosByFlowApplicationId: {\n aliases: [\"list-processes\"],\n keywords: [\"获取已发起的流程列表\", \"流程实例列表\", \"已发起流程列表\", \"运行中的流程列表\", \"list process infos\"],\n },\n createFlowApplication: {\n aliases: [\"create-app\"],\n keywords: [\"create workflow application\", \"new flow app\", \"创建流程应用\", \"新建流程应用\", \"新建审批流程\"],\n },\n createStepInfo: {\n aliases: [\"create-step\"],\n keywords: [\"创建步骤配置\", \"新增步骤\", \"新建步骤\", \"流程步骤\", \"审批步骤\", \"step config\"],\n },\n updateStepInfo: {\n aliases: [\"update-step\"],\n keywords: [\"更新步骤配置\", \"修改步骤配置\", \"编辑步骤\", \"修改步骤名称\", \"step config\"],\n },\n createForm: {\n aliases: [\"create-form\"],\n keywords: [\"创建表单配置\", \"新增表单\", \"新建表单\", \"表单结构\", \"表单字段定义\", \"workflow form\"],\n },\n updateForm: {\n aliases: [\"update-form\"],\n keywords: [\"更新表单配置\", \"修改表单配置\", \"编辑表单\", \"修改表单字段定义\", \"workflow form\"],\n },\n createAuditInfo: {\n aliases: [\"create-audit\"],\n keywords: [\"创建审核项配置\", \"新增审核项\", \"新建审核节点\", \"添加审核人配置\", \"audit config\"],\n },\n updateAuditInfo: {\n aliases: [\"update-audit\"],\n keywords: [\"更新审核项配置\", \"修改审核项配置\", \"编辑审核节点\", \"修改审核人配置\", \"audit config\"],\n },\n updateProcessInfoStep: {\n aliases: [\"update-running-step\", \"set-running-step-executor\"],\n keywords: [\n \"修改运行中的步骤属性\",\n \"修改进行中步骤的执行人\",\n \"修改步骤执行人\",\n \"调整步骤执行人\",\n \"设置步骤执行人\",\n \"运行中步骤执行人\",\n \"步骤执行人\",\n \"步骤限定时间\",\n \"deadTime\",\n \"userIds\",\n ],\n antiKeywords: [\"字段值\", \"表单字段\", \"fieldValue\", \"fieldId\"],\n },\n updateProcessInfoAudit: {\n aliases: [\"update-running-audit\", \"set-running-audit-users\"],\n keywords: [\"修改运行中的审核项属性\", \"修改审核人\", \"调整审核人\", \"运行中审核人\", \"audit user\"],\n antiKeywords: [\"执行人\", \"字段值\", \"表单字段\", \"步骤状态\"],\n description: \"调整运行中审核项的审核人。这个接口用于审核项,不用于步骤状态流转。\",\n exposure: \"internal\",\n },\n updateProcessInfoStepField: {\n aliases: [\"update-step-field-value\", \"set-step-field-value\"],\n keywords: [\n \"修改步骤表单中的字段值\",\n \"修改字段值\",\n \"设置字段值\",\n \"填写字段\",\n \"更新表单字段值\",\n \"步骤字段值\",\n \"表单字段值\",\n \"fieldValue\",\n ],\n antiKeywords: [\"执行人\", \"审核人\", \"负责人\", \"参与人\", \"成员\", \"deadTime\", \"限定时间\"],\n exposure: \"internal\",\n },\n getProcessInfoStep: {\n aliases: [\"get-running-step\"],\n keywords: [\"查询运行中步骤\", \"查看步骤详情\", \"查看进行中步骤\", \"running step detail\"],\n },\n listStepInfosByFlowApplicationId: {\n aliases: [\"list-steps\"],\n keywords: [\"查询步骤列表\", \"流程步骤列表\", \"审批步骤列表\", \"list workflow steps\"],\n },\n startProcessInfosBatch: {\n aliases: [\"start-process-batch\"],\n keywords: [\"批量发起流程\", \"批量启动流程实例\", \"批量提交流程\", \"start workflow process batch\"],\n },\n getProcessInfo: {\n aliases: [\"get-process\"],\n keywords: [\"process info\", \"workflow instance\", \"流程实例\", \"审批实例\", \"查看流程实例\"],\n },\n listAllUsers: {\n aliases: [\"list-users\"],\n keywords: [\"contacts\", \"users\", \"employees\"],\n },\n createProject: {\n aliases: [\"create\"],\n keywords: [\"create project\", \"new project\", \"创建项目\", \"新建项目\"],\n },\n listProjects: {\n aliases: [\"list\"],\n keywords: [\"获取项目列表\", \"项目列表\", \"全部项目\", \"查询项目列表\", \"list projects\"],\n },\n getProjectById: {\n aliases: [\"get\"],\n keywords: [\"project detail\", \"get project\", \"项目详情\", \"查看项目\"],\n },\n listPlansByProjectIds: {\n aliases: [\"list-plans\"],\n keywords: [\"plans\", \"project plans\", \"模块列表\", \"项目模块\", \"查询模块\"],\n },\n createPlan: {\n aliases: [\"create-plan\"],\n keywords: [\"创建模块\", \"新增模块\", \"新建模块\", \"项目模块\", \"project plan\", \"task\", \"statistic\", \"overview\", \"folder\", \"risk\", \"workflow\", \"datasheet\", \"deliverable\"],\n description:\n \"创建项目下的模块。type 仅支持这些值:task、statistic、overview、folder、risk、workflow、datasheet、deliverable。\",\n },\n updatePlan: {\n aliases: [\"update-plan\"],\n keywords: [\"修改模块\", \"更新模块\", \"编辑模块\", \"project plan\"],\n },\n createCard: {\n aliases: [\"create-card\"],\n keywords: [\"创建卡片\", \"新增卡片\", \"新建卡片\", \"模块卡片\", \"project card\"],\n },\n updateCard: {\n aliases: [\"update-card\"],\n keywords: [\"修改卡片\", \"更新卡片\", \"编辑卡片\", \"project card\"],\n },\n updateProject: {\n aliases: [\"update-project\"],\n keywords: [\"修改项目\", \"更新项目\", \"编辑项目\", \"project info\"],\n },\n createTask: {\n aliases: [\"create\"],\n keywords: [\"create task\", \"new task\", \"创建任务\", \"新建任务\"],\n },\n getTaskById: {\n aliases: [\"get\"],\n keywords: [\"task detail\", \"get task\", \"任务详情\", \"查看任务\"],\n },\n updateTask: {\n aliases: [\"update\"],\n keywords: [\"update task\", \"edit task\", \"修改任务\", \"编辑任务\", \"更新任务信息\"],\n },\n deleteTask: {\n aliases: [\"delete\"],\n keywords: [\"delete task\", \"remove task\", \"删除任务\", \"移除任务\"],\n },\n getTaskComments: {\n aliases: [\"comments\"],\n keywords: [\"task comments\", \"list task comments\", \"任务评论\", \"评论列表\", \"查看评论\"],\n antiKeywords: [\"发表评论\", \"提交评论\", \"回复任务\"],\n },\n createTaskComment: {\n aliases: [\"comment\"],\n keywords: [\"create task comment\", \"add task comment\", \"发表评论\", \"提交评论\", \"回复任务\"],\n antiKeywords: [\"评论列表\", \"查看评论\"],\n },\n completeTask: {\n aliases: [\"complete\"],\n keywords: [\"完成任务\", \"打钩任务\", \"标记完成\", \"close task\"],\n antiKeywords: [\"创建任务\", \"修改任务\", \"发表评论\", \"评论列表\"],\n },\n updateProjectMember: {\n aliases: [\"update-project-member\"],\n keywords: [\"修改项目成员\", \"设置项目成员\", \"添加项目成员\", \"项目成员\", \"project member\"],\n antiKeywords: [\"创建项目\", \"项目信息\", \"项目模块\", \"卡片\"],\n exposure: \"internal\",\n },\n updateProcessInfoStepStatus: {\n aliases: [\"update-running-step-status\"],\n keywords: [\n \"流转流程步骤状态\",\n \"提交步骤\",\n \"完成步骤\",\n \"通过步骤\",\n \"拒绝步骤\",\n \"跳过步骤\",\n \"步骤状态\",\n \"审批通过\",\n \"审批拒绝\",\n ],\n antiKeywords: [\"执行人\", \"审核项id\", \"auditInfoId\", \"processInfoAuditId\", \"审核人\", \"字段值\", \"表单字段\"],\n description:\n \"对运行中的步骤执行状态动作。无论 action 是什么,path 参数 processInfoStepId 始终传步骤 id,不要传审核项 id。\",\n exposure: \"internal\",\n },\n updateTaskExecutor: {\n aliases: [\"update-executor\"],\n keywords: [\"修改任务执行人\", \"设置执行人\", \"调整执行人\", \"task executor\"],\n antiKeywords: [\"负责人\", \"参与人\", \"评论\"],\n exposure: \"composed\",\n },\n updateTaskResponsible: {\n aliases: [\"update-responsible\"],\n keywords: [\"修改任务负责人\", \"设置负责人\", \"调整负责人\", \"task responsible\"],\n antiKeywords: [\"执行人\", \"参与人\", \"评论\"],\n exposure: \"composed\",\n },\n addTaskParticipant: {\n aliases: [\"add-participant\"],\n keywords: [\"添加任务参与人\", \"增加参与人\", \"设置参与人\", \"task participant\"],\n antiKeywords: [\"执行人\", \"负责人\", \"评论\"],\n exposure: \"composed\",\n },\n};\n","import { loadOperations } from \"../core/openapi.js\";\nimport { moduleDescriptions, moduleOrder, operationOverrides } from \"./overrides.js\";\nimport type { CommandDefinition, Exposure, RsqModule } from \"./types.js\";\nimport type { ParameterDefinition, RequestBodySchemaDefinition } from \"../core/openapi.js\";\n\nlet cachedRegistry: CommandDefinition[] | null = null;\n\nexport function getRegistry(): CommandDefinition[] {\n if (cachedRegistry) {\n return cachedRegistry;\n }\n\n const openApiCommands: CommandDefinition[] = loadOperations()\n .filter((operation): operation is typeof operation & { module: RsqModule } => moduleOrder.includes(operation.module as RsqModule))\n .map((operation) => {\n const override = operationOverrides[operation.operationId] ?? {};\n const exposure = override.exposure ?? defaultExposure(operation.operationId);\n return {\n module: operation.module as RsqModule,\n name: operation.operationId,\n aliases: override.aliases ?? [],\n summary: operation.summary || operation.operationId,\n description: override.description ?? operation.description ?? operation.summary ?? operation.operationId,\n api: {\n method: operation.method,\n path: operation.path,\n },\n parameters: operation.parameters.map(annotateParameterDescription),\n hasRequestBody: operation.hasRequestBody,\n requestBodySchema: annotateRequestBodySchema(operation.requestBodySchema),\n keywords: dedupe([\n operation.operationId,\n operation.summary,\n operation.path,\n ...pathKeywords(operation.path),\n ...(override.keywords ?? []),\n ]),\n antiKeywords: dedupe(override.antiKeywords ?? []),\n examples: buildExamples(operation.module as RsqModule, operation.operationId, override.aliases ?? []),\n exposure,\n idempotent: operation.method === \"GET\",\n outputMode: \"json\",\n } satisfies CommandDefinition;\n });\n\n cachedRegistry = [...openApiCommands, ...buildCustomCommands()];\n\n return cachedRegistry;\n}\n\nexport function getPublicRegistry(): CommandDefinition[] {\n return getRegistry().filter((command) => command.exposure === \"public\");\n}\n\nexport function getModuleDefinitions() {\n return moduleOrder.map((module) => ({\n name: module,\n description: moduleDescriptions[module],\n }));\n}\n\nexport function findCommand(moduleName: string, commandName: string): CommandDefinition | undefined {\n const normalized = commandName.toLowerCase();\n return getRegistry().find(\n (command) =>\n command.module === moduleName &&\n (command.name.toLowerCase() === normalized || command.aliases.some((alias) => alias.toLowerCase() === normalized)),\n );\n}\n\nfunction buildExamples(module: RsqModule, name: string, aliases: string[]): string[] {\n const examples = [`rsq-cli ${module} ${name} --json`];\n if (aliases[0]) {\n examples.push(`rsq-cli ${module} ${aliases[0]} --json`);\n }\n return examples;\n}\n\nfunction annotateParameterDescription(parameter: ParameterDefinition): ParameterDefinition {\n if (!looksLikeIdField(parameter.name)) {\n return parameter;\n }\n\n return {\n ...parameter,\n description: appendIdRule(parameter.description),\n };\n}\n\nfunction annotateRequestBodySchema(\n schema: RequestBodySchemaDefinition | undefined,\n): RequestBodySchemaDefinition | undefined {\n if (!schema) {\n return undefined;\n }\n\n return {\n ...schema,\n description: schema.description,\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n {\n ...annotateRequestBodySchema(value),\n description: looksLikeIdField(key) ? appendIdRule(value.description) : value.description,\n },\n ]),\n )\n : undefined,\n items: schema.items ? annotateRequestBodySchema(schema.items) : undefined,\n };\n}\n\nfunction appendIdRule(description: string | undefined): string {\n const rule = \"必须传前缀+uuid风格的字符串 id,不要传数字类型 id,也不要传纯数字字符串。\";\n if (!description) {\n return rule;\n }\n\n return description.includes(rule) ? description : `${description} | ${rule}`;\n}\n\nfunction looksLikeIdField(name: string): boolean {\n return /ids?$/i.test(name);\n}\n\nfunction defaultExposure(operationId: string): Exposure {\n if (operationId.startsWith(\"list\") || operationId.startsWith(\"get\") || operationId.startsWith(\"create\") || operationId.startsWith(\"update\") || operationId.startsWith(\"delete\")) {\n return \"public\";\n }\n\n return \"composed\";\n}\n\nfunction pathKeywords(apiPath: string): string[] {\n return apiPath\n .split(\"/\")\n .filter(Boolean)\n .flatMap((segment) => [segment, segment.replace(/[{}]/g, \"\"), segment.replace(/-/g, \" \")]);\n}\n\nfunction dedupe(values: Array<string | undefined>): string[] {\n return Array.from(new Set(values.filter((value): value is string => Boolean(value))));\n}\n\nfunction buildCustomCommands(): CommandDefinition[] {\n return [\n {\n module: \"contacts\",\n name: \"resolveUser\",\n aliases: [\"resolve-user\"],\n summary: \"根据用户名称解析 userId\",\n description: \"先查询全部用户,再按 userName 匹配,返回唯一命中的 userId。\",\n api: {\n method: \"GET\",\n path: \"/rsq/api/v1/contacts/list-all-user\",\n },\n parameters: [\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"需要解析的人员名称\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\n \"resolve user\",\n \"userName to userId\",\n \"根据姓名找 userId\",\n \"resolve-user\",\n \"contacts\",\n ],\n antiKeywords: [\"列表\", \"全部用户\"],\n examples: [\n \"rsq-cli contacts resolveUser --user-name 张三 --json\",\n \"rsq-cli contacts resolve-user --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: true,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"setTaskExecutorByName\",\n aliases: [\"set-executor-by-name\"],\n summary: \"根据人员名称设置任务执行人\",\n description: \"先按 userName 解析 userId,再更新任务执行人。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/tasks/{taskId}/executor\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"执行人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task executor by name\", \"set executor by name\", \"根据姓名设置执行人\"],\n antiKeywords: [\"负责人\", \"参与人\", \"评论\"],\n examples: [\n \"rsq-cli task setTaskExecutorByName --task-id task_demo --user-name 张三 --json\",\n \"rsq-cli task set-executor-by-name --task-id task_demo --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"setTaskResponsibleByName\",\n aliases: [\"set-responsible-by-name\"],\n summary: \"根据人员名称设置任务负责人\",\n description: \"先按 userName 解析 userId,再更新任务负责人。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/tasks/{taskId}/responsible\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"负责人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task responsible by name\", \"set responsible by name\", \"根据姓名设置负责人\"],\n antiKeywords: [\"执行人\", \"参与人\", \"评论\"],\n examples: [\n \"rsq-cli task setTaskResponsibleByName --task-id task_demo --user-name 李四 --json\",\n \"rsq-cli task set-responsible-by-name --task-id task_demo --user-name 李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"addTaskParticipantByName\",\n aliases: [\"add-participant-by-name\"],\n summary: \"根据人员名称添加任务参与人\",\n description: \"先按 userName 解析 userId,再添加任务参与人。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/tasks/{taskId}/participants\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"参与人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task participant by name\", \"add participant by name\", \"根据姓名添加参与人\"],\n antiKeywords: [\"执行人\", \"负责人\", \"评论\"],\n examples: [\n \"rsq-cli task addTaskParticipantByName --task-id task_demo --user-name 王五 --json\",\n \"rsq-cli task add-participant-by-name --task-id task_demo --user-name 王五 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"project\",\n name: \"setProjectMemberByName\",\n aliases: [\"set-member-by-name\"],\n summary: \"根据人员名称设置项目成员\",\n description: \"先按 userName 解析 userId,再更新项目成员。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/projects/{projectId}/members\",\n },\n parameters: [\n {\n name: \"projectId\",\n in: \"path\",\n required: true,\n description: \"projectId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"项目成员姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"project member by name\", \"set project member by name\", \"根据姓名设置项目成员\"],\n examples: [\n \"rsq-cli project setProjectMemberByName --project-id proj_demo --user-name 张三 --json\",\n \"rsq-cli project set-member-by-name --project-id proj_demo --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"workflow\",\n name: \"createAuditInfoByNames\",\n aliases: [\"create-audit-by-names\"],\n summary: \"根据人员名称创建审核项配置\",\n description: \"先按 userName 解析 userId,再创建审核项配置。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/workflow/audit-infos\",\n },\n parameters: [\n { name: \"flowApplicationId\", in: \"query\", required: true, description: \"流程应用id\", schemaType: \"string\" },\n { name: \"stepInfoId\", in: \"query\", required: true, description: \"步骤配置id\", schemaType: \"string\" },\n { name: \"auditInfoName\", in: \"query\", required: true, description: \"审核项名称\", schemaType: \"string\" },\n { name: \"userNames\", in: \"query\", required: true, description: \"审核人名称列表,逗号分隔\", schemaType: \"string\" },\n { name: \"frontAuditInfoId\", in: \"query\", required: false, description: \"前一个审核项id\", schemaType: \"string\" },\n ],\n hasRequestBody: false,\n keywords: [\"create audit by names\", \"workflow audit users by name\", \"根据姓名创建审核项\"],\n examples: [\n \"rsq-cli workflow createAuditInfoByNames --flow-application-id flow_demo --step-info-id step_demo --audit-info-name 部门审批 --user-names 张三,李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"workflow\",\n name: \"updateAuditInfoByNames\",\n aliases: [\"update-audit-by-names\"],\n summary: \"根据人员名称更新审核项配置\",\n description: \"先按 userName 解析 userId,再更新审核项配置。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/workflow/audit-infos/{auditInfoId}\",\n },\n parameters: [\n { name: \"auditInfoId\", in: \"path\", required: true, description: \"审核项配置id\", schemaType: \"string\" },\n { name: \"auditInfoName\", in: \"query\", required: true, description: \"审核项名称\", schemaType: \"string\" },\n { name: \"userNames\", in: \"query\", required: true, description: \"审核人名称列表,逗号分隔\", schemaType: \"string\" },\n ],\n hasRequestBody: false,\n keywords: [\"update audit by names\", \"workflow audit users by name\", \"根据姓名更新审核项\"],\n examples: [\n \"rsq-cli workflow updateAuditInfoByNames --audit-info-id audit_demo --audit-info-name 部门审批 --user-names 张三,李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n ];\n}\n","import { getRegistry } from \"./index.js\";\n\nexport function getSkillContract() {\n return {\n skill: {\n name: \"rishiqing\",\n summary: \"识别日事清领域自然语言请求,并路由到 rsq-cli 的对应模块与命令。\",\n },\n trigger: {\n domain: \"rishiqing\",\n when: [\n \"当用户在对话中提到日事清、rsq、rishiqing 时,默认这是日事清操作请求。\",\n \"当用户提到项目、模块、卡片、任务、流程、多维表格、数据、流程应用、流程实例、步骤、表单、字段、审核项、审批、成员、负责人、执行人、参与人等领域词时,也优先按日事清请求处理。\",\n ],\n keywords: [\n \"日事清\",\n \"rsq\",\n \"rishiqing\",\n \"项目\",\n \"模块\",\n \"卡片\",\n \"任务\",\n \"流程\",\n \"流程应用\",\n \"流程实例\",\n \"步骤\",\n \"表单\",\n \"字段\",\n \"审核项\",\n \"审批\",\n \"多维表格\",\n \"数据\",\n \"成员\",\n \"负责人\",\n \"执行人\",\n \"参与人\",\n ],\n },\n routing: {\n moduleHints: [\n {\n module: \"project\",\n intents: [\"项目\", \"模块\", \"项目成员\", \"项目概览\", \"项目下计划\"],\n },\n {\n module: \"task\",\n intents: [\"任务\", \"卡片\", \"执行人\", \"负责人\", \"参与人\", \"任务状态\"],\n },\n {\n module: \"workflow\",\n intents: [\"流程应用\", \"流程实例\", \"步骤\", \"表单\", \"字段\", \"审核项\", \"审批流\"],\n },\n {\n module: \"datasheet\",\n intents: [\"多维表格\", \"数据表\", \"记录\", \"字段\", \"数据\"],\n },\n {\n module: \"contacts\",\n intents: [\"按姓名解析用户\", \"查成员\", \"查用户\"],\n },\n ],\n },\n globalRules: [\n \"遇到日事清领域短语时,先识别为 rsq-cli 操作意图,不要把它当成泛化项目管理请求。\",\n \"不确定具体命令时,先调用 rsq-cli search;确认候选命令后再调用 rsq-cli describe 阅读参数和 requestBodySchema。\",\n \"涉及创建、更新、绑定、分配等写操作时,优先使用 --dry-run --json 预览。\",\n \"所有 id 字段都必须传前缀+uuid风格的字符串,例如 flowApp_019d6c0c2f03770b8b789ec313076e64。\",\n \"不要传数字类型 id,也不要传纯数字字符串 id。\",\n \"调用前优先阅读参数说明和 requestBodySchema 中的字段说明,再组装参数。\",\n ],\n tools: getRegistry().map((command) => ({\n tool: `${command.module}.${command.aliases[0] ?? command.name}`,\n canonical: `${command.module}.${command.name}`,\n summary: command.summary,\n exposure: command.exposure,\n keywords: command.keywords,\n examples: command.examples,\n input: {\n parameters: command.parameters.map((parameter) => ({\n name: parameter.name,\n location: parameter.in,\n required: parameter.required,\n type: parameter.schemaType ?? \"string\",\n description: parameter.description,\n })),\n acceptsBody: command.hasRequestBody,\n requestBodySchema: command.requestBodySchema,\n },\n })),\n };\n}\n"],"mappings":"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","names":["readFile","existsSync","path","fileURLToPath","ensureTrailingSlash","path","looksLikeIdField","readFile"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/core/config.ts","../src/core/install.ts","../src/core/http.ts","../src/core/output.ts","../src/core/openapi.ts","../src/registry/overrides.ts","../src/registry/index.ts","../src/registry/skill-contract.ts"],"sourcesContent":["import { Command, InvalidArgumentError, Option } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport readline from \"node:readline/promises\";\nimport { stdin, stdout } from \"node:process\";\nimport { getAppConfigPath, getConfigPath, initConfig, normalizeBaseUrl, readAppConfig, readConfig, setBaseUrl } from \"./core/config.js\";\nimport { installBundledSkills, listKnownInstallTargets } from \"./core/install.js\";\nimport { executeRequest } from \"./core/http.js\";\nimport { printOutput } from \"./core/output.js\";\nimport { getModuleDefinitions, getRegistry } from \"./registry/index.js\";\nimport { getSkillContract } from \"./registry/skill-contract.js\";\nimport type { CommandDefinition } from \"./registry/types.js\";\nimport type { RequestBodySchemaDefinition } from \"./core/openapi.js\";\n\nconst createPlanTypes = new Set([\n \"task\",\n \"statistic\",\n \"overview\",\n \"folder\",\n \"risk\",\n \"workflow\",\n \"datasheet\",\n \"deliverable\",\n]);\n\ntype GlobalOptions = {\n json?: boolean;\n raw?: boolean;\n table?: boolean;\n quiet?: boolean;\n dryRun?: boolean;\n};\n\ntype CommandOptions = GlobalOptions & Record<string, unknown> & {\n body?: string;\n bodyFile?: string;\n};\n\nasync function main(): Promise<void> {\n const program = new Command();\n program\n .name(\"rsq-cli\")\n .description(\"Agent-oriented CLI for Rishiqing APIs\")\n .version(\"0.1.0\");\n\n registerGlobalHelp(program);\n registerConfig(program);\n registerDescribe(program);\n registerInstall(program);\n registerSearch(program);\n\n for (const moduleDefinition of getModuleDefinitions()) {\n const moduleCommand = program.command(moduleDefinition.name).description(moduleDefinition.description);\n for (const definition of getRegistry().filter((entry) => entry.module === moduleDefinition.name)) {\n if (definition.module === \"contacts\" && definition.name === \"resolveUser\") {\n registerResolveUserCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"task\" &&\n [\"setTaskExecutorByName\", \"setTaskResponsibleByName\", \"addTaskParticipantByName\"].includes(definition.name)\n ) {\n registerTaskUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (definition.module === \"project\" && definition.name === \"setProjectMemberByName\") {\n registerProjectUserByNameCommand(moduleCommand, definition);\n continue;\n }\n if (\n definition.module === \"workflow\" &&\n [\"createAuditInfoByNames\", \"updateAuditInfoByNames\"].includes(definition.name)\n ) {\n registerWorkflowAuditByNamesCommand(moduleCommand, definition);\n continue;\n }\n\n registerApiCommand(moduleCommand, definition);\n }\n }\n\n await program.parseAsync(process.argv);\n}\n\nfunction registerGlobalHelp(program: Command): void {\n program.showHelpAfterError(\"(run with --help for usage)\");\n}\n\nfunction registerConfig(program: Command): void {\n const config = program.command(\"config\").description(\"Manage local rsq-cli configuration\");\n\n config\n .command(\"init\")\n .description(\"Initialize local configuration\")\n .action(async () => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n try {\n const apiKey = (await rl.question(\"X-Rsq-Api-key: \")).trim();\n if (!apiKey) {\n throw new Error(\"X-Rsq-Api-key is required.\");\n }\n\n const saved = await initConfig(apiKey);\n const appConfig = await readAppConfig();\n printOutput(\n {\n message: \"Configuration saved.\",\n configPath: getConfigPath(),\n appConfigPath: getAppConfigPath(),\n activeProfile: saved.activeProfile,\n baseUrl: appConfig.baseUrl,\n },\n { json: true },\n );\n } finally {\n rl.close();\n }\n });\n\n config\n .command(\"get\")\n .description(\"Show current config without exposing the API key\")\n .option(\"--json\", \"Print JSON output\")\n .action(async (options: GlobalOptions) => {\n const current = await readConfig();\n const appConfig = await readAppConfig();\n if (!current) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const profile = current.profiles[current.activeProfile];\n printOutput(\n {\n configPath: getConfigPath(),\n appConfigPath: getAppConfigPath(),\n baseUrl: appConfig.baseUrl,\n activeProfile: current.activeProfile,\n profiles: {\n [current.activeProfile]: {\n apiKeyConfigured: Boolean(profile?.apiKey),\n },\n },\n },\n options,\n );\n });\n\n config\n .command(\"path\")\n .description(\"Show config file path\")\n .action(() => {\n stdout.write(`${getConfigPath()}\\n`);\n });\n\n config\n .command(\"app-path\")\n .description(\"Show bundled app config path\")\n .action(() => {\n stdout.write(`${getAppConfigPath()}\\n`);\n });\n\n config\n .command(\"baseurl\")\n .description(\"Set the API base URL domain used by rsq-cli\")\n .argument(\"[value]\", \"Base URL domain, for example www.rishiqing.com\")\n .option(\"--json\", \"Print JSON output\")\n .action(async (value: string | undefined, options: { json?: boolean }) => {\n const current = await readAppConfig();\n const nextValue = value ? normalizeBaseUrl(value) : await promptBaseUrl(current.baseUrl);\n const saved = await setBaseUrl(nextValue);\n\n printOutput(\n {\n message: \"baseUrl updated.\",\n configPath: getConfigPath(),\n baseUrl: saved.baseUrl,\n },\n options,\n );\n });\n}\n\nfunction registerDescribe(program: Command): void {\n program\n .command(\"describe\")\n .description(\"Describe commands in machine-readable form\")\n .argument(\"[module]\", \"Module name\")\n .argument(\"[command]\", \"Command name\")\n .addOption(new Option(\"--json\", \"Print JSON output\"))\n .action((moduleName: string | undefined, commandName: string | undefined, options: { json?: boolean }) => {\n const source = getRegistry();\n\n if (!moduleName) {\n printOutput(source, { json: true });\n return;\n }\n\n if (!commandName) {\n printOutput(source.filter((entry) => entry.module === moduleName), { json: true });\n return;\n }\n\n const command = source.find(\n (entry) =>\n entry.module === moduleName &&\n (entry.name === commandName || entry.aliases.includes(commandName)),\n );\n\n if (!command) {\n throw new Error(`Unknown command: ${moduleName} ${commandName}`);\n }\n\n printOutput(command, { json: true });\n });\n\n program\n .command(\"describe-agent-contract\")\n .description(\"Describe the built-in agent contract derived from the registry\")\n .action(() => {\n printOutput(getSkillContract(), { json: true });\n });\n}\n\nfunction registerInstall(program: Command): void {\n const knownTargets = listKnownInstallTargets();\n\n program\n .command(\"install\")\n .description(\"Install bundled skills into known agent skill directories\")\n .option(\n \"--target <name>\",\n `Install only to selected known targets. Repeat or use comma-separated values: ${knownTargets.map((target) => target.name).join(\", \")}`,\n collectStrings,\n [],\n )\n .option(\n \"--dir <path>\",\n \"Install to an additional custom skill directory. Repeat or use comma-separated values\",\n collectStrings,\n [],\n )\n .option(\"--list-targets\", \"Print known install targets and exit\")\n .option(\"--dry-run\", \"Show installation plan without copying files\")\n .option(\"--json\", \"Print JSON output\")\n .action(\n async (options: {\n target?: string[];\n dir?: string[];\n listTargets?: boolean;\n dryRun?: boolean;\n json?: boolean;\n }) => {\n if (options.listTargets) {\n printOutput(\n knownTargets.map((target) => ({\n name: target.name,\n label: target.label,\n dir: target.dir,\n description: target.description,\n })),\n options,\n );\n return;\n }\n\n const result = await installBundledSkills({\n targets: options.target,\n extraDirs: options.dir,\n dryRun: options.dryRun,\n });\n\n printOutput(\n {\n message: options.dryRun ? \"Dry run completed.\" : \"Bundled skills installed.\",\n sourceDir: result.sourceDir,\n skills: result.skills,\n installed: result.installed,\n },\n options,\n );\n },\n );\n}\n\nfunction registerSearch(program: Command): void {\n program\n .command(\"search\")\n .description(\"Search all registered commands by natural language intent\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--limit <count>\", \"Maximum results\", parsePositiveInteger, 10)\n .option(\"--json\", \"Print JSON output\")\n .action((query: string, options: { limit: number; json?: boolean }) => {\n const keywords = tokenize(query);\n const ranked = getRegistry()\n .map((command) => ({\n command,\n score: scoreCommand(command, query, keywords),\n }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => {\n if (right.score !== left.score) {\n return right.score - left.score;\n }\n\n return exposurePriority(right.command) - exposurePriority(left.command);\n })\n .slice(0, options.limit)\n .map(({ command, score }) => ({\n score,\n module: command.module,\n name: command.name,\n aliases: command.aliases,\n exposure: command.exposure,\n summary: command.summary,\n api: command.api,\n }));\n\n printOutput(ranked, options);\n });\n}\n\nfunction registerApiCommand(parent: Command, definition: CommandDefinition): void {\n if (!definition.api) {\n throw new Error(`Missing API mapping for command: ${definition.module} ${definition.name}`);\n }\n\n const command = parent.command(definition.name).description(definition.summary);\n\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n addSharedOutputOptions(command);\n\n for (const parameter of definition.parameters) {\n command.addOption(\n new Option(optionName(parameter.name), parameter.description ?? `${parameter.in} parameter: ${parameter.name}`).makeOptionMandatory(Boolean(parameter.required)),\n );\n }\n\n if (definition.hasRequestBody) {\n command.addOption(new Option(\"--body <json>\", \"Inline JSON request body\"));\n command.addOption(new Option(\"--body-file <path>\", \"Read JSON request body from a file\"));\n }\n\n command.action(async (options: CommandOptions) => {\n const body = sanitizeRequestBody(definition, await readBody(options));\n validateRequestBody(definition, body);\n const request = buildRequest(definition, options, body);\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n api: definition.api,\n baseUrl: appConfig.baseUrl,\n url: new URL(request.path, ensureTrailingSlash(appConfig.baseUrl)).toString(),\n request,\n },\n { json: true },\n );\n return;\n }\n\n const result = await executeRequest(request);\n if (!options.quiet) {\n printOutput(result, options);\n }\n });\n}\n\nfunction registerResolveUserCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n command.addOption(new Option(\"--user-name <value>\", \"需要解析的人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--table\", \"Print array responses in a basic table\"));\n\n command.action(async (options: { userName?: string; json?: boolean; table?: boolean }) => {\n const userName = asOptionalString(options.userName);\n if (!userName) {\n throw new Error(\"Missing required option: --user-name\");\n }\n\n printOutput(await resolveUserByName(userName), { json: true });\n });\n}\n\nfunction registerTaskUserByNameCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) {\n command.alias(alias);\n }\n\n command.addOption(new Option(\"--task-id <value>\", \"taskId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-name <value>\", \"人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n\n command.action(async (options: { taskId?: string; userName?: string; json?: boolean; dryRun?: boolean }) => {\n const taskId = asOptionalString(options.taskId);\n const userName = asOptionalString(options.userName);\n if (!taskId || !userName) {\n throw new Error(\"Missing required options: --task-id and --user-name\");\n }\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n {\n action: \"resolveUser\",\n command: `rsq-cli contacts resolveUser --user-name ${userName} --json`,\n },\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n taskId,\n userName,\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolved = await resolveUserByName(userName);\n const request = buildTaskUserByNameRequest(definition.name, taskId, resolved.userId);\n const result = await executeRequest(request);\n printOutput(\n {\n resolvedUser: resolved,\n result,\n },\n { json: true },\n );\n });\n}\n\nfunction registerProjectUserByNameCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) command.alias(alias);\n command.addOption(new Option(\"--project-id <value>\", \"projectId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-name <value>\", \"人员名称\").makeOptionMandatory(true));\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n command.action(async (options: { projectId?: string; userName?: string; dryRun?: boolean }) => {\n const projectId = asOptionalString(options.projectId);\n const userName = asOptionalString(options.userName);\n if (!projectId || !userName) throw new Error(\"Missing required options: --project-id and --user-name\");\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n { action: \"resolveUser\", command: `rsq-cli contacts resolveUser --user-name ${userName} --json` },\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n projectId,\n userName,\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolved = await resolveUserByName(userName);\n const result = await executeRequest({\n method: \"POST\",\n path: `/rsq/api/v1/projects/${encodeURIComponent(projectId)}/members`,\n body: { userMemberIds: [resolved.userId], deptMemberIds: [] },\n });\n printOutput({ resolvedUser: resolved, result }, { json: true });\n });\n}\n\nfunction registerWorkflowAuditByNamesCommand(parent: Command, definition: CommandDefinition): void {\n const command = parent.command(definition.name).description(definition.summary);\n for (const alias of definition.aliases) command.alias(alias);\n\n if (definition.name === \"createAuditInfoByNames\") {\n command.addOption(new Option(\"--flow-application-id <value>\", \"flowApplicationId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--step-info-id <value>\", \"stepInfoId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--audit-info-name <value>\", \"auditInfoName\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-names <value>\", \"审核人名称列表,逗号分隔\").makeOptionMandatory(true));\n command.addOption(new Option(\"--front-audit-info-id <value>\", \"frontAuditInfoId\"));\n } else {\n command.addOption(new Option(\"--audit-info-id <value>\", \"auditInfoId\").makeOptionMandatory(true));\n command.addOption(new Option(\"--audit-info-name <value>\", \"auditInfoName\").makeOptionMandatory(true));\n command.addOption(new Option(\"--user-names <value>\", \"审核人名称列表,逗号分隔\").makeOptionMandatory(true));\n }\n\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n\n command.action(async (options: Record<string, unknown> & { dryRun?: boolean }) => {\n const userNamesValue = asOptionalString(options.userNames);\n const userNames = parseNameList(userNamesValue);\n if (userNames.length === 0) throw new Error(\"Missing required option: --user-names\");\n\n if (options.dryRun) {\n const appConfig = await readAppConfig();\n printOutput(\n {\n command: `${definition.module} ${definition.name}`,\n aliases: definition.aliases,\n baseUrl: appConfig.baseUrl,\n steps: [\n ...userNames.map((name) => ({\n action: \"resolveUser\",\n command: `rsq-cli contacts resolveUser --user-name ${name} --json`,\n })),\n {\n action: \"callTargetApi\",\n api: definition.api,\n pathTemplate: definition.api.path,\n options: {\n flowApplicationId: asOptionalString(options.flowApplicationId),\n stepInfoId: asOptionalString(options.stepInfoId),\n auditInfoId: asOptionalString(options.auditInfoId),\n auditInfoName: asOptionalString(options.auditInfoName),\n frontAuditInfoId: asOptionalString(options.frontAuditInfoId),\n userNames,\n },\n },\n ],\n },\n { json: true },\n );\n return;\n }\n\n const resolvedUsers = [];\n for (const userName of userNames) {\n resolvedUsers.push(await resolveUserByName(userName));\n }\n const userIds = resolvedUsers.map((user) => user.userId);\n\n let request;\n if (definition.name === \"createAuditInfoByNames\") {\n const flowApplicationId = asOptionalString(options.flowApplicationId);\n const stepInfoId = asOptionalString(options.stepInfoId);\n const auditInfoName = asOptionalString(options.auditInfoName);\n if (!flowApplicationId || !stepInfoId || !auditInfoName) {\n throw new Error(\"Missing required options for createAuditInfoByNames\");\n }\n request = {\n method: \"POST\",\n path: \"/rsq/api/v1/workflow/audit-infos\",\n body: {\n flowApplicationId,\n stepInfoId,\n auditInfoName,\n frontAuditInfoId: asOptionalString(options.frontAuditInfoId),\n auditInfoUsers: userIds,\n },\n };\n } else {\n const auditInfoId = asOptionalString(options.auditInfoId);\n const auditInfoName = asOptionalString(options.auditInfoName);\n if (!auditInfoId || !auditInfoName) {\n throw new Error(\"Missing required options for updateAuditInfoByNames\");\n }\n request = {\n method: \"PUT\",\n path: `/rsq/api/v1/workflow/audit-infos/${encodeURIComponent(auditInfoId)}`,\n body: {\n auditInfoName,\n auditInfoUsers: userIds,\n },\n };\n }\n\n const result = await executeRequest(request);\n printOutput({ resolvedUsers, result }, { json: true });\n });\n}\n\nfunction addSharedOutputOptions(command: Command): void {\n command.addOption(new Option(\"--json\", \"Print JSON output\"));\n command.addOption(new Option(\"--raw\", \"Print the raw response payload\"));\n command.addOption(new Option(\"--table\", \"Print array responses in a basic table\"));\n command.addOption(new Option(\"--quiet\", \"Suppress stdout output\"));\n command.addOption(new Option(\"--dry-run\", \"Resolve request details without calling the API\"));\n}\n\nfunction buildRequest(definition: CommandDefinition, options: CommandOptions, body: unknown) {\n let resolvedPath = definition.api.path;\n const query: Record<string, string | undefined> = {};\n\n for (const parameter of definition.parameters) {\n const value = asOptionalString(options[toOptionKey(parameter.name)]);\n validateIdLikeInput(parameter.name, value, `parameter ${parameter.name}`);\n if (parameter.in === \"path\") {\n if (!value) {\n throw new Error(`Missing required path parameter: ${parameter.name}`);\n }\n\n resolvedPath = resolvedPath.replace(`{${parameter.name}}`, encodeURIComponent(value));\n continue;\n }\n\n if (parameter.in === \"query\") {\n query[parameter.name] = value;\n }\n }\n\n return {\n method: definition.api.method,\n path: resolvedPath,\n query,\n body,\n };\n}\n\nfunction sanitizeRequestBody(definition: CommandDefinition, body: unknown): unknown {\n if (body === undefined) {\n return undefined;\n }\n\n if (definition.module === \"workflow\" && definition.name === \"createForm\") {\n return sanitizeWorkflowCreateFormBody(body);\n }\n\n return body;\n}\n\nfunction sanitizeWorkflowCreateFormBody(body: unknown): unknown {\n if (!isRecord(body)) {\n return body;\n }\n\n const sanitized: Record<string, unknown> = { ...body };\n delete sanitized.formId;\n\n if (Array.isArray(body.fields)) {\n sanitized.fields = body.fields.map((field) => {\n if (!isRecord(field)) {\n return field;\n }\n\n const sanitizedField: Record<string, unknown> = { ...field };\n delete sanitizedField.fieldId;\n return sanitizedField;\n });\n }\n\n return sanitized;\n}\n\nfunction validateRequestBody(definition: CommandDefinition, body: unknown): void {\n if (!definition.hasRequestBody || body === undefined || !definition.requestBodySchema) {\n return;\n }\n\n const issues: string[] = [];\n validateValueAgainstSchema(body, definition.requestBodySchema, \"$\", issues);\n validateIdLikeBodyValues(body, \"$\", issues);\n validateCustomBodyRules(definition, body, issues);\n if (issues.length > 0) {\n throw new Error(`Request body validation failed for ${definition.module} ${definition.name}:\\n${issues.join(\"\\n\")}`);\n }\n}\n\nfunction validateCustomBodyRules(definition: CommandDefinition, body: unknown, issues: string[]): void {\n if (!isRecord(body)) {\n return;\n }\n\n if (definition.module === \"project\" && definition.name === \"createPlan\") {\n const type = body.type;\n if (typeof type !== \"string\" || !createPlanTypes.has(type)) {\n issues.push(\n `$.type: invalid module type ${JSON.stringify(type)}. Allowed values: ${Array.from(createPlanTypes).join(\", \")}`,\n );\n }\n }\n}\n\nfunction validateValueAgainstSchema(\n value: unknown,\n schema: RequestBodySchemaDefinition,\n path: string,\n issues: string[],\n): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (schema.type === \"object\" && isRecord(value)) {\n for (const requiredKey of schema.required ?? []) {\n if (!(requiredKey in value)) {\n issues.push(`${path}.${requiredKey}: missing required field`);\n }\n }\n\n for (const [propertyName, propertySchema] of Object.entries(schema.properties ?? {})) {\n if (propertyName in value) {\n validateValueAgainstSchema(value[propertyName], propertySchema, `${path}.${propertyName}`, issues);\n }\n }\n return;\n }\n\n if (schema.type === \"array\" && Array.isArray(value)) {\n value.forEach((item, index) => {\n if (schema.items) {\n validateValueAgainstSchema(item, schema.items, `${path}[${index}]`, issues);\n }\n });\n return;\n }\n\n if (schema.type === \"string\" && typeof value === \"string\") {\n validateStringByDescription(value, schema.description, path, issues);\n }\n}\n\nfunction validateIdLikeBodyValues(value: unknown, path: string, issues: string[]): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n validateIdLikeBodyValues(item, `${path}[${index}]`, issues);\n });\n return;\n }\n\n if (!isRecord(value)) {\n return;\n }\n\n for (const [key, fieldValue] of Object.entries(value)) {\n const nextPath = `${path}.${key}`;\n if (looksLikeIdField(key)) {\n const issue = getIdLikeValidationIssue(fieldValue, nextPath);\n if (issue) {\n issues.push(issue);\n }\n }\n\n validateIdLikeBodyValues(fieldValue, nextPath, issues);\n }\n}\n\nfunction validateIdLikeInput(name: string, value: string | undefined, label: string): void {\n if (!looksLikeIdField(name) || value === undefined) {\n return;\n }\n\n const issue = getIdLikeValidationIssue(value, label);\n if (issue) {\n throw new Error(issue);\n }\n}\n\nfunction looksLikeIdField(name: string): boolean {\n return /ids?$/i.test(name);\n}\n\nfunction getIdLikeValidationIssue(value: unknown, label: string): string | undefined {\n if (typeof value === \"number\") {\n return `${label}: invalid id value ${value}. Id fields must use string ids, not numbers.`;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n if (/^\\d+$/.test(trimmed)) {\n return `${label}: invalid id value \"${value}\". Id fields must not be pure digits.`;\n }\n\n if (/^\\d+(,\\d+)+$/.test(trimmed)) {\n return `${label}: invalid id value \"${value}\". Id lists must not contain pure numeric ids.`;\n }\n\n return undefined;\n }\n\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n const nestedIssue = getIdLikeValidationIssue(value[index], `${label}[${index}]`);\n if (nestedIssue) {\n return nestedIssue;\n }\n }\n }\n\n return undefined;\n}\n\nfunction validateStringByDescription(\n value: string,\n description: string | undefined,\n path: string,\n issues: string[],\n): void {\n if (!description) {\n return;\n }\n\n if (description.includes(\"仅支持yyyy-MM-dd、yyyy-MM-dd'T'HH:mm:ssXXX两种格式\")) {\n const isDateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(value);\n const isOffsetDateTime = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:Z|[+-]\\d{2}:\\d{2})$/.test(value);\n if (!isDateOnly && !isOffsetDateTime) {\n issues.push(`${path}: invalid format \"${value}\". Allowed formats: yyyy-MM-dd or yyyy-MM-dd'T'HH:mm:ssXXX`);\n }\n }\n}\n\nasync function readBody(options: CommandOptions): Promise<unknown> {\n if (options.body && options.bodyFile) {\n throw new Error(\"Use either --body or --body-file, not both.\");\n }\n\n if (options.body) {\n return JSON.parse(options.body);\n }\n\n if (options.bodyFile) {\n return JSON.parse(await readFile(options.bodyFile, \"utf8\"));\n }\n\n return undefined;\n}\n\nfunction optionName(parameterName: string): `--${string} <value>` {\n return `--${toKebabCase(parameterName)} <value>`;\n}\n\nfunction toOptionKey(parameterName: string): string {\n return toCamelCase(toKebabCase(parameterName));\n}\n\nfunction toKebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/_/g, \"-\")\n .toLowerCase();\n}\n\nfunction toCamelCase(value: string): string {\n return value.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction tokenize(input: string): string[] {\n const normalized = normalizeText(input);\n const tokens = normalized.split(/[\\s/_-]+/).filter(Boolean);\n const cjkRuns = normalized.match(/[\\p{Script=Han}]{2,}/gu) ?? [];\n\n for (const run of cjkRuns) {\n tokens.push(run);\n for (let index = 0; index < run.length - 1; index += 1) {\n tokens.push(run.slice(index, index + 2));\n }\n }\n\n return Array.from(new Set(tokens));\n}\n\nfunction scoreCommand(command: CommandDefinition, query: string, keywords: string[]): number {\n let score = 0;\n const haystack = normalizeText([\n command.name,\n ...command.aliases,\n command.summary,\n command.description,\n command.api?.path ?? \"\",\n ...command.keywords,\n ...command.parameters.map((parameter) => parameter.name),\n ...command.parameters.map((parameter) => parameter.description ?? \"\"),\n ].join(\" \"));\n const normalizedQuery = normalizeText(query);\n const matchedIntentKeywords = keywords.filter((keyword) => haystack.includes(keyword));\n\n if (normalizedQuery && haystack.includes(normalizedQuery)) {\n score += Math.max(8, normalizedQuery.length);\n }\n\n for (const keyword of matchedIntentKeywords) {\n score += keyword.length > 6 ? 6 : keyword.length > 3 ? 3 : 1;\n }\n\n score += scoreRsqIntentBoost(command, normalizedQuery, matchedIntentKeywords);\n\n for (const antiKeyword of command.antiKeywords ?? []) {\n const normalizedAntiKeyword = normalizeText(antiKeyword);\n if (!normalizedAntiKeyword) {\n continue;\n }\n\n if (normalizedQuery.includes(normalizedAntiKeyword) || haystack.includes(normalizedAntiKeyword)) {\n score -= normalizedAntiKeyword.length > 3 ? 4 : 2;\n }\n }\n\n return score;\n}\n\nconst rsqDomainKeywords = [\n \"日事清\",\n \"rsq\",\n \"rishiqing\",\n \"项目\",\n \"模块\",\n \"卡片\",\n \"任务\",\n \"流程\",\n \"流程应用\",\n \"流程实例\",\n \"步骤\",\n \"表单\",\n \"字段\",\n \"审核项\",\n \"审批\",\n \"多维表格\",\n \"数据表\",\n \"数据\",\n \"成员\",\n \"负责人\",\n \"执行人\",\n \"参与人\",\n].map(normalizeText);\n\nconst rsqModuleIntentKeywords: Record<string, string[]> = {\n project: [\"项目\", \"模块\", \"卡片\", \"项目成员\", \"项目下计划\", \"项目概览\"],\n task: [\"任务\", \"卡片\", \"执行人\", \"负责人\", \"参与人\", \"评论\", \"完成任务\"],\n workflow: [\"流程\", \"流程应用\", \"流程实例\", \"步骤\", \"表单\", \"字段\", \"审核项\", \"审批\"],\n datasheet: [\"多维表格\", \"数据表\", \"记录\", \"字段\", \"数据\"],\n contacts: [\"成员\", \"用户\", \"通讯录\", \"员工\", \"姓名解析\"],\n};\n\nconst actionIntentKeywords: Array<{ action: \"create\" | \"get\" | \"list\" | \"update\" | \"delete\" | \"complete\"; keywords: string[] }> = [\n { action: \"create\", keywords: [\"创建\", \"新建\", \"新增\", \"添加\", \"建一个\", \"建\"] },\n { action: \"get\", keywords: [\"查询\", \"查看\", \"获取\", \"详情\", \"查某个\", \"查一下\", \"查\"] },\n { action: \"list\", keywords: [\"列表\", \"全部\", \"批量获取\", \"有哪些\", \"列出\"] },\n { action: \"update\", keywords: [\"更新\", \"修改\", \"编辑\", \"设置\", \"调整\", \"更换\"] },\n { action: \"delete\", keywords: [\"删除\", \"移除\"] },\n { action: \"complete\", keywords: [\"完成\", \"提交\", \"通过\", \"拒绝\", \"关闭\"] },\n];\n\nfunction scoreRsqIntentBoost(command: CommandDefinition, normalizedQuery: string, matchedIntentKeywords: string[]): number {\n let score = 0;\n\n if (includesAny(normalizedQuery, rsqDomainKeywords)) {\n score += 2;\n }\n\n const moduleIntentKeywords = rsqModuleIntentKeywords[command.module] ?? [];\n const matchedModuleIntents = moduleIntentKeywords.filter((keyword) => normalizedQuery.includes(normalizeText(keyword)));\n\n if (matchedModuleIntents.length > 0) {\n score += 6 + matchedModuleIntents.length * 2;\n }\n\n if (command.module === \"workflow\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"表单字段\") || keyword.includes(\"字段值\"))) {\n score += 3;\n }\n\n if (command.module === \"task\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"负责人\") || keyword.includes(\"执行人\") || keyword.includes(\"参与人\"))) {\n score += 3;\n }\n\n if (command.module === \"project\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"模块\") || keyword.includes(\"卡片\"))) {\n score += 3;\n }\n\n if (command.module === \"datasheet\" && matchedIntentKeywords.some((keyword) => keyword.includes(\"多维表格\") || keyword.includes(\"数据表\") || keyword === \"数据\")) {\n score += 3;\n }\n\n score += scoreActionIntentBoost(command, normalizedQuery);\n\n return score;\n}\n\nfunction scoreActionIntentBoost(command: CommandDefinition, normalizedQuery: string): number {\n const matchedActions = actionIntentKeywords\n .filter(({ keywords }) => keywords.some((keyword) => normalizedQuery.includes(normalizeText(keyword))))\n .map(({ action }) => action);\n\n if (matchedActions.length === 0) {\n return 0;\n }\n\n const commandName = command.name.toLowerCase();\n let score = 0;\n\n for (const action of matchedActions) {\n if (commandName.startsWith(action)) {\n score += 5;\n continue;\n }\n\n if (action === \"get\" && commandName.startsWith(\"list\")) {\n score += 2;\n continue;\n }\n\n if (action === \"list\" && commandName.startsWith(\"get\")) {\n score += 1;\n continue;\n }\n }\n\n return score;\n}\n\nfunction normalizeText(value: string): string {\n return value.toLowerCase().trim();\n}\n\nfunction includesAny(value: string, patterns: string[]): boolean {\n return patterns.some((pattern) => value.includes(pattern));\n}\n\nfunction exposurePriority(command: CommandDefinition): number {\n switch (command.exposure) {\n case \"public\":\n return 3;\n case \"composed\":\n return 2;\n case \"internal\":\n return 1;\n default:\n return 0;\n }\n}\n\nfunction parsePositiveInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new InvalidArgumentError(\"Expected a positive integer.\");\n }\n\n return parsed;\n}\n\nfunction collectStrings(value: string, previous: string[]): string[] {\n previous.push(value);\n return previous;\n}\n\nasync function promptBaseUrl(currentBaseUrl: string): Promise<string> {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n try {\n const answer = (await rl.question(`Base URL domain [${currentBaseUrl}]: `)).trim();\n return normalizeBaseUrl(answer || currentBaseUrl);\n } finally {\n rl.close();\n }\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction ensureTrailingSlash(input: string): string {\n return input.endsWith(\"/\") ? input : `${input}/`;\n}\n\nfunction extractUserRows(payload: unknown): Array<{ userId: string; userName: string }> {\n if (\n typeof payload !== \"object\" ||\n payload === null ||\n !(\"data\" in payload) ||\n !Array.isArray((payload as { data?: unknown }).data)\n ) {\n throw new Error(\"Unexpected contacts response shape.\");\n }\n\n return (payload as { data: unknown[] }).data\n .filter(\n (row): row is { userId: string; userName: string } =>\n typeof row === \"object\" &&\n row !== null &&\n typeof (row as { userId?: unknown }).userId === \"string\" &&\n typeof (row as { userName?: unknown }).userName === \"string\",\n )\n .map((row) => ({\n userId: row.userId,\n userName: row.userName,\n }));\n}\n\nasync function resolveUserByName(userName: string): Promise<{\n userName: string;\n userId: string;\n matchType: \"exact\" | \"fuzzy\";\n matchedUserName?: string;\n}> {\n const payload = await executeRequest({\n method: \"GET\",\n path: \"/rsq/api/v1/contacts/list-all-user\",\n });\n\n const users = extractUserRows(payload);\n const exactMatches = users.filter((user) => user.userName === userName);\n\n if (exactMatches.length === 1) {\n return {\n userName,\n userId: exactMatches[0].userId,\n matchType: \"exact\",\n };\n }\n\n if (exactMatches.length > 1) {\n throw new Error(\n `Ambiguous userName \"${userName}\". Matched users: ${exactMatches.map((user) => `${user.userName}(${user.userId})`).join(\", \")}`,\n );\n }\n\n const fuzzyMatches = users.filter((user) => user.userName.includes(userName));\n if (fuzzyMatches.length === 1) {\n return {\n userName,\n userId: fuzzyMatches[0].userId,\n matchType: \"fuzzy\",\n matchedUserName: fuzzyMatches[0].userName,\n };\n }\n\n if (fuzzyMatches.length > 1) {\n throw new Error(\n `No exact match for \"${userName}\". Fuzzy matches: ${fuzzyMatches.map((user) => `${user.userName}(${user.userId})`).join(\", \")}`,\n );\n }\n\n throw new Error(`No user matched userName \"${userName}\".`);\n}\n\nfunction buildTaskUserByNameRequest(commandName: string, taskId: string, userId: string) {\n if (commandName === \"setTaskExecutorByName\") {\n return {\n method: \"PUT\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/executor`,\n body: {\n executorUserIds: [userId],\n },\n } as const;\n }\n\n if (commandName === \"setTaskResponsibleByName\") {\n return {\n method: \"PUT\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/responsible`,\n body: {\n responsibleId: userId,\n },\n } as const;\n }\n\n if (commandName === \"addTaskParticipantByName\") {\n return {\n method: \"POST\",\n path: `/rsq/api/v1/tasks/${encodeURIComponent(taskId)}/participants`,\n body: {\n participantUserIds: [userId],\n },\n } as const;\n }\n\n throw new Error(`Unsupported composed task command: ${commandName}`);\n}\n\nfunction parseNameList(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { z } from \"zod\";\n\nconst profileSchema = z.object({\n apiKey: z.string().min(1),\n});\n\nconst configSchema = z.object({\n activeProfile: z.string().min(1),\n profiles: z.record(z.string(), profileSchema),\n baseUrl: z.string().min(1).optional(),\n});\n\nconst appConfigSchema = z.object({\n baseUrl: z.string().min(1),\n});\n\nexport type RsqConfig = z.infer<typeof configSchema>;\nexport type RsqProfile = z.infer<typeof profileSchema>;\nexport type RsqAppConfig = z.infer<typeof appConfigSchema>;\n\nconst APP_CONFIG_FILE = \"rsq-cli.config.json\";\n\nfunction getConfigDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME;\n if (xdg) {\n return path.join(xdg, \"rsq-cli\");\n }\n\n return path.join(os.homedir(), \".config\", \"rsq-cli\");\n}\n\nexport function getConfigPath(): string {\n return path.join(getConfigDir(), \"config.json\");\n}\n\nexport function getAppConfigPath(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../\", APP_CONFIG_FILE),\n path.resolve(moduleDir, \"../../\", APP_CONFIG_FILE),\n path.resolve(process.cwd(), APP_CONFIG_FILE),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Missing ${APP_CONFIG_FILE}. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n\nexport async function readAppConfig(): Promise<RsqAppConfig> {\n const bundledFile = await readFile(getAppConfigPath(), \"utf8\");\n const bundled = appConfigSchema.parse(JSON.parse(bundledFile));\n const userConfig = await readConfig();\n\n return {\n baseUrl: userConfig?.baseUrl ? normalizeBaseUrl(userConfig.baseUrl) : bundled.baseUrl,\n };\n}\n\nexport async function readConfig(): Promise<RsqConfig | null> {\n try {\n const file = await readFile(getConfigPath(), \"utf8\");\n return configSchema.parse(JSON.parse(file));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n\n throw error;\n }\n}\n\nexport async function writeConfig(config: RsqConfig): Promise<void> {\n await mkdir(getConfigDir(), { recursive: true });\n await writeFile(getConfigPath(), `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function initConfig(apiKey: string): Promise<RsqConfig> {\n const config: RsqConfig = {\n activeProfile: \"default\",\n profiles: {\n default: {\n apiKey,\n },\n },\n };\n\n await writeConfig(config);\n return config;\n}\n\nexport async function setBaseUrl(baseUrl: string): Promise<RsqConfig> {\n const current = await readConfig();\n if (!current) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const next: RsqConfig = {\n ...current,\n baseUrl: normalizeBaseUrl(baseUrl),\n };\n\n await writeConfig(next);\n return next;\n}\n\nexport function normalizeBaseUrl(input: string): string {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new Error(\"baseUrl is required.\");\n }\n\n const candidate = /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\n let parsed: URL;\n try {\n parsed = new URL(candidate);\n } catch {\n throw new Error(`Invalid baseUrl: ${input}`);\n }\n\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n throw new Error(\"baseUrl must use http or https.\");\n }\n\n if (!parsed.hostname) {\n throw new Error(\"baseUrl hostname is required.\");\n }\n\n if (parsed.pathname !== \"/\" || parsed.search || parsed.hash) {\n throw new Error(\"baseUrl must be a domain only, without path, query, or hash.\");\n }\n\n return parsed.origin;\n}\n\nexport async function requireActiveProfile(): Promise<RsqProfile> {\n const config = await readConfig();\n if (!config) {\n throw new Error(\"Missing config. Run `rsq-cli config init` first.\");\n }\n\n const profile = config.profiles[config.activeProfile];\n if (!profile) {\n throw new Error(`Active profile \"${config.activeProfile}\" is missing.`);\n }\n\n return profile;\n}\n","import { existsSync } from \"node:fs\";\nimport { cp, mkdir, readdir } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type KnownInstallTarget = {\n name: string;\n label: string;\n description: string;\n dir: string;\n};\n\nexport type InstallOptions = {\n targets?: string[];\n extraDirs?: string[];\n dryRun?: boolean;\n};\n\nexport type InstallDestination = {\n kind: \"known\" | \"custom\";\n name: string;\n label: string;\n dir: string;\n};\n\nexport type InstallResult = {\n sourceDir: string;\n skills: string[];\n installed: Array<InstallDestination & { created: boolean }>;\n};\n\nconst KNOWN_INSTALL_TARGETS: KnownInstallTarget[] = [\n {\n name: \"codex\",\n label: \"Codex\",\n description: \"Install built-in skills into the default Codex skills directory\",\n dir: path.join(os.homedir(), \".agents\", \"skills\"),\n },\n {\n name: \"claude-code\",\n label: \"Claude Code\",\n description: \"Install built-in skills into the default Claude Code skills directory\",\n dir: path.join(os.homedir(), \".claude\", \"skills\"),\n },\n {\n name: \"openclaw\",\n label: \"OpenClaw\",\n description: \"Install built-in skills into the default OpenClaw skills directory\",\n dir: path.join(os.homedir(), \".openclaw\", \"skills\"),\n },\n];\n\nexport function listKnownInstallTargets(): KnownInstallTarget[] {\n return KNOWN_INSTALL_TARGETS.map((target) => ({ ...target }));\n}\n\nexport function resolveBundledSkillsDir(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../\", \"skills\"),\n path.resolve(moduleDir, \"../../\", \"skills\"),\n path.resolve(process.cwd(), \"skills\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Missing bundled skills directory. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n\nexport async function installBundledSkills(options: InstallOptions = {}): Promise<InstallResult> {\n const sourceDir = resolveBundledSkillsDir();\n const skills = await listBundledSkills(sourceDir);\n if (skills.length === 0) {\n throw new Error(`No bundled skills found in ${sourceDir}`);\n }\n\n const destinations = resolveInstallDestinations(options);\n const installed: Array<InstallDestination & { created: boolean }> = [];\n\n for (const destination of destinations) {\n const created = !existsSync(destination.dir);\n if (!options.dryRun) {\n await mkdir(destination.dir, { recursive: true });\n }\n\n for (const skill of skills) {\n const from = path.join(sourceDir, skill);\n const to = path.join(destination.dir, skill);\n if (!options.dryRun) {\n await cp(from, to, { recursive: true, force: true });\n }\n }\n\n installed.push({ ...destination, created });\n }\n\n return {\n sourceDir,\n skills,\n installed,\n };\n}\n\nfunction resolveInstallDestinations(options: InstallOptions): InstallDestination[] {\n const requestedTargets = options.targets?.flatMap(splitCsvValues).filter(Boolean) ?? [];\n const extraDirs = options.extraDirs?.flatMap(splitCsvValues).filter(Boolean) ?? [];\n const destinations: InstallDestination[] = [];\n const seen = new Set<string>();\n\n const targets = requestedTargets.length > 0\n ? requestedTargets.map(resolveKnownTargetByName)\n : listKnownInstallTargets();\n\n for (const target of targets) {\n pushUniqueDestination(\n destinations,\n seen,\n {\n kind: \"known\",\n name: target.name,\n label: target.label,\n dir: path.resolve(target.dir),\n },\n );\n }\n\n for (const dir of extraDirs) {\n pushUniqueDestination(\n destinations,\n seen,\n {\n kind: \"custom\",\n name: \"custom\",\n label: \"Custom\",\n dir: path.resolve(expandHome(dir)),\n },\n );\n }\n\n return destinations;\n}\n\nfunction resolveKnownTargetByName(name: string): KnownInstallTarget {\n const normalized = name.trim().toLowerCase();\n const found = KNOWN_INSTALL_TARGETS.find((target) => target.name === normalized);\n if (!found) {\n throw new Error(`Unknown install target: ${name}. Supported targets: ${KNOWN_INSTALL_TARGETS.map((target) => target.name).join(\", \")}`);\n }\n\n return found;\n}\n\nfunction pushUniqueDestination(destinations: InstallDestination[], seen: Set<string>, destination: InstallDestination): void {\n const key = path.normalize(destination.dir);\n if (seen.has(key)) {\n return;\n }\n\n seen.add(key);\n destinations.push(destination);\n}\n\nfunction expandHome(input: string): string {\n if (input === \"~\") {\n return os.homedir();\n }\n\n if (input.startsWith(\"~/\")) {\n return path.join(os.homedir(), input.slice(2));\n }\n\n return input;\n}\n\nfunction splitCsvValues(value: string): string[] {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nasync function listBundledSkills(sourceDir: string): Promise<string[]> {\n const entries = await readdir(sourceDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort((left, right) => left.localeCompare(right));\n}\n","import { readAppConfig, requireActiveProfile } from \"./config.js\";\n\nexport type RequestShape = {\n method: string;\n path: string;\n query?: Record<string, string | undefined>;\n body?: unknown;\n};\n\nexport async function executeRequest(shape: RequestShape): Promise<unknown> {\n const profile = await requireActiveProfile();\n const appConfig = await readAppConfig();\n const url = new URL(shape.path, ensureTrailingSlash(appConfig.baseUrl));\n\n for (const [key, value] of Object.entries(shape.query ?? {})) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n\n const headers: Record<string, string> = {\n \"X-Rsq-Api-key\": profile.apiKey,\n };\n\n let body: string | undefined;\n if (shape.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(shape.body);\n }\n\n const response = await fetch(url, {\n method: shape.method,\n headers,\n body,\n });\n\n const text = await response.text();\n const payload = tryParseJson(text);\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status} ${response.statusText}: ${typeof payload === \"string\" ? payload : JSON.stringify(payload)}`,\n );\n }\n\n return payload;\n}\n\nfunction ensureTrailingSlash(input: string): string {\n return input.endsWith(\"/\") ? input : `${input}/`;\n}\n\nfunction tryParseJson(text: string): unknown {\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","type OutputMode = \"json\" | \"raw\" | \"table\" | \"text\";\n\nexport type OutputOptions = {\n json?: boolean;\n raw?: boolean;\n table?: boolean;\n quiet?: boolean;\n};\n\nexport function resolveOutputMode(options: OutputOptions): OutputMode {\n if (options.raw) {\n return \"raw\";\n }\n\n if (options.table) {\n return \"table\";\n }\n\n if (options.json) {\n return \"json\";\n }\n\n return \"text\";\n}\n\nexport function printOutput(payload: unknown, options: OutputOptions): void {\n const mode = resolveOutputMode(options);\n\n if (mode === \"json\" || mode === \"raw\") {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n return;\n }\n\n if (mode === \"table\") {\n const rendered = renderTable(payload);\n process.stdout.write(`${rendered}\\n`);\n return;\n }\n\n if (typeof payload === \"string\") {\n process.stdout.write(`${payload}\\n`);\n return;\n }\n\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nfunction renderTable(payload: unknown): string {\n if (!Array.isArray(payload) || payload.length === 0) {\n return JSON.stringify(payload, null, 2);\n }\n\n if (payload.some((item) => typeof item !== \"object\" || item === null || Array.isArray(item))) {\n return JSON.stringify(payload, null, 2);\n }\n\n const rows = payload as Array<Record<string, unknown>>;\n const columns = Array.from(new Set(rows.flatMap((row) => Object.keys(row))));\n const widths = new Map<string, number>();\n\n for (const column of columns) {\n widths.set(\n column,\n Math.max(column.length, ...rows.map((row) => stringifyCell(row[column]).length)),\n );\n }\n\n const separator = columns.map((column) => \"-\".repeat(widths.get(column) ?? column.length)).join(\" \");\n const header = columns.map((column) => column.padEnd(widths.get(column) ?? column.length)).join(\" \");\n const lines = rows.map((row) =>\n columns.map((column) => stringifyCell(row[column]).padEnd(widths.get(column) ?? column.length)).join(\" \"),\n );\n\n return [header, separator, ...lines].join(\"\\n\");\n}\n\nfunction stringifyCell(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type ParameterDefinition = {\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n required: boolean;\n description?: string;\n schemaType?: string;\n};\n\nexport type OperationDefinition = {\n module: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n path: string;\n operationId: string;\n summary: string;\n description: string;\n parameters: ParameterDefinition[];\n hasRequestBody: boolean;\n requestBodySchema?: RequestBodySchemaDefinition;\n};\n\nexport type RequestBodySchemaDefinition = {\n type?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, RequestBodySchemaDefinition>;\n items?: RequestBodySchemaDefinition;\n};\n\ntype OpenApiDocument = {\n paths?: Record<string, Record<string, Record<string, unknown>>>;\n};\n\nconst operationIdOverrides: Record<string, string> = {\n \"GET /rsq/api/v1/workflow/process-infos/list/{flowApplicationId}\": \"listProcessInfosByFlowApplicationId\",\n \"GET /rsq/api/v1/projects\": \"listProjects\",\n};\n\nlet cachedOperations: OperationDefinition[] | null = null;\n\nexport function loadOperations(): OperationDefinition[] {\n if (cachedOperations) {\n return cachedOperations;\n }\n\n const documentPath = resolveOpenApiPath();\n const document = JSON.parse(readFileSync(documentPath, \"utf8\")) as OpenApiDocument;\n const operations: OperationDefinition[] = [];\n\n for (const [apiPath, item] of Object.entries(document.paths ?? {})) {\n for (const [method, rawOperation] of Object.entries(item)) {\n const normalizedMethod = method.toUpperCase();\n if (![\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(normalizedMethod)) {\n continue;\n }\n\n const operation = rawOperation as {\n operationId?: string;\n summary?: string;\n description?: string;\n tags?: string[];\n parameters?: Array<{\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n required?: boolean;\n description?: string;\n schema?: { type?: string };\n }>;\n requestBody?: {\n content?: {\n \"application/json\"?: {\n schema?: JsonSchemaLike;\n };\n };\n };\n };\n const operationId = resolveOperationId(apiPath, normalizedMethod, operation.operationId);\n const resolvedParameters = (operation.parameters ?? [])\n .filter((parameter) => parameter.name !== \"X-Rsq-Api-key\")\n .map((parameter) => ({\n name: parameter.name,\n in: parameter.in,\n required: Boolean(parameter.required),\n description: parameter.description,\n schemaType: parameter.schema?.type,\n }));\n\n operations.push({\n module: (operation.tags?.[0] ?? \"unknown\").toLowerCase(),\n method: normalizedMethod as OperationDefinition[\"method\"],\n path: apiPath,\n operationId,\n summary: operation.summary ?? \"\",\n description: operation.description ?? operation.summary ?? \"\",\n parameters: resolvedParameters,\n hasRequestBody: Boolean(operation.requestBody),\n requestBodySchema: extractRequestBodySchema(operation.requestBody),\n });\n }\n }\n\n cachedOperations = operations.sort((left, right) => left.operationId.localeCompare(right.operationId));\n return cachedOperations;\n}\n\ntype JsonSchemaLike = {\n type?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, JsonSchemaLike>;\n items?: JsonSchemaLike;\n};\n\nfunction extractRequestBodySchema(\n requestBody:\n | {\n content?: {\n \"application/json\"?: {\n schema?: JsonSchemaLike;\n };\n };\n }\n | undefined,\n): RequestBodySchemaDefinition | undefined {\n const schema = requestBody?.content?.[\"application/json\"]?.schema;\n if (!schema) {\n return undefined;\n }\n\n return normalizeJsonSchema(schema);\n}\n\nfunction normalizeJsonSchema(schema: JsonSchemaLike): RequestBodySchemaDefinition {\n return {\n type: schema.type,\n description: schema.description,\n required: schema.required,\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [key, normalizeJsonSchema(value)]),\n )\n : undefined,\n items: schema.items ? normalizeJsonSchema(schema.items) : undefined,\n };\n}\n\nfunction resolveOperationId(apiPath: string, method: string, operationId: string | undefined): string {\n const override = operationIdOverrides[`${method} ${apiPath}`];\n if (override) {\n return override;\n }\n\n return operationId ?? `${method}:${apiPath}`;\n}\n\nfunction resolveOpenApiPath(): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(moduleDir, \"../rishiqing.openapi.json\"),\n path.resolve(moduleDir, \"../../rishiqing.openapi.json\"),\n path.resolve(process.cwd(), \"rishiqing.openapi.json\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Unable to locate rishiqing.openapi.json. Checked: ${candidates.join(\", \")}`);\n }\n\n return found;\n}\n","import type { Exposure, RsqModule } from \"./types.js\";\n\ntype Override = {\n aliases?: string[];\n keywords?: string[];\n antiKeywords?: string[];\n description?: string;\n exposure?: Exposure;\n};\n\nexport const moduleOrder: RsqModule[] = [\"datasheet\", \"workflow\", \"contacts\", \"project\", \"task\"];\n\nexport const moduleDescriptions: Record<RsqModule, string> = {\n datasheet: \"Datasheet APIs\",\n workflow: \"Workflow APIs\",\n contacts: \"Contacts APIs\",\n project: \"Project APIs\",\n task: \"Task APIs\",\n};\n\nexport const operationOverrides: Record<string, Override> = {\n listTeamDatasheets: {\n aliases: [\"list-datasheets\"],\n keywords: [\"datasheet\", \"table\", \"list team datasheets\"],\n },\n getDatasheetFields: {\n aliases: [\"get-fields\"],\n keywords: [\"datasheet fields\", \"column definitions\"],\n },\n getDatasheetRecords: {\n aliases: [\"list-records\"],\n keywords: [\"datasheet records\", \"rows\", \"query rows\"],\n },\n createDatasheetRecords: {\n aliases: [\"create-records\"],\n keywords: [\"create datasheet record\", \"insert rows\"],\n },\n updateDatasheetRecords: {\n aliases: [\"update-records\"],\n keywords: [\"update datasheet record\", \"modify rows\"],\n },\n deleteDatasheetRecords: {\n aliases: [\"delete-records\"],\n keywords: [\"delete datasheet record\", \"remove rows\"],\n },\n listFlowApplicationTemplates: {\n aliases: [\"list-templates\"],\n keywords: [\"workflow templates\", \"flow templates\", \"流程模板\", \"审批模板\", \"模板列表\"],\n },\n listFlowApplications: {\n aliases: [\"list-apps\"],\n keywords: [\"list workflow applications\", \"list flow apps\", \"流程应用列表\", \"审批流程列表\"],\n },\n listProcessInfosByFlowApplicationId: {\n aliases: [\"list-processes\"],\n keywords: [\"获取已发起的流程列表\", \"流程实例列表\", \"已发起流程列表\", \"运行中的流程列表\", \"list process infos\"],\n },\n createFlowApplication: {\n aliases: [\"create-app\"],\n keywords: [\"create workflow application\", \"new flow app\", \"创建流程应用\", \"新建流程应用\", \"新建审批流程\"],\n },\n createStepInfo: {\n aliases: [\"create-step\"],\n keywords: [\"创建步骤配置\", \"新增步骤\", \"新建步骤\", \"流程步骤\", \"审批步骤\", \"step config\"],\n },\n updateStepInfo: {\n aliases: [\"update-step\"],\n keywords: [\"更新步骤配置\", \"修改步骤配置\", \"编辑步骤\", \"修改步骤名称\", \"step config\"],\n },\n createForm: {\n aliases: [\"create-form\"],\n keywords: [\"创建表单配置\", \"新增表单\", \"新建表单\", \"表单结构\", \"表单字段定义\", \"workflow form\"],\n },\n updateForm: {\n aliases: [\"update-form\"],\n keywords: [\"更新表单配置\", \"修改表单配置\", \"编辑表单\", \"修改表单字段定义\", \"workflow form\"],\n },\n createAuditInfo: {\n aliases: [\"create-audit\"],\n keywords: [\"创建审核项配置\", \"新增审核项\", \"新建审核节点\", \"添加审核人配置\", \"audit config\"],\n },\n updateAuditInfo: {\n aliases: [\"update-audit\"],\n keywords: [\"更新审核项配置\", \"修改审核项配置\", \"编辑审核节点\", \"修改审核人配置\", \"audit config\"],\n },\n updateProcessInfoStep: {\n aliases: [\"update-running-step\", \"set-running-step-executor\"],\n keywords: [\n \"修改运行中的步骤属性\",\n \"修改进行中步骤的执行人\",\n \"修改步骤执行人\",\n \"调整步骤执行人\",\n \"设置步骤执行人\",\n \"运行中步骤执行人\",\n \"步骤执行人\",\n \"步骤限定时间\",\n \"deadTime\",\n \"userIds\",\n ],\n antiKeywords: [\"字段值\", \"表单字段\", \"fieldValue\", \"fieldId\"],\n },\n updateProcessInfoAudit: {\n aliases: [\"update-running-audit\", \"set-running-audit-users\"],\n keywords: [\"修改运行中的审核项属性\", \"修改审核人\", \"调整审核人\", \"运行中审核人\", \"audit user\"],\n antiKeywords: [\"执行人\", \"字段值\", \"表单字段\", \"步骤状态\"],\n description: \"调整运行中审核项的审核人。这个接口用于审核项,不用于步骤状态流转。\",\n exposure: \"internal\",\n },\n updateProcessInfoStepField: {\n aliases: [\"update-step-field-value\", \"set-step-field-value\"],\n keywords: [\n \"修改步骤表单中的字段值\",\n \"修改字段值\",\n \"设置字段值\",\n \"填写字段\",\n \"更新表单字段值\",\n \"步骤字段值\",\n \"表单字段值\",\n \"fieldValue\",\n ],\n antiKeywords: [\"执行人\", \"审核人\", \"负责人\", \"参与人\", \"成员\", \"deadTime\", \"限定时间\"],\n exposure: \"internal\",\n },\n getProcessInfoStep: {\n aliases: [\"get-running-step\"],\n keywords: [\"查询运行中步骤\", \"查看步骤详情\", \"查看进行中步骤\", \"running step detail\"],\n },\n listStepInfosByFlowApplicationId: {\n aliases: [\"list-steps\"],\n keywords: [\"查询步骤列表\", \"流程步骤列表\", \"审批步骤列表\", \"list workflow steps\"],\n },\n startProcessInfosBatch: {\n aliases: [\"start-process-batch\"],\n keywords: [\"批量发起流程\", \"批量启动流程实例\", \"批量提交流程\", \"start workflow process batch\"],\n },\n getProcessInfo: {\n aliases: [\"get-process\"],\n keywords: [\"process info\", \"workflow instance\", \"流程实例\", \"审批实例\", \"查看流程实例\"],\n },\n listAllUsers: {\n aliases: [\"list-users\"],\n keywords: [\"contacts\", \"users\", \"employees\"],\n },\n createProject: {\n aliases: [\"create\"],\n keywords: [\"create project\", \"new project\", \"创建项目\", \"新建项目\"],\n },\n listProjects: {\n aliases: [\"list\"],\n keywords: [\"获取项目列表\", \"项目列表\", \"全部项目\", \"查询项目列表\", \"list projects\"],\n },\n getProjectById: {\n aliases: [\"get\"],\n keywords: [\"project detail\", \"get project\", \"项目详情\", \"查看项目\"],\n },\n listPlansByProjectIds: {\n aliases: [\"list-plans\"],\n keywords: [\"plans\", \"project plans\", \"模块列表\", \"项目模块\", \"查询模块\"],\n },\n createPlan: {\n aliases: [\"create-plan\"],\n keywords: [\"创建模块\", \"新增模块\", \"新建模块\", \"项目模块\", \"project plan\", \"task\", \"statistic\", \"overview\", \"folder\", \"risk\", \"workflow\", \"datasheet\", \"deliverable\"],\n description:\n \"创建项目下的模块。type 仅支持这些值:task、statistic、overview、folder、risk、workflow、datasheet、deliverable。\",\n },\n updatePlan: {\n aliases: [\"update-plan\"],\n keywords: [\"修改模块\", \"更新模块\", \"编辑模块\", \"project plan\"],\n },\n createCard: {\n aliases: [\"create-card\"],\n keywords: [\"创建卡片\", \"新增卡片\", \"新建卡片\", \"模块卡片\", \"project card\"],\n },\n updateCard: {\n aliases: [\"update-card\"],\n keywords: [\"修改卡片\", \"更新卡片\", \"编辑卡片\", \"project card\"],\n },\n updateProject: {\n aliases: [\"update-project\"],\n keywords: [\"修改项目\", \"更新项目\", \"编辑项目\", \"project info\"],\n },\n createTask: {\n aliases: [\"create\"],\n keywords: [\"create task\", \"new task\", \"创建任务\", \"新建任务\"],\n },\n getTaskById: {\n aliases: [\"get\"],\n keywords: [\"task detail\", \"get task\", \"任务详情\", \"查看任务\"],\n },\n updateTask: {\n aliases: [\"update\"],\n keywords: [\"update task\", \"edit task\", \"修改任务\", \"编辑任务\", \"更新任务信息\"],\n },\n deleteTask: {\n aliases: [\"delete\"],\n keywords: [\"delete task\", \"remove task\", \"删除任务\", \"移除任务\"],\n },\n getTaskComments: {\n aliases: [\"comments\"],\n keywords: [\"task comments\", \"list task comments\", \"任务评论\", \"评论列表\", \"查看评论\"],\n antiKeywords: [\"发表评论\", \"提交评论\", \"回复任务\"],\n },\n createTaskComment: {\n aliases: [\"comment\"],\n keywords: [\"create task comment\", \"add task comment\", \"发表评论\", \"提交评论\", \"回复任务\"],\n antiKeywords: [\"评论列表\", \"查看评论\"],\n },\n completeTask: {\n aliases: [\"complete\"],\n keywords: [\"完成任务\", \"打钩任务\", \"标记完成\", \"close task\"],\n antiKeywords: [\"创建任务\", \"修改任务\", \"发表评论\", \"评论列表\"],\n },\n updateProjectMember: {\n aliases: [\"update-project-member\"],\n keywords: [\"修改项目成员\", \"设置项目成员\", \"添加项目成员\", \"项目成员\", \"project member\"],\n antiKeywords: [\"创建项目\", \"项目信息\", \"项目模块\", \"卡片\"],\n exposure: \"internal\",\n },\n updateProcessInfoStepStatus: {\n aliases: [\"update-running-step-status\"],\n keywords: [\n \"流转流程步骤状态\",\n \"提交步骤\",\n \"完成步骤\",\n \"通过步骤\",\n \"拒绝步骤\",\n \"跳过步骤\",\n \"步骤状态\",\n \"审批通过\",\n \"审批拒绝\",\n ],\n antiKeywords: [\"执行人\", \"审核项id\", \"auditInfoId\", \"processInfoAuditId\", \"审核人\", \"字段值\", \"表单字段\"],\n description:\n \"对运行中的步骤执行状态动作。无论 action 是什么,path 参数 processInfoStepId 始终传步骤 id,不要传审核项 id。\",\n exposure: \"internal\",\n },\n updateTaskExecutor: {\n aliases: [\"update-executor\"],\n keywords: [\"修改任务执行人\", \"设置执行人\", \"调整执行人\", \"task executor\"],\n antiKeywords: [\"负责人\", \"参与人\", \"评论\"],\n exposure: \"composed\",\n },\n updateTaskResponsible: {\n aliases: [\"update-responsible\"],\n keywords: [\"修改任务负责人\", \"设置负责人\", \"调整负责人\", \"task responsible\"],\n antiKeywords: [\"执行人\", \"参与人\", \"评论\"],\n exposure: \"composed\",\n },\n addTaskParticipant: {\n aliases: [\"add-participant\"],\n keywords: [\"添加任务参与人\", \"增加参与人\", \"设置参与人\", \"task participant\"],\n antiKeywords: [\"执行人\", \"负责人\", \"评论\"],\n exposure: \"composed\",\n },\n};\n","import { loadOperations } from \"../core/openapi.js\";\nimport { moduleDescriptions, moduleOrder, operationOverrides } from \"./overrides.js\";\nimport type { CommandDefinition, Exposure, RsqModule } from \"./types.js\";\nimport type { ParameterDefinition, RequestBodySchemaDefinition } from \"../core/openapi.js\";\n\nlet cachedRegistry: CommandDefinition[] | null = null;\n\nexport function getRegistry(): CommandDefinition[] {\n if (cachedRegistry) {\n return cachedRegistry;\n }\n\n const openApiCommands: CommandDefinition[] = loadOperations()\n .filter((operation): operation is typeof operation & { module: RsqModule } => moduleOrder.includes(operation.module as RsqModule))\n .map((operation) => {\n const override = operationOverrides[operation.operationId] ?? {};\n const exposure = override.exposure ?? defaultExposure(operation.operationId);\n return {\n module: operation.module as RsqModule,\n name: operation.operationId,\n aliases: override.aliases ?? [],\n summary: operation.summary || operation.operationId,\n description: override.description ?? operation.description ?? operation.summary ?? operation.operationId,\n api: {\n method: operation.method,\n path: operation.path,\n },\n parameters: operation.parameters.map(annotateParameterDescription),\n hasRequestBody: operation.hasRequestBody,\n requestBodySchema: annotateRequestBodySchema(operation.requestBodySchema),\n keywords: dedupe([\n operation.operationId,\n operation.summary,\n operation.path,\n ...pathKeywords(operation.path),\n ...(override.keywords ?? []),\n ]),\n antiKeywords: dedupe(override.antiKeywords ?? []),\n examples: buildExamples(operation.module as RsqModule, operation.operationId, override.aliases ?? []),\n exposure,\n idempotent: operation.method === \"GET\",\n outputMode: \"json\",\n } satisfies CommandDefinition;\n });\n\n cachedRegistry = [...openApiCommands, ...buildCustomCommands()];\n\n return cachedRegistry;\n}\n\nexport function getPublicRegistry(): CommandDefinition[] {\n return getRegistry().filter((command) => command.exposure === \"public\");\n}\n\nexport function getModuleDefinitions() {\n return moduleOrder.map((module) => ({\n name: module,\n description: moduleDescriptions[module],\n }));\n}\n\nexport function findCommand(moduleName: string, commandName: string): CommandDefinition | undefined {\n const normalized = commandName.toLowerCase();\n return getRegistry().find(\n (command) =>\n command.module === moduleName &&\n (command.name.toLowerCase() === normalized || command.aliases.some((alias) => alias.toLowerCase() === normalized)),\n );\n}\n\nfunction buildExamples(module: RsqModule, name: string, aliases: string[]): string[] {\n const examples = [`rsq-cli ${module} ${name} --json`];\n if (aliases[0]) {\n examples.push(`rsq-cli ${module} ${aliases[0]} --json`);\n }\n return examples;\n}\n\nfunction annotateParameterDescription(parameter: ParameterDefinition): ParameterDefinition {\n if (!looksLikeIdField(parameter.name)) {\n return parameter;\n }\n\n return {\n ...parameter,\n description: appendIdRule(parameter.description),\n };\n}\n\nfunction annotateRequestBodySchema(\n schema: RequestBodySchemaDefinition | undefined,\n): RequestBodySchemaDefinition | undefined {\n if (!schema) {\n return undefined;\n }\n\n return {\n ...schema,\n description: schema.description,\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n {\n ...annotateRequestBodySchema(value),\n description: looksLikeIdField(key) ? appendIdRule(value.description) : value.description,\n },\n ]),\n )\n : undefined,\n items: schema.items ? annotateRequestBodySchema(schema.items) : undefined,\n };\n}\n\nfunction appendIdRule(description: string | undefined): string {\n const rule = \"必须传前缀+uuid风格的字符串 id,不要传数字类型 id,也不要传纯数字字符串。\";\n if (!description) {\n return rule;\n }\n\n return description.includes(rule) ? description : `${description} | ${rule}`;\n}\n\nfunction looksLikeIdField(name: string): boolean {\n return /ids?$/i.test(name);\n}\n\nfunction defaultExposure(operationId: string): Exposure {\n if (operationId.startsWith(\"list\") || operationId.startsWith(\"get\") || operationId.startsWith(\"create\") || operationId.startsWith(\"update\") || operationId.startsWith(\"delete\")) {\n return \"public\";\n }\n\n return \"composed\";\n}\n\nfunction pathKeywords(apiPath: string): string[] {\n return apiPath\n .split(\"/\")\n .filter(Boolean)\n .flatMap((segment) => [segment, segment.replace(/[{}]/g, \"\"), segment.replace(/-/g, \" \")]);\n}\n\nfunction dedupe(values: Array<string | undefined>): string[] {\n return Array.from(new Set(values.filter((value): value is string => Boolean(value))));\n}\n\nfunction buildCustomCommands(): CommandDefinition[] {\n return [\n {\n module: \"contacts\",\n name: \"resolveUser\",\n aliases: [\"resolve-user\"],\n summary: \"根据用户名称解析 userId\",\n description: \"先查询全部用户,再按 userName 匹配,返回唯一命中的 userId。\",\n api: {\n method: \"GET\",\n path: \"/rsq/api/v1/contacts/list-all-user\",\n },\n parameters: [\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"需要解析的人员名称\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\n \"resolve user\",\n \"userName to userId\",\n \"根据姓名找 userId\",\n \"resolve-user\",\n \"contacts\",\n ],\n antiKeywords: [\"列表\", \"全部用户\"],\n examples: [\n \"rsq-cli contacts resolveUser --user-name 张三 --json\",\n \"rsq-cli contacts resolve-user --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: true,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"setTaskExecutorByName\",\n aliases: [\"set-executor-by-name\"],\n summary: \"根据人员名称设置任务执行人\",\n description: \"先按 userName 解析 userId,再更新任务执行人。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/tasks/{taskId}/executor\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"执行人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task executor by name\", \"set executor by name\", \"根据姓名设置执行人\"],\n antiKeywords: [\"负责人\", \"参与人\", \"评论\"],\n examples: [\n \"rsq-cli task setTaskExecutorByName --task-id task_demo --user-name 张三 --json\",\n \"rsq-cli task set-executor-by-name --task-id task_demo --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"setTaskResponsibleByName\",\n aliases: [\"set-responsible-by-name\"],\n summary: \"根据人员名称设置任务负责人\",\n description: \"先按 userName 解析 userId,再更新任务负责人。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/tasks/{taskId}/responsible\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"负责人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task responsible by name\", \"set responsible by name\", \"根据姓名设置负责人\"],\n antiKeywords: [\"执行人\", \"参与人\", \"评论\"],\n examples: [\n \"rsq-cli task setTaskResponsibleByName --task-id task_demo --user-name 李四 --json\",\n \"rsq-cli task set-responsible-by-name --task-id task_demo --user-name 李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"task\",\n name: \"addTaskParticipantByName\",\n aliases: [\"add-participant-by-name\"],\n summary: \"根据人员名称添加任务参与人\",\n description: \"先按 userName 解析 userId,再添加任务参与人。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/tasks/{taskId}/participants\",\n },\n parameters: [\n {\n name: \"taskId\",\n in: \"path\",\n required: true,\n description: \"taskId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"参与人姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"task participant by name\", \"add participant by name\", \"根据姓名添加参与人\"],\n antiKeywords: [\"执行人\", \"负责人\", \"评论\"],\n examples: [\n \"rsq-cli task addTaskParticipantByName --task-id task_demo --user-name 王五 --json\",\n \"rsq-cli task add-participant-by-name --task-id task_demo --user-name 王五 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"project\",\n name: \"setProjectMemberByName\",\n aliases: [\"set-member-by-name\"],\n summary: \"根据人员名称设置项目成员\",\n description: \"先按 userName 解析 userId,再更新项目成员。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/projects/{projectId}/members\",\n },\n parameters: [\n {\n name: \"projectId\",\n in: \"path\",\n required: true,\n description: \"projectId\",\n schemaType: \"string\",\n },\n {\n name: \"userName\",\n in: \"query\",\n required: true,\n description: \"项目成员姓名\",\n schemaType: \"string\",\n },\n ],\n hasRequestBody: false,\n keywords: [\"project member by name\", \"set project member by name\", \"根据姓名设置项目成员\"],\n examples: [\n \"rsq-cli project setProjectMemberByName --project-id proj_demo --user-name 张三 --json\",\n \"rsq-cli project set-member-by-name --project-id proj_demo --user-name 张三 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"workflow\",\n name: \"createAuditInfoByNames\",\n aliases: [\"create-audit-by-names\"],\n summary: \"根据人员名称创建审核项配置\",\n description: \"先按 userName 解析 userId,再创建审核项配置。\",\n api: {\n method: \"POST\",\n path: \"/rsq/api/v1/workflow/audit-infos\",\n },\n parameters: [\n { name: \"flowApplicationId\", in: \"query\", required: true, description: \"流程应用id\", schemaType: \"string\" },\n { name: \"stepInfoId\", in: \"query\", required: true, description: \"步骤配置id\", schemaType: \"string\" },\n { name: \"auditInfoName\", in: \"query\", required: true, description: \"审核项名称\", schemaType: \"string\" },\n { name: \"userNames\", in: \"query\", required: true, description: \"审核人名称列表,逗号分隔\", schemaType: \"string\" },\n { name: \"frontAuditInfoId\", in: \"query\", required: false, description: \"前一个审核项id\", schemaType: \"string\" },\n ],\n hasRequestBody: false,\n keywords: [\"create audit by names\", \"workflow audit users by name\", \"根据姓名创建审核项\"],\n examples: [\n \"rsq-cli workflow createAuditInfoByNames --flow-application-id flow_demo --step-info-id step_demo --audit-info-name 部门审批 --user-names 张三,李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n {\n module: \"workflow\",\n name: \"updateAuditInfoByNames\",\n aliases: [\"update-audit-by-names\"],\n summary: \"根据人员名称更新审核项配置\",\n description: \"先按 userName 解析 userId,再更新审核项配置。\",\n api: {\n method: \"PUT\",\n path: \"/rsq/api/v1/workflow/audit-infos/{auditInfoId}\",\n },\n parameters: [\n { name: \"auditInfoId\", in: \"path\", required: true, description: \"审核项配置id\", schemaType: \"string\" },\n { name: \"auditInfoName\", in: \"query\", required: true, description: \"审核项名称\", schemaType: \"string\" },\n { name: \"userNames\", in: \"query\", required: true, description: \"审核人名称列表,逗号分隔\", schemaType: \"string\" },\n ],\n hasRequestBody: false,\n keywords: [\"update audit by names\", \"workflow audit users by name\", \"根据姓名更新审核项\"],\n examples: [\n \"rsq-cli workflow updateAuditInfoByNames --audit-info-id audit_demo --audit-info-name 部门审批 --user-names 张三,李四 --json\",\n ],\n exposure: \"composed\",\n idempotent: false,\n outputMode: \"json\",\n },\n ];\n}\n","import { getRegistry } from \"./index.js\";\n\nexport function getSkillContract() {\n return {\n skill: {\n name: \"rishiqing\",\n summary: \"识别日事清领域自然语言请求,并路由到 rsq-cli 的对应模块与命令。\",\n },\n trigger: {\n domain: \"rishiqing\",\n when: [\n \"当用户在对话中提到日事清、rsq、rishiqing 时,默认这是日事清操作请求。\",\n \"当用户提到项目、模块、卡片、任务、流程、多维表格、数据、流程应用、流程实例、步骤、表单、字段、审核项、审批、成员、负责人、执行人、参与人等领域词时,也优先按日事清请求处理。\",\n ],\n keywords: [\n \"日事清\",\n \"rsq\",\n \"rishiqing\",\n \"项目\",\n \"模块\",\n \"卡片\",\n \"任务\",\n \"流程\",\n \"流程应用\",\n \"流程实例\",\n \"步骤\",\n \"表单\",\n \"字段\",\n \"审核项\",\n \"审批\",\n \"多维表格\",\n \"数据\",\n \"成员\",\n \"负责人\",\n \"执行人\",\n \"参与人\",\n ],\n },\n routing: {\n moduleHints: [\n {\n module: \"project\",\n intents: [\"项目\", \"模块\", \"项目成员\", \"项目概览\", \"项目下计划\"],\n },\n {\n module: \"task\",\n intents: [\"任务\", \"卡片\", \"执行人\", \"负责人\", \"参与人\", \"任务状态\"],\n },\n {\n module: \"workflow\",\n intents: [\"流程应用\", \"流程实例\", \"步骤\", \"表单\", \"字段\", \"审核项\", \"审批流\"],\n },\n {\n module: \"datasheet\",\n intents: [\"多维表格\", \"数据表\", \"记录\", \"字段\", \"数据\"],\n },\n {\n module: \"contacts\",\n intents: [\"按姓名解析用户\", \"查成员\", \"查用户\"],\n },\n ],\n },\n globalRules: [\n \"遇到日事清领域短语时,先识别为 rsq-cli 操作意图,不要把它当成泛化项目管理请求。\",\n \"不确定具体命令时,先调用 rsq-cli search;确认候选命令后再调用 rsq-cli describe 阅读参数和 requestBodySchema。\",\n \"涉及创建、更新、绑定、分配等写操作时,优先使用 --dry-run --json 预览。\",\n \"所有 id 字段都必须传前缀+uuid风格的字符串,例如 flowApp_019d6c0c2f03770b8b789ec313076e64。\",\n \"不要传数字类型 id,也不要传纯数字字符串 id。\",\n \"调用前优先阅读参数说明和 requestBodySchema 中的字段说明,再组装参数。\",\n ],\n tools: getRegistry().map((command) => ({\n tool: `${command.module}.${command.aliases[0] ?? command.name}`,\n canonical: `${command.module}.${command.name}`,\n summary: command.summary,\n exposure: command.exposure,\n keywords: command.keywords,\n examples: command.examples,\n input: {\n parameters: command.parameters.map((parameter) => ({\n name: parameter.name,\n location: parameter.in,\n required: parameter.required,\n type: parameter.schemaType ?? \"string\",\n description: parameter.description,\n })),\n acceptsBody: command.hasRequestBody,\n requestBodySchema: command.requestBodySchema,\n },\n })),\n };\n}\n"],"mappings":"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","names":["readFile","existsSync","mkdir","os","path","fileURLToPath","existsSync","path","fileURLToPath","ensureTrailingSlash","path","looksLikeIdField","readFile"]}
|