@patrick-rodgers/cron-claude 0.1.2 → 0.1.4

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.
Files changed (53) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.mcp.json +2 -2
  3. package/CLAUDE.md +63 -17
  4. package/README.md +55 -13
  5. package/dist/cli.js +1 -2
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config.d.ts +5 -5
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +21 -2
  10. package/dist/config.js.map +1 -1
  11. package/dist/executor.d.ts +1 -1
  12. package/dist/executor.d.ts.map +1 -1
  13. package/dist/executor.js +26 -14
  14. package/dist/executor.js.map +1 -1
  15. package/dist/logger.d.ts +3 -3
  16. package/dist/logger.d.ts.map +1 -1
  17. package/dist/logger.js +17 -37
  18. package/dist/logger.js.map +1 -1
  19. package/dist/mcp-server.js +101 -69
  20. package/dist/mcp-server.js.map +1 -1
  21. package/dist/scheduler.d.ts.map +1 -1
  22. package/dist/scheduler.js +106 -8
  23. package/dist/scheduler.js.map +1 -1
  24. package/dist/storage/factory.d.ts +18 -0
  25. package/dist/storage/factory.d.ts.map +1 -0
  26. package/dist/storage/factory.js +56 -0
  27. package/dist/storage/factory.js.map +1 -0
  28. package/dist/storage/file-storage.d.ts +33 -0
  29. package/dist/storage/file-storage.d.ts.map +1 -0
  30. package/dist/storage/file-storage.js +120 -0
  31. package/dist/storage/file-storage.js.map +1 -0
  32. package/dist/storage/index.d.ts +8 -0
  33. package/dist/storage/index.d.ts.map +1 -0
  34. package/dist/storage/index.js +7 -0
  35. package/dist/storage/index.js.map +1 -0
  36. package/dist/storage/interface.d.ts +43 -0
  37. package/dist/storage/interface.d.ts.map +1 -0
  38. package/dist/storage/interface.js +6 -0
  39. package/dist/storage/interface.js.map +1 -0
  40. package/dist/storage/memory-storage.d.ts +42 -0
  41. package/dist/storage/memory-storage.d.ts.map +1 -0
  42. package/dist/storage/memory-storage.js +217 -0
  43. package/dist/storage/memory-storage.js.map +1 -0
  44. package/dist/tasks.d.ts +40 -0
  45. package/dist/tasks.d.ts.map +1 -0
  46. package/dist/tasks.js +141 -0
  47. package/dist/tasks.js.map +1 -0
  48. package/dist/types.d.ts +6 -0
  49. package/dist/types.d.ts.map +1 -1
  50. package/package.json +1 -1
  51. package/tasks/morning-greeting.md +17 -0
  52. package/tasks/example-daily-summary.md +0 -37
  53. package/tasks/example-weekly-backup.md +0 -27
