@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 CHANGED
@@ -1,40 +1,105 @@
1
1
  # agent-cron
2
2
 
3
- Run Claude Agent SDK tasks on a cron schedule. Tasks are defined as `.md` files with YAML frontmatter.
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 npx
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
- ## Usage
21
+ ## Claude Code Skill
22
+
23
+ Manage tasks via natural language in Claude Code:
14
24
 
15
25
  ```bash
16
- agent-cron start # start scheduler (reads ./tasks/)
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
- ## Task File Format
29
+ Once installed:
30
+ - "帮我创建一个每天早9点搜 AI 新闻发飞书的任务"
31
+ - "列出所有定时任务"
32
+ - "立即运行 daily-ai-news"
33
+ - "帮我配置 agent-cron 开机自启"
24
34
 
25
- Create `.md` files in your `tasks/` directory:
35
+ The skill automatically configures macOS auto-start (launchd) when you create your first task.
26
36
 
27
- ```markdown
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: feishu
32
- feishuWebhook: https://open.feishu.cn/open-apis/bot/v2/hook/xxx
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`, `github`, or `feishu` |
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 via `settingSources: ['user']` |
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
- ### Template variables
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
- - `{date}` replaced with today's date (locale: zh-CN)
131
+ Converts Markdown to Feishu rich text (post format). h1 becomes the card title.
59
132
 
60
- ## Output Channels
133
+ **`output: github`**
61
134
 
62
- | Channel | Required config |
63
- |---------|----------------|
64
- | `file` | `outputDir` (default `./output`) |
65
- | `feishu` | `feishuWebhook` or `FEISHU_WEBHOOK` env |
66
- | `github` | `githubRepo`, `githubToken` or `GITHUB_TOKEN` env |
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`, the output step is skipped silently. Use this for tasks that only push when there's new content.
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/`). To disable for a specific task:
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` and fill in your values.
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 use `Asia/Shanghai` timezone.
180
+ All cron expressions run in `Asia/Shanghai` timezone. This is hardcoded in v0.1.
93
181
 
94
- ## Extending
182
+ ## Auto-start on macOS
95
183
 
96
- Adding a new output channel: implement `OutputChannel` interface and register it in `src/outputs/index.ts`.
184
+ To run `agent-cron start` as a background service that survives reboots:
97
185
 
98
- Adding a new agent runner: implement `AgentRunner` interface and register it in `src/agents/index.ts`.
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;AAErD,qBAAa,YAAa,YAAW,WAAW;IACxC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAqBvD"}
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"}
@@ -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
- const q = query({
7
- prompt,
8
- options: {
9
- cwd: process.cwd(),
10
- permissionMode: 'bypassPermissions',
11
- ...(loadSkills ? { settingSources: ['user'] } : {}),
12
- },
13
- });
14
- for await (const message of q) {
15
- if (message.type === 'result' && 'result' in message && message.result) {
16
- result = message.result;
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;AAGvD,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,IAAU;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;QACzC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,CAAC,GAAG,KAAK,CAAC;YACd,MAAM;YACN,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;gBAClB,cAAc,EAAE,mBAAmB;gBACnC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD;SACF,CAAC,CAAC;QAEH,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACvE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,6 @@ import type { OutputChannel, Task } from '../types.js';
2
2
  type FeishuInlineElement = {
3
3
  tag: 'text';
4
4
  text: string;
5
- style?: string[];
6
5
  } | {
7
6
  tag: 'a';
8
7
  text: string;
@@ -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,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/C;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"}
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"}
@@ -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], style: ['bold'] });
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 → bold line
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, style: ['bold'] }]);
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":"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"}
1
+ {"version":3,"file":"feishu.js","sourceRoot":"","sources":["../../src/outputs/feishu.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -4,7 +4,7 @@ export interface Task {
4
4
  cron: string;
5
5
  output: string;
6
6
  agent?: string;
7
- skills?: boolean;
7
+ skills?: boolean | string[];
8
8
  prompt: string;
9
9
  [key: string]: unknown;
10
10
  }
@@ -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;IAChB,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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t0u9h/agent-cron",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Run Claude Agent SDK tasks on a cron schedule. Tasks are defined as .md files.",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",