@wonsukchoi/crondex 0.3.0 → 0.5.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
@@ -62,7 +62,11 @@ crondex/
62
62
  │ ├── content/
63
63
  │ ├── finance/
64
64
  │ ├── security/
65
- └── learning/
65
+ ├── learning/
66
+ │ ├── team/
67
+ │ ├── home/
68
+ │ ├── travel/
69
+ │ └── growth/
66
70
  └── scripts/
67
71
  ├── build-catalog.js regenerates catalog.json from jobs/**/*.yaml
68
72
  └── validate-jobs.js validates every job against the schema
@@ -70,7 +74,7 @@ crondex/
70
74
 
71
75
  ## Available jobs
72
76
 
73
- 35 jobs across 7 categories. Full details (description, tags, variables)
77
+ 56 jobs across 11 categories. Full details (description, tags, variables)
74
78
  live in `catalog.json` and each job's YAML file — run `crondex list` or
75
79
  browse `jobs/<category>/` for the plain-language rundown of each.
76
80
 
@@ -92,6 +96,9 @@ browse `jobs/<category>/` for the plain-language rundown of each.
92
96
  | `db-backup-verify` | `0 5 * * *` | script |
93
97
  | `license-compliance-check` | `0 8 * * 1` | script |
94
98
  | `orphaned-branch-cleanup` | `0 9 * * 1` | script |
99
+ | `dns-record-check` | `0 */6 * * *` | script |
100
+ | `queue-depth-check` | `*/10 * * * *` | script |
101
+ | `api-rate-limit-check` | `*/15 * * * *` | script |
95
102
 
96
103
  **productivity**
97
104
 
@@ -119,6 +126,9 @@ browse `jobs/<category>/` for the plain-language rundown of each.
119
126
  | `changelog-digest` | `0 10 * * 5` | script + agent-prompt |
120
127
  | `broken-link-check` | `0 7 * * 1` | script |
121
128
  | `social-mentions-watch` | `0 9 * * *` | agent-prompt only |
129
+ | `seo-meta-check` | `0 7 * * 1` | script |
130
+ | `rss-feed-validate` | `0 8 * * *` | script |
131
+ | `robots-txt-check` | `0 8 * * *` | script |
122
132
 
123
133
  **finance**
124
134
 
@@ -127,6 +137,8 @@ browse `jobs/<category>/` for the plain-language rundown of each.
127
137
  | `subscription-audit` | `0 9 1 * *` | script |
128
138
  | `net-worth-snapshot` | `0 9 1 * *` | script |
129
139
  | `saas-seat-audit` | `0 9 1 * *` | script |
140
+ | `invoice-overdue-check` | `0 9 * * *` | script |
141
+ | `tax-deadline-reminder` | `0 9 * * *` | script |
130
142
 
131
143
  **security**
132
144
 
@@ -135,6 +147,9 @@ browse `jobs/<category>/` for the plain-language rundown of each.
135
147
  | `secrets-scan` | `0 3 * * *` | script |
136
148
  | `open-port-check` | `0 */4 * * *` | script |
137
149
  | `failed-login-watch` | `*/15 * * * *` | script |
150
+ | `sudo-usage-audit` | `0 * * * *` | script |
151
+ | `firewall-rule-diff` | `0 6 * * *` | script |
152
+ | `certificate-transparency-watch` | `0 */12 * * *` | script |
138
153
 
139
154
  **learning**
140
155
 
@@ -144,6 +159,36 @@ browse `jobs/<category>/` for the plain-language rundown of each.
144
159
  | `reading-list-nudge` | `0 9 * * 6` | script |
145
160
  | `course-progress-checkin` | `0 9 * * 1` | script |
146
161
 
162
+ **team**
163
+
164
+ | id | schedule | modes |
165
+ |---|---|---|
166
+ | `1on1-prep-reminder` | `0 9 * * 3` | script |
167
+ | `pto-balance-check` | `0 9 1 * *` | script |
168
+
169
+ **home**
170
+
171
+ | id | schedule | modes |
172
+ |---|---|---|
173
+ | `hvac-filter-reminder` | `0 9 1 * *` | script |
174
+ | `smoke-detector-battery-check` | `0 9 1 * *` | script |
175
+ | `plant-watering-reminder` | `0 9 * * *` | script |
176
+
177
+ **travel**
178
+
179
+ | id | schedule | modes |
180
+ |---|---|---|
181
+ | `passport-expiry-check` | `0 9 1 * *` | script |
182
+ | `visa-expiry-check` | `0 9 1 * *` | script |
183
+ | `flight-checkin-reminder` | `0 * * * *` | script |
184
+
185
+ **growth**
186
+
187
+ | id | schedule | modes |
188
+ |---|---|---|
189
+ | `review-request-nudge` | `0 9 * * *` | script |
190
+ | `cart-abandonment-followup` | `0 10 * * *` | script + agent-prompt |
191
+
147
192
  ## How a job works
