@qzsy/zhidao-skill 0.0.0-stage → 0.1.1
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/SKILL.md +63 -0
- package/dist/catalog.d.ts +81 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +214 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +212 -0
- package/dist/cli.js.map +1 -0
- package/dist/form.d.ts +17 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +37 -0
- package/dist/form.js.map +1 -0
- package/dist/http.d.ts +74 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +94 -0
- package/dist/http.js.map +1 -0
- package/dist/login.d.ts +43 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +87 -0
- package/dist/login.js.map +1 -0
- package/dist/session.d.ts +77 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +133 -0
- package/dist/session.js.map +1 -0
- package/flows.md +51 -0
- package/openapi/zhidao.openapi.yml +242072 -0
- package/package.json +36 -6
- package/README.md +0 -3
package/SKILL.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zhidao-skill
|
|
3
|
+
description: >-
|
|
4
|
+
操作至道 OA(泉州五中办公软件,wzoa.qz5z.com):登录、请假和审批流程的引导与提交。
|
|
5
|
+
用 Node.js fetch 按 OpenAPI 调用后台。没有 Cookie 时向用户索取账号密码,把图形验证码以 base64 图片交给用户输入后再登录。
|
|
6
|
+
用户提到至道、OA、泉州五中、请假、审批、待办、验证码或办公流程时使用。
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 至道 OA
|
|
10
|
+
|
|
11
|
+
操作泉州五中至道办公软件。接口以包内的 OpenAPI 文档为准,用下面的命令调用,不要手写另一套客户端,也不要猜验证码。
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx --yes @qzsy/zhidao-skill <command>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
标准输出是一行 JSON。
|
|
18
|
+
|
|
19
|
+
## 登录
|
|
20
|
+
|
|
21
|
+
每次业务调用前先 `status`。
|
|
22
|
+
|
|
23
|
+
`loggedIn` 为 false,或 `hasCookie` 为 false 时,按顺序做:
|
|
24
|
+
|
|
25
|
+
1. 向用户要账号和密码。密码只传给这一次 `login`,不要写进文件,不要在后续回复里复述。
|
|
26
|
+
2. 执行 `captcha`。把返回的 `image`(`data:image/...;base64,...`)放进回复,让用户看见图:
|
|
27
|
+
|
|
28
|
+
```markdown
|
|
29
|
+

|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
界面渲染不了 data URL 时,读取返回的 `file` 再把图片发给用户。
|
|
33
|
+
|
|
34
|
+
3. 请用户看图后输入验证码文字。不要自己识别,也不要复用上一张图。
|
|
35
|
+
4. 执行 `login --user <账号> --password <密码> --captcha <用户输入>`。密码也可以放在环境变量 `ZHIDAO_PASSWORD`,这时省略 `--password`。
|
|
36
|
+
5. `ok` 为 false 时,把 `message` 告诉用户。验证码不对就重新 `captcha`(沿用同一份 Cookie),再请用户输入新验证码。
|
|
37
|
+
|
|
38
|
+
`captcha` 会把上游 Set-Cookie 写入本机会话。`login` 必须用这份 Cookie,否则验证码对不上。会话文件在 `status.sessionFile`,默认是用户目录 `.zhidao-oa/session.json`。里面没有密码。
|
|
39
|
+
|
|
40
|
+
已有秘钥时可以不登录:环境变量 `ZHIDAO_COOKIE`(`name=value; name2=value2`)和 `ZHIDAO_TOKEN`。后台地址用 `ZHIDAO_BASE_URL`,默认 `https://wzoa.qz5z.com`。
|
|
41
|
+
|
|
42
|
+
## 请假和审批
|
|
43
|
+
|
|
44
|
+
用户要请假、报批、看待办或提交流程时,先读 [flows.md](flows.md)。再用 `find`、`describe` 核对路径和字段。
|
|
45
|
+
|
|
46
|
+
引导方式:
|
|
47
|
+
|
|
48
|
+
1. 先问清是哪一种:教师考勤请假、学生请假、临时请假,或 OA 流程单(我的工作)。
|
|
49
|
+
2. `describe /具体路径`,只向用户询问返回的字段。说明用字段的 `description`,不要发明文档里没有的必填项。
|
|
50
|
+
3. 列表类接口可以先 `call` 查出可选数据,再让用户选。
|
|
51
|
+
4. 路径含 `save`、`submit`、`update`、`delete`、`audit` 时,先把将要提交的路径和字段列给用户,得到明确同意后再 `call`。
|
|
52
|
+
5. `call` 返回 `NEED_LOGIN` 时回到登录,不要编造 Cookie。
|
|
53
|
+
6. 把响应里的 `msg` 用白话告诉用户。`code === 0` 才算成功。
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx --yes @qzsy/zhidao-skill find 请假
|
|
57
|
+
npx --yes @qzsy/zhidao-skill describe /tableRecord/calcLeaveDays
|
|
58
|
+
npx --yes @qzsy/zhidao-skill call POST /tableRecord/calcLeaveDays --body "{\"startTime\":\"2026-10-13 08:00:00\",\"endTime\":\"2026-10-14 18:00:00\",\"includeWeekend\":\"0\"}"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
`--body` 是 JSON。命令会按后台表单编码发送,并自动带上 `idToken` 和 Cookie。
|
|
62
|
+
|
|
63
|
+
其它业务路径同样用 `find` 定位后再 `call`。不确定字段时先 `describe`,不要直接提交。
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 一条 OpenAPI 操作。
|
|
3
|
+
* 路径和方法与后台真实地址一致。
|
|
4
|
+
*/
|
|
5
|
+
export interface CatalogOperation {
|
|
6
|
+
/**
|
|
7
|
+
* 上游路径。
|
|
8
|
+
* 例如 `/tableRecord/submitTaskNew`。
|
|
9
|
+
*/
|
|
10
|
+
path: string;
|
|
11
|
+
/**
|
|
12
|
+
* HTTP 方法。
|
|
13
|
+
* 大写。
|
|
14
|
+
*/
|
|
15
|
+
method: string;
|
|
16
|
+
/**
|
|
17
|
+
* OpenAPI operationId。
|
|
18
|
+
* 与 SDK 方法名对应。
|
|
19
|
+
*/
|
|
20
|
+
operationId: string;
|
|
21
|
+
/**
|
|
22
|
+
* 中文摘要。
|
|
23
|
+
* 来自扫描时生成的 summary。
|
|
24
|
+
*/
|
|
25
|
+
summary: string;
|
|
26
|
+
/**
|
|
27
|
+
* 请求体 schema 名。
|
|
28
|
+
* 没有请求体时为空。
|
|
29
|
+
*/
|
|
30
|
+
bodySchema?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 请求体里的一个字段。
|
|
34
|
+
* 描述取 schema 里的第一行说明。
|
|
35
|
+
*/
|
|
36
|
+
export interface SchemaField {
|
|
37
|
+
/**
|
|
38
|
+
* 字段名。
|
|
39
|
+
* 提交时用这个名字。
|
|
40
|
+
*/
|
|
41
|
+
name: string;
|
|
42
|
+
/**
|
|
43
|
+
* 字段说明。
|
|
44
|
+
* 可能为空。
|
|
45
|
+
*/
|
|
46
|
+
description: string;
|
|
47
|
+
/**
|
|
48
|
+
* 类型或引用名。
|
|
49
|
+
* 例如 `string`、`Scalar`。
|
|
50
|
+
*/
|
|
51
|
+
type: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 找到仓库里的 `openapi/zhidao.openapi.yml`。
|
|
55
|
+
* `ZHIDAO_OPENAPI` 可以指定别的文件。
|
|
56
|
+
*/
|
|
57
|
+
export declare function openApiPath(): string;
|
|
58
|
+
/**
|
|
59
|
+
* 按关键词查找操作。
|
|
60
|
+
* 每个词都要出现在路径、摘要或 operationId 里,最多返回 30 条。
|
|
61
|
+
*/
|
|
62
|
+
export declare function findOperations(query: string): CatalogOperation[];
|
|
63
|
+
/**
|
|
64
|
+
* 读取某个路径上的全部方法和请求字段。
|
|
65
|
+
* 路径要对上 OpenAPI 里的写法,动态段保留 `{suffix}`。
|
|
66
|
+
*/
|
|
67
|
+
export declare function describePath(path: string): {
|
|
68
|
+
operations: CatalogOperation[];
|
|
69
|
+
fields: Record<string, SchemaField[]>;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* 扫 YAML 里的 paths。
|
|
73
|
+
* 摘要和请求体引用都在操作块的固定缩进上。
|
|
74
|
+
*/
|
|
75
|
+
export declare function parseOperations(text: string): CatalogOperation[];
|
|
76
|
+
/**
|
|
77
|
+
* 读取某个 schema 的 properties。
|
|
78
|
+
* 说明只取第一行,避免把整段注释带进对话。
|
|
79
|
+
*/
|
|
80
|
+
export declare function readSchemaFields(text: string, name: string): SchemaField[];
|
|
81
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAapC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAYhE;AASD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;CAAE,CAUpH;AAUD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA0EhE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAmC1E"}
|
package/dist/catalog.js
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 从仓库里的 OpenAPI YAML 查找接口。
|
|
3
|
+
* 只扫路径、摘要和请求体字段,不引入 YAML 解析库。
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
/**
|
|
9
|
+
* 找到仓库里的 `openapi/zhidao.openapi.yml`。
|
|
10
|
+
* `ZHIDAO_OPENAPI` 可以指定别的文件。
|
|
11
|
+
*/
|
|
12
|
+
export function openApiPath() {
|
|
13
|
+
const override = process.env.ZHIDAO_OPENAPI?.trim();
|
|
14
|
+
if (override)
|
|
15
|
+
return override;
|
|
16
|
+
const starts = [process.cwd(), dirname(fileURLToPath(import.meta.url))];
|
|
17
|
+
for (const start of starts) {
|
|
18
|
+
let dir = start;
|
|
19
|
+
for (let i = 0; i < 6; i += 1) {
|
|
20
|
+
const candidate = join(dir, "openapi", "zhidao.openapi.yml");
|
|
21
|
+
if (existsSync(candidate))
|
|
22
|
+
return candidate;
|
|
23
|
+
dir = dirname(dir);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
throw new Error("没有找到 openapi/zhidao.openapi.yml");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 按关键词查找操作。
|
|
30
|
+
* 每个词都要出现在路径、摘要或 operationId 里,最多返回 30 条。
|
|
31
|
+
*/
|
|
32
|
+
export function findOperations(query) {
|
|
33
|
+
const tokens = query.trim().toLowerCase().split(/\s+/).filter(Boolean);
|
|
34
|
+
if (!tokens.length)
|
|
35
|
+
return [];
|
|
36
|
+
const hits = loadOperations().filter((operation) => {
|
|
37
|
+
const haystack = `${operation.method} ${operation.path} ${operation.summary} ${operation.operationId}`.toLowerCase();
|
|
38
|
+
return tokens.every((token) => haystack.includes(token));
|
|
39
|
+
});
|
|
40
|
+
return hits
|
|
41
|
+
.map((operation, index) => ({ operation, index, score: rankOperation(operation.path) }))
|
|
42
|
+
.sort((a, b) => b.score - a.score || a.index - b.index)
|
|
43
|
+
.slice(0, 30)
|
|
44
|
+
.map((item) => item.operation);
|
|
45
|
+
}
|
|
46
|
+
function rankOperation(path) {
|
|
47
|
+
let score = 0;
|
|
48
|
+
if (/^\/(leave|teacherAttendance|tableRecord|stuAttendance|desk)\b/.test(path))
|
|
49
|
+
score += 5;
|
|
50
|
+
if (/\/(save|submit|list|edit|audit|handle)/.test(path))
|
|
51
|
+
score += 2;
|
|
52
|
+
return score;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 读取某个路径上的全部方法和请求字段。
|
|
56
|
+
* 路径要对上 OpenAPI 里的写法,动态段保留 `{suffix}`。
|
|
57
|
+
*/
|
|
58
|
+
export function describePath(path) {
|
|
59
|
+
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
60
|
+
const operations = loadOperations().filter((operation) => operation.path === normalized);
|
|
61
|
+
const text = readSpec();
|
|
62
|
+
const fields = {};
|
|
63
|
+
for (const operation of operations) {
|
|
64
|
+
if (!operation.bodySchema || fields[operation.bodySchema])
|
|
65
|
+
continue;
|
|
66
|
+
fields[operation.bodySchema] = readSchemaFields(text, operation.bodySchema);
|
|
67
|
+
}
|
|
68
|
+
return { operations, fields };
|
|
69
|
+
}
|
|
70
|
+
function loadOperations() {
|
|
71
|
+
return parseOperations(readSpec());
|
|
72
|
+
}
|
|
73
|
+
function readSpec() {
|
|
74
|
+
return readFileSync(openApiPath(), "utf8");
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 扫 YAML 里的 paths。
|
|
78
|
+
* 摘要和请求体引用都在操作块的固定缩进上。
|
|
79
|
+
*/
|
|
80
|
+
export function parseOperations(text) {
|
|
81
|
+
const operations = [];
|
|
82
|
+
let section = "none";
|
|
83
|
+
let path = "";
|
|
84
|
+
let method = "";
|
|
85
|
+
let operationId = "";
|
|
86
|
+
let summary = "";
|
|
87
|
+
let bodySchema = "";
|
|
88
|
+
let inRequest = false;
|
|
89
|
+
const flush = () => {
|
|
90
|
+
if (!path || !method)
|
|
91
|
+
return;
|
|
92
|
+
operations.push({
|
|
93
|
+
path,
|
|
94
|
+
method: method.toUpperCase(),
|
|
95
|
+
operationId,
|
|
96
|
+
summary,
|
|
97
|
+
bodySchema: bodySchema || undefined,
|
|
98
|
+
});
|
|
99
|
+
method = "";
|
|
100
|
+
operationId = "";
|
|
101
|
+
summary = "";
|
|
102
|
+
bodySchema = "";
|
|
103
|
+
inRequest = false;
|
|
104
|
+
};
|
|
105
|
+
for (const line of text.split(/\r?\n/)) {
|
|
106
|
+
if (line === "paths:") {
|
|
107
|
+
section = "paths";
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (section === "paths" && line === "components:") {
|
|
111
|
+
flush();
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
if (section !== "paths")
|
|
115
|
+
continue;
|
|
116
|
+
const pathMatch = /^ {2}"(\/[^"]+)":\s*$/.exec(line) ?? /^ {2}(\/[^:\s]+):\s*$/.exec(line);
|
|
117
|
+
if (pathMatch?.[1]) {
|
|
118
|
+
flush();
|
|
119
|
+
path = pathMatch[1];
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const methodMatch = /^ {4}(get|post|put|patch|delete|head):\s*$/.exec(line);
|
|
123
|
+
if (methodMatch?.[1]) {
|
|
124
|
+
flush();
|
|
125
|
+
method = methodMatch[1];
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (!method)
|
|
129
|
+
continue;
|
|
130
|
+
const summaryMatch = /^ {6}summary: (.*)$/.exec(line);
|
|
131
|
+
if (summaryMatch?.[1]) {
|
|
132
|
+
summary = unquote(summaryMatch[1]);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const idMatch = /^ {6}operationId: (.*)$/.exec(line);
|
|
136
|
+
if (idMatch?.[1]) {
|
|
137
|
+
operationId = unquote(idMatch[1]);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (line === " requestBody:") {
|
|
141
|
+
inRequest = true;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (line === " responses:") {
|
|
145
|
+
inRequest = false;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (inRequest && !bodySchema) {
|
|
149
|
+
const ref = /#\/components\/schemas\/([A-Za-z0-9_]+)/.exec(line);
|
|
150
|
+
if (ref?.[1])
|
|
151
|
+
bodySchema = ref[1];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
flush();
|
|
155
|
+
return operations;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 读取某个 schema 的 properties。
|
|
159
|
+
* 说明只取第一行,避免把整段注释带进对话。
|
|
160
|
+
*/
|
|
161
|
+
export function readSchemaFields(text, name) {
|
|
162
|
+
const lines = text.split(/\r?\n/);
|
|
163
|
+
const start = lines.findIndex((line) => line === ` ${name}:`);
|
|
164
|
+
if (start < 0)
|
|
165
|
+
return [];
|
|
166
|
+
const fields = [];
|
|
167
|
+
let inProps = false;
|
|
168
|
+
for (let i = start + 1; i < lines.length; i += 1) {
|
|
169
|
+
const line = lines[i] ?? "";
|
|
170
|
+
if (/^ {4}[A-Za-z0-9_]+:\s*$/.test(line))
|
|
171
|
+
break;
|
|
172
|
+
if (line === " properties:") {
|
|
173
|
+
inProps = true;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (!inProps)
|
|
177
|
+
continue;
|
|
178
|
+
if (/^ {6}[A-Za-z0-9_]+:\s*$/.test(line))
|
|
179
|
+
break;
|
|
180
|
+
const prop = /^ {8}([A-Za-z0-9_]+):\s*$/.exec(line);
|
|
181
|
+
if (!prop?.[1])
|
|
182
|
+
continue;
|
|
183
|
+
let description = "";
|
|
184
|
+
let type = "";
|
|
185
|
+
for (let j = i + 1; j < lines.length; j += 1) {
|
|
186
|
+
const inner = lines[j] ?? "";
|
|
187
|
+
if (/^ {8}[A-Za-z0-9_]+:\s*$/.test(inner) || /^ {6}[A-Za-z]/.test(inner))
|
|
188
|
+
break;
|
|
189
|
+
const typeMatch = /^ {10}type: (.+)$/.exec(inner);
|
|
190
|
+
if (typeMatch?.[1])
|
|
191
|
+
type = unquote(typeMatch[1]);
|
|
192
|
+
const refMatch = /^ {10}"\$ref": "#\/components\/schemas\/([^"]+)"/.exec(inner);
|
|
193
|
+
if (refMatch?.[1])
|
|
194
|
+
type = refMatch[1];
|
|
195
|
+
if (!description) {
|
|
196
|
+
const inline = /^ {10}description: (?!\|)(.*)$/.exec(inner);
|
|
197
|
+
if (inline?.[1])
|
|
198
|
+
description = unquote(inline[1]);
|
|
199
|
+
if (/^ {10}description: \|-?\s*$/.test(inner))
|
|
200
|
+
description = (lines[j + 1] ?? "").trim();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
fields.push({ name: prop[1], description, type });
|
|
204
|
+
}
|
|
205
|
+
return fields;
|
|
206
|
+
}
|
|
207
|
+
function unquote(value) {
|
|
208
|
+
const text = value.trim();
|
|
209
|
+
if ((text.startsWith('"') && text.endsWith('"')) || (text.startsWith("'") && text.endsWith("'"))) {
|
|
210
|
+
return text.slice(1, -1);
|
|
211
|
+
}
|
|
212
|
+
return text;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* 至道 OA 技能命令。
|
|
4
|
+
* 标准输出是 JSON,供代理读取后引导用户。
|
|
5
|
+
*/
|
|
6
|
+
import { copyFileSync, mkdirSync } from "node:fs";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { dirname, join } from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { request } from "./http.js";
|
|
11
|
+
import { fetchCaptcha, login } from "./login.js";
|
|
12
|
+
import { describePath, findOperations, openApiPath } from "./catalog.js";
|
|
13
|
+
import { assignBase, clearLogin, hasCookie, isLoggedIn, loadSession, saveSession, sessionPath, tokenPreview } from "./session.js";
|
|
14
|
+
async function main() {
|
|
15
|
+
const [command, ...rest] = process.argv.slice(2);
|
|
16
|
+
const flags = parseArgs(rest);
|
|
17
|
+
if (!command || command === "help" || command === "--help" || command === "-h") {
|
|
18
|
+
emit(help());
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (command === "install")
|
|
22
|
+
return emit(installSkill());
|
|
23
|
+
if (command === "status")
|
|
24
|
+
return emit(status(flags));
|
|
25
|
+
if (command === "captcha")
|
|
26
|
+
return emit(await captcha(flags));
|
|
27
|
+
if (command === "login")
|
|
28
|
+
return emit(await signIn(flags));
|
|
29
|
+
if (command === "logout")
|
|
30
|
+
return emit(signOut(flags));
|
|
31
|
+
if (command === "find")
|
|
32
|
+
return emit(find(flags));
|
|
33
|
+
if (command === "describe")
|
|
34
|
+
return emit(describe(flags));
|
|
35
|
+
if (command === "call")
|
|
36
|
+
return emit(await call(flags));
|
|
37
|
+
emit({ ok: false, message: `未知命令 ${command}`, help: help() }, 1);
|
|
38
|
+
}
|
|
39
|
+
function installSkill() {
|
|
40
|
+
const root = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
41
|
+
const dest = join(homedir(), ".claude", "skills", "zhidao-skill");
|
|
42
|
+
mkdirSync(dest, { recursive: true });
|
|
43
|
+
copyFileSync(join(root, "SKILL.md"), join(dest, "SKILL.md"));
|
|
44
|
+
copyFileSync(join(root, "flows.md"), join(dest, "flows.md"));
|
|
45
|
+
return {
|
|
46
|
+
ok: true,
|
|
47
|
+
dest,
|
|
48
|
+
message: "已安装到 Claude Code。新开一轮对话后,提到至道 OA、请假或审批就会按该技能执行。",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function status(flags) {
|
|
52
|
+
const session = loadSession();
|
|
53
|
+
assignBase(session, flags.values.base);
|
|
54
|
+
return {
|
|
55
|
+
ok: true,
|
|
56
|
+
loggedIn: isLoggedIn(session),
|
|
57
|
+
hasCookie: hasCookie(session),
|
|
58
|
+
cookieNames: Object.keys(session.cookies),
|
|
59
|
+
token: tokenPreview(session.token),
|
|
60
|
+
baseUrl: session.baseUrl,
|
|
61
|
+
sessionFile: sessionPath(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async function captcha(flags) {
|
|
65
|
+
const session = loadSession();
|
|
66
|
+
assignBase(session, flags.values.base);
|
|
67
|
+
const image = await fetchCaptcha(session);
|
|
68
|
+
return {
|
|
69
|
+
ok: true,
|
|
70
|
+
loggedIn: isLoggedIn(session),
|
|
71
|
+
hasCookie: hasCookie(session),
|
|
72
|
+
cookieNames: Object.keys(session.cookies),
|
|
73
|
+
image: image.image,
|
|
74
|
+
mediaType: image.mediaType,
|
|
75
|
+
file: image.file,
|
|
76
|
+
message: "把 image 作为图片展示给用户,请用户看图后输入验证码。不要自己猜测验证码。",
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async function signIn(flags) {
|
|
80
|
+
const session = loadSession();
|
|
81
|
+
assignBase(session, flags.values.base);
|
|
82
|
+
const userName = flags.values.user ?? "";
|
|
83
|
+
const password = flags.values.password || process.env.ZHIDAO_PASSWORD || "";
|
|
84
|
+
const captchaCode = flags.values.captcha ?? "";
|
|
85
|
+
if (!hasCookie(session)) {
|
|
86
|
+
return { ok: false, code: "NEED_CAPTCHA", message: "还没有验证码 Cookie。先执行 captcha,把图片给用户,再用用户输入的验证码登录。" };
|
|
87
|
+
}
|
|
88
|
+
if (!userName || !password || !captchaCode) {
|
|
89
|
+
return { ok: false, message: "登录需要账号、密码和用户输入的验证码。" };
|
|
90
|
+
}
|
|
91
|
+
const payload = await login(session, userName, password, captchaCode, flags.values.priority || "1");
|
|
92
|
+
const code = payload.code;
|
|
93
|
+
const ok = code === 0 && Boolean(session.token);
|
|
94
|
+
return {
|
|
95
|
+
ok,
|
|
96
|
+
code,
|
|
97
|
+
message: typeof payload.msg === "string" ? payload.msg : ok ? "登录成功" : "登录失败",
|
|
98
|
+
loggedIn: isLoggedIn(session),
|
|
99
|
+
hasCookie: hasCookie(session),
|
|
100
|
+
token: tokenPreview(session.token),
|
|
101
|
+
captchaMsg: payload.captchaMsg,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function signOut(flags) {
|
|
105
|
+
const session = loadSession();
|
|
106
|
+
assignBase(session, flags.values.base);
|
|
107
|
+
clearLogin(session);
|
|
108
|
+
saveSession(session);
|
|
109
|
+
return { ok: true, loggedIn: false, hasCookie: false, message: "已清除本机 Cookie 和令牌。" };
|
|
110
|
+
}
|
|
111
|
+
function find(flags) {
|
|
112
|
+
const query = flags.positionals.join(" ").trim();
|
|
113
|
+
if (!query)
|
|
114
|
+
return { ok: false, message: "find 后面写关键词,例如 find 请假。" };
|
|
115
|
+
const operations = findOperations(query);
|
|
116
|
+
return { ok: true, openapi: openApiPath(), query, count: operations.length, operations };
|
|
117
|
+
}
|
|
118
|
+
function describe(flags) {
|
|
119
|
+
const path = flags.positionals[0];
|
|
120
|
+
if (!path)
|
|
121
|
+
return { ok: false, message: "describe 后面写 OpenAPI 路径,例如 describe /tableRecord/calcLeaveDays。" };
|
|
122
|
+
const described = describePath(path);
|
|
123
|
+
if (!described.operations.length)
|
|
124
|
+
return { ok: false, message: `OpenAPI 里没有 ${path}` };
|
|
125
|
+
return { ok: true, ...described };
|
|
126
|
+
}
|
|
127
|
+
async function call(flags) {
|
|
128
|
+
const method = flags.positionals[0]?.toUpperCase();
|
|
129
|
+
const path = flags.positionals[1];
|
|
130
|
+
if (!method || !path)
|
|
131
|
+
return { ok: false, message: "call 的用法是 call METHOD /path --body {...}。" };
|
|
132
|
+
const session = loadSession();
|
|
133
|
+
assignBase(session, flags.values.base);
|
|
134
|
+
if (!isLoggedIn(session)) {
|
|
135
|
+
return {
|
|
136
|
+
ok: false,
|
|
137
|
+
code: "NEED_LOGIN",
|
|
138
|
+
hasCookie: hasCookie(session),
|
|
139
|
+
message: "没有可用的 Cookie 或登录令牌。先 captcha,向用户要账号、密码和验证码,再 login。",
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const body = flags.values.body ? JSON.parse(flags.values.body) : undefined;
|
|
143
|
+
const query = queryFrom(flags.lists.query ?? []);
|
|
144
|
+
const result = await request(session, { method, path, query, body, withToken: true });
|
|
145
|
+
saveSession(session);
|
|
146
|
+
const text = new TextDecoder().decode(result.bytes);
|
|
147
|
+
let payload = text;
|
|
148
|
+
try {
|
|
149
|
+
payload = text ? JSON.parse(text) : null;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
payload = text.slice(0, 500);
|
|
153
|
+
}
|
|
154
|
+
const code = payload && typeof payload === "object" && !Array.isArray(payload) ? payload.code : undefined;
|
|
155
|
+
return { ok: result.status >= 200 && result.status < 300 && code !== undefined ? code === 0 : result.status >= 200 && result.status < 300, status: result.status, path, method, body: payload };
|
|
156
|
+
}
|
|
157
|
+
function queryFrom(pairs) {
|
|
158
|
+
const query = {};
|
|
159
|
+
for (const pair of pairs) {
|
|
160
|
+
const eq = pair.indexOf("=");
|
|
161
|
+
if (eq <= 0)
|
|
162
|
+
continue;
|
|
163
|
+
query[pair.slice(0, eq)] = pair.slice(eq + 1);
|
|
164
|
+
}
|
|
165
|
+
return query;
|
|
166
|
+
}
|
|
167
|
+
function parseArgs(argv) {
|
|
168
|
+
const flags = { present: new Set(), values: {}, lists: {}, positionals: [] };
|
|
169
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
170
|
+
const token = argv[i] ?? "";
|
|
171
|
+
if (!token.startsWith("--")) {
|
|
172
|
+
flags.positionals.push(token);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const name = token.slice(2);
|
|
176
|
+
const next = argv[i + 1];
|
|
177
|
+
flags.present.add(name);
|
|
178
|
+
if (next === undefined || next.startsWith("--")) {
|
|
179
|
+
flags.values[name] = "true";
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
flags.values[name] = next;
|
|
183
|
+
flags.lists[name] = [...(flags.lists[name] ?? []), next];
|
|
184
|
+
i += 1;
|
|
185
|
+
}
|
|
186
|
+
return flags;
|
|
187
|
+
}
|
|
188
|
+
function help() {
|
|
189
|
+
return {
|
|
190
|
+
ok: true,
|
|
191
|
+
commands: [
|
|
192
|
+
"install",
|
|
193
|
+
"status",
|
|
194
|
+
"captcha",
|
|
195
|
+
"login --user 账号 --password 密码 --captcha 验证码",
|
|
196
|
+
"logout",
|
|
197
|
+
"find 关键词",
|
|
198
|
+
"describe /path",
|
|
199
|
+
"call METHOD /path --body {...} --query key=value",
|
|
200
|
+
],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function emit(payload, code = 0) {
|
|
204
|
+
process.stdout.write(`${JSON.stringify(payload)}\n`);
|
|
205
|
+
if (code)
|
|
206
|
+
process.exitCode = code;
|
|
207
|
+
}
|
|
208
|
+
main().catch((error) => {
|
|
209
|
+
const message = error instanceof Error ? error.message : "命令失败";
|
|
210
|
+
emit({ ok: false, message }, 1);
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/form.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 按至道页面的 jQuery 方式编码表单。
|
|
3
|
+
* JSON 请求体在发出去之前先过这里。
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 表单里的一个值。
|
|
7
|
+
* 数组和对象会展开成 `key[]`、`key[child]`。
|
|
8
|
+
*/
|
|
9
|
+
export type FormValue = string | number | boolean | null | undefined | FormValue[] | {
|
|
10
|
+
[key: string]: FormValue;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* 把对象编码成查询串。
|
|
14
|
+
* `undefined` 省略,`null` 编码成空字符串。
|
|
15
|
+
*/
|
|
16
|
+
export declare function encodeForm(data: Record<string, FormValue> | undefined): string;
|
|
17
|
+
//# sourceMappingURL=form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAEjH;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,GAAG,MAAM,CAS9E"}
|