@t0u9h/agent-cron 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 +197 -41
- package/README.zh.md +254 -0
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +53 -11
- package/dist/agents/claude.js.map +1 -1
- package/dist/outputs/feishu.d.ts +0 -1
- package/dist/outputs/feishu.d.ts.map +1 -1
- package/dist/outputs/feishu.js +4 -4
- package/dist/outputs/feishu.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,40 +1,105 @@
|
|
|
1
1
|
# agent-cron
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> 中文文档:[README.zh.md](./README.zh.md)
|
|
4
|
+
|
|
5
|
+
Run Claude Agent SDK tasks on a cron schedule. Tasks are plain `.md` files — write a prompt, set a cron expression, pick an output channel. That's it.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
tasks/
|
|
9
|
+
daily-ai-news.md ← runs at 9am, sends to Feishu
|
|
10
|
+
weekly-report.md ← runs Monday 8am, writes to GitHub
|
|
11
|
+
```
|
|
4
12
|
|
|
5
13
|
## Install
|
|
6
14
|
|
|
7
15
|
```bash
|
|
8
|
-
npm install -g agent-cron
|
|
9
|
-
# or use
|
|
10
|
-
npx agent-cron list
|
|
16
|
+
npm install -g @t0u9h/agent-cron
|
|
17
|
+
# or use without installing
|
|
18
|
+
npx @t0u9h/agent-cron list
|
|
11
19
|
```
|
|
12
20
|
|
|
13
|
-
##
|
|
21
|
+
## Claude Code Skill
|
|
22
|
+
|
|
23
|
+
Manage tasks via natural language in Claude Code:
|
|
14
24
|
|
|
15
25
|
```bash
|
|
16
|
-
|
|
17
|
-
agent-cron start ./my-tasks # specify tasks directory
|
|
18
|
-
agent-cron run # run all tasks now
|
|
19
|
-
agent-cron run daily-news # run one task by slug
|
|
20
|
-
agent-cron list # list all tasks
|
|
26
|
+
/claude install marketplace https://github.com/T0UGH/agent-cron/raw/main/.claude-plugin/marketplace.json
|
|
21
27
|
```
|
|
22
28
|
|
|
23
|
-
|
|
29
|
+
Once installed:
|
|
30
|
+
- "帮我创建一个每天早9点搜 AI 新闻发飞书的任务"
|
|
31
|
+
- "列出所有定时任务"
|
|
32
|
+
- "立即运行 daily-ai-news"
|
|
33
|
+
- "帮我配置 agent-cron 开机自启"
|
|
24
34
|
|
|
25
|
-
|
|
35
|
+
The skill automatically configures macOS auto-start (launchd) when you create your first task.
|
|
26
36
|
|
|
27
|
-
|
|
37
|
+
## Quick Start
|
|
38
|
+
|
|
39
|
+
**1. Create a task file**
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
mkdir tasks
|
|
43
|
+
cat > tasks/daily-news.md << 'EOF'
|
|
28
44
|
---
|
|
29
45
|
name: Daily AI News
|
|
30
46
|
cron: "0 9 * * *"
|
|
31
|
-
output:
|
|
32
|
-
|
|
47
|
+
output: file
|
|
48
|
+
outputDir: ./output
|
|
33
49
|
---
|
|
34
50
|
|
|
35
|
-
Today is {date}. Search for the latest AI news and summarize.
|
|
51
|
+
Today is {date}. Search for the latest AI coding news and summarize in 5 bullet points.
|
|
36
52
|
|
|
37
53
|
If nothing new, output exactly: HEARTBEAT_OK
|
|
54
|
+
EOF
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**2. Set your API key**
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
cp .env.example .env
|
|
61
|
+
# edit .env and set ANTHROPIC_API_KEY
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**3. Run once to test**
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
agent-cron run daily-news
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**4. Start the scheduler**
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
agent-cron start
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## CLI
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
agent-cron start # start scheduler (reads ./tasks/, stays running)
|
|
80
|
+
agent-cron start ./my-tasks # use a different tasks directory
|
|
81
|
+
agent-cron run # run all tasks immediately (one-off)
|
|
82
|
+
agent-cron run daily-news # run one task by slug immediately
|
|
83
|
+
agent-cron list # list all registered tasks with cron expressions
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`start` is a long-running process. Use launchd (macOS), systemd (Linux), or pm2 to keep it running.
|
|
87
|
+
|
|
88
|
+
## Task File Format
|
|
89
|
+
|
|
90
|
+
Each task is a `.md` file in your tasks directory:
|
|
91
|
+
|
|
92
|
+
```markdown
|
|
93
|
+
---
|
|
94
|
+
name: Daily AI News # display name (default: filename slug)
|
|
95
|
+
cron: "0 9 * * *" # cron expression (Asia/Shanghai timezone)
|
|
96
|
+
output: feishu # output channel: file | feishu | github
|
|
97
|
+
feishuWebhook: https://... # channel-specific config (see below)
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
Today is {date}. Search for the latest AI news...
|
|
101
|
+
|
|
102
|
+
If nothing to report, output exactly: HEARTBEAT_OK
|
|
38
103
|
```
|
|
39
104
|
|
|
40
105
|
### Frontmatter fields
|
|
@@ -42,36 +107,59 @@ If nothing new, output exactly: HEARTBEAT_OK
|
|
|
42
107
|
| Field | Required | Default | Notes |
|
|
43
108
|
|-------|----------|---------|-------|
|
|
44
109
|
| `name` | no | filename slug | display name |
|
|
45
|
-
| `cron` | **yes** | — | standard cron expression |
|
|
46
|
-
| `output` | **yes** | — | `file`, `
|
|
110
|
+
| `cron` | **yes** | — | standard 5-field cron expression |
|
|
111
|
+
| `output` | **yes** | — | `file`, `feishu`, or `github` |
|
|
47
112
|
| `agent` | no | `claude` | agent runner (currently only `claude`) |
|
|
48
|
-
| `skills` | no | `true` | load `~/.claude/` skills
|
|
49
|
-
| `outputDir` | no | `./output` | for `output: file` |
|
|
50
|
-
| `githubRepo` | if github | — | `owner/repo` format |
|
|
51
|
-
| `githubBranch` | no | `main` | for `output: github` |
|
|
52
|
-
| `githubDir` | no | `` (root) | subdirectory in repo |
|
|
53
|
-
| `githubToken` | no | `GITHUB_TOKEN` env | for `output: github` |
|
|
54
|
-
| `feishuWebhook` | no | `FEISHU_WEBHOOK` env | for `output: feishu` |
|
|
113
|
+
| `skills` | no | `true` | load `~/.claude/` skills (set `false` to isolate) |
|
|
55
114
|
|
|
56
|
-
###
|
|
115
|
+
### Output channel fields
|
|
116
|
+
|
|
117
|
+
**`output: file`**
|
|
118
|
+
|
|
119
|
+
| Field | Required | Default |
|
|
120
|
+
|-------|----------|---------|
|
|
121
|
+
| `outputDir` | no | `./output` |
|
|
122
|
+
|
|
123
|
+
Writes `{outputDir}/{slug}-{YYYY-MM-DD}.md`.
|
|
124
|
+
|
|
125
|
+
**`output: feishu`**
|
|
126
|
+
|
|
127
|
+
| Field | Required | Default |
|
|
128
|
+
|-------|----------|---------|
|
|
129
|
+
| `feishuWebhook` | no | `FEISHU_WEBHOOK` env |
|
|
57
130
|
|
|
58
|
-
|
|
131
|
+
Converts Markdown to Feishu rich text (post format). h1 becomes the card title.
|
|
59
132
|
|
|
60
|
-
|
|
133
|
+
**`output: github`**
|
|
61
134
|
|
|
62
|
-
|
|
|
63
|
-
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
135
|
+
| Field | Required | Default |
|
|
136
|
+
|-------|----------|---------|
|
|
137
|
+
| `githubRepo` | **yes** | — |
|
|
138
|
+
| `githubBranch` | no | `main` |
|
|
139
|
+
| `githubDir` | no | repo root |
|
|
140
|
+
| `githubToken` | no | `GITHUB_TOKEN` env |
|
|
141
|
+
|
|
142
|
+
Creates/updates `{githubDir}/{slug}-{YYYY-MM-DD}.md` via GitHub Contents API. No local git needed.
|
|
143
|
+
|
|
144
|
+
### Template variables
|
|
145
|
+
|
|
146
|
+
| Variable | Value |
|
|
147
|
+
|----------|-------|
|
|
148
|
+
| `{date}` | today's date, locale `zh-CN` (e.g. `2026/3/3`) |
|
|
67
149
|
|
|
68
150
|
### HEARTBEAT_OK protocol
|
|
69
151
|
|
|
70
|
-
If the agent returns exactly `HEARTBEAT_OK
|
|
152
|
+
If the agent returns exactly `HEARTBEAT_OK` (trimmed), the output step is skipped silently. Use this when a task should only push when there is genuinely new content:
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
If nothing new to report, output exactly: HEARTBEAT_OK
|
|
156
|
+
```
|
|
71
157
|
|
|
72
158
|
## Local Skills
|
|
73
159
|
|
|
74
|
-
By default, all tasks load your locally installed Claude Code skills (`~/.claude/plugins/`, `~/.claude/skills/`)
|
|
160
|
+
By default, all tasks load your locally installed Claude Code skills (`~/.claude/plugins/`, `~/.claude/skills/`) via `settingSources: ['user']`. This means any skill installed on your machine is available inside the agent's session.
|
|
161
|
+
|
|
162
|
+
To disable for a specific task (isolation, security):
|
|
75
163
|
|
|
76
164
|
```yaml
|
|
77
165
|
skills: false
|
|
@@ -81,18 +169,86 @@ skills: false
|
|
|
81
169
|
|
|
82
170
|
```
|
|
83
171
|
ANTHROPIC_API_KEY= # required
|
|
84
|
-
GITHUB_TOKEN= # required for output: github
|
|
172
|
+
GITHUB_TOKEN= # required for output: github (unless set per-task)
|
|
85
173
|
FEISHU_WEBHOOK= # required for output: feishu (unless set per-task)
|
|
86
174
|
```
|
|
87
175
|
|
|
88
|
-
Copy `.env.example` to `.env`
|
|
176
|
+
Copy `.env.example` to `.env`. A `.env` file in the current working directory is loaded automatically at startup.
|
|
89
177
|
|
|
90
178
|
## Timezone
|
|
91
179
|
|
|
92
|
-
All cron expressions
|
|
180
|
+
All cron expressions run in `Asia/Shanghai` timezone. This is hardcoded in v0.1.
|
|
93
181
|
|
|
94
|
-
##
|
|
182
|
+
## Auto-start on macOS
|
|
95
183
|
|
|
96
|
-
|
|
184
|
+
To run `agent-cron start` as a background service that survives reboots:
|
|
97
185
|
|
|
98
|
-
|
|
186
|
+
```bash
|
|
187
|
+
# Create LaunchAgent plist
|
|
188
|
+
cat > ~/Library/LaunchAgents/com.agent-cron.plist << 'EOF'
|
|
189
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
190
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
191
|
+
<plist version="1.0">
|
|
192
|
+
<dict>
|
|
193
|
+
<key>Label</key><string>com.agent-cron</string>
|
|
194
|
+
<key>ProgramArguments</key>
|
|
195
|
+
<array>
|
|
196
|
+
<string>/usr/local/bin/npx</string>
|
|
197
|
+
<string>@t0u9h/agent-cron</string>
|
|
198
|
+
<string>start</string>
|
|
199
|
+
<string>/path/to/your/tasks</string>
|
|
200
|
+
</array>
|
|
201
|
+
<key>EnvironmentVariables</key>
|
|
202
|
+
<dict>
|
|
203
|
+
<key>ANTHROPIC_API_KEY</key><string>sk-ant-...</string>
|
|
204
|
+
</dict>
|
|
205
|
+
<key>WorkingDirectory</key><string>/path/to/your/project</string>
|
|
206
|
+
<key>RunAtLoad</key><true/>
|
|
207
|
+
<key>KeepAlive</key><true/>
|
|
208
|
+
<key>StandardOutPath</key><string>/tmp/agent-cron.log</string>
|
|
209
|
+
<key>StandardErrorPath</key><string>/tmp/agent-cron.error.log</string>
|
|
210
|
+
</dict>
|
|
211
|
+
</plist>
|
|
212
|
+
EOF
|
|
213
|
+
|
|
214
|
+
# Load immediately (no reboot required)
|
|
215
|
+
launchctl load ~/Library/LaunchAgents/com.agent-cron.plist
|
|
216
|
+
|
|
217
|
+
# Verify running
|
|
218
|
+
launchctl list | grep agent-cron
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Or use the Claude Code skill — it handles all of this automatically.
|
|
222
|
+
|
|
223
|
+
## Architecture
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
tasks/*.md → loader.ts → runner.ts → AgentRunner → OutputChannel
|
|
227
|
+
(claude) (file/feishu/github)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**Pluggable output channels** — implement `OutputChannel` and register in `src/outputs/index.ts`:
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
interface OutputChannel {
|
|
234
|
+
send(result: string, task: Task): Promise<void>
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Pluggable agent runners** — implement `AgentRunner` and register in `src/agents/index.ts`:
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
interface AgentRunner {
|
|
242
|
+
run(prompt: string, task: Task): Promise<string>
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Development
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
git clone https://github.com/T0UGH/agent-cron
|
|
250
|
+
cd agent-cron
|
|
251
|
+
npm install
|
|
252
|
+
npm test # run tests (39 tests, node:test)
|
|
253
|
+
npm run build # compile TypeScript → dist/
|
|
254
|
+
```
|
package/README.zh.md
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# agent-cron
|
|
2
|
+
|
|
3
|
+
> English docs: [README.md](./README.md)
|
|
4
|
+
|
|
5
|
+
用 Cron 定时运行 Claude Agent SDK 任务。任务是普通的 `.md` 文件 — 写好 Prompt、设置 Cron 表达式、选择输出渠道,就这些。
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
tasks/
|
|
9
|
+
daily-ai-news.md ← 每天早9点运行,发送到飞书
|
|
10
|
+
weekly-report.md ← 周一早8点运行,写入 GitHub
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g @t0u9h/agent-cron
|
|
17
|
+
# 或免安装直接使用
|
|
18
|
+
npx @t0u9h/agent-cron list
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Claude Code Skill
|
|
22
|
+
|
|
23
|
+
在 Claude Code 中用自然语言管理任务:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
/claude install marketplace https://github.com/T0UGH/agent-cron/raw/main/.claude-plugin/marketplace.json
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
安装后可以直接说:
|
|
30
|
+
- "帮我创建一个每天早9点搜 AI 新闻发飞书的任务"
|
|
31
|
+
- "列出所有定时任务"
|
|
32
|
+
- "立即运行 daily-ai-news"
|
|
33
|
+
- "帮我配置 agent-cron 开机自启"
|
|
34
|
+
|
|
35
|
+
创建第一个任务时,Skill 会自动检测并配置 macOS 开机自启(launchd)。
|
|
36
|
+
|
|
37
|
+
## 快速开始
|
|
38
|
+
|
|
39
|
+
**1. 创建任务文件**
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
mkdir tasks
|
|
43
|
+
cat > tasks/daily-news.md << 'EOF'
|
|
44
|
+
---
|
|
45
|
+
name: Daily AI News
|
|
46
|
+
cron: "0 9 * * *"
|
|
47
|
+
output: file
|
|
48
|
+
outputDir: ./output
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
今天是 {date}。请搜索最新的 AI 编程工具新闻,总结成5条要点。
|
|
52
|
+
|
|
53
|
+
如果没有值得关注的新内容,直接输出:HEARTBEAT_OK
|
|
54
|
+
EOF
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**2. 设置 API Key**
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
cp .env.example .env
|
|
61
|
+
# 编辑 .env,填入 ANTHROPIC_API_KEY
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**3. 先跑一次测试**
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
agent-cron run daily-news
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**4. 启动调度器**
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
agent-cron start
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## CLI 命令
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
agent-cron start # 启动调度器(读取 ./tasks/,持续运行)
|
|
80
|
+
agent-cron start ./my-tasks # 指定任务目录
|
|
81
|
+
agent-cron run # 立即运行所有任务(一次性)
|
|
82
|
+
agent-cron run daily-news # 立即运行指定任务
|
|
83
|
+
agent-cron list # 列出所有已注册的任务及 Cron 表达式
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`start` 是长驻进程。可以用 launchd(macOS)、systemd(Linux)或 pm2 保持它运行。
|
|
87
|
+
|
|
88
|
+
## 任务文件格式
|
|
89
|
+
|
|
90
|
+
每个任务是 tasks 目录下的一个 `.md` 文件:
|
|
91
|
+
|
|
92
|
+
```markdown
|
|
93
|
+
---
|
|
94
|
+
name: Daily AI News # 显示名称(默认:文件名)
|
|
95
|
+
cron: "0 9 * * *" # Cron 表达式(Asia/Shanghai 时区)
|
|
96
|
+
output: feishu # 输出渠道:file | feishu | github
|
|
97
|
+
feishuWebhook: https://... # 渠道专属配置(见下文)
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
今天是 {date}。请搜索最新的 AI 新闻……
|
|
101
|
+
|
|
102
|
+
如果没有值得关注的内容,直接输出:HEARTBEAT_OK
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Frontmatter 字段
|
|
106
|
+
|
|
107
|
+
| 字段 | 必填 | 默认值 | 说明 |
|
|
108
|
+
|------|------|--------|------|
|
|
109
|
+
| `name` | 否 | 文件名 slug | 显示名称 |
|
|
110
|
+
| `cron` | **是** | — | 标准 5 段 Cron 表达式 |
|
|
111
|
+
| `output` | **是** | — | `file`、`feishu` 或 `github` |
|
|
112
|
+
| `agent` | 否 | `claude` | Agent 运行器(目前仅支持 `claude`) |
|
|
113
|
+
| `skills` | 否 | `true` | 加载 `~/.claude/` 本地 Skills(设为 `false` 可隔离) |
|
|
114
|
+
|
|
115
|
+
### 输出渠道配置
|
|
116
|
+
|
|
117
|
+
**`output: file`**
|
|
118
|
+
|
|
119
|
+
| 字段 | 必填 | 默认值 |
|
|
120
|
+
|------|------|--------|
|
|
121
|
+
| `outputDir` | 否 | `./output` |
|
|
122
|
+
|
|
123
|
+
写入 `{outputDir}/{slug}-{YYYY-MM-DD}.md`。
|
|
124
|
+
|
|
125
|
+
**`output: feishu`**
|
|
126
|
+
|
|
127
|
+
| 字段 | 必填 | 默认值 |
|
|
128
|
+
|------|------|--------|
|
|
129
|
+
| `feishuWebhook` | 否 | 环境变量 `FEISHU_WEBHOOK` |
|
|
130
|
+
|
|
131
|
+
将 Markdown 转换为飞书富文本(post 格式)发送。h1 标题作为卡片标题。
|
|
132
|
+
|
|
133
|
+
**`output: github`**
|
|
134
|
+
|
|
135
|
+
| 字段 | 必填 | 默认值 |
|
|
136
|
+
|------|------|--------|
|
|
137
|
+
| `githubRepo` | **是** | — |
|
|
138
|
+
| `githubBranch` | 否 | `main` |
|
|
139
|
+
| `githubDir` | 否 | 仓库根目录 |
|
|
140
|
+
| `githubToken` | 否 | 环境变量 `GITHUB_TOKEN` |
|
|
141
|
+
|
|
142
|
+
通过 GitHub Contents API 创建或更新 `{githubDir}/{slug}-{YYYY-MM-DD}.md`,无需本地 git 环境。
|
|
143
|
+
|
|
144
|
+
### 模板变量
|
|
145
|
+
|
|
146
|
+
| 变量 | 值 |
|
|
147
|
+
|------|----|
|
|
148
|
+
| `{date}` | 今天的日期,`zh-CN` 格式(例如 `2026/3/3`) |
|
|
149
|
+
|
|
150
|
+
### HEARTBEAT_OK 协议
|
|
151
|
+
|
|
152
|
+
如果 Agent 输出(去除首尾空白后)恰好等于 `HEARTBEAT_OK`,则跳过输出步骤,不产生任何文件或消息。适合那些"有新内容才推送"的任务:
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
如果没有值得关注的新内容,直接输出:HEARTBEAT_OK
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## 本地 Skills
|
|
159
|
+
|
|
160
|
+
默认情况下,所有任务会通过 `settingSources: ['user']` 加载本机已安装的 Claude Code Skills(`~/.claude/plugins/`、`~/.claude/skills/`)。这意味着你机器上安装的任何 Skill 在 Agent 会话中都可用。
|
|
161
|
+
|
|
162
|
+
如需对特定任务隔离(安全或测试目的):
|
|
163
|
+
|
|
164
|
+
```yaml
|
|
165
|
+
skills: false
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## 环境变量
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
ANTHROPIC_API_KEY= # 必填
|
|
172
|
+
GITHUB_TOKEN= # output: github 时必填(也可在任务中单独设置)
|
|
173
|
+
FEISHU_WEBHOOK= # output: feishu 时必填(也可在任务中单独设置)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
将 `.env.example` 复制为 `.env`,启动时会自动加载当前工作目录下的 `.env` 文件。
|
|
177
|
+
|
|
178
|
+
## 时区
|
|
179
|
+
|
|
180
|
+
所有 Cron 表达式均在 `Asia/Shanghai` 时区运行,v0.1 中硬编码。
|
|
181
|
+
|
|
182
|
+
## macOS 开机自启
|
|
183
|
+
|
|
184
|
+
让 `agent-cron start` 以后台服务方式运行并在重启后自动恢复:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
# 创建 LaunchAgent plist
|
|
188
|
+
cat > ~/Library/LaunchAgents/com.agent-cron.plist << 'EOF'
|
|
189
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
190
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
191
|
+
<plist version="1.0">
|
|
192
|
+
<dict>
|
|
193
|
+
<key>Label</key><string>com.agent-cron</string>
|
|
194
|
+
<key>ProgramArguments</key>
|
|
195
|
+
<array>
|
|
196
|
+
<string>/usr/local/bin/npx</string>
|
|
197
|
+
<string>@t0u9h/agent-cron</string>
|
|
198
|
+
<string>start</string>
|
|
199
|
+
<string>/path/to/your/tasks</string>
|
|
200
|
+
</array>
|
|
201
|
+
<key>EnvironmentVariables</key>
|
|
202
|
+
<dict>
|
|
203
|
+
<key>ANTHROPIC_API_KEY</key><string>sk-ant-...</string>
|
|
204
|
+
</dict>
|
|
205
|
+
<key>WorkingDirectory</key><string>/path/to/your/project</string>
|
|
206
|
+
<key>RunAtLoad</key><true/>
|
|
207
|
+
<key>KeepAlive</key><true/>
|
|
208
|
+
<key>StandardOutPath</key><string>/tmp/agent-cron.log</string>
|
|
209
|
+
<key>StandardErrorPath</key><string>/tmp/agent-cron.error.log</string>
|
|
210
|
+
</dict>
|
|
211
|
+
</plist>
|
|
212
|
+
EOF
|
|
213
|
+
|
|
214
|
+
# 立即加载(无需重启)
|
|
215
|
+
launchctl load ~/Library/LaunchAgents/com.agent-cron.plist
|
|
216
|
+
|
|
217
|
+
# 验证是否运行
|
|
218
|
+
launchctl list | grep agent-cron
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
或者直接用 Claude Code Skill,它会自动处理以上所有步骤。
|
|
222
|
+
|
|
223
|
+
## 架构
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
tasks/*.md → loader.ts → runner.ts → AgentRunner → OutputChannel
|
|
227
|
+
(claude) (file/feishu/github)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**可扩展的输出渠道** — 实现 `OutputChannel` 接口并在 `src/outputs/index.ts` 中注册:
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
interface OutputChannel {
|
|
234
|
+
send(result: string, task: Task): Promise<void>
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**可扩展的 Agent 运行器** — 实现 `AgentRunner` 接口并在 `src/agents/index.ts` 中注册:
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
interface AgentRunner {
|
|
242
|
+
run(prompt: string, task: Task): Promise<string>
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## 开发
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
git clone https://github.com/T0UGH/agent-cron
|
|
250
|
+
cd agent-cron
|
|
251
|
+
npm install
|
|
252
|
+
npm test # 运行测试(39 个测试,node:test)
|
|
253
|
+
npm run build # 编译 TypeScript → dist/
|
|
254
|
+
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAiCrD,qBAAa,YAAa,YAAW,WAAW;IACxC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAuCvD"}
|
package/dist/agents/claude.js
CHANGED
|
@@ -1,19 +1,61 @@
|
|
|
1
1
|
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
const SKILLS_DIR = path.join(os.homedir(), '.claude', 'skills');
|
|
6
|
+
/**
|
|
7
|
+
* Each standalone skill at ~/.claude/skills/<name>/SKILL.md needs to be wrapped
|
|
8
|
+
* in a temporary plugin directory structure: skills/<name>/SKILL.md
|
|
9
|
+
* The SDK `plugins` option only accepts a directory that contains a `skills/` subdir.
|
|
10
|
+
*/
|
|
11
|
+
function buildSkillPlugin(skillNames) {
|
|
12
|
+
const existing = skillNames.filter((name) => fs.existsSync(path.join(SKILLS_DIR, name, 'SKILL.md')));
|
|
13
|
+
if (existing.length === 0)
|
|
14
|
+
return null;
|
|
15
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-cron-skills-'));
|
|
16
|
+
const skillsSubdir = path.join(tmpDir, 'skills');
|
|
17
|
+
fs.mkdirSync(skillsSubdir);
|
|
18
|
+
for (const name of existing) {
|
|
19
|
+
const srcDir = path.join(SKILLS_DIR, name);
|
|
20
|
+
const dstDir = path.join(skillsSubdir, name);
|
|
21
|
+
fs.mkdirSync(dstDir);
|
|
22
|
+
// Copy SKILL.md and any subdirectories (e.g. references/)
|
|
23
|
+
fs.cpSync(srcDir, dstDir, { recursive: true, dereference: true });
|
|
24
|
+
}
|
|
25
|
+
return tmpDir;
|
|
26
|
+
}
|
|
2
27
|
export class ClaudeRunner {
|
|
3
28
|
async run(prompt, task) {
|
|
4
29
|
const loadSkills = task.skills !== false;
|
|
30
|
+
const skillNames = Array.isArray(task.skills) ? task.skills : [];
|
|
5
31
|
let result = '';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
32
|
+
let tmpPluginDir = null;
|
|
33
|
+
const plugins = [];
|
|
34
|
+
if (skillNames.length > 0) {
|
|
35
|
+
tmpPluginDir = buildSkillPlugin(skillNames);
|
|
36
|
+
if (tmpPluginDir) {
|
|
37
|
+
plugins.push({ type: 'local', path: tmpPluginDir });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const q = query({
|
|
42
|
+
prompt,
|
|
43
|
+
options: {
|
|
44
|
+
cwd: process.cwd(),
|
|
45
|
+
permissionMode: 'bypassPermissions',
|
|
46
|
+
...(loadSkills && skillNames.length === 0 ? { settingSources: ['user'] } : {}),
|
|
47
|
+
...(plugins.length > 0 ? { plugins } : {}),
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
for await (const message of q) {
|
|
51
|
+
if (message.type === 'result' && 'result' in message && message.result) {
|
|
52
|
+
result = message.result;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
if (tmpPluginDir) {
|
|
58
|
+
fs.rmSync(tmpPluginDir, { recursive: true, force: true });
|
|
17
59
|
}
|
|
18
60
|
}
|
|
19
61
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/outputs/feishu.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feishu.d.ts","sourceRoot":"","sources":["../../src/outputs/feishu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEvD,KAAK,mBAAmB,GACpB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"feishu.d.ts","sourceRoot":"","sources":["../../src/outputs/feishu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEvD,KAAK,mBAAmB,GACpB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,KAAK,UAAU,GAAG,mBAAmB,EAAE,CAAC;AA4BxC,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,CA6C/F;AAED,qBAAa,aAAc,YAAW,aAAa;IAC3C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAsCtD"}
|
package/dist/outputs/feishu.js
CHANGED
|
@@ -12,7 +12,7 @@ function parseInline(raw) {
|
|
|
12
12
|
elements.push({ tag: 'a', text: m[1], href: m[2] });
|
|
13
13
|
}
|
|
14
14
|
else if (m[3]) {
|
|
15
|
-
elements.push({ tag: 'text', text: m[3]
|
|
15
|
+
elements.push({ tag: 'text', text: `「${m[3]}」` });
|
|
16
16
|
}
|
|
17
17
|
last = re.lastIndex;
|
|
18
18
|
}
|
|
@@ -33,10 +33,10 @@ export function markdownToFeishuPost(markdown) {
|
|
|
33
33
|
title = line.replace(/^#\s+/, '');
|
|
34
34
|
continue;
|
|
35
35
|
}
|
|
36
|
-
// h2/h3 →
|
|
36
|
+
// h2/h3 → prefix with ▌
|
|
37
37
|
if (/^#{2,3}\s+/.test(line)) {
|
|
38
|
-
const text = line.replace(/^#{2,3}\s+/, '');
|
|
39
|
-
content.push([{ tag: 'text', text
|
|
38
|
+
const text = '▌ ' + line.replace(/^#{2,3}\s+/, '');
|
|
39
|
+
content.push([{ tag: 'text', text }]);
|
|
40
40
|
continue;
|
|
41
41
|
}
|
|
42
42
|
// horizontal rule → empty line
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feishu.js","sourceRoot":"","sources":["../../src/outputs/feishu.ts"],"names":[],"mappings":"AAQA,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,uCAAuC;IACvC,MAAM,EAAE,GAAG,qDAAqD,CAAC;IACjE,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAyB,CAAC;IAE9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"feishu.js","sourceRoot":"","sources":["../../src/outputs/feishu.ts"],"names":[],"mappings":"AAQA,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,uCAAuC;IACvC,MAAM,EAAE,GAAG,qDAAqD,CAAC;IACjE,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAyB,CAAC;IAE9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC;IACtB,CAAC;IAED,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAE3B,mCAAmC;QACnC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK;gBAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,wBAAwB;QACxB,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtC,SAAS;QACX,CAAC;QAED,+BAA+B;QAC/B,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QAED,oBAAoB;QACpB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,cAAc,EAAE,OAAO,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,IAAU;QACnC,MAAM,OAAO,GACV,IAAI,CAAC,aAAoC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAE3E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,kDAAkD,IAAI,CAAC,IAAI,gEAAgE,CAC5H,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAExD,MAAM,IAAI,GAAG;YACX,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE;gBACP,IAAI,EAAE;oBACJ,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;iBAC1B;aACF;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;YAC/B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoC,CAAC;QACnE,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAC9D,CAAC;CACF"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACjD"}
|