148
193
 
149
194
  Every job is one YAML file with a `runner`:
package/catalog.json CHANGED
@@ -1,8 +1,56 @@
1
1
  {
2
2
  "generated_by": "scripts/build-catalog.js",
3
3
  "schema": "schema/job.schema.json",
4
- "count": 35,
4
+ "count": 56,
5
5
  "jobs": [
6
+ {
7
+ "id": "1on1-prep-reminder",
8
+ "version": 1,
9
+ "name": "1:1 Prep Reminder",
10
+ "description": "Nudges you to prep talking points before a recurring 1:1 and shows your last notes. Use this if you've ever walked into a 1:1 with nothing prepared and just winged it.",
11
+ "category": "team",
12
+ "tags": [
13
+ "1on1",
14
+ "meetings",
15
+ "team"
16
+ ],
17
+ "schedule": "0 9 * * 3",
18
+ "timezone": "America/Los_Angeles",
19
+ "runner": "shell",
20
+ "modes": [
21
+ "script"
22
+ ],
23
+ "compatible_agents": [
24
+ "generic",
25
+ "claude",
26
+ "codex"
27
+ ],
28
+ "path": "jobs/team/1on1-prep-reminder.yaml"
29
+ },
30
+ {
31
+ "id": "api-rate-limit-check",
32
+ "version": 1,
33
+ "name": "API Rate Limit Check",
34
+ "description": "Checks how many API requests you have left before hitting a rate limit. Use this if you've ever gotten a 429 in production because nobody was watching the remaining quota.",
35
+ "category": "devops",
36
+ "tags": [
37
+ "api",
38
+ "rate-limit",
39
+ "monitoring"
40
+ ],
41
+ "schedule": "*/15 * * * *",
42
+ "timezone": "UTC",
43
+ "runner": "shell",
44
+ "modes": [
45
+ "script"
46
+ ],
47
+ "compatible_agents": [
48
+ "generic",
49
+ "claude",
50
+ "codex"
51
+ ],
52
+ "path": "jobs/devops/api-rate-limit-check.yaml"
53
+ },
6
54
  {
7
55
  "id": "backup-reminder",
8
56
  "version": 1,
@@ -75,6 +123,57 @@
75
123
  ],
76
124
  "path": "jobs/content/broken-link-check.yaml"
77
125
  },
126
+ {
127
+ "id": "cart-abandonment-followup",
128
+ "version": 1,
129
+ "name": "Cart Abandonment Follow-up",
130
+ "description": "Finds abandoned shopping carts old enough to follow up on, and can draft the follow-up email for you. Use this if abandoned-cart recovery is something you know you should do but never get to.",
131
+ "category": "growth",
132
+ "tags": [
133
+ "growth",
134
+ "ecommerce",
135
+ "cart-recovery"
136
+ ],
137
+ "schedule": "0 10 * * *",
138
+ "timezone": "UTC",
139
+ "runner": "hybrid",
140
+ "modes": [
141
+ "script",
142
+ "agent-prompt"
143
+ ],
144
+ "compatible_agents": [
145
+ "claude",
146
+ "codex",
147
+ "hermes",
148
+ "openclaw",
149
+ "generic"
150
+ ],
151
+ "path": "jobs/growth/cart-abandonment-followup.yaml"
152
+ },
153
+ {
154
+ "id": "certificate-transparency-watch",
155
+ "version": 1,
156
+ "name": "Certificate Transparency Watch",
157
+ "description": "Checks public Certificate Transparency logs for new TLS certs issued for your domain and flags any you didn't expect. Use this if you want an early warning for someone issuing a cert for your domain without your knowledge (a common precursor to phishing/MITM setups).",
158
+ "category": "security",
159
+ "tags": [
160
+ "security",
161
+ "tls",
162
+ "certificate-transparency"
163
+ ],
164
+ "schedule": "0 */12 * * *",
165
+ "timezone": "UTC",
166
+ "runner": "shell",
167
+ "modes": [
168
+ "script"
169
+ ],
170
+ "compatible_agents": [
171
+ "generic",
172
+ "claude",
173
+ "codex"
174
+ ],
175
+ "path": "jobs/security/certificate-transparency-watch.yaml"
176
+ },
78
177
  {
79
178
  "id": "changelog-digest",
80
179
  "version": 1,
@@ -279,6 +378,30 @@
279
378
  ],
280
379
  "path": "jobs/devops/disk-space-check.yaml"
281
380
  },
