@wonsukchoi/crondex 0.1.1 → 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 CHANGED
@@ -58,7 +58,9 @@ crondex/
58
58
  ├── jobs/
59
59
  │ ├── devops/
60
60
  │ ├── productivity/
61
- └── personal/
61
+ ├── personal/
62
+ │ ├── content/
63
+ │ └── finance/
62
64
  └── scripts/
63
65
  ├── build-catalog.js regenerates catalog.json from jobs/**/*.yaml
64
66
  └── validate-jobs.js validates every job against the schema
@@ -66,24 +68,58 @@ crondex/
66
68
 
67
69
  ## Available jobs
68
70
 
69
- | id | category | schedule | modes |
70
- |---|---|---|---|
71
- | `dependency-audit` | devops | `0 8 * * 1` | script + agent-prompt |
72
- | `log-cleanup` | devops | `30 3 * * *` | script |
73
- | `repo-health-check` | devops | `0 9 * * 1-5` | script + agent-prompt |
74
- | `backup-reminder` | devops | `0 9 * * *` | script |
75
- | `ssl-cert-expiry-check` | devops | `0 6 * * *` | script |
76
- | `uptime-ping-check` | devops | `*/15 * * * *` | script |
77
- | `cost-alert` | devops | `0 7 * * *` | script + agent-prompt |
78
- | `daily-standup-summary` | productivity | `0 8 * * 1-5` | script + agent-prompt |
79
- | `inbox-triage` | productivity | `0 7,13 * * 1-5` | agent-prompt only |
80
- | `weekly-report` | productivity | `0 16 * * 5` | script + agent-prompt |
81
- | `bill-due-reminder` | personal | `0 9 * * *` | script |
82
- | `habit-checkin` | personal | `0 20 * * *` | script |
83
- | `meal-plan-reminder` | personal | `0 9 * * 0` | script + agent-prompt |
84
-
85
- Full details (description, tags, variables) live in `catalog.json` and each
86
- job's YAML file.
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 |
87
123
 
88
124
  ## How a job works
89
125
 
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": 13,
4
+ "count": 24,
5
5
  "jobs": [
6
6
  {
7
7
  "id": "backup-reminder",
@@ -51,6 +51,57 @@
51
51
  ],
52
52
  "path": "jobs/personal/bill-due-reminder.yaml"
53
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
+ },
54
105
  {
55
106
  "id": "cost-alert",
56
107
  "version": 1,
@@ -132,6 +183,78 @@
132
183
  ],
133
184
  "path": "jobs/devops/dependency-audit.yaml"
134
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
+ },
135
258
  {
136
259
  "id": "habit-checkin",
137
260
  "version": 1,
@@ -232,6 +355,30 @@
232
355
  ],
233
356
  "path": "jobs/personal/meal-plan-reminder.yaml"
234
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
+ },
235
382
  {
236
383
  "id": "repo-health-check",
237
384
  "version": 1,
@@ -259,6 +406,58 @@
259
406
  ],
260
407
  "path": "jobs/devops/repo-health-check.yaml"
261
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
+ },
262
461
  {
263
462
  "id": "ssl-cert-expiry-check",
264
463
  "version": 1,
@@ -284,6 +483,54 @@
284
483
  ],
285
484
  "path": "jobs/devops/ssl-cert-expiry-check.yaml"
286
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
+ },
287
534
  {
288
535
  "id": "uptime-ping-check",
289
536
  "version": 1,
@@ -308,6 +555,30 @@
308
555
  ],
309
556
  "path": "jobs/devops/uptime-ping-check.yaml"
310
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
+ },
311
582
  {
312
583
  "id": "weekly-report",
313
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,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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wonsukchoi/crondex",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "A public directory of pre-made, agent-editable cron jobs.",
5
5
  "type": "module",
6
6
  "license": "MIT",