@wonsukchoi/crondex 0.5.0 → 0.7.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.
Files changed (80) hide show
  1. package/README.md +9 -1
  2. package/bin/crondex.js +85 -0
  3. package/catalog.json +2397 -522
  4. package/jobs/construction/inspection-deadline-reminder.yaml +31 -0
  5. package/jobs/construction/permit-expiry-check.yaml +31 -0
  6. package/jobs/content/canonical-tag-check.yaml +25 -0
  7. package/jobs/content/hreflang-audit.yaml +25 -0
  8. package/jobs/content/image-alt-text-audit.yaml +21 -0
  9. package/jobs/content/page-speed-regression-watch.yaml +26 -0
  10. package/jobs/content/sitemap-freshness-check.yaml +31 -0
  11. package/jobs/content/stale-post-audit.yaml +28 -0
  12. package/jobs/creator/content-calendar-gap-check.yaml +31 -0
  13. package/jobs/creator/engagement-drop-watch.yaml +36 -0
  14. package/jobs/devops/cdn-cache-purge-reminder.yaml +27 -0
  15. package/jobs/devops/ci-build-time-regression-watch.yaml +35 -0
  16. package/jobs/devops/error-rate-spike-watch.yaml +43 -0
  17. package/jobs/devops/feature-flag-staleness-audit.yaml +30 -0
  18. package/jobs/devops/k8s-pod-restart-watch.yaml +26 -0
  19. package/jobs/devops/log-forwarding-health-check.yaml +32 -0
  20. package/jobs/devops/staging-prod-config-diff.yaml +32 -0
  21. package/jobs/devops/terraform-drift-check.yaml +24 -0
  22. package/jobs/education/assignment-grading-backlog-check.yaml +23 -0
  23. package/jobs/education/attendance-anomaly-check.yaml +33 -0
  24. package/jobs/events/rsvp-followup-reminder.yaml +30 -0
  25. package/jobs/events/vendor-payment-deadline-reminder.yaml +31 -0
  26. package/jobs/finance/budget-overspend-check.yaml +29 -0
  27. package/jobs/finance/fx-rate-watch.yaml +33 -0
  28. package/jobs/finance/payroll-run-reminder.yaml +27 -0
  29. package/jobs/finance/recurring-payment-failure-check.yaml +23 -0
  30. package/jobs/fleet/fuel-card-anomaly-check.yaml +37 -0
  31. package/jobs/fleet/vehicle-maintenance-due-check.yaml +36 -0
  32. package/jobs/growth/churn-risk-watch.yaml +33 -0
  33. package/jobs/growth/trial-expiring-nudge.yaml +33 -0
  34. package/jobs/hiring/candidate-followup-nudge.yaml +23 -0
  35. package/jobs/hiring/open-req-aging-check.yaml +31 -0
  36. package/jobs/home/car-maintenance-due-reminder.yaml +30 -0
  37. package/jobs/home/warranty-expiry-reminder.yaml +31 -0
  38. package/jobs/hospitality/food-safety-temp-log-check.yaml +36 -0
  39. package/jobs/hospitality/reservation-noshow-check.yaml +20 -0
  40. package/jobs/inventory/inventory-count-discrepancy-check.yaml +38 -0
  41. package/jobs/inventory/low-stock-alert.yaml +20 -0
  42. package/jobs/investing/crypto-price-alert.yaml +33 -0
  43. package/jobs/investing/portfolio-rebalance-check.yaml +32 -0
  44. package/jobs/learning/cert-renewal-reminder.yaml +30 -0
  45. package/jobs/learning/conference-cfp-deadline-reminder.yaml +42 -0
  46. package/jobs/legal/contract-renewal-reminder.yaml +31 -0
  47. package/jobs/legal/trademark-renewal-reminder.yaml +30 -0
  48. package/jobs/logistics/customs-clearance-check.yaml +34 -0
  49. package/jobs/logistics/shipment-delay-watch.yaml +38 -0
  50. package/jobs/manufacturing/production-line-downtime-watch.yaml +34 -0
  51. package/jobs/manufacturing/quality-defect-rate-check.yaml +20 -0
  52. package/jobs/marketing/ad-spend-pacing-check.yaml +37 -0
  53. package/jobs/marketing/email-deliverability-check.yaml +37 -0
  54. package/jobs/nonprofit/grant-deadline-reminder.yaml +44 -0
  55. package/jobs/nonprofit/lapsed-donor-check.yaml +26 -0
  56. package/jobs/personal/medication-refill-reminder.yaml +30 -0
  57. package/jobs/podcast/episode-publish-gap-check.yaml +29 -0
  58. package/jobs/podcast/sponsor-deliverable-tracker.yaml +31 -0
  59. package/jobs/productivity/calendar-double-booking-check.yaml +21 -0
  60. package/jobs/productivity/stale-todo-sweep.yaml +26 -0
  61. package/jobs/productivity/timezone-meeting-conflict-check.yaml +31 -0
  62. package/jobs/realestate/lease-expiry-reminder.yaml +30 -0
  63. package/jobs/realestate/rental-vacancy-check.yaml +30 -0
  64. package/jobs/sales/lead-response-time-check.yaml +23 -0
  65. package/jobs/sales/stale-deal-nudge.yaml +35 -0
  66. package/jobs/security/2fa-enrollment-audit.yaml +24 -0
  67. package/jobs/security/cve-watch.yaml +27 -0
  68. package/jobs/security/dependabot-alert-digest.yaml +30 -0
  69. package/jobs/security/expiring-api-key-rotation.yaml +31 -0
  70. package/jobs/security/iam-key-rotation-reminder.yaml +27 -0
  71. package/jobs/security/s3-public-bucket-check.yaml +20 -0
  72. package/jobs/security/tls-cipher-weak-check.yaml +31 -0
  73. package/jobs/security/waf-rule-change-watch.yaml +38 -0
  74. package/jobs/support/csat-score-watch.yaml +32 -0
  75. package/jobs/support/ticket-backlog-aging-check.yaml +30 -0
  76. package/jobs/team/oncall-handoff-reminder.yaml +26 -0
  77. package/jobs/team/team-anniversary-reminder.yaml +22 -0
  78. package/jobs/travel/frequent-flyer-miles-expiry.yaml +30 -0
  79. package/jobs/travel/travel-insurance-expiry-check.yaml +26 -0
  80. package/package.json +1 -1