381
+ {
382
+ "id": "dns-record-check",
383
+ "version": 1,
384
+ "name": "DNS Record Drift Check",
385
+ "description": "Checks that a DNS record still resolves to the value you expect, and flags drift. Use this if you've ever had DNS quietly change (an expired record, a misconfigured provider) and only found out when something broke.",
386
+ "category": "devops",
387
+ "tags": [
388
+ "dns",
389
+ "monitoring",
390
+ "drift"
391
+ ],
392
+ "schedule": "0 */6 * * *",
393
+ "timezone": "UTC",
394
+ "runner": "shell",
395
+ "modes": [
396
+ "script"
397
+ ],
398
+ "compatible_agents": [
399
+ "generic",
400
+ "claude",
401
+ "codex"
402
+ ],
403
+ "path": "jobs/devops/dns-record-check.yaml"
404
+ },
282
405
  {
283
406
  "id": "docker-image-prune",
284
407
  "version": 1,
@@ -351,6 +474,54 @@
351
474
  ],
352
475
  "path": "jobs/security/failed-login-watch.yaml"
353
476
  },
477
+ {
478
+ "id": "firewall-rule-diff",
479
+ "version": 1,
480
+ "name": "Firewall Rule Diff",
481
+ "description": "Diffs your current firewall rules against a saved baseline and flags any drift. Use this if a firewall rule has ever changed without anyone remembering who did it or why.",
482
+ "category": "security",
483
+ "tags": [
484
+ "security",
485
+ "firewall",
486
+ "drift"
487
+ ],
488
+ "schedule": "0 6 * * *",
489
+ "timezone": "UTC",
490
+ "runner": "shell",
491
+ "modes": [
492
+ "script"
493
+ ],
494
+ "compatible_agents": [
495
+ "generic",
496
+ "claude",
497
+ "codex"
498
+ ],
499
+ "path": "jobs/security/firewall-rule-diff.yaml"
500
+ },
501
+ {
502
+ "id": "flight-checkin-reminder",
503
+ "version": 1,
504
+ "name": "Flight Check-in Reminder",
505
+ "description": "Reminds you when online check-in opens for an upcoming flight. Use this if you've ever missed the good seats because check-in opened while you were asleep.",
506
+ "category": "travel",
507
+ "tags": [
508
+ "travel",
509
+ "flight",
510
+ "reminder"
511
+ ],
512
+ "schedule": "0 * * * *",
513
+ "timezone": "UTC",
514
+ "runner": "shell",
515
+ "modes": [
516
+ "script"
517
+ ],
518
+ "compatible_agents": [
519
+ "generic",
520
+ "claude",
521
+ "codex"
522
+ ],
523
+ "path": "jobs/travel/flight-checkin-reminder.yaml"
524
+ },
354
525
  {
355
526
  "id": "focus-block-reminder",
356
527
  "version": 1,
@@ -399,6 +570,30 @@
399
570
  ],
400
571
  "path": "jobs/personal/habit-checkin.yaml"
401
572
  },
573
+ {
574
+ "id": "hvac-filter-reminder",
575
+ "version": 1,
576
+ "name": "HVAC Filter Change Reminder",
577
+ "description": "Reminds you to change your HVAC filter based on how long it's been. Use this if you've ever found a filter so clogged you forgot it was ever white.",
578
+ "category": "home",
579
+ "tags": [
580
+ "home",
581
+ "hvac",
582
+ "maintenance"
583
+ ],
584
+ "schedule": "0 9 1 * *",
585
+ "timezone": "America/Los_Angeles",
586
+ "runner": "shell",
587
+ "modes": [
588
+ "script"
589
+ ],
590
+ "compatible_agents": [
591
+ "generic",
592
+ "claude",
593
+ "codex"
594
+ ],
595
+ "path": "jobs/home/hvac-filter-reminder.yaml"
596
+ },
402
597
  {
403
598
  "id": "inbox-triage",
404
599
  "version": 1,
@@ -425,6 +620,30 @@
425
620
  ],
