opencode-cron-job 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -103
- package/README.zh-CN.md +81 -0
- package/dist/index.d.ts +1 -4
- package/dist/index.js +121 -52
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,28 +3,17 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/opencode-cron-job)
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
|
|
6
|
-
**OpenCode plugin** — schedule recurring prompts via a simple markdown file.
|
|
7
|
-
**OpenCode 插件** — 通过简单的 markdown 文件定时执行 prompt。
|
|
6
|
+
**OpenCode plugin** — schedule recurring prompts via a simple markdown file.
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
> ⚠️ **Alpha** — 此为初版,未经充分测试,请谨慎使用。
|
|
8
|
+
[中文文档](./README.zh-CN.md)
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
## English
|
|
15
|
-
|
|
16
|
-
### Overview
|
|
10
|
+
> ⚠️ **Alpha** — Tested on Windows with terminal, desktop, and ACP server. Use at your own risk.
|
|
17
11
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
### How it works
|
|
12
|
+
---
|
|
21
13
|
|
|
22
|
-
|
|
23
|
-
2. Write tasks using simple markdown format
|
|
24
|
-
3. OpenCode loads the plugin automatically → reads the file → starts timers
|
|
25
|
-
4. When a timer fires, the prompt is injected into your session
|
|
14
|
+
## Install
|
|
26
15
|
|
|
27
|
-
|
|
16
|
+
Add to your OpenCode config:
|
|
28
17
|
|
|
29
18
|
```json
|
|
30
19
|
{
|
|
@@ -32,18 +21,16 @@
|
|
|
32
21
|
}
|
|
33
22
|
```
|
|
34
23
|
|
|
35
|
-
OpenCode auto-installs npm plugins on startup.
|
|
36
|
-
|
|
37
|
-
### Usage
|
|
24
|
+
OpenCode auto-installs npm plugins on startup — no manual download needed.
|
|
38
25
|
|
|
39
|
-
|
|
26
|
+
## Usage
|
|
40
27
|
|
|
41
|
-
|
|
28
|
+
Just tell the AI agent what you need in natural language. The agent manages `.cron-job/tasks.md` for you through built-in tools:
|
|
42
29
|
|
|
30
|
+
- "Remind me to write a daily report at 9am"
|
|
31
|
+
- "Run a code review every Friday at 3pm"
|
|
32
|
+
- "Check server health every 30 minutes"
|
|
43
33
|
- "List all my cron jobs"
|
|
44
|
-
- "Run the code review task now"
|
|
45
|
-
- "Delete the backup task"
|
|
46
|
-
- "Reload the cron tasks from the file"
|
|
47
34
|
|
|
48
35
|
The agent calls the following tools internally — you don't need to use them directly:
|
|
49
36
|
|
|
@@ -53,10 +40,18 @@ The agent calls the following tools internally — you don't need to use them di
|
|
|
53
40
|
| `cron_list` | List all scheduled tasks |
|
|
54
41
|
| `cron_run` | Run a task immediately |
|
|
55
42
|
| `cron_delete` | Delete a task |
|
|
43
|
+
| `cron_once` | Schedule a one-shot delay task |
|
|
56
44
|
|
|
57
|
-
|
|
45
|
+
## How it works
|
|
58
46
|
|
|
59
|
-
|
|
47
|
+
1. **Plugin starts** → reads `.cron-job/tasks.md`, parses each `##` task block
|
|
48
|
+
2. **Schedules** → registers a `node-cron` timer for each valid cron expression
|
|
49
|
+
3. **Timer fires** → plugin finds the most recent session in the current workspace via API
|
|
50
|
+
4. **Injects prompt** → sends the prompt directly into the session — no TUI input, no interruption
|
|
51
|
+
|
|
52
|
+
## Task file format
|
|
53
|
+
|
|
54
|
+
`.cron-job/tasks.md` is auto-managed by the agent, but here's the format for reference:
|
|
60
55
|
|
|
61
56
|
```markdown
|
|
62
57
|
# Cron Tasks
|
|
@@ -74,87 +69,13 @@ Each section starting with `##` is a task. Supported fields:
|
|
|
74
69
|
- `cron` — standard 5-field cron expression (supports 6-field with seconds)
|
|
75
70
|
- `prompt` — the prompt text to inject when the timer fires
|
|
76
71
|
|
|
77
|
-
|
|
72
|
+
## Update
|
|
78
73
|
|
|
79
74
|
```bash
|
|
80
75
|
# Clear plugin cache and restart OpenCode
|
|
81
76
|
rm -rf ~/.cache/opencode/node_modules/opencode-cron-job
|
|
82
77
|
```
|
|
83
78
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
## 中文
|
|
87
|
-
|
|
88
|
-
### 概述
|
|
89
|
-
|
|
90
|
-
`opencode-cron-job` 是一个 OpenCode 插件,自动读取项目根目录下的 `.cron-job/tasks.md` 文件,按 cron 表达式定时向当前会话注入 prompt。无需 MCP 服务、无需 HTTP API、无需 sidecar 进程,完全在 OpenCode 内部运行。
|
|
91
|
-
|
|
92
|
-
### 工作方式
|
|
93
|
-
|
|
94
|
-
1. 在项目根目录创建 `.cron-job/tasks.md`
|
|
95
|
-
2. 用简单的 markdown 格式编写任务
|
|
96
|
-
3. OpenCode 启动时自动加载插件 → 读取文件 → 启动定时器
|
|
97
|
-
4. 到时间自动向会话注入 prompt
|
|
98
|
-
|
|
99
|
-
### 安装
|
|
100
|
-
|
|
101
|
-
```json
|
|
102
|
-
{
|
|
103
|
-
"plugin": ["opencode-cron-job@latest"]
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
OpenCode 启动时自动安装 npm 插件。
|
|
108
|
-
|
|
109
|
-
### 使用方式
|
|
110
|
-
|
|
111
|
-
编辑 `.cron-job/tasks.md` 定义定时任务,插件启动时自动加载。
|
|
112
|
-
|
|
113
|
-
要管理任务,直接对 AI 说自然语言即可,例如:
|
|
114
|
-
|
|
115
|
-
- "列出所有周期任务"
|
|
116
|
-
- "立即执行一下代码检查"
|
|
117
|
-
- "把备份任务删掉"
|
|
118
|
-
- "重新加载任务文件"
|
|
119
|
-
|
|
120
|
-
Agent 内部会调用以下工具来完成,你不需要直接使用:
|
|
121
|
-
|
|
122
|
-
| 工具 | 说明 |
|
|
123
|
-
|------|------|
|
|
124
|
-
| `cron_create` | 创建周期任务(名称、cron 表达式、prompt) |
|
|
125
|
-
| `cron_list` | 列出所有任务 |
|
|
126
|
-
| `cron_run` | 立即执行一个任务 |
|
|
127
|
-
| `cron_delete` | 删除任务 |
|
|
128
|
-
|
|
129
|
-
### 任务文件格式
|
|
130
|
-
|
|
131
|
-
创建 `.cron-job/tasks.md`:
|
|
132
|
-
|
|
133
|
-
```markdown
|
|
134
|
-
# 周期任务
|
|
135
|
-
|
|
136
|
-
## 每日代码检查
|
|
137
|
-
- cron: 0 9 * * *
|
|
138
|
-
- prompt: 检查所有变更文件并生成报告
|
|
139
|
-
|
|
140
|
-
## 每小时备份
|
|
141
|
-
- cron: 0 */1 * * *
|
|
142
|
-
- prompt: 备份数据库
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
每个以 `##` 开头的区块为一个任务。支持字段:
|
|
146
|
-
- `cron` — 标准 5 段 cron 表达式(也支持含秒的 6 段格式)
|
|
147
|
-
- `prompt` — 定时触发时注入的 prompt 内容
|
|
148
|
-
|
|
149
|
-
### 更新
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
# 清除插件缓存后重启 OpenCode
|
|
153
|
-
rm -rf ~/.cache/opencode/node_modules/opencode-cron-job
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## License / 许可证
|
|
79
|
+
## License
|
|
159
80
|
|
|
160
81
|
MIT
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# opencode-cron-job
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/opencode-cron-job)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
|
|
6
|
+
**OpenCode 插件** — 通过简单的 markdown 文件定时执行 prompt。
|
|
7
|
+
|
|
8
|
+
[English](./README.md)
|
|
9
|
+
|
|
10
|
+
> ⚠️ **Alpha** — 已在 Windows 上经过简单测试,支持终端版、桌面版和 ACP 服务器。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 安装
|
|
15
|
+
|
|
16
|
+
在 OpenCode 配置中添加:
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"plugin": ["opencode-cron-job@latest"]
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
OpenCode 启动时自动安装 npm 插件,无需手动下载。
|
|
25
|
+
|
|
26
|
+
## 使用方式
|
|
27
|
+
|
|
28
|
+
直接对 AI 说自然语言即可,Agent 会自动维护 `.cron-job/tasks.md`:
|
|
29
|
+
|
|
30
|
+
- "每天早上9点提醒我写日报"
|
|
31
|
+
- "每周五下午3点执行代码审查"
|
|
32
|
+
- "每30分钟检查一次服务器状态"
|
|
33
|
+
- "列出所有周期任务"
|
|
34
|
+
|
|
35
|
+
Agent 内部会调用以下工具来完成,你不需要直接使用:
|
|
36
|
+
|
|
37
|
+
| 工具 | 说明 |
|
|
38
|
+
|------|------|
|
|
39
|
+
| `cron_create` | 创建周期任务(名称、cron 表达式、prompt) |
|
|
40
|
+
| `cron_list` | 列出所有任务 |
|
|
41
|
+
| `cron_run` | 立即执行一个任务 |
|
|
42
|
+
| `cron_delete` | 删除任务 |
|
|
43
|
+
| `cron_once` | 定时一次性延迟任务 |
|
|
44
|
+
|
|
45
|
+
## 工作原理
|
|
46
|
+
|
|
47
|
+
1. **插件启动** → 读取 `.cron-job/tasks.md`,解析每个 `##` 任务区块
|
|
48
|
+
2. **注册定时器** → 对每个有效的 cron 表达式调用 `node-cron` 注册定时任务
|
|
49
|
+
3. **定时触发** → 到时间后插件通过 API 找到当前工作区最近的会话
|
|
50
|
+
4. **注入 prompt** → 直接把 prompt 发送到会话中,不经过 TUI 输入,不中断用户操作
|
|
51
|
+
|
|
52
|
+
## 任务文件格式
|
|
53
|
+
|
|
54
|
+
`.cron-job/tasks.md` 由 Agent 自动维护,参考格式如下:
|
|
55
|
+
|
|
56
|
+
```markdown
|
|
57
|
+
# 周期任务
|
|
58
|
+
|
|
59
|
+
## 每日代码检查
|
|
60
|
+
- cron: 0 9 * * *
|
|
61
|
+
- prompt: 检查所有变更文件并生成报告
|
|
62
|
+
|
|
63
|
+
## 每小时备份
|
|
64
|
+
- cron: 0 */1 * * *
|
|
65
|
+
- prompt: 备份数据库
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
每个以 `##` 开头的区块为一个任务。支持字段:
|
|
69
|
+
- `cron` — 标准 5 段 cron 表达式(也支持含秒的 6 段格式)
|
|
70
|
+
- `prompt` — 定时触发时注入的 prompt 内容
|
|
71
|
+
|
|
72
|
+
## 更新
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 清除插件缓存后重启 OpenCode
|
|
76
|
+
rm -rf ~/.cache/opencode/node_modules/opencode-cron-job
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 许可证
|
|
80
|
+
|
|
81
|
+
MIT
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFileSync, existsSync } from "fs";
|
|
1
|
+
import { readFileSync, existsSync, appendFileSync, mkdirSync, writeFileSync } from "fs";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import cron from "node-cron";
|
|
4
4
|
import { tool } from "@opencode-ai/plugin";
|
|
@@ -19,7 +19,7 @@ function parseDelay(s) {
|
|
|
19
19
|
return n * 60000;
|
|
20
20
|
}
|
|
21
21
|
function parseTasks(content) {
|
|
22
|
-
const
|
|
22
|
+
const result = [];
|
|
23
23
|
const sections = content.split(/^## /m).filter((s) => s.trim());
|
|
24
24
|
for (const section of sections) {
|
|
25
25
|
const lines = section.split("\n");
|
|
@@ -31,51 +31,126 @@ function parseTasks(content) {
|
|
|
31
31
|
const t = line.trim();
|
|
32
32
|
if (t.startsWith("- cron:"))
|
|
33
33
|
schedule = t.slice("- cron:".length).trim();
|
|
34
|
+
else if (t.startsWith("- delay:"))
|
|
35
|
+
schedule = t.slice("- delay:".length).trim();
|
|
34
36
|
else if (t.startsWith("- prompt:"))
|
|
35
37
|
prompt = t.slice("- prompt:".length).trim();
|
|
36
38
|
}
|
|
37
39
|
if (schedule && prompt)
|
|
38
|
-
|
|
40
|
+
result.push({ name, schedule, prompt });
|
|
39
41
|
}
|
|
40
|
-
return
|
|
42
|
+
return result;
|
|
41
43
|
}
|
|
42
44
|
let jobs = [];
|
|
43
45
|
let nextId = 1;
|
|
44
|
-
const
|
|
46
|
+
export const CronPlugin = async ({ client, directory }) => {
|
|
45
47
|
const tasksFile = join(directory, ".cron-job", "tasks.md");
|
|
46
|
-
function fire(job) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
async function fire(job) {
|
|
49
|
+
try {
|
|
50
|
+
const res = await client.session.list({ query: { directory } });
|
|
51
|
+
const sessions = res.data;
|
|
52
|
+
if (!sessions || sessions.length === 0)
|
|
53
|
+
return;
|
|
54
|
+
sessions.sort((a, b) => b.time.updated - a.time.updated);
|
|
55
|
+
await client.session.promptAsync({
|
|
56
|
+
path: { id: sessions[0].id },
|
|
57
|
+
body: {
|
|
58
|
+
parts: [{ type: "text", text: `<cron-reminder>${job.prompt}</cron-reminder>` }],
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
process.stderr.write(`[cron] fire error: ${e.message}\n`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function scheduleCron(job) {
|
|
67
|
+
job.task = cron.schedule(job.schedule, () => {
|
|
68
|
+
if (job.cancelled)
|
|
69
|
+
return;
|
|
70
|
+
fire(job);
|
|
71
|
+
});
|
|
50
72
|
}
|
|
51
|
-
function
|
|
52
|
-
|
|
53
|
-
|
|
73
|
+
function scheduleDelay(job) {
|
|
74
|
+
const ms = parseDelay(job.schedule);
|
|
75
|
+
if (ms <= 0)
|
|
76
|
+
return;
|
|
77
|
+
job.timer = setTimeout(() => {
|
|
78
|
+
if (job.cancelled)
|
|
79
|
+
return;
|
|
80
|
+
fire(job);
|
|
81
|
+
removeJobFromFile(job.name);
|
|
82
|
+
const idx = jobs.indexOf(job);
|
|
83
|
+
if (idx !== -1)
|
|
84
|
+
jobs.splice(idx, 1);
|
|
85
|
+
}, ms);
|
|
86
|
+
}
|
|
87
|
+
function startJob(item) {
|
|
88
|
+
const job = { ...item, id: String(nextId++), task: null, timer: null, cancelled: false };
|
|
89
|
+
if (cron.validate(job.schedule)) {
|
|
90
|
+
scheduleCron(job);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
scheduleDelay(job);
|
|
54
94
|
}
|
|
95
|
+
return job;
|
|
55
96
|
}
|
|
56
|
-
|
|
57
|
-
|
|
97
|
+
function stopJob(job) {
|
|
98
|
+
job.cancelled = true;
|
|
99
|
+
job.task?.stop();
|
|
100
|
+
if (job.timer)
|
|
101
|
+
clearTimeout(job.timer);
|
|
102
|
+
}
|
|
103
|
+
function reloadJobs() {
|
|
104
|
+
for (const j of jobs)
|
|
105
|
+
stopJob(j);
|
|
106
|
+
jobs = [];
|
|
107
|
+
if (!existsSync(tasksFile))
|
|
108
|
+
return;
|
|
58
109
|
const items = parseTasks(readFileSync(tasksFile, "utf-8"));
|
|
59
110
|
for (const item of items) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
111
|
+
jobs.push(startJob(item));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function removeJobFromFile(name) {
|
|
115
|
+
try {
|
|
116
|
+
const content = readFileSync(tasksFile, "utf-8");
|
|
117
|
+
const tasks = parseTasks(content);
|
|
118
|
+
const remaining = tasks.filter((t) => t.name !== name);
|
|
119
|
+
const lines = ["# 周期任务"];
|
|
120
|
+
for (const t of remaining) {
|
|
121
|
+
lines.push("");
|
|
122
|
+
lines.push(`## ${t.name}`);
|
|
123
|
+
lines.push(cron.validate(t.schedule) ? `- cron: ${t.schedule}` : `- delay: ${t.schedule}`);
|
|
124
|
+
lines.push(`- prompt: ${t.prompt}`);
|
|
125
|
+
}
|
|
126
|
+
writeFileSync(tasksFile, lines.join("\n") + "\n");
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
process.stderr.write(`[cron] remove file error: ${e.message}\n`);
|
|
63
130
|
}
|
|
64
131
|
}
|
|
132
|
+
// Load from file on startup
|
|
133
|
+
reloadJobs();
|
|
65
134
|
return {
|
|
66
135
|
tool: {
|
|
67
136
|
cron_create: tool({
|
|
68
|
-
description: "Create a new cron job.
|
|
137
|
+
description: "Create a new cron job. Writes to .cron-job/tasks.md and schedules it.",
|
|
69
138
|
args: {
|
|
70
139
|
name: tool.schema.string().describe("Unique name for this job"),
|
|
71
|
-
schedule: tool.schema.string().describe("Cron expression
|
|
72
|
-
prompt: tool.schema.string().describe("
|
|
140
|
+
schedule: tool.schema.string().describe("Cron expression, e.g. '0 9 * * *'"),
|
|
141
|
+
prompt: tool.schema.string().describe("Prompt to inject when the job fires"),
|
|
73
142
|
},
|
|
74
143
|
async execute(args) {
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
144
|
+
const entry = `\n## ${args.name}\n- cron: ${args.schedule}\n- prompt: ${args.prompt}\n\n`;
|
|
145
|
+
if (!existsSync(tasksFile)) {
|
|
146
|
+
mkdirSync(join(directory, ".cron-job"), { recursive: true });
|
|
147
|
+
appendFileSync(tasksFile, `# 周期任务\n${entry}`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
appendFileSync(tasksFile, entry);
|
|
151
|
+
}
|
|
152
|
+
jobs.push(startJob({ name: args.name, schedule: args.schedule, prompt: args.prompt }));
|
|
153
|
+
return `Created: ${args.name} (${args.schedule})`;
|
|
79
154
|
},
|
|
80
155
|
}),
|
|
81
156
|
cron_list: tool({
|
|
@@ -88,9 +163,9 @@ const _CronPlugin = async ({ client, directory }) => {
|
|
|
88
163
|
},
|
|
89
164
|
}),
|
|
90
165
|
cron_run: tool({
|
|
91
|
-
description: "Run a job immediately
|
|
166
|
+
description: "Run a job immediately",
|
|
92
167
|
args: {
|
|
93
|
-
jobId: tool.schema.string().describe("ID
|
|
168
|
+
jobId: tool.schema.string().describe("Job ID. Get it from cron_list."),
|
|
94
169
|
},
|
|
95
170
|
async execute(args) {
|
|
96
171
|
const job = jobs.find((j) => j.id === args.jobId);
|
|
@@ -101,52 +176,46 @@ const _CronPlugin = async ({ client, directory }) => {
|
|
|
101
176
|
},
|
|
102
177
|
}),
|
|
103
178
|
cron_delete: tool({
|
|
104
|
-
description: "Delete a cron job
|
|
179
|
+
description: "Delete a cron job from .cron-job/tasks.md",
|
|
105
180
|
args: {
|
|
106
|
-
jobId: tool.schema.string().describe("ID
|
|
181
|
+
jobId: tool.schema.string().describe("Job ID. Get it from cron_list."),
|
|
107
182
|
},
|
|
108
183
|
async execute(args) {
|
|
109
184
|
const idx = jobs.findIndex((j) => j.id === args.jobId);
|
|
110
185
|
if (idx === -1)
|
|
111
186
|
return `Job ${args.jobId} not found.`;
|
|
112
|
-
const
|
|
113
|
-
job
|
|
114
|
-
|
|
115
|
-
|
|
187
|
+
const job = jobs[idx];
|
|
188
|
+
stopJob(job);
|
|
189
|
+
jobs.splice(idx, 1);
|
|
190
|
+
removeJobFromFile(job.name);
|
|
116
191
|
return `${job.name}: deleted`;
|
|
117
192
|
},
|
|
118
193
|
}),
|
|
119
194
|
cron_once: tool({
|
|
120
|
-
description: "Schedule a one-shot prompt after a delay.
|
|
195
|
+
description: "Schedule a one-shot prompt after a delay. Saved to .cron-job/tasks.md for persistence across restarts.",
|
|
121
196
|
args: {
|
|
122
|
-
prompt: tool.schema.string().describe("
|
|
123
|
-
delay: tool.schema.string().describe("Delay
|
|
124
|
-
name: tool.schema.string().optional().describe("Optional name
|
|
197
|
+
prompt: tool.schema.string().describe("Prompt to inject when timer fires"),
|
|
198
|
+
delay: tool.schema.string().describe("Delay: '5m', '30s', '2h', '1d'"),
|
|
199
|
+
name: tool.schema.string().optional().describe("Optional name"),
|
|
125
200
|
},
|
|
126
201
|
async execute(args) {
|
|
127
202
|
const ms = parseDelay(args.delay);
|
|
128
203
|
if (ms <= 0)
|
|
129
|
-
return `Invalid delay: ${args.delay}
|
|
204
|
+
return `Invalid delay: ${args.delay}`;
|
|
130
205
|
const name = args.name || `reminder-${nextId}`;
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
jobs.splice(idx, 1);
|
|
141
|
-
}, ms);
|
|
142
|
-
jobs.push(job);
|
|
206
|
+
const entry = `\n## ${name}\n- delay: ${args.delay}\n- prompt: ${args.prompt}\n\n`;
|
|
207
|
+
if (!existsSync(tasksFile)) {
|
|
208
|
+
mkdirSync(join(directory, ".cron-job"), { recursive: true });
|
|
209
|
+
appendFileSync(tasksFile, `# 周期任务\n${entry}`);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
appendFileSync(tasksFile, entry);
|
|
213
|
+
}
|
|
214
|
+
jobs.push(startJob({ name, schedule: args.delay, prompt: args.prompt }));
|
|
143
215
|
return `Scheduled: ${name} (fires in ${args.delay})`;
|
|
144
216
|
},
|
|
145
217
|
}),
|
|
146
218
|
},
|
|
147
219
|
};
|
|
148
220
|
};
|
|
149
|
-
export default {
|
|
150
|
-
server: _CronPlugin,
|
|
151
|
-
};
|
|
152
221
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACvF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAe,MAAM,qBAAqB,CAAA;AAevD,SAAS,UAAU,CAAC,CAAS;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAA;IACtG,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAChB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACjC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,CAAC,GAAG,KAAK,CAAA;IAClC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IACpC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,CAAC,GAAG,QAAQ,CAAA;IACrC,OAAO,CAAC,GAAG,KAAK,CAAA;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,MAAM,MAAM,GAAW,EAAE,CAAA;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC/D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;QAC7B,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,IAAI,QAAQ,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAA;QAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;YACrB,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;iBACnE,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;iBAC1E,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;gBAAE,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;QACjF,CAAC;QACD,IAAI,QAAQ,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IACjE,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,IAAI,IAAI,GAAU,EAAE,CAAA;AACpB,IAAI,MAAM,GAAG,CAAC,CAAA;AAEd,MAAM,CAAC,MAAM,UAAU,GAAW,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAA;IAE1D,KAAK,UAAU,IAAI,CAAC,GAAQ;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;YAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAA;YACzB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAM;YAC9C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACxD,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC/B,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC5B,IAAI,EAAE;oBACJ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,CAAC,MAAM,kBAAkB,EAAE,CAAC;iBAChF;aACF,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,SAAS,YAAY,CAAC,GAAQ;QAC5B,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC1C,IAAI,GAAG,CAAC,SAAS;gBAAE,OAAM;YACzB,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,aAAa,CAAC,GAAQ;QAC7B,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACnC,IAAI,EAAE,IAAI,CAAC;YAAE,OAAM;QACnB,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,IAAI,GAAG,CAAC,SAAS;gBAAE,OAAM;YACzB,IAAI,CAAC,GAAG,CAAC,CAAA;YACT,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC7B,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACrC,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC;IAED,SAAS,QAAQ,CAAC,IAAU;QAC1B,MAAM,GAAG,GAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;QAC7F,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,YAAY,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,SAAS,OAAO,CAAC,GAAQ;QACvB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAA;QACpB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;QAChB,IAAI,GAAG,CAAC,KAAK;YAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACxC,CAAC;IAED,SAAS,UAAU;QACjB,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC,CAAA;QAChC,IAAI,GAAG,EAAE,CAAA;QACT,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAM;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;QAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,SAAS,iBAAiB,CAAC,IAAY;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAChD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;YACtD,MAAM,KAAK,GAAa,CAAC,QAAQ,CAAC,CAAA;YAClC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACd,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC1F,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;YACrC,CAAC;YACD,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,UAAU,EAAE,CAAA;IAEZ,OAAO;QACL,IAAI,EAAE;YACJ,WAAW,EAAE,IAAI,CAAC;gBAChB,WAAW,EAAE,uEAAuE;gBACpF,IAAI,EAAE;oBACJ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;oBAC/D,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;oBAC5E,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;iBAC7E;gBACD,KAAK,CAAC,OAAO,CAAC,IAAI;oBAChB,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,QAAQ,eAAe,IAAI,CAAC,MAAM,MAAM,CAAA;oBACzF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC3B,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;wBAC5D,cAAc,CAAC,SAAS,EAAE,WAAW,KAAK,EAAE,CAAC,CAAA;oBAC/C,CAAC;yBAAM,CAAC;wBACN,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;oBAClC,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;oBACtF,OAAO,YAAY,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAA;gBACnD,CAAC;aACF,CAAC;YAEF,SAAS,EAAE,IAAI,CAAC;gBACd,WAAW,EAAE,8BAA8B;gBAC3C,IAAI,EAAE,EAAE;gBACR,KAAK,CAAC,OAAO;oBACX,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,oBAAoB,CAAA;oBAClD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACxE,CAAC;aACF,CAAC;YAEF,QAAQ,EAAE,IAAI,CAAC;gBACb,WAAW,EAAE,uBAAuB;gBACpC,IAAI,EAAE;oBACJ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;iBACvE;gBACD,KAAK,CAAC,OAAO,CAAC,IAAI;oBAChB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAA;oBACjD,IAAI,CAAC,GAAG;wBAAE,OAAO,OAAO,IAAI,CAAC,KAAK,aAAa,CAAA;oBAC/C,IAAI,CAAC,GAAG,CAAC,CAAA;oBACT,OAAO,GAAG,GAAG,CAAC,IAAI,aAAa,CAAA;gBACjC,CAAC;aACF,CAAC;YAEF,WAAW,EAAE,IAAI,CAAC;gBAChB,WAAW,EAAE,2CAA2C;gBACxD,IAAI,EAAE;oBACJ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;iBACvE;gBACD,KAAK,CAAC,OAAO,CAAC,IAAI;oBAChB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAA;oBACtD,IAAI,GAAG,KAAK,CAAC,CAAC;wBAAE,OAAO,OAAO,IAAI,CAAC,KAAK,aAAa,CAAA;oBACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;oBACrB,OAAO,CAAC,GAAG,CAAC,CAAA;oBACZ,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;oBACnB,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oBAC3B,OAAO,GAAG,GAAG,CAAC,IAAI,WAAW,CAAA;gBAC/B,CAAC;aACF,CAAC;YAEF,SAAS,EAAE,IAAI,CAAC;gBACd,WAAW,EAAE,wGAAwG;gBACrH,IAAI,EAAE;oBACJ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;oBAC1E,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;oBACtE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;iBAChE;gBACD,KAAK,CAAC,OAAO,CAAC,IAAI;oBAChB,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBACjC,IAAI,EAAE,IAAI,CAAC;wBAAE,OAAO,kBAAkB,IAAI,CAAC,KAAK,EAAE,CAAA;oBAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,YAAY,MAAM,EAAE,CAAA;oBAE9C,MAAM,KAAK,GAAG,QAAQ,IAAI,cAAc,IAAI,CAAC,KAAK,eAAe,IAAI,CAAC,MAAM,MAAM,CAAA;oBAClF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC3B,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;wBAC5D,cAAc,CAAC,SAAS,EAAE,WAAW,KAAK,EAAE,CAAC,CAAA;oBAC/C,CAAC;yBAAM,CAAC;wBACN,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;oBAClC,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;oBACxE,OAAO,cAAc,IAAI,cAAc,IAAI,CAAC,KAAK,GAAG,CAAA;gBACtD,CAAC;aACF,CAAC;SACH;KACF,CAAA;AACH,CAAC,CAAA"}
|