@@ -0,0 +1,42 @@
1
+ id: conference-cfp-deadline-reminder
2
+ version: 1
3
+ name: Conference CFP Deadline Reminder
4
+ description: >
5
+ Warns you before a conference's call-for-papers deadline, and can help
6
+ draft your talk proposal. Use this if you've ever meant to submit a talk
7
+ and missed the CFP because you found out a week too late.
8
+ category: learning
9
+ tags: [learning, conference, cfp, career]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: hybrid
13
+ command: >
14
+ today=$(date +%s);
15
+ deadline_ts=$(date -d "{{cfp_deadline}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{cfp_deadline}}" +%s);
16
+ days_left=$(( (deadline_ts - today) / 86400 ));
17
+ if [ "$days_left" -le "{{warn_days}}" ] && [ "$days_left" -ge 0 ]; then echo "WARNING: {{conference_name}} CFP closes in $days_left days ({{cfp_deadline}})"; exit 1;
18
+ else echo "OK: {{conference_name}} CFP closes in $days_left days"; fi
19
+ prompt: |
20
+ The CFP for {{conference_name}} closes on {{cfp_deadline}}. Compute days
21
+ remaining from today.
22
+ 1. If within {{warn_days}} days, flag it clearly.
23
+ 2. Help draft a talk proposal abstract based on {{topic_hint}} — title,
24
+ 3-sentence abstract, and why it fits this conference's audience.
25
+ script_note: >
26
+ `command` only checks the deadline and warns. `prompt` also drafts a
27
+ talk proposal abstract, which needs an LLM.
28
+ variables:
29
+ conference_name:
30
+ default: "a conference"
31
+ description: Name of the conference.
32
+ cfp_deadline:
33
+ default: "2026-09-01"
34
+ description: CFP submission deadline (YYYY-MM-DD).
35
+ warn_days:
36
+ default: 14
37
+ description: Days before deadline to start warning.
38
+ topic_hint:
39
+ default: "a project or topic you've been working on"
40
+ description: What you'd want to talk about, for the draft abstract.
41
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
42
+ notes: Manual cfp_deadline input — update per conference you're tracking.
@@ -0,0 +1,31 @@
1
+ id: contract-renewal-reminder
2
+ version: 1
3
+ name: Contract Renewal Reminder
4
+ description: >
5
+ Warns you before a vendor or customer contract auto-renews or expires.
6
+ Use this if a contract has ever auto-renewed for another year because
7
+ nobody flagged the cancellation window in time.
8
+ category: legal
9
+ tags: [legal, contracts, renewal]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ awk -F, -v today="$today" -v warn={{warn_days}} '
16
+ NR>1 {
17
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
18
+ cmd | getline renew_ts; close(cmd);
19
+ days_left = int((renew_ts - today) / 86400);
20
+ if (days_left <= warn) print "WARNING: " $1 " renews/expires in " days_left " days (" $2 ")";
21
+ }
22
+ ' {{contracts_csv}}
23
+ variables:
24
+ contracts_csv:
25
+ default: "contracts.csv"
26
+ description: "CSV with header row, columns: name,renewal_date(YYYY-MM-DD)."
27
+ warn_days:
28
+ default: 30
29
+ description: Days before renewal/expiry to start warning.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Keep contracts.csv updated manually or export it from your contract management tool before each run.
@@ -0,0 +1,30 @@
1
+ id: trademark-renewal-reminder
2
+ version: 1
3
+ name: Trademark Renewal Reminder
4
+ description: >
5
+ Warns you before a trademark registration's renewal deadline. Use this
6
+ if you've ever let a trademark lapse simply because the renewal date
7
+ wasn't on anyone's calendar.
8
+ category: legal
9
+ tags: [legal, trademark, ip]
10
+ schedule: "0 9 1 * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ due_ts=$(date -d "{{renewal_date}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{renewal_date}}" +%s);
16
+ days_left=$(( (due_ts - today) / 86400 ));
17
+ if [ "$days_left" -le "{{warn_days}}" ]; then echo "WARNING: trademark {{mark_name}} renewal due in $days_left days ({{renewal_date}})"; exit 1;
18
+ else echo "OK: trademark {{mark_name}} renewal due in $days_left days"; fi
19
+ variables:
20
+ mark_name:
21
+ default: "your trademark"
22
+ description: Name/identifier of the trademark to track.
23
+ renewal_date:
24
+ default: "2027-01-01"
25
+ description: Renewal deadline date (YYYY-MM-DD).
26
+ warn_days:
27
+ default: 90
28
+ description: Days before deadline to start warning.
29
+ compatible_agents: [generic, claude, codex]
30
+ notes: Manual renewal_date input — update after each renewal cycle; run one copy per registered mark/jurisdiction.
@@ -0,0 +1,34 @@
1
+ id: customs-clearance-check
2
+ version: 1
3
+ name: Customs Clearance Check
4
+ description: >
5
+ Flags a shipment that's been sitting in customs longer than expected.
6
+ Use this if a shipment has ever been stuck at the border for weeks
7
+ before anyone thought to follow up with the broker.
8
+ category: logistics
9
+ tags: [logistics, customs, shipping]
10
+ schedule: "0 9 * * *"
11
+ timezone: "UTC"
12
+ runner: agent-prompt
13
+ prompt: |
14
+ Check the customs clearance status of shipment {{shipment_id}} via
15
+ {{tracking_source_hint}}.
16
+ 1. Determine how long it's been in a "customs hold" or equivalent
17
+ status.
18
+ 2. If it's been more than {{warn_days}} days, flag it and note any
19
+ stated reason for the hold (missing documents, duties owed,
20
+ inspection) if visible.
21
+ 3. Suggest the next action (contact broker, pay duties, provide
22
+ documents) based on the reason if known.
23
+ variables:
24
+ shipment_id:
25
+ default: "your-shipment-id"
26
+ description: Shipment/tracking identifier to check.
27
+ tracking_source_hint:
28
+ default: "carrier tracking page or customs broker portal"
29
+ description: Where to check customs status for this shipment.
30
+ warn_days:
31
+ default: 5
32
+ description: Days in customs hold before it's flagged.
33
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
34
+ notes: No generic script mode — customs status pages/APIs vary by carrier and broker, and reason codes need interpretation.
@@ -0,0 +1,38 @@
1
+ id: shipment-delay-watch
2
+ version: 1
3
+ name: Shipment Delay Watch
4
+ description: >
5
+ Checks a shipment's tracking status and flags it if it hasn't moved in a
6
+ while. Use this if a stuck shipment has ever gone unnoticed until a
7
+ customer asked where their order was.
8
+ category: logistics
9
+ tags: [logistics, shipping, tracking]
10
+ schedule: "0 */6 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ status=$(curl -s -H "Authorization: Bearer {{carrier_api_token}}" "{{tracking_api_url}}" | grep -o '"status":"[^"]*"' | head -n1 | cut -d'"' -f4);
15
+ updated=$(curl -s -H "Authorization: Bearer {{carrier_api_token}}" "{{tracking_api_url}}" | grep -o '"updated_at":"[^"]*"' | head -n1 | cut -d'"' -f4);
16
+ if [ -z "$status" ]; then echo "ERROR: could not fetch tracking status from {{tracking_api_url}}"; exit 1; fi;
17
+ updated_ts=$(date -d "$updated" +%s 2>/dev/null);
18
+ now_ts=$(date +%s);
19
+ hours_stale=$(( (now_ts - updated_ts) / 3600 ));
20
+ if [ "$hours_stale" -ge "{{stale_hours}}" ] && [ "$status" != "delivered" ]; then
21
+ echo "WARNING: shipment {{shipment_id}} status \"$status\" hasn't updated in $hours_stale hours";
22
+ exit 1;
23
+ else echo "OK: shipment {{shipment_id}} status \"$status\", updated $hours_stale hours ago"; fi
24
+ variables:
25
+ shipment_id:
26
+ default: "your-shipment-id"
27
+ description: Shipment/tracking identifier, for labeling output.
28
+ tracking_api_url:
29
+ default: "https://api.example-carrier.com/track/your-shipment-id"
30
+ description: Carrier tracking API endpoint returning status and updated_at.
31
+ carrier_api_token:
32
+ default: "your-api-token"
33
+ description: Bearer token for the carrier's tracking API.
34
+ stale_hours:
35
+ default: 48
36
+ description: Hours without a status update before it's flagged as delayed.
37
+ compatible_agents: [generic, claude, codex]
38
+ notes: Generic REST pattern — point tracking_api_url at your carrier or aggregator's (EasyPost, AfterShip, ShipEngine) tracking endpoint; adjust field names to match its response shape.
@@ -0,0 +1,34 @@
1
+ id: production-line-downtime-watch
2
+ version: 1
3
+ name: Production Line Downtime Watch
4
+ description: >
5
+ Checks how long a production line has been stopped and flags it once it
6
+ crosses a threshold. Use this if a line has ever sat down far longer
7
+ than anyone realized because the stoppage alert never made it to the
8
+ right person.
9
+ category: manufacturing
10
+ tags: [manufacturing, downtime, production]
11
+ schedule: "*/15 * * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ status=$(curl -s "{{line_status_api_url}}" | grep -o '"status":"[^"]*"' | head -n1 | cut -d'"' -f4);
16
+ since=$(curl -s "{{line_status_api_url}}" | grep -o '"status_since":"[^"]*"' | head -n1 | cut -d'"' -f4);
17
+ if [ "$status" != "stopped" ]; then echo "OK: line {{line_id}} status is $status"; exit 0; fi;
18
+ since_ts=$(date -d "$since" +%s 2>/dev/null);
19
+ now_ts=$(date +%s);
20
+ minutes_down=$(( (now_ts - since_ts) / 60 ));
21
+ if [ "$minutes_down" -ge "{{threshold_minutes}}" ]; then echo "WARNING: line {{line_id}} stopped for $minutes_down minutes"; exit 1;
22
+ else echo "OK: line {{line_id}} stopped for $minutes_down minutes (under threshold)"; fi
23
+ variables:
24
+ line_id:
25
+ default: "line-1"
26
+ description: Identifier of the production line, for labeling output.
27
+ line_status_api_url:
28
+ default: "https://api.example-mes.com/lines/line-1/status"
29
+ description: MES/SCADA API endpoint returning status and status_since fields.
30
+ threshold_minutes:
31
+ default: 30
32
+ description: Minutes stopped before it's flagged.
33
+ compatible_agents: [generic, claude, codex]
34
+ notes: Generic REST pattern — point line_status_api_url at your MES/SCADA system's status endpoint; adjust field names to match its response shape.
@@ -0,0 +1,20 @@
1
+ id: quality-defect-rate-check
2
+ version: 1
3
+ name: Quality Defect Rate Check
4
+ description: >
5
+ Checks today's defect rate against a target and flags it if it's
6
+ running high. Use this if a quality problem has ever run for a full
7
+ shift before anyone pulled the numbers and noticed.
8
+ category: manufacturing
9
+ tags: [manufacturing, quality, defects]
10
+ schedule: "0 */4 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ psql "{{database_url}}" -t -c "select round(100.0 * sum(case when defective then 1 else 0 end) / count(*), 2) from inspections where inspected_at >= current_date;"
15
+ variables:
16
+ database_url:
17
+ default: "postgres://user:pass@host:5432/db"
18
+ description: Connection string for the quality/inspections database.
19
+ compatible_agents: [generic, claude, codex]
20
+ notes: Assumes an `inspections` table with a boolean `defective` column and `inspected_at` timestamp — adjust the query to your QMS schema; compare the printed rate against your target manually or extend the command with a threshold check.
@@ -0,0 +1,37 @@
1
+ id: ad-spend-pacing-check
2
+ version: 1
3
+ name: Ad Spend Pacing Check
4
+ description: >
5
+ Checks a campaign's spend so far against where it should be by this
6
+ point in the budget period, and flags over- or under-pacing. Use this
7
+ if a campaign has ever blown through its monthly budget in the first
8
+ two weeks because nobody was watching the burn rate.
9
+ category: marketing
10
+ tags: [marketing, ads, budget]
11
+ schedule: "0 8 * * *"
12
+ timezone: "UTC"
13
+ runner: agent-prompt
14
+ prompt: |
15
+ Check spend for campaign {{campaign_name}} on {{ad_platform_hint}}.
16
+ 1. Pull total spend so far this budget period against the
17
+ {{budget_usd}} budget.
18
+ 2. Compute expected spend-to-date based on days elapsed vs. total days
19
+ in the period, and compare to actual.
20
+ 3. Flag if pacing is more than {{pacing_threshold_pct}}% over or under
21
+ the expected pace.
22
+ 4. Report actual vs. expected spend and the pacing delta.
23
+ variables:
24
+ campaign_name:
25
+ default: "your campaign"
26
+ description: Name/ID of the ad campaign to check.
27
+ ad_platform_hint:
28
+ default: "Google Ads, Meta Ads, or similar"
29
+ description: Which ad platform the campaign runs on.
30
+ budget_usd:
31
+ default: 5000
32
+ description: Total budget for the period, in USD.
33
+ pacing_threshold_pct:
34
+ default: 15
35
+ description: Percent over/under expected pace that triggers a flag.
36
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
37
+ notes: No generic script mode — ad platform APIs need OAuth per-platform, and pacing math needs the campaign's period boundaries which vary by setup.
@@ -0,0 +1,37 @@
1
+ id: email-deliverability-check
2
+ version: 1
3
+ name: Email Deliverability Check
4
+ description: >
5
+ Checks recent bounce and spam-complaint rates for your email sends and
6
+ flags a spike. Use this if a deliverability problem has ever quietly
7
+ tanked open rates for a week before anyone checked the actual bounce
8
+ numbers.
9
+ category: marketing
10
+ tags: [marketing, email, deliverability]
11
+ schedule: "0 9 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ stats=$(curl -s -H "Authorization: Bearer {{esp_api_token}}" "{{esp_stats_api_url}}");
16
+ bounce_rate=$(echo "$stats" | grep -o '"bounce_rate":[0-9.]*' | cut -d: -f2);
17
+ complaint_rate=$(echo "$stats" | grep -o '"complaint_rate":[0-9.]*' | cut -d: -f2);
18
+ if [ -z "$bounce_rate" ]; then echo "ERROR: could not fetch stats from {{esp_stats_api_url}}"; exit 1; fi;
19
+ flagged=0;
20
+ if awk "BEGIN{exit !($bounce_rate > {{max_bounce_pct}})}"; then echo "WARNING: bounce rate ${bounce_rate}% over threshold {{max_bounce_pct}}%"; flagged=1; fi;
21
+ if awk "BEGIN{exit !($complaint_rate > {{max_complaint_pct}})}"; then echo "WARNING: complaint rate ${complaint_rate}% over threshold {{max_complaint_pct}}%"; flagged=1; fi;
22
+ if [ "$flagged" -eq 0 ]; then echo "OK: bounce ${bounce_rate}%, complaint ${complaint_rate}%"; else exit 1; fi
23
+ variables:
24
+ esp_stats_api_url:
25
+ default: "https://api.example-esp.com/stats/recent"
26
+ description: Email service provider stats API endpoint returning bounce_rate and complaint_rate.
27
+ esp_api_token:
28
+ default: "your-api-token"
29
+ description: API token for the email service provider.
30
+ max_bounce_pct:
31
+ default: 2
32
+ description: Bounce rate percent that triggers a warning.
33
+ max_complaint_pct:
34
+ default: 0.1
35
+ description: Spam complaint rate percent that triggers a warning.
36
+ compatible_agents: [generic, claude, codex]
37
+ notes: Generic REST pattern — point esp_stats_api_url at your ESP's (SendGrid, Mailgun, Postmark) stats endpoint; adjust field names to match its response shape.
@@ -0,0 +1,44 @@
1
+ id: grant-deadline-reminder
2
+ version: 1
3
+ name: Grant Deadline Reminder
4
+ description: >
5
+ Warns you before a grant application deadline, and can help draft the
6
+ application. Use this if a funding opportunity has ever been missed
7
+ simply because the deadline crept up during a busy week.
8
+ category: nonprofit
9
+ tags: [nonprofit, grants, fundraising]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: hybrid
13
+ command: >
14
+ today=$(date +%s);
15
+ awk -F, -v today="$today" -v warn={{warn_days}} '
16
+ NR>1 {
17
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
18
+ cmd | getline due_ts; close(cmd);
19
+ days_left = int((due_ts - today) / 86400);
20
+ if (days_left <= warn && days_left >= 0) print "WARNING: grant \"" $1 "\" due in " days_left " days (" $2 ")";
21
+ }
22
+ ' {{grants_csv}}
23
+ prompt: |
24
+ Check {{grants_csv}} for grant application deadlines within
25
+ {{warn_days}} days.
26
+ 1. Flag any that are close, listing days remaining.
27
+ 2. For the closest one, help draft or outline the application based on
28
+ {{org_mission_hint}} — key sections, and what evidence/data to pull
29
+ together first.
30
+ script_note: >
31
+ `command` only checks dates and warns. `prompt` also helps draft/outline
32
+ the closest application, which needs an LLM.
33
+ variables:
34
+ grants_csv:
35
+ default: "grants.csv"
36
+ description: "CSV with header row, columns: grant_name,deadline(YYYY-MM-DD)."
37
+ warn_days:
38
+ default: 21
39
+ description: Days before deadline to start warning.
40
+ org_mission_hint:
41
+ default: "your organization's mission and programs"
42
+ description: Brief context on the org, to help draft the application outline.
43
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
44
+ notes: Keep grants.csv updated with opportunities as you find them.
@@ -0,0 +1,26 @@
1
+ id: lapsed-donor-check
2
+ version: 1
3
+ name: Lapsed Donor Check
4
+ description: >
5
+ Flags donors who gave before but haven't in a while, before they're
6
+ fully lost. Use this if lapsed-donor outreach only happens during the
7
+ annual campaign instead of catching people while it's still recoverable.
8
+ category: nonprofit
9
+ tags: [nonprofit, donors, fundraising]
10
+ schedule: "0 9 1 * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ psql "{{database_url}}" -t -c "select name, email, last_donation_at from donors where last_donation_at < now() - interval '{{lapsed_months}} months' and last_donation_at > now() - interval '{{lapsed_months}} months' - interval '90 days';"
15
+ variables:
16
+ database_url:
17
+ default: "postgres://user:pass@host:5432/db"
18
+ description: Connection string for the donor database.
19
+ lapsed_months:
20
+ default: 12
21
+ description: Months since last donation before a donor counts as lapsing.
22
+ compatible_agents: [generic, claude, codex]
23
+ notes: >
24
+ Assumes a `donors` table with `last_donation_at` — the 90-day window
25
+ after the lapsed_months mark keeps this from re-flagging the same donor
26
+ every run indefinitely.
@@ -0,0 +1,30 @@
1
+ id: medication-refill-reminder
2
+ version: 1
3
+ name: Medication Refill Reminder
4
+ description: >
5
+ Reminds you to refill a medication before you run out, based on how many
6
+ days of supply you have left. Use this if you've ever run out of a
7
+ prescription over a weekend when the pharmacy's closed.
8
+ category: personal
9
+ tags: [health, medication, reminder]
10
+ schedule: "0 9 * * *"
11
+ timezone: "America/Los_Angeles"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ runout_ts=$(date -d "{{runout_date}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{runout_date}}" +%s);
16
+ days_left=$(( (runout_ts - today) / 86400 ));
17
+ if [ "$days_left" -le "{{warn_days}}" ]; then echo "WARNING: {{medication_name}} runs out in $days_left days — refill now"; exit 1;
18
+ else echo "OK: {{medication_name}} has $days_left days left"; fi
19
+ variables:
20
+ medication_name:
21
+ default: "your medication"
22
+ description: Name of the medication to track.
23
+ runout_date:
24
+ default: "2026-08-01"
25
+ description: Date the current supply runs out (YYYY-MM-DD).
26
+ warn_days:
27
+ default: 5
28
+ description: Days before running out to start warning.
29
+ compatible_agents: [generic, claude, codex]
30
+ notes: Manual runout_date input — update it each time you fill the prescription.
@@ -0,0 +1,29 @@
1
+ id: episode-publish-gap-check
2
+ version: 1
3
+ name: Podcast Episode Publish Gap Check
4
+ description: >
5
+ Checks that a new episode has gone out recently and flags it if your
6
+ publish cadence has slipped. Use this if listeners have ever noticed a
7
+ gap in your feed before you did.
8
+ category: podcast
9
+ tags: [podcast, publishing, cadence]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ lastmod=$(curl -s {{feed_url}} | grep -o '<pubDate>[^<]*' | sed 's/<pubDate>//' | head -n1);
15
+ if [ -z "$lastmod" ]; then echo "WARNING: could not find any <pubDate> in {{feed_url}}"; exit 1; fi;
16
+ last_ts=$(date -d "$lastmod" +%s 2>/dev/null);
17
+ now_ts=$(date +%s);
18
+ days_since=$(( (now_ts - last_ts) / 86400 ));
19
+ if [ "$days_since" -ge "{{max_gap_days}}" ]; then echo "WARNING: last episode was $days_since days ago"; exit 1;
20
+ else echo "OK: last episode was $days_since days ago"; fi
21
+ variables:
22
+ feed_url:
23
+ default: "https://example.com/podcast/feed.xml"
24
+ description: URL of the podcast's RSS feed.
25
+ max_gap_days:
26
+ default: 14
27
+ description: Days since the last episode before it's flagged.
28
+ compatible_agents: [generic, claude, codex]
29
+ notes: Relies on the feed's <pubDate> being in a standard RFC 822 format, which most podcast hosts produce.
@@ -0,0 +1,31 @@
1
+ id: sponsor-deliverable-tracker
2
+ version: 1
3
+ name: Podcast Sponsor Deliverable Tracker
4
+ description: >
5
+ Flags sponsor deliverables (read, mention, social post) coming due. Use
6
+ this if you've ever had a sponsor follow up asking where their promised
7
+ mention was.
8
+ category: podcast
9
+ tags: [podcast, sponsorship, deliverables]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ awk -F, -v today="$today" -v warn={{warn_days}} '
16
+ NR>1 {
17
+ cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
18
+ cmd | getline due_ts; close(cmd);
19
+ days_left = int((due_ts - today) / 86400);
20
+ if (days_left <= warn && days_left >= 0) print "WARNING: " $1 " deliverable (" $2 ") due in " days_left " days (" $3 ")";
21
+ }
22
+ ' {{sponsor_deliverables_csv}}
23
+ variables:
24
+ sponsor_deliverables_csv:
25
+ default: "sponsor-deliverables.csv"
26
+ description: "CSV with header row, columns: sponsor_name,deliverable,due_date(YYYY-MM-DD)."
27
+ warn_days:
28
+ default: 7
29
+ description: Days before due date to start warning.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Keep sponsor-deliverables.csv updated whenever a sponsorship deal is signed — one row per deliverable.
@@ -0,0 +1,21 @@
1
+ id: calendar-double-booking-check
2
+ version: 1
3
+ name: Calendar Double-Booking Check
4
+ description: >
5
+ Checks today's calendar for overlapping meetings and flags them. Use
6
+ this if you've ever accepted two invites for the same slot and only
7
+ noticed when both started ringing.
8
+ category: productivity
9
+ tags: [calendar, meetings, productivity]
10
+ schedule: "0 7 * * 1-5"
11
+ timezone: "America/Los_Angeles"
12
+ runner: agent-prompt
13
+ prompt: |
14
+ Check today's calendar for overlapping events.
15
+ 1. List all meetings scheduled for today.
16
+ 2. Flag any pair of events whose times overlap.
17
+ 3. For each conflict, report both event names, times, and organizers so
18
+ it's obvious which one to decline or reschedule.
19
+ variables: {}
20
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
21
+ notes: No generic script mode — calendar access is provider-specific (Google Calendar, Outlook, etc.) and typically needs an agent with calendar-tool access.
@@ -0,0 +1,26 @@
1
+ id: stale-todo-sweep
2
+ version: 1
3
+ name: Stale Todo Sweep
4
+ description: >
5
+ Finds TODO/FIXME comments in your codebase that have sat untouched for a
6
+ long time, so you can decide whether to fix, ticket, or delete them. Use
7
+ this if TODO comments in this repo have basically become permanent decor.
8
+ category: productivity
9
+ tags: [todos, cleanup, code-hygiene]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ grep -rn "TODO\|FIXME" {{search_dir}} --include="*.{{ext}}" 2>/dev/null | while IFS=: read -r file line rest; do
15
+ last_change=$(git -C {{search_dir}} log -1 --format=%ar -- "$file" 2>/dev/null);
16
+ echo "$file:$line last touched $last_change: $rest"
17
+ done
18
+ variables:
19
+ search_dir:
20
+ default: "."
21
+ description: Directory to search for TODO/FIXME comments.
22
+ ext:
23
+ default: "js"
24
+ description: File extension to search (single extension; run multiple copies for multiple languages).
25
+ compatible_agents: [generic, claude, codex]
26
+ notes: The "last touched" date reflects the file's last git change, not the specific TODO line — a big refactor nearby will reset the age even if the TODO itself is old.
@@ -0,0 +1,31 @@
1
+ id: timezone-meeting-conflict-check
2
+ version: 1
3
+ name: Timezone Meeting Conflict Check
4
+ description: >
5
+ Checks tomorrow's meetings against a remote teammate's working hours and
6
+ flags any that fall outside them. Use this if a meeting has ever gotten
7
+ scheduled at 11pm for someone across the world without anyone realizing.
8
+ category: productivity
9
+ tags: [calendar, timezone, meetings]
10
+ schedule: "0 16 * * *"
11
+ timezone: "America/Los_Angeles"
12
+ runner: agent-prompt
13
+ prompt: |
14
+ Check tomorrow's calendar for meetings that include {{teammate_name}}
15
+ (timezone {{teammate_timezone}}, working hours {{working_hours}}).
16
+ 1. Convert each meeting time to {{teammate_name}}'s local time.
17
+ 2. Flag any meeting that falls outside their stated working hours.
18
+ 3. Suggest an alternative time inside working hours for each flagged
19
+ meeting if the calendar shows open slots.
20
+ variables:
21
+ teammate_name:
22
+ default: "your remote teammate"
23
+ description: Name of the teammate to check meetings against.
24
+ teammate_timezone:
25
+ default: "Europe/Berlin"
26
+ description: IANA timezone for the teammate.
27
+ working_hours:
28
+ default: "09:00-18:00"
29
+ description: The teammate's normal working hours, local time.
30
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
31
+ notes: No generic script mode — calendar access and timezone-aware conflict detection need an agent with calendar-tool access.
@@ -0,0 +1,30 @@
1
+ id: lease-expiry-reminder
2
+ version: 1
3
+ name: Lease Expiry Reminder
4
+ description: >
5
+ Warns you before a lease ends so there's time to renew, renegotiate, or
6
+ start looking. Use this if a lease has ever gone month-to-month, or
7
+ ended, without anyone noticing the date was coming.
8
+ category: realestate
9
+ tags: [realestate, lease, reminder]
10
+ schedule: "0 9 1 * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ end_ts=$(date -d "{{lease_end_date}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{lease_end_date}}" +%s);
16
+ days_left=$(( (end_ts - today) / 86400 ));
17
+ if [ "$days_left" -le "{{warn_days}}" ]; then echo "WARNING: lease for {{property_name}} ends in $days_left days ({{lease_end_date}})"; exit 1;
18
+ else echo "OK: lease for {{property_name}} ends in $days_left days"; fi
19
+ variables:
20
+ property_name:
21
+ default: "your unit"
22
+ description: Name/address of the leased property.
23
+ lease_end_date:
24
+ default: "2027-01-01"
25
+ description: Lease end date (YYYY-MM-DD).
26
+ warn_days:
27
+ default: 60
28
+ description: Days before end date to start warning.
29
+ compatible_agents: [generic, claude, codex]
30
+ notes: Manual lease_end_date input — run one copy per property/unit you're tracking.
@@ -0,0 +1,30 @@
1
+ id: rental-vacancy-check
2
+ version: 1
3
+ name: Rental Vacancy Check
4
+ description: >
5
+ Flags a rental listing that's been vacant longer than expected. Use this
6
+ if a unit has ever sat empty for months while everyone assumed someone
7
+ else was handling the listing.
8
+ category: realestate
9
+ tags: [realestate, vacancy, listings]
10
+ schedule: "0 9 * * 1"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ vacant_since_ts=$(date -d "{{vacant_since_date}}" +%s 2>/dev/null || date -jf "%Y-%m-%d" "{{vacant_since_date}}" +%s);
16
+ days_vacant=$(( (today - vacant_since_ts) / 86400 ));
17
+ if [ "$days_vacant" -ge "{{warn_days}}" ]; then echo "WARNING: {{property_name}} has been vacant $days_vacant days (since {{vacant_since_date}})"; exit 1;
18
+ else echo "OK: {{property_name}} vacant $days_vacant days"; fi
19
+ variables:
20
+ property_name:
21
+ default: "your unit"
22
+ description: Name/address of the vacant property.
23
+ vacant_since_date:
24
+ default: "2026-06-01"
25
+ description: Date the unit became vacant (YYYY-MM-DD).
26
+ warn_days:
27
+ default: 30
28
+ description: Days vacant before it's flagged.
29
+ compatible_agents: [generic, claude, codex]
30
+ notes: Manual vacant_since_date input — update it once the unit is leased, or when a new vacancy starts.
@@ -0,0 +1,23 @@
1
+ id: lead-response-time-check
2
+ version: 1
3
+ name: Lead Response Time Check
4
+ description: >
5
+ Flags new inbound leads that haven't gotten a first response within your
6
+ target window. Use this if you've ever lost a hot lead simply because
7
+ nobody replied fast enough.
8
+ category: sales
9
+ tags: [sales, leads, response-time]
10
+ schedule: "*/30 * * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ psql "{{database_url}}" -t -c "select name, email, created_at from leads where first_response_at is null and created_at < now() - interval '{{max_response_minutes}} minutes';"
15
+ variables:
16
+ database_url:
17
+ default: "postgres://user:pass@host:5432/db"
18
+ description: Connection string for the leads database.
19
+ max_response_minutes:
20
+ default: 30
21
+ description: Minutes a lead can go without a first response before it's flagged.
22
+ compatible_agents: [generic, claude, codex]
23
+ notes: Assumes a `leads` table with `created_at` and `first_response_at` columns — adjust the query to your CRM's schema.