426
621
  "path": "jobs/productivity/inbox-triage.yaml"
427
622
  },
623
+ {
624
+ "id": "invoice-overdue-check",
625
+ "version": 1,
626
+ "name": "Invoice Overdue Check",
627
+ "description": "Flags invoices that are past due and still unpaid. Use this if you freelance or run a small business and invoices have ever slipped through the cracks.",
628
+ "category": "finance",
629
+ "tags": [
630
+ "invoices",
631
+ "accounts-receivable",
632
+ "finance"
633
+ ],
634
+ "schedule": "0 9 * * *",
635
+ "timezone": "UTC",
636
+ "runner": "shell",
637
+ "modes": [
638
+ "script"
639
+ ],
640
+ "compatible_agents": [
641
+ "generic",
642
+ "claude",
643
+ "codex"
644
+ ],
645
+ "path": "jobs/finance/invoice-overdue-check.yaml"
646
+ },
428
647
  {
429
648
  "id": "license-compliance-check",
430
649
  "version": 1,
@@ -571,6 +790,102 @@
571
790
  ],
572
791
  "path": "jobs/devops/orphaned-branch-cleanup.yaml"
573
792
  },
793
+ {
794
+ "id": "passport-expiry-check",
795
+ "version": 1,
796
+ "name": "Passport Expiry Check",
797
+ "description": "Warns you before your passport expires — including the \"6 months validity required\" rule many countries enforce at the border. Use this if you've ever booked a trip and only checked your passport date after buying the ticket.",
798
+ "category": "travel",
799
+ "tags": [
800
+ "travel",
801
+ "passport",
802
+ "documents"
803
+ ],
804
+ "schedule": "0 9 1 * *",
805
+ "timezone": "UTC",
806
+ "runner": "shell",
807
+ "modes": [
808
+ "script"
809
+ ],
810
+ "compatible_agents": [
811
+ "generic",
812
+ "claude",
813
+ "codex"
814
+ ],
815
+ "path": "jobs/travel/passport-expiry-check.yaml"
816
+ },
817
+ {
818
+ "id": "plant-watering-reminder",
819
+ "version": 1,
820
+ "name": "Plant Watering Reminder",
821
+ "description": "Reminds you to water a specific plant once it's due. Use this if you've ever lost a plant to \"I'll water it tomorrow.\"",
822
+ "category": "home",
823
+ "tags": [
824
+ "home",
825
+ "plants",
826
+ "reminder"
827
+ ],
828
+ "schedule": "0 9 * * *",
829
+ "timezone": "America/Los_Angeles",
830
+ "runner": "shell",
831
+ "modes": [
832
+ "script"
833
+ ],
834
+ "compatible_agents": [
835
+ "generic",
836
+ "claude",
837
+ "codex"
838
+ ],
839
+ "path": "jobs/home/plant-watering-reminder.yaml"
840
+ },
841
+ {
842
+ "id": "pto-balance-check",
843
+ "version": 1,
844
+ "name": "PTO Balance Check",
845
+ "description": "Warns you before unused PTO expires or resets. Use this if you've ever lost vacation days because you forgot they don't roll over.",
846
+ "category": "team",
847
+ "tags": [
848
+ "pto",
849
+ "vacation",
850
+ "team"
851
+ ],
852
+ "schedule": "0 9 1 * *",
853
+ "timezone": "America/Los_Angeles",
854
+ "runner": "shell",
855
+ "modes": [
856
+ "script"
857
+ ],
858
+ "compatible_agents": [
859
+ "generic",
860
+ "claude",
861
+ "codex"
862
+ ],
863
+ "path": "jobs/team/pto-balance-check.yaml"
864
+ },
865
+ {
866
+ "id": "queue-depth-check",
867
+ "version": 1,
868
+ "name": "Queue Depth Check",
869
+ "description": "Checks how backed up a job queue is and warns if it crosses a threshold. Use this if a stuck worker has ever let a queue silently balloon until someone noticed customers weren't getting emails.",
870
+ "category": "devops",
871
+ "tags": [
872
+ "queue",
873
+ "redis",
874
+ "monitoring"
875
+ ],
876
+ "schedule": "*/10 * * * *",
877
+ "timezone": "UTC",
878
+ "runner": "shell",
879
+ "modes": [
880
+ "script"
881
+ ],
882
+ "compatible_agents": [
883
+ "generic",
884
+ "claude",
885
+ "codex"
886
+ ],
887
+ "path": "jobs/devops/queue-depth-check.yaml"
888
+ },
574
889
  {
575
890
  "id": "reading-list-nudge",
576
891
  "version": 1,
@@ -622,6 +937,78 @@
622
937
  ],
