@wonsukchoi/crondex 0.1.0 → 0.2.0
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 +80 -26
- package/bin/crondex.js +1 -1
- package/catalog.json +347 -1
- package/jobs/content/broken-link-check.yaml +33 -0
- package/jobs/content/changelog-digest.yaml +40 -0
- package/jobs/content/social-mentions-watch.yaml +32 -0
- package/jobs/devops/disk-space-check.yaml +26 -0
- package/jobs/devops/docker-image-prune.yaml +24 -0
- package/jobs/devops/env-drift-check.yaml +34 -0
- package/jobs/devops/stale-dependency-pr-nudge.yaml +25 -0
- package/jobs/finance/net-worth-snapshot.yaml +33 -0
- package/jobs/finance/subscription-audit.yaml +34 -0
- package/jobs/personal/bill-due-reminder.yaml +32 -0
- package/jobs/personal/habit-checkin.yaml +35 -0
- package/jobs/personal/meal-plan-reminder.yaml +31 -0
- package/jobs/personal/screen-time-check.yaml +27 -0
- package/jobs/personal/water-intake-reminder.yaml +20 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,21 +18,35 @@ adjusts `schedule`/`variables`, and wires it into whatever scheduler it has.
|
|
|
18
18
|
|
|
19
19
|
## CLI
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
Published on npm as `@wonsukchoi/crondex` (the plain name `crondex` was
|
|
22
|
+
blocked by npm's anti-typosquat check). The command itself is still
|
|
23
|
+
`crondex` once installed — only the package name is scoped:
|
|
23
24
|
|
|
24
25
|
```bash
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
npx @wonsukchoi/crondex list # browse everything
|
|
27
|
+
npx @wonsukchoi/crondex list --category devops # filter by category or --tag
|
|
28
|
+
npx @wonsukchoi/crondex show backup-reminder # print one job's YAML
|
|
29
|
+
npx @wonsukchoi/crondex add backup-reminder --dest ./cron/backup-reminder.yaml
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or install once and drop the scope prefix on every call:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install -g @wonsukchoi/crondex
|
|
36
|
+
crondex list
|
|
30
37
|
```
|
|
31
38
|
|
|
32
39
|
`add` copies the job's YAML as-is into your project — it's yours to edit
|
|
33
|
-
from there
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
from there. `npx` always pulls the latest published catalog; a global
|
|
41
|
+
install needs `npm update -g @wonsukchoi/crondex` to see new jobs (`crondex
|
|
42
|
+
list` prints a reminder either way).
|
|
43
|
+
|
|
44
|
+
A clone works too, no npm required:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
git clone https://github.com/wonsukchoi/crondex.git && cd crondex
|
|
48
|
+
node bin/crondex.js list
|
|
49
|
+
```
|
|
36
50
|
|
|
37
51
|
## Layout
|
|
38
52
|
|
|
@@ -43,7 +57,10 @@ crondex/
|
|
|
43
57
|
├── schema/job.schema.json spec every job file follows
|
|
44
58
|
├── jobs/
|
|
45
59
|
│ ├── devops/
|
|
46
|
-
│
|
|
60
|
+
│ ├── productivity/
|
|
61
|
+
│ ├── personal/
|
|
62
|
+
│ ├── content/
|
|
63
|
+
│ └── finance/
|
|
47
64
|
└── scripts/
|
|
48
65
|
├── build-catalog.js regenerates catalog.json from jobs/**/*.yaml
|
|
49
66
|
└── validate-jobs.js validates every job against the schema
|
|
@@ -51,21 +68,58 @@ crondex/
|
|
|
51
68
|
|
|
52
69
|
## Available jobs
|
|
53
70
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
|
61
|
-
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
24 jobs across 5 categories. Full details (description, tags, variables)
|
|
72
|
+
live in `catalog.json` and each job's YAML file — run `crondex list` or
|
|
73
|
+
browse `jobs/<category>/` for the plain-language rundown of each.
|
|
74
|
+
|
|
75
|
+
**devops**
|
|
76
|
+
|
|
77
|
+
| id | schedule | modes |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| `dependency-audit` | `0 8 * * 1` | script + agent-prompt |
|
|
80
|
+
| `log-cleanup` | `30 3 * * *` | script |
|
|
81
|
+
| `repo-health-check` | `0 9 * * 1-5` | script + agent-prompt |
|
|
82
|
+
| `backup-reminder` | `0 9 * * *` | script |
|
|
83
|
+
| `ssl-cert-expiry-check` | `0 6 * * *` | script |
|
|
84
|
+
| `uptime-ping-check` | `*/15 * * * *` | script |
|
|
85
|
+
| `cost-alert` | `0 7 * * *` | script + agent-prompt |
|
|
86
|
+
| `disk-space-check` | `0 */6 * * *` | script |
|
|
87
|
+
| `docker-image-prune` | `0 4 * * *` | script |
|
|
88
|
+
| `env-drift-check` | `0 8 * * *` | script |
|
|
89
|
+
| `stale-dependency-pr-nudge` | `0 9 * * 1-5` | script |
|
|
90
|
+
|
|
91
|
+
**productivity**
|
|
92
|
+
|
|
93
|
+
| id | schedule | modes |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| `daily-standup-summary` | `0 8 * * 1-5` | script + agent-prompt |
|
|
96
|
+
| `inbox-triage` | `0 7,13 * * 1-5` | agent-prompt only |
|
|
97
|
+
| `weekly-report` | `0 16 * * 5` | script + agent-prompt |
|
|
98
|
+
|
|
99
|
+
**personal**
|
|
100
|
+
|
|
101
|
+
| id | schedule | modes |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| `bill-due-reminder` | `0 9 * * *` | script |
|
|
104
|
+
| `habit-checkin` | `0 20 * * *` | script |
|
|
105
|
+
| `meal-plan-reminder` | `0 9 * * 0` | script + agent-prompt |
|
|
106
|
+
| `water-intake-reminder` | `0 9,12,15,18 * * *` | script |
|
|
107
|
+
| `screen-time-check` | `0 20 * * *` | agent-prompt only |
|
|
108
|
+
|
|
109
|
+
**content**
|
|
110
|
+
|
|
111
|
+
| id | schedule | modes |
|
|
112
|
+
|---|---|---|
|
|
113
|
+
| `changelog-digest` | `0 10 * * 5` | script + agent-prompt |
|
|
114
|
+
| `broken-link-check` | `0 7 * * 1` | script |
|
|
115
|
+
| `social-mentions-watch` | `0 9 * * *` | agent-prompt only |
|
|
116
|
+
|
|
117
|
+
**finance**
|
|
118
|
+
|
|
119
|
+
| id | schedule | modes |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| `subscription-audit` | `0 9 1 * *` | script |
|
|
122
|
+
| `net-worth-snapshot` | `0 9 1 * *` | script |
|
|
69
123
|
|
|
70
124
|
## How a job works
|
|
71
125
|
|
package/bin/crondex.js
CHANGED
|
@@ -42,7 +42,7 @@ function catalogInfoLine() {
|
|
|
42
42
|
const viaNpx = process.env.npm_command === "exec";
|
|
43
43
|
const freshness = viaNpx
|
|
44
44
|
? "running via npx — you're always on the latest catalog."
|
|
45
|
-
:
|
|
45
|
+
: `running from a local/global install — run \`npm update -g ${PKG.name}\` (or re-pull) if new jobs seem missing.`;
|
|
46
46
|
return `crondex v${PKG.version} — ${CATALOG.count} jobs. ${freshness}`;
|
|
47
47
|
}
|
|
48
48
|
|
package/catalog.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"generated_by": "scripts/build-catalog.js",
|
|
3
3
|
"schema": "schema/job.schema.json",
|
|
4
|
-
"count":
|
|
4
|
+
"count": 24,
|
|
5
5
|
"jobs": [
|
|
6
6
|
{
|
|
7
7
|
"id": "backup-reminder",
|
|
@@ -27,6 +27,81 @@
|
|
|
27
27
|
],
|
|
28
28
|
"path": "jobs/devops/backup-reminder.yaml"
|
|
29
29
|
},
|
|
30
|
+
{
|
|
31
|
+
"id": "bill-due-reminder",
|
|
32
|
+
"version": 1,
|
|
33
|
+
"name": "Bill Due Reminder",
|
|
34
|
+
"description": "Warns you a few days before a recurring monthly bill is due. Use this if you've ever paid a late fee just because you forgot the date.",
|
|
35
|
+
"category": "personal",
|
|
36
|
+
"tags": [
|
|
37
|
+
"bills",
|
|
38
|
+
"finance",
|
|
39
|
+
"reminder"
|
|
40
|
+
],
|
|
41
|
+
"schedule": "0 9 * * *",
|
|
42
|
+
"timezone": "America/Los_Angeles",
|
|
43
|
+
"runner": "shell",
|
|
44
|
+
"modes": [
|
|
45
|
+
"script"
|
|
46
|
+
],
|
|
47
|
+
"compatible_agents": [
|
|
48
|
+
"generic",
|
|
49
|
+
"claude",
|
|
50
|
+
"codex"
|
|
51
|
+
],
|
|
52
|
+
"path": "jobs/personal/bill-due-reminder.yaml"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "broken-link-check",
|
|
56
|
+
"version": 1,
|
|
57
|
+
"name": "Broken Link Check",
|
|
58
|
+
"description": "Checks a list of URLs and reports any that are dead. Use this if your site or docs have outbound/internal links that quietly rot over time.",
|
|
59
|
+
"category": "content",
|
|
60
|
+
"tags": [
|
|
61
|
+
"links",
|
|
62
|
+
"content",
|
|
63
|
+
"maintenance"
|
|
64
|
+
],
|
|
65
|
+
"schedule": "0 7 * * 1",
|
|
66
|
+
"timezone": "UTC",
|
|
67
|
+
"runner": "shell",
|
|
68
|
+
"modes": [
|
|
69
|
+
"script"
|
|
70
|
+
],
|
|
71
|
+
"compatible_agents": [
|
|
72
|
+
"generic",
|
|
73
|
+
"claude",
|
|
74
|
+
"codex"
|
|
75
|
+
],
|
|
76
|
+
"path": "jobs/content/broken-link-check.yaml"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "changelog-digest",
|
|
80
|
+
"version": 1,
|
|
81
|
+
"name": "Changelog Digest",
|
|
82
|
+
"description": "Rolls up recent commits into a draft changelog entry your users could actually read. Use this if you ship regularly but always write the changelog as an afterthought (or skip it).",
|
|
83
|
+
"category": "content",
|
|
84
|
+
"tags": [
|
|
85
|
+
"changelog",
|
|
86
|
+
"release",
|
|
87
|
+
"docs"
|
|
88
|
+
],
|
|
89
|
+
"schedule": "0 10 * * 5",
|
|
90
|
+
"timezone": "UTC",
|
|
91
|
+
"runner": "hybrid",
|
|
92
|
+
"modes": [
|
|
93
|
+
"script",
|
|
94
|
+
"agent-prompt"
|
|
95
|
+
],
|
|
96
|
+
"compatible_agents": [
|
|
97
|
+
"claude",
|
|
98
|
+
"codex",
|
|
99
|
+
"hermes",
|
|
100
|
+
"openclaw",
|
|
101
|
+
"generic"
|
|
102
|
+
],
|
|
103
|
+
"path": "jobs/content/changelog-digest.yaml"
|
|
104
|
+
},
|
|
30
105
|
{
|
|
31
106
|
"id": "cost-alert",
|
|
32
107
|
"version": 1,
|
|
@@ -108,6 +183,102 @@
|
|
|
108
183
|
],
|
|
109
184
|
"path": "jobs/devops/dependency-audit.yaml"
|
|
110
185
|
},
|
|
186
|
+
{
|
|
187
|
+
"id": "disk-space-check",
|
|
188
|
+
"version": 1,
|
|
189
|
+
"name": "Disk Space Check",
|
|
190
|
+
"description": "Checks how full a disk/volume is and warns you before it fills up. Use this if you've ever had a server or laptop grind to a halt because disk usage crept up unnoticed.",
|
|
191
|
+
"category": "devops",
|
|
192
|
+
"tags": [
|
|
193
|
+
"disk",
|
|
194
|
+
"monitoring",
|
|
195
|
+
"maintenance"
|
|
196
|
+
],
|
|
197
|
+
"schedule": "0 */6 * * *",
|
|
198
|
+
"timezone": "UTC",
|
|
199
|
+
"runner": "shell",
|
|
200
|
+
"modes": [
|
|
201
|
+
"script"
|
|
202
|
+
],
|
|
203
|
+
"compatible_agents": [
|
|
204
|
+
"generic",
|
|
205
|
+
"claude",
|
|
206
|
+
"codex"
|
|
207
|
+
],
|
|
208
|
+
"path": "jobs/devops/disk-space-check.yaml"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"id": "docker-image-prune",
|
|
212
|
+
"version": 1,
|
|
213
|
+
"name": "Docker Image & Container Prune",
|
|
214
|
+
"description": "Cleans up stopped containers and dangling Docker images so they don't quietly eat your disk. Use this if you run Docker locally or on a server and never remember to clean up after yourself.",
|
|
215
|
+
"category": "devops",
|
|
216
|
+
"tags": [
|
|
217
|
+
"docker",
|
|
218
|
+
"cleanup",
|
|
219
|
+
"disk-space"
|
|
220
|
+
],
|
|
221
|
+
"schedule": "0 4 * * *",
|
|
222
|
+
"timezone": "UTC",
|
|
223
|
+
"runner": "shell",
|
|
224
|
+
"modes": [
|
|
225
|
+
"script"
|
|
226
|
+
],
|
|
227
|
+
"compatible_agents": [
|
|
228
|
+
"generic",
|
|
229
|
+
"claude",
|
|
230
|
+
"codex"
|
|
231
|
+
],
|
|
232
|
+
"path": "jobs/devops/docker-image-prune.yaml"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"id": "env-drift-check",
|
|
236
|
+
"version": 1,
|
|
237
|
+
"name": "Env File Drift Check",
|
|
238
|
+
"description": "Compares your .env against .env.example and flags keys that are missing or extra. Use this if you've ever deployed and hit a crash because a new required env var never got set.",
|
|
239
|
+
"category": "devops",
|
|
240
|
+
"tags": [
|
|
241
|
+
"config",
|
|
242
|
+
"env",
|
|
243
|
+
"drift"
|
|
244
|
+
],
|
|
245
|
+
"schedule": "0 8 * * *",
|
|
246
|
+
"timezone": "UTC",
|
|
247
|
+
"runner": "shell",
|
|
248
|
+
"modes": [
|
|
249
|
+
"script"
|
|
250
|
+
],
|
|
251
|
+
"compatible_agents": [
|
|
252
|
+
"generic",
|
|
253
|
+
"claude",
|
|
254
|
+
"codex"
|
|
255
|
+
],
|
|
256
|
+
"path": "jobs/devops/env-drift-check.yaml"
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"id": "habit-checkin",
|
|
260
|
+
"version": 1,
|
|
261
|
+
"name": "Daily Habit Check-in",
|
|
262
|
+
"description": "Reminds you to log a habit each day and reports your current streak. Use this if you're trying to build a habit and want a daily nudge plus a running streak count without a separate app.",
|
|
263
|
+
"category": "personal",
|
|
264
|
+
"tags": [
|
|
265
|
+
"habit",
|
|
266
|
+
"streak",
|
|
267
|
+
"reminder"
|
|
268
|
+
],
|
|
269
|
+
"schedule": "0 20 * * *",
|
|
270
|
+
"timezone": "America/Los_Angeles",
|
|
271
|
+
"runner": "shell",
|
|
272
|
+
"modes": [
|
|
273
|
+
"script"
|
|
274
|
+
],
|
|
275
|
+
"compatible_agents": [
|
|
276
|
+
"generic",
|
|
277
|
+
"claude",
|
|
278
|
+
"codex"
|
|
279
|
+
],
|
|
280
|
+
"path": "jobs/personal/habit-checkin.yaml"
|
|
281
|
+
},
|
|
111
282
|
{
|
|
112
283
|
"id": "inbox-triage",
|
|
113
284
|
"version": 1,
|
|
@@ -157,6 +328,57 @@
|
|
|
157
328
|
],
|
|
158
329
|
"path": "jobs/devops/log-cleanup.yaml"
|
|
159
330
|
},
|
|
331
|
+
{
|
|
332
|
+
"id": "meal-plan-reminder",
|
|
333
|
+
"version": 1,
|
|
334
|
+
"name": "Weekly Meal Plan Reminder",
|
|
335
|
+
"description": "Nudges you to plan the week's meals, and can draft a simple 7-day plan plus grocery list for you. Use this if you dread the \"what's for dinner\" question every night and want to decide once a week instead.",
|
|
336
|
+
"category": "personal",
|
|
337
|
+
"tags": [
|
|
338
|
+
"meals",
|
|
339
|
+
"planning",
|
|
340
|
+
"household"
|
|
341
|
+
],
|
|
342
|
+
"schedule": "0 9 * * 0",
|
|
343
|
+
"timezone": "America/Los_Angeles",
|
|
344
|
+
"runner": "hybrid",
|
|
345
|
+
"modes": [
|
|
346
|
+
"script",
|
|
347
|
+
"agent-prompt"
|
|
348
|
+
],
|
|
349
|
+
"compatible_agents": [
|
|
350
|
+
"claude",
|
|
351
|
+
"codex",
|
|
352
|
+
"hermes",
|
|
353
|
+
"openclaw",
|
|
354
|
+
"generic"
|
|
355
|
+
],
|
|
356
|
+
"path": "jobs/personal/meal-plan-reminder.yaml"
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"id": "net-worth-snapshot",
|
|
360
|
+
"version": 1,
|
|
361
|
+
"name": "Net Worth Snapshot Reminder",
|
|
362
|
+
"description": "Reminds you to log your net worth each month and shows the trend from your last two entries. Use this if you want to track your finances over time but keep forgetting to actually sit down and do it.",
|
|
363
|
+
"category": "finance",
|
|
364
|
+
"tags": [
|
|
365
|
+
"finance",
|
|
366
|
+
"net-worth",
|
|
367
|
+
"tracking"
|
|
368
|
+
],
|
|
369
|
+
"schedule": "0 9 1 * *",
|
|
370
|
+
"timezone": "UTC",
|
|
371
|
+
"runner": "shell",
|
|
372
|
+
"modes": [
|
|
373
|
+
"script"
|
|
374
|
+
],
|
|
375
|
+
"compatible_agents": [
|
|
376
|
+
"generic",
|
|
377
|
+
"claude",
|
|
378
|
+
"codex"
|
|
379
|
+
],
|
|
380
|
+
"path": "jobs/finance/net-worth-snapshot.yaml"
|
|
381
|
+
},
|
|
160
382
|
{
|
|
161
383
|
"id": "repo-health-check",
|
|
162
384
|
"version": 1,
|
|
@@ -184,6 +406,58 @@
|
|
|
184
406
|
],
|
|
185
407
|
"path": "jobs/devops/repo-health-check.yaml"
|
|
186
408
|
},
|
|
409
|
+
{
|
|
410
|
+
"id": "screen-time-check",
|
|
411
|
+
"version": 1,
|
|
412
|
+
"name": "Screen Time Check",
|
|
413
|
+
"description": "Checks today's screen time against a goal and tells you if you're over. Use this if you're trying to cut down on screen time but never actually look at the stats your phone/laptop already collects.",
|
|
414
|
+
"category": "personal",
|
|
415
|
+
"tags": [
|
|
416
|
+
"health",
|
|
417
|
+
"screen-time",
|
|
418
|
+
"wellbeing"
|
|
419
|
+
],
|
|
420
|
+
"schedule": "0 20 * * *",
|
|
421
|
+
"timezone": "America/Los_Angeles",
|
|
422
|
+
"runner": "agent-prompt",
|
|
423
|
+
"modes": [
|
|
424
|
+
"agent-prompt"
|
|
425
|
+
],
|
|
426
|
+
"compatible_agents": [
|
|
427
|
+
"claude",
|
|
428
|
+
"codex",
|
|
429
|
+
"hermes",
|
|
430
|
+
"openclaw",
|
|
431
|
+
"generic"
|
|
432
|
+
],
|
|
433
|
+
"path": "jobs/personal/screen-time-check.yaml"
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
"id": "social-mentions-watch",
|
|
437
|
+
"version": 1,
|
|
438
|
+
"name": "Social Mentions Watch",
|
|
439
|
+
"description": "Scans for recent mentions of your brand, product, or repo and summarizes them. Use this if you want to catch a complaint or bug report on social media before it turns into a bigger problem.",
|
|
440
|
+
"category": "content",
|
|
441
|
+
"tags": [
|
|
442
|
+
"social",
|
|
443
|
+
"mentions",
|
|
444
|
+
"monitoring"
|
|
445
|
+
],
|
|
446
|
+
"schedule": "0 9 * * *",
|
|
447
|
+
"timezone": "UTC",
|
|
448
|
+
"runner": "agent-prompt",
|
|
449
|
+
"modes": [
|
|
450
|
+
"agent-prompt"
|
|
451
|
+
],
|
|
452
|
+
"compatible_agents": [
|
|
453
|
+
"claude",
|
|
454
|
+
"codex",
|
|
455
|
+
"hermes",
|
|
456
|
+
"openclaw",
|
|
457
|
+
"generic"
|
|
458
|
+
],
|
|
459
|
+
"path": "jobs/content/social-mentions-watch.yaml"
|
|
460
|
+
},
|
|
187
461
|
{
|
|
188
462
|
"id": "ssl-cert-expiry-check",
|
|
189
463
|
"version": 1,
|
|
@@ -209,6 +483,54 @@
|
|
|
209
483
|
],
|
|
210
484
|
"path": "jobs/devops/ssl-cert-expiry-check.yaml"
|
|
211
485
|
},
|
|
486
|
+
{
|
|
487
|
+
"id": "stale-dependency-pr-nudge",
|
|
488
|
+
"version": 1,
|
|
489
|
+
"name": "Stale Dependency PR Nudge",
|
|
490
|
+
"description": "Lists open dependency-bump pull requests (from Dependabot/Renovate) that have been sitting for a while. Use this if automated PRs pile up and quietly go stale instead of getting merged or closed.",
|
|
491
|
+
"category": "devops",
|
|
492
|
+
"tags": [
|
|
493
|
+
"github",
|
|
494
|
+
"dependencies",
|
|
495
|
+
"pr"
|
|
496
|
+
],
|
|
497
|
+
"schedule": "0 9 * * 1-5",
|
|
498
|
+
"timezone": "UTC",
|
|
499
|
+
"runner": "shell",
|
|
500
|
+
"modes": [
|
|
501
|
+
"script"
|
|
502
|
+
],
|
|
503
|
+
"compatible_agents": [
|
|
504
|
+
"generic",
|
|
505
|
+
"claude",
|
|
506
|
+
"codex"
|
|
507
|
+
],
|
|
508
|
+
"path": "jobs/devops/stale-dependency-pr-nudge.yaml"
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
"id": "subscription-audit",
|
|
512
|
+
"version": 1,
|
|
513
|
+
"name": "Subscription Audit",
|
|
514
|
+
"description": "Flags recurring subscriptions you haven't actually used in a while. Use this if you suspect you're paying for things you forgot to cancel.",
|
|
515
|
+
"category": "finance",
|
|
516
|
+
"tags": [
|
|
517
|
+
"subscriptions",
|
|
518
|
+
"budget",
|
|
519
|
+
"finance"
|
|
520
|
+
],
|
|
521
|
+
"schedule": "0 9 1 * *",
|
|
522
|
+
"timezone": "UTC",
|
|
523
|
+
"runner": "shell",
|
|
524
|
+
"modes": [
|
|
525
|
+
"script"
|
|
526
|
+
],
|
|
527
|
+
"compatible_agents": [
|
|
528
|
+
"generic",
|
|
529
|
+
"claude",
|
|
530
|
+
"codex"
|
|
531
|
+
],
|
|
532
|
+
"path": "jobs/finance/subscription-audit.yaml"
|
|
533
|
+
},
|
|
212
534
|
{
|
|
213
535
|
"id": "uptime-ping-check",
|
|
214
536
|
"version": 1,
|
|
@@ -233,6 +555,30 @@
|
|
|
233
555
|
],
|
|
234
556
|
"path": "jobs/devops/uptime-ping-check.yaml"
|
|
235
557
|
},
|
|
558
|
+
{
|
|
559
|
+
"id": "water-intake-reminder",
|
|
560
|
+
"version": 1,
|
|
561
|
+
"name": "Water Intake Reminder",
|
|
562
|
+
"description": "Nudges you to drink water a few times a day toward a daily goal. Use this if you sit at a desk all day and forget to drink water until you've got a headache.",
|
|
563
|
+
"category": "personal",
|
|
564
|
+
"tags": [
|
|
565
|
+
"health",
|
|
566
|
+
"hydration",
|
|
567
|
+
"reminder"
|
|
568
|
+
],
|
|
569
|
+
"schedule": "0 9,12,15,18 * * *",
|
|
570
|
+
"timezone": "America/Los_Angeles",
|
|
571
|
+
"runner": "shell",
|
|
572
|
+
"modes": [
|
|
573
|
+
"script"
|
|
574
|
+
],
|
|
575
|
+
"compatible_agents": [
|
|
576
|
+
"generic",
|
|
577
|
+
"claude",
|
|
578
|
+
"codex"
|
|
579
|
+
],
|
|
580
|
+
"path": "jobs/personal/water-intake-reminder.yaml"
|
|
581
|
+
},
|
|
236
582
|
{
|
|
237
583
|
"id": "weekly-report",
|
|
238
584
|
"version": 1,
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: broken-link-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Broken Link Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks a list of URLs and reports any that are dead. Use this if your
|
|
6
|
+
site or docs have outbound/internal links that quietly rot over time.
|
|
7
|
+
category: content
|
|
8
|
+
tags: [links, content, maintenance]
|
|
9
|
+
schedule: "0 7 * * 1"
|
|
10
|
+
timezone: "UTC"
|
|
11
|
+
runner: shell
|
|
12
|
+
command: >
|
|
13
|
+
file={{urls_file}};
|
|
14
|
+
[ -f "$file" ] || { echo "ERROR: $file not found"; exit 1; };
|
|
15
|
+
fail=0;
|
|
16
|
+
while IFS= read -r url; do
|
|
17
|
+
[ -z "$url" ] && continue;
|
|
18
|
+
code=$(curl -o /dev/null -s -w '%{http_code}' --max-time {{timeout_seconds}} "$url");
|
|
19
|
+
if [ "$code" -ge 400 ] || [ "$code" = "000" ]; then echo "BROKEN ($code): $url"; fail=1; fi
|
|
20
|
+
done < "$file";
|
|
21
|
+
[ "$fail" -eq 0 ] && echo "OK: all links responded successfully";
|
|
22
|
+
exit $fail
|
|
23
|
+
variables:
|
|
24
|
+
urls_file:
|
|
25
|
+
default: "./links.txt"
|
|
26
|
+
description: Plain text file with one URL per line to check.
|
|
27
|
+
timeout_seconds:
|
|
28
|
+
default: 10
|
|
29
|
+
description: Max seconds to wait per URL before treating it as broken.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: >
|
|
32
|
+
Zero-token, deterministic. You maintain urls_file yourself (or generate
|
|
33
|
+
it from a sitemap) — this job only checks what's listed.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
id: changelog-digest
|
|
2
|
+
version: 1
|
|
3
|
+
name: Changelog Digest
|
|
4
|
+
description: >
|
|
5
|
+
Rolls up recent commits into a draft changelog entry your users could
|
|
6
|
+
actually read. Use this if you ship regularly but always write the
|
|
7
|
+
changelog as an afterthought (or skip it).
|
|
8
|
+
category: content
|
|
9
|
+
tags: [changelog, release, docs]
|
|
10
|
+
schedule: "0 10 * * 5"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: hybrid
|
|
13
|
+
command: >
|
|
14
|
+
cd {{repo_path}} && last_tag=$(git describe --tags --abbrev=0 2>/dev/null);
|
|
15
|
+
if [ -n "$last_tag" ]; then echo "--- commits since $last_tag ---"; git log "$last_tag"..HEAD --pretty=format:'%h %s';
|
|
16
|
+
else echo "--- no tags found, showing last {{lookback_days}} days ---"; git log --since="{{lookback_days}} days ago" --pretty=format:'%h %s'; fi
|
|
17
|
+
prompt: |
|
|
18
|
+
Draft a user-facing changelog entry for {{project_name}} covering commits
|
|
19
|
+
since the last release (or the last {{lookback_days}} days if no tags
|
|
20
|
+
exist) in {{repo_path}}.
|
|
21
|
+
1. Group into Added / Changed / Fixed.
|
|
22
|
+
2. Rewrite terse commit messages into plain language a user would
|
|
23
|
+
actually understand.
|
|
24
|
+
3. Skip purely internal commits (refactors, tests, CI) unless they're
|
|
25
|
+
user-visible.
|
|
26
|
+
script_note: >
|
|
27
|
+
`command` dumps the raw commit log since the last tag, zero tokens.
|
|
28
|
+
`prompt` groups and rewrites it into an actual user-facing changelog entry.
|
|
29
|
+
variables:
|
|
30
|
+
repo_path:
|
|
31
|
+
default: "."
|
|
32
|
+
description: Path to the repo to pull history from.
|
|
33
|
+
project_name:
|
|
34
|
+
default: "this project"
|
|
35
|
+
description: Name to use in the changelog header.
|
|
36
|
+
lookback_days:
|
|
37
|
+
default: 14
|
|
38
|
+
description: Fallback window if the repo has no tags yet.
|
|
39
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
40
|
+
notes: Schedule defaults to Friday; adjust to your release cadence.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: social-mentions-watch
|
|
2
|
+
version: 1
|
|
3
|
+
name: Social Mentions Watch
|
|
4
|
+
description: >
|
|
5
|
+
Scans for recent mentions of your brand, product, or repo and summarizes
|
|
6
|
+
them. Use this if you want to catch a complaint or bug report on social
|
|
7
|
+
media before it turns into a bigger problem.
|
|
8
|
+
category: content
|
|
9
|
+
tags: [social, mentions, monitoring]
|
|
10
|
+
schedule: "0 9 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: agent-prompt
|
|
13
|
+
prompt: |
|
|
14
|
+
Search for mentions of "{{brand_or_repo}}" from the last {{lookback_hours}}
|
|
15
|
+
hours across whatever sources you have access to (X/Twitter, Reddit,
|
|
16
|
+
Hacker News, web search).
|
|
17
|
+
1. List each mention with source, link, and a one-line sentiment read
|
|
18
|
+
(positive/neutral/negative).
|
|
19
|
+
2. Flag anything that looks like a bug report, complaint, or something
|
|
20
|
+
needing a response.
|
|
21
|
+
3. If nothing found, just say so.
|
|
22
|
+
variables:
|
|
23
|
+
brand_or_repo:
|
|
24
|
+
default: "your project"
|
|
25
|
+
description: Name, handle, or repo to search mentions of.
|
|
26
|
+
lookback_hours:
|
|
27
|
+
default: 24
|
|
28
|
+
description: Window of mentions to consider.
|
|
29
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
30
|
+
notes: >
|
|
31
|
+
No generic script mode — needs whatever search/API access your agent has
|
|
32
|
+
(web search, X API, Reddit API, etc.); sources vary too much to script generically.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
id: disk-space-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Disk Space Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks how full a disk/volume is and warns you before it fills up.
|
|
6
|
+
Use this if you've ever had a server or laptop grind to a halt because
|
|
7
|
+
disk usage crept up unnoticed.
|
|
8
|
+
category: devops
|
|
9
|
+
tags: [disk, monitoring, maintenance]
|
|
10
|
+
schedule: "0 */6 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
path={{path}}; threshold={{threshold_pct}};
|
|
15
|
+
pct=$(df -P "$path" | awk 'NR==2 {gsub("%","",$5); print $5}');
|
|
16
|
+
if [ "$pct" -ge "$threshold" ]; then echo "WARNING: $path is ${pct}% full (threshold ${threshold}%)"; exit 1;
|
|
17
|
+
else echo "OK: $path is ${pct}% full"; fi
|
|
18
|
+
variables:
|
|
19
|
+
path:
|
|
20
|
+
default: "/"
|
|
21
|
+
description: Mount point or path to check.
|
|
22
|
+
threshold_pct:
|
|
23
|
+
default: 85
|
|
24
|
+
description: Warn when usage reaches this percentage.
|
|
25
|
+
compatible_agents: [generic, claude, codex]
|
|
26
|
+
notes: Zero-token, deterministic. Uses `df -P` for portable output across macOS/Linux.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
id: docker-image-prune
|
|
2
|
+
version: 1
|
|
3
|
+
name: Docker Image & Container Prune
|
|
4
|
+
description: >
|
|
5
|
+
Cleans up stopped containers and dangling Docker images so they don't
|
|
6
|
+
quietly eat your disk. Use this if you run Docker locally or on a server
|
|
7
|
+
and never remember to clean up after yourself.
|
|
8
|
+
category: devops
|
|
9
|
+
tags: [docker, cleanup, disk-space]
|
|
10
|
+
schedule: "0 4 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
command -v docker >/dev/null 2>&1 || { echo "docker not installed, skipping"; exit 0; };
|
|
15
|
+
docker container prune -f --filter "until={{until}}";
|
|
16
|
+
docker image prune -f --filter "until={{until}}"
|
|
17
|
+
variables:
|
|
18
|
+
until:
|
|
19
|
+
default: "24h"
|
|
20
|
+
description: Only remove containers/images older than this (Docker duration syntax, e.g. "24h", "720h").
|
|
21
|
+
compatible_agents: [generic, claude, codex]
|
|
22
|
+
notes: >
|
|
23
|
+
Destructive by nature (removes stopped containers and dangling images) —
|
|
24
|
+
the `until` default of 24h protects anything recent. Widen with care.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: env-drift-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Env File Drift Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares your .env against .env.example and flags keys that are missing
|
|
6
|
+
or extra. Use this if you've ever deployed and hit a crash because a new
|
|
7
|
+
required env var never got set.
|
|
8
|
+
category: devops
|
|
9
|
+
tags: [config, env, drift]
|
|
10
|
+
schedule: "0 8 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
example={{example_path}}; actual={{env_path}};
|
|
15
|
+
[ -f "$example" ] || { echo "ERROR: $example not found"; exit 1; };
|
|
16
|
+
[ -f "$actual" ] || { echo "ERROR: $actual not found"; exit 1; };
|
|
17
|
+
ex_keys=$(grep -vE '^\s*#|^\s*$' "$example" | cut -d= -f1 | sort -u);
|
|
18
|
+
ac_keys=$(grep -vE '^\s*#|^\s*$' "$actual" | cut -d= -f1 | sort -u);
|
|
19
|
+
missing=$(comm -23 <(echo "$ex_keys") <(echo "$ac_keys"));
|
|
20
|
+
extra=$(comm -13 <(echo "$ex_keys") <(echo "$ac_keys"));
|
|
21
|
+
[ -n "$missing" ] && echo "MISSING (in $example, not in $actual): $missing";
|
|
22
|
+
[ -n "$extra" ] && echo "EXTRA (in $actual, not in $example): $extra";
|
|
23
|
+
[ -z "$missing" ] && [ -z "$extra" ] && echo "OK: env keys match example"; true
|
|
24
|
+
variables:
|
|
25
|
+
example_path:
|
|
26
|
+
default: ".env.example"
|
|
27
|
+
description: Path to the example/template env file.
|
|
28
|
+
env_path:
|
|
29
|
+
default: ".env"
|
|
30
|
+
description: Path to the actual env file to check.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: >
|
|
33
|
+
Zero-token, deterministic. Requires bash (uses process substitution) —
|
|
34
|
+
won't run under plain POSIX sh.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: stale-dependency-pr-nudge
|
|
2
|
+
version: 1
|
|
3
|
+
name: Stale Dependency PR Nudge
|
|
4
|
+
description: >
|
|
5
|
+
Lists open dependency-bump pull requests (from Dependabot/Renovate) that
|
|
6
|
+
have been sitting for a while. Use this if automated PRs pile up and
|
|
7
|
+
quietly go stale instead of getting merged or closed.
|
|
8
|
+
category: devops
|
|
9
|
+
tags: [github, dependencies, pr]
|
|
10
|
+
schedule: "0 9 * * 1-5"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
command -v gh >/dev/null 2>&1 || { echo "gh CLI not installed, skipping"; exit 0; };
|
|
15
|
+
cd {{repo_path}} && gh pr list --state open --json number,title,author,createdAt --jq \
|
|
16
|
+
'.[] | select(.author.login | test("dependabot|renovate"; "i")) | select((now - (.createdAt | fromdateiso8601)) > ({{stale_days}} * 86400)) | "#\(.number) \(.title) (opened \(.createdAt))"'
|
|
17
|
+
variables:
|
|
18
|
+
repo_path:
|
|
19
|
+
default: "."
|
|
20
|
+
description: Path to the repo to check.
|
|
21
|
+
stale_days:
|
|
22
|
+
default: 3
|
|
23
|
+
description: Flag dependency PRs open longer than this many days.
|
|
24
|
+
compatible_agents: [generic, claude, codex]
|
|
25
|
+
notes: Requires an authenticated `gh` CLI. Zero-token, read-only.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: net-worth-snapshot
|
|
2
|
+
version: 1
|
|
3
|
+
name: Net Worth Snapshot Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Reminds you to log your net worth each month and shows the trend from
|
|
6
|
+
your last two entries. Use this if you want to track your finances over
|
|
7
|
+
time but keep forgetting to actually sit down and do it.
|
|
8
|
+
category: finance
|
|
9
|
+
tags: [finance, net-worth, tracking]
|
|
10
|
+
schedule: "0 9 1 * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
file={{net_worth_csv}};
|
|
15
|
+
[ -f "$file" ] || echo "date,net_worth" > "$file";
|
|
16
|
+
today=$(date +%F);
|
|
17
|
+
if tail -n +2 "$file" | cut -d, -f1 | grep -qx "$today"; then
|
|
18
|
+
echo "Already logged today.";
|
|
19
|
+
else
|
|
20
|
+
echo "$today," >> "$file";
|
|
21
|
+
echo "REMINDER: fill in today's net worth in $file";
|
|
22
|
+
fi;
|
|
23
|
+
prev=$(tail -n 2 "$file" | head -n 1 | cut -d, -f2);
|
|
24
|
+
last=$(tail -n 1 "$file" | cut -d, -f2);
|
|
25
|
+
[ -n "$prev" ] && [ -n "$last" ] && echo "Last entry: $last (previous: $prev)"; true
|
|
26
|
+
variables:
|
|
27
|
+
net_worth_csv:
|
|
28
|
+
default: "./net-worth.csv"
|
|
29
|
+
description: CSV log file, one row per month (date,net_worth).
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: >
|
|
32
|
+
Zero-token. Appends a blank row for you to fill in by hand — doesn't
|
|
33
|
+
pull balances from any bank automatically.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: subscription-audit
|
|
2
|
+
version: 1
|
|
3
|
+
name: Subscription Audit
|
|
4
|
+
description: >
|
|
5
|
+
Flags recurring subscriptions you haven't actually used in a while.
|
|
6
|
+
Use this if you suspect you're paying for things you forgot to cancel.
|
|
7
|
+
category: finance
|
|
8
|
+
tags: [subscriptions, budget, finance]
|
|
9
|
+
schedule: "0 9 1 * *"
|
|
10
|
+
timezone: "UTC"
|
|
11
|
+
runner: shell
|
|
12
|
+
command: >
|
|
13
|
+
file={{subs_file}}; unused_days={{unused_days}};
|
|
14
|
+
[ -f "$file" ] || { echo "ERROR: $file not found"; exit 1; };
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
tail -n +2 "$file" | while IFS=, read -r name cost last_used; do
|
|
17
|
+
last_epoch=$(date -j -f %Y-%m-%d "$last_used" +%s 2>/dev/null || date -d "$last_used" +%s);
|
|
18
|
+
days=$(( (today-last_epoch)/86400 ));
|
|
19
|
+
if [ "$days" -gt "$unused_days" ]; then echo "UNUSED: $name (\$$cost/mo) — not used in $days days"; fi
|
|
20
|
+
done
|
|
21
|
+
variables:
|
|
22
|
+
subs_file:
|
|
23
|
+
default: "./subscriptions.csv"
|
|
24
|
+
description: >
|
|
25
|
+
CSV with header "name,monthly_cost,last_used_date" (YYYY-MM-DD), one
|
|
26
|
+
subscription per row.
|
|
27
|
+
unused_days:
|
|
28
|
+
default: 30
|
|
29
|
+
description: Flag a subscription if it hasn't been used in this many days.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: >
|
|
32
|
+
Zero-token, deterministic. You maintain subs_file yourself (update
|
|
33
|
+
last_used_date when you actually use each service) — this job only
|
|
34
|
+
reads what's in the file, doesn't pull from any bank or card statement.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: bill-due-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Bill Due Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Warns you a few days before a recurring monthly bill is due. Use this if
|
|
6
|
+
you've ever paid a late fee just because you forgot the date.
|
|
7
|
+
category: personal
|
|
8
|
+
tags: [bills, finance, reminder]
|
|
9
|
+
schedule: "0 9 * * *"
|
|
10
|
+
timezone: "America/Los_Angeles"
|
|
11
|
+
runner: shell
|
|
12
|
+
command: >
|
|
13
|
+
due={{due_day_of_month}}; warn={{warn_days}}; name="{{bill_name}}";
|
|
14
|
+
today=$(date +%-d);
|
|
15
|
+
days_left=$(( due - today ));
|
|
16
|
+
if [ "$days_left" -lt 0 ]; then days_left=$(( days_left + 30 )); fi
|
|
17
|
+
if [ "$days_left" -le "$warn" ]; then echo "REMINDER: $name due in $days_left day(s) (on day $due of the month)";
|
|
18
|
+
else echo "OK: $name due in $days_left day(s)"; fi
|
|
19
|
+
variables:
|
|
20
|
+
bill_name:
|
|
21
|
+
default: "Rent"
|
|
22
|
+
description: What the bill is, for the reminder text.
|
|
23
|
+
due_day_of_month:
|
|
24
|
+
default: 1
|
|
25
|
+
description: Day of the month (1-31) the bill is due.
|
|
26
|
+
warn_days:
|
|
27
|
+
default: 3
|
|
28
|
+
description: Start warning this many days before the due day.
|
|
29
|
+
compatible_agents: [generic, claude, codex]
|
|
30
|
+
notes: >
|
|
31
|
+
Zero-token, deterministic. Approximates month length as 30 days when
|
|
32
|
+
wrapping into next month — fine for a reminder, not for precise billing math.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: habit-checkin
|
|
2
|
+
version: 1
|
|
3
|
+
name: Daily Habit Check-in
|
|
4
|
+
description: >
|
|
5
|
+
Reminds you to log a habit each day and reports your current streak.
|
|
6
|
+
Use this if you're trying to build a habit and want a daily nudge plus
|
|
7
|
+
a running streak count without a separate app.
|
|
8
|
+
category: personal
|
|
9
|
+
tags: [habit, streak, reminder]
|
|
10
|
+
schedule: "0 20 * * *"
|
|
11
|
+
timezone: "America/Los_Angeles"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
log={{log_path}}; name="{{habit_name}}";
|
|
15
|
+
touch "$log";
|
|
16
|
+
today=$(date +%F);
|
|
17
|
+
streak=0; d="$today";
|
|
18
|
+
while grep -qx "$d" "$log" 2>/dev/null; do
|
|
19
|
+
streak=$((streak+1));
|
|
20
|
+
d=$(date -j -v-1d -f %F "$d" +%F 2>/dev/null || date -d "$d -1 day" +%F);
|
|
21
|
+
done;
|
|
22
|
+
if grep -qx "$today" "$log"; then echo "$name: already logged today. Streak: $streak day(s).";
|
|
23
|
+
else echo "REMINDER: log $name today to keep your streak (currently $streak day(s))."; fi
|
|
24
|
+
variables:
|
|
25
|
+
habit_name:
|
|
26
|
+
default: "exercise"
|
|
27
|
+
description: What habit you're tracking, for the reminder text.
|
|
28
|
+
log_path:
|
|
29
|
+
default: "./habit-log.txt"
|
|
30
|
+
description: Plain text file with one YYYY-MM-DD line per day you completed the habit.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: >
|
|
33
|
+
Zero-token, deterministic. This job only reminds and reports the streak —
|
|
34
|
+
append today's date to log_path yourself (`date +%F >> log_path`) when
|
|
35
|
+
you actually complete the habit.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: meal-plan-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Weekly Meal Plan Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Nudges you to plan the week's meals, and can draft a simple 7-day plan
|
|
6
|
+
plus grocery list for you. Use this if you dread the "what's for dinner"
|
|
7
|
+
question every night and want to decide once a week instead.
|
|
8
|
+
category: personal
|
|
9
|
+
tags: [meals, planning, household]
|
|
10
|
+
schedule: "0 9 * * 0"
|
|
11
|
+
timezone: "America/Los_Angeles"
|
|
12
|
+
runner: hybrid
|
|
13
|
+
command: >
|
|
14
|
+
echo "Reminder: plan meals for the week ({{household_size}} people, dietary preference: {{dietary_pref}})."
|
|
15
|
+
prompt: |
|
|
16
|
+
Draft a simple 7-day dinner plan for {{household_size}} people with
|
|
17
|
+
dietary preference: {{dietary_pref}}.
|
|
18
|
+
1. One line per day, easy/quick recipes, minimal specialty ingredients.
|
|
19
|
+
2. End with a consolidated grocery list grouped by store section.
|
|
20
|
+
script_note: >
|
|
21
|
+
`command` only prints a reminder to plan meals yourself, zero tokens.
|
|
22
|
+
`prompt` actually drafts the 7-day plan and grocery list for you.
|
|
23
|
+
variables:
|
|
24
|
+
household_size:
|
|
25
|
+
default: 1
|
|
26
|
+
description: Number of people to plan meals for.
|
|
27
|
+
dietary_pref:
|
|
28
|
+
default: "no restrictions"
|
|
29
|
+
description: Dietary preference or restriction to plan around.
|
|
30
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
31
|
+
notes: Schedule defaults to Sunday morning; adjust to whenever you actually grocery shop.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
id: screen-time-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Screen Time Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks today's screen time against a goal and tells you if you're over.
|
|
6
|
+
Use this if you're trying to cut down on screen time but never actually
|
|
7
|
+
look at the stats your phone/laptop already collects.
|
|
8
|
+
category: personal
|
|
9
|
+
tags: [health, screen-time, wellbeing]
|
|
10
|
+
schedule: "0 20 * * *"
|
|
11
|
+
timezone: "America/Los_Angeles"
|
|
12
|
+
runner: agent-prompt
|
|
13
|
+
prompt: |
|
|
14
|
+
Check today's screen time against a {{daily_limit_hours}} hour goal.
|
|
15
|
+
1. Use whatever screen-time source you have access to (macOS Screen
|
|
16
|
+
Time, iOS Screen Time via Shortcuts, Android Digital Wellbeing,
|
|
17
|
+
RescueTime, etc.).
|
|
18
|
+
2. Report total screen time so far today vs. the goal.
|
|
19
|
+
3. If over goal, note the top 3 apps/categories driving it.
|
|
20
|
+
variables:
|
|
21
|
+
daily_limit_hours:
|
|
22
|
+
default: 3
|
|
23
|
+
description: Daily screen time goal, in hours.
|
|
24
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
25
|
+
notes: >
|
|
26
|
+
No generic script mode — screen-time data access is platform/tool
|
|
27
|
+
specific and usually needs OS-level permissions your agent may not have.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
id: water-intake-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Water Intake Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Nudges you to drink water a few times a day toward a daily goal. Use
|
|
6
|
+
this if you sit at a desk all day and forget to drink water until
|
|
7
|
+
you've got a headache.
|
|
8
|
+
category: personal
|
|
9
|
+
tags: [health, hydration, reminder]
|
|
10
|
+
schedule: "0 9,12,15,18 * * *"
|
|
11
|
+
timezone: "America/Los_Angeles"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
echo "Reminder: drink some water. Goal: {{daily_goal_oz}} oz today."
|
|
15
|
+
variables:
|
|
16
|
+
daily_goal_oz:
|
|
17
|
+
default: 64
|
|
18
|
+
description: Your daily water intake goal, in ounces.
|
|
19
|
+
compatible_agents: [generic, claude, codex]
|
|
20
|
+
notes: Zero-token. Purely a nudge — doesn't track actual intake.
|