package/dist/tasks.js ADDED
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Task management functions
3
+ * Simple file-based operations for task definitions
4
+ */
5
+ import { readdirSync, readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from 'fs';
6
+ import { join } from 'path';
7
+ import matter from 'gray-matter';
8
+ import { loadConfig } from './config.js';
9
+ /**
10
+ * Get the tasks directory from config
11
+ */
12
+ function getTasksDir() {
13
+ const config = loadConfig();
14
+ return config.tasksDir;
15
+ }
16
+ /**
17
+ * Ensure tasks directory exists
18
+ */
19
+ function ensureTasksDir() {
20
+ const tasksDir = getTasksDir();
21
+ if (!existsSync(tasksDir)) {
22
+ mkdirSync(tasksDir, { recursive: true });
23
+ }
24
+ }
25
+ /**
26
+ * Get file path for a task
27
+ */
28
+ export function getTaskFilePath(taskId) {
29
+ return join(getTasksDir(), `${taskId}.md`);
30
+ }
31
+ /**
32
+ * Convert TaskDefinition to markdown with YAML frontmatter
33
+ */
34
+ function taskToMarkdown(task) {
35
+ return `---
36
+ id: ${task.id}
37
+ schedule: "${task.schedule}"
38
+ invocation: ${task.invocation}
39
+ notifications:
40
+ toast: ${task.notifications.toast}
41
+ enabled: ${task.enabled}
42
+ ---
43
+
44
+ ${task.instructions}
45
+ `;
46
+ }
47
+ /**
48
+ * Parse markdown file to TaskDefinition
49
+ */
50
+ function parseTaskFile(filePath) {
51
+ const content = readFileSync(filePath, 'utf-8');
52
+ const parsed = matter(content);
53
+ return {
54
+ id: parsed.data.id || 'unknown',
55
+ schedule: parsed.data.schedule || '0 0 * * *',
56
+ invocation: parsed.data.invocation || 'cli',
57
+ notifications: parsed.data.notifications || { toast: false },
58
+ enabled: parsed.data.enabled !== false,
59
+ instructions: parsed.content,
60
+ };
61
+ }
62
+ /**
63
+ * Create a new task
64
+ */
65
+ export function createTask(task) {
66
+ ensureTasksDir();
67
+ const filePath = getTaskFilePath(task.id);
68
+ if (existsSync(filePath)) {
69
+ throw new Error(`Task "${task.id}" already exists`);
70
+ }
71
+ const markdown = taskToMarkdown(task);
72
+ writeFileSync(filePath, markdown, 'utf-8');
73
+ }
74
+ /**
75
+ * Get a task by ID
76
+ */
77
+ export function getTask(taskId) {
78
+ const filePath = getTaskFilePath(taskId);
79
+ if (!existsSync(filePath)) {
80
+ return null;
81
+ }
82
+ return parseTaskFile(filePath);
83
+ }
84
+ /**
85
+ * Update an existing task
86
+ */
87
+ export function updateTask(taskId, task) {
88
+ const filePath = getTaskFilePath(taskId);
89
+ if (!existsSync(filePath)) {
90
+ throw new Error(`Task "${taskId}" not found`);
91
+ }
92
+ const markdown = taskToMarkdown(task);
93
+ writeFileSync(filePath, markdown, 'utf-8');
94
+ }
95
+ /**
96
+ * Delete a task by ID
97
+ */
98
+ export function deleteTask(taskId) {
99
+ const filePath = getTaskFilePath(taskId);
100
+ if (!existsSync(filePath)) {
101
+ throw new Error(`Task "${taskId}" not found`);
102
+ }
103
+ unlinkSync(filePath);
104
+ }
105
+ /**
106
+ * List all tasks (metadata only)
107
+ */
108
+ export function listTasks() {
109
+ ensureTasksDir();
110
+ try {
111
+ const files = readdirSync(getTasksDir()).filter((f) => f.endsWith('.md'));
112
+ const tasks = [];
113
+ for (const file of files) {
114
+ try {
115
+ const filePath = join(getTasksDir(), file);
116
+ const task = parseTaskFile(filePath);
117
+ tasks.push({
118
+ id: task.id,
119
+ schedule: task.schedule,
120
+ invocation: task.invocation,
121
+ enabled: task.enabled,
122
+ });
123
+ }
124
+ catch (error) {
125
+ console.error(`Error parsing task file ${file}:`, error);
126
+ }
127
+ }
128
+ return tasks;
129
+ }
130
+ catch {
131
+ return [];
132
+ }
133
+ }
134
+ /**
135
+ * Check if a task exists
136
+ */
137
+ export function taskExists(taskId) {
138
+ const filePath = getTaskFilePath(taskId);
139
+ return existsSync(filePath);
140
+ }
141
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -34,4 +34,10 @@ export interface ExecutionResult {
34
34
  error?: string;
35
35
  steps: LogStep[];
36
36
  }
37
+ export interface Config {
38
+ secretKey: string;
39
+ version: string;
40
+ tasksDir: string;
41
+ logsDir: string;
42
+ }
37
43
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,KAAK,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE;QACb,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,KAAK,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE;QACb,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patrick-rodgers/cron-claude",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Scheduled Claude task execution - MCP server for automating recurring tasks via cron schedules",
5
5
  "type": "module",
6
6
  "main": "dist/mcp-server.js",
@@ -0,0 +1,17 @@
1
+ ---
2
+ id: morning-greeting
3
+ schedule: "0 9 * * *"
4
+ invocation: cli
5
+ notifications:
6
+ toast: true
7
+ enabled: true
8
+ ---
9
+
10
+ # Morning Greeting Task
11
+
12
+ Please create a brief morning greeting message that includes:
13
+ - Current date and day of week
14
+ - A motivational quote
15
+ - Weather reminder (generic)
16
+
17
+ Keep it friendly and concise (2-3 sentences).
@@ -1,37 +0,0 @@
1
- ---
2
- id: example-daily-summary
3
- schedule: "0 9 * * *" # Every day at 9 AM
4
- invocation: cli
5
- notifications:
6
- toast: true
7
- enabled: false # Set to true when ready to use
8
- ---
9
-
10
- # Daily Summary Task
11
-
12
- Please create a daily summary for me.
13
-
14
- ## Tasks
15
-
16
- 1. Check my calendar for today's meetings
17
- 2. Review any urgent emails from the last 24 hours
18
- 3. Create a brief summary report (bullet points)
19
-
20
- ## Output Format
21
-
22
- Please format the output as:
23
-
24
- ### Daily Summary - [Date]
25
-
26
- **Meetings Today:**
27
- - [List of meetings]
28
-
29
- **Urgent Items:**
30
- - [Any urgent emails or tasks]
31
-
32
- **Notes:**
33
- - [Any other important information]
34
-
35
- ---
36
-
37
- Save this summary to my OneDrive documents folder as `daily-summary-[date].md`.
@@ -1,27 +0,0 @@
1
- ---
2
- id: example-weekly-backup
3
- schedule: "0 0 * * 0" # Every Sunday at midnight
4
- invocation: cli
5
- notifications:
6
- toast: true
7
- enabled: false
8
- ---
9
-
10
- # Weekly Backup Task
11
-
12
- Perform a weekly backup of important project files.
13
-
14
- ## Instructions
15
-
16
- 1. Search for all `.md` files in my Documents folder modified in the last 7 days
17
- 2. Create a backup report listing:
18
- - File names
19
- - Sizes
20
- - Last modified dates
21
- 3. If any files are larger than 10MB, flag them for review
22
-
23
- ## Output
24
-
25
- Create a backup report and save it to `C:\Users\[username]\OneDrive\Backups\weekly-report-[date].md`
26
-
27
- Include recommendations for files that should be archived or cleaned up.