623
938
  "path": "jobs/devops/repo-health-check.yaml"
624
939
  },
940
+ {
941
+ "id": "review-request-nudge",
942
+ "version": 1,
943
+ "name": "Review Request Nudge",
944
+ "description": "Flags customers who bought a while ago and haven't been asked for a review yet. Use this if review requests only happen when someone remembers to send them.",
945
+ "category": "growth",
946
+ "tags": [
947
+ "growth",
948
+ "reviews",
949
+ "ecommerce"
950
+ ],
951
+ "schedule": "0 9 * * *",
952
+ "timezone": "UTC",
953
+ "runner": "shell",
954
+ "modes": [
955
+ "script"
956
+ ],
957
+ "compatible_agents": [
958
+ "generic",
959
+ "claude",
960
+ "codex"
961
+ ],
962
+ "path": "jobs/growth/review-request-nudge.yaml"
963
+ },
964
+ {
965
+ "id": "robots-txt-check",
966
+ "version": 1,
967
+ "name": "Robots.txt Blanket-Block Check",
968
+ "description": "Checks that your robots.txt hasn't accidentally blocked every crawler from your entire site. Use this if a robots.txt edit has ever accidentally tanked your search traffic.",
969
+ "category": "content",
970
+ "tags": [
971
+ "seo",
972
+ "robots",
973
+ "crawlability"
974
+ ],
975
+ "schedule": "0 8 * * *",
976
+ "timezone": "UTC",
977
+ "runner": "shell",
978
+ "modes": [
979
+ "script"
980
+ ],
981
+ "compatible_agents": [
982
+ "generic",
983
+ "claude",
984
+ "codex"
985
+ ],
986
+ "path": "jobs/content/robots-txt-check.yaml"
987
+ },
988
+ {
989
+ "id": "rss-feed-validate",
990
+ "version": 1,
991
+ "name": "RSS Feed Validation",
992
+ "description": "Checks your RSS/Atom feed is valid XML and shows the most recent item's publish date. Use this if you've ever shipped a broken feed and only found out when a reader's app stopped updating.",
993
+ "category": "content",
994
+ "tags": [
995
+ "rss",
996
+ "feed",
997
+ "content"
998
+ ],
999
+ "schedule": "0 8 * * *",
1000
+ "timezone": "UTC",
1001
+ "runner": "shell",
1002
+ "modes": [
1003
+ "script"
1004
+ ],
1005
+ "compatible_agents": [
1006
+ "generic",
1007
+ "claude",
1008
+ "codex"
1009
+ ],
1010
+ "path": "jobs/content/rss-feed-validate.yaml"
1011
+ },
625
1012
  {
626
1013
  "id": "saas-seat-audit",
627
1014
  "version": 1,
@@ -697,6 +1084,54 @@
697
1084
  ],
698
1085
  "path": "jobs/security/secrets-scan.yaml"
699
1086
  },
