@t0u9h/agent-cron 0.2.0 → 0.2.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/dist/cli.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t0u9h/agent-cron",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
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",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=feishu-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feishu-server.d.ts","sourceRoot":"","sources":["../../src/mcp/feishu-server.ts"],"names":[],"mappings":""}
@@ -1,170 +0,0 @@
1
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
- import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
4
- const server = new Server({
5
- name: 'feishu-sender',
6
- version: '1.0.0',
7
- }, {
8
- capabilities: {
9
- tools: {},
10
- },
11
- });
12
- // Feishu webhook from environment
13
- const FEISHU_WEBHOOK = process.env.FEISHU_WEBHOOK;
14
- function parseInline(raw) {
15
- const elements = [];
16
- const re = /\[([^\]]+)\]\((https?:\/\/[^)]+)\)|\*\*([^*]+)\*\*/g;
17
- let last = 0;
18
- let m;
19
- while ((m = re.exec(raw)) !== null) {
20
- if (m.index > last) {
21
- elements.push({ tag: 'text', text: raw.slice(last, m.index) });
22
- }
23
- if (m[1] && m[2]) {
24
- elements.push({ tag: 'a', text: m[1], href: m[2] });
25
- }
26
- else if (m[3]) {
27
- elements.push({ tag: 'text', text: `「${m[3]}」` });
28
- }
29
- last = re.lastIndex;
30
- }
31
- if (last < raw.length) {
32
- elements.push({ tag: 'text', text: raw.slice(last) });
33
- }
34
- return elements.length > 0 ? elements : [{ tag: 'text', text: raw }];
35
- }
36
- function markdownToFeishuPost(markdown) {
37
- const lines = markdown.split('\n');
38
- let title = '';
39
- const content = [];
40
- for (const raw of lines) {
41
- const line = raw.trimEnd();
42
- // h1 → card title
43
- if (/^#\s+/.test(line)) {
44
- if (!title)
45
- title = line.replace(/^#\s+/, '');
46
- continue;
47
- }
48
- // h2/h3 → prefix with ▌
49
- if (/^#{2,3}\s+/.test(line)) {
50
- const text = '▌ ' + line.replace(/^#{2,3}\s+/, '');
51
- content.push([{ tag: 'text', text }]);
52
- continue;
53
- }
54
- // horizontal rule → empty line
55
- if (/^---+$/.test(line)) {
56
- content.push([{ tag: 'text', text: '' }]);
57
- continue;
58
- }
59
- // empty line
60
- if (line === '') {
61
- content.push([{ tag: 'text', text: '' }]);
62
- continue;
63
- }
64
- // list items → bullet prefix
65
- if (/^[-*]\s+/.test(line)) {
66
- const text = line.replace(/^[-*]\s+/, '• ');
67
- content.push(parseInline(text));
68
- continue;
69
- }
70
- // regular paragraph
71
- content.push(parseInline(line));
72
- }
73
- return { title: title || 'AI 日报', content };
74
- }
75
- server.setRequestHandler(ListToolsRequestSchema, async () => {
76
- return {
77
- tools: [
78
- {
79
- name: 'send_to_feishu',
80
- description: 'Send formatted message to Feishu webhook',
81
- inputSchema: {
82
- type: 'object',
83
- properties: {
84
- content: {
85
- type: 'string',
86
- description: 'The markdown content to send to Feishu',
87
- },
88
- webhook: {
89
- type: 'string',
90
- description: 'Optional webhook URL. If not provided, uses FEISHU_WEBHOOK env var',
91
- },
92
- },
93
- required: ['content'],
94
- },
95
- },
96
- ],
97
- };
98
- });
99
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
100
- if (request.params.name === 'send_to_feishu') {
101
- const { content, webhook } = request.params.arguments;
102
- const targetWebhook = webhook || FEISHU_WEBHOOK;
103
- if (!targetWebhook) {
104
- return {
105
- content: [
106
- {
107
- type: 'text',
108
- text: 'Error: No Feishu webhook configured. Set FEISHU_WEBHOOK env var or provide webhook parameter.',
109
- },
110
- ],
111
- };
112
- }
113
- try {
114
- const { title, content: feishuContent } = markdownToFeishuPost(content);
115
- const body = {
116
- msg_type: 'post',
117
- content: {
118
- post: {
119
- zh_cn: { title, content: feishuContent },
120
- },
121
- },
122
- };
123
- const res = await fetch(targetWebhook, {
124
- method: 'POST',
125
- headers: { 'Content-Type': 'application/json' },
126
- body: JSON.stringify(body),
127
- });
128
- if (!res.ok) {
129
- throw new Error(`Feishu request failed: ${res.status} ${await res.text()}`);
130
- }
131
- const json = (await res.json());
132
- if (json.code !== 0) {
133
- throw new Error(`Feishu error: code=${json.code} msg=${json.msg}`);
134
- }
135
- return {
136
- content: [
137
- {
138
- type: 'text',
139
- text: `✅ Successfully sent to Feishu with title: "${title}"`,
140
- },
141
- ],
142
- };
143
- }
144
- catch (error) {
145
- return {
146
- content: [
147
- {
148
- type: 'text',
149
- text: `❌ Failed to send to Feishu: ${error}`,
150
- },
151
- ],
152
- };
153
- }
154
- }
155
- return {
156
- content: [
157
- {
158
- type: 'text',
159
- text: `Unknown tool: ${request.params.name}`,
160
- },
161
- ],
162
- };
163
- });
164
- async function main() {
165
- const transport = new StdioServerTransport();
166
- await server.connect(transport);
167
- console.error('Feishu MCP server running');
168
- }
169
- main().catch(console.error);
170
- //# sourceMappingURL=feishu-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feishu-server.js","sourceRoot":"","sources":["../../src/mcp/feishu-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,kCAAkC;AAClC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAQlD,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,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,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,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,kBAAkB;QAClB,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,aAAa;QACb,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,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,0CAA0C;gBACvD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,wCAAwC;yBACtD;wBACD,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,oEAAoE;yBAClF;qBACF;oBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;iBACtB;aACF;SACF;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC7C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,SAG3C,CAAC;QAEF,MAAM,aAAa,GAAG,OAAO,IAAI,cAAc,CAAC;QAChD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,+FAA+F;qBACtG;iBACF;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAExE,MAAM,IAAI,GAAG;gBACX,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE;oBACP,IAAI,EAAE;wBACJ,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE;qBACzC;iBACF;aACF,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE;gBACrC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoC,CAAC;YACnE,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,8CAA8C,KAAK,GAAG;qBAC7D;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,+BAA+B,KAAK,EAAE;qBAC7C;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,iBAAiB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;aAC7C;SACF;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAC7C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -1,19 +0,0 @@
1
- import type { OutputChannel, Task } from '../types.js';
2
- type FeishuInlineElement = {
3
- tag: 'text';
4
- text: string;
5
- } | {
6
- tag: 'a';
7
- text: string;
8
- href: string;
9
- };
10
- type FeishuLine = FeishuInlineElement[];
11
- export declare function markdownToFeishuPost(markdown: string): {
12
- title: string;
13
- content: FeishuLine[];
14
- };
15
- export declare class FeishuChannel implements OutputChannel {
16
- send(result: string, task: Task): Promise<void>;
17
- }
18
- export {};
19
- //# sourceMappingURL=feishu.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,93 +0,0 @@
1
- function parseInline(raw) {
2
- const elements = [];
3
- // Match [text](url) links and **bold**
4
- const re = /\[([^\]]+)\]\((https?:\/\/[^)]+)\)|\*\*([^*]+)\*\*/g;
5
- let last = 0;
6
- let m;
7
- while ((m = re.exec(raw)) !== null) {
8
- if (m.index > last) {
9
- elements.push({ tag: 'text', text: raw.slice(last, m.index) });
10
- }
11
- if (m[1] && m[2]) {
12
- elements.push({ tag: 'a', text: m[1], href: m[2] });
13
- }
14
- else if (m[3]) {
15
- elements.push({ tag: 'text', text: `「${m[3]}」` });
16
- }
17
- last = re.lastIndex;
18
- }
19
- if (last < raw.length) {
20
- elements.push({ tag: 'text', text: raw.slice(last) });
21
- }
22
- return elements.length > 0 ? elements : [{ tag: 'text', text: raw }];
23
- }
24
- export function markdownToFeishuPost(markdown) {
25
- const lines = markdown.split('\n');
26
- let title = '';
27
- const content = [];
28
- for (const raw of lines) {
29
- const line = raw.trimEnd();
30
- // h1 → card title (first one wins)
31
- if (/^#\s+/.test(line)) {
32
- if (!title)
33
- title = line.replace(/^#\s+/, '');
34
- continue;
35
- }
36
- // h2/h3 → prefix with ▌
37
- if (/^#{2,3}\s+/.test(line)) {
38
- const text = '▌ ' + line.replace(/^#{2,3}\s+/, '');
39
- content.push([{ tag: 'text', text }]);
40
- continue;
41
- }
42
- // horizontal rule → empty line
43
- if (/^---+$/.test(line)) {
44
- content.push([{ tag: 'text', text: '' }]);
45
- continue;
46
- }
47
- // empty line → empty line
48
- if (line === '') {
49
- content.push([{ tag: 'text', text: '' }]);
50
- continue;
51
- }
52
- // list items → bullet prefix
53
- if (/^[-*]\s+/.test(line)) {
54
- const text = line.replace(/^[-*]\s+/, '• ');
55
- content.push(parseInline(text));
56
- continue;
57
- }
58
- // regular paragraph
59
- content.push(parseInline(line));
60
- }
61
- return { title: title || 'Agent Report', content };
62
- }
63
- export class FeishuChannel {
64
- async send(result, task) {
65
- const webhook = task.feishuWebhook ?? process.env.FEISHU_WEBHOOK;
66
- if (!webhook) {
67
- throw new Error(`[agent-cron] feishu: missing webhook for task "${task.name}". Set feishuWebhook in frontmatter or FEISHU_WEBHOOK env var.`);
68
- }
69
- const { title, content } = markdownToFeishuPost(result);
70
- const body = {
71
- msg_type: 'post',
72
- content: {
73
- post: {
74
- zh_cn: { title, content },
75
- },
76
- },
77
- };
78
- const res = await fetch(webhook, {
79
- method: 'POST',
80
- headers: { 'Content-Type': 'application/json' },
81
- body: JSON.stringify(body),
82
- });
83
- if (!res.ok) {
84
- throw new Error(`[agent-cron] feishu: request failed: ${res.status} ${await res.text()}`);
85
- }
86
- const json = (await res.json());
87
- if (json.code !== 0) {
88
- throw new Error(`[agent-cron] feishu: error response: code=${json.code} msg=${json.msg}`);
89
- }
90
- console.log(`[agent-cron] pushed to Feishu (${task.name})`);
91
- }
92
- }
93
- //# sourceMappingURL=feishu.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feishu.js","sourceRoot":"","sources":["../../src/outputs/feishu.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { OutputChannel, Task } from '../types.js';
2
- export declare class FileChannel implements OutputChannel {
3
- send(result: string, task: Task): Promise<void>;
4
- }
5
- //# sourceMappingURL=file.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/outputs/file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEvD,qBAAa,WAAY,YAAW,aAAa;IACzC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAStD"}
@@ -1,13 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- export class FileChannel {
4
- async send(result, task) {
5
- const outputDir = String(task.outputDir ?? './output');
6
- fs.mkdirSync(outputDir, { recursive: true });
7
- const date = new Date().toISOString().split('T')[0];
8
- const filePath = path.join(outputDir, `${task.slug}-${date}.md`);
9
- fs.writeFileSync(filePath, result, 'utf-8');
10
- console.log(`[agent-cron] written to ${filePath} (${task.name})`);
11
- }
12
- }
13
- //# sourceMappingURL=file.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/outputs/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,IAAU;QACnC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC;QACvD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC;QACjE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACpE,CAAC;CACF"}
@@ -1,5 +0,0 @@
1
- import type { OutputChannel, Task } from '../types.js';
2
- export declare class GithubChannel implements OutputChannel {
3
- send(result: string, task: Task): Promise<void>;
4
- }
5
- //# sourceMappingURL=github.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/outputs/github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEvD,qBAAa,aAAc,YAAW,aAAa;IAC3C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAyDtD"}
@@ -1,51 +0,0 @@
1
- import { Octokit } from '@octokit/rest';
2
- export class GithubChannel {
3
- async send(result, task) {
4
- const repo = task.githubRepo;
5
- if (!repo) {
6
- throw new Error(`[agent-cron] github: missing githubRepo for task "${task.name}"`);
7
- }
8
- const [owner, repoName] = repo.split('/');
9
- if (!owner || !repoName) {
10
- throw new Error(`[agent-cron] github: invalid githubRepo format "${repo}", expected "owner/repo"`);
11
- }
12
- const token = task.githubToken ?? process.env.GITHUB_TOKEN;
13
- if (!token) {
14
- throw new Error(`[agent-cron] github: missing token for task "${task.name}". Set githubToken in frontmatter or GITHUB_TOKEN env var.`);
15
- }
16
- const branch = String(task.githubBranch ?? 'main');
17
- const dir = task.githubDir ? String(task.githubDir) : '';
18
- const date = new Date().toISOString().split('T')[0];
19
- const fileName = `${task.slug}-${date}.md`;
20
- const filePath = dir ? `${dir}/${fileName}` : fileName;
21
- const octokit = new Octokit({ auth: token });
22
- const content = Buffer.from(result, 'utf-8').toString('base64');
23
- const message = `chore: ${task.name} ${date}`;
24
- // Check if file exists (to get sha for update)
25
- let sha;
26
- try {
27
- const { data } = await octokit.repos.getContent({
28
- owner,
29
- repo: repoName,
30
- path: filePath,
31
- ref: branch,
32
- });
33
- if (!Array.isArray(data) && data.type === 'file')
34
- sha = data.sha;
35
- }
36
- catch {
37
- // file doesn't exist yet, sha stays undefined
38
- }
39
- await octokit.repos.createOrUpdateFileContents({
40
- owner,
41
- repo: repoName,
42
- path: filePath,
43
- message,
44
- content,
45
- branch,
46
- ...(sha ? { sha } : {}),
47
- });
48
- console.log(`[agent-cron] pushed to GitHub ${repo}/${filePath} (${task.name})`);
49
- }
50
- }
51
- //# sourceMappingURL=github.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/outputs/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,IAAU;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAgC,CAAC;QACnD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,qDAAqD,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,mDAAmD,IAAI,0BAA0B,CAClF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GACR,IAAI,CAAC,WAAkC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACvE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,gDAAgD,IAAI,CAAC,IAAI,4DAA4D,CACtH,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,UAAU,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QAE9C,+CAA+C;QAC/C,IAAI,GAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC9C,KAAK;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,MAAM;aACZ,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;QAED,MAAM,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC;YAC7C,KAAK;YACL,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,OAAO;YACP,OAAO;YACP,MAAM;YACN,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAClF,CAAC;CACF"}
@@ -1,3 +0,0 @@
1
- import type { OutputChannel } from '../types.js';
2
- export declare const channels: Record<string, OutputChannel>;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outputs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAKlD,CAAC"}
@@ -1,10 +0,0 @@
1
- import { FileChannel } from './file.js';
2
- import { FeishuChannel } from './feishu.js';
3
- import { GithubChannel } from './github.js';
4
- export const channels = {
5
- file: new FileChannel(),
6
- feishu: new FeishuChannel(),
7
- github: new GithubChannel(),
8
- // future: slack, telegram, discord, webhook, ...
9
- };
10
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outputs/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAkC;IACrD,IAAI,EAAI,IAAI,WAAW,EAAE;IACzB,MAAM,EAAE,IAAI,aAAa,EAAE;IAC3B,MAAM,EAAE,IAAI,aAAa,EAAE;IAC3B,iDAAiD;CAClD,CAAC"}