@wonsukchoi/crondex 0.6.0 → 0.8.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 (75) hide show
  1. package/README.md +52 -128
  2. package/bin/crondex.js +85 -0
  3. package/catalog.json +1891 -153
  4. package/jobs/construction/change-order-approval-reminder.yaml +31 -0
  5. package/jobs/construction/inspection-deadline-reminder.yaml +31 -0
  6. package/jobs/construction/permit-expiry-check.yaml +31 -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/creator/content-calendar-gap-check.yaml +31 -0
  11. package/jobs/creator/crosspost-lag-check.yaml +35 -0
  12. package/jobs/creator/engagement-drop-watch.yaml +36 -0
  13. package/jobs/devops/cdn-cache-purge-reminder.yaml +27 -0
  14. package/jobs/devops/ci-build-time-regression-watch.yaml +35 -0
  15. package/jobs/devops/k8s-pod-restart-watch.yaml +26 -0
  16. package/jobs/devops/log-forwarding-health-check.yaml +32 -0
  17. package/jobs/devops/staging-prod-config-diff.yaml +32 -0
  18. package/jobs/education/assignment-grading-backlog-check.yaml +23 -0
  19. package/jobs/education/attendance-anomaly-check.yaml +33 -0
  20. package/jobs/education/report-card-deadline-reminder.yaml +27 -0
  21. package/jobs/events/event-budget-overrun-check.yaml +31 -0
  22. package/jobs/events/rsvp-followup-reminder.yaml +30 -0
  23. package/jobs/events/vendor-payment-deadline-reminder.yaml +31 -0
  24. package/jobs/finance/payroll-run-reminder.yaml +27 -0
  25. package/jobs/finance/recurring-payment-failure-check.yaml +23 -0
  26. package/jobs/fleet/fuel-card-anomaly-check.yaml +37 -0
  27. package/jobs/fleet/vehicle-maintenance-due-check.yaml +36 -0
  28. package/jobs/fleet/vehicle-registration-expiry-check.yaml +31 -0
  29. package/jobs/hiring/candidate-followup-nudge.yaml +23 -0
  30. package/jobs/hiring/offer-expiry-reminder.yaml +31 -0
  31. package/jobs/hiring/open-req-aging-check.yaml +31 -0
  32. package/jobs/home/warranty-expiry-reminder.yaml +31 -0
  33. package/jobs/hospitality/food-safety-temp-log-check.yaml +36 -0
  34. package/jobs/hospitality/health-inspection-due-reminder.yaml +32 -0
  35. package/jobs/hospitality/reservation-noshow-check.yaml +20 -0
  36. package/jobs/inventory/expiring-perishable-stock-check.yaml +24 -0
  37. package/jobs/inventory/inventory-count-discrepancy-check.yaml +38 -0
  38. package/jobs/inventory/low-stock-alert.yaml +20 -0
  39. package/jobs/investing/crypto-price-alert.yaml +33 -0
  40. package/jobs/investing/dividend-payment-tracker.yaml +34 -0
  41. package/jobs/investing/portfolio-rebalance-check.yaml +32 -0
  42. package/jobs/legal/contract-renewal-reminder.yaml +31 -0
  43. package/jobs/legal/nda-expiry-check.yaml +31 -0
  44. package/jobs/legal/trademark-renewal-reminder.yaml +30 -0
  45. package/jobs/logistics/customs-clearance-check.yaml +34 -0
  46. package/jobs/logistics/freight-rate-spike-watch.yaml +38 -0
  47. package/jobs/logistics/shipment-delay-watch.yaml +38 -0
  48. package/jobs/manufacturing/preventive-maintenance-due-check.yaml +31 -0
  49. package/jobs/manufacturing/production-line-downtime-watch.yaml +34 -0
  50. package/jobs/manufacturing/quality-defect-rate-check.yaml +20 -0
  51. package/jobs/marketing/ad-spend-pacing-check.yaml +37 -0
  52. package/jobs/marketing/email-deliverability-check.yaml +37 -0
  53. package/jobs/marketing/seo-rank-drop-watch.yaml +38 -0
  54. package/jobs/nonprofit/grant-deadline-reminder.yaml +44 -0
  55. package/jobs/nonprofit/lapsed-donor-check.yaml +26 -0
  56. package/jobs/nonprofit/volunteer-hours-shortfall-check.yaml +30 -0
  57. package/jobs/podcast/episode-publish-gap-check.yaml +29 -0
  58. package/jobs/podcast/guest-followup-reminder.yaml +31 -0
  59. package/jobs/podcast/sponsor-deliverable-tracker.yaml +31 -0
  60. package/jobs/productivity/timezone-meeting-conflict-check.yaml +31 -0
  61. package/jobs/realestate/lease-expiry-reminder.yaml +30 -0
  62. package/jobs/realestate/rent-payment-late-check.yaml +23 -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/quota-attainment-check.yaml +33 -0
  66. package/jobs/sales/stale-deal-nudge.yaml +35 -0
  67. package/jobs/security/2fa-enrollment-audit.yaml +24 -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/tls-cipher-weak-check.yaml +31 -0
  71. package/jobs/security/waf-rule-change-watch.yaml +38 -0
  72. package/jobs/support/csat-score-watch.yaml +32 -0
  73. package/jobs/support/sla-breach-warning.yaml +31 -0
  74. package/jobs/support/ticket-backlog-aging-check.yaml +30 -0
  75. package/package.json +1 -1
@@ -0,0 +1,38 @@
1
+ id: freight-rate-spike-watch
2
+ version: 1
3
+ name: Freight Rate Spike Watch
4
+ description: >
5
+ Checks a freight lane's current quoted rate against your baseline and
6
+ flags a spike. Use this if a shipping rate has ever quietly doubled and
7
+ only got noticed when the invoice came in.
8
+ category: logistics
9
+ tags: [logistics, freight, rates]
10
+ schedule: "0 7 * * 1"
11
+ timezone: "UTC"
12
+ runner: agent-prompt
13
+ prompt: |
14
+ Check the current freight rate for the lane {{lane_description}} via
15
+ {{rate_source_hint}}.
16
+ 1. Compare the current quote to the baseline rate of {{baseline_rate}}
17
+ per {{rate_unit}}.
18
+ 2. Flag if it's {{spike_threshold_pct}}% or more above baseline.
19
+ 3. Report the current rate, the delta, and if visible, the likely driver
20
+ (fuel surcharge, capacity crunch, seasonal demand).
21
+ variables:
22
+ lane_description:
23
+ default: "Los Angeles, CA to Chicago, IL"
24
+ description: Origin/destination lane to check.
25
+ rate_source_hint:
26
+ default: "your freight broker or a rate index (DAT, Freightos)"
27
+ description: Where to check current freight rates.
28
+ baseline_rate:
29
+ default: 2.50
30
+ description: Baseline rate per unit to compare against.
31
+ rate_unit:
32
+ default: "mile"
33
+ description: Unit the rate is quoted in.
34
+ spike_threshold_pct:
35
+ default: 20
36
+ description: Percent above baseline that counts as a spike.
37
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
38
+ notes: No generic script mode — freight rate sources vary (broker quotes, load boards, rate indices) and most don't expose a simple public API.
@@ -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,31 @@
1
+ id: preventive-maintenance-due-check
2
+ version: 1
3
+ name: Preventive Maintenance Due Check
4
+ description: >
5
+ Flags equipment coming due for scheduled preventive maintenance. Use
6
+ this if a machine has ever failed unexpectedly that would've been
7
+ caught by a PM visit nobody scheduled in time.
8
+ category: manufacturing
9
+ tags: [manufacturing, maintenance, equipment]
10
+ schedule: "0 7 * * 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 due_ts; close(cmd);
19
+ days_left = int((due_ts - today) / 86400);
20
+ if (days_left <= warn) print "WARNING: equipment \"" $1 "\" PM due in " days_left " days (" $2 ")";
21
+ }
22
+ ' {{pm_schedule_csv}}
23
+ variables:
24
+ pm_schedule_csv:
25
+ default: "pm-schedule.csv"
26
+ description: "CSV with header row, columns: equipment_id,next_pm_date(YYYY-MM-DD)."
27
+ warn_days:
28
+ default: 7
29
+ description: Days before the scheduled PM date to start warning.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Keep pm-schedule.csv updated from your CMMS export or maintenance log before each run.
@@ -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,38 @@
1
+ id: seo-rank-drop-watch
2
+ version: 1
3
+ name: SEO Keyword Rank Drop Watch
4
+ description: >
5
+ Checks a tracked keyword's search ranking and flags a real drop. Use
6
+ this if a page has ever slipped off page one and nobody noticed until
7
+ organic traffic was already down for weeks.
8
+ category: marketing
9
+ tags: [seo, rankings, marketing]
10
+ schedule: "0 8 * * 1"
11
+ timezone: "UTC"
12
+ runner: agent-prompt
13
+ prompt: |
14
+ Check the current search ranking for the keyword "{{keyword}}" targeting
15
+ {{target_url}}, via {{rank_source_hint}}.
16
+ 1. Compare the current position to the baseline position of
17
+ {{baseline_position}}.
18
+ 2. Flag a drop of {{drop_threshold_positions}} positions or more.
19
+ 3. If dropped, note which competing URLs now outrank {{target_url}}, if
20
+ visible.
21
+ variables:
22
+ keyword:
23
+ default: "your target keyword"
24
+ description: Keyword to track.
25
+ target_url:
26
+ default: "https://example.com/page"
27
+ description: URL you're tracking rank for.
28
+ rank_source_hint:
29
+ default: "a rank tracker (Ahrefs, SEMrush, Search Console) or a manual SERP check"
30
+ description: Where to check current rank.
31
+ baseline_position:
32
+ default: 5
33
+ description: Baseline ranking position to compare against.
34
+ drop_threshold_positions:
35
+ default: 5
36
+ description: Position drop that counts as a real regression.
37
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
38
+ notes: No generic script mode — SERP position checking needs a rank-tracking API or live search, both of which vary by provider/region.
@@ -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: volunteer-hours-shortfall-check
2
+ version: 1
3
+ name: Volunteer Hours Shortfall Check
4
+ description: >
5
+ Compares logged volunteer hours against a program's target and flags a
6
+ shortfall. Use this if a program has ever fallen behind on a grant's
7
+ volunteer-hour commitment without anyone noticing until the report was
8
+ due.
9
+ category: nonprofit
10
+ tags: [nonprofit, volunteers, programs]
11
+ schedule: "0 9 1 * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ logged=$(awk -F, -v month="$(date +%Y-%m)" -v program="{{program_name}}" '$1 ~ month && $2 == program {sum += $3} END {print sum+0}' {{volunteer_hours_csv}});
16
+ target={{monthly_target_hours}};
17
+ if awk "BEGIN{exit !($logged < $target)}"; then echo "WARNING: {{program_name}} logged $logged of $target target hours this month"; exit 1;
18
+ else echo "OK: {{program_name}} logged $logged of $target target hours"; fi
19
+ variables:
20
+ volunteer_hours_csv:
21
+ default: "volunteer-hours.csv"
22
+ description: "CSV with columns: month(YYYY-MM),program,hours."
23
+ program_name:
24
+ default: "your program"
25
+ description: Program name to check.
26
+ monthly_target_hours:
27
+ default: 100
28
+ description: Target volunteer hours for the program this month.
29
+ compatible_agents: [generic, claude, codex]
30
+ notes: Keep volunteer-hours.csv updated from your volunteer management system's export before each run.
@@ -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: guest-followup-reminder
2
+ version: 1
3
+ name: Podcast Guest Follow-up Reminder
4
+ description: >
5
+ Flags recorded guest episodes that haven't been published or thanked
6
+ yet. Use this if a guest has ever had to awkwardly ask when their
7
+ episode was coming out because nobody followed up after recording.
8
+ category: podcast
9
+ tags: [podcast, guests, followup]
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 && $3 == "unpublished" {
17
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
18
+ cmd | getline recorded_ts; close(cmd);
19
+ days_since = int((today - recorded_ts) / 86400);
20
+ if (days_since >= warn) print "WARNING: episode with " $1 " recorded " days_since " days ago, still unpublished";
21
+ }
22
+ ' {{guest_episodes_csv}}
23
+ variables:
24
+ guest_episodes_csv:
25
+ default: "guest-episodes.csv"
26
+ description: "CSV with header row, columns: guest_name,recorded_date(YYYY-MM-DD),status(unpublished/published)."
27
+ warn_days:
28
+ default: 14
29
+ description: Days since recording before an unpublished episode is flagged.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Keep guest-episodes.csv updated as episodes are recorded and published — one row per guest episode.
@@ -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,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,23 @@
1
+ id: rent-payment-late-check
2
+ version: 1
3
+ name: Rent Payment Late Check
4
+ description: >
5
+ Flags tenants whose rent is overdue past the grace period. Use this if
6
+ a late payment has ever gone unnoticed for weeks because nobody was
7
+ cross-checking the rent roll against the bank deposits.
8
+ category: realestate
9
+ tags: [realestate, rent, payments]
10
+ schedule: "0 9 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ psql "{{database_url}}" -t -c "select tenant_name, unit, amount_due, due_date from rent_ledger where paid = false and due_date < current_date - interval '{{grace_days}} days';"
15
+ variables:
16
+ database_url:
17
+ default: "postgres://user:pass@host:5432/db"
18
+ description: Connection string for the property management database.
19
+ grace_days:
20
+ default: 5
21
+ description: Days past due_date before a late payment is flagged.
22
+ compatible_agents: [generic, claude, codex]
23
+ notes: Assumes a `rent_ledger` table with `paid`, `due_date`, and `amount_due` columns — adjust the query to your property management system's schema.
@@ -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.
@@ -0,0 +1,33 @@
1
+ id: quota-attainment-check
2
+ version: 1
3
+ name: Quota Attainment Check
4
+ description: >
5
+ Compares a rep's closed-won revenue this period against their quota
6
+ pace and flags whether they're on track. Use this if a rep has ever
7
+ found out they missed quota only at the end of the quarter, instead of
8
+ with enough runway left to fix it.
9
+ category: sales
10
+ tags: [sales, quota, pipeline]
11
+ schedule: "0 8 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ closed=$(psql "{{database_url}}" -t -c "select coalesce(sum(amount),0) from deals where owner = '{{rep_name}}' and stage = 'closed_won' and closed_at >= date_trunc('quarter', current_date);");
16
+ quota={{quarterly_quota}};
17
+ pct=$(awk "BEGIN{printf \"%.0f\", ($closed/$quota)*100}");
18
+ echo "quota check for {{rep_name}}: closed \$$closed of \$$quota quarterly quota (${pct}%) so far"
19
+ variables:
20
+ database_url:
21
+ default: "postgres://user:pass@host:5432/db"
22
+ description: Connection string for the CRM/deals database.
23
+ rep_name:
24
+ default: "rep-name"
25
+ description: Sales rep owner field to check.
26
+ quarterly_quota:
27
+ default: 100000
28
+ description: Quarterly quota amount for this rep.
29
+ compatible_agents: [generic, claude, codex]
30
+ notes: >
31
+ Prints closed-won revenue vs. quota for the current quarter; the pacing
32
+ math (days elapsed vs. days in quarter) is left for you or your agent to
33
+ interpret since exact quarter boundaries vary by fiscal calendar.