1087
+ {
1088
+ "id": "seo-meta-check",
1089
+ "version": 1,
1090
+ "name": "SEO Meta Tag Check",
1091
+ "description": "Checks a list of pages for missing title, meta description, and Open Graph tags. Use this if pages have ever shipped without basic SEO/social-preview tags because nobody double-checked.",
1092
+ "category": "content",
1093
+ "tags": [
1094
+ "seo",
1095
+ "content",
1096
+ "meta-tags"
1097
+ ],
1098
+ "schedule": "0 7 * * 1",
1099
+ "timezone": "UTC",
1100
+ "runner": "shell",
1101
+ "modes": [
1102
+ "script"
1103
+ ],
1104
+ "compatible_agents": [
1105
+ "generic",
1106
+ "claude",
1107
+ "codex"
1108
+ ],
1109
+ "path": "jobs/content/seo-meta-check.yaml"
1110
+ },
1111
+ {
1112
+ "id": "smoke-detector-battery-check",
1113
+ "version": 1,
1114
+ "name": "Smoke Detector Battery Check Reminder",
1115
+ "description": "Reminds you to test/replace smoke detector batteries on a schedule. Use this if the only time you think about smoke detectors is when one starts chirping at 3am.",
1116
+ "category": "home",
1117
+ "tags": [
1118
+ "home",
1119
+ "safety",
1120
+ "maintenance"
1121
+ ],
1122
+ "schedule": "0 9 1 * *",
1123
+ "timezone": "America/Los_Angeles",
1124
+ "runner": "shell",
1125
+ "modes": [
1126
+ "script"
1127
+ ],
1128
+ "compatible_agents": [
1129
+ "generic",
1130
+ "claude",
1131
+ "codex"
1132
+ ],
1133
+ "path": "jobs/home/smoke-detector-battery-check.yaml"
1134
+ },
700
1135
  {
701
1136
  "id": "social-mentions-watch",
702
1137
  "version": 1,
@@ -796,6 +1231,54 @@
796
1231
  ],
797
1232
  "path": "jobs/finance/subscription-audit.yaml"
798
1233
  },
1234
+ {
1235
+ "id": "sudo-usage-audit",
1236
+ "version": 1,
1237
+ "name": "Sudo Usage Audit",
1238
+ "description": "Reports new sudo commands run since the last check. Use this if you want to notice unexpected privilege escalation on a shared or internet-facing server.",
1239
+ "category": "security",
1240
+ "tags": [
1241
+ "security",
1242
+ "sudo",
1243
+ "audit"
1244
+ ],
1245
+ "schedule": "0 * * * *",
1246
+ "timezone": "UTC",
1247
+ "runner": "shell",
1248
+ "modes": [
1249
+ "script"
1250
+ ],
1251
+ "compatible_agents": [
1252
+ "generic",
1253
+ "claude",
1254
+ "codex"
1255
+ ],
1256
+ "path": "jobs/security/sudo-usage-audit.yaml"
1257
+ },
1258
+ {
1259
+ "id": "tax-deadline-reminder",
1260
+ "version": 1,
1261
+ "name": "Tax Deadline Reminder",
1262
+ "description": "Warns you ahead of upcoming tax deadlines you've listed. Use this if quarterly estimated payments or annual filing dates have ever snuck up on you.",
1263
+ "category": "finance",
1264
+ "tags": [
1265
+ "tax",
1266
+ "deadlines",
1267
+ "finance"
1268
+ ],
1269
+ "schedule": "0 9 * * *",
1270
+ "timezone": "UTC",
1271
+ "runner": "shell",
1272
+ "modes": [
1273
+ "script"
1274
+ ],
1275
+ "compatible_agents": [
1276
+ "generic",
1277
+ "claude",
1278
+ "codex"
1279
+ ],
1280
+ "path": "jobs/finance/tax-deadline-reminder.yaml"
1281
+ },
799
1282
  {
800
1283
  "id": "uptime-ping-check",
801
1284
  "version": 1,
@@ -820,6 +1303,30 @@
820
1303
  ],
821
1304
  "path": "jobs/devops/uptime-ping-check.yaml"
822
1305
  },
1306
+ {
1307
+ "id": "visa-expiry-check",
1308
+ "version": 1,
1309
+ "name": "Visa/Residency Document Expiry Check",
1310
+ "description": "Warns you before a visa, residency permit, or similar document expires. Use this if you're living or working abroad and a document deadline has ever crept up on you.",
1311
+ "category": "travel",
1312
+ "tags": [
1313
+ "travel",
1314
+ "visa",
1315
+ "documents"
1316
+ ],
1317
+ "schedule": "0 9 1 * *",
1318
+ "timezone": "UTC",
1319
+ "runner": "shell",
1320
+ "modes": [
1321
+ "script"
1322
+ ],
1323
+ "compatible_agents": [
1324
+ "generic",
1325
+ "claude",
1326
+ "codex"
1327
+ ],
1328
+ "path": "jobs/travel/visa-expiry-check.yaml"
1329
+ },
823
1330
  {
824
1331
  "id": "water-intake-reminder",
825
1332
  